Source code for elli.dispersions.pseudo_dielectric

# Encoding: utf-8
"""Pseudo dielectric function dispersion."""

from typing import Union
import numpy as np
import numpy.typing as npt
from scipy.interpolate import interp1d

from .base_dispersion import Dispersion, InvalidParameters


[docs] class PseudoDielectricFunction(Dispersion): r"""A pseudo dielectric function generated from experimental psi/delta values. Please note that the pseudo dielectric function can lead to unphysical behaviour, such as negative refractive indices or other spurious artifacts. Additionally, this formula is only valid for a bulk absorbing material and yields wrong results for layered materials. Therefore, it is preferable to use the pseudo dielectric function only as a helper for constructing other dispersion models. Single parameters: :angle: The measurement angle in degree under which the psi/delta values where obtained. :lbda: The wavelength region of the measurement data. Units in nm. :psi: The psi values of the measurement. Units in degree. :delta: The delta values of the measurement. Units in degree. Repeated parameters: -- Output: .. math:: \varepsilon(\lambda) = \sin^2 \left( \Theta \right) \cdot \left( 1 + \tan^2 (\Theta) \left( \frac{1 - \rho}{1 + \rho} \right) \right) With .. math:: \rho = \tan(\Psi) \cdot \exp (-i \Delta) :math:`\Theta` is the angle of incidence. """ single_params_template = {"angle": None, "lbda": None, "psi": None, "delta": None} rep_params_template = {} def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) rho = np.tan(np.deg2rad(self.single_params.get("psi"))) * np.exp( -1j * np.deg2rad(self.single_params.get("delta")) ) theta = self.single_params.get("angle") * np.pi / 180 eps = np.sin(theta) ** 2 * ( 1 + np.tan(theta) ** 2 * ((1 - rho) / (1 + rho)) ** 2 ) self.interpolation = interp1d( self.single_params.get("lbda"), eps, kind="cubic", ) def __add__(self, _: Union[int, float, "Dispersion"]) -> "DispersionSum": raise NotImplementedError("Adding of tabular dispersions is not yet supported")
[docs] def dielectric_function(self, lbda: npt.ArrayLike) -> npt.NDArray: return self.interpolation(lbda)