Skip to main content

ndispers

PyPI test

ndispers is a Python package for calculating refractive index dispersion of various crystals and glasses used in the field of nonlinear/ultrafast optics. It is based on Sellmeier equations and thermo-optic coefficients (dn/dT) reported in literature.

You can easily compute

  • Refractive index
  • Group delay
  • Group velocity
  • Group index
  • Group velocity dispersion
  • Third-order dispersion
  • Walk-off angles
  • dn/dT
  • d²n/dT²

as a function of

  1. Wavelength of light
  2. Polar (theta) or azimuthal (phi) angle of the wavevector with respect to the dielectric principal axes of an anisotropic crystal
  3. Temperature of the medium
  4. Polarization of light (ordinary or extraordinary ray)

The crystals also have nonlinear-optics methods:

  • Phase mismatch, dk
  • Phase-matching angles
  • Phase-matching factor, sinc²(dk·L/2)
  • Effective nonlinear coefficient, deff

Installation

Requires Python 3.9 or later.

pip install ndispers

Quick start

For a guided tour with plots — from inspecting a crystal's Sellmeier equation to phase-matching curves — see the tutorial notebook, readable directly on GitHub. The essentials:

Make an object of a β-BBO crystal:

>>> import ndispers as nd
>>> bbo = nd.media.crystals.BetaBBO_Eimerl1987()

To compute a refractive index:

>>> bbo.n(0.532, 0, 25, pol='o')
1.674884049110459
>>> bbo.n(0.532, 3.1416/2, 25, pol='e')
1.5554658787539917

where the four arguments are, respectively,

  1. wavelength (in micrometer),
  2. theta angle (in radian),
  3. temperature (in degree Celsius),
  4. polarization (pol='o' or 'e', ordinary or extraordinary ray; default 'o').

At theta = 0 (propagation along the optic axis) the o-ray and e-ray indices coincide. Scalar input returns a float. Each argument also accepts a numpy array, returning an array of the same shape:

>>> import numpy as np
>>> bbo.n(np.arange(0.2, 1.5, 0.2), 0, 25, pol='o')
array([1.89001202, 1.69328828, 1.66985875, 1.6612891 , 1.65633946,
       1.65252664, 1.64903624])

The other dispersion methods (GD, GV, ng, GVD, TOD, woa_theta, woa_phi, dndT, dndT2) take the same arguments:

>>> bbo.GVD(0.8, 0, 25, pol='o')   # fs^2/mm
71.86403019943364

Optically isotropic media — the glasses and the cubic crystal CaF₂ — take only wavelength and temperature, since there is no angle or polarization to specify:

>>> silica = nd.media.glasses.FusedSilica()
>>> silica.n(1.064, 20)
1.4495857898590634

To look into the material information, its Sellmeier equation and the literature the coefficients come from, use help(bbo) — or simply bbo? in IPython/Jupyter. bbo.constants returns the coefficient values themselves.

Phase matching

Phase-matching angles for sum-frequency generation are solved directly. For Type-I SHG of 1064 nm in β-BBO at 25 °C:

>>> bbo.pmAngles_sfg(1.064, 1.064, 25, deg=True)
{'wl3': 0.532,
 'ooe': {'theta': [22.884169498625802], 'phi': None},
 'eeo': {'theta': [], 'phi': None},
 'oee': {'theta': [32.56045545648089], 'phi': None},
 'eoe': {'theta': [32.56045545648089], 'phi': None},
 'eoo': {'theta': [], 'phi': None},
 'oeo': {'theta': [], 'phi': None}}

dk_sfg and pmFactor_sfg give the phase mismatch and the sinc² phase-matching factor for arbitrary angles.

Available media

Several crystals are provided in more than one parameterisation, named after the literature (or vendor) the coefficients come from — pick the source you want to rely on.

Medium Classes (nd.media.crystals.*)
β-BBO BetaBBO_Eimerl1987, BetaBBO_Ghosh1995, BetaBBO_KK2010, BetaBBO_Tamosauskas2018
LBO (xy / yz / zx principal planes) LBO_Castech_*, LBO_Ghosh1995_*, LBO_KK1994_*, LBO_KK2018_*, LBO_Newlight_*
KTP (xy / yz / zx principal planes) KTP_xy, KTP_yz, KTP_zx
CLBO CLBO
KDP KDP
KBBF KBBF
RBBF RBBF
LB4 LB4
α-BBO AlphaBBO
Calcite Calcite
1% MgO-doped stoichiometric LiNbO₃ (e-ray) SLN
1% MgO-doped stoichiometric LiTaO₃ SLT
Fused silica, CaF₂ (optically isotropic) nd.media.glasses.FusedSilica, nd.media.glasses.CaF2

For biaxial crystals (LBO, KTP), one class per principal dielectric plane is provided; the angle argument is the one that varies in that plane (phi in xy, theta in yz and zx). The theta_rad and phi_rad attributes of an instance tell which one it is.

Media whose Sellmeier equation carries no temperature term (α-BBO, Calcite) still take the temperature argument for a uniform signature and simply ignore it — their dndT returns 0.

Parallel processing

Medium objects are picklable, including after use, so they can be passed directly to multiprocessing, concurrent.futures or joblib workers, and stored with pickle/shelve. Lambdified dispersion functions are cached per class, so constructing many instances of the same crystal is cheap.

Documentation

  • Tutorial notebook — the basic workflow, from inspecting a crystal's Sellmeier equation to phase-matching curves, viewable directly on GitHub.
  • ndispers.readthedocs.io — conventions (units, angles, sign conventions) and the media catalog of every crystal and glass with its formula, validity range and references.

Development

git clone https://github.com/akihiko-shimura/ndispers.git
cd ndispers
uv sync
uv run pytest

Releases are published to PyPI by pushing a version tag; see docs/RELEASING.md.

License

MIT — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ndispers-0.9.1.tar.gz (35.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ndispers-0.9.1-py3-none-any.whl (67.4 kB view details)

Uploaded Python 3

File details

Details for the file ndispers-0.9.1.tar.gz.

File metadata

  • Download URL: ndispers-0.9.1.tar.gz
  • Upload date:
  • Size: 35.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for ndispers-0.9.1.tar.gz
Algorithm Hash digest
SHA256 b3b7b56715298c8dcb5baf72de7fa1f3815bfb646d1c85f4b0221a568a136ed6
MD5 b1133d564ac80c2bb7f535c5521d4fc3
BLAKE2b-256 81aa510715837fce296dad8ce54f8fe06e40c7949691ace8b4304f644fde5635

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndispers-0.9.1.tar.gz:

Publisher: publish.yml on akihiko-shimura/ndispers

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndispers-0.9.1-py3-none-any.whl.

File metadata

  • Download URL: ndispers-0.9.1-py3-none-any.whl
  • Upload date:
  • Size: 67.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for ndispers-0.9.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2b325bb215e4c952be44375ba307089a00489e59a3f1ecffa58794183f1d0e69
MD5 195b48f024c6c3ab7075f3847a604e61
BLAKE2b-256 22422443e61925306ecbe123b92d87919f68cfa04c068154ddd4ca028247e936

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndispers-0.9.1-py3-none-any.whl:

Publisher: publish.yml on akihiko-shimura/ndispers

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.16.0

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.1

2 files

0.12.0

2 files

0.11.0

2 files

0.10.0

2 files

This release

0.9.1 This release

2 files

0.9.0

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.8

2 files

0.2.7

2 files

0.2.6

2 files

0.2.5

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.1.13

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page