Rectangular directional coupler

4. Rectangular directional coupler#

In this example we model a cross-section of a \(2\times 2\) directional coupler formed from rectangular strip-loaded waveguides. Parameters were taken from this guide. First, I’ll construct the waveguide.

from wavesolve.waveguide import Rectangle,Waveguide

airclad = Rectangle(1.,"air")
airclad.make_points(-12,12,-16,8)

strip1 = Rectangle(1.45,"strip1")
strip1.make_points(-5.5,-0.5,0,2)

strip2 = Rectangle(1.45,"strip2")
strip2.make_points(0.5,5.5,0,2)

corelayer = Rectangle(1.77,"corelayer")
corelayer.make_points(-10,10,-1,0)

clad = Rectangle(1.45,"clad")
clad.make_points(-10,10,-10,-1)

strip1.mesh_size = 1.0
strip2.mesh_size = 1.0
clad.mesh_size = 1.0
corelayer.mesh_size = 0.25

wvg = Waveguide([airclad,[strip1,strip2,corelayer,clad]] )
m = wvg.make_mesh(order=1)

wvg.plot_mesh(m,plot_points=False)

(Source code, png, hires.png, pdf)

_images/rect-1.png

Next, we’ll solve and look for the TM00 modes, which will be vertically polarized.

from wavesolve.FEsolver import solve_waveguide_vec,plot_vector_field,get_eff_index
import matplotlib.pyplot as plt

wl = 1.
IOR_dict = wvg.assign_IOR()

w,v = solve_waveguide_vec(m,wl,IOR_dict,Nmax = 8)

ne = get_eff_index(wl,w)

fig,axs = plt.subplots(8,1,sharex=True,sharey=True,figsize=(8,12))
for i,ax in enumerate(axs.flatten()):
    ax.set_title("mode "+str(i+1)+r": $n_{\rm eff}=$"+str(round(np.real(ne[i]),5)))
    plot_vector_field(m,v[i],ax=axs.flatten()[i],bounds=(-10,10,-2,1))
    wvg.plot_boundaries(ax)
plt.show()

(Source code, png, hires.png, pdf)

_images/rect-2.png

From these plots, we can see that modes 5 and 6 are our first two TM00 modes. The coupling length is given by

\[L_c = \dfrac{\lambda}{2(n_{\rm eff,1}-n_{\rm eff,2})}.\]

I find a coupling length of around 820 \(\mu\)m, which is quite close to the 811 \(\mu\)m value quoted by the guide I referenced.