# ndispers
> Python library computing refractive-index dispersion, phase matching and
> effective nonlinearity (d_eff) of crystals and glasses for nonlinear /
> ultrafast optics, from literature Sellmeier equations and thermo-optic
> coefficients. Plain numpy in, numpy out — made to be driven from code,
> including by AI agents. MIT license.
Install: `pip install ndispers` (Python >= 3.10, depends only on numpy).
If `nd.catalog` is missing (AttributeError), the installed version predates
v0.19 — upgrade; this file describes v0.19+.
## Core usage
```python
import ndispers as nd
from math import pi, radians
bbo = nd.media.crystals.BetaBBO_Eimerl1987()
bbo.n(0.532, 0.38, 25, pol='e') # -> float
# biaxial worked example: Type-I SHG of 1030 nm in LBO, xy plane, 40 degC
lbo = nd.media.crystals.LBO_KK2018_xy() # xy plane: angle arg is phi
phi = lbo.pmAngles_sfg(1.030, 1.030, 40, deg=True)['ooe']['phi'][0] # degrees
wo = lbo.woa_phi(0.515, radians(phi), 40, pol='e') # walk-off, rad
d = lbo.deff_sfg(1.030, 1.030, None, radians(phi), 40, 'o', 'o', 'e')
# deff_sfg: pass None for the angle the plane fixes (theta here), pm/V
```
Every dispersion method of a crystal takes the same four arguments
`(wl_um, angle_rad, T_degC, pol)`:
- wavelength in **µm** (vacuum), angle in **rad**, temperature in **°C**,
`pol='o'` or `'e'`.
- Any argument may be a numpy array; arrays broadcast together and return an
array (lists are converted). Scalars return float.
- Media in `nd.media.glasses` are isotropic: methods take only `(wl_um, T_degC)`.
Methods (per unit length where applicable): `n`, `dn_wl` (dn/dλ), `GD` (fs/mm),
`GV` (µm/fs), `ng`, `GVD` (fs²/mm), `TOD` (fs³/mm), `woa_theta`/`woa_phi`
(walk-off, rad), `dndT` (1/K), `dndT2`.
Phase matching (crystals): `dk_sfg` (Δk, rad/µm), `pmAngles_sfg(wl1, wl2,
T_degC, deg=False)` (all solutions, keys 'ooe','eeo','oee','eoe','eoo','oeo' =
pol of (wave1, wave2, sum); 'ooe'/'eeo' are Type I, the rest Type II —
'ooe'-types occur in negative uniaxial/biaxial crystals, 'eeo'-types in
positive), `pmFactor_sfg` (sinc²(ΔkL/2)), `qpm_period_sfg` (Λ in µm).
`pmAngles_sfg` returns `{'ooe': {'theta': [angles...], 'phi': None}, ...}` —
the varying angle holds a list (empty = no phase matching), the fixed one
None. DFG/OPA/OPO mirrors: `wl_idler`, `dk_dfg`, `pmAngles_dfg`,
`qpm_period_dfg`, `tuning_dfg` (list of (wl_s, wl_i) tuples; searches up to
the validity edge by default, pass `wl_i_max=` to extrapolate further;
supports `qpm_period=` for PPLN-style temperature tuning); polarization order
is (signal, idler, pump), same as SNLO's (red1, red2, blue).
`GVM(wl1, wl2, angle_rad, T_degC, pol1, pol2)` — group-velocity mismatch
GD(wl1)−GD(wl2) in fs/mm (positive: wl1 arrives later).
Conversion efficiency (needs scipy: `pip install ndispers[eff]`):
`eta_sfg(beam1, beam2, theta_rad, phi_rad, T_degC, pol3, L_mm)` and
`eta_shg(beam, ...)` with beams as `nd.PulsedBeam(wl_um, E_uJ, w_um, t_fs,
pol)` / `nd.CWBeam(wl_um, P_W, w_um, pol)` (w = 1/e² radius µm, t = FWHM
fs; the beam type selects pulsed/cw). Depleted-pump Armstrong solution;
neglects walk-off/GVM/diffraction/GVD and warns (`ModelValidityWarning`)
when those are not small. `details=True` returns a dict with photon
conversions and the neglected-effect ratios. `eta_shg` is Type-I only —
Type-II SHG = degenerate `eta_sfg`.
Full signatures (note L is in **mm** while wavelengths are µm; pol1..pol3 are
positional here, unlike the keyword-only `pol` of dispersion methods):
`pmFactor_sfg(wl1, wl2, angle_rad, T_degC, pol1, pol2, pol3, L_mm)`;
`acceptance_sfg(wl1, wl2, angle_rad, T_degC, pol1, pol2, pol3, L_mm, param)`
— FWHM of sinc²(ΔkL/2) along one variable, param = 'wl' (degenerate-SHG
fundamental) | 'wl1' | 'wl2' (mix) | 'theta' | 'T'; returns µm / rad / K.
Evaluate at a pmAngles_sfg angle (radians) or it raises.
Nonlinearity (non-centrosymmetric crystals): `d_sfg("d31", wl1, wl2, T)` —
tensor component in pm/V, wavelength-scaled by Miller's rule from one
literature reference; `deff_sfg(wl1, wl2, theta_rad, phi_rad, T, pol1, pol2,
pol3)` — effective coefficient with walk-off included. `_d_note` on each class
states how well Miller scaling is validated for it.
## Self-discovery
- `help(obj)` or `obj?` — Sellmeier equation, validity range, literature
reference of any medium. Read this before trusting a number.
- `obj.constants` — the coefficient values.
- `dir(nd.media.crystals)` / `dir(nd.media.glasses)` — all media.
- `nd.catalog()` — list of dicts (name, kind, point_group, plane, wl_range,
d_components, dois) for programmatic filtering, e.g. media usable at 3 µm;
`dois` lists the cited sources, ready for citation.
- `repr(obj)` states the plane, the angle argument and the validity range.
- Media are picklable; safe for multiprocessing/joblib.
## Media
Crystals (class name states the Sellmeier source; several sources per
crystal are separate classes — when unsure pick the most recent source
(LBO: KK2018; β-BBO: Tamosauskas2018 for broadband/IR and fs work, KK2010
for UV phase matching — for SHG spanning both, either works: cross-check)
and compare a second source; the spread between sources is often the real
uncertainty. Each docstring's Ref section cites Sellmeier, thermo-optic and
d coefficients **separately** — they usually come from different papers: AGS_Kato1996, AGS_Takaoka1999, AGSe_Kato2021,
AlphaBBO, BetaBBO_{Eimerl1987, Ghosh1995, KK2010, Tamosauskas2018},
BiBO_Miyata2009_{xy,yz,zx}, CLBO, CLN_{Edwards1984, Jundt1997, Zelmon1997}
(undoped congruent LiNbO3), Calcite, DKDP, KBBF, KDP, KTP_{xy,yz,zx},
LB4, LBO_{Castech, Ghosh1995, KK1994, KK2018, Newlight}_{xy,yz,zx}, LiIO3,
MgF2, MgOLN_Zelmon1997 (5%MgO:LiNbO3), Quartz, RBBF, SLN (1%MgO:LiNbO3
stoichiometric), SLT (0.5%MgO:LiTaO3), Sapphire, YVO4, ZGP_Das2003,
ZGP_Zelmon2001.
Glasses / isotropic: BaF2, CaF2, Diamond, FusedSilica, Ge, LiF, NBK7, SF10,
SF11, SF57, Si, YAG, ZnS, ZnSe.
## Gotchas
- Biaxial crystals (KTP, LBO, BiBO) are one class per principal plane
(`_xy`, `_yz`, `_zx`); the plane fixes one angle and the method argument is
the other (φ for `_xy`, θ for `_yz`/`_zx`). `obj.theta_rad` / `obj.phi_rad`
say which: a number (fixed), 'var' (the argument), or 'arb' (irrelevant).
- Angles are radians unless a method takes `deg=True` for output.
- Sellmeier validity ranges differ per class — check the docstring. A
wavelength >1% outside the range triggers `ndispers.ValidityWarning` but
still returns the extrapolated value; heed it.
- Not every coefficient exists in the literature: KBBF has no reported dn/dT
(implemented as 0); α-BBO and Calcite have no temperature term. If T matters,
verify `obj.dndT(...) != 0`.
- `pol` defaults to 'o', except walk-off methods ('e') and every method of
SLN and CLN_Jundt1997 ('e' — their Sellmeier exists only for the e-ray).
`pol` is keyword-only.
- 30 of the 63 media have no temperature term at all (e.g. MgOLN_Zelmon1997,
fit at 21 °C only): the first call emits `TemperatureWarning` and any T
sweep returns constant results. For temperature-tuned PPLN work use SLN,
SLT or, for undoped congruent LiNbO3, CLN_Jundt1997 (e-ray, to 5 µm);
CLN_Edwards1984 is the one with a temperature-dependent o-ray (to 3.4 µm). `_d_note` (public despite the underscore) states per crystal how well
Miller d-scaling is validated.
- `catalog()`'s wl_range is Sellmeier validity, NOT the transparency range: a
crystal can pass a wavelength filter yet absorb there (β-BBO beyond
~3.5 µm). Check absorption physics separately.
- Inside `tuning_dfg` the ValidityWarning is suppressed (extrapolation is its
documented mode); elsewhere it fires.
- `pmAngles_sfg` returning an empty list means no phase matching exists there.
## Docs
- Full agent reference (this file + all conventions + machine catalog): https://ndispers.readthedocs.io/en/latest/llms-full.txt
- Conventions (units, signs, angle meanings): https://ndispers.readthedocs.io/en/latest/conventions/
- Media catalog (every class, coefficients, references): https://ndispers.readthedocs.io/en/latest/api/crystals/
- Tutorial notebook: https://github.com/akihiko-shimura/ndispers/blob/main/examples/basic_usage.ipynb
- Source: https://github.com/akihiko-shimura/ndispers
---
# Conventions and definitions
The facts on this page hold across the whole package. Everything here is
stated as implemented in the code; per-crystal specifics (coefficients,
validity ranges, references) live in each class docstring and in the
[media catalog](api/crystals.md). `ndispers.catalog()` returns the same
census programmatically — name, kind, point group, plane, validity range and
nonlinear-tensor components per medium.
A wavelength more than 1% outside a medium's Sellmeier validity range raises
a `ndispers.ValidityWarning` (the value is still returned — it is an
extrapolation, not an error). Silence it with
`warnings.simplefilter('ignore', ndispers.ValidityWarning)` when the
extrapolation is deliberate; `tuning_dfg` already does so internally.
## Units
| Quantity | Symbol / method | Unit |
|---|---|---|
| Wavelength (in vacuum) | `wl_um` | µm |
| Angle of the wavevector | `theta_rad`, `phi_rad` | rad |
| Temperature | `T_degC` | °C |
| Refractive index | `n` | — |
| Group delay | `GD` | fs/mm |
| Group velocity | `GV` | µm/fs |
| Group index | `ng` | — |
| Group-velocity dispersion | `GVD` | fs²/mm |
| Third-order dispersion | `TOD` | fs³/mm |
| Thermo-optic coefficient | `dndT` | 1/K |
| Walk-off angle | `woa_theta`, `woa_phi` | rad |
| Wavevector mismatch | `dk_sfg` | rad/µm |
| Crystal length | `L_mm` (in `pmFactor_sfg`) | mm |
The speed of light is taken as c = 2.99792458 × 10⁸ m/s
(0.299792458 µm/fs).
## Method arguments
Every dispersion method of a crystal takes the same four arguments:
```
x.n(wl_um, angle_rad, T_degC, pol='o')
```
Media in `ndispers.media.glasses` take only `(wl_um, T_degC)`, with no angle
and no polarization.
The two packages are split by **optical isotropy**, which is what decides the
call signature — not by whether a medium is crystalline, and not by
centrosymmetry. An isotropic medium has one refractive index with no direction
or polarization dependence, so there is no angle to pass. `CaF₂` is a crystal
(cubic, m3̄m) and sits with the glasses for that reason. α-BBO and calcite are
centrosymmetric as well, but they are uniaxial and therefore birefringent, so
they are crystals here.
- Scalar input returns a Python float. numpy arrays are accepted for any
argument and broadcast together; plain Python lists and tuples are
converted to arrays.
- `pol` defaults to `'o'` (ordinary ray), with two exceptions: the
walk-off methods `woa_theta`/`woa_phi` default to `'e'` (the ordinary
ray of a uniaxial crystal has no walk-off), and every method of `SLN`
defaults to `'e'` because its Sellmeier equation exists only for the
extraordinary ray.
- All derivative quantities (`GD`, `GV`, `ng`, `GVD`, `TOD`, `dndT`,
`dndT2`, walk-off angles) are obtained by differentiating the medium's
symbolic Sellmeier expression (`x.n_expr(pol)`), not by numerical
finite differences.
## Which angle is the angle argument?
θ is the polar angle of the wavevector from the z principal axis; φ is
the azimuthal angle from the x axis.
- **Uniaxial crystals** (BBO, CLBO, KDP, ...): the angle argument is θ.
Nothing depends on φ.
- **Biaxial crystals** (KTP, LBO): one class per principal dielectric
plane; one angle is fixed by the plane and the other is the argument:
| Plane class | Fixed | Angle argument | o-wave polarized along | e-wave polarized in |
|---|---|---|---|---|
| `*_xy` | θ = π/2 | φ | z axis | xy plane |
| `*_yz` | φ = π/2 | θ | x axis | yz plane |
| `*_zx` | φ = π/2 | θ | y axis | zx plane |
The instance attributes tell you which case you have: `x.theta_rad` and
`x.phi_rad` are each either a fixed value in radians, the string
`'var'` (this is the angle you pass), or `'arb'` (the result does not
depend on it). The fixed angle is supplied internally; you never pass it.
## Temperature
The reference temperature — the T at which the temperature correction
vanishes — is a property of each literature source, **not** of the
package. As implemented:
| Media | Temperature term vanishes at |
|---|---|
| β-BBO (all four sources), CLBO, LBO (all sources), KTP | 20 °C |
| RBBF, fused silica, CaF₂ | 24 °C |
| SLN, SLT (Gayer 2008 form) | 24.5 °C |
| LB4 | 25 °C |
| KDP | 24.8 °C |
| KBBF | **no thermo-optic coefficients have been reported in the literature**, so the temperature dependence cannot be computed: the implemented coefficients are zero, n is T-independent and `dndT` is 0 |
| α-BBO, Calcite | no temperature term; `T_degC` is accepted and ignored, `dndT` is 0 |
A medium whose thermo-optic coefficients are all zero emits a one-time
`ndispers.TemperatureWarning` on first use: its methods accept `T_degC` but
ignore it, so a temperature sweep returns constant results.
Not every material property is known for every crystal. A method that
exists on all media is no guarantee that the underlying coefficients
have ever been measured — when they have not, the class implements
zeros. If a temperature dependence matters to your calculation, check
that `x.dndT(...)` is nonzero (or read the class docstring) before
relying on it.
## Dispersion quantities
With λ the vacuum wavelength and c the speed of light, the methods
implement:
| Method | Definition |
|---|---|
| `dn_wl` | dn/dλ |
| `ng` | n − λ·(dn/dλ) |
| `GD` | ng/c per unit length |
| `GV` | c/ng |
| `GVD` | (λ³/2πc²)·(d²n/dλ²) per unit length |
| `TOD` | −(λ⁴/4π²c³)·(3·d²n/dλ² + λ·d³n/dλ³) per unit length |
| `GVM` | GD(wl1) − GD(wl2), fs/mm; positive = wl1 arrives later |
Positive `GVD` is normal dispersion (longer wavelengths travel faster).
## Walk-off
`woa_theta` returns arctan(−(1/n)·∂n/∂θ), the angle between the
Poynting vector (energy-flow direction) and the wavevector, in radians;
`woa_phi` is the azimuthal analogue. For a uniaxial crystal the
ordinary ray has zero walk-off.
## Phase matching
For sum-frequency generation with input wavelengths λ₁, λ₂ and
1/λ₃ = 1/λ₁ + 1/λ₂, the collinear wavevector mismatch is
```
Δk = k₃ − k₂ − k₁ = 2π (n₃/λ₃ − n₂/λ₂ − n₁/λ₁) [rad/µm]
```
so Δk = 0 is phase matching. Second-harmonic generation is the special
case λ₁ = λ₂. The conventions are stated here for SFG; the parametric
processes below mirror them.
### Sum-frequency generation and SHG
- The three-letter keys of `pmAngles_sfg` give the polarizations of
(wave 1, wave 2, sum wave): `'ooe'` and `'eeo'` are Type I,
`'oee'`/`'eoe'` and `'eoo'`/`'oeo'` are Type II. (`'ooe'`-type
matching occurs in negative uniaxial crystals, `'eeo'`-type in
positive ones.)
- `pmAngles_sfg` searches 0–90° and returns all solutions; an empty
list means no phase-matching angle exists for that combination.
`tol_deg` is the absolute tolerance of the returned angle in degrees.
- `pmFactor_sfg` returns sinc²(Δk·L/2), the relative conversion
efficiency of a crystal of length `L_mm`.
- `acceptance_sfg(..., L_mm, param)` returns the acceptance width — the FWHM
of sinc²(Δk·L/2) along one variable with the rest fixed: `param='wl'`
(degenerate-SHG fundamental, wl1 = wl2 swept together), `'wl1'`/`'wl2'`
(mix acceptance, one input wave alone), `'theta'` (internal angle) or
`'T'`. Units: µm, rad, K respectively; `numpy.inf` along a noncritical
direction. Evaluate at a phase-matched point.
- `qpm_period_sfg(wl1, wl2, angle_rad, T_degC, pol1, pol2, pol3, order=1)`
returns the quasi-phase-matching period Λ = 2πm/|Δk| in µm for the same
arguments; for PPLN/PPKTP use `angle_rad = pi/2` and `('e', 'e', 'e')`
(all waves along the polar axis, d33).
### Difference-frequency generation, OPA and OPO
The parametric processes are the same interaction entered from the pump
side: k_p = k_s + k_i with 1/λ_p = 1/λ_s + 1/λ_i. Every `_dfg` method is the
`_sfg` one evaluated at (signal, idler), and the **three-letter keys and
polarization arguments read (signal, idler, pump)** — the order SNLO uses
(red1, red2, blue) — so `'ooe'` is a Type I OPA and `'oee'`/`'eoe'` Type II.
- `wl_idler(wl_p, wl_s)` is the idler; the signal must be longer than the pump.
- `pmAngles_dfg(wl_p, wl_s, T_degC)` returns the `pmAngles_sfg` dictionary
with `'wl_i'` in place of `'wl3'`; `dk_dfg`, `pmFactor_dfg`,
`qpm_period_dfg`, `d_dfg`, `deff_dfg` mirror their SFG counterparts.
- `tuning_dfg(wl_p, angle_rad, T_degC, pol_s, pol_i, pol_p)`
solves Δk(λ_s) = 0 at a fixed angle and temperature and returns every
(λ_s, λ_i) pair with λ_s ≤ λ_i — one point of an OPO tuning curve. The
Type II branch with the other wave as signal is the triple with pol_s
and pol_i exchanged. The search stops at the medium's Sellmeier validity
edge by default; pass `wl_i_max=` to extrapolate further on purpose. With `qpm_period=Λ` (and
`qpm_order`) it solves |Δk| = 2πm/Λ instead — the temperature tuning of a
periodically poled crystal: `SLN().tuning_dfg(1.064, pi/2, T, 'e', 'e', 'e',
qpm_period=30.85)` moves the signal from 1550 nm at 25 °C to 1640 nm at 200 °C.
- Bandwidths differ from SFG: for an OPA the pump is fixed and the idler
follows the signal, so the gain bandwidth is set to first order by the
signal–idler group-velocity mismatch. The phase-matching app computes it
that way in its DFG mode.
## Second-order nonlinearity
Crystals whose point group allows a second-order nonlinearity inherit a
class from `ndispers.groups` (3m, 32, 4̄2m, 4mm or mm2) and carry one
reference measurement per independent tensor component in `_d_ref`:
```
_d_ref = {"d22": (2.2, 1.064, 1.064)} # pm/V, for SFG of wl1 and wl2 in µm
```
- `d_sfg("d22", wl1, wl2, T_degC)` (also spelled `d22_sfg(wl1, wl2, T_degC)`)
returns the component scaled to other wavelengths by **Miller's rule**,
d_ijk ∝ χ_ii(ω₃) χ_jj(ω₁) χ_kk(ω₂) with χ_ii = n_i² − 1 the principal
susceptibilities of the crystal frame. It reproduces the reference value
exactly at the reference wavelengths. Miller's rule is an empirical,
single-parameter estimate: good for BBO, KDP and LiNbO₃, rough for KTP,
untested for several others — each crystal's `_d_note` says what is known.
- `deff_sfg(wl1, wl2, theta_rad, phi_rad, T_degC, pol1, pol2, pol3)` is
the effective coefficient, deff = ê₃·d:(ê₁ê₂), contracted with the
unit **E**-field vectors of the three waves. Walk-off is included (the
e-wave field is perpendicular to the Poynting vector, not to k). The
overall sign is a convention; compare magnitudes. For a principal plane of
a biaxial crystal pass `None` for the angle the plane fixes.
- Kleinman symmetry is assumed throughout (transparency range). Under it
d14 of class 32 vanishes, and type-II deff of class 4mm vanishes.
- Component names (d31, d32, ...) follow each crystal's literature. For LBO
the dielectric axes are x, y, z = a, −c, b, so the polar axis c is
dielectric y and "d31" means d_{c a a}, not d_{z x x}; `Biax_mm2` handles
the mapping through the crystal's `_mm2_axes`.
### Conversion efficiency (semi-analytical)
Non-centrosymmetric crystals also carry `eta_sfg(beam1, beam2, theta_rad,
phi_rad, T_degC, pol3, L_mm)` and `eta_shg(beam, ...)` — the Armstrong
plane-wave solution with pump depletion and phase mismatch, averaged over
Gaussian profiles. Beam parameters travel in `ndispers.PulsedBeam(wl_um,
E_uJ, w_um, t_fs, pol)` or `ndispers.CWBeam(wl_um, P_W, w_um, pol)`: the
beam type selects pulsed (energy) vs cw (power) efficiency, w is the 1/e²
intensity radius, t the FWHM duration. The model neglects walk-off,
group-velocity mismatch, diffraction and GVD; when one of those is not
small a `ndispers.ModelValidityWarning` fires, and `details=True` returns
the ratios plus per-wave photon conversions. `eta_shg` is type-I only
(the degeneracy factor differs from SFG); type-II SHG is degenerate SFG of
the o/e projections — use `eta_sfg`. Requires scipy
(`pip install ndispers[eff]`). The derivation, checked against Armstrong
(1962) and Boyd (2020), is `docs/dev/efficiency_theory.tex`.
The derivation and the closed forms per point group are in
`docs/dev/deff_theory.tex` (and checked numerically in
`ndispers/tests/test_nonlinear.py`).
---
# Machine-generated media catalog
The output of `ndispers.catalog()`, one row per medium class.
| name | kind | point group | plane | validity (um) | d components |
|---|---|---|---|---|---|
| AGS_Kato1996 | crystal | 42m | - | 0.54-12.9 | d36 |
| AGS_Takaoka1999 | crystal | 42m | - | 0.58-10.59 | d36 |
| AGSe_Kato2021 | crystal | 42m | - | 0.81-18 | d36 |
| AlphaBBO | crystal | - | - | 0.19-3.5 | - |
| BetaBBO_Eimerl1987 | crystal | 3m | - | 0.22-1.06 | d22, d31, d33 |
| BetaBBO_Ghosh1995 | crystal | 3m | - | 0.19-2.6 | d22, d31, d33 |
| BetaBBO_KK2010 | crystal | 3m | - | 0.1916-3.22 | d22, d31, d33 |
| BetaBBO_Tamosauskas2018 | crystal | 3m | - | 0.188-5.2 | d22, d31, d33 |
| BiBO_Miyata2009_xy | crystal | 2 | xy | 0.326-3.083 | d11, d12, d13, d14 |
| BiBO_Miyata2009_yz | crystal | 2 | yz | 0.326-3.083 | d11, d12, d13, d14 |
| BiBO_Miyata2009_zx | crystal | 2 | zx | 0.326-3.083 | d11, d12, d13, d14 |
| CLBO | crystal | 42m | - | 0.1914-2.09 | d36 |
| CLN_Edwards1984 | crystal | 3m | - | 0.4-3.4 | d22, d31, d33 |
| CLN_Jundt1997 | crystal | 3m | - | 0.4-5 | d33 |
| CLN_Zelmon1997 | crystal | 3m | - | 0.4-5 | d22, d31, d33 |
| Calcite | crystal | - | - | 0.2-3.3 | - |
| DKDP | crystal | 42m | - | 0.2-1.5 | d36 |
| KBBF | crystal | 32 | - | 0.15-1.53 | d11 |
| KDP | crystal | 42m | - | 0.2-1.5 | d36 |
| KTP_xy | crystal | mm2 | xy | 0.35-4.5 | d31, d32, d33 |
| KTP_yz | crystal | mm2 | yz | 0.35-4.5 | d31, d32, d33 |
| KTP_zx | crystal | mm2 | zx | 0.35-4.5 | d31, d32, d33 |
| LB4 | crystal | 4mm | - | 0.18-2.3 | d31 |
| LBO_Castech_xy | crystal | mm2 | xy | 0.16-2.6 | d31, d32, d33 |
| LBO_Castech_yz | crystal | mm2 | yz | 0.16-2.6 | d31, d32, d33 |
| LBO_Castech_zx | crystal | mm2 | zx | 0.16-2.6 | d31, d32, d33 |
| LBO_Ghosh1995_xy | crystal | mm2 | xy | 0.16-2.6 | d31, d32, d33 |
| LBO_Ghosh1995_yz | crystal | mm2 | yz | 0.16-2.6 | d31, d32, d33 |
| LBO_Ghosh1995_zx | crystal | mm2 | zx | 0.16-2.6 | d31, d32, d33 |
| LBO_KK1994_xy | crystal | mm2 | xy | 0.16-2.6 | d31, d32, d33 |
| LBO_KK1994_yz | crystal | mm2 | yz | 0.16-2.6 | d31, d32, d33 |
| LBO_KK1994_zx | crystal | mm2 | zx | 0.16-2.6 | d31, d32, d33 |
| LBO_KK2018_xy | crystal | mm2 | xy | 0.16-2.6 | d31, d32, d33 |
| LBO_KK2018_yz | crystal | mm2 | yz | 0.16-2.6 | d31, d32, d33 |
| LBO_KK2018_zx | crystal | mm2 | zx | 0.16-2.6 | d31, d32, d33 |
| LBO_Newlight_xy | crystal | mm2 | xy | 0.16-2.6 | d31, d32, d33 |
| LBO_Newlight_yz | crystal | mm2 | yz | 0.16-2.6 | d31, d32, d33 |
| LBO_Newlight_zx | crystal | mm2 | zx | 0.16-2.6 | d31, d32, d33 |
| LiIO3 | crystal | 6 | - | 0.5-5 | d31, d33 |
| MgF2 | crystal | - | - | 0.2-7.04 | - |
| MgOLN_Zelmon1997 | crystal | 3m | - | 0.4-5 | d22, d31, d33 |
| Quartz | crystal | 32 | - | 0.18-0.71 | d11 |
| RBBF | crystal | 32 | - | 0.16-3.55 | d11 |
| SLN | crystal | 3m | - | 0.5-4 | d33 |
| SLT | crystal | 3m | - | 0.35-6 | d22, d31, d33 |
| Sapphire | crystal | - | - | 0.2-5.5 | - |
| YVO4 | crystal | - | - | 0.48-1.34 | - |
| ZGP_Das2003 | crystal | 42m | - | 1.32-11 | d36 |
| ZGP_Zelmon2001 | crystal | 42m | - | 2-9 | d36 |
| BaF2 | glass | - | - | 0.27-10.3 | - |
| CaF2 | glass | - | - | 0.23-9.7 | - |
| Diamond | glass | - | - | see docstring | - |
| FusedSilica | glass | - | - | 0.21-3.71 | - |
| Ge | glass | - | - | 2-12 | - |
| LiF | glass | - | - | 0.1-10 | - |
| NBK7 | glass | - | - | 0.3-2.5 | - |
| SF10 | glass | - | - | 0.38-2.5 | - |
| SF11 | glass | - | - | 0.39-2.5 | - |
| SF57 | glass | - | - | 0.37-2.5 | - |
| Si | glass | - | - | 1.36-11 | - |
| YAG | glass | - | - | 0.4-5 | - |
| ZnS | glass | - | - | 0.405-13 | - |
| ZnSe | glass | - | - | 0.55-18 | - |