We’re putting the final touches on our new badges platform. Badge issuance remains temporarily paused, but all completions are being recorded and will be fulfilled once the platform is live. Thank you for your patience.

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

Guilin Sun
Ansys Employee

Here is the result I got directly from your script (except line 34 is modified):
?abs(Smat);
result: 
0.000439021  0.0166555  0.017211  0.000397579  
0.0028741  0.00273113  0.017198  0.000322681  
0.00300699  0.00305221  0.00322448  0.000252065  
0.000378088  0.00033553  0.000237014  0.000287072  

After the straight waveguide is added, I use the following script:

## 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);

}

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));

I got the result:

Please use ONE staright waveguide for testing.

 

Â