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))
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()
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
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)
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)