Materials API¶
materials
¶
Material definitions and permittivity/permeability calculations.
Crystal classes are modelled with frequency-dependent Lorentz-oscillator
permittivity (parameters in material_params.json): uniaxial, biaxial,
monoclinic (non-zero off-diagonal components), isotropic, and arbitrary
user-defined permittivity/permeability tensors. Use :func:list_materials for
the current built-in catalogue and :func:create_material to instantiate one.
Classes:
-
BaseMaterial–Base class for all materials providing common functionality.
-
UniaxialMaterial–Base class for anisotropic materials with a single optical axis.
-
ParameterizedUniaxialMaterial–Base class for uniaxial materials with parameters from configuration.
-
Quartz–Quartz material implementation.
-
Sapphire–Sapphire material implementation.
-
Calcite–Calcite material implementation.
-
CalciteLower–Lower frequency range Calcite implementation.
-
CalciteUpper–Upper frequency range Calcite implementation.
-
AluminiumNitride–Wurtzite AlN — c-cut uniaxial (E1 ordinary, A1 extraordinary phonons).
-
SiliconCarbide–4H-SiC — modeled as a c-cut uniaxial crystal (ordinary ≈ extraordinary).
-
HexagonalBoronNitride–hBN — the benchmark natural hyperbolic material (c-cut uniaxial, two bands).
-
GalliumNitride–Wurtzite GaN — c-cut uniaxial polar semiconductor.
-
BiaxialMaterial–Orthorhombic biaxial material: a diagonal ε tensor with three distinct axes.
-
ParameterizedBiaxialMaterial–Base class for biaxial materials with parameters from configuration.
-
MolybdenumTrioxide–α-MoO₃ — biaxial van der Waals crystal supporting in-plane hyperbolic polaritons.
-
MonoclinicMaterial–Base class for monoclinic materials with more complex permittivity tensors.
-
GalliumOxide–Gallium Oxide implementation.
-
ArbitraryMaterial–Material with arbitrary permittivity and permeability tensor components.
-
IsotropicMaterial–Base class for isotropic materials like air.
-
Air–Air material implementation.
Functions:
-
load_material_parameters–Load material parameters from JSON configuration file.
-
create_material–Instantiate a material from a name string or an arbitrary-tensor dict.
-
list_materials–Summarize the registered (named) materials.
BaseMaterial
¶
Base class for all materials providing common functionality.
Initialize base material with frequency array length.
Parameters:
-
frequency_length(int, default:410) –Number of frequency points for dispersion calculations
Methods:
-
fetch_magnetic_tensor–Fetch magnetic permeability tensor for full frequency range.
-
fetch_magnetic_tensor_for_freq–Fetch magnetic permeability tensor for specific frequency.
Source code in hyperbolic_optics/materials.py
fetch_magnetic_tensor
¶
Fetch magnetic permeability tensor for full frequency range.
Returns:
-
ndarray–Complex magnetic permeability tensor with shape matching permittivity
Note
Default implementation returns isotropic tensor. Override in subclasses for magnetic materials.
Source code in hyperbolic_optics/materials.py
fetch_magnetic_tensor_for_freq
¶
Fetch magnetic permeability tensor for specific frequency.
Parameters:
-
requested_frequency(float) –Frequency in cm⁻¹
Returns:
-
ndarray–Complex magnetic permeability tensor at the requested frequency
Source code in hyperbolic_optics/materials.py
UniaxialMaterial
¶
Bases: BaseMaterial
Base class for anisotropic materials with a single optical axis.
Methods:
-
permittivity_calc_for_freq–Calculate permittivity at a single frequency using Lorentz oscillator model.
-
permittivity_calc–Calculate permittivity over full frequency range.
-
fetch_permittivity_tensor–Fetch full permittivity tensor for all frequencies.
-
fetch_permittivity_tensor_for_freq–Fetch permittivity tensor at specific frequency.
-
permittivity_fetch–Fetch extraordinary and ordinary permittivity values.
Source code in hyperbolic_optics/materials.py
permittivity_calc_for_freq
¶
Calculate permittivity at a single frequency using Lorentz oscillator model.
Parameters:
-
frequency(float) –Frequency in cm⁻¹
-
high_freq(float) –High-frequency dielectric constant (ε∞)
-
omega_tn(ndarray) –Transverse optical phonon frequencies
-
gamma_tn(ndarray) –Transverse phonon damping constants
-
omega_ln(ndarray) –Longitudinal optical phonon frequencies
-
gamma_ln(ndarray) –Longitudinal phonon damping constants
Returns:
-
complex–Complex permittivity at the specified frequency
Note
Uses the factorized form: ε(ω) = ε∞ ∏ᵢ (ωₗᵢ² - ω² - iωγₗᵢ)/(ωₜᵢ² - ω² - iωγₜᵢ)
Source code in hyperbolic_optics/materials.py
permittivity_calc
¶
Calculate permittivity over full frequency range.
Parameters:
-
high_freq(float) –High-frequency dielectric constant
-
omega_tn(ndarray) –Transverse optical phonon frequencies
-
gamma_tn(ndarray) –Transverse phonon damping constants
-
omega_ln(ndarray) –Longitudinal optical phonon frequencies
-
gamma_ln(ndarray) –Longitudinal phonon damping constants
Returns:
-
ndarray–Complex permittivity array over all frequencies
Source code in hyperbolic_optics/materials.py
fetch_permittivity_tensor
¶
Fetch full permittivity tensor for all frequencies.
Returns:
-
ndarray–Permittivity tensor with shape [N, 3, 3] where N is number of frequencies
Source code in hyperbolic_optics/materials.py
fetch_permittivity_tensor_for_freq
¶
Fetch permittivity tensor at specific frequency.
Parameters:
-
requested_frequency(float) –Frequency in cm⁻¹
Returns:
-
ndarray–Permittivity tensor with shape [3, 3]
Source code in hyperbolic_optics/materials.py
permittivity_fetch
¶
Fetch extraordinary and ordinary permittivity values.
Returns:
-
tuple[ndarray, ndarray]–Tuple of (eps_extraordinary, eps_ordinary) arrays
Source code in hyperbolic_optics/materials.py
ParameterizedUniaxialMaterial
¶
Bases: UniaxialMaterial
Base class for uniaxial materials with parameters from configuration.
Initialize uniaxial material from parameter configuration.
Parameters:
-
material_type(str) –Material identifier in configuration ('quartz', 'sapphire', etc.)
-
freq_min(float | None, default:None) –Override minimum frequency in cm⁻¹
-
freq_max(float | None, default:None) –Override maximum frequency in cm⁻¹
-
mu_r(float, default:1.0) –Relative magnetic permeability (default: 1.0 for non-magnetic)
Methods:
-
permittivity_parameters–Get permittivity parameters from JSON configuration.
Source code in hyperbolic_optics/materials.py
permittivity_parameters
¶
Get permittivity parameters from JSON configuration.
Returns:
-
dict[str, dict[str, ndarray]]–Dictionary containing ordinary and extraordinary axis parameters
Source code in hyperbolic_optics/materials.py
Quartz
¶
Bases: ParameterizedUniaxialMaterial
Quartz material implementation.
Initialize Quartz (α-SiO₂) material.
Parameters:
-
freq_min(float | None, default:None) –Override minimum frequency (default: 410 cm⁻¹)
-
freq_max(float | None, default:None) –Override maximum frequency (default: 600 cm⁻¹)
-
mu_r(float, default:1.0) –Relative magnetic permeability (default: 1.0)
Note
Quartz is a uniaxial positive crystal supporting hyperbolic phonon polaritons in the far-infrared.
Source code in hyperbolic_optics/materials.py
Sapphire
¶
Bases: ParameterizedUniaxialMaterial
Sapphire material implementation.
Initialize Sapphire (α-Al₂O₃) material.
Parameters:
-
freq_min(float | None, default:None) –Override minimum frequency (default: 210 cm⁻¹)
-
freq_max(float | None, default:None) –Override maximum frequency (default: 1000 cm⁻¹)
-
mu_r(float, default:1.0) –Relative magnetic permeability (default: 1.0)
Note
Sapphire is a uniaxial crystal with hyperbolic dispersion.
Source code in hyperbolic_optics/materials.py
Calcite
¶
Bases: ParameterizedUniaxialMaterial
Calcite material implementation.
Initialize Calcite (CaCO₃) material with specified reststrahlen band.
Parameters:
-
freq_min(float | None, default:None) –Override minimum frequency
-
freq_max(float | None, default:None) –Override maximum frequency
-
variant(str | None, default:None) –'lower' for 860-920 cm⁻¹ or 'upper' for 1300-1600 cm⁻¹
-
mu_r(float, default:1.0) –Relative magnetic permeability (default: 1.0)
Raises:
-
ValueError–If variant is not 'lower' or 'upper'
Note
Calcite must be instantiated through CalciteLower or CalciteUpper subclasses rather than directly.
Source code in hyperbolic_optics/materials.py
CalciteLower
¶
Bases: Calcite
Lower frequency range Calcite implementation.
Initialize Calcite lower reststrahlen band (860-920 cm⁻¹).
Parameters:
-
freq_min(float | None, default:None) –Override minimum frequency
-
freq_max(float | None, default:None) –Override maximum frequency
-
mu_r(float, default:1.0) –Relative magnetic permeability (default: 1.0)
Source code in hyperbolic_optics/materials.py
CalciteUpper
¶
Bases: Calcite
Upper frequency range Calcite implementation.
Initialize Calcite upper reststrahlen band (1300-1600 cm⁻¹).
Parameters:
-
freq_min(float | None, default:None) –Override minimum frequency
-
freq_max(float | None, default:None) –Override maximum frequency
-
mu_r(float, default:1.0) –Relative magnetic permeability (default: 1.0)
Note
The upper band exhibits type-II hyperbolic dispersion (ε_∥ < 0, ε_⊥ > 0).
Source code in hyperbolic_optics/materials.py
AluminiumNitride
¶
Bases: ParameterizedUniaxialMaterial
Wurtzite AlN — c-cut uniaxial (E1 ordinary, A1 extraordinary phonons).
Initialize AlN (aluminium nitride), a c-cut uniaxial polar crystal.
Used (with SiC and MoO₃) in the layer-resolved absorption example. See
material_params.json for the phonon parameters and their provenance.
Source code in hyperbolic_optics/materials.py
SiliconCarbide
¶
Bases: ParameterizedUniaxialMaterial
4H-SiC — modeled as a c-cut uniaxial crystal (ordinary ≈ extraordinary).
Initialize SiC (silicon carbide), a polar crystal with a single TO-LO pair.
SiC is nearly isotropic in its reststrahlen band; the parameters use equal
ordinary/extraordinary oscillators (see material_params.json).
Source code in hyperbolic_optics/materials.py
HexagonalBoronNitride
¶
Bases: ParameterizedUniaxialMaterial
hBN — the benchmark natural hyperbolic material (c-cut uniaxial, two bands).
Initialize natural hexagonal boron nitride.
Two reststrahlen bands give type-I (out-of-plane, ~760-825 cm⁻¹) and
type-II (in-plane, ~1360-1614 cm⁻¹) hyperbolic dispersion. See
material_params.json for the phonon parameters and their provenance.
Source code in hyperbolic_optics/materials.py
GalliumNitride
¶
Bases: ParameterizedUniaxialMaterial
Wurtzite GaN — c-cut uniaxial polar semiconductor.
Initialize GaN (gallium nitride), a wurtzite polar semiconductor.
See material_params.json for the E1/A1 phonon parameters.
Source code in hyperbolic_optics/materials.py
BiaxialMaterial
¶
Bases: UniaxialMaterial
Orthorhombic biaxial material: a diagonal ε tensor with three distinct axes.
Generalizes :class:UniaxialMaterial from two principal values (ordinary,
extraordinary) to three (x, y, z). It reuses the factorized TO-LO
permittivity_calc per axis — the same Lowndes/Gervais form the α-MoO₃
literature uses — and only changes how the diagonal tensor is assembled. There
is no off-diagonal coupling (unlike monoclinic :class:MonoclinicMaterial).
Methods:
-
permittivity_fetch–Return
(eps_x, eps_y, eps_z)over the full frequency range. -
fetch_permittivity_tensor–Fetch the full diagonal permittivity tensor for all frequencies.
-
fetch_permittivity_tensor_for_freq–Fetch the diagonal permittivity tensor at a single frequency.
Source code in hyperbolic_optics/materials.py
permittivity_fetch
¶
Return (eps_x, eps_y, eps_z) over the full frequency range.
Source code in hyperbolic_optics/materials.py
fetch_permittivity_tensor
¶
Fetch the full diagonal permittivity tensor for all frequencies.
fetch_permittivity_tensor_for_freq
¶
Fetch the diagonal permittivity tensor at a single frequency.
Source code in hyperbolic_optics/materials.py
ParameterizedBiaxialMaterial
¶
Bases: BiaxialMaterial
Base class for biaxial materials with parameters from configuration.
Initialize a biaxial material from the biaxial_materials config block.
Parameters:
-
material_type(str) –Key in
material_params.jsonbiaxial_materials. -
freq_min(float | None, default:None) –Override minimum frequency in cm⁻¹.
-
freq_max(float | None, default:None) –Override maximum frequency in cm⁻¹.
-
mu_r(float, default:1.0) –Relative magnetic permeability (default: 1.0, non-magnetic).
Methods:
-
permittivity_parameters–Get per-axis (x, y, z) oscillator parameters from configuration.
Source code in hyperbolic_optics/materials.py
permittivity_parameters
¶
Get per-axis (x, y, z) oscillator parameters from configuration.
Source code in hyperbolic_optics/materials.py
MolybdenumTrioxide
¶
Bases: ParameterizedBiaxialMaterial
α-MoO₃ — biaxial van der Waals crystal supporting in-plane hyperbolic polaritons.
Initialize α-MoO₃ (orthorhombic, biaxial).
Three distinct reststrahlen bands give strong in-plane anisotropy, the
origin of the azimuth-dependent hyperbolic phonon polariton in the
layer-resolved absorption example. Parameters and provenance are in
material_params.json.
Source code in hyperbolic_optics/materials.py
MonoclinicMaterial
¶
Bases: BaseMaterial
Base class for monoclinic materials with more complex permittivity tensors.
Source code in hyperbolic_optics/materials.py
GalliumOxide
¶
Bases: MonoclinicMaterial
Gallium Oxide implementation.
Initialize β-Ga₂O₃ (monoclinic) material.
Parameters:
-
freq_min(float | None, default:None) –Override minimum frequency (default: 350 cm⁻¹)
-
freq_max(float | None, default:None) –Override maximum frequency (default: 800 cm⁻¹)
-
mu_r(float, default:1.0) –Relative magnetic permeability (default: 1.0)
Note
Gallium oxide is a monoclinic crystal with non-zero ε_xy coupling, supporting hyperbolic polaritons with in-plane anisotropy.
Methods:
-
permittivity_parameters–Get Gallium Oxide symmetry mode parameters.
-
permittivity_calc–Calculate all permittivity tensor components over frequency range.
-
fetch_permittivity_tensor–Fetch full permittivity tensor for all frequencies.
-
fetch_permittivity_tensor_for_freq–Fetch permittivity tensor at specific frequency.
Source code in hyperbolic_optics/materials.py
permittivity_parameters
¶
Get Gallium Oxide symmetry mode parameters.
Returns:
-
dict[str, dict[str, Any]]–Dictionary with 'Au' and 'Bu' mode parameters including oscillator
-
dict[str, dict[str, Any]]–strengths, frequencies, dampings, and orientation angles
Source code in hyperbolic_optics/materials.py
permittivity_calc
¶
Calculate all permittivity tensor components over frequency range.
Returns:
-
tuple[ndarray, ndarray, ndarray, ndarray]–Tuple of (eps_xx, eps_yy, eps_zz, eps_xy) arrays
Source code in hyperbolic_optics/materials.py
fetch_permittivity_tensor
¶
Fetch full permittivity tensor for all frequencies.
Returns:
-
ndarray–Permittivity tensor with shape [N, 3, 3]
Source code in hyperbolic_optics/materials.py
fetch_permittivity_tensor_for_freq
¶
Fetch permittivity tensor at specific frequency.
Parameters:
-
requested_frequency(float) –Frequency in cm⁻¹
Returns:
-
ndarray–Permittivity tensor with shape [3, 3]
Source code in hyperbolic_optics/materials.py
ArbitraryMaterial
¶
Bases: BaseMaterial
Material with arbitrary permittivity and permeability tensor components.
Initialize material with arbitrary permittivity and permeability tensors.
Parameters:
-
material_data(dict[str, Any] | None, default:None) –Dictionary with tensor components (eps_xx, eps_yy, etc.) If None, uses default identity-like values
Example
mat_data = { ... "eps_xx": {"real": 2.5, "imag": 0.1}, ... "eps_yy": {"real": 3.0, "imag": 0.0}, ... "eps_zz": {"real": -4.0, "imag": 0.5}, ... "mu_r": 1.0 ... } material = ArbitraryMaterial(mat_data)
Methods:
-
fetch_permittivity_tensor–Construct full permittivity tensor from components.
-
fetch_permittivity_tensor_for_freq–Return frequency-independent permittivity tensor.
-
fetch_magnetic_tensor–Construct full magnetic permeability tensor from components.
-
fetch_magnetic_tensor_for_freq–Return frequency-independent magnetic tensor.
Source code in hyperbolic_optics/materials.py
fetch_permittivity_tensor
¶
Construct full permittivity tensor from components.
Returns:
-
ndarray–3×3 complex permittivity tensor
Source code in hyperbolic_optics/materials.py
fetch_permittivity_tensor_for_freq
¶
Return frequency-independent permittivity tensor.
Parameters:
-
requested_frequency(float) –Frequency in cm⁻¹ (ignored)
Returns:
-
ndarray–3×3 complex permittivity tensor
Note
Arbitrary materials are frequency-independent by definition.
Source code in hyperbolic_optics/materials.py
fetch_magnetic_tensor
¶
Construct full magnetic permeability tensor from components.
Returns:
-
ndarray–3×3 complex permeability tensor
Source code in hyperbolic_optics/materials.py
fetch_magnetic_tensor_for_freq
¶
Return frequency-independent magnetic tensor.
Parameters:
-
requested_frequency(float) –Frequency in cm⁻¹ (ignored)
Returns:
-
ndarray–3×3 complex permeability tensor
Note
Arbitrary materials are frequency-independent by definition.
Source code in hyperbolic_optics/materials.py
IsotropicMaterial
¶
Bases: BaseMaterial
Base class for isotropic materials like air.
Initialize isotropic material with scalar permittivity and permeability.
Parameters:
-
permittivity(float | complex | dict[str, float] | None, default:None) –Relative permittivity (scalar or dict with 'real'/'imag')
-
permeability(float | complex | dict[str, float] | None, default:None) –Relative permeability (scalar or dict with 'real'/'imag')
Note
For isotropic materials, all diagonal tensor components are equal and off-diagonal components are zero.
Methods:
-
construct_tensor_singular–Create diagonal tensor with scalar permittivity value.
-
fetch_permittivity_tensor–Get permittivity tensor for isotropic material.
-
fetch_permittivity_tensor_for_freq–Get frequency-independent permittivity tensor.
-
fetch_magnetic_tensor–Get magnetic permeability tensor for isotropic material.
-
fetch_magnetic_tensor_for_freq–Get frequency-independent magnetic tensor.
Source code in hyperbolic_optics/materials.py
construct_tensor_singular
¶
Create diagonal tensor with scalar permittivity value.
Returns:
-
ndarray–3×3 diagonal tensor with permittivity on diagonal
Source code in hyperbolic_optics/materials.py
fetch_permittivity_tensor
¶
Get permittivity tensor for isotropic material.
Returns:
-
ndarray–3×3 diagonal permittivity tensor
fetch_permittivity_tensor_for_freq
¶
Get frequency-independent permittivity tensor.
Parameters:
-
requested_frequency(float) –Frequency in cm⁻¹ (ignored)
Returns:
-
ndarray–3×3 diagonal permittivity tensor
Source code in hyperbolic_optics/materials.py
fetch_magnetic_tensor
¶
Get magnetic permeability tensor for isotropic material.
Returns:
-
ndarray–3×3 diagonal permeability tensor
Source code in hyperbolic_optics/materials.py
fetch_magnetic_tensor_for_freq
¶
Get frequency-independent magnetic tensor.
Parameters:
-
requested_frequency(float) –Frequency in cm⁻¹ (ignored)
Returns:
-
ndarray–3×3 diagonal permeability tensor
Source code in hyperbolic_optics/materials.py
Air
¶
Bases: IsotropicMaterial
Air material implementation.
Initialize Air material (vacuum approximation).
Parameters:
-
permittivity(float | complex | dict[str, float] | None, default:None) –Relative permittivity (default: 1.0 from config)
-
permeability(float | complex | dict[str, float] | None, default:None) –Relative permeability (default: 1.0)
Note
Air is treated as an isotropic, non-dispersive material with ε ≈ 1.0 and μ ≈ 1.0 across all frequencies.
Source code in hyperbolic_optics/materials.py
load_material_parameters
¶
Load material parameters from JSON configuration file.
Returns:
-
dict[str, Any]–Dictionary containing all material parameters organized by material type
-
dict[str, Any]–(uniaxial, monoclinic, arbitrary, isotropic)
Note
The configuration file is located at hyperbolic_optics/material_params.json
Source code in hyperbolic_optics/materials.py
create_material
¶
Instantiate a material from a name string or an arbitrary-tensor dict.
Parameters:
-
material(str | dict[str, Any]) –A registered material name (see :func:
list_materials), or a dict of permittivity/permeability components for an :class:ArbitraryMaterial.
Raises:
-
NotImplementedError–If the name is not recognised.
Source code in hyperbolic_optics/materials.py
list_materials
¶
Summarize the registered (named) materials.
Returns:
-
dict[str, dict[str, Any]]–A dict keyed by the registry name a payload would use (e.g.
"hBN"), -
dict[str, dict[str, Any]]–each value giving the implementing
classname, the opticaltype -
dict[str, dict[str, Any]]–(
"uniaxial","biaxial","monoclinic"or"isotropic"), and -
dict[str, dict[str, Any]]–the default
frequency_range(min, max)in cm⁻¹ (Noneif the -
dict[str, dict[str, Any]]–material has no intrinsic range).
Example
for name, info in list_materials().items(): ... print(name, info["type"], info["frequency_range"])