Ejemplo n.º 1
0
	def generateA(self):
		NavierStokesSolver.generateA(self)
		N = self.N
		index = 0
		for j in xrange(N):
			for i in xrange(N):
				if self.order == 'constant':
					# u
					if self.tagsX[index]>-1 or self.tagsY[index]>-1:
						start = self.A.indptr[index]
						self.A.data[start] = 0.
						self.A.data[start+1] = 0.
						self.A.data[start+2] = 1./self.dt
						self.A.data[start+3] = 0.
						self.A.data[start+4] = 0.
					index+=1

					# v
					if self.tagsX[index]>-1 or self.tagsY[index]>-1:
						start = self.A.indptr[index]
						self.A.data[start] = 0.
						self.A.data[start+1] = 0.
						self.A.data[start+2] = 1./self.dt
						self.A.data[start+3] = 0.
						self.A.data[start+4] = 0.
					index+=1

				if self.order == 'linear':
					# u
					start = self.A.indptr[index]
					if self.tagsX[index]>-1:
						self.A.data[start:start+5] = 0.
						self.A.data[start+2] = 1./self.dt
						for i,idx in enumerate(self.A.indices[start:start+5]):
							if idx==self.tagsX[index]:
								self.A.data[start+i] = -self.coeffsX[index]/self.dt
						#print "index:", index, "tagsX:", self.tagsX[index], "coeffsX:", self.coeffsX[index]
					elif self.tagsY[index]>-1:
						self.A.data[start:start+5] = 0.
						self.A.data[start+2] = 1./self.dt
						for i,idx in enumerate(self.A.indices[start:start+5]):
							if idx==self.tagsY[index]:
								self.A.data[start+i] = -self.coeffsY[index]/self.dt
					index+=1

					# v
					start = self.A.indptr[index]
					if self.tagsY[index]>-1:
						self.A.data[start:start+5] = 0.
						self.A.data[start+2] = 1./self.dt
						for i,idx in enumerate(self.A.indices[start:start+5]):
							if idx==self.tagsY[index]:
								self.A.data[start+i] = -self.coeffsY[index]/self.dt
					elif self.tagsX[index]>-1:
						self.A.data[start:start+5] = 0.
						self.A.data[start+2] = 1./self.dt
						for i,idx in enumerate(self.A.indices[start:start+5]):
							if idx==self.tagsX[index]:
								self.A.data[start+i] = -self.coeffsX[index]/self.dt
					index+=1
    def runSimulation(self, nt=20, nsave=1, plot=True):
        NavierStokesSolver.runSimulation(self, nt=20, nsave=1, plot=True)

        if plot:
            plt.ioff()
            plt.clf()
            plt.plot(np.arange(1, nt + 1), self.net_flux)
            #plt.axis([0., nt, -1., 1.])
            plt.savefig("%s/net_flux.png" % (self.folder))
	def runSimulation(self, nt=20, nsave=1, plot=True):
		NavierStokesSolver.runSimulation(self, nt=20, nsave=1, plot=True)

		if plot:
			plt.ioff()
			plt.clf()
			plt.plot(np.arange(1,nt+1), self.net_flux)
			#plt.axis([0., nt, -1., 1.])
			plt.savefig("%s/net_flux.png" % (self.folder))
Ejemplo n.º 4
0
	def initVecs(self):
		NavierStokesSolver.initVecs(self)
		N = self.N
		self.qZeroed = np.zeros(2*N*N)
		self.tagsX   = -np.ones(2*N*N, dtype=np.int)
		self.coeffsX = np.zeros(2*N*N)
		self.tagsY   = -np.ones(2*N*N, dtype=np.int)
		self.coeffsY = np.zeros(2*N*N)
		self.xu = -np.zeros(N+1)
		self.yu = -np.zeros(N+1)
		self.xv = -np.zeros(N+1)
		self.yv = -np.zeros(N+1)
		self.initCoords()
		self.tagPoints()
Ejemplo n.º 5
0
	def calculateRN(self):
		NavierStokesSolver.calculateRN(self)
		N = self.N
		index = 0
		for j in xrange(N):
			for i in xrange(N):
				# u
				if self.tagsX[index]>-1 or self.tagsY[index]>-1:
					self.rn[index] = 0.
				index+=1

				# v
				if self.tagsX[index]>-1 or self.tagsY[index]>-1:
					self.rn[index] = 0.
				index+=1
 def __init__(self,
              N=4,
              alphaImplicit=1.,
              alphaExplicit=0.,
              gamma=1.,
              zeta=0.,
              nu=0.01,
              dt=-1.0,
              folder=".",
              order='linear',
              side='outside',
              coarsest=15):
     NavierStokesSolver.__init__(self, N, alphaImplicit, alphaExplicit,
                                 gamma, zeta, nu, dt, folder)
     self.order = order
     self.side = side
     self.coarsest = coarsest
Ejemplo n.º 7
0
from NavierStokesSolver import NavierStokesSolver
import numpy as np
import numpy.linalg as la

NT = 20
START_SIZE = 20

print "-" * 80
print "Navier-Stokes solver"
print "-" * 80
size = START_SIZE
solver = NavierStokesSolver(N=size,
                            alphaExplicit=0.,
                            alphaImplicit=1.,
                            nu=0.1,
                            dt=0.001,
                            folder="NS-grid0")
solver.runSimulation(nt=NT, plot=True, nsave=NT)
u0 = np.reshape(solver.q[::2] / solver.h, (size, size))
solver.exactSolutionTaylorGreen(solver.dt * NT)
uExact = np.reshape(solver.exactSolution[::2] / solver.h, (size, size))
print "Difference between 0 and exact:", la.norm(u0 - uExact)
print " "

size *= 3
solver = NavierStokesSolver(N=size,
                            alphaExplicit=0.,
                            alphaImplicit=1.,
                            nu=0.1,
                            dt=0.001)
solver.runSimulation(nt=NT, plot=False)
Ejemplo n.º 8
0
from NavierStokesSolver import NavierStokesSolver
import numpy as np
import numpy.linalg as la

NT = 20
START_SIZE = 20

print "-"*80
print "Navier-Stokes solver"
print "-"*80
size = START_SIZE
solver = NavierStokesSolver(N=size, alphaExplicit=0., alphaImplicit=1., nu=0.1, dt=0.001, folder="NS-grid0")
solver.runSimulation(nt=NT, plot=True, nsave=NT)
u0 = np.reshape(solver.q[::2]/solver.h, (size, size))
solver.exactSolutionTaylorGreen(solver.dt*NT)
uExact = np.reshape(solver.exactSolution[::2]/solver.h, (size, size))
print "Difference between 0 and exact:", la.norm(u0-uExact)
print " "

size *= 3
solver = NavierStokesSolver(N=size, alphaExplicit=0., alphaImplicit=1., nu=0.1, dt=0.001)
solver.runSimulation(nt=NT, plot=False)
u1 = np.reshape(solver.q[::2]/solver.h, (size, size))[1::3,2::3]
print "Difference between 1 and exact:", la.norm(u1-uExact)
print "Difference between 1 and 0    :", la.norm(u1-u0)
print "Theoretical order of convergence:", (np.log(la.norm(u1-uExact))-np.log(la.norm(u0-uExact)))/np.log(3)
print " "

size *= 3
solver = NavierStokesSolver(N=size, alphaExplicit=0., alphaImplicit=1., nu=0.1, dt=0.001, folder="NS-grid2")
solver.runSimulation(nt=NT, plot=True, nsave=NT)
	def __init__(self, N=4, alphaImplicit=1., alphaExplicit=0., gamma=1., zeta=0., nu=0.01, dt=-1.0, folder=".", order='linear', side='outside', coarsest=15):
		NavierStokesSolver.__init__(self, N, alphaImplicit, alphaExplicit, gamma, zeta, nu, dt, folder)
		self.order = order
		self.side = side
		self.coarsest = coarsest
    def stepTime(self):
        NavierStokesSolver.stepTime(self)

        # mass conservation
        sum_fluxes = np.sum(self.QT * self.q)
        self.net_flux = np.append(self.net_flux, sum_fluxes)
	def stepTime(self):
		NavierStokesSolver.stepTime(self)
		
		# mass conservation
		sum_fluxes = np.sum(self.QT * self.q)
		self.net_flux = np.append(self.net_flux, sum_fluxes)