The Ansys Innovation Space website recently experienced a database corruption issue. While service has been restored there appears to have been some data loss from November 13. We are still investigating and apologize for any issues our users may have as a result.

Ansys Learning Forum Forums Discuss Simulation Photonics Arbitrary sign for eigen mode Reply To: Arbitrary sign for eigen mode

amitrotem2
Subscriber

 

 

 

 

Here is an example with s-parameter sweep in FDTD.

 

 


##
clc;
cleardcard;
closeall;
newproject;
## design
x_shift = 100e-9; # length of blocks
y_shift = 1e-9; # offset for the first and last blocks
K = 3;
for (k=0:K){
    addrect; set("name", "rect"+num2str(k));
    set("x",k*x_shift);
}
selectpartial("rect");
set("x span",x_shift);
set("y",0);set("y span",1e-6);
set("z",0);set("z span",0.2e-6);
set("material", "Si (Silicon) - Palik");
### off set the first and last blocks
setnamed("rect0", "y", -y_shift);
setnamed("rect"+num2str(K), "y",  y_shift);
## solver
addfdtd;
set("x min",-x_shift/2);set("x max",(K+0.5)*x_shift);
set("y",0);set("y span",K*y_shift+2e-6);
set("z",0);set("z span",1e-6);
set("mesh accuracy", 4);
setresource("FDTD", "GPU", true);
setnamed("FDTD", "express mode", true);
## ports in the middle of each block
for (k=0:K){
    addport();
    set("x", k*x_shift);
  if (1.5 < k){set("direction", "Backward");}
}
selectpartial("FDTD::ports::port");
set("auto update", false);
set("frequency dependent profile", false);
set("mode selection", "user select");
set("selected mode numbers", 2); # 2nd mode is antisymmetric and will show the issue
clearportmodedata;
seteigensolver("correct backward propagating modes", false);
seteigensolver("correct backward propagating modes when pml is present", false);

wavelength = 1560e-9;
setglobalsource("set frequency", true);
setglobalsource("center wavelength", wavelength);
setglobalsource("wavelength span", 0);
setglobalmonitor("wavelength center", wavelength);
setglobalmonitor("frequency points", 1);
setglobalmonitor("wavelength span", 0);
setglobalmonitor("use source limits", 1);
## 
save("sign_arb.fsp");

## s-parameter sweep
addsweep(3);
runsweep;
sweepdata = getsweepresult("s-parameter sweep","S matrix");
Smat = pinch(sweepdata.S); # scattering matrix

### see the issue when propagating from port 3 to 4 vs from 
?conj(Smat(3,1))*Smat(4,1); # excite port 1, and look at the propagating from port 3 to 4
?conj(Smat(3,2))*Smat(4,2); # excite port 2, and look at the propagating from port 3 to 4
?conj(Smat(2,4))*Smat(1,4); # excite port 4, and look at the propagating from port 2 to 1
?conj(Smat(2,3))*Smat(1,3); # excite port 3, and look at the propagating from port 2 to 1

##
neff_list = matrix(K+1);
S0 = matrix(K+1,K+1);
for (k=1:K+1){
    NEFF = getresult("FDTD::ports::port "+num2str(k), "neff");
    neff_list(k) = NEFF.neff;
    mode1 = getresult("FDTD::ports::port "+num2str(k), "mode profiles");
    for (j=1:K+1){
        mode2 = getresult("FDTD::ports::port "+num2str(j), "mode profiles");
        cr12 = pinch(cross(mode1.E2, mode2.H2));
        cr11 = pinch(cross(mode1.E2, mode1.H2));
        cr22 = pinch(cross(mode2.E2, mode2.H2));
        cr12 = integrate(pinch(cr12(:,:,1)), [1,2], pinch(mode1.y), pinch(mode1.z));
        cr11 = integrate(pinch(cr11(:,:,1)), [1,2], pinch(mode1.y), pinch(mode1.z));
        cr22 = integrate(pinch(cr22(:,:,1)), [1,2], pinch(mode1.y), pinch(mode1.z));
        S0(j,k) = cr12/sqrt(cr11*cr22);
    }
}
## modes have minus signs
image(real(S0));