2 import WaveSystemCentered
3 import matplotlib.pyplot as plt
5 from math import log10, sqrt
10 def test_validation2DWaveSystemCentered_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] =WaveSystemCentered.solve(my_mesh,"square"+str(nx)+'x'+str(nx),resolution,scaling,meshType,testColor,cfl,"Periodic")
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] =WaveSystemCentered.solve_file(mesh_path+filename, mesh_name, resolution,scaling,meshType,testColor,cfl)
43 assert max_vel[i]>0.8 and max_vel[i]<1.03
44 error_p_tab[i]=log10(error_p_tab[i])
45 error_u_tab[i]=log10(error_u_tab[i])
46 time_tab[i]=log10(time_tab[i])
51 # Plot over diagonal line
52 for i in range(nbMeshes):
54 plt.plot(curv_abs, diag_data_press[i], label= str(mesh_size_tab[i]) + ' cells - no scaling')
56 plt.plot(curv_abs, diag_data_press[i], label= str(mesh_size_tab[i]) + ' cells - with scaling')
58 plt.xlabel('Position on diagonal line')
59 plt.ylabel('Pressure on diagonal line')
60 plt.title('Plot over diagonal line for stationary wave system \n with centered scheme on 2D square meshes')
61 plt.savefig(mesh_name+'_Pressure_2DWaveSystemCentered_'+"scaling"+str(scaling)+"_PlotOverDiagonalLine.png")
65 for i in range(nbMeshes):
67 plt.plot(curv_abs, diag_data_vel[i], label= str(mesh_size_tab[i]) + ' cells - no scaling')
69 plt.plot(curv_abs, diag_data_vel[i], label= str(mesh_size_tab[i]) + ' cells - with scaling')
71 plt.xlabel('Position on diagonal line')
72 plt.ylabel('Velocity on diagonal line')
73 plt.title('Plot over diagonal line for the stationary wave system \n with centered scheme on 2D square meshes')
74 plt.savefig(mesh_name+"_Velocity_2DWaveSystemCentered_"+"scaling"+str(scaling)+"_PlotOverDiagonalLine.png")
77 # Plot of number of time steps
80 plt.plot(mesh_size_tab, ndt_final, label='Number of time step to reach stationary regime - no scaling')
82 plt.plot(mesh_size_tab, ndt_final, label='Number of time step to reach stationary regime - with scaling')
84 plt.xlabel('Number of cells')
85 plt.ylabel('Max time steps for stationary regime')
86 plt.title('Number of times steps required for the stationary Wave System \n with centered scheme on 2D square meshes')
87 plt.savefig(mesh_name+"_2DWaveSystemCentered_"+"scaling"+str(scaling)+"_TimeSteps.png")
89 # Plot of number of stationary time
92 plt.plot(mesh_size_tab, t_final, label='Time where stationary regime is reached - no scaling')
94 plt.plot(mesh_size_tab, t_final, label='Time where stationary regime is reached - with scaling')
96 plt.xlabel('Number of cells')
97 plt.ylabel('Max time for stationary regime')
98 plt.title('Simulated time for the stationary Wave System \n with centered scheme on 2D square meshes')
99 plt.savefig(mesh_name+"_2DWaveSystemCentered_"+"scaling"+str(scaling)+"_FinalTime.png")
101 # Plot of number of maximal velocity norm
104 plt.plot(mesh_size_tab, max_vel, label='Maximum velocity norm - no scaling')
106 plt.plot(mesh_size_tab, max_vel, label='Maximum velocity norm - with scaling')
108 plt.xlabel('Number of cells')
109 plt.ylabel('Max velocity norm')
110 plt.title('Maximum velocity norm for the stationary Wave System \n with centered scheme on 2D square meshes')
111 plt.savefig(mesh_name+"_2DWaveSystemCentered_"+"scaling"+str(scaling)+"_MaxVelNorm.png")
113 # Plot of condition number
116 plt.plot(mesh_size_tab, cond_number, label='Condition number - no scaling')
118 plt.plot(mesh_size_tab, cond_number, label='Condition number - with scaling')
120 plt.xlabel('Number of cells')
121 plt.ylabel('Condition number')
122 plt.title('Condition number for the stationary Wave System \n with centered scheme on 2D square meshes')
123 plt.savefig(mesh_name+"_2DWaveSystemCentered_"+"scaling"+str(scaling)+"_condition_number.png")
125 for i in range(nbMeshes):
126 mesh_size_tab[i]=0.5*log10(mesh_size_tab[i])
128 # Least square linear regression
129 # Find the best a,b such that f(x)=ax+b best approximates the convergence curve
130 # The vector X=(a,b) solves a symmetric linear system AX=B with A=(a1,a2\\a2,a3), B=(b1,b2)
131 a1=np.dot(mesh_size_tab,mesh_size_tab)
132 a2=np.sum(mesh_size_tab)
136 assert det!=0, 'test_validation2DWaveSystemSquaresFVCentered_squares() : Make sure you use distinct meshes and at least two meshes'
138 b1p=np.dot(error_p_tab,mesh_size_tab)
139 b2p=np.sum(error_p_tab)
140 ap=( a3*b1p-a2*b2p)/det
141 bp=(-a2*b1p+a1*b2p)/det
144 print("FV Centered on 2D square meshes : scheme order for pressure without scaling is ", -ap)
146 print("FV Centered on 2D square meshes : scheme order for pressure with scaling is ", -ap)
148 b1u=np.dot(error_u_tab,mesh_size_tab)
149 b2u=np.sum(error_u_tab)
150 au=( a3*b1u-a2*b2u)/det
151 bu=(-a2*b1u+a1*b2u)/det
154 print("FV Centered on 2D square meshes : scheme order for velocity without scaling is ", -au)
156 print("FV Centered on 2D square meshes : scheme order for velocity with scaling is ", -au)
158 # Plot of convergence curves
161 plt.plot(mesh_size_tab, error_p_tab, label='|error on stationary pressure| - no scaling')
163 plt.plot(mesh_size_tab, error_p_tab, label='|error on stationary pressure| - with scaling')
165 plt.xlabel('1/2 log(number of cells)')
166 plt.ylabel('log(|error p|)')
167 plt.title('Convergence of finite volumes for the stationary Wave System \n with centered scheme on 2D square meshes')
168 plt.savefig(mesh_name+"_Pressure_2DWaveSystemCentered_"+"scaling"+str(scaling)+"_ConvergenceCurve.png")
172 plt.plot(mesh_size_tab, error_u_tab, label='log(|error on stationary velocity|) - no scaling')
174 plt.plot(mesh_size_tab, error_u_tab, label='log(|error on stationary velocity|) - with scaling')
176 plt.xlabel('1/2 log(number of cells)')
177 plt.ylabel('log(|error u|)')
178 plt.title('Convergence of finite volumes for the stationary Wave System \n with centered scheme on 2D square meshes')
179 plt.savefig(mesh_name+"_Velocity_2DWaveSystemCentered_"+"scaling"+str(scaling)+"_ConvergenceCurve.png")
181 # Plot of computational time
184 plt.plot(mesh_size_tab, time_tab, label='log(cpu time) - no scaling')
186 plt.plot(mesh_size_tab, time_tab, label='log(cpu time) - with scaling')
188 plt.xlabel('1/2 log(number of cells)')
189 plt.ylabel('log(cpu time)')
190 plt.title('Computational time of finite volumes for the stationary Wave System \n with centered scheme on 2D square meshes')
191 plt.savefig(mesh_name+"2DWaveSystemCentered_"+"scaling"+str(scaling)+"_ComputationalTimeSquares.png")
195 convergence_synthesis={}
197 convergence_synthesis["PDE_model"]="Wave system"
198 convergence_synthesis["PDE_is_stationary"]=False
199 convergence_synthesis["PDE_search_for_stationary_solution"]=True
201 convergence_synthesis["Numerical_method_name"]="Centered scheme no scaling"
203 convergence_synthesis["Numerical_method_name"]="Centered scheme scaling"
204 convergence_synthesis["Numerical_method_space_discretization"]="Finite volumes"
205 convergence_synthesis["Numerical_method_time_discretization"]="Implicit"
206 convergence_synthesis["Initial_data"]="Constant pressure, divergence free velocity"
207 convergence_synthesis["Boundary_conditions"]="Periodic"
208 convergence_synthesis["Numerical_parameter_cfl"]=cfl
209 convergence_synthesis["Space_dimension"]=2
210 convergence_synthesis["Mesh_dimension"]=2
211 convergence_synthesis["Mesh_names"]=meshList
212 convergence_synthesis["Mesh_type"]=meshType
213 convergence_synthesis["Mesh_path"]=mesh_path
214 convergence_synthesis["Mesh_description"]=mesh_name
215 convergence_synthesis["Mesh_sizes"]=mesh_size_tab
216 convergence_synthesis["Mesh_cell_type"]="Squares"
217 convergence_synthesis["Numerical_error_velocity"]=error_u_tab
218 convergence_synthesis["Numerical_error_pressure"]=error_p_tab
219 convergence_synthesis["Max_vel_norm"]=max_vel
220 convergence_synthesis["Final_time"]=t_final
221 convergence_synthesis["Final_time_step"]=ndt_final
222 convergence_synthesis["Scheme_order"]=min(-au,-ap)
223 convergence_synthesis["Scheme_order_vel"]=-au
224 convergence_synthesis["Scheme_order_press"]=-ap
225 convergence_synthesis["Scaling_preconditioner"]=scaling
226 convergence_synthesis["Condition_numbers"]=cond_number
227 convergence_synthesis["Test_color"]=testColor
228 convergence_synthesis["Computational_time"]=end-start
230 with open('Convergence_WaveSystem_2DFV_Centered_'+mesh_name+'.json', 'w') as outfile:
231 json.dump(convergence_synthesis, outfile)
233 if __name__ == """__main__""":
234 if len(sys.argv) >1 :
235 scaling = int(sys.argv[1])
236 test_validation2DWaveSystemCentered_squares(scaling)
238 test_validation2DWaveSystemCentered_squares(2)