diff --git a/ElectromagneticScattering/scattering.geo b/ElectromagneticScattering/scattering.geo index 4d4851c0699c997effebf4bdb2e60063483b1526..ab6fdb629d90a4ddbb64f6d7f513c33e9adeb693 100644 --- a/ElectromagneticScattering/scattering.geo +++ b/ElectromagneticScattering/scattering.geo @@ -723,6 +723,7 @@ If(flag_cartpml==0) Physical Volume(2) = {1073}; // Out - air Physical Volume(3) = {1091}; // pml Physical Point(2000) = {1}; // PrintPoint + Physical Surface(10) = {1055,1057,1059,1062,1064,1066,1068,1070}; EndIf // Mesh.Algorithm = 1; // // 1=MeshAdapt, 5=Delaunay, 6=Frontal @@ -752,3 +753,4 @@ Printf(Sprintf("n_max = %g;" ,n_max)) >> "scattering_tmp.py"; Printf(Sprintf("p_max = %g;" ,p_max)) >> "scattering_tmp.py"; Printf(Sprintf("siwt = %g;" ,siwt)) >> "scattering_tmp.py"; +Mesh.ElementOrder = 2; diff --git a/ElectromagneticScattering/scattering.pro b/ElectromagneticScattering/scattering.pro index 309c4e43e640a6bbe2b126127075aaea498faeec..8768a0c1d6ba0932935c3c89b4f333b9a693ae0d 100644 --- a/ElectromagneticScattering/scattering.pro +++ b/ElectromagneticScattering/scattering.pro @@ -21,6 +21,7 @@ Group { Domain = Region[{Scat_In,Scat_Out}]; PMLs = Region[{PMLxyz,PMLxy,PMLxz,PMLyz,PMLx,PMLy,PMLz}]; All_domains = Region[{Scat_In,Scat_Out,PMLxyz,PMLxy,PMLxz,PMLyz,PMLx,PMLy,PMLz}]; + SurfInt = Region[{}]; EndIf If(flag_cartpml==0) Scat_In = Region[1]; @@ -28,6 +29,7 @@ Group { Domain = Region[{Scat_In,Scat_Out}]; PMLs = Region[3]; All_domains = Region[{Scat_In,Scat_Out,PMLs}]; + SurfInt = Region[{10}]; EndIf PrintPoint = Region[2000]; } @@ -37,6 +39,7 @@ Function{ // For i In {0:#test()-1} // Printf("%g",test(i)); // EndFor + I[] = Complex[0,1]; avoid_sing = 1.e-14; mu0 = 4*Pi*100.0*nm; @@ -192,6 +195,8 @@ Function{ me = ne*(ne+1) - Floor[pe]; Mnm_source~{pe}[] = Mnm[1,ne,me,XYZ[],k_Out]; Nnm_source~{pe}[] = Nnm[1,ne,me,XYZ[],k_Out]; + Mnm_out~{pe}[] = Mnm[4,ne,me,XYZ[],k_Out]; + Nnm_out~{pe}[] = Nnm[4,ne,me,XYZ[],k_Out]; source_M~{pe}[] = (omega0/cel)^2*(epsilonr[]-epsilonr1[])*Mnm_source~{pe}[]; source_N~{pe}[] = (omega0/cel)^2*(epsilonr[]-epsilonr1[])*Nnm_source~{pe}[]; EndFor @@ -235,10 +240,10 @@ Integration { Case { { Type Gauss ; Case { - { GeoElement Point ; NumberOfPoints 1 ; } - { GeoElement Line ; NumberOfPoints 4 ; } - { GeoElement Triangle ; NumberOfPoints 6 ; } - { GeoElement Tetrahedron ; NumberOfPoints 15 ; } + { GeoElement Point ; NumberOfPoints 1 ; } + { GeoElement Line2 ; NumberOfPoints 4 ; } + { GeoElement Triangle2 ; NumberOfPoints 12 ; } + { GeoElement Tetrahedron2 ; NumberOfPoints 17 ; } } } } @@ -249,16 +254,16 @@ FunctionSpace { { Name Hcurl; Type Form1; BasisFunction { { Name sn; NameOfCoef un; Function BF_Edge; - Support Region[All_domains]; Entity EdgesOf[All]; } + Support Region[{All_domains,SurfInt}]; Entity EdgesOf[All]; } { Name sn2; NameOfCoef un2; Function BF_Edge_2E; - Support Region[All_domains]; Entity EdgesOf[All]; } + Support Region[{All_domains,SurfInt}]; Entity EdgesOf[All]; } If (is_FEM_o2==1) { Name sn3; NameOfCoef un3; Function BF_Edge_3F_b; - Support Region[All_domains]; Entity FacetsOf[All]; } + Support Region[{All_domains,SurfInt}]; Entity FacetsOf[All]; } { Name sn4; NameOfCoef un4; Function BF_Edge_3F_c; - Support Region[All_domains]; Entity FacetsOf[All]; } + Support Region[{All_domains,SurfInt}]; Entity FacetsOf[All]; } { Name sn5; NameOfCoef un5; Function BF_Edge_4E; - Support Region[All_domains]; Entity EdgesOf[All]; } + Support Region[{All_domains,SurfInt}]; Entity EdgesOf[All]; } EndIf } Constraint { @@ -316,6 +321,29 @@ Formulation { } } EndFor + {Name VPWMN_helmholtz_vector; Type FemEquation; + Quantity { + { Name u; Type Local; NameOfSpace Hcurl;} + } + Equation { + Galerkin { [-1/mur[]*Dof{Curl u} , {Curl u}]; In All_domains; Jacobian JVol; Integration Int_1; } + Galerkin { [(omega0/cel)^2*epsilonr[]*Dof{u} , {u} ]; In All_domains; Jacobian JVol; Integration Int_1; } + Galerkin { [ (omega0/cel)^2*(epsilonr[]-epsilonr1[])* + ($isN ? Nnm[1,$NE,$ME,XYZ[],k_Out] : Mnm[1,$NE,$ME,XYZ[],k_Out]) + , {u} ]; In Scat_In; Jacobian JVol; Integration Int_1;} + } + } + {Name VPWN_helmholtz_vector_test; Type FemEquation; + Quantity { + { Name u; Type Local; NameOfSpace Hcurl;} + } + Equation { + Galerkin { [-1/mur[]*Dof{Curl u} , {Curl u}]; In All_domains; Jacobian JVol; Integration Int_1; } + Galerkin { [(omega0/cel)^2*epsilonr[]*Dof{u} , {u} ]; In All_domains; Jacobian JVol; Integration Int_1; } + Galerkin { [ (omega0/cel)^2*(epsilonr[]-epsilonr1[])*Nnm[1,$NE,$ME,XYZ[],k_Out], {u} ]; In Scat_In; Jacobian JVol; Integration Int_1;} + } + } + EndIf If (flag_study==RES_GREEN) For ncomp In {0:2} @@ -350,27 +378,35 @@ Resolution { } EndIf If (flag_study==RES_TMAT) - { Name res_VPWall_helmholtz_vector; + { Name res_VPWall_helmholtz_vector; System { - For pe In {1:p_max} - { Name M~{pe}; NameOfFormulation VPWM_helmholtz_vector~{pe}; Type ComplexValue; Frequency Freq; } - { Name N~{pe}; NameOfFormulation VPWN_helmholtz_vector~{pe}; Type ComplexValue; Frequency Freq; } - EndFor + { Name T; NameOfFormulation VPWMN_helmholtz_vector; Type ComplexValue; } } Operation { CreateDir[Str[myDir]]; Evaluate[Python[]{"scattering_init.py"}]; + For pe In {1:p_max} - Generate[M~{pe}]; - Solve[M~{pe}]; + Evaluate[ $isN = 0 ]; + Evaluate[ $PE = pe ]; + Evaluate[ $NE = Floor[Sqrt[$PE]] ]; + Evaluate[ $ME = $NE*($NE+1) - Floor[$PE] ]; + If (pe==1) + Generate[T]; + Solve[T]; + EndIf + GenerateRHS[T]; + SolveAgain[T]; PostOperation[VPWM_postop~{pe}]; - Generate[N~{pe}]; - Solve[N~{pe}]; + Evaluate[$isN=1]; + GenerateRHS[T]; + SolveAgain[T]; PostOperation[VPWN_postop~{pe}]; EndFor Evaluate[Python[]{"scattering_post.py"}]; } } + EndIf If (flag_study==RES_GREEN) { Name res_GreenAll_helmholtz_vector; @@ -421,7 +457,7 @@ PostProcessing { EndIf If (flag_study==RES_PW) - { Name PW_postpro ; NameOfFormulation PW_helmholtz_vector;NameOfSystem P; + { Name PW_postpro ; NameOfFormulation PW_helmholtz_vector; NameOfSystem P; Quantity { { Name E_tot ; Value { Local { [{u}+Einc[]]; In All_domains; Jacobian JVol; } } } { Name E_scat ; Value { Local { [{u}]; In All_domains; Jacobian JVol; } } } @@ -439,9 +475,10 @@ PostProcessing { } } EndIf + If (flag_study==RES_TMAT) For pe In {1:p_max} - { Name VPWM_postpro~{pe}; NameOfFormulation VPWM_helmholtz_vector~{pe};NameOfSystem M~{pe}; + { Name VPWM_postpro~{pe}; NameOfFormulation VPWMN_helmholtz_vector; NameOfSystem T; Quantity { { Name E_scat ; Value { Local { [{u}]; In All_domains; Jacobian JVol; } } } { Name E_scat_sph ; Value { Local { [Vector[ @@ -452,9 +489,13 @@ PostProcessing { In All_domains; Jacobian JVol; } } } { Name H_scat ; Value { Local { [siwt*I[]/(mur[]*mu0*omega0)*{Curl u}]; In All_domains; Jacobian JVol; } } } { Name Mnm_source~{pe} ; Value { Local { [ Mnm_source~{pe}[] ]; In All_domains; Jacobian JVol; } } } + For po In {1:p_max} + { Name a~{pe}~{po} ; Value { Integral { [ {u}*Conj[Mnm_out~{po}[]] ]; In SurfInt; Integration Int_1 ; Jacobian JSur; } } } + { Name norma~{pe}~{po} ; Value { Integral { [ Mnm_out~{pe}[]*Conj[Mnm_out~{po}[]] ]; In SurfInt; Integration Int_1 ; Jacobian JSur; } } } + EndFor } } - { Name VPWN_postpro~{pe}; NameOfFormulation VPWN_helmholtz_vector~{pe};NameOfSystem N~{pe}; + { Name VPWN_postpro~{pe}; NameOfFormulation VPWMN_helmholtz_vector; NameOfSystem T; Quantity { { Name E_scat ; Value { Local { [{u}]; In All_domains; Jacobian JVol; } } } { Name E_scat_sph ; Value { Local { [Vector[ @@ -469,6 +510,7 @@ PostProcessing { } EndFor EndIf + If (flag_study==RES_GREEN) For ncomp In {0:2} { Name GreenAll_postpro~{ncomp}; NameOfFormulation GreenAll_helmholtz_vector~{ncomp};NameOfSystem M~{ncomp}; @@ -520,6 +562,7 @@ PostOperation { } } EndIf + If (flag_study==RES_PW) {Name PW_postop; NameOfPostProcessing PW_postpro ; Operation { @@ -540,6 +583,7 @@ PostOperation { } } EndIf + If (flag_study==RES_TMAT) For pe In {1:p_max} {Name VPWM_postop~{pe}; NameOfPostProcessing VPWM_postpro~{pe} ; @@ -557,6 +601,10 @@ PostOperation { {sph_scan : 2.0*Pi-sph_scan+(2.0*Pi-2.0*sph_scan)/(10*(npts_plot_phi-1.0)) : (2.0*Pi-2.0*sph_scan)/(npts_plot_phi-1.0)} }, File StrCat[myDir,StrCat[StrCat["E_scat_onsphere_cart_M",Sprintf["%g",pe]],Sprintf["_r%g.pos",kr]]], Name StrCat["E_scat_onsphere_cart_M",Sprintf["%g",pe]]]; + For po In {1:p_max} + Print[a~{pe}~{po}[SurfInt], OnGlobal , Format Table, File StrCat[myDir,StrCat[StrCat["a_",Sprintf["pe%g",pe]],Sprintf["po%g.dat",po]]]]; + Print[norma~{pe}~{po}[SurfInt], OnGlobal , Format Table, File StrCat[myDir,StrCat[StrCat["norma_",Sprintf["pe%g",pe]],Sprintf["po%g.dat",po]]]]; + EndFor } } {Name VPWN_postop~{pe}; NameOfPostProcessing VPWN_postpro~{pe} ; @@ -578,6 +626,7 @@ PostOperation { } EndFor EndIf + If (flag_study==RES_GREEN) For ncomp In {0:2} {Name GreenAll_postop~{ncomp}; NameOfPostProcessing GreenAll_postpro~{ncomp} ; @@ -656,4 +705,4 @@ If (flag_study==RES_GREEN) R_ = {"res_GreenAll_helmholtz_vector", Name "GetDP/1ResolutionChoices", Visible 1}, C_ = {"-solve -pos -petsc_prealloc 200 -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type mumps", Name "GetDP/9ComputeCommand", Visible 1}, P_ = {"", Name "GetDP/2PostOperationChoices", Visible 0}]; -EndIf \ No newline at end of file +EndIf diff --git a/ElectromagneticScattering/scattering_init.py b/ElectromagneticScattering/scattering_init.py index 2f7621c6a6b329b909510f8b92f14a5f33529dcf..51761f3fdbebc097872ebb94cca385f5e6920df5 100644 --- a/ElectromagneticScattering/scattering_init.py +++ b/ElectromagneticScattering/scattering_init.py @@ -11,8 +11,8 @@ import sys,os import numpy as np from scipy.special import jv, yv, hankel1, hankel2 sys.path.append(os.getcwd()) -from matplotlib import cm -import pylab as pl +# from matplotlib import cm +# import pylab as pl from scattering_tmp import * np.set_printoptions(precision=2) pi = np.pi @@ -38,7 +38,7 @@ def field_VSH_expansion(post_filename): FF_erCrossXnm_p = np.zeros((npts_theta,npts_phi,p_max),dtype=complex) ##################################### ##### sn, pn ,un - ##### Brian's recurrence relations + ##### Brian Stout's recurrence relations (B_ arrays) B_Pnpms = np.zeros((npts_theta,m_max+1,n_max+1)) B_unpms = np.zeros((npts_theta,m_max+1,n_max+1)) B_snpms = np.zeros((npts_theta,m_max+1,n_max+1)) @@ -88,7 +88,7 @@ def field_VSH_expansion(post_filename): ##################################### ##### sn, pn ,un - ##### Brian's recurrence relations + ##### Brian Stout's recurrence relations (B_ arrays) m_max = n_max p_max = n_max*n_max+2*n_max aM_nm = np.zeros(p_max,dtype=complex) @@ -186,15 +186,15 @@ def field_VSH_expansion(post_filename): B_Nnm_t = 1./(k_Out*r_sph) * dRicatti_dx_ofkr * B_Znm_t B_Nnm_p = 1./(k_Out*r_sph) * dRicatti_dx_ofkr * B_Znm_p - B_EdotconjYnm = E_scat_onsphere_sph_r*B_Ynm_r.conjugate() - B_EdotconjZnm = E_scat_onsphere_sph_t*B_Znm_t.conjugate() + E_scat_onsphere_sph_p*B_Znm_p.conjugate() - B_EdotconjXnm = E_scat_onsphere_sph_t*B_Xnm_t.conjugate() + E_scat_onsphere_sph_p*B_Xnm_p.conjugate() - normalize_fhnm_X = 1./sph_bessel_n_ofkr - normalize_fenm_Y = k_Out*r_sph/(sph_bessel_n_ofkr*np.sqrt(float(n)*(float(n)+1.)) ) - normalize_fenm_Z = k_Out*r_sph/dRicatti_dx_ofkr - fenm_Y[int(po)-1] = np.trapz(np.trapz((np.sin(theta_sph)*B_EdotconjYnm).transpose(),theta_sph[:,0]),phi_sph[0,:])*normalize_fenm_Y - fenm_Z[int(po)-1] = np.trapz(np.trapz((np.sin(theta_sph)*B_EdotconjZnm).transpose(),theta_sph[:,0]),phi_sph[0,:])*normalize_fenm_Z - fhnm_X[int(po)-1] = np.trapz(np.trapz((np.sin(theta_sph)*B_EdotconjXnm).transpose(),theta_sph[:,0]),phi_sph[0,:])*normalize_fhnm_X + B_EdotconjYnm = E_scat_onsphere_sph_r*B_Ynm_r.conjugate() + B_EdotconjZnm = E_scat_onsphere_sph_t*B_Znm_t.conjugate() + E_scat_onsphere_sph_p*B_Znm_p.conjugate() + B_EdotconjXnm = E_scat_onsphere_sph_t*B_Xnm_t.conjugate() + E_scat_onsphere_sph_p*B_Xnm_p.conjugate() + normalize_fhnm_X = 1./sph_bessel_n_ofkr + normalize_fenm_Y = k_Out*r_sph/(sph_bessel_n_ofkr*np.sqrt(float(n)*(float(n)+1.)) ) + normalize_fenm_Z = k_Out*r_sph/dRicatti_dx_ofkr + fenm_Y[int(po)-1] = np.trapz(np.trapz((np.sin(theta_sph)*B_EdotconjYnm).transpose(),theta_sph[:,0]),phi_sph[0,:])*normalize_fenm_Y + fenm_Z[int(po)-1] = np.trapz(np.trapz((np.sin(theta_sph)*B_EdotconjZnm).transpose(),theta_sph[:,0]),phi_sph[0,:])*normalize_fenm_Z + fhnm_X[int(po)-1] = np.trapz(np.trapz((np.sin(theta_sph)*B_EdotconjXnm).transpose(),theta_sph[:,0]),phi_sph[0,:])*normalize_fhnm_X EdotconjMnm = E_scat_onsphere_sph_r*B_Mnm_r.conjugate() + E_scat_onsphere_sph_t*B_Mnm_t.conjugate() + E_scat_onsphere_sph_p*B_Mnm_p.conjugate() EdotconjNnm = E_scat_onsphere_sph_r*B_Nnm_r.conjugate() + E_scat_onsphere_sph_t*B_Nnm_t.conjugate() + E_scat_onsphere_sph_p*B_Nnm_p.conjugate() @@ -218,41 +218,48 @@ def field_VSH_expansion(post_filename): orth3 = np.trapz(np.trapz((np.sin(theta_sph)*ZnmconjXnm).transpose(),theta_sph[:,0]),phi_sph[0,:]) aM_nm[int(po)-1] = np.trapz(np.trapz((np.sin(theta_sph)*EdotconjMnm).transpose(),theta_sph[:,0]),phi_sph[0,:]) / normalize_aM_nm2 bN_nm[int(po)-1] = np.trapz(np.trapz((np.sin(theta_sph)*EdotconjNnm).transpose(),theta_sph[:,0]),phi_sph[0,:]) / normalize_bN_nm2 + print('anm not normalized' , np.trapz(np.trapz((np.sin(theta_sph)*EdotconjMnm).transpose(),theta_sph[:,0]),phi_sph[0,:])) + print('normalization ' , normalize_aM_nm2) + + + + # print(np.loadtxt('run_results/a_pe%gpo%g.dat'%(1,int(po)))) + # print(aM_nm) return [fhnm_X,fenm_Y,fenm_Z,aM_nm,bN_nm,FF_Xnm_t,FF_Xnm_p,FF_erCrossXnm_t,FF_erCrossXnm_p] -########################### -def plot_farfield(far_field_sph,filename): - vmax_sph = np.max(far_field_sph) - vmin_sph = np.min(far_field_sph) - x_sph = far_field_sph/vmax_sph*np.sin(theta_sph) * np.cos(phi_sph) - y_sph = far_field_sph/vmax_sph*np.sin(theta_sph) * np.sin(phi_sph) - z_sph = far_field_sph/vmax_sph*np.cos(theta_sph) - fig = pl.figure() - ax = fig.add_subplot(111, projection='3d') - ax.set_aspect('equal') - surf=ax.plot_surface(x_sph,y_sph,z_sph,\ - facecolors=cm.viridis(far_field_sph/vmax_sph),\ - rstride=2,\ - cstride=2,\ - linewidth=0,\ - vmin = vmin_sph,\ - vmax = vmax_sph,\ - shade=True,\ - alpha=0.5,\ - antialiased=False) - cset = ax.contourf(x_sph, y_sph, z_sph,1,fc='k', zdir='z', offset=-1) - cset = ax.contourf(x_sph, y_sph, z_sph,1,fc='k', zdir='x', offset=-1) - cset = ax.contourf(x_sph, y_sph, z_sph,1,fc='k', zdir='y', offset=1 ) - surf.set_edgecolor('k') - max_range = 0.5*np.max(np.array([x_sph.max()-x_sph.min(), y_sph.max()-y_sph.min(), z_sph.max()-z_sph.min()])) - mid_x = (x_sph.max()+x_sph.min())*0.5 - mid_y = (y_sph.max()+y_sph.min())*0.5 - mid_z = (z_sph.max()+z_sph.min())*0.5 - ax.set_xlim(mid_x-max_range, mid_x+max_range) - ax.set_ylim(mid_y-max_range, mid_y+max_range) - ax.set_zlim(mid_z-max_range, mid_z+max_range) - ax.xaxis.set_ticklabels([]);ax.xaxis.set_label('x') - ax.yaxis.set_ticklabels([]);ax.yaxis.set_label('y') - ax.zaxis.set_ticklabels([]);ax.zaxis.set_label('z') - pl.savefig(filename,bbox_inches='tight') - pl.close('all') +# # ########################### +# # def plot_farfield(far_field_sph,filename): +# # vmax_sph = np.max(far_field_sph) +# # vmin_sph = np.min(far_field_sph) +# # x_sph = far_field_sph/vmax_sph*np.sin(theta_sph) * np.cos(phi_sph) +# # y_sph = far_field_sph/vmax_sph*np.sin(theta_sph) * np.sin(phi_sph) +# # z_sph = far_field_sph/vmax_sph*np.cos(theta_sph) +# # fig = pl.figure() +# # ax = fig.add_subplot(111, projection='3d') +# # ax.set_aspect('equal') +# # surf=ax.plot_surface(x_sph,y_sph,z_sph,\ +# # facecolors=cm.viridis(far_field_sph/vmax_sph),\ +# # rstride=2,\ +# # cstride=2,\ +# # linewidth=0,\ +# # vmin = vmin_sph,\ +# # vmax = vmax_sph,\ +# # shade=True,\ +# # alpha=0.5,\ +# # antialiased=False) +# # cset = ax.contourf(x_sph, y_sph, z_sph,1,fc='k', zdir='z', offset=-1) +# # cset = ax.contourf(x_sph, y_sph, z_sph,1,fc='k', zdir='x', offset=-1) +# # cset = ax.contourf(x_sph, y_sph, z_sph,1,fc='k', zdir='y', offset=1 ) +# # surf.set_edgecolor('k') +# # max_range = 0.5*np.max(np.array([x_sph.max()-x_sph.min(), y_sph.max()-y_sph.min(), z_sph.max()-z_sph.min()])) +# # mid_x = (x_sph.max()+x_sph.min())*0.5 +# # mid_y = (y_sph.max()+y_sph.min())*0.5 +# # mid_z = (z_sph.max()+z_sph.min())*0.5 +# # ax.set_xlim(mid_x-max_range, mid_x+max_range) +# # ax.set_ylim(mid_y-max_range, mid_y+max_range) +# # ax.set_zlim(mid_z-max_range, mid_z+max_range) +# # ax.xaxis.set_ticklabels([]);ax.xaxis.set_label('x') +# # ax.yaxis.set_ticklabels([]);ax.yaxis.set_label('y') +# # ax.zaxis.set_ticklabels([]);ax.zaxis.set_label('z') +# # pl.savefig(filename,bbox_inches='tight') +# # pl.close('all')