Photonics

Photonics

Topics related to Lumerical and more.

MFD in a port

    • Fateme Salahshuri
      Subscriber

      How can I detemine the mode field diameter in a port? 
      When I use FDTD simulation and I choose a source instead of a port, I can choose the waist radius of my beam, but with a port i don't have the same option. 

      Right now,I am using EME to simulate edge coupling. Does the port take the object as a reference and choose the MFD according to that? For example in this picture, I want my fiber to have MFD of 5um, I chose the radius of 2.5 um for the core object, does the EME simulation region recognize this or I have to determine the MFD in other way?

       

      Thank you.

       

    • Dimitris Polyzos
      Ansys Employee

      Hello, 

      Normally MFD is slighlty larger than the core radius, as for a gaussian mode some light travels in the cladding as well. EME solver recognizes the MFD of the mode that travels in the core, but you can simply check it by using scripting.

      A good estimation would be to check the mode profile as a line plot, setting z=0 and check, for instance, the full width at half maximum. Some usefuld links are the following:

      https://optics.ansys.com/hc/en-us/articles/360034395354-Calculating-the-effective-mode-area-of-a-waveguide-mode

      Use the FDE solver and send to output the E field in the script worspace. Then you can use the following script to check the MFD of the mode of your choice.This script calculates and reeturns the MFD at the x and y axis.


      function getMax(E) {
          Ex = E.Ex;
          Ey = E.Ey;
          Ez = E.Ez;
          
          E2 = abs(Ex)^2 + abs(Ey)^2 + abs(Ez)^2;
          
          sizeE2 = size(E2);
          
          n = find(E2, max(E2));
          indices = matrix(length(sizeE2));
          
          for(i=1:length(sizeE2)) {
              mod_dividend = n;
              mod_divisor = sizeE2(i);
              mod_remainder = mod(mod_dividend, mod_divisor);
              if (mod_remainder == 0) {
                  mod_remainder = sizeE2(i);
              }
              indices(i) = mod_remainder;
              n = (n+(sizeE2(i)-mod_remainder))/sizeE2(i);
          }
          
          return indices;    
      }

      function getMFD(E) {
          MFD = matrix(2);
          Ex = E.Ex;
          Ey = E.Ey;
          Ez = E.Ez;
          x = E.x;
          y = E.y;
          z = E.z;
          
          if (length(x)==1) { d = "x-normal"; }
          if (length(y)==1) { d = "y-normal"; }
          if (length(z)==1) { d = "z-normal"; }
          
          if (d=="x-normal") { X = "y"; Y = "z"; }
          if (d=="y-normal") { X = "x"; Y = "z"; }
          if (d=="z-normal") { X = "x"; Y = "y"; }
          
          E2 = abs(Ex)^2 + abs(Ey)^2 + abs(Ez)^2;
          E2 = pinch(E2);

          indices = getMax(E);
          indices = indices(find(indices>1));
          if (length(indices)!=2) {
              ?"Error on dimension";
              return 0;
          }
          
          XX = E.getparameter(X);
          x0 = XX(indices(1));
          YY = E.getparameter(Y);
          y0 = YY(indices(2));
          
          E2x = pinch(E2, 2, indices(2));
          E2y = pinch(E2, 1, indices(1));
          
          nx = find(E2x>=max(E2x)/2);
          ny = find(E2y>=max(E2y)/2);
          
          MFD(1) = XX(nx(end))-XX(nx(1));
          MFD(2) = YY(ny(end))-YY(ny(1));

          return MFD;
      }

      MFD = getMFD(E);
      ?MFD*1e6;

       

Viewing 1 reply thread
  • The topic ‘MFD in a port’ is closed to new replies.