2 import WaveSystemStaggered
3 import matplotlib.pyplot as plt
5 from math import log10, sqrt
10 def test_validation2DWaveSystemStaggered_squares(scaling):
13 meshList=[7,15,31,51,81,101]
14 #meshList=['squareWithSquares_1','squareWithSquares_2','squareWithSquares_3','squareWithSquares_4','squareWithSquares_5']
15 mesh_path='../../../ressources/2DCartesien/'
16 meshType="Regular squares"
18 nbMeshes=len(meshList)
19 mesh_size_tab=[0]*nbMeshes
20 mesh_name='squareWithSquares'
22 curv_abs=np.linspace(0,sqrt(2),resolution+1)
24 error_p_tab=[0]*nbMeshes
25 error_u_tab=[0]*nbMeshes
26 diag_data_press=[0]*nbMeshes
27 diag_data_vel=[0]*nbMeshes
30 ndt_final=[0]*nbMeshes
32 cond_number=[0]*nbMeshes
37 # Storing of numerical errors, mesh sizes and diagonal values
38 # for filename in meshList:
40 my_mesh=cdmath.Mesh(0,1,nx,0,1,nx)
41 error_p_tab[i], error_u_tab[i], mesh_size_tab[i], t_final[i], ndt_final[i], max_vel[i], diag_data_press[i], diag_data_vel[i], time_tab[i], cond_number[i] =WaveSystemStaggered.solve(my_mesh,str(nx)+'x'+str(nx),resolution,scaling,meshType,testColor,cfl)
42 #error_p_tab[i], error_u_tab[i], mesh_size_tab[i], t_final[i], ndt_final[i], max_vel[i], diag_data_press[i], diag_data_vel[i], time_tab[i], cond_number[i] =WaveSystemStaggered.solve_file(mesh_path+filename, mesh_name, resolution,scaling,meshType,testColor,cfl)
43 assert max_vel[i]>0.1 and max_vel[i]<1.5
45 error_p_tab[i]=log10(error_p_tab[i])
48 error_u_tab[i]=log10(error_u_tab[i])
49 time_tab[i]=log10(time_tab[i])
54 # Plot over diagonal line
55 for i in range(nbMeshes):
57 plt.plot(curv_abs, diag_data_press[i], label= str(mesh_size_tab[i]) + ' cells - no scaling')
59 plt.plot(curv_abs, diag_data_press[i], label= str(mesh_size_tab[i]) + ' cells - with scaling')
61 plt.xlabel('Position on diagonal line')
62 plt.ylabel('Pressure on diagonal line')
63 plt.title('Plot over diagonal line for stationary wave system \n with Staggered scheme on 2D square meshes')
64 plt.savefig(mesh_name+'_Pressure_2DWaveSystemStaggered_'+"scaling"+str(scaling)+"_PlotOverDiagonalLine.png")
68 for i in range(nbMeshes):
70 plt.plot(curv_abs, diag_data_vel[i], label= str(mesh_size_tab[i]) + ' cells - no scaling')
72 plt.plot(curv_abs, diag_data_vel[i], label= str(mesh_size_tab[i]) + ' cells - with scaling')
74 plt.xlabel('Position on diagonal line')
75 plt.ylabel('Velocity on diagonal line')
76 plt.title('Plot over diagonal line for the stationary wave system \n with Staggered scheme on 2D square meshes')
77 plt.savefig(mesh_name+"_Velocity_2DWaveSystemStaggered_"+"scaling"+str(scaling)+"_PlotOverDiagonalLine.png")
80 # Plot of number of time steps
83 plt.plot(mesh_size_tab, ndt_final, label='Number of time step to reach stationary regime - no scaling')
85 plt.plot(mesh_size_tab, ndt_final, label='Number of time step to reach stationary regime - with scaling')
87 plt.xlabel('number of cells')
88 plt.ylabel('Max time steps for stationary regime')
89 plt.title('Number of times steps required for the stationary Wave System \n with Staggered scheme on 2D square meshes')
90 plt.savefig(mesh_name+"_2DWaveSystemStaggered_"+"scaling"+str(scaling)+"_TimeSteps.png")
92 # Plot of number of stationary time
95 plt.plot(mesh_size_tab, t_final, label='Time where stationary regime is reached - no scaling')
97 plt.plot(mesh_size_tab, t_final, label='Time where stationary regime is reached - with scaling')
99 plt.xlabel('number of cells')
100 plt.ylabel('Max time for stationary regime')
101 plt.title('Simulated time for the stationary Wave System \n with Staggered scheme on 2D square meshes')
102 plt.savefig(mesh_name+"_2DWaveSystemStaggered_"+"scaling"+str(scaling)+"_FinalTime.png")
104 # Plot of number of maximal velocity norm
107 plt.plot(mesh_size_tab, max_vel, label='Maximum velocity norm - no scaling')
109 plt.plot(mesh_size_tab, max_vel, label='Maximum velocity norm - with scaling')
111 plt.xlabel('number of cells')
112 plt.ylabel('Max velocity norm')
113 plt.title('Maximum velocity norm for the stationary Wave System \n with Staggered scheme on 2D square meshes')
114 plt.savefig(mesh_name+"_2DWaveSystemStaggered_"+"scaling"+str(scaling)+"_MaxVelNorm.png")
116 # Plot of condition number
119 plt.plot(mesh_size_tab, cond_number, label='Condition number - no scaling')
121 plt.plot(mesh_size_tab, cond_number, label='Condition number - with scaling')
123 plt.xlabel('number of cells')
124 plt.ylabel('Condition number')
125 plt.title('Condition number for the stationary Wave System \n with Staggered scheme on 2D square meshes')
126 plt.savefig(mesh_name+"_2DWaveSystemStaggered_"+"scaling"+str(scaling)+"_condition_number.png")
128 for i in range(nbMeshes):
129 mesh_size_tab[i]=0.5*log10(mesh_size_tab[i])
131 # Least square linear regression
132 # Find the best a,b such that f(x)=ax+b best approximates the convergence curve
133 # The vector X=(a,b) solves a symmetric linear system AX=B with A=(a1,a2\\a2,a3), B=(b1,b2)
134 a1=np.dot(mesh_size_tab,mesh_size_tab)
135 a2=np.sum(mesh_size_tab)
139 assert det!=0, 'test_validation2DWaveSystemSquaresFVStaggered_squares() : Make sure you use distinct meshes and at least two meshes'
141 b1p=np.dot(error_p_tab,mesh_size_tab)
142 b2p=np.sum(error_p_tab)
143 ap=( a3*b1p-a2*b2p)/det
144 bp=(-a2*b1p+a1*b2p)/det
147 print("FV Staggered on 2D square meshes : scheme order for pressure without scaling is ", -ap)
149 print("FV Staggered on 2D square meshes : scheme order for pressure with scaling is ", -ap)
151 b1u=np.dot(error_u_tab,mesh_size_tab)
152 b2u=np.sum(error_u_tab)
153 au=( a3*b1u-a2*b2u)/det
154 bu=(-a2*b1u+a1*b2u)/det
157 print("FVStaggered on 2D square meshes : scheme order for velocity without scaling is ", -au)
159 print("FVStaggered on 2D square meshes : scheme order for velocity with scaling is ", -au)
161 # Plot of convergence curves
164 plt.plot(mesh_size_tab, error_p_tab, label='|error on stationary pressure| - no scaling')
166 plt.plot(mesh_size_tab, error_p_tab, label='|error on stationary pressure| - with scaling')
168 plt.xlabel('1/2 log(number of cells)')
169 plt.ylabel('|error p|')
170 plt.title('Convergence of finite volumes for the stationary Wave System \n with Staggered scheme on 2D square meshes')
171 plt.savefig(mesh_name+"_Pressure_2DWaveSystemStaggered_"+"scaling"+str(scaling)+"_ConvergenceCurve.png")
175 plt.plot(mesh_size_tab, error_u_tab, label='log(|error on stationary velocity|) - no scaling')
177 plt.plot(mesh_size_tab, error_u_tab, label='log(|error on stationary velocity|) - with scaling')
179 plt.xlabel('1/2 log(number of cells)')
180 plt.ylabel('log(|error u|)')
181 plt.title('Convergence of finite volumes for the stationary Wave System \n with Staggered scheme on 2D square meshes')
182 plt.savefig(mesh_name+"_Velocity_2DWaveSystemStaggered_"+"scaling"+str(scaling)+"_ConvergenceCurve.png")
184 # Plot of computational time
187 plt.plot(mesh_size_tab, time_tab, label='log(cpu time) - no scaling')
189 plt.plot(mesh_size_tab, time_tab, label='log(cpu time) - with scaling')
191 plt.xlabel('1/2 log(number of cells)')
192 plt.ylabel('log(cpu time)')
193 plt.title('Computational time of finite volumes for the stationary Wave System \n with Staggered scheme on 2D square meshes')
194 plt.savefig(mesh_name+"2DWaveSystemStaggered_"+"scaling"+str(scaling)+"_ComputationalTimeSquares.png")
198 convergence_synthesis={}
200 convergence_synthesis["PDE_model"]="Wave system"
201 convergence_synthesis["PDE_is_stationary"]=False
202 convergence_synthesis["PDE_search_for_stationary_solution"]=True
204 convergence_synthesis["Numerical_method_name"]="Staggered no scaling"
206 convergence_synthesis["Numerical_method_name"]="Staggered scaling"
207 convergence_synthesis["Numerical_method_space_discretization"]="Finite volumes"
208 convergence_synthesis["Numerical_method_time_discretization"]="Implicit"
209 convergence_synthesis["Initial_data"]="Constant pressure, divergence free velocity"
210 convergence_synthesis["Boundary_conditions"]="Periodic"
211 convergence_synthesis["Numerical_parameter_cfl"]=cfl
212 convergence_synthesis["Space_dimension"]=2
213 convergence_synthesis["Mesh_dimension"]=2
214 convergence_synthesis["Mesh_names"]=meshList
215 convergence_synthesis["Mesh_type"]=meshType
216 convergence_synthesis["Mesh_path"]=mesh_path
217 convergence_synthesis["Mesh_description"]=mesh_name
218 convergence_synthesis["Mesh_sizes"]=mesh_size_tab
219 convergence_synthesis["Mesh_cell_type"]="Squares"
220 convergence_synthesis["Numerical_error_velocity"]=error_u_tab
221 convergence_synthesis["Numerical_error_pressure"]=error_p_tab
222 convergence_synthesis["Max_vel_norm"]=max_vel
223 convergence_synthesis["Final_time"]=t_final
224 convergence_synthesis["Final_time_step"]=ndt_final
225 convergence_synthesis["Scheme_order"]=min(-au,-ap)
226 convergence_synthesis["Scheme_order_vel"]=-au
227 convergence_synthesis["Scheme_order_press"]=-ap
228 convergence_synthesis["Scaling_preconditioner"]=scaling
229 convergence_synthesis["Condition_numbers"]=cond_number
230 convergence_synthesis["Test_color"]=testColor
231 convergence_synthesis["Computational_time"]=end-start
233 with open('Convergence_WaveSystem_2DFV_Staggered_'+mesh_name+'.json', 'w') as outfile:
234 json.dump(convergence_synthesis, outfile)
236 if __name__ == """__main__""":
237 if len(sys.argv) >1 :
238 scaling = int(sys.argv[1])
239 test_validation2DWaveSystemStaggered_squares(scaling)
241 raise ValueError("test_validation2DWaveSystemStaggeredSquares.py expects a mesh file name")