/////////////////////////////// // Author : Guillaume Demesy // // scattering_data.geo // /////////////////////////////// nm = 1.; epsilon0 = 8.854187817e-3*nm; mu0 = 400.*Pi*nm; cel = 1.0/(Sqrt[epsilon0 * mu0]); deg2rad = Pi/180.; pp0 = "1Geometry/0"; pp1 = "2Study Type/0"; pp2 = "3Electromagnetic parameters/0"; pp3 = "4Mesh size and PMLs parameters/0"; pp4 = "5Postpro options/0"; pp5 = "6Post plot options/0"; close_menu = 0; colorro = "LightGrey"; colorppOK = "Ivory"; colorppWA = "LightSalmon1"; colorppNO = "LightSalmon4"; ELL = 0; PARALL = 1; CYL = 2; CONE = 3; TOR = 4; RES_PW = 0; RES_TMAT = 1; RES_GREEN = 2; RES_QNM = 3; DefineConstant[ flag_shape = {ELL , Name StrCat[pp0, "0Scatterer shape"], Choices {ELL="ellispoid",PARALL="parallelepiped",CYL="cylinder",CONE="cone",TOR="split torus"},Closed 0,GmshOption "Reset", Autocheck 0}]; If (flag_shape==ELL) DefineConstant[ ell_rx = {73.45 , Name StrCat[pp0 , "1ellipsoid X-radius [nm]"], Highlight Str[colorppOK] , Closed 0}, ell_ry = {73.45 , Name StrCat[pp0 , "2ellipsoid Y-radius [nm]"], Highlight Str[colorppOK] , Closed 0}, ell_rz = {73.45 , Name StrCat[pp0 , "3ellipsoid Z-radius [nm]"], Highlight Str[colorppOK] , Closed 0} ]; // FIXME gmsh Max? If (ell_rx>ell_ry) rbb_tmp=ell_rx; Else rbb_tmp=ell_ry; EndIf If (ell_rz>rbb_tmp) rbb=ell_rz; Else rbb=rbb_tmp; EndIf EndIf If (flag_shape==PARALL) DefineConstant[ par_ax = {300 , Name StrCat[pp0 , "1cube X-edge size [nm]"], Highlight Str[colorppOK] , Closed 0}, par_ay = {100 , Name StrCat[pp0 , "2cube Y-edge size [nm]"], Highlight Str[colorppOK] , Closed 0}, par_az = {600 , Name StrCat[pp0 , "3cube Z-edge size [nm]"], Highlight Str[colorppOK] , Closed 0}]; rbb = 0.5*Sqrt[par_ax^2+par_ay^2+par_az^2]; EndIf If (flag_shape==CYL) DefineConstant[ cyl_rx = {300 , Name StrCat[pp0 , "1cylinder X-radius [nm]"], Highlight Str[colorppOK] , Closed 0}, cyl_ry = {300 , Name StrCat[pp0 , "2cylinder Y-radius [nm]"], Highlight Str[colorppOK] , Closed 0}, cyl_h = {300 , Name StrCat[pp0 , "3cylinder height [nm]"] , Highlight Str[colorppOK] , Closed 0}]; // FIXME gmsh Max? If (cyl_rx>cyl_ry) rbb_tmp=cyl_rx; Else rbb_tmp=cyl_ry; EndIf rbb = 0.5*Sqrt[rbb_tmp^2+cyl_h^2]; EndIf If (flag_shape==CONE) DefineConstant[ cone_rx = {300 , Name StrCat[pp0 , "1cone basis X-radius [nm]"], Highlight Str[colorppOK] , Closed 0}, cone_ry = {300 , Name StrCat[pp0 , "1cone basis Y-radius [nm]"], Highlight Str[colorppOK] , Closed 0}, cone_h = {300 , Name StrCat[pp0 , "2cone height [nm]"] , Highlight Str[colorppOK] , Closed 0}]; // FIXME gmsh Max? If (cone_rx>cone_ry) rbb_tmp=cone_rx; Else rbb_tmp=cone_ry; EndIf If (2.0*cone_h/3.0>Sqrt[rbb_tmp^2+cone_h^2/9.0]) rbb=2.0*cone_h/3.0; Else rbb=Sqrt[rbb_tmp^2+cone_h^2/9.0]; EndIf EndIf If (flag_shape==TOR) DefineConstant[ tor_r1 = { 300 , Name StrCat[pp0 , "1torus radius 1 [nm]"], Highlight Str[colorppOK] , Closed 0}, tor_r2x = { 100 , Name StrCat[pp0 , "2torus radius 2x [nm]"], Highlight Str[colorppOK] , Closed 0}, tor_r2z = { 50 , Name StrCat[pp0 , "3torus radius 2z [nm]"], Highlight Str[colorppOK] , Closed 0}, tor_angle = { 340 , Name StrCat[pp0 , "4torus angle [deg]"] , Highlight Str[colorppOK] , Closed 0, Min 5, Max 355}]; rbb = tor_r1+tor_r2x; EndIf DefineConstant[ rot_theta = {0 , Name StrCat[pp0 , "5rotate scatterer (polar) [deg]"] , Highlight Str[colorppOK] , Closed 0, Min 0, Max 180}, rot_phi = {0 , Name StrCat[pp0 , "6rotate scatterer (azimut) [deg]"], Highlight Str[colorppOK] , Closed 0, Min 0, Max 360}]; DefineConstant[ flag_study = { RES_TMAT , Name StrCat[pp1, "0Study type"], Choices {RES_PW="Plane Wave Response", RES_TMAT="T-Matrix", RES_GREEN="Green's Tensor", RES_QNM="Quasi-Normal Modes"},Closed 0}]; DefineConstant[ epsr_In_re = { 9., Name StrCat[pp2 , "0scatterer permittivity (real) []"] , Highlight Str[colorppOK] , Closed 0}, epsr_In_im = { 0., Name StrCat[pp2 , "1scatterer permittivity (imag) []"] , Highlight Str[colorppOK] , Closed 0}, epsr_Out_re = { 1., Name StrCat[pp2 , "2background permittivity (real) []"], Highlight Str[colorppOK] , Closed 0}, epsr_Out_im = { 0., Name StrCat[pp2 , "3background permittivity (imag) []"], Highlight Str[colorppOK] , Closed 0} ]; If (flag_study!=RES_QNM) DefineConstant[ lambda0 = {587.6 , Name StrCat[pp2 , "4wavelength [nm]"] , Highlight Str[colorppOK] , Closed 0,GmshOption "Reset", Autocheck 0}]; Else DefineConstant[ lambda0 = {1000 , Name StrCat[pp2 , "4wavelength target [nm]"] , Highlight Str[colorppOK] , Closed 0,GmshOption "Reset", Autocheck 0}, neig = {30 , Name StrCat[pp2 , "5number of eigenvalues []"] , Highlight Str[colorppOK] , Closed 0,GmshOption "Reset", Autocheck 0} ]; EndIf lambda_bg = lambda0/Sqrt[epsr_Out_re]; If (flag_study==RES_PW) DefineConstant[ theta0 = {0 , Name StrCat[pp2 , "5plane wave theta [deg]"], Highlight Str[colorppOK] , Closed 0, Min 0, Max 180}, phi0 = {0 , Name StrCat[pp2 , "6plane wave phi [deg]"] , Highlight Str[colorppOK] , Closed 0, Min 0, Max 360}, psi0 = {0 , Name StrCat[pp2 , "7plane wave psi [deg]"] , Highlight Str[colorppOK] , Closed 0, Min 0, Max 180}]; theta0 = theta0 *deg2rad; phi0 = phi0 * deg2rad; psi0 = psi0 * deg2rad; EndIf If (flag_study==RES_GREEN) DefineConstant[ x_p = {0 , Name StrCat[pp2 , "5Green X-point [nm]"] , Highlight Str[colorppOK] , Closed 0}, y_p = {0 , Name StrCat[pp2 , "6Green Y-point [nm]"] , Highlight Str[colorppOK] , Closed 0}, z_p = {-rbb*1.1 , Name StrCat[pp2 , "7Green Z-point [nm]"] , Highlight Str[colorppOK] , Closed 0}]; x_p=x_p*nm; y_p=y_p*nm; z_p=z_p*nm; EndIf DefineConstant[ n_max = {1 , Name StrCat[pp2 , "8n_max integer"], Highlight Str[colorppOK] , Closed 0, Min 0, Max 5}, siwt = {0 , Name StrCat[pp2 , "9Time sign e^(+|-iwt)"], Choices {0="e^(-iwt)",2="e^(+iwt)"} , Closed 0} ]; DefineConstant[ flag_cartpml = {0 , Name StrCat[pp3 , "0PML type"] , Choices {0="spherical",1="cartesian"}, Closed 0}, pml_size = {lambda_bg/1.5, Name StrCat[pp3 , "1PML thickness [nm]"] , Highlight Str[colorppWA] , Closed 0, Min (lambda_bg/10), Max (3*lambda_bg)}, paramaille = {4. , Name StrCat[pp3 , "2mesh size"], Highlight Str[colorppWA] , Closed 0}, refine_scat = {2. , Name StrCat[pp3 , "3scatterer mesh refinement"], Highlight Str[colorppWA] , Closed 0} is_FEM_o2 = {1 , Name StrCat[pp3 , "4Interpolation order "] , Choices {0="order 1",1="order 2"}, Closed 0} ]; DefineConstant[ space2pml = {lambda_bg/10.*4 , Name StrCat[pp4 , "0space around scatterer [nm]"] , Highlight Str[colorppNO] , Closed 1,Min (lambda_bg/10.), Max (3*lambda_bg)}, dist_rcut = {lambda_bg/10. , Name StrCat[pp4 , "1min dist from object & PML"] , Highlight Str[colorppNO] , Closed 1}, nb_cuts = {3 , Name StrCat[pp4 , "2number of cuts [integer]"] , Highlight Str[colorppNO] , Closed 1}, npts_theta = {50 , Name StrCat[pp4 , "3polar sampling [integer]"], Highlight Str[colorppNO] , Closed 0,Min 50, Max 300}, npts_phi = {100 , Name StrCat[pp4 , "4azimuthal sampling [integer]"], Highlight Str[colorppNO] , Closed 0,Min 100, Max 600} ]; DefineConstant[ flag_plotcuts = {0, Choices{0,1}, Name StrCat[pp5, "Plot radial cuts?"]}, flag_FF = {1, Choices{0,1}, Name StrCat[pp5, "Plot far field?"]} ]; // FIXME conditional for normalization If (flag_shape==ELL) ell_rx = ell_rx*nm; ell_ry = ell_ry*nm; ell_rz = ell_rz*nm; EndIf If (flag_shape==PARALL) par_ax = par_ax*nm; par_ay = par_ay*nm; par_az = par_az*nm; EndIf If (flag_shape==CYL) cyl_rx = cyl_rx*nm; cyl_ry = cyl_ry*nm; cyl_h = cyl_h *nm; EndIf If (flag_shape==CONE) cone_rx = cone_rx*nm; cone_ry = cone_ry*nm; cone_h = cone_h*nm; EndIf If (flag_shape==TOR) tor_r1 = tor_r1*nm; tor_r2x = tor_r2x*nm; tor_r2z = tor_r2z*nm; EndIf lambda0 = lambda0*nm; lambda_bg = lambda_bg*nm; pml_size = pml_size*nm; dist_rcut = dist_rcut*nm; space2pml = space2pml*nm; rbb = rbb*nm; r_pml_in = space2pml+rbb; r_pml_out = space2pml+rbb+pml_size; r_sph_min = rbb+dist_rcut; r_sph_max = space2pml+rbb-dist_rcut; sph_scan = 0.00001; npts_plot_theta = 25; npts_plot_phi = 50; p_max = n_max*n_max+2*n_max; siwt=siwt-1;