Ring Resonators#

Intuitive Description#

A ring resonator is a waveguide loop with one or two waveguides next to it in a directional coupler configuration. Light enters the ring via directional coupling from one of the waveguides, also called an access waveguide or a bus. Single and double bus designs are the most common, corresponding to the number of coupler waveguides next to the ring. As we learned in the directional coupler section, the amount of light coupled into the ring depends on the gap between the bus and the ring waveguides, and the effective coupling length.

dir_cplr

Layout of a racetrack ring resonator in gdsfactory

Imagine a scenario where we turn on a laser input to a ring resonator. As light couples into the ring, it will go around until it arrives back at the coupling point. At the start of the 2nd round trip, the light in the ring interferes with the light coming from the bus waveguide. When the interference of the waves is constructive, the intensity of light in the ring increases for the next round trip until the round trip propagation loss is equal to input power from the coupler waveguide. When the constructive interference is perfect, we say that the ring is in resonance. Resonance significantly increases the intensity of the electric field in the ring. The wavelengths which interfere destructively in the ring instead couple back into the bus waveguide, and the intensity of the electric field is low in the ring for those wavelengths.

dir_cplr

The main uses for ring resonators are as narrow-bandpass filters and electric field intensity amplifiers (inside the ring, on resonance). However, they are very flexible and are widely used in photonics.

Mathematical Description#

Let’s build up some of ring resonators’ behavior mathematically. First, we want to find how far the light has to travel around the ring, which is the “effective circumference” of the resonator. This can be approximated by drawing a line through the resonator’s waveguide center around the ring, and finding its length. For a perfect circle resonator, this is given by

\(L = 2\pi r\).

While the light is propagating in the resonator, some of the light scatters out due to the bending of the waveguide. This is referred to as propagation loss or bend loss (since the waveguide is bent). We write it as \(A\) and calculate it using

\(A = e^{-\alpha L}\)

where \(\alpha\) is the waveguide propagation loss, commonly in units of \((cm^{-1})\).

Next, we’ll want to find how much power goes in and out of a ring resonator. To do this, we find the ratio of the electric field at both the input and the output ports. This ratio will tell you if more light is going into the ring or out of it. The two electric fields are:

\(E_{out,bus} = t\ E_{in,bus} + \kappa\ E_{in,ring}\)

\(E_{out,ring} = t^*\ E_{in,ring} - \kappa^*\ E_{in,bus}\)

Where \(|\kappa|^2\) is the power transferred to and from the ring and \(|t|^2 = 1 - |\kappa|^2\) is the power remaining (\(\kappa\) and \(t\) are also known as reflection/transmission or coupling coefficients).

Remembering that \(\beta = \frac{2 \pi n}{\lambda}\) is the propagation constant, we can then define the Ring Resonator Transfer Function as the ratio of the output and input electric fields squared. Substituting the above two formulas finally gives us the transfer function of the ring resonator.

\(T = \left|\frac{E_{out,bus}}{E_{in,bus}}\right|^2 = \left|\frac{t-e^{-\alpha L/2}e^{j \beta L}}{1-e^{-\alpha L/2}e^{j \beta L}} \right|^2\)

Resonance#

A ring is in resonance when the round trip length of the resonator accumulates an integer multiple of \(2\pi\) phase, i.e. \(\beta L = m2\pi\), which is required for the round-trip light to be in phase with the newly coupled light from the bus waveguide. Another way we can write this is,

\(m \frac{\lambda}{n_{\text{eff}( \lambda )}} = 2\pi r\)

\(m\) is the azimuthal mode number (which must be positive) of the resonator mode and \(\lambda\) is the resonant wavelength. We can then solve for the resonant wavelengths of the ring using

\(\lambda_m = \frac{2\pi\ r\ n_{\text{eff}( \lambda )}}{m}\)

Saturation#

Resonator saturation happens when the input light from the bus waveguide is lost over one round trip due to propagation loss, i.e.

\(|t| = e^{\frac{-\alpha L}{2}}\)

which leads to

\(|t|^2 = e^{-\alpha L}\).

Note that \(\alpha\) depends on the intensity of the electric field inside the ring, so if the intensity in the resonator increases, \(\alpha\) also increases, which brings it closer to saturation. Saturation state is also called the steady-state operation of a ring resonator which is established after the input light has made many round trips around the resonator. Note that non-resonant wavelengths can also be in saturation, they will just have much smaller intensity at saturation than resonant wavelengths.

Critical Coupling#

Critical coupling occurs when all of the light from the bus waveguide is coupled into the ring. For this to happen, a few conditions must be met:

  • The wavelength of light must be resonant in the ring.

  • The power loss coefficient over a round trip in the resonator must be equal to the power transmission constant in the directional coupler section.

A critically coupled resonator is also in saturation. Intuitively explained, the phase of the light incoming from the ring is just right to completely destructively interfere with the light in the input bus waveguide, causing all the light to couple into the resonator.

Under these conditions, \(|t| = e^{-\alpha L/2}\) and \(e^{j \beta L} = 0\), so when we substitute into the transfer function above we get

\(T = \left|\frac{E_{out,bus}}{E_{in,bus}}\right|^2 = 0\).

Critical coupling is useful because it ensures that (almost) all the power at resonant wavelengths is filtered out from the bus waveguide.

FSR- Free Spectral Range#

The Free Spectral Range (FSR) of a resonator is the distance between resonant wavelengths, i.e. the peak-to-peak distance on a spectral response plot for a ring resonator.

\(FSR = \frac{\lambda ^2}{n_{\text{eff}}(\lambda)L}\)

Bandwidth and Quality Factor#

In photonics, the bandwidth of a resonant peak is defined as the Full Width at Half Maximum (FWHM) and can be calculated numerically from spectral response data of a resonator.

An analogous quantity to describe resonance bandwidth/sharpness is Quality Factor (or Q-factor), defined as

\(Q = \frac{\lambda}{\Delta\lambda} = \frac{f}{\Delta f}\)

where \(\Delta\) represents FWHM in either frequency or lambda. A low quality factor indicates more loss in the resonator. A higher Q means less loss and a sharper peak. Q factors are more commonly used than FWHM when comparing resonators because it is a unitless quantity that doesn’t scale with the operating wavelength of the resonator (NOTE: Q factors DO change with respect to wavelength due to dispersion, but it includes wavelength scaling: e.g. a FWHM of 10nm at 1500nm gives a Q of 150, while 10nm at 2000nm gives a Q of 200).

Fields in a Ring Resonator#

The following Meep script sets up a single bus ring resonator and runs a simulation that computes the electric field and creates a gif showing how it changes in the ring. Find a combination of the radius and wavelength that will lead to resonance. Also, feel free to change the coupling gap.

import meep as mp
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import Video

# Create a ring resonator with a radius of 10um

# Define materials
Si = mp.Medium(index=3.45)
SiO2 = mp.Medium(index=1.45)

# Define geometrical parameters
d_pml = 1 # thickness of the pml
d_pad = 1 # thickness of padding around geometry
wg_width = 0.5 # width of the coupling waveguide
r = 10          ## CHANGE RADIUS
r_in = r - wg_width / 2
r_out = r + wg_width / 2
wg_length = 2 * r_out + 2 * d_pad + 2 * d_pml # length of the waveguide
gap = 0.3 # gap between waveguide and ring
wvl = 1.55      ## CHANGE WAVELENGTH

pml = [mp.PML(d_pml)]
Sx = 2 * r_out + 2 * d_pad + 2 * d_pml # width of the cell
Sy = 2 * r_out + 4 * d_pad + 2 * d_pml # length of the cell

geometry = [mp.Cylinder(radius=r_out, material=Si, center=mp.Vector3(0,d_pad*1.5)),
            mp.Cylinder(radius=r_in, material=SiO2, center=mp.Vector3(0,d_pad*1.5)),
            mp.Block(size=(wg_length,wg_width), center=mp.Vector3(0, -r_out+d_pad*1.5-gap), material=Si)]

# Create Eigenmode pulse source
fcen = 0.15
width = 0.1
fwidth = width * fcen
src=mp.GaussianSource(frequency=fcen, fwidth=fwidth)
source = [mp.EigenModeSource(src=src, eig_band=1,
        eig_kpoint = (1,0),
        size=mp.Vector3(0,1),
        center=mp.Vector3(-0.4*Sx, -r_out+d_pad*1.5-gap))
        ]

# Set up simulation
sim = mp.Simulation(
    resolution=20,
    default_material=SiO2,
    cell_size=mp.Vector3(Sx,Sy),
    geometry=geometry,
    boundary_layers=pml,
    sources=source
)

sim.plot2D()
from PIL import Image
import glob
import os
import getpass

# # Capture electric field intensity over time and output into a gif
# sim.run(mp.at_beginning(mp.output_epsilon),
#         mp.to_appended("ez", mp.at_every(2, mp.output_efield_z)),
#         until=600)

# Generate pngs from the simulation output
# This line assumes that colormaps are working, 
# you are in the same directory as the output files, 
# and that h5py is installed
# If you have a problem with h5utils, see note below
username = getpass.getuser()
os.system(f"h5topng -t 0:299 -R -Zc /home/{username}/miniconda3/envs/photonics/share/h5utils/colormaps/RdBu -A eps-000000.00.h5 -a /home/{username}/miniconda3/envs/photonics/share/h5utils/colormaps/gray ez.h5")

# Create a gif from the pngs
frames = []
imgs = glob.glob("ez.t*")
imgs.sort()
for i in imgs:
    new_frame = Image.open(i)
    frames.append(new_frame)
 
# Save into a GIF file that loops forever
frames[0].save('ez.gif', format='GIF',
               append_images=frames[1:],
               save_all=True,
               loop=0)

# Clean up workspace by deleting all generated images
for i in imgs: 
    os.remove(i)

Here is the resulting GIF:

ezgif

Simulation#

To fully simulate a ring resonator and find its resonances, it is often best to only simulate half of the ring. Otherwise, the time that it takes for the fields to decay in the resonator is too long and the computation gets out of hand (as shown above where the fields were not close to decaying despite running the simulation for 600 time steps). Below is a Meep script that sets up the geometry for a half a ring resonator. See if you can complete the script to fully simulate the ring.

import meep as mp
import matplotlib.pyplot as plt
import numpy as np

# Create a ring resonator with a radius of 10um

# Define materials
Si = mp.Medium(index=3.45)
SiO2 = mp.Medium(index=1.45)

# Define geometrical parameters
d_pml = 1 # thickness of the pml
d_pad = 1 # thickness of padding around geometry
wg_width = 0.5 # width of the coupling waveguide
r = 10          ## CHANGE RADIUS
r_in = r - wg_width / 2
r_out = r + wg_width / 2
wg_length = 2 * r_out + 2 * d_pad + 2 * d_pml # length of the waveguide
gap = 0.3 # gap between waveguide and ring
wvl = 1.55      ## CHANGE WAVELENGTH
gap = 0.3       ## CHANGE GAP

pml = [mp.PML(d_pml)]
Sx = 2 * r_out + 2 * d_pad + 2 * d_pml # width of the cell
Sy = r_out + 4 * d_pad + 2 * d_pml # length of the cell
wg_center = -Sy / 2 + r_out + d_pml + gap

geometry = [mp.Cylinder(radius=r_out, material=Si, center=mp.Vector3(0,-Sy/2 + d_pml)),
            mp.Cylinder(radius=r_in, material=SiO2, center=mp.Vector3(0,-Sy/2 + d_pml)),
            mp.Block(size=(wg_length,wg_width), material=Si, center=mp.Vector3(0, wg_center))]

# Create Eigenmode pulse source
fcen = 0.15
width = 0.1
fwidth = width * fcen
src=mp.GaussianSource(frequency=fcen, fwidth=fwidth)
source = [mp.EigenModeSource(src=src, eig_band=1,
        eig_kpoint = (1,0),
        size=mp.Vector3(0,1),
        center=mp.Vector3(-Sx/2+d_pml+0.1, wg_center))
        ]

# Set up simulation
sim = mp.Simulation(
    resolution=20,
    default_material=SiO2,
    cell_size=mp.Vector3(Sx,Sy),
    geometry=geometry,
    boundary_layers=pml,
    sources=source
)

sim.plot2D()

## INSERT YOUR CODE HERE