2 import matplotlib.pyplot as plt
4 from math import log10, sqrt
9 def test_validation2DWaveSystemPStagFlatCrossTriangles(scaling):
11 #### 2D flat cross triangle meshes
12 meshList=['squareWithFlatCrossTriangles_00','squareWithFlatCrossTriangles_0']#,'squareWithFlatCrossTriangles_1','squareWithFlatCrossTriangles_2','squareWithFlatCrossTriangles_3'
13 meshType="Unstructured_flat_cross_triangles"
14 testColor="Orange (no stationary found on large meshes)"
15 nbMeshes=len(meshList)
16 mesh_size_tab=[0]*nbMeshes
17 mesh_path='../../../ressources/2DFlatCrossTriangles/'
18 mesh_name='squareWithFlatCrossTriangles'
20 curv_abs=np.linspace(0,sqrt(2),resolution+1)
22 error_p_tab=[0]*nbMeshes
23 error_u_tab=[0]*nbMeshes
24 diag_data_press=[0]*nbMeshes
25 diag_data_vel=[0]*nbMeshes
28 ndt_final=[0]*nbMeshes
30 cond_number=[0]*nbMeshes
35 # Storing of numerical errors, mesh sizes and diagonal values
36 for filename in meshList:
37 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] = WaveSystemPStag.solve_file(mesh_path+filename, mesh_name, resolution,scaling,meshType,testColor,cfl,"Periodic")
38 assert max_vel[i]>0.94 and max_vel[i]<1.1
39 error_p_tab[i]=log10(error_p_tab[i])
40 error_u_tab[i]=log10(error_u_tab[i])
41 time_tab[i]=log10(time_tab[i])
46 # Plot over diagonal line
47 for i in range(nbMeshes):
49 plt.plot(curv_abs, diag_data_press[i], label= str(mesh_size_tab[i]) + ' cells - no scaling')
51 plt.plot(curv_abs, diag_data_press[i], label= str(mesh_size_tab[i]) + ' cells - with scaling')
53 plt.xlabel('Position on diagonal line')
54 plt.ylabel('Pressure on diagonal line')
55 plt.title('Plot over diagonal line for stationary wave system \n with PStagggered scheme on 2D flat cross triangle meshes')
56 plt.savefig(mesh_name+'_Pressure_2DWaveSystemPStag_'+"scaling"+str(scaling)+"_PlotOverDiagonalLine.png")
60 for i in range(nbMeshes):
62 plt.plot(curv_abs, diag_data_vel[i], label= str(mesh_size_tab[i]) + ' cells - no scaling')
64 plt.plot(curv_abs, diag_data_vel[i], label= str(mesh_size_tab[i]) + ' cells - with scaling')
66 plt.xlabel('Position on diagonal line')
67 plt.ylabel('Velocity on diagonal line')
68 plt.title('Plot over diagonal line for the stationary wave system \n with PStagggered scheme on 2D flat cross triangle meshes')
69 plt.savefig(mesh_name+"_Velocity_2DWaveSystemPStag_"+"scaling"+str(scaling)+"_PlotOverDiagonalLine.png")
72 # Plot of number of time steps
75 plt.plot(mesh_size_tab, ndt_final, label='Number of time step to reach stationary regime - no scaling')
77 plt.plot(mesh_size_tab, ndt_final, label='Number of time step to reach stationary regime - with scaling')
79 plt.xlabel('Number of cells')
80 plt.ylabel('Max time steps for stationary regime')
81 plt.title('Number of times steps required for the stationary Wave System \n with PStagggered scheme on 2D flat cross triangle meshes')
82 plt.savefig(mesh_name+"_2DWaveSystemSquarePStags_"+"scaling"+str(scaling)+"_TimeSteps.png")
84 # Plot of number of stationary time
87 plt.plot(mesh_size_tab, t_final, label='Time where stationary regime is reached - no scaling')
89 plt.plot(mesh_size_tab, t_final, label='Time where stationary regime is reached - with scaling')
91 plt.xlabel('number of cells')
92 plt.ylabel('Max time for stationary regime')
93 plt.title('Simulated time for the stationary Wave System \n with PStagggered scheme on 2D flat cross triangle meshes')
94 plt.savefig(mesh_name+"_2DWaveSystemPStag_"+"scaling"+str(scaling)+"_FinalTime.png")
96 # Plot of number of maximal velocity norm
99 plt.plot(mesh_size_tab, max_vel, label='Maximum velocity norm - no scaling')
101 plt.plot(mesh_size_tab, max_vel, label='Maximum velocity norm - with scaling')
103 plt.xlabel('Number of cells')
104 plt.ylabel('Max velocity norm')
105 plt.title('Maximum velocity norm for the stationary Wave System \n with PStagggered scheme on 2D flat cross triangle meshes')
106 plt.savefig(mesh_name+"_2DWaveSystemPStag_"+"scaling"+str(scaling)+"_MaxVelNorm.png")
108 # Plot of condition number
111 plt.plot(mesh_size_tab, cond_number, label='Condition number - no scaling')
113 plt.plot(mesh_size_tab, cond_number, label='Condition number - with scaling')
115 plt.xlabel('Number of cells')
116 plt.ylabel('Condition number')
117 plt.title('Condition number for the stationary Wave System \n with PStagggered scheme on 2D square meshes')
118 plt.savefig(mesh_name+"_2DWaveSystemPStag_"+"scaling"+str(scaling)+"_condition_number.png")
120 for i in range(nbMeshes):
121 mesh_size_tab[i]=0.5*log10(mesh_size_tab[i])
123 # Least square linear regression
124 # Find the best a,b such that f(x)=ax+b best approximates the convergence curve
125 # The vector X=(a,b) solves a symmetric linear system AX=B with A=(a1,a2\\a2,a3), B=(b1,b2)
126 a1=np.dot(mesh_size_tab,mesh_size_tab)
127 a2=np.sum(mesh_size_tab)
131 assert det!=0, 'test_validation2DWaveSystemFVPStag() : Make sure you use distinct meshes and at least two meshes'
133 b1p=np.dot(error_p_tab,mesh_size_tab)
134 b2p=np.sum(error_p_tab)
135 ap=( a3*b1p-a2*b2p)/det
136 bp=(-a2*b1p+a1*b2p)/det
138 print("FV PStag on 2D flat cross triangle meshes : scheme order for pressure is ", -ap)
140 b1u=np.dot(error_u_tab,mesh_size_tab)
141 b2u=np.sum(error_u_tab)
142 au=( a3*b1u-a2*b2u)/det
143 bu=(-a2*b1u+a1*b2u)/det
146 print("FVPStag on 2D flat cross triangle meshes : scheme order for velocity without scaling is ", -au)
148 print("FVPStag on 2D flat cross triangle meshes : scheme order for velocity with scaling is ", -au)
150 # Plot of convergence curves
153 plt.plot(mesh_size_tab, error_p_tab, label='|error on stationary pressure| - no scaling')
155 plt.plot(mesh_size_tab, error_p_tab, label='|error on stationary pressure| - with scaling')
157 plt.xlabel('1/2 log(number of cells)')
158 plt.ylabel('|error p|')
159 plt.title('Convergence of finite volumes for the stationary Wave System \n with PStagggered scheme on 2D flat cross triangle meshes')
160 plt.savefig(mesh_name+"_Pressure_2DWaveSystemPStag_"+"scaling"+str(scaling)+"_ConvergenceCurve.png")
164 plt.plot(mesh_size_tab, error_u_tab, label='log(|error on stationary velocity|) - no scaling')
166 plt.plot(mesh_size_tab, error_u_tab, label='log(|error on stationary velocity|) - with scaling')
168 plt.xlabel('1/2 log(number of cells)')
169 plt.ylabel('|error u|')
170 plt.title('Convergence of finite volumes for the stationary Wave System \n with PStagggered scheme on 2D flat cross triangle meshes')
171 plt.savefig(mesh_name+"_Velocity_2DWaveSystemPStag_"+"scaling"+str(scaling)+"_ConvergenceCurve.png")
173 # Plot of computational time
176 plt.plot(mesh_size_tab, time_tab, label='log(cpu time) - no scaling')
178 plt.plot(mesh_size_tab, time_tab, label='log(cpu time) - with scaling')
180 plt.xlabel('1/2 log(number of cells)')
181 plt.ylabel('log(cpu time)')
182 plt.title('Computational time of finite volumes for the stationary Wave System \n with PStagggered scheme on 2D flat cross triangle meshes')
183 plt.savefig(mesh_name+"2DWaveSystemPStag_"+"scaling"+str(scaling)+"_ComputationalTime.png")
187 convergence_synthesis={}
189 convergence_synthesis["PDE_model"]="Wave system"
190 convergence_synthesis["PDE_is_stationary"]=False
191 convergence_synthesis["PDE_search_for_stationary_solution"]=True
193 convergence_synthesis["Numerical_method_name"]="PStag no scaling"
195 convergence_synthesis["Numerical_method_name"]="PStag scaling"
196 convergence_synthesis["Numerical_method_space_discretization"]="Finite volumes"
197 convergence_synthesis["Numerical_method_time_discretization"]="Implicit"
198 convergence_synthesis["Initial_data"]="Constant pressure, divergence free velocity"
199 convergence_synthesis["Boundary_conditions"]="Periodic"
200 convergence_synthesis["Numerical_parameter_cfl"]=cfl
201 convergence_synthesis["Space_dimension"]=2
202 convergence_synthesis["Mesh_dimension"]=2
203 convergence_synthesis["Mesh_names"]=meshList
204 convergence_synthesis["Mesh_type"]=meshType
205 convergence_synthesis["Mesh_path"]=mesh_path
206 convergence_synthesis["Mesh_description"]=mesh_name
207 convergence_synthesis["Mesh_sizes"]=mesh_size_tab
208 convergence_synthesis["Mesh_cell_type"]="Triangles"
209 convergence_synthesis["Numerical_error_velocity"]=error_u_tab
210 convergence_synthesis["Numerical_error_pressure"]=error_p_tab
211 convergence_synthesis["Max_vel_norm"]=max_vel
212 convergence_synthesis["Final_time"]=t_final
213 convergence_synthesis["Final_time_step"]=ndt_final
214 convergence_synthesis["Scheme_order"]=-au
215 convergence_synthesis["Scheme_order_vel"]=-au
216 convergence_synthesis["Scheme_order_press"]=-ap
217 convergence_synthesis["Scaling_preconditioner"]=scaling
218 convergence_synthesis["Condition_numbers"]=cond_number
219 convergence_synthesis["Test_color"]=testColor
220 convergence_synthesis["Computational_time"]=end-start
222 with open('Convergence_WaveSystem_2DFV_PStag_'+mesh_name+'.json', 'w') as outfile:
223 json.dump(convergence_synthesis, outfile)
225 if __name__ == """__main__""":
226 if len(sys.argv) >1 :
227 scaling = int(sys.argv[1])
228 test_validation2DWaveSystemPStagFlatCrossTriangles(scaling)
230 test_validation2DWaveSystemPStagFlatCrossTriangles(2)