208 lines
4.3 KiB
Plaintext
208 lines
4.3 KiB
Plaintext
## @ cord = [x,y,z] denotes a rectangle
|
|
## @ cord_span = [xs,ys,zs] denotes a rectangle
|
|
|
|
function mx_simu_area(name,coord,span,mesh_accuracy,meshs,boundary,time) {
|
|
|
|
if((name=='FDTD')){
|
|
addfdtd;
|
|
set('simulation time',time*1e-15);
|
|
|
|
FDE_on = 0;
|
|
}
|
|
|
|
else if ((name=='FDE_x')){
|
|
FDE_on = 1;
|
|
addfde;
|
|
set('solver type','2D X normal');
|
|
span(1) = 0;
|
|
}
|
|
|
|
else if (name=='FDE_y'){
|
|
addfde;
|
|
FDE_on = 1;
|
|
set('solver type','2D Y normal');
|
|
span(2) = 0;
|
|
}
|
|
|
|
else if (name=='FDE_z'){
|
|
addfde;
|
|
FDE_on = 1;
|
|
set('solver type','2D Z normal');
|
|
span(3) = 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
x = coord(1);
|
|
y = coord(2);
|
|
z = coord(3);
|
|
|
|
set('x',x);
|
|
set('y',y);
|
|
set('z',z);
|
|
|
|
xs = span(1);
|
|
ys = span(2);
|
|
zs = span(3);
|
|
|
|
if (xs>0) {
|
|
set('x span',xs);
|
|
set('x min bc',boundary);
|
|
set('x max bc',boundary);
|
|
if (FDE_on) {
|
|
set('define x mesh by','maximum mesh step');
|
|
set('dx',meshs(1));
|
|
}
|
|
}
|
|
|
|
if (ys>0) {
|
|
set('y span',ys);
|
|
set('y min bc',boundary);
|
|
set('y max bc',boundary);
|
|
if (FDE_on) {
|
|
set('define y mesh by','maximum mesh step');
|
|
set('dz',meshs(2));
|
|
}
|
|
}
|
|
|
|
if (zs>0) {
|
|
set('z span',zs);
|
|
set('z min bc',boundary);
|
|
set('z max bc',boundary);
|
|
if (FDE_on) {
|
|
set('define z mesh by','maximum mesh step');
|
|
set('dz',meshs(3));
|
|
}
|
|
}
|
|
if((name=='FDTD')){
|
|
if (mesh_accuracy==0){
|
|
addmesh;
|
|
set('dx',meshs(1));
|
|
set('dy',meshs(2));
|
|
set('dz',meshs(3));
|
|
set('x',x);
|
|
set('y',y);
|
|
set('z',z);
|
|
|
|
xs = span(1);
|
|
ys = span(2);
|
|
zs = span(3);
|
|
|
|
set('x span',xs);
|
|
set('y span',ys);
|
|
set('z span',zs);
|
|
|
|
}
|
|
else {
|
|
set('mesh accuracy',mesh_accuracy);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
##
|
|
function mx_mode_source(name,coord,span,s_dir,theta,bend,mode_idx,wl){
|
|
addmode;
|
|
set('name',name);
|
|
set('injection axis',abs(s_dir));
|
|
set('direction',1.5-sign(s_dir)/2);
|
|
|
|
x = coord(1);
|
|
y = coord(2);
|
|
z = coord(3);
|
|
|
|
set('x',x);
|
|
set('y',y);
|
|
set('z',z);
|
|
|
|
xs = span(1)*((abs(s_dir))~=1);
|
|
ys = span(2)*((abs(s_dir))~=2);
|
|
zs = span(3)*((abs(s_dir))~=3);
|
|
|
|
if (xs>0) {
|
|
set('x span',xs);
|
|
}
|
|
|
|
if (ys>0) {
|
|
set('y span',ys);
|
|
}
|
|
|
|
if (zs>0) {
|
|
set('z span',zs);
|
|
}
|
|
|
|
if (bend(1)>0){
|
|
set('bent waveguide',1);
|
|
set('bend orientation',bend(2));
|
|
set('bend radius',bend(1));
|
|
|
|
}
|
|
else{
|
|
set('bent waveguide',0);
|
|
}
|
|
|
|
set('theta',theta);
|
|
set('theta',theta);
|
|
set('mode selection','user select');
|
|
set('wavelength start',wl(1));
|
|
set('wavelength stop',wl(2));
|
|
|
|
updatesourcemode(mode_idx);
|
|
|
|
|
|
}
|
|
|
|
##
|
|
function mx_mode_expansion(name,coord,span,m_dir,theta,bend,mode_idx,wl,monitor_name){
|
|
addmodeexpansion;
|
|
set('name',name);
|
|
set('monitor type',abs(m_dir));
|
|
|
|
x = coord(1);
|
|
y = coord(2);
|
|
z = coord(3);
|
|
|
|
set('x',x);
|
|
set('y',y);
|
|
set('z',z);
|
|
|
|
xs = span(1)*((abs(m_dir))~=1);
|
|
ys = span(2)*((abs(m_dir))~=2);
|
|
zs = span(3)*((abs(m_dir))~=3);
|
|
|
|
if (xs>0) {
|
|
set('x span',xs);
|
|
}
|
|
|
|
if (ys>0) {
|
|
set('y span',ys);
|
|
}
|
|
|
|
if (zs>0) {
|
|
set('z span',zs);
|
|
}
|
|
|
|
if (bend(1)>0){
|
|
set('bent waveguide',1);
|
|
set('bend orientation',bend(2));
|
|
set('bend radius',bend(1));
|
|
|
|
}
|
|
else{
|
|
set('bent waveguide',0);
|
|
}
|
|
set('theta',theta);
|
|
set('mode selection','user select');
|
|
|
|
updatemodes(mode_idx);
|
|
|
|
setexpansion('input',monitor_name);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|