Effective Index
Effective Index of the Fundamental Mode
Effective index of the fundamental mode of a 220-nm-thick silicon-on-insulator waveguide can be accessed by using neff function of effective_index module. Note that for the default parameters below, this mode happens to be a TE mode. The function takes the following arguments:
wavelength: Wavelength of the light in the waveguide, in micrometers. A list of wavelengths can also be passed. Wavelength range is from 1.2 to 1.7 micrometers; it will return 0 for wavelengths out of range.width: Width of the waveguide, in micrometers. A list of widths can also be passed. Width range is from 0.240 to 0.700 micrometers; it will return 0 for widths out of range.
[1]:
from sipkit.effective_index import neff
import jax.numpy as jnp
neff(width=0.5, wavelength=1.55)
WARNING:jax._src.lib.xla_bridge:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)
[1]:
DeviceArray(2.44523381, dtype=float64)
Note: If there is no GPU/TPU available, Jax will automatically fall back to CPU backend. This will result in a significant slowdown in the runtime.
Argument Specifications
Scalar width, scalar wavelength
[2]:
neff(width=0.5, wavelength=1.55)
[2]:
DeviceArray(2.44523381, dtype=float64)
Scalar width, 1D Array wavelength
[3]:
neff(width=0.5, wavelength=jnp.linspace(1.4, 1.5, 5))
[3]:
DeviceArray([2.6138077 , 2.58583721, 2.55782222, 2.52975709, 2.50163816], dtype=float64)
1D Array width, scalar wavelength
[4]:
neff(width=jnp.linspace(0.4, 0.5, 5), wavelength=1.55)
[4]:
DeviceArray([2.22706193, 2.29512748, 2.35308258, 2.40263554, 2.44523381], dtype=float64)
1D Array width, 1D Array wavelength
[5]:
neff(width=jnp.linspace(0.4, 0.5, 5), wavelength=jnp.linspace(1.4, 1.5, 5))
[5]:
DeviceArray([2.43643383, 2.45969938, 2.47767491, 2.49138915, 2.50163816], dtype=float64)
Scalar width, 2D Array wavelength
[6]:
neff(width=0.45, wavelength=jnp.array([[1.4, 1.5], [1.6, 1.7]]))
[6]:
DeviceArray([[2.53952222, 2.41551475],
[2.2904706 , 2.16536619]], dtype=float64)
2D Array width, scalar wavelength
[7]:
neff(width=jnp.array([[0.4, 0.45], [0.5, 0.55]]), wavelength=1.55)
[7]:
DeviceArray([[2.22706193, 2.35308258],
[2.44523381, 2.51410111]], dtype=float64)
2D Array width, 2D Array wavelength
[8]:
waveguide_width = jnp.array([0.5, 0.6])
wavelength = jnp.array([1.5, 1.6, 1.7])
waveguide_width, wavelength = jnp.meshgrid(waveguide_width, wavelength)
neff(waveguide_width, wavelength)
[8]:
DeviceArray([[2.50163816, 2.61481455],
[2.38861872, 2.5186588 ],
[2.27496007, 2.42226799]], dtype=float64)
Effective Index of Higher Order Modes
Effective Index of first 5 modes in a waveguide can be accessed by using the following functions of effective_index module:
neff_te0: Effective index of TE0 mode. (Note that currently this is the same asneff, due to the waveguide width boundaries used.)neff_tm0: Effective index of TM0 mode.neff_te1: Effective index of TE1 mode.neff_tm1: Effective index of TM0 mode.neff_te2: Effective index of TE3 mode.
[9]:
from sipkit.effective_index import neff_te0, neff_tm0
neff_te0_list = neff_te0(width=jnp.linspace(0.4, 0.5, 5), wavelength=1.55)
neff_te0_list
[9]:
DeviceArray([2.22706193, 2.29512748, 2.35308258, 2.40263554, 2.44523381], dtype=float64)
[10]:
neff_tm0_list = neff_tm0(width=jnp.linspace(0.4, 0.5, 5), wavelength=1.55)
neff_tm0_list
[10]:
DeviceArray([1.69157614, 1.71344278, 1.73396505, 1.75313724, 1.77099004], dtype=float64)
For the cases where the specified mode is not guided, the function will return the refractive index of silicon dioxide as the effective index at that wavelength.
[11]:
from sipkit.effective_index import neff_te2
neff_te2_list = neff_te2(width=jnp.linspace(0.4, 0.5, 5), wavelength=1.55)
neff_te2_list
[11]:
DeviceArray([1.4440023, 1.4440023, 1.4440023, 1.4440023, 1.4440023], dtype=float64)