4 import validationStationaryDiffusionEquation
6 import matplotlib.pyplot as plt
8 from math import log10, sqrt
11 convergence_synthesis=dict(validationStationaryDiffusionEquation.test_desc)
13 def convergence_StationaryDiffusion_3DFV_Dirichlet_RegularCubes():
15 ### 3D FV Regular Cubes meshes
18 meshList=[5,20,50,100]
19 mesh_name='cubeWithRegularCubes'
20 meshType="Regular_Cubes"
21 nbMeshes=len(meshList)
22 error_tab=[0]*nbMeshes
23 mesh_size_tab=[0]*nbMeshes
24 diag_data=[0]*nbMeshes
27 curv_abs=np.linspace(0,sqrt(2),resolution+1)
30 testColor="Orange (not order 2)"
31 # Storing of numerical errors, mesh sizes and diagonal values
33 my_mesh=cm.Mesh(0,1,nx,0,1,nx,0,1,nx)
34 error_tab[i], mesh_size_tab[i], diag_data[i], min_sol_num, max_sol_num, time_tab[i] =validationStationaryDiffusionEquation.SolveStationaryDiffusionEquation(my_mesh,resolution,meshType,method,BC)
38 plt.plot(curv_abs, diag_data[i], label= str(mesh_size_tab[i]) + ' cells')
39 error_tab[i]=log10(error_tab[i])
40 time_tab[i]=log10(time_tab[i])
41 mesh_size_tab[i] = 0.5*log10(mesh_size_tab[i])
47 # Plot over diagonal line
49 plt.xlabel('Position on diagonal line')
50 plt.ylabel('Value on diagonal line')
51 plt.title('Plot over diagonal line for finite volumes for Poisson problem \n on 3D regular cube meshes with Dirichlet BC')
52 plt.savefig(mesh_name+"_3DFV_StatDiffusion_Dirichlet_PlotOverDiagonalLine.png")
54 # Least square linear regression
55 # Find the best a,b such that f(x)=ax+b best approximates the convergence curve
56 # The vector X=(a,b) solves a symmetric linear system AX=B with A=(a1,a2\\a2,a3), B=(b1,b2)
57 a1=np.dot(mesh_size_tab,mesh_size_tab)
58 a2=np.sum(mesh_size_tab)
60 b1=np.dot(error_tab,mesh_size_tab)
64 assert det!=0, 'convergence_StationaryDiffusion_3DFV_Dirichlet_regularCubes() : Make sure you use distinct meshes and at least two meshes'
68 print "FV for diffusion on 3D regular tetrahedron meshes: scheme order is ", -a
69 assert abs(a+1.34)<0.01
71 # Plot of convergence curve
73 plt.plot(mesh_size_tab, error_tab, label='log(|numerical-exact|)')
74 plt.plot(mesh_size_tab, a*np.array(mesh_size_tab)+b,label='least square slope : '+'%.3f' % a)
76 plt.plot(mesh_size_tab, error_tab)
77 plt.xlabel('log(sqrt(number of cells))')
78 plt.ylabel('log(error)')
79 plt.title('Convergence of finite volumes for Poisson problem \n on 3D regular cube meshes with Dirichlet BC')
80 plt.savefig(mesh_name+"_3DFV_StatDiffusion_Dirichlet_ConvergenceCurve.png")
82 # Plot of computational time
84 plt.plot(mesh_size_tab, time_tab, label='log(cpu time)')
86 plt.xlabel('log(sqrt(number of cells))')
87 plt.ylabel('log(cpu time)')
88 plt.title('Computational time of finite volumes for Poisson problem \n on 3D regular cube meshes with Dirichlet BC')
89 plt.savefig(mesh_name+"_3DFV_StatDiffusion_Dirichlet_ComputationalTime.png")
93 convergence_synthesis["Mesh_names"]=meshList
94 convergence_synthesis["Mesh_type"]=meshType
95 #convergence_synthesis["Mesh_path"]=mesh_path
96 convergence_synthesis["Mesh_description"]=mesh_name
97 convergence_synthesis["Mesh_sizes"]=[10**x for x in mesh_size_tab]
98 convergence_synthesis["Space_dim"]=3
99 convergence_synthesis["Mesh_dim"]=3
100 convergence_synthesis["Mesh_cell_type"]="Cubes"
101 convergence_synthesis["Errors"]=[10**x for x in error_tab]
102 convergence_synthesis["Scheme_order"]=round(-a,4)
103 convergence_synthesis["Test_color"]=testColor
104 convergence_synthesis["PDE_model"]='Poisson'
105 convergence_synthesis["Num_method"]=method
106 convergence_synthesis["Bound_cond"]=BC
107 convergence_synthesis["Comput_time"]=round(end-start,3)
109 with open('Convergence_Poisson_3DFV_'+mesh_name+'.json', 'w') as outfile:
110 json.dump(convergence_synthesis, outfile)
113 if __name__ == """__main__""":
114 convergence_StationaryDiffusion_3DFV_Dirichlet_RegularCubes()