Source code for sipkit.permittivity
from __future__ import annotations
import os
import pickle
import jaxlib
from jax import jit
from jax import numpy as jnp
from jax.scipy.ndimage import map_coordinates
user_dir = os.getcwd()
os.chdir(os.path.join(os.path.dirname(__file__), "data"))
with open("permittivity.pkl", "rb") as handle:
perm = pickle.load(handle)
os.chdir(user_dir)
min_wav = perm["wavelengths"].min()
max_wav = perm["wavelengths"].max()
wav_size = len(perm["wavelengths"])
[docs]@jit
def perm_si(wavelength: float | list[float]) -> jaxlib.xla_extension.DeviceArray | jaxlib.xla_extension.Array:
"""
Permittivity value of Si at given wavelength.
Args:
wavelength (float): Wavelength in microns. (1.2 - 1.7) float or list
Returns:
Permittivity value(s).
Examples:
>>> perm_si(1.5)
11.68
>>> perm_si([1.5, 1.6])
[11.68, 11.68]
"""
return map_coordinates(
perm["Si"],
[
(jnp.array(wavelength) - min_wav) * ((wav_size - 1) / (max_wav - min_wav)),
],
order=1,
)
[docs]@jit
def perm_oxide(wavelength: float | list[float]) -> jaxlib.xla_extension.DeviceArray | jaxlib.xla_extension.Array:
"""
Permittivity value of SiO2 at given wavelength.
Args:
wavelength (float): Wavelength in microns. (1.2 - 1.7) float or list
Returns:
Permittivity value(s).
Examples:
>>> perm_oxide(1.5)
3.44
>>> perm_oxide([1.5, 1.6])
[3.44, 3.44]
"""
return map_coordinates(
perm["SiO2"],
[
(jnp.array(wavelength) - min_wav) * ((wav_size - 1) / (max_wav - min_wav)),
],
order=1,
)