2 import WaveSystemUpwind
5 import matplotlib.pyplot as plt
7 from math import log10, sqrt
12 def test_validation2DWaveSystemUpwindSquares(bctype,scaling):
15 meshList=[7,15,31,51,81]#,101
16 #meshList=['squareWithSquares_1','squareWithSquares_2','squareWithSquares_3','squareWithSquares_4','squareWithSquares_5']
17 mesh_path='../../../ressources/2DCartesien/'
18 meshType="Regular squares"
20 nbMeshes=len(meshList)
21 error_p_tab=[0]*nbMeshes
22 error_u_tab=[0]*nbMeshes
23 mesh_size_tab=[0]*nbMeshes
24 mesh_name='squareWithSquares'
25 diag_data_press=[0]*nbMeshes
26 diag_data_vel=[0]*nbMeshes
29 ndt_final=[0]*nbMeshes
32 curv_abs=np.linspace(0,sqrt(2),resolution+1)
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] =WaveSystemUpwind.solve(my_mesh,"square"+str(nx)+'x'+str(nx), resolution,scaling,meshType,testColor,cfl,bctype)
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] =WaveSystemUpwind.solve_file(mesh_path+filename, mesh_name, resolution,scaling,meshType,testColor,cfl,bctype)
43 assert max_vel[i]>0.76 and max_vel[i]<1
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):
53 plt.plot(curv_abs, diag_data_press[i], label= str(mesh_size_tab[i]) + ' cells')
55 plt.xlabel('Position on diagonal line')
56 plt.ylabel('Pressure on diagonal line')
57 plt.title('Plot over diagonal line for stationary wave system \n with upwind scheme on 2D square meshes')
58 plt.savefig(mesh_name+'_Pressure_2DWaveSystemUpwind_'+"PlotOverDiagonalLine.png")
62 for i in range(nbMeshes):
63 plt.plot(curv_abs, diag_data_vel[i], label= str(mesh_size_tab[i]) + ' cells')
65 plt.xlabel('Position on diagonal line')
66 plt.ylabel('Velocity on diagonal line')
67 plt.title('Plot over diagonal line for the stationary wave system \n with upwind scheme on 2D square meshes')
68 plt.savefig(mesh_name+"_Velocity_2DWaveSystemUpwind_"+"PlotOverDiagonalLine.png")
71 # Plot of number of time steps
73 plt.plot(mesh_size_tab, ndt_final, label='Number of time step to reach stationary regime')
75 plt.xlabel('number of cells')
76 plt.ylabel('Max time steps for stationary regime')
77 plt.title('Number of times steps required for the stationary Wave System \n with upwind scheme on 2D square meshes')
78 plt.savefig(mesh_name+"_2DWaveSystemUpwind_"+"TimeSteps.png")
80 # Plot of number of stationary time
82 plt.plot(mesh_size_tab, t_final, label='Time where stationary regime is reached')
84 plt.xlabel('number of cells')
85 plt.ylabel('Max time for stationary regime')
86 plt.title('Simulated time for the stationary Wave System \n with upwind scheme on 2D square meshes')
87 plt.savefig(mesh_name+"_2DWaveSystemUpwind_"+"TimeFinal.png")
89 # Plot of number of maximal velocity norm
91 plt.plot(mesh_size_tab, max_vel, label='Maximum velocity norm')
93 plt.xlabel('number of cells')
94 plt.ylabel('Max velocity norm')
95 plt.title('Maximum velocity norm for the stationary Wave System \n with upwind scheme on 2D square meshes')
96 plt.savefig(mesh_name+"_2DWaveSystemUpwind_"+"MaxVelNorm.png")
98 for i in range(nbMeshes):
99 mesh_size_tab[i]=0.5*log10(mesh_size_tab[i])
101 # Least square linear regression
102 # Find the best a,b such that f(x)=ax+b best approximates the convergence curve
103 # The vector X=(a,b) solves a symmetric linear system AX=B with A=(a1,a2\\a2,a3), B=(b1,b2)
104 a1=np.dot(mesh_size_tab,mesh_size_tab)
105 a2=np.sum(mesh_size_tab)
109 assert det!=0, 'test_validation2DWaveSystemUpwind_squares() : Make sure you use distinct meshes and at least two meshes'
111 b1p=np.dot(error_p_tab,mesh_size_tab)
112 b2p=np.sum(error_p_tab)
113 ap=( a3*b1p-a2*b2p)/det
114 bp=(-a2*b1p+a1*b2p)/det
116 print("FV upwind on 2D square meshes : scheme order for pressure is ", -ap)
118 b1u=np.dot(error_u_tab,mesh_size_tab)
119 b2u=np.sum(error_u_tab)
120 au=( a3*b1u-a2*b2u)/det
121 bu=(-a2*b1u+a1*b2u)/det
123 print("FV upwind on 2D square meshes : scheme order for velocity is ", -au)
125 # Plot of convergence curves
127 plt.plot(mesh_size_tab, error_p_tab, label='|error on stationary pressure|')
129 plt.xlabel('1/2 log(number of cells)')
130 plt.ylabel('|error p|')
131 plt.title('Convergence of finite volumes for the stationary Wave System \n with upwind scheme on 2D square meshes')
132 plt.savefig(mesh_name+"_Pressure_2DWaveSystemUpwind_"+"ConvergenceCurve.png")
135 plt.plot(mesh_size_tab, error_u_tab, label='log(|error on stationary velocity|)')
137 plt.xlabel('1/2 log(number of cells)')
138 plt.ylabel('log(|error u|)')
139 plt.title('Convergence of finite volumes for the stationary Wave System\n with upwind scheme on 2D square meshes')
140 plt.savefig(mesh_name+"_Velocity_2DWaveSystemUpwind_"+"ConvergenceCurve.png")
142 # Plot of computational time
144 plt.plot(mesh_size_tab, time_tab, label='log(cpu time)')
146 plt.xlabel('1/2 log(number of cells)')
147 plt.ylabel('log(cpu time)')
148 plt.title('Computational time of finite volumes for the stationary Wave System \n with upwind scheme on 2D square meshes')
149 plt.savefig(mesh_name+"_2DWaveSystemUpwind_ComputationalTimeSquares.png")
153 convergence_synthesis={}
155 convergence_synthesis["PDE_model"]="Wave system"
156 convergence_synthesis["PDE_is_stationary"]=False
157 convergence_synthesis["PDE_search_for_stationary_solution"]=True
158 convergence_synthesis["Numerical_method_name"]="Upwind"
159 convergence_synthesis["Numerical_method_space_discretization"]="Finite volumes"
160 convergence_synthesis["Numerical_method_time_discretization"]="Implicit"
161 convergence_synthesis["Initial_data"]="Constant pressure, divergence free velocity"
162 convergence_synthesis["Boundary_conditions"]="Periodic"
163 convergence_synthesis["Numerical_parameter_cfl"]=cfl
164 convergence_synthesis["Space_dimension"]=2
165 convergence_synthesis["Mesh_dimension"]=2
166 convergence_synthesis["Mesh_names"]=meshList
167 convergence_synthesis["Mesh_type"]=meshType
168 convergence_synthesis["Mesh_path"]=mesh_path
169 convergence_synthesis["Mesh_description"]=mesh_name
170 convergence_synthesis["Mesh_sizes"]=mesh_size_tab
171 convergence_synthesis["Mesh_cell_type"]="Squares"
172 convergence_synthesis["Numerical_error_velocity"]=error_u_tab
173 convergence_synthesis["Numerical_error_pressure"]=error_p_tab
174 convergence_synthesis["Max_vel_norm"]=max_vel
175 convergence_synthesis["Final_time"]=t_final
176 convergence_synthesis["Final_time_step"]=ndt_final
177 convergence_synthesis["Scheme_order"]=min(-au,-ap)
178 convergence_synthesis["Scheme_order_vel"]=-au
179 convergence_synthesis["Scheme_order_press"]=-ap
180 convergence_synthesis["Scaling_preconditioner"]="None"
181 convergence_synthesis["Test_color"]=testColor
182 convergence_synthesis["Computational_time"]=end-start
184 with open('Convergence_WaveSystem_2DFV_Upwind_'+mesh_name+'.json', 'w') as outfile:
185 json.dump(convergence_synthesis, outfile)
187 if __name__ == """__main__""":
188 if len(sys.argv) >2 :
190 scaling = int(sys.argv[2])
191 test_validation2DWaveSystemUpwindSquares(bctype,scaling)
193 raise ValueError("test_validation2DWaveSystemUpwindSquares.py expects a mesh file name and a scaling parameter")