8 import matplotlib.pyplot as plt
9 import matplotlib.animation as manimation
12 p0=155.e5#reference pressure in a pressurised nuclear vessel
13 c0=700.#reference sound speed for water at 155 bars
14 rho0=p0/c0*c0#reference density
17 def initial_conditions_Riemann_problem(a,b,nx):
18 print( "Initial data Riemann problem" )
20 dx = (b - a) / nx #space step
21 x=[a+0.5*dx + i*dx for i in range(nx)] # array of cell center (1D mesh)
24 p_initial = [ (xi<(a+b)/2)*p0 + (xi>=(a+b)/2)*p0/2 for xi in x]
26 return p_initial, u_initial
28 def jacobianMatrices(coeff,scaling):
30 A=cdmath.Matrix(dim+1,dim+1)
31 absA=cdmath.Matrix(dim+1,dim+1)
36 absA[i+1,j+1]=c0*coeff
50 def computeUpwindDivergenceMatrix(a,b,nx,nbVoisinsMax,dt,scaling):
55 normal=cdmath.Vector(dim)
57 implMat=cdmath.SparseMatrixPetsc(nbCells*nbComp,nbCells*nbComp,(nbVoisinsMax+1)*nbComp)
59 A,absA= jacobianMatrices(dt/dx,scaling)
60 for j in range(nbCells):#On parcourt les cellules
62 implMat.addValue(j*nbComp,(j+1)*nbComp,(A-absA)/2)
63 implMat.addValue(j*nbComp, j*nbComp,(A-absA)/2*(-1.))
64 elif ( j==nbCells-1) :
65 implMat.addValue(j*nbComp, j*nbComp,(A+absA)/2)
66 implMat.addValue(j*nbComp,(j-1)*nbComp,(A+absA)/2*(-1.))
68 implMat.addValue(j*nbComp,(j+1)*nbComp,(A-absA)/2)
69 implMat.addValue(j*nbComp, j*nbComp,(A-absA)/2*(-1.))
71 implMat.addValue(j*nbComp, j*nbComp,(A+absA)/2)
72 implMat.addValue(j*nbComp,(j-1)*nbComp,(A+absA)/2*(-1.))
76 def WaveSystemVF(ntmax, tmax, cfl, a,b,nx, output_freq, meshName,scaling):
91 Un =cdmath.Vector(nbCells*(dim+1))
92 dUn=cdmath.Vector(nbCells*(dim+1))
94 Un_implicite =cdmath.Vector(nbCells*(dim+1))
95 dUn_implicite=cdmath.Vector(nbCells*(dim+1))
97 # Initial conditions #
98 print("Construction of the initial condition …")
99 pressure_field, velocity_field = initial_conditions_Riemann_problem(a,b,nx)
100 pressure_field_implicite, velocity_field_implicite = initial_conditions_Riemann_problem(a,b,nx)
101 max_initial_p=max(pressure_field)
102 min_initial_p=min(pressure_field)
103 max_initial_v=max(velocity_field)
104 min_initial_v=min(velocity_field)
106 for k in range(nbCells):
107 Un[k*(dim+1)+0] = pressure_field[k]
108 Un[k*(dim+1)+1] =rho0*velocity_field[k]
109 Un_implicite[k*(dim+1)+0] = pressure_field_implicite[k]
110 Un_implicite[k*(dim+1)+1] =rho0*velocity_field_implicite[k]
113 FFMpegWriter = manimation.writers['ffmpeg']
114 metadata = dict(title="Finite volumes schemes for the 2D Wave System", artist = "CEA Saclay", comment="Shock propagation")
115 writer=FFMpegWriter(fps=10, metadata=metadata, codec='h264')
116 with writer.saving(plt.figure(), "2DWaveSystem_Upwind"+".mp4", ntmax):
117 #sauvegarde de la donnée initiale
119 plt.ylabel('Pressure -Pa)')
121 plt.ylim( min_initial_p - 0.1*(max_initial_p-min_initial_p), max_initial_p + 0.1*(max_initial_p-min_initial_p) )
122 plt.title("Riemann problem for Wave system on " + str(nx) + " cells")
123 line1, = plt.plot([a+0.5*dx + i*dx for i in range(nx)], pressure_field, label='Explicit upwind scheme') #new picture for video # Returns a tuple of line objects, thus the comma
124 line3, = plt.plot([a+0.5*dx + i*dx for i in range(nx)], pressure_field_implicite, label='Implicit upwind scheme') #new picture for video # Returns a tuple of line objects, thus the comma
127 np.savetxt( "WaveSystem"+str(dim)+"DUpwindExplicit"+meshName+"_pressure"+"_0"+".txt", pressure_field, delimiter="\n")
128 np.savetxt( "WaveSystem"+str(dim)+"DUpwindExplicit"+meshName+"_velocity"+"_0"+".txt", velocity_field, delimiter="\n")
129 np.savetxt( "WaveSystem"+str(dim)+"DUpwindImplicit"+meshName+"_pressure"+"_0"+".txt", pressure_field_implicite, delimiter="\n")
130 np.savetxt( "WaveSystem"+str(dim)+"DUpwindImplicit"+meshName+"_velocity"+"_0"+".txt", velocity_field_implicite, delimiter="\n")
131 plt.savefig("WaveSystem"+str(dim)+"DUpwind" +meshName+"_pressure"+"_0"+".png")
133 divMat=computeUpwindDivergenceMatrix(a,b,nx,nbVoisinsMax,dt,scaling)
134 divMat_implicit=computeUpwindDivergenceMatrix(a,b,nx,nbVoisinsMax,dt,scaling)
138 divMat_implicit.diagonalShift(1)#only after filling all coefficients
140 LS=cdmath.LinearSolver(divMat_implicit,Un,iterGMRESMax, precision, "GMRES","ILU")
142 LS=cdmath.LinearSolver(divMat_implicit,Vn,iterGMRESMax, precision, "GMRES","ILU")
144 print("Starting computation of the linear wave system with an upwind scheme …")
147 while (it<ntmax and time <= tmax and not isStationary):
151 dUn_implicite=Un_implicite.deepCopy()
152 LS.setSndMember(Un_implicite)
153 Un_implicite=LS.solve();
154 if(not LS.getStatus()):
155 print( "Linear system did not converge ", LS.getNumberOfIter(), " GMRES iterations" )
156 raise ValueError("Pas de convergence du système linéaire");
157 dUn_implicite-=Un_implicite
159 for k in range(nbCells):
160 pressure_field[k] = Un[k*(dim+1)+0]
161 velocity_field[k] = Un[k*(dim+1)+1] / rho0
162 pressure_field_implicite[k] = Un_implicite[k*(dim+1)+0]
163 velocity_field_implicite[k] = Un_implicite[k*(dim+1)+1] / rho0
165 line1.set_ydata(pressure_field)
166 line3.set_ydata(pressure_field_implicite)
173 if(it==1 or it%output_freq==0 or it>=ntmax or isStationary or time >=tmax):
174 print( "-- Iter: " + str(it) + ", Time: " + str(time) + ", dt: " + str(dt) )
175 print( "Linear system converged in ", LS.getNumberOfIter(), " GMRES iterations" )
177 np.savetxt("WaveSystem" +str(dim)+"DUpwindExplicit"+meshName+"_pressure"+str(it)+".txt", pressure_field , delimiter="\n")
178 np.savetxt("WaveSystem" +str(dim)+"DUpwindExplicit"+meshName+"_velocity"+str(it)+".txt", velocity_field , delimiter="\n")
179 np.savetxt("WaveSystem" +str(dim)+"DUpwindImplicit"+meshName+"_pressure"+str(it)+".txt", pressure_field , delimiter="\n")
180 np.savetxt("WaveSystem" +str(dim)+"DUpwindImplicit"+meshName+"_velocity"+str(it)+".txt", velocity_field , delimiter="\n")
181 plt.savefig("WaveSystem"+str(dim)+"DUpwind" +meshName+"_pressure"+str(it)+".png")
184 print("-- Iter: " + str(it) + ", Time: " + str(time) + ", dt: " + str(dt) )
187 print( "Nombre de pas de temps maximum ntmax= ", ntmax, " atteint" )
190 print( "Régime stationnaire atteint au pas de temps ", it, ", t= ", time )
191 print( "------------------------------------------------------------------------------------")
193 np.savetxt( "WaveSystem"+str(dim)+"DUpwind"+meshName+"_pressure_Stat.txt", pressure_field, delimiter="\n")
194 np.savetxt( "WaveSystem"+str(dim)+"DUpwind"+meshName+"_velocity_Stat.txt", velocity_field, delimiter="\n")
195 plt.savefig("WaveSystem"+str(dim)+"DUpwind"+meshName+"_pressure_Stat.png")
199 print( "Temps maximum Tmax= ", tmax, " atteint")
203 def solve( a,b,nx, meshName, scaling, meshType, cfl):
205 print( "Resolution of the Wave system in dimension 1 on "+str(nx)+ " cells, upwind scheme")
206 print( "Initial data : ", "Riemann problem")
207 print( "Boundary conditions : ", "Neumann")
208 print( "Mesh name : ",meshName , ", ", nx, " cells")
215 WaveSystemVF(ntmax, tmax, cfl, a,b,nx, output_freq, meshName, scaling)
220 if __name__ == """__main__""":
226 solve( a,b,nx,"SquareRegularSquares",scaling,"RegularSquares",cfl)