Same codes, different result? Edge coupler design with MODE FDE

cqtaveecqtavee Member Posts: 5

Hi All

I'm simulating an edge coupler similar as Edge coupler – Lumerical Support

I download the package and find the codes of building the structures in the file Edge_Coupler_No_Substrate.lms

I copied down the scripts and added the same SMF-28 fibre by codes. But I cannot get the same mode profile as the example project. I'm very sure I'm using the same parameters like the example. The first one is my result, and the second is the mode profile from the example file.

My codes are attached. I was thinking the problem is from the mesh setting. But now it looks like meshes are correct.

Very appreciate it if you could give some idea about finding where the problem comes from. I did not do much modification but just add fibre and FDEsimulation area.

Tagged:

Best Answer

  • gsungsun Posts: 751Ansys Employee
    Accepted Answer

    Hi, I run your code and can duplicate your result, except the multiplier issue mentioned somewhere else.

    FDE solver somehow interpolates the refractive index of the fiber and the taper, this is why we got riedge waveguide profile + fiber. If you only want to analyze mode properties using FDE, a simple way is to modify the x position of FDE:

    for fiber, set x=-1um; for taper set x=1um. With those modifications I got two results for the two waveguides:fiber and the taper.


Answers

  • gsungsun Posts: 751Ansys Employee

    I am not sure what script you copied for what purpose. If you just want to investigate the modes for SMF fiber, simply enable FDE, disable the taper, and you will be able to get the mode as follows:

    Since we are not allowed to download customer files, please copy and paste here and explain what do you expect the script file to accomplish.


    The result you gave shows it has circular and ridge waveguide together. Please check the geometry carefully.

  • cqtaveecqtavee Posts: 12Member

    Hi! Below are my codes.




    deleteall;#L1, L2, L_buffer refer to the different portions of the Si waveguide and are the lengths of the untapered input section, the tapered section, and the untapered end section, respectively

    #L_lower_nitride_L_upper_nitride are the lengths of the 2 silicon nitride layers

    #W is the width of ridge waveguide

    #Wwindow is the width of the entire slab ? should be larger than simulation region

    #d is the etch depth

    #fine_dx is the finer mesh size (used in key regions). It controls dy and dz around the silicon waveguide, and dz in the nitride layers. It should never be larger than the thickness of the nitride layers or the conformal meshing will not work.

    #height is the height of the silicon waveguide

    #nSi, nSi3N4, nSiO2 are the refractive indices used for Si, Si3N4 and SiO2 (note that these could be changed to use a model from the database, but it does speed up the calculation to use a lossless dielectric and these materials have negligible loss at 1550nm)

    #tBOX is the thickness of the bottom oxide

    #tSi3N4 is the thickness of the silicon nitride layers

    #tSiO2_1,tSiO2_2,tSiO2_3, tSiO2_4 are the thicknesses of the SiO2 layers from the top of the BOX to the bottom of the first nitride layer, between the first and second nitride layers, between the second and third nitride layers and from the upper nitride layer to the top of the waveguide.

    #tw1 and tw2 are the widths of the input and output silicon waveguides, respectively


    deleteall;


    #input parameters

    L1=50e-6;

    nSiO2=1.444;

    tSi3N4=0.02e-6;

    tSiO2_1=2.72e-6;

    tSiO2_2=2.72e-6;

    tSiO2_3=2.72e-6;

    tw1=0.15e-6;

    tw3=0.27e-6;

    L2=405e-6;

    L_buffer=5e-6;

    L_lower_nitride=400e-6;

    L_upper_nitride=50e-6;

    W=14.15e-6;

    Wwindow=50e-6;

    d=6.5e-6;

    height=0.22e-6;

    nSi=3.476;

    nSi3N4=2.016;

    tBOX=15e-6;

    fine_dx=0.02e-6;

    include_input_buffer=0;

    L_middle_nitride=200e-6;

    tSiO2_4=2.72e-6;




    L_buffer_in = L_buffer;

    if(!include_input_buffer) {

    L_buffer_in = 0;

    }




    n_fiber_cladding=1.434816;

    n_fiber_core=1.44;

    radius_fiber_core=4.1e-6;

    #Add fiber cladding

    addcircle;set('name','fiber cladding');

    set('x',-50e-6);set('z span',100e-6);

    set('radius',20e-6);

    set('material','<Object defined dielectric>');

    set('index',n_fiber_cladding);

    set('second axis','y');set('rotation 2',90);

    set('override mesh order from material database',1);set('mesh order',3);


    #Add fiber core

    addcircle;set('name','fiber core');

    set('x',-50e-6);set('z span',100e-6);

    set('radius',radius_fiber_core);

    set('material','<Object defined dielectric>');

    set('index',n_fiber_core);

    set('second axis','y');set('rotation 2',90);


    select("fiber cladding");

    addtogroup("SMF_fiber");

    select("fiber core");

    addtogroup("SMF_fiber");


    select("SMF_fiber");

    set('z',2.85e-6);


    addrect;

    set("x min",-L_buffer_in);

    set("x max",L1+L2+L_buffer);

    set("y",0);

    set("y span",Wwindow);

    set("z min",-2*tBOX);

    set("z max",-tBOX);

    set("index",nSi);

    set("name","Si substrate");

    set("alpha",0.2);

    set("override mesh order from material database",true);

    set("mesh order",3);


    copy;

    set("name","BOX");

    set("index",nSiO2);

    set("z min",-tBOX);

    set("z max",0);


    copy;

    set("z min",0);

    set("z max",tSiO2_1+tSiO2_2+tSiO2_3+tSiO2_4+3*tSi3N4-d);

    set("index",nSiO2);

    set("name","oxide1");

    set("alpha",0.2);

    set("override mesh order from material database",true);

    set("mesh order",3);


    copy;

    set("name","oxide2");

    set("z min",tSiO2_1+tSiO2_2+tSiO2_3+tSiO2_4+3*tSi3N4-d);

    set("z max",tSiO2_1+tSiO2_2+tSiO2_3+tSiO2_4+3*tSi3N4);

    set("y span",W);

    set("alpha",0.5);



    addrect;

    set("name","lower nitride");

    set("x min",0);

    set("x max",L_lower_nitride);

    set("y",0);

    set("y span",Wwindow);

    set("z min",tSiO2_1);

    set("z max",tSiO2_1+tSi3N4);

    Lstr = num2str(L_lower_nitride*1e6);

    Lstr_half = num2str(L_lower_nitride*1e6/2);

    ?index_string = num2str(nSi3N4)+"-"+num2str(nSi3N4-nSiO2)+"*(x+"+Lstr_half+")/"+Lstr;

    set("index",index_string);

    set("alpha",0.3);

    if(include_input_buffer) {

    copy;

    set("name","lower nitride input");

    set("x min",-L_buffer_in);

    set("x max",0);

    set("index",nSi3N4);

    }


    copy;

    set("name","middle nitride");

    set("x min",0);

    set("x max",L_middle_nitride);

    set("y",0);

    set("y span",W);

    set("z min",tSiO2_1+tSiO2_2+tSi3N4);

    set("z max",tSiO2_1+tSiO2_2+2*tSi3N4);

    Lstr = num2str(L_middle_nitride*1e6);

    Lstr_half = num2str(L_middle_nitride*1e6/2);

    ?index_string = num2str(nSi3N4)+"-"+num2str(nSi3N4-nSiO2)+"*(x+"+Lstr_half+")/"+Lstr;

    set("index",index_string);

    if(include_input_buffer) {

    copy;

    set("name","middle nitride input");

    set("x min",-L_buffer_in);

    set("x max",0);

    set("index",nSi3N4);

    }


    copy;

    set("name","upper nitride");

    set("x min",0);

    set("x max",L_upper_nitride);

    set("y",0);

    set("y span",W);

    set("z min",tSiO2_1+tSiO2_2+tSiO2_3+2*tSi3N4);

    set("z max",tSiO2_1+tSiO2_2+tSiO2_3+3*tSi3N4);

    Lstr = num2str(L_upper_nitride*1e6);

    Lstr_half = num2str(L_upper_nitride*1e6/2);

    ?index_string = num2str(nSi3N4)+"-"+num2str(nSi3N4-nSiO2)+"*(x+"+Lstr_half+")/"+Lstr;

    set("index",index_string);

    if(include_input_buffer) {

    copy;

    set("name","upper nitride input");

    set("x min",-L_buffer_in);

    set("x max",0);

    set("index",nSi3N4);

    }


    addrect;

    set("name","Si input");

    set("x min",-L_buffer_in);

    set("x max",L1);

    set("y",0);

    set("y span",tw1);

    set("z min",0);

    set("z max",height);

    set("index",nSi);


    copy;

    set("name","Si output");

    set("x min",L1+L2);

    set("x max",L1+L2+L_buffer);

    set("y span",tw3);


    V = [0,-tw1/2;

    0,tw1/2;

    L2,tw3/2;

    L2,-tw3/2];

    addpoly;

    set("name","Si taper");

    set("index",nSi);

    set("z min",0);

    set("z max",height);

    set("x",L1);

    set("y",0);

    set("vertices",V);


    addmesh;

    set("x min",-L_buffer_in);

    set("x max",L1+L2+L_buffer);

    set("y",0);

    set("y span",Wwindow);

    set("z min",-2*tBOX);

    set("z max",-tBOX);

    set("override x mesh",false);

    set("override y mesh",false);

    set("override z mesh",true);

    set("set mesh multiplier",true);

    set("z mesh multiplier",4);

    set("name","Si substrate override");


    addmesh;

    set("name","mesh_Si");

    set("x min",-L_buffer_in);

    set("x max",L1+L2+L_buffer);

    set("y",0);

    set("y span",max([tw1,tw3]));

    set("z min",0);

    set("z max",height);

    set("override x mesh",false);

    set("override y mesh",true);

    set("override z mesh",true);

    set("dy",fine_dx);

    set("dz",fine_dx);



    addmesh;

    set("name","mesh lower nitride");

    set("x min",-L_buffer_in);

    set("x max",L_lower_nitride);

    set("y",0);

    set("y span",Wwindow);

    set("z min",tSiO2_1);

    set("z max",tSiO2_1+tSi3N4);

    set("override x mesh",false);

    set("override y mesh",false);

    set("override z mesh",true);

    set("dz",fine_dx);



    copy;

    set("name","mesh middle nitride");

    set("x max",L_middle_nitride);

    set("y span",W);

    set("z min",tSiO2_1+tSiO2_2+tSi3N4);

    set("z max",tSiO2_1+tSiO2_2+2*tSi3N4);


    copy;

    set("name","mesh upper nitride");

    set("x max",L_upper_nitride);

    set("y span",W);

    set("z min",tSiO2_1+tSiO2_2+tSiO2_3+2*tSi3N4);

    set("z max",tSiO2_1+tSiO2_2+tSiO2_3+3*tSi3N4);



    addfde;

    set("solver type","2D X normal");

    set('z min',-3.2e-6);set('z max',12e-6);

    set("y",0);

    set("y span",30e-6);

    set("x", 0e-6);

    set('mesh cells z', 100);set('mesh cells y', 100);

    set('y min bc', 'Anti-Symmetric');


    setanalysis("wavelength", 1.5e-6);

    findmodes;

  • cqtaveecqtavee Posts: 12Member

    Hi! The codes I copied are from here:

    The main body is unchanged. I just add some lines to add fiber and FDE simulation area. But the result (mode profile at x=0) of my project is very different from the downloaded one although they are using the same parameter values.

    Thank you so much!

  • cqtaveecqtavee Posts: 12Member

    Hi

    Yes, you are right, that's a good idea to view the mode profiles at different x position. BTW, I have solved the mesh multiplier issue.

    I can first add FDE and then select the mesh to set the multiplier setting.


    addmesh;set("x min",-L_buffer_in);

    set("x max",L1+L2+L_buffer);

    set("y",0);

    set("y span",Wwindow);

    set("z min",-2*tBOX);

    set("z max",-tBOX);

    set("override x mesh",false);

    set("override y mesh",false);

    set("override z mesh",true);

    set("name","Si substrate override");

    addfde;

    select("Si substrate override");

    set("set mesh multiplier",true);

    set("z mesh multiplier",4);

  • gsungsun Posts: 751Ansys Employee

    Thank you for the update! you are right that in general, we should first add the solver, then the override mesh, which can give a better guess of the default mesh size in the override region.

Sign In or Register to comment.