2 import FiniteVolumes2DPoisson_SQUARE
3 import matplotlib.pyplot as plt
5 from math import log10, sqrt
8 convergence_synthesis=dict(FiniteVolumes2DPoisson_SQUARE.test_desc)
10 def test_validation2DVF_long_rectangles():
12 ### 2D FV long rectangles mesh
14 #meshList=['squareWithFlatTriangles_0','squareWithLongRectangles_1','squareWithLongRectangles_2','squareWithLongRectangles_3','squareWithLongRectangles_4','squareWithLongRectangles_5']
15 mesh_path='../../../ressources/2DLongRectangles/'
16 meshType="Regular_long_rectangles"
18 nbMeshes=len(meshList)
19 error_tab=[0]*nbMeshes
20 mesh_size_tab=[0]*nbMeshes
21 mesh_name='squareWithLongRectangles'
22 diag_data=[0]*nbMeshes
25 curv_abs=np.linspace(0,sqrt(2),resolution+1)
28 # Storing of numerical errors, mesh sizes and diagonal values
29 #for filename in meshList:
31 my_mesh=cdmath.Mesh(0,1,nx,0,1,nx*nx)
32 error_tab[i], mesh_size_tab[i], diag_data[i], min_sol_num, max_sol_num, time_tab[i] =FiniteVolumes2DPoisson_SQUARE.solve(my_mesh,str(nx)+'x'+str(nx),resolution,meshType,testColor)
33 # error_tab[i], mesh_size_tab[i], diag_data[i], min_sol_num, max_sol_num, time_tab[i] =FiniteVolumes2DPoisson_SQUARE.solve_file(mesh_path+filename,resolution,meshType,testColor)
34 assert min_sol_num>-0.01
35 assert max_sol_num<1.2
36 plt.plot(curv_abs, diag_data[i], label= str(mesh_size_tab[i]) + ' cells')
37 error_tab[i]=log10(error_tab[i])
38 time_tab[i]=log10(time_tab[i])
39 mesh_size_tab[i] = 0.5*log10(mesh_size_tab[i])
44 # Plot over diagonal line
46 plt.xlabel('Position on diagonal line')
47 plt.ylabel('Value on diagonal line')
48 plt.title('Plot over diagonal line for finite volumes \n for Laplace operator on 2D long rectangles meshes')
49 plt.savefig(mesh_name+"_2DPoissonFV_PlotOverDiagonalLine.png")
51 # Least square linear regression
52 # Find the best a,b such that f(x)=ax+b best approximates the convergence curve
53 # The vector X=(a,b) solves a symmetric linear system AX=B with A=(a1,a2\\a2,a3), B=(b1,b2)
54 a1=np.dot(mesh_size_tab,mesh_size_tab)
55 a2=np.sum(mesh_size_tab)
57 b1=np.dot(error_tab,mesh_size_tab)
61 assert det!=0, 'test_validation2DVF_long_rectangles() : Make sure you use distinct meshes and at least two meshes'
65 print( "FV on 2D long rectangles mesh : scheme order is ", -a )
66 assert abs(a+1.33)<0.1
68 # Plot of convergence curve
70 plt.plot(mesh_size_tab, error_tab, label='log(|numerical-exact|)')
71 plt.plot(mesh_size_tab, a*np.array(mesh_size_tab)+b,label='least square slope : '+'%.3f' % a)
73 plt.plot(mesh_size_tab, error_tab)
74 plt.xlabel('log(sqrt(number of cells))')
75 plt.ylabel('log(error)')
76 plt.title('Convergence of finite volumes for \n Laplace operator on 2D long rectangles meshes')
77 plt.savefig(mesh_name+"_2DPoissonFV_ConvergenceCurve.png")
79 # Plot of computational time
81 plt.plot(mesh_size_tab, time_tab, label='log(cpu time)')
83 plt.xlabel('log(sqrt(number of cells))')
84 plt.ylabel('log(cpu time)')
85 plt.title('Computational time of finite volumes \n for Laplace operator on 2D long rectangles meshes')
86 plt.savefig(mesh_name+"_2DPoissonFV_ComputationalTime.png")
90 convergence_synthesis["Mesh_names"]=meshList
91 convergence_synthesis["Mesh_type"]=meshType
92 convergence_synthesis["Mesh_path"]=mesh_path
93 convergence_synthesis["Mesh_description"]=mesh_name
94 convergence_synthesis["Mesh_sizes"]=[10**x for x in mesh_size_tab]
95 convergence_synthesis["Space_dimension"]=2
96 convergence_synthesis["Mesh_dimension"]=2
97 convergence_synthesis["Mesh_cell_type"]="Long rectangles"
98 convergence_synthesis["Errors"]=[10**x for x in error_tab]
99 convergence_synthesis["Scheme_order"]=-a
100 convergence_synthesis["Test_color"]=testColor
101 convergence_synthesis["Computational_time"]=end-start
103 with open('Convergence_Poisson_2DVF_'+mesh_name+'.json', 'w') as outfile:
104 json.dump(convergence_synthesis, outfile)
107 os.system("jupyter-nbconvert --to notebook --execute Convergence_Poisson_FV5_SQUARE_long_rectangles.ipynb")
108 os.system("jupyter-nbconvert --to html Convergence_Poisson_FV5_SQUARE_long_rectangles.ipynb")
109 os.system("jupyter-nbconvert --to pdf Convergence_Poisson_FV5_SQUARE_long_rectangles.ipynb")
111 if __name__ == """__main__""":
112 test_validation2DVF_long_rectangles()