optmat.gas.molecular_ionisation_rates#

Strong-field ionisation rates of molecules.

The rate (the model default; TC-677 to TC-680) carries the rate of the noble gases (optmat.gas.ionisation_rates) to molecules. For an unaligned molecule, at the fields and frequencies of a laser pulse,

\[W(F, \omega) = N_\text{eff}\, V(F) \sum_{m'} \langle B^2(m') \rangle\, \frac{\kappa^{1 - 2n^*}}{2^{|m'|}\,|m'|!\, I_p}\; \frac{w^\text{sr}_{m'}(F, \omega)}{|C_{\kappa l}|^2 f(l, m')}\; Q(F)\, S(F):\]
  • \(\langle B^2(m') \rangle\): the structure factors of the ionising orbital of Tong, Zhao and Lin (2002), averaged over the orientations of the molecule (isotropic_structure_factors()), which take the place of an atom’s \(|C_{\kappa l}|^2 f(l, m)\): for one partial wave the two are the same;

  • \(w^\text{sr}_{m'}\): the short-range rate of Perelomov, Popov and Terent’ev (1966, eq. 54) for the projection \(m'\), with its dependence on the frequency, and \(Q = (2F_0/F)^{2n^*}\) Perelomov and Popov’s static Coulomb factor;

  • \(S = \exp[-\alpha F/(I_p \kappa^3)]\): Tong and Lin’s (2005) form of the correction at finite field, with \(\alpha\) fitted here to the average over orientations of all-electron static rates (N2, H2);

  • \(N_\text{eff}\): the number of electrons in the ionising shell, the weak-field limit of the many-electron theory (Tolstikhin, Madsen and Morishita 2014);

  • \(V\): the average of the rate over the vibrational ground state, where a reference gives it (H2), 1 otherwise.

The ionisation energy is the vertical one, and the rate that of fixed nuclei at the neutral’s geometry times \(V\). The instantaneous and the cycle-averaged rate are related as for the noble gases (optmat.gas.ionisation_rates.Averaging).

The forms of the literature. Three rates are in use for molecules in pulse-propagation codes. Each is given as its source gives it, in SI, so that results computed with it can be reproduced and the forms compared with one another and with the references (TC-673):

moadk

The molecular tunnelling rate of Tong, Zhao and Lin (2002). The ionising orbital is written by its asymptotic tail, \(\Psi^m \to \sum_l C_l\, r^{Z/\kappa - 1} e^{-\kappa r}\, Y_{lm}\) (their eqs. 1-2), and for a molecule at the Euler angles \(\mathbf R\) to a static field \(F\) (eqs. 8-9)

\[w(F, \mathbf R) = \sum_{m'} \frac{B^2(m')}{2^{|m'|}\, |m'|!}\, \frac{1}{\kappa^{2Z/\kappa - 1}} \left(\frac{2\kappa^3}{F}\right)^{2Z/\kappa - |m'| - 1} e^{-2\kappa^3/3F}, \qquad B(m') = \sum_l C_l\, D^l_{m'm}(\mathbf R)\, Q(l, m'),\]

with \(Q(l, m) = (-1)^m [(2l+1)(l+|m|)!/2(l-|m|)!]^{1/2}\). Averaged over the orientations of the molecule the cross terms between partial waves vanish, \(\langle B^2(m') \rangle = \sum_l C_l^2\, Q^2(l, m')/(2l+1)\) (isotropic_structure_factors()).

ppt

The rate of Perelomov, Popov and Terent’ev for an electron with \(l = m = 0\) and an effective charge \(Z_\text{eff}\) fitted to measured ion yields (Talebpour et al. 1998, 1999): \(n^* = Z_\text{eff}/\kappa\), the Hartree coefficient with \(l^* = n^* - 1\), and a Coulomb factor (optmat.gas.ionisation_rates.coulomb_factor()): the static one, within which the charges were fitted (ppt_talebpour), or Ilkov et al.’s (ppt_talebpour_ilkov), within which the charges were not fitted.

adk

The tunnelling rate of a hydrogen-like s electron built on the ionisation energy alone: \(Z = 1\), \(l^* = 0\), no angular factor.

Each is the rate of one electron. To apply an occupancy, set MolecularRateModel.electrons consistently with the coefficients. The rates of the moadk and adk forms are static: their cycle-averaged rate is the static rate times the factor of the tunnelling limit, \((3F/\pi F_0)^{1/2}\). The ppt form is cycle averaged, and its instantaneous rate is that divided by the same factor.

None of these is validated as the rate of a molecule. Against the orientation average of all-electron static rates the moadk form is twice too high for H2, and for N2 from 0.9 to 6.6 times as the field rises to twice its barrier-suppression field (optmat.gas.molecular_ionisation_validation).

References#

  • X. M. Tong, Z. X. Zhao and C. D. Lin, “Theory of molecular tunneling ionization”, Phys. Rev. A 66, 033402 (2002).

  • S.-F. Zhao, C. Jin, A.-T. Le, T. F. Jiang and C. D. Lin, “Determination of structure parameters in strong-field tunneling ionization theory of molecules”, Phys. Rev. A 81, 033423 (2010).

  • A. Talebpour, J. Yang and S. L. Chin, “Semi-empirical model for the rate of tunnel ionization of N2 and O2 molecule in an intense Ti:sapphire laser pulse”, Opt. Commun. 163, 29 (1999).

  • A. Talebpour, S. Larochelle and S. L. Chin, “Suppressed tunnelling ionization of the D2 molecule in an intense Ti:sapphire laser pulse”, J. Phys. B 31, L49 (1998).

  • M. V. Ammosov, N. B. Delone and V. P. Krainov, “Tunnel ionization of complex atoms and of atomic ions in an alternating electromagnetic field”, Sov. Phys. JETP 64, 1191 (1986).

  • A. M. Perelomov, V. S. Popov and M. V. Terent’ev, “Ionization of atoms in an alternating electric field”, Sov. Phys. JETP 23, 924 (1966).

  • A. M. Perelomov and V. S. Popov, “Ionization of atoms in an alternating electrical field. III”, Sov. Phys. JETP 25, 336 (1967).

  • X. M. Tong and C. D. Lin, “Empirical formula for static field ionization rates of atoms and molecules by lasers in the barrier-suppression regime”, J. Phys. B 38, 2593 (2005).

  • O. I. Tolstikhin, L. B. Madsen and T. Morishita, “Weak-field asymptotic theory of tunneling ionization in many-electron atomic and molecular systems”, Phys. Rev. A 89, 013421 (2014).

  • V. P. Majety and A. Scrinzi, “Static field ionization rates for multi-electron atoms and small molecules”, J. Phys. B 48, 245603 (2015).

  • A. Saenz, “Behavior of molecular hydrogen exposed to strong dc, ac, or low-frequency laser fields. I. Bond softening and enhanced ionization”, Phys. Rev. A 66, 063407 (2002).

Module Attributes

EVALUATION_VERSION

The version of this module's evaluation code, in the identity of every model that evaluates through it; raised whenever the code changes its output (OEP 1, section 4.8).

MOLECULAR_RATES_FILE

The named molecular rate models, each with its reasons.

MolecularForm

The form of a molecular rate: see the module's description.

MolecularCorrection

The correction of the static rate at finite field.

Functions

moadk_rate_au(field_au, ...[, charge])

Return the static molecular tunnelling rate of one electron.

molecular_rate_coverage()

Return the gases each molecular rate model covers, building none of them.

molecular_rate_model(gas, wavelength[, model])

Return the ionisation rate of a molecule, or a named form of it.

molecular_rate_models()

Return every named molecular rate model, at 800 nm.

Classes

MolecularRateModel(gas, wavelength, model, ...)

A named form of the ionisation rate of a molecule, at one wavelength.

optmat.gas.molecular_ionisation_rates.EVALUATION_VERSION: Final = 2#

The version of this module’s evaluation code, in the identity of every model that evaluates through it; raised whenever the code changes its output (OEP 1, section 4.8).

optmat.gas.molecular_ionisation_rates.MOLECULAR_RATES_FILE: Final = PosixPath('/home/docs/checkouts/optmat/checkouts/7/src/optmat/data/gas/molecular_ionisation_rates.toml')#

The named molecular rate models, each with its reasons.

optmat.gas.molecular_ionisation_rates.MolecularCorrection#

The correction of the static rate at finite field.

alias of Literal[‘tong-lin’, ‘none’]

optmat.gas.molecular_ionisation_rates.MolecularForm#

The form of a molecular rate: see the module’s description.

alias of Literal[‘molecular’, ‘moadk’, ‘ppt’, ‘adk’]

class optmat.gas.molecular_ionisation_rates.MolecularRateModel(gas, wavelength, model, form, ionization_energy, ionization_energy_kind, charge=1.0, structure_factors=<factory>, coefficient_squared=nan, coulomb='ilkov', electrons=1.0, static_correction='none', tong_lin_alpha=nan, correction_range=1.5, vibrational_constant=0.0, averaging='tunnelling', channel_sum='integral', adiabatic_ionization_energy=nan, uncertainty_factor=nan, sources=<factory>, reasons=<factory>, *, status='user', status_reason='', modified=(), base='')[source]#

Bases: Identified

A named form of the ionisation rate of a molecule, at one wavelength.

Built by molecular_rate_model() from the curated parameters, or by from_parameters() from a caller’s; with_parameters rebuilds it with any of INPUTS changed. The orientation average structure_factors and the Hartree coefficient are derived, and an override naming them is refused.

Attributes:
gasGas or str

The molecule, or a custom species’ name.

wavelengthfloat

Vacuum wavelength of the field, m; math.inf for a static field. The molecular and ppt forms depend on it.

modelstr

The model’s name in molecular_ionisation_rates.toml.

form{“molecular”, “moadk”, “ppt”, “adk”}

The form of the rate.

ionization_energyfloat

The ionisation energy the rate is evaluated with, J.

ionization_energy_kindstr

adiabatic, vertical or not stated.

chargefloat

The charge seen by the electron: 1, or the fitted effective charge of the ppt form.

structure_factorsdict of int to float

<B^2(m')> of the molecular and moadk forms, averaged over orientations; empty for the other forms.

coefficient_squaredfloat

The Hartree coefficient of the ppt and adk forms; NaN otherwise.

coulomb{“static”, “ilkov”, “popruzhenko”}

The Coulomb factor of the molecular and ppt forms.

electronsfloat

The factor on the rate of the one electron: 1 as the sources give the rates; the number of electrons in the ionising shell in the default model.

static_correction{“tong-lin”, “none”}

The correction of the static rate at finite field.

tong_lin_alphafloat

Its constant; NaN without a correction.

correction_rangefloat

The largest field, in barrier-suppression fields, at which the correction is used: above it the rate is held at its value there (maximum_field).

vibrational_constantfloat

\(c\) of the vibrational factor \(V = e^{c/F^2}\), atomic units of field squared; 0 for fixed nuclei.

averaging{“consistent”, “tunnelling”}

How the cycle-averaged and the instantaneous rates are related (optmat.gas.ionisation_rates.Averaging).

channel_sum{“integral”, “sum”}

How the sum over the above-threshold channels is taken.

adiabatic_ionization_energyfloat

The adiabatic ionisation energy, J, where it differs from the energy of the rate: the energy of the molecule’s ion in its ground state. NaN where not set.

uncertainty_factorfloat

The factor within which the rate is expected to be right; NaN for the forms of the literature.

sourcesdict of str to str

The dataset or paper of each part.

reasonsdict of str to str

Why each choice was made.

DERIVED: ClassVar[tuple[str, ...]] = ('coefficient_squared', 'structure_factors')#

Fields derived from the inputs, which an override may not name.

EVALUATES_THROUGH: ClassVar[tuple[str, ...]] = ('optmat.gas.ionisation_rates', 'optmat.gas.molecular_ionisation_rates')#
EVALUATION_VERSION: ClassVar[int] = 1#
IDENTITY_KIND: ClassVar[str] = 'ionisation_rate'#
INPUTS: ClassVar[tuple[str, ...]] = ('adiabatic_ionization_energy', 'averaging', 'channel_sum', 'charge', 'correction_range', 'coulomb', 'electrons', 'form', 'ionization_energy', 'ionization_energy_kind', 'static_correction', 'structure_coefficients', 'tong_lin_alpha', 'uncertainty_factor', 'vibrational_constant')#

The parameters with_parameters() may change.

adiabatic_ionization_energy: float = nan#
at_wavelength(wavelength)[source]#

Return the same model at another wavelength.

Parameters:
wavelengthfloat

Vacuum wavelength, m; math.inf for a static field.

Returns:
MolecularRateModel

The model at that wavelength.

averaging: Literal['consistent', 'tunnelling'] = 'tunnelling'#
property barrier_suppression_field: float#

The field at which the barrier of a Coulomb potential is suppressed, V/m.

Returns:
float

I_p^2 / 4Z in atomic units, with Z = 1: beyond it no tunnelling rate holds, and none of these forms has a correction.

channel_rates(field_strength)[source]#

Return the rate of each channel: one, the instantaneous rate.

For a linearly polarised field (quasi-static along an elliptical one, which optmat does not validate).

Parameters:
field_strengtharray_like

The field, V/m; its sign is ignored.

Returns:
numpy.ndarray

Rates per molecule, 1/s, shape (1,) + shape(field).

Warns:
ModelRangeWarning

If a field exceeds maximum_field.

channel_sum: Literal['integral', 'sum'] = 'integral'#
charge: float = 1.0#
property citation: str#

The papers of the form in force.

Returns:
str

One line naming them.

coefficient_squared: float = nan#
correction_range: float = 1.5#
coulomb: Literal['static', 'ilkov', 'popruzhenko', 'frequency'] = 'ilkov'#
cycle_averaged_rate(amplitude)[source]#

Return the rate averaged over a cycle of a field of constant amplitude.

For the moadk and adk forms, the static rate at the amplitude times \((3F/\pi F_0)^{1/2}\).

Parameters:
amplitudearray_like

Amplitude of the field, V/m; its sign is ignored.

Returns:
numpy.ndarray

Rate per molecule, 1/s, with the shape of amplitude; 0 at zero field.

Raises:
ValueError

If the form is ppt and the wavelength is infinite.

Warns:
ModelRangeWarning

If a field exceeds maximum_field.

Examples

>>> model = molecular_rate_model("N2", 800e-9, "moadk_zhao_2010")
>>> f"{float(model.cycle_averaged_rate(2.74e10)):.3e}"
'2.077e+11'
electrons: float = 1.0#
property energy_kind: str#

The kind of the ionisation energy the exponent uses.

Returns:
str

vertical, adiabatic or not stated, as the curated dataset states it (ionization_energy_kind).

energy_loss_rate(field_strength)[source]#

Return the energy the ionisation takes from the field, I_p Gamma.

For a linearly polarised field.

Parameters:
field_strengtharray_like

The field, V/m; its sign is ignored.

Returns:
numpy.ndarray

The energy-loss rate, W per molecule, the shape of the field.

Warns:
ModelRangeWarning

If a field exceeds maximum_field.

energy_per_event(field_strength)[source]#

Return the ionisation energy of an event: the one the exponent uses.

Parameters:
field_strengtharray_like

The field, V/m.

Returns:
numpy.ndarray

ionization_energy, J, the shape of the field.

form: Literal['molecular', 'moadk', 'ppt', 'adk']#
classmethod from_parameters(species, wavelength, *, form, ionization_energy, ionization_energy_kind='not stated', structure_coefficients=None, structure_factors=None, charge=1.0, electrons=1.0, coulomb='ilkov', static_correction='none', tong_lin_alpha=nan, correction_range=1.5, vibrational_constant=0.0, averaging='tunnelling', channel_sum='integral', adiabatic_ionization_energy=nan, uncertainty_factor=nan, citation='', model='user', sources=None, reasons=None)[source]#

Return a molecular rate model from explicit parameters.

The curated models are built through it. The orientation average of the molecular and moadk forms is computed from the structure coefficients, and the Hartree coefficient of the ppt and adk forms from the energy and the charge.

Parameters:
speciesGas or str

A curated molecule, or a custom species’ name, the identity’s material.

wavelengthfloat

Vacuum wavelength, m; math.inf for a static field.

form{“molecular”, “moadk”, “ppt”, “adk”}

The form of the rate.

ionization_energyfloat
ionization_energy_kindstr, optional

adiabatic, vertical or not stated.

structure_coefficientsMapping or None, optional

C_l by partial wave (sqrt(sum_m |C_lm|^2)), in Tong et al.’s normalisation, for the molecular and moadk forms.

structure_factorsMapping or None, optional

The orientation average itself, as a curated model stores it, in place of the coefficients.

chargefloat, optional

The charge seen by the electron (the ppt form’s effective charge).

electronsfloat, optional

The factor on the one electron’s rate.

coulombstr, optional

The Coulomb factor.

static_correction{“tong-lin”, “none”}, optional

The correction at finite field, with tong_lin_alpha.

tong_lin_alphafloat, optional

Its constant.

correction_rangefloat, optional

The largest field at which it is used, in barrier-suppression fields, 1.5 by default; above it the rate is held.

vibrational_constantfloat, optional

The vibrational factor’s constant, atomic units of field squared.

averagingstr, optional

consistent or tunnelling.

channel_sumstr, optional

integral or sum.

adiabatic_ionization_energyfloat, optional

J, where it differs from the rate’s.

uncertainty_factorfloat, optional

A stated uncertainty factor; NaN (none) by default.

citationstr, optional

Where the parameters come from.

modelstr, optional

The model’s name, "user" by default.

sourcesMapping or None, optional

The source of each part.

reasonsMapping or None, optional

Why each choice was made.

Returns:
MolecularRateModel

The model, status user.

Raises:
ValueError

If the structure is missing, given twice, or given to a form without one, or as the model’s checks do.

Examples

>>> from optmat.constants import E_CHARGE
>>> model = MolecularRateModel.from_parameters(
...     "N2*", 800e-9, form="moadk", ionization_energy=15.58 * E_CHARGE,
...     structure_coefficients={0: 2.02, 2: 0.78, 4: 0.04})
>>> model.identity.material, sorted(model.structure_factors)
('N2*', [-4, -3, -2, -1, 0, 1, 2, 3, 4])
gas: Gas | str#
instantaneous_rate(field_strength)[source]#

Return the rate at the instantaneous value of a carrier-resolved field.

For the ppt form, the cycle-averaged rate at an amplitude equal to the instantaneous field, divided by \((3F/\pi F_0)^{1/2}\).

Parameters:
field_strengtharray_like

The field, V/m; its sign is ignored.

Returns:
numpy.ndarray

Rate per molecule, 1/s, with the shape of field_strength; 0 at zero field.

Raises:
ValueError

If the form is ppt and the wavelength is infinite.

Warns:
ModelRangeWarning

If a field exceeds maximum_field.

Examples

>>> model = molecular_rate_model("N2", 800e-9, "moadk_zhao_2010")
>>> f"{float(model.instantaneous_rate(2.74e10)):.3e}"
'1.019e+12'
ionization_energy: float#
property ionization_energy_au: float#

The ionisation energy in hartree.

Returns:
float

I_p / E_h.

ionization_energy_kind: str#
keldysh(field_strength)[source]#

Return the Keldysh parameter at a field.

Parameters:
field_strengtharray_like

Field, V/m, > 0.

Returns:
numpy.ndarray

omega kappa / F; 0 for a static field.

property maximum_field: float#

The largest field at which the rate is given without a warning, V/m.

Returns:
float

With Tong and Lin’s correction, correction_range times the barrier-suppression field: the largest field its alpha was fitted to or checked against (TC-828). The barrier-suppression field without a correction.

model: str#
property omega_au: float#

The angular frequency of the field in atomic units.

Returns:
float

hbar omega / E_h; 0 for a static field.

reasons: Mapping[str, str]#
sources: Mapping[str, str]#
static_correction: Literal['tong-lin', 'none'] = 'none'#
structure_factors: Mapping[int, float]#
tong_lin_alpha: float = nan#
uncertainty_factor: float = nan#
vibrational_constant: float = 0.0#
wavelength: float#
with_ionization_energy(ionization_energy, kind)[source]#

Return the same model evaluated with another ionisation energy.

An override (with_parameters()): the Hartree coefficient of the ppt and adk forms is recomputed; the structure coefficients and the effective charge are not, though each was determined with an energy of its own.

Parameters:
ionization_energyfloat

The energy, J, > 0.

kindstr

adiabatic, vertical or a description of where it is from.

Returns:
MolecularRateModel

The model with that energy, status user.

optmat.gas.molecular_ionisation_rates.isotropic_structure_factors(coefficients)[source]#

Return <B^2(m’)> averaged over the orientations of the molecule.

The average of |sum_l C_l D^l_{m'm}(R) Q(l, m')|^2 over the Euler angles is sum_l C_l^2 Q(l, m')^2 / (2l + 1), by the orthogonality of the rotation matrices; it does not depend on the orbital’s own m.

Parameters:
coefficientsmapping of int to float

C_l by partial wave l, in Tong et al.’s normalisation (eq. 2).

Returns:
dict of int to float

<B^2(m')> for every m' from -l_max to l_max.

optmat.gas.molecular_ionisation_rates.moadk_rate_au(field_au, ionization_energy_au, structure_factors, charge=1.0)[source]#

Return the static molecular tunnelling rate of one electron.

Tong, Zhao and Lin (2002), eqs. (7) and (9):

\[w(F) = \sum_{m'} \frac{B^2(m')}{2^{|m'|}\, |m'|!}\, \frac{1}{\kappa^{2Z/\kappa - 1}} \left(\frac{2\kappa^3}{F}\right)^{2Z/\kappa - |m'| - 1} e^{-2\kappa^3/3F}.\]
Parameters:
field_aunumpy.ndarray

Static field, atomic units, > 0.

ionization_energy_aufloat

Ionisation energy of the orbital, hartree, > 0.

structure_factorsmapping of int to float

\(B^2(m')\) by \(m'\), every \(m'\) of either sign: isotropic_structure_factors() for an unaligned molecule.

chargefloat, optional

Charge \(Z\) of the ion left behind.

Returns:
numpy.ndarray

Rate, atomic units, with the shape of field_au.

Examples

Hydrogen 1s (\(C_0 = 2\)) gives \((4/F) e^{-2/3F}\):

>>> import numpy as np
>>> factors = isotropic_structure_factors({0: 2.0})
>>> w = moadk_rate_au(np.array(0.05), 0.5, factors)
>>> f"{float(w) / (4 / 0.05 * np.exp(-2 / 0.15)):.12f}"
'1.000000000000'
optmat.gas.molecular_ionisation_rates.molecular_rate_coverage()[source]#

Return the gases each molecular rate model covers, building none of them.

Returns:
dict of str to tuple of Gas

Each model of molecular_rate_models() and its gases, in file order, read from molecular_ionisation_rates.toml alone; the default model’s are the molecules optmat gives an ionisation rate for.

Examples

>>> [gas.value for gas in molecular_rate_coverage()["ppt_talebpour"]]
['D2', 'N2', 'O2']
optmat.gas.molecular_ionisation_rates.molecular_rate_model(gas, wavelength, model='default')[source]#

Return the ionisation rate of a molecule, or a named form of it.

default is optmat’s rate (TC-677 to TC-680); the others are the forms of the literature (TC-673).

Parameters:
gasGas or str

The molecule.

wavelengthfloat

Vacuum wavelength of the field, m, > 0; math.inf for a static field (not for the ppt form).

modelstr, optional

A name of molecular_rate_models(): default, moadk_zhao_2010, moadk_zhao_2017, moadk_tong_2002, ppt_talebpour, ppt_talebpour_ilkov or adk_hydrogenic.

Returns:
MolecularRateModel

The model.

Raises:
DataError

If the model is unknown or is not given for the molecule.

Examples

>>> model = molecular_rate_model("O2", 800e-9, "ppt_talebpour")
>>> model.charge, model.form
(0.53, 'ppt')
>>> nitrogen = molecular_rate_model("N2", 800e-9)
>>> nitrogen.form, nitrogen.electrons, nitrogen.ionization_energy_kind
('molecular', 2.0, 'vertical')
optmat.gas.molecular_ionisation_rates.molecular_rate_models()[source]#

Return every named molecular rate model, at 800 nm.

Returns:
dict of str to dict of Gas to MolecularRateModel

The models by name and molecule.

Examples

>>> sorted(molecular_rate_models())
['adk_hydrogenic', 'default', 'moadk_tong_2002', 'moadk_zhao_2010',
 'moadk_zhao_2017', 'ppt_talebpour', 'ppt_talebpour_ilkov']