Waveguide compact model

Lets build a waveguide compact model that predicts neff(width, thickness, wavelength) for the fundamental TE model of a silicon strip waveguide

_________________________________

                                clad_thickness
         width
     <---------->
      ___________    _ _ _ _ _ _
     |           |
_____|           |____          |
                                thickness
slab_thickness                  |
_______________________ _ _ _ _ __

sub_thickness
_________________________________
<------------------------------->
             sub_width
[1]:
import numpy as np
import matplotlib.pyplot as plt
import modes as ms

Lets compute the effective index neff as a function of waveguide thickness. To compute the waveguide thickness we need to increase the default y grid spacing (20nm) to 5nm

[2]:
thicknesss = np.arange(210e-3, 230e-3, 5e-3)
wgs = [ms.waveguide(thickness=h, y_step=0.005) for h in thicknesss]
s = ms.sweep_waveguide(wgs, thicknesss, legend=['TE0', 'TM0', 'TE1', 'TM1'], overwrite=False, plot=False)
100%|███████████████████████████████████| 5/5 [02:50<00:00, 34.14s/it]
[3]:
n0 = [n[0] for n in s['n_effs']]
ph = np.polyfit(thicknesss, n0, 1)
n0f = np.polyval(ph, thicknesss)
plt.plot(thicknesss*1e3, n0, '.')
plt.plot(thicknesss*1e3, n0f, '-')
plt.xlabel('wg thickness (nm)')
plt.ylabel('neff')
[3]:
Text(0, 0.5, 'neff')
../_images/notebooks_22_sweep_height_5_1.png

Lets Compute the effective index neff as a function of waveguide width

[4]:
widths = np.arange(0.3, 2.0, 0.2)
widths = np.arange(0.3, 2.0, 0.02)
wgs = [ms.waveguide(width=width) for width in widths]
s = ms.sweep_waveguide(wgs, widths, legend=['TE0', 'TM0', 'TE1', 'TM1'], overwrite=False, plot=False)
100%|█████████████████████████████████| 85/85 [02:18<00:00,  1.62s/it]
[5]:
n0 = [n[0] for n in s['n_effs']]
pw  = np.polyfit(widths, n0, 6)
n0f = np.polyval(pw, widths)
plt.plot(widths, n0, '.')
plt.plot(widths, n0f, '.')
plt.xlabel('width (um)')
plt.ylabel('neff')
[5]:
Text(0, 0.5, 'neff')
../_images/notebooks_22_sweep_height_8_1.png

Finally we compute the effective index as a function of wavelength

[6]:
wavelengths = np.arange(1500, 1600, 10)*1e-3
s = ms.sweep_wavelength(wavelengths, plot=False, overwrite=False)
100%|█████████████████████████████████| 10/10 [00:07<00:00,  1.36it/s]
[7]:
n0 = [n[0] for n in s['n_effs']]
pwav  = np.polyfit(wavelengths, n0, 1)
n0f = np.polyval(pwav, wavelengths)
plt.plot(wavelengths, n0, '.')
plt.plot(wavelengths, n0f, '-')
plt.xlabel('wavelength (um)')
plt.ylabel('neff')
[7]:
Text(0, 0.5, 'neff')
../_images/notebooks_22_sweep_height_11_1.png
[8]:
pwav
[8]:
array([-1.0652613 ,  4.12286748])