# 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 | - |