Photonics

Photonics

Topics related to Lumerical and more.

Trapezoidal ring

    • rahul.sanghvi
      Subscriber

      How can I create a ring that on the cross section looks like a trapezoid. I want to extend the XY plane and make a semi circle. 

       

    • Kirill
      Subscriber

      Hello Rahul,

      1. There are several options for creating complex-shaped objects. I suggest checking the FDTD product reference manual under Simulation objects > Structures for details.

      2. Based on my understanding of your geometry, the Waveguide might be useful. Also, take a look at Tips for creating waveguide bends using the path object. You can easily create something like this:

      Trapezoidal half-ring made with Waveguide Simulation Object

      3. The Planar solid is another option, though it may be less convenient in this case.

      4. Additionally, you can be creative with polygon primitives. Check out Tips for creating spiral and helix geometries and Tips for creating a 3D contour path object for inspiration.

      Best regards,
      Kirill

    • rahul.sanghvi
      Subscriber

      Thank you Kirill. I will go through the links. 

    • rahul.sanghvi
      Subscriber

      Hi Kirill, 

      Do you know how to modify the code for 90-degree bend waveguide such that it creates a waveguide of an arbitrary angle instead of 90 deg? 

      #####################################################################

      # 90 degree waveguide bend

      # This object makes a 90-degree waveguide bend with angled sidewalls.

      #

      # Input properties

      # base angle: sidewall angle of the waveguide

      # base height: height of the waveguide

      # base width: width of the waveguide base

      # radius: radius of the bend

      # start angle: start angle of the waveguide

      #

      # Tags: integrated optics waveguide bend 90 degrees ridge

      #

      # Copyright 2015 Lumerical Solutions Inc

      #####################################################################

       

      # simplify variable names by removing spaces

      base_angle = %base angle%;

      base_width = %base width%;

      base_height = %base height%;

      start_angle = %start angle%;

       

      select("arc");

      set("material",material);

      set("base angle",base_angle);

      set("base height",base_height);

      set("base width",base_width);

      set("detail",0.5);

       

      # magic number

      # The cubic Bezier curve using this magic number in the pole points approximates the semi-circile with least error

      m=0.55191502449;

       

      px = radius*[0;m;1;1];

      py = radius*[1;1;m;0];

      p = [px,py];

       

      set("poles",p);

      set("first axis",'z');

      set("rotation 1",start_angle);

    • Kirill
      Subscriber

      Hello Rahul,

      You’ll need to adjust your px and py coordinates. Check this example:

      # Parameters
      start_angle = 0.0;       # Start angle in degrees
      end_angle = 45.0;        # End angle in degrees
      radius = 10.0;           # Radius of the arc
      m = 0.55191502449;       # "Magic number" for a 90° arc approximation
      
      # Convert angles to radians
      start_angle_rad = start_angle * pi / 180;
      end_angle_rad = end_angle * pi / 180;
      
      # Calculate arc angle
      arc_angle = end_angle_rad - start_angle_rad;
      
      # Adjust the "magic number" for the specified arc angle
      m_adj = m * arc_angle / (pi / 2);
      
      # Calculate control points for Bezier curve approximation
      # Starting point (p0)
      p0_x = cos(start_angle_rad) * radius;
      p0_y = sin(start_angle_rad) * radius;
      
      # First control point (p1)
      p1_x = p0_x - sin(start_angle_rad) * m_adj * radius;
      p1_y = p0_y + cos(start_angle_rad) * m_adj * radius;
      
      # Ending point (p3)
      p3_x = cos(end_angle_rad) * radius;
      p3_y = sin(end_angle_rad) * radius;
      
      # Second control point (p2)
      p2_x = p3_x + sin(end_angle_rad) * m_adj * radius;
      p2_y = p3_y - cos(end_angle_rad) * m_adj * radius;
      
      # Create array of control points
      px = [p0_x; p1_x; p2_x; p3_x];
      py = [p0_y; p1_y; p2_y; p3_y];
      p = [px, py];
      
      # Output
      ?("Control points:");
      ?num2str(p, "%.3f");
      

      So for:

      px = [10.000; 10.000; 9.022; 7.071];
      py = [ 0.000;  2.760; 5.120; 7.071];
      

      you should get an approximation of a 45° arc.

      I also suggest reviewing the following resources:

      1. Approximation of a cubic Bézier curve by circular arcs and vice versa – This provides a solid mathematical discussion on the topic.
      2. Approximate a circle with cubic Bézier curves – This source presents a clear discussion on approximation accuracy.
      3. Bézier curves - Desmos calculator – A nice interactive tool to speed up your understanding of Bézier curves.

      I hope you find this helpful.

      Best regards,
      Kirill

    • rahul.sanghvi
      Subscriber

      Hi Kirill,

      I am working on inverse 3D grating coupler design and I wish to have trapezoidal grates instead of rectangular as provided in the lumerical example. The example uses "addring" to create the rectangular grates in XZ view, but I got many errors when I tried to convert them into a trapezoid. Do you know if there is any easy or an efficient way to do it ?

      Many thanks!
      Rahul. 

Viewing 5 reply threads
  • You must be logged in to reply to this topic.