repo build
This commit is contained in:
@@ -0,0 +1,295 @@
|
||||
function FUNC_DEVICE_2X2(instPath)
|
||||
{
|
||||
inst = read(instPath);
|
||||
eval(inst);
|
||||
|
||||
jsonload(jsonPath);
|
||||
|
||||
HwaferMax = 0;
|
||||
for(idx=1;idx<=length(layers.numbers);idx=idx+1){
|
||||
|
||||
if (iscell(layers.numbers)){
|
||||
layer = num2str(layers.numbers{idx}) + ":" + num2str(layers.datatype{idx});}
|
||||
|
||||
else{
|
||||
layer = num2str(layers.numbers(idx)) + ":" + num2str(layers.datatype(idx));}
|
||||
|
||||
if (iscell(layers.heights)){
|
||||
Hwafer = layers.heights{idx}*1e-6;}
|
||||
else{
|
||||
Hwafer = layers.heights(idx)*1e-6;}
|
||||
|
||||
|
||||
gdsimport(gdspath, devName, layer,wafer.material, 0, Hwafer);
|
||||
#gdsimport(folder + devName + ".gds", devName, layer,wafer.material, 0, Hwafer);
|
||||
#set("name","device");
|
||||
|
||||
if (Hwafer>HwaferMax)
|
||||
{
|
||||
HwaferMax = Hwafer;
|
||||
}
|
||||
}
|
||||
|
||||
## output ports
|
||||
|
||||
# HwaferMax = Hwafer;
|
||||
zOffset = HwaferMax/2*1e+6;
|
||||
mx_simu_area('FDTD',[FDTD.x,FDTD.y,FDTD.z+zOffset]*1e-6,
|
||||
[FDTD.dx,FDTD.dy,FDTD.dz]*1e-6,FDTD.mesh_order,[40,40,40]*1e-6,'PML',10e+5);
|
||||
|
||||
portList = ports.names;
|
||||
|
||||
for (idx=1;idx<=length(portList);idx=idx+1)
|
||||
{
|
||||
portName = portList{idx};
|
||||
|
||||
eval("port_struct = ports."+portName+";");
|
||||
|
||||
if (port_struct.a < 0) { port_struct.a = port_struct.a + 360; }
|
||||
|
||||
if ( 45<=port_struct.a and port_struct.a<135 )
|
||||
{
|
||||
portsType = -2;
|
||||
portsSZ = [port_struct.width,0,port_struct.height]*1e-6;
|
||||
}
|
||||
else if (225<=port_struct.a and port_struct.a<315)
|
||||
{
|
||||
portsType = 2;
|
||||
portsSZ = [port_struct.width,0,port_struct.height]*1e-6;
|
||||
}
|
||||
|
||||
else if (135<=port_struct.a and port_struct.a<225)
|
||||
{
|
||||
portsType = 1;
|
||||
portsSZ = [0,port_struct.width,port_struct.height]*1e-6;
|
||||
}
|
||||
|
||||
else if (port_struct.a<45 or port_struct.a>=315)
|
||||
{
|
||||
portsType =-1;
|
||||
portsSZ = [0,port_struct.width,port_struct.height]*1e-6;
|
||||
}
|
||||
|
||||
|
||||
mx_power_monitor(portName,[port_struct.x,port_struct.y,zOffset]*1e-6,
|
||||
portsSZ,abs(portsType)) ;
|
||||
set("override global monitor settings",1);
|
||||
set("frequency points",FDTD.Trans_sample_points);
|
||||
|
||||
mx_mode_expansion(portName+'_modes',[port_struct.x,port_struct.y,zOffset]*1e-6,
|
||||
portsSZ,abs(portsType),0,
|
||||
[abs(port_struct.radius)*1e-6,
|
||||
sign(port_struct.radius)*sign(portsType)*180],1,FDTD.wl*1e-6,portName);
|
||||
|
||||
|
||||
if (iscell(modes)){modes = [modes{1}];}
|
||||
|
||||
set("selected mode numbers",modes);
|
||||
|
||||
if ( abs(port_struct.a) <= 45 or abs(port_struct.a) > 315)
|
||||
{
|
||||
set('theta',port_struct.a);
|
||||
set('phi',0);
|
||||
}
|
||||
|
||||
else if ( abs(port_struct.a) > 135 and abs(port_struct.a) <= 225)
|
||||
{
|
||||
set('theta',port_struct.a);
|
||||
set('phi',0);
|
||||
}
|
||||
|
||||
else{
|
||||
set('theta',90-port_struct.a);
|
||||
set('phi',90);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
mx_power_monitor('z1',[mont.z1.x,mont.z1.y,zOffset]*1e-6,
|
||||
[mont.z1.dx,mont.z1.dy,0]*1e-6,3) ;
|
||||
set("override global monitor settings",1);
|
||||
set("frequency points",FDTD.Field_sample_points);
|
||||
|
||||
## adding input ports
|
||||
|
||||
input_struct = ports.a1;
|
||||
if (input_struct.a < 0) { input_struct.a = input_struct.a + 360; }
|
||||
|
||||
if ( 45<=input_struct.a and input_struct.a<135 )
|
||||
{
|
||||
inputType = -2;
|
||||
portsSZ = [input_struct.width,0,input_struct.height]*1e-6;
|
||||
input_theta = 90-input_struct.a;
|
||||
input_phi = 0;
|
||||
}
|
||||
else if (225<=input_struct.a and input_struct.a<315)
|
||||
{
|
||||
inputType = 2;
|
||||
portsSZ = [input_struct.width,0,input_struct.height]*1e-6;
|
||||
input_theta = 270-input_struct.a;
|
||||
input_phi = 0;
|
||||
}
|
||||
|
||||
else if (135<=input_struct.a and input_struct.a<225)
|
||||
{
|
||||
inputType = -1;
|
||||
portsSZ = [0,input_struct.width,input_struct.height]*1e-6;
|
||||
input_theta = input_struct.a - 180;
|
||||
input_phi = 0;
|
||||
|
||||
}
|
||||
|
||||
else if (input_struct.a<45 or input_struct.a>=315)
|
||||
{
|
||||
inputType = 1;
|
||||
portsSZ = [0,input_struct.width,input_struct.height]*1e-6;
|
||||
input_theta = input_struct.a;
|
||||
input_phi = 0;
|
||||
}
|
||||
|
||||
mx_mode_source('a1_input',[input_struct.x,input_struct.y,zOffset]*1e-6,
|
||||
portsSZ,inputType,0,
|
||||
[abs(input_struct.radius)*1e-6,sign(input_struct.radius)*sign(inputType)*90],FDTD.sourceMode,FDTD.wl*1e-6);
|
||||
set("theta",input_theta);
|
||||
set("phi",input_phi);
|
||||
|
||||
## setting FDTD configurations
|
||||
|
||||
select("FDTD");
|
||||
|
||||
set("background material",clad.material);
|
||||
|
||||
if (FDTD.GPUOn == 1){
|
||||
|
||||
setnamed("FDTD", "express mode", true);
|
||||
setresource("FDTD","GPU", true);
|
||||
setresource("FDTD", 1, "GPU Device", "Auto");
|
||||
set('z min bc','PML');
|
||||
}
|
||||
else {
|
||||
setnamed("FDTD", "express mode", false);
|
||||
setresource("FDTD","GPU", false);
|
||||
|
||||
if (length(layers.numbers)==1){
|
||||
set('z min bc','symmetric');}
|
||||
else {set('z min bc','PML');}
|
||||
|
||||
}
|
||||
|
||||
save(folder+"\\"+devName+"_simu.fsp");
|
||||
#save("DEVICE_2X2.fsp");
|
||||
|
||||
}
|
||||
|
||||
function DATA_RETRIEVE_DEVICE_2X2(instPath)
|
||||
{
|
||||
|
||||
inst = read(instPath);
|
||||
eval(inst);
|
||||
jsonload(jsonPath);
|
||||
|
||||
portList = ports.names;
|
||||
|
||||
save_cmd = "";
|
||||
|
||||
for (idx=1;idx<=length(portList);idx=idx+1)
|
||||
|
||||
{
|
||||
portData = struct;
|
||||
portData.name = portList{idx};
|
||||
|
||||
portData.power = getresult(portData.name,"T");
|
||||
portData.modes = getresult(portData.name+"_modes","expansion for input");
|
||||
E = getresult(portData.name,"E");
|
||||
H = getresult(portData.name,"H");
|
||||
|
||||
x = E.x;
|
||||
y = E.y;
|
||||
z = E.z;
|
||||
|
||||
cx = floor(length(x)/2)+1;
|
||||
cy = floor(length(y)/2)+1;
|
||||
cz = floor(length(z)/2)+1;
|
||||
|
||||
## wavelength length
|
||||
sz_wl = size(E.E,4);
|
||||
|
||||
step = floor((sz_wl-1)/(FDTD.Field_sample_points-1));
|
||||
idxSect = [1:step:sz_wl+1];
|
||||
|
||||
E_save = E;
|
||||
H_save = H;
|
||||
|
||||
E_save = matrixdataset;
|
||||
E_save.addparameter("x",E.x);
|
||||
E_save.addparameter("y",E.y);
|
||||
E_save.addparameter("z",E.z);
|
||||
E_save.addparameter("lambda",E.lambda(1:step:end));
|
||||
E_save.addattribute("E",E.E(:,:,:,1:step:end,:));
|
||||
|
||||
H_save = matrixdataset;
|
||||
H_save.addparameter("x",H.x);
|
||||
H_save.addparameter("y",H.y);
|
||||
H_save.addparameter("z",H.z);
|
||||
H_save.addparameter("lambda",H.lambda(idxSect));
|
||||
H_save.addattribute("H",H.H(:,:,:,idxSect,:));
|
||||
|
||||
portData.E = E_save;
|
||||
portData.H = H_save;
|
||||
|
||||
## Center electric field of the monitor
|
||||
Ecenter = E.E(cx,cy,cz,:,:); ## (x,y,z,wl,Ex/Ex/Ez)
|
||||
Hcenter = H.H(cx,cy,cz,:,:); ## (x,y,z,wl,Ex/Ex/Ez)
|
||||
portData.Ecenter = Ecenter;
|
||||
portData.Hcenter = Hcenter;
|
||||
|
||||
eval(portData.name + " = portData;");
|
||||
save_cmd = save_cmd + portData.name + ",";
|
||||
|
||||
}
|
||||
|
||||
if (find(portList=="a1") and find(portList=="b1")){
|
||||
Ephase_11 = unwrap(angle(b1.Ecenter) - angle(a1.Ecenter));
|
||||
Hphase_11 = unwrap(angle(b1.Hcenter) - angle(a1.Hcenter));
|
||||
save_cmd = save_cmd + "Ephase_11" + "," + "Hphase_11" + ",";
|
||||
|
||||
}
|
||||
|
||||
if (find(portList=="a2") and find(portList=="b2")){
|
||||
Ephase_22 = unwrap(angle(b2.Ecenter) - angle(a2.Ecenter));
|
||||
Hphase_22 = unwrap(angle(b2.Hcenter) - angle(a2.Hcenter));
|
||||
save_cmd = save_cmd + "Ephase_22" + "," + "Hphase_22" + ",";
|
||||
}
|
||||
|
||||
if (find(portList=="a1") and find(portList=="b2")){
|
||||
Ephase_12 = unwrap(angle(b2.Ecenter) - angle(a1.Ecenter));
|
||||
Hphase_12 = unwrap(angle(b2.Hcenter) - angle(a1.Hcenter));
|
||||
save_cmd = save_cmd + "Ephase_12" + "," + "Hphase_12" + ",";
|
||||
}
|
||||
|
||||
if (find(portList=="a2") and find(portList=="b1")){
|
||||
Ephase_21 = unwrap(angle(b1.Ecenter) - angle(a2.Ecenter));
|
||||
Hphase_21 = unwrap(angle(b1.Hcenter) - angle(a2.Hcenter));
|
||||
save_cmd = save_cmd + "Ephase_21" + "," + "Hphase_21" + ",";
|
||||
}
|
||||
|
||||
z1= struct;
|
||||
z1.E = getresult("z1","E");
|
||||
z1.H = getresult("z1","H");
|
||||
Ex = getresult("z1","Ex");
|
||||
Ey = getresult("z1","Ey");
|
||||
Ez = getresult("z1","Ez");
|
||||
|
||||
savefname = devName+"_results.mat";
|
||||
|
||||
#matlabsave(savefname,b1,b2,z1);
|
||||
|
||||
eval("matlabsave(savefname,"+save_cmd+"z1);");
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user