# Example: How to track a specific mode profile for variable structure dimensions

#1

Objective:
We have a silicon on insulator waveguide with ridge width of 500nm. We are interested to follow a specific mode profile found @500nm ridge width as we slowly sweep the width from 500nm to 1um.

The challenge is that the effective index and the mode number in the list of found modes will likely change as we change the structure dimensions. Therefore, to complete this objective, we will use mode overlap analysis to find out which mode from the current structure width has the best overlap with the mode from previous run.

If we keep the sweep step small enough, it should be fairly reliable strategy to follow the mode of our interest.

You can try this yourself using this simulation file and script:
Track_mode_profile_variable_structure_dimensions.lsf (1.4 KB)
Simple SOI waveguide.lms (277.6 KB)

In the example, we will follow #2 mode in the list:

Visual check of the mode profile development between 0.5um and 1um with 6 steps:

The recorded neff evolution as function of ridge width:

The script file content for quick review:

clear;

#dimension sweep
minWidth=0.5e-6;
maxWidth=1e-6;
stepNum=6;
dimSweep=linspace(minWidth,maxWidth,stepNum);

#mode number to start with in the first rounds at minimum width
firstMode=2;

#Do you want to visually check the selected modes after the sweep 1=yes 0=no
check=1;

#Initialize neff vesctor where all neff indeces from the sweep are going to be saved
neff=linspace(1,stepNum,stepNum);

for (i=1:stepNum) {

switchtolayout;
select("structure group");
set("ridgeWidth",dimSweep(i));

findmodes;

if (i==1) {
#get the e field profile of the original mode
copydcard("mode"+num2str(firstMode),"testMode");
neff(i)=getdata("mode"+num2str(firstMode),"neff");

if (check==1) {
E=getresult("FDE::data::mode"+num2str(firstMode),"E");
visualize(E);
}

} else {

#find mode with best overlap and replace theprevious dcard mode with it
bestMode=bestoverlap("testMode");
neff(i)=getdata(bestMode,"neff");
cleardcard("testMode");
copydcard(bestMode,"testMode");

if (check==1) {
E=getresult(bestMode,"E");
visualize(E);
}

} #if statement end

} #for loop end

#Purge deck
cleardcard("testMode");

#Plot the found indices (complex numbers)
plot(dimSweep*1e6,neff,"Ridge Width[um]","Effective Index");