optmat.gas.ionisation_validation#
Test the ionisation-rate models against the curated references (TC-660).
Nothing in optmat.gas.ionisation_rates is fitted to a rate or a yield, except
helium’s effective number of electrons, which is set on Parker et al.’s static rates
(TC-658). Every reference is therefore a validator, and this module predicts each one
from a model and returns the comparison. The references, in the order of their rank
(TC-439):
static rates from all-electron calculations (helium) and from exact solutions for one electron in a model potential (argon);
rates in a laser field from the two-electron calculations of helium, as the fits their authors publish (Parker et al. 2007, eq. 5);
measured yields: Wahlstrand et al.’s (2018) absolute yields of argon, krypton and xenon for a 42 fs pulse, as their published fits, and Wallace et al.’s (2016) yields for a 5.5 fs pulse on a free scale, whose intensities are fixed by atomic hydrogen;
yields from time-dependent Schrödinger calculations for one electron in Tong and Lin’s model potentials (
travers_2026_trecx), to compare with theone_electronmodel.
A yield is the ionised fraction after a pulse, \(1 - \exp(-\int W\,dt)\)
(ionised_fraction()), with the rate taken along the pulse in one of two ways
(pulse_yield()): the instantaneous rate on the carrier-resolved field, or the
cycle-averaged rate on the envelope.
SI throughout: intensities in W/m2 (cycle averaged, \(I = \varepsilon_0 c F^2/2\) for an amplitude \(F\)), durations in s.
Module Attributes
The static references of each gas: dataset, the model to compare, and a label. |
|
The all-electron rates at 390 nm, by gas: dataset and label (TC-700, TC-701). |
|
The yields of the one-electron calculations, by gas: dataset and measure. |
|
Tong and Lin's constant of the static correction for atomic hydrogen (TC-833). |
|
The one-electron calculations of hydrogen against intensity, and their pulses. |
|
Bauer and Deng's calculations of hydrogen against the frequency at fixed field. |
|
haCC's all-electron argon, the norm-loss 1000 au after the pulse: A2's 6 fs pulse with 4 and 3 ion channels and with mMax 1, and a 20 fs pulse (TC-847, TC-861). |
|
haCC's yields with one electron run at exactly their ionisation energy and pulse (TC-861); the others interpolate between |
|
One electron (m = 0) at two of haCC's ionisation energies, the same pulse and measure: the reference haCC's yields are divided by (TC-847). |
|
Uiterwaal et al.'s saturation intensities at 248.6 nm, 500 fs (TC-853). |
|
The atoms of Tolstikhina et al.'s Table I that optmat curates (TC-852). |
|
Published many-electron calculations and one electron in their pulses (TC-858). |
|
Helium at 390 nm with two electrons (and haCC's) against one electron at the same ionisation energy, pulse and measure, the norm-loss 1000 au after the pulse (TC-1050). |
|
Helium's calculations against each other on measures converged in the box (TC-1092). |
|
Xenon's all-electron RMT calculation against one 5p electron in its field (TC-1093). |
|
Xenon's ground-state survival after a few-cycle pulse: the dataset, its pulse's wavelength (m) and full width at half maximum of the intensity (s), and whether its intensities are RMT's labels of the field (TC-1093, TC-1094). |
|
The one-electron calculation of argon in Wahlstrand et al.'s 42 fs pulse (TC-702). |
|
The one-electron calculations in Wallace et al.'s pulse, at phases 0 and pi/2. |
Functions
|
Return the amplitude of the field of a cycle-averaged intensity. |
|
Return the fraction a circularly polarised Gaussian pulse ionises. |
|
Return the times, the envelope and the field of a pulse counted in cycles. |
|
Return the yield of a thin target across a Gaussian beam, up to a constant. |
|
Return the times, the envelope and the field of a Gaussian pulse. |
Compare haCC's argon atom with one electron at its ionisation energy. |
|
|
Compare helium's rate at 390 and 780 nm with Parker et al.'s. |
Compare helium's calculations on matched, box-converged measures. |
|
Compare helium's two-electron and haCC yields at 390 nm with one electron's. |
|
|
Return the rate of atomic hydrogen built as optmat's |
|
Compare the hydrogen model with Bauer and Deng's yields against the frequency. |
|
Compare the hydrogen model with the one-electron calculations of hydrogen. |
|
Test a model on Wallace et al.'s yields, whose scale is free. |
|
Return the fraction ionised by the end of a pulse. |
|
Compare argon's yield of a 42 fs pulse at 800 nm with the one-electron TDSE. |
|
Test a model on the measured points of Wallace et al.'s krypton yield. |
|
Compare the yield of a 42 fs pulse at 800 nm with Wahlstrand et al.'s. |
|
Return the fraction of helium that Parker et al.'s rate ionises over a pulse. |
|
Return Parker et al.'s fit of the ionisation rate of helium in a laser field. |
|
Compare a model with a measured phase shift through a laser plasma. |
|
Return the phase a probe picks up from the electrons a focused pump leaves. |
Compare published many-electron calculations with one electron in their pulses. |
|
|
Return the fraction a pulse at the model's wavelength ionises. |
|
Compare a gas's rate at 390 nm with van der Hart's all-electron rates. |
|
Test a model against Uiterwaal et al.'s saturation intensity of an atom. |
|
Compare the static rate of a gas with its curated references. |
|
Put the one-electron calculation in Wallace et al.'s pulse through their test. |
|
Compare the yields of short pulses with the one-electron calculations. |
|
Return Wallace et al.'s fit of their measured yield, on its free scale. |
Compare the atoms' weak-field coefficients with the model's one electron. |
|
Compare RMT's xenon with one electron in its field and with its measure. |
|
|
Predict xenon's ground-state depletion after Hartmann et al.'s pulses. |
Classes
|
An atom's all-electron yield over one electron's at the same ionisation energy. |
|
A model against a measured phase shift of a probe through a laser plasma. |
|
A model against the measured points of a yield whose scale is free. |
|
A model's prediction of one reference. |
|
A model's saturation of an atom against a measured saturation intensity. |
|
How far a model's intensities must be scaled to match a measured yield. |
|
An atom's ground-state depletion against one electron's in the same pulse. |
|
An atom's weak-field rate over the model's one electron. |
|
One calculation's yield over another's, in one pulse and with one measure. |
- class optmat.gas.ionisation_validation.AtomRatio(reference, ionization_energy, intensity, atom, one_electron)[source]#
Bases:
objectAn atom’s all-electron yield over one electron’s at the same ionisation energy.
- Attributes:
- referencestr
The all-electron dataset.
- ionization_energyfloat
Its effective ionisation energy, hartree.
- intensitynumpy.ndarray
The peak intensities, W/m^2.
- atomnumpy.ndarray
The atom’s norm-loss.
- one_electronnumpy.ndarray
One m = 0 electron’s at the same energy: the logarithm of the two calculations of
IP_MATCHED_YIELDSinterpolated linearly in the ionisation energy.
- atom: Float[ndarray, 'n']#
- intensity: Float[ndarray, 'n']#
- one_electron: Float[ndarray, 'n']#
- property ratio: Float[ndarray, 'n']#
The atom’s yield over one electron’s.
- Returns:
- numpy.ndarray
The ratio at each intensity.
- optmat.gas.ionisation_validation.HACC_REFERENCES: Mapping[str, str] = {'travers_2026_trecx/hacc_normloss_gauss20_Ar_c3': 'travers_2026_trecx/normloss_ipmatched_c3_20fs_Ar_m0', 'travers_2026_trecx/hacc_normloss_gauss6_Ar_c3': 'travers_2026_trecx/normloss_ipmatched_c3_Ar_m0'}#
haCC’s yields with one electron run at exactly their ionisation energy and pulse (TC-861); the others interpolate between
IP_MATCHED_YIELDS.
- optmat.gas.ionisation_validation.HACC_YIELDS: tuple[str, ...] = ('travers_2026_trecx/hacc_normloss_gauss6_Ar_c4', 'travers_2026_trecx/hacc_normloss_gauss6_Ar_c3', 'travers_2026_trecx/hacc_normloss_gauss6_Ar_c3m1', 'travers_2026_trecx/hacc_normloss_gauss20_Ar_c3')#
haCC’s all-electron argon, the norm-loss 1000 au after the pulse: A2’s 6 fs pulse with 4 and 3 ion channels and with mMax 1, and a 20 fs pulse (TC-847, TC-861).
- optmat.gas.ionisation_validation.HELIUM_MATCHED: Mapping[str, str] = {'travers_2026_pyroraptor/hacc1_above4_gauss6_390nm_He': 'travers_2026_pyroraptor/twoelectron_above4_gauss6_390nm_He', 'travers_2026_pyroraptor/hacc1_above5_gauss6_390nm_He': 'travers_2026_pyroraptor/twoelectron_above5_gauss6_390nm_He', 'travers_2026_pyroraptor/hacc1_outside20_sin2_800nm_He': 'sato_2016/fig6_casscf_He_800nm', 'travers_2026_pyroraptor/hacc5_above4_gauss6_390nm_He': 'travers_2026_pyroraptor/twoelectron_above4_gauss6_390nm_He', 'travers_2026_pyroraptor/hacc5_above5_gauss6_390nm_He': 'travers_2026_pyroraptor/twoelectron_above5_gauss6_390nm_He', 'travers_2026_pyroraptor/hacc5_outside20_sin2_800nm_He': 'sato_2016/fig6_casscf_He_800nm', 'travers_2026_pyroraptor/twoelectron_above4_gauss6_390nm_He': 'travers_2026_pyroraptor/sae_above4_gauss6_390nm_He'}#
Helium’s calculations against each other on measures converged in the box (TC-1092).
At 390 nm, in A2’s 6 fs pulse, the population above the shells n <= 4 or n <= 5 1000 au after the pulse: two electrons over one, and haCC over two electrons; at 800 nm, in Sato et al.’s sin^2 pulse, haCC’s probability outside 20 au over their MCTDHF.
- optmat.gas.ionisation_validation.HELIUM_TWO_ELECTRON: Mapping[str, str] = {'travers_2026_trecx/hacc_normloss_gauss6_390nm_He': 'travers_2026_trecx/normloss_ipmatched_390nm_base_He', 'travers_2026_trecx/twoelectron_normloss_gauss6_390nm_He': 'travers_2026_trecx/normloss_ipmatched_390nm_base_He', 'travers_2026_trecx/twoelectron_normloss_gauss6_390nm_He_m5': 'travers_2026_trecx/normloss_ipmatched_390nm_m5_He'}#
Helium at 390 nm with two electrons (and haCC’s) against one electron at the same ionisation energy, pulse and measure, the norm-loss 1000 au after the pulse (TC-1050).
- optmat.gas.ionisation_validation.HYDROGEN_ALPHA = 'tong_2005/alpha_H'#
Tong and Lin’s constant of the static correction for atomic hydrogen (TC-833).
- optmat.gas.ionisation_validation.HYDROGEN_SPECTRA: tuple[str, ...] = ('bauer_2018/fig7_tdse_H_spectrum_F002', 'bauer_2018/fig8_tdse_H_spectrum_F0063')#
Bauer and Deng’s calculations of hydrogen against the frequency at fixed field.
- optmat.gas.ionisation_validation.HYDROGEN_YIELDS: Mapping[str, tuple[float, float] | None] = {'bauer_2018/fig1_tdse_H_800nm': (2.0, 10.0), 'bauer_2018/fig5a_tdse_H_800nm': (2.0, 10.0), 'bauer_2018/fig6a_tdse_H_400nm': (2.0, 10.0), 'le_2016/fig12a_tdse_H_400nm': (6.0, 0.0), 'le_2016/fig12b_tdse_H_800nm': (3.0, 0.0), 'le_2016/fig12c_tdse_H_1600nm': (3.0, 0.0), 'travers_2026_trecx/ionised_gauss15_400nm_H': None, 'travers_2026_trecx/ionised_gauss15_800nm_H': None, 'zhao_2016/fig2a_tdse_H_600nm': None, 'zhao_2016/fig2b_tdse_H_800nm': None, 'zhao_2016/fig2c_tdse_H_1000nm': None, 'zhao_2016/fig2d_tdse_H_1200nm': None}#
The one-electron calculations of hydrogen against intensity, and their pulses.
None: the dataset’s Gaussian (
pulse_fsthe full width at half maximum of the intensity, as Zhao et al.’s own PPT curves are reproduced with). Otherwise the(ramp, plateau)cycles ofcycle_pulse(): Le et al.’s \(\sin^2\) pulses of 12 and 6 cycles, taken on the field (which their PPT curves favour; on the intensity the model’s yield is about 1.35 times higher), and Bauer and Deng’s 2-10-2 flat top (TC-833 to TC-835, TC-843).
- optmat.gas.ionisation_validation.IP_MATCHED_YIELDS: tuple[str, ...] = ('travers_2026_trecx/normloss_ipmatched_ci_Ar_m0', 'travers_2026_trecx/normloss_ipmatched_c3m1_Ar_m0')#
One electron (m = 0) at two of haCC’s ionisation energies, the same pulse and measure: the reference haCC’s yields are divided by (TC-847).
- optmat.gas.ionisation_validation.LONG_PULSE_YIELD = 'travers_2026_trecx/ionised_gauss42_Ar_m0'#
The one-electron calculation of argon in Wahlstrand et al.’s 42 fs pulse (TC-702).
- optmat.gas.ionisation_validation.PUBLISHED_ATOMS: Mapping[str, str] = {'pathak_2020/fig2_sae_Ar': 'travers_2026_trecx/outside20_sin2_m1mk_ArMK_m0', 'pathak_2020/fig2_tdcasscf_Ar': 'travers_2026_trecx/outside20_sin2_m1_Ar_m0', 'pathak_2022/fig2_tdcasscf_Kr': 'travers_2026_trecx/outside20_sin2_m2_Kr_m0', 'sato_2016/fig6_casscf_He_800nm': 'travers_2026_trecx/outside20_sin2_m4_He', 'sato_2018/fig3a_casscf_Ar_800nm': 'travers_2026_trecx/outside20_sin2_m3_Ar_m0'}#
Published many-electron calculations and one electron in their pulses (TC-858).
Each published curve (the authors’ best many-electron calculation, TD-CASSCF; and Pathak et al. 2020’s own single-active-electron curve, against one electron in their potential) with tRecX’s one m = 0 electron in the same sin^2 pulse, read with the same measure: the probability outside 20 au at the end of the pulse.
- class optmat.gas.ionisation_validation.PhaseShiftTest(gas, reference, model, polarization, intensity, measured, sigma, predicted, scale, rescaled)[source]#
Bases:
objectA model against a measured phase shift of a probe through a laser plasma.
- Attributes:
- gasGas
The gas.
- referencestr
The key of the measured dataset.
- modelstr
The rate model.
- polarizationstr
The pump’s polarisation, linear or circular.
- intensitynumpy.ndarray
The measurement’s peak intensities, W/m^2.
- measurednumpy.ndarray
The measured phase shift, rad, at the pressure the dataset is normalised to.
- sigmanumpy.ndarray
Its uncertainty, rad; NaN where none is drawn.
- predictednumpy.ndarray
The model’s phase shift at the measurement’s intensities, rad.
- scalefloat
The factor on the measurement’s intensities at which the model’s phase shift fits the measured one best (in the logarithm, weighted by the error bars). Below 1: the model ionises too much.
- rescalednumpy.ndarray
The model’s phase shift at the scaled intensities, rad.
- intensity: Float[ndarray, 'n']#
- measured: Float[ndarray, 'n']#
- predicted: Float[ndarray, 'n']#
- property ratio: Float[ndarray, 'n']#
Model over measurement at the measurement’s own intensities.
- Returns:
- numpy.ndarray
The ratio of the phase shifts at each intensity.
- rescaled: Float[ndarray, 'n']#
- sigma: Float[ndarray, 'n']#
- class optmat.gas.ionisation_validation.PointsTest(gas, model, scale, calibration, chi_square, chi_square_unscaled, spread, intensity, measured, sigma, predicted, unscaled)[source]#
Bases:
objectA model against the measured points of a yield whose scale is free.
- Attributes:
- gasGas
The gas.
- modelstr
The rate model.
- scalefloat
The factor on the measurement’s intensities at which the model fits the points best. Below 1: the model ionises too much.
- calibrationfloat
The relative standard uncertainty of the measurement’s intensities.
- chi_squarefloat
The sum of the squared residuals over the printed errors at that scale, the amplitude fitted.
- chi_square_unscaledfloat
The same at the measurement’s own intensities (a scale of 1).
- spreadfloat
Root mean square of model over measurement less 1, at the best scale.
- intensitynumpy.ndarray
The measurement’s peak intensities, W/m^2.
- measurednumpy.ndarray
The measured yields, on their free scale.
- sigmanumpy.ndarray
Their printed errors.
- predictednumpy.ndarray
The model’s yield at the scaled intensities, times the fitted amplitude.
- unscalednumpy.ndarray
The same at a scale of 1.
- intensity: Float[ndarray, 'n']#
- measured: Float[ndarray, 'n']#
- predicted: Float[ndarray, 'n']#
- sigma: Float[ndarray, 'n']#
- unscaled: Float[ndarray, 'n']#
- optmat.gas.ionisation_validation.RMATRIX_RATES: Mapping[str, tuple[tuple[str, str], ...]] = {'Ar': (('vanderhart_2006/fig6_floquet_Ar', 'R-matrix Floquet (van der Hart 2006)'), ('vanderhart_2007/table1_one_state_Ar', 'time-dependent R-matrix (van der Hart 2007, Table I)'), ('vanderhart_2007/fig4_td_rmatrix_Ar', 'time-dependent R-matrix (van der Hart 2007, Fig. 4)')), 'He': (('vanderhart_2006/fig6_floquet_He', 'R-matrix Floquet (van der Hart 2006)'),), 'Ne': (('vanderhart_2006/fig6_floquet_Ne', 'R-matrix Floquet (van der Hart 2006)'),)}#
The all-electron rates at 390 nm, by gas: dataset and label (TC-700, TC-701).
- class optmat.gas.ionisation_validation.RateComparison(gas, reference, label, model, quantity, wavelength, x, expected, predicted)[source]#
Bases:
objectA model’s prediction of one reference.
- Attributes:
- gasGas or str
The gas, or
"H"for atomic hydrogen (hydrogen_yields()).- referencestr
The dataset or formula compared with,
source/id.- labelstr
What the reference is.
- modelstr
The name of the rate model.
- quantitystr
static rate(atomic units, against the field in V/m),rate(atomic units, cycle averaged, against the intensity in W/m^2),yield(against the peak intensity in W/m^2) ordepletion(-ln P, P the ground-state survival, against the peak intensity in W/m^2).- wavelengthfloat
Wavelength of the field, m;
math.inffor a static field.- xnumpy.ndarray
The field or the intensity.
- expectednumpy.ndarray
The reference’s values.
- predictednumpy.ndarray
The model’s.
- expected: Float[ndarray, 'n']#
- predicted: Float[ndarray, 'n']#
- property ratio: Float[ndarray, 'n']#
The model’s value over the reference’s.
- Returns:
- numpy.ndarray
predicted / expected.
- x: Float[ndarray, 'n']#
- optmat.gas.ionisation_validation.SATURATION_INTENSITIES: Mapping[str, str] = {'Ar': 'uiterwaal_1998/isat_Ar', 'He': 'uiterwaal_1998/isat_He', 'Kr': 'uiterwaal_1998/isat_Kr'}#
Uiterwaal et al.’s saturation intensities at 248.6 nm, 500 fs (TC-853).
- optmat.gas.ionisation_validation.STATIC_REFERENCES: Mapping[str, tuple[tuple[str, str, str], ...]] = {'Ar': (('jagau_2016/tableS5_ccsd_Ar', 'default', 'Jagau 2016, CCSD, all electrons'), ('zhang_2014/tableIX_tonglin_Ar', 'one_electron', 'Zhang et al. 2014, one electron, Tong-Lin potential'), ('zhang_2014/tableIX_gsz_Ar', 'one_electron', 'Zhang et al. 2014, one electron, GSZ potential'), ('zhang_2014/tableIX_muller_Ar', 'one_electron', 'Zhang et al. 2014, one electron, Muller potential'), ('travers_2026_trecx/static_Ar_m0', 'one_electron', 'tRecX, one electron, Tong-Lin potential'), ('bahl_2016/rate_Ar', 'one_electron', 'Bahl et al. 2016, one electron')), 'He': (('parker_2009/table1_present', 'default', 'Parker et al. 2009, two electrons'), ('scrinzi_1999/table1_He', 'default', 'Scrinzi et al. 1999, two electrons'), ('majety_2015/table1_hacc5_He', 'default', 'Majety & Scrinzi 2015, haCC(5)'), ('jagau_2016/tableS3_fci_He', 'default', 'Jagau 2016, FCI')), 'Kr': (('bahl_2016/rate_Kr', 'one_electron', 'Bahl et al. 2016, one electron'), ('travers_2026_trecx/static_Kr_m0', 'one_electron', "tRecX, one electron, Zhang et al.'s GSZ potential"), ('santra_2006/total_Kr', 'default', 'Santra et al. 2006, spin-orbit, all 4p electrons')), 'Ne': (('jagau_2016/tableS4_ccsd_Ne', 'default', 'Jagau 2016, CCSD, all electrons'), ('bahl_2016/rate_Ne', 'one_electron', 'Bahl et al. 2016, one electron')), 'Xe': (('bahl_2016/rate_Xe', 'one_electron', 'Bahl et al. 2016, one electron'), ('travers_2026_trecx/static_Xe_m0', 'one_electron', "tRecX, one electron, Zhang et al.'s Tong-Lin-form potential"))}#
The static references of each gas: dataset, the model to compare, and a label.
An all-electron rate tests the default; the rate of one electron in a model potential tests the
one_electronmodel, which leaves out the effective number of electrons and the fine structure of the ion.
- class optmat.gas.ionisation_validation.SaturationTest(gas, model, measured, sigma, saturation, exponent, keldysh)[source]#
Bases:
objectA model’s saturation of an atom against a measured saturation intensity.
- Attributes:
- gasGas
The atom.
- modelstr
The rate model.
- measuredfloat
The measured saturation intensity, W/m^2.
- sigmafloat
Its stated uncertainty, W/m^2.
- saturationfloat
The model’s: the peak intensity at which the integral of its rate over the pulse is 1, W/m^2.
- exponentfloat
The integral of the model’s rate over the pulse at the measured saturation intensity: 1 if the model matches, the factor by which its rate is high otherwise.
- keldyshfloat
The Keldysh parameter at the measured saturation intensity.
- class optmat.gas.ionisation_validation.ScaleTest(gas, model, scale, calibration, residual, intensity, measured, predicted, unscaled)[source]#
Bases:
objectHow far a model’s intensities must be scaled to match a measured yield.
- Attributes:
- gasGas
The gas.
- modelstr
The rate model.
- scalefloat
The factor on the measurement’s intensities at which the model’s yield has the measurement’s dependence on intensity. Below 1: the model ionises too much.
- calibrationfloat
The relative standard uncertainty of the measurement’s intensities.
- residualfloat
Root mean square of the decimal logarithm of model over measurement at that scale, after the free amplitude is removed.
- intensitynumpy.ndarray
The peak intensities compared at, W/m^2.
- measurednumpy.ndarray
The measured yield there, on its free scale.
- predictednumpy.ndarray
The model’s focal-averaged yield at the scaled intensities, times the amplitude that fits it to the measurement.
- unscalednumpy.ndarray
The same at the measurement’s own intensities (a scale of 1).
- intensity: Float[ndarray, 'n']#
- measured: Float[ndarray, 'n']#
- predicted: Float[ndarray, 'n']#
- unscaled: Float[ndarray, 'n']#
- class optmat.gas.ionisation_validation.SurvivalRatio(reference, intensity, atom, m0, m1)[source]#
Bases:
objectAn atom’s ground-state depletion against one electron’s in the same pulse.
- Attributes:
- referencestr
The atom’s ground-state survival.
- intensitynumpy.ndarray
The peak intensities, W/m^2, as the reference labels them.
- atomnumpy.ndarray
The atom’s survival.
- m0numpy.ndarray
One electron’s survival in the orbital with m = 0, at the same ionisation energy, pulse and measure.
- m1numpy.ndarray
The same with m = 1.
- atom: Float[ndarray, 'n']#
- intensity: Float[ndarray, 'n']#
- m0: Float[ndarray, 'n']#
- m1: Float[ndarray, 'n']#
- property per_m0: Float[ndarray, 'n']#
The atom’s depletion in electrons with m = 0.
- Returns:
- numpy.ndarray
\(\ln P_{atom} / \ln P_0\).
- property per_shell: Float[ndarray, 'n']#
The atom’s depletion over that of the shell’s six independent electrons.
- Returns:
- numpy.ndarray
\(\ln P_{atom} / (2 \ln P_0 + 4 \ln P_1)\): two electrons with m = 0 and four with m = +1 or -1.
- optmat.gas.ionisation_validation.TDSE_YIELDS: Mapping[str, tuple[tuple[str, str], ...]] = {'Ar': (('travers_2026_trecx/ionised_gauss6_Ar_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_gauss10_400nm_Ar_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_gauss10_1030nm_Ar_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_gauss10_800nm_Ar_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_wallace_cep0_Ar_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_wallace_cep90_Ar_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_gauss30_400nm_Ar_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_gauss30_1030nm_Ar_m0', 'the ionised fraction')), 'He': (('travers_2026_trecx/ionised_gauss6_He', 'the ionised fraction'),), 'Kr': (('travers_2026_trecx/ionised_gauss6_Kr_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_wallace_cep0_Kr_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_wallace_cep90_Kr_m0', 'the ionised fraction')), 'Xe': (('travers_2026_trecx/ionised_gauss6_Xe_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_wallace_cep0_Xe_m0', 'the ionised fraction'), ('travers_2026_trecx/ionised_wallace_cep90_Xe_m0', 'the ionised fraction'))}#
The yields of the one-electron calculations, by gas: dataset and measure.
The ionised fraction, the bound states up to n = 10 subtracted (TC-812); for argon at 800 nm (6 fs), 400 nm (10 fs, TC-824), 1030 nm (10 fs, TC-826) and 800 nm with the same 10 fs pulse (TC-830); Wallace et al.’s 5.5 fs pulse at 800 nm with carrier-envelope phases 0 and pi/2 (TC-836), each compared at its own phase; 30 fs at 400 and 1030 nm (TC-844); krypton and xenon in A2’s 6 fs pulse (TC-845). The first runs’ measures (
chi_gauss_*,norm_gauss_*,isurff_cos8_*) count Rydberg states as ionised or miss part of the continuum (TC-703), and are not compared.
- optmat.gas.ionisation_validation.WALLACE_TDSE: Mapping[str, tuple[str, str]] = {'Ar': ('travers_2026_trecx/ionised_wallace_cep0_Ar_m0', 'travers_2026_trecx/ionised_wallace_cep90_Ar_m0'), 'Kr': ('travers_2026_trecx/ionised_wallace_cep0_Kr_m0', 'travers_2026_trecx/ionised_wallace_cep90_Kr_m0'), 'Xe': ('travers_2026_trecx/ionised_wallace_cep0_Xe_m0', 'travers_2026_trecx/ionised_wallace_cep90_Xe_m0')}#
The one-electron calculations in Wallace et al.’s pulse, at phases 0 and pi/2.
- optmat.gas.ionisation_validation.WEAK_FIELD_ATOMS: tuple[str, ...] = ('He', 'Ne', 'Ar', 'Kr', 'Xe')#
The atoms of Tolstikhina et al.’s Table I that optmat curates (TC-852).
- class optmat.gas.ionisation_validation.WeakFieldFactor(gas, kappa, atom, one_electron)[source]#
Bases:
objectAn atom’s weak-field rate over the model’s one electron.
- Attributes:
- gasGas
The atom.
- kappafloat
The Hartree-Fock orbital exponent at which both coefficients are compared, au.
- atomfloat
The atom’s coefficient g of the many-electron weak-field asymptotic theory (Hartree-Fock, with relaxation and the occupation factor).
- one_electronfloat
The model’s one electron’s on the same scale, from its structure coefficient.
- optmat.gas.ionisation_validation.XENON_RMT: Mapping[str, tuple[str, str]] = {'hartmann_2022/rmt_ground_survival_Xe': ('travers_2026_trecx/ground_survival_rmtpulse_m0_Xe', 'travers_2026_trecx/ground_survival_rmtpulse_m1_Xe'), 'hartmann_2022/rmt_ground_survival_Xe@unscaled': ('travers_2026_trecx/ground_survival_rmtpulse_m0_unscaled_Xe', 'travers_2026_trecx/ground_survival_rmtpulse_m1_unscaled_Xe')}#
Xenon’s all-electron RMT calculation against one 5p electron in its field (TC-1093).
The ground-state survival at the end of RMT’s run, against one electron with m = 0 and m = 1 read at the same time, at RMT’s ionisation energy and (
@unscaled) at the potential’s own, 0.18 % deeper.
- optmat.gas.ionisation_validation.XENON_SURVIVAL: Mapping[str, tuple[float, float, bool]] = {'hartmann_2022/measured_neutral_abundance_Xe': (7.6e-07, 4.5e-15, False), 'hartmann_2022/rmt_ground_survival_Xe': (7.594e-07, 5.297e-15, True)}#
Xenon’s ground-state survival after a few-cycle pulse: the dataset, its pulse’s wavelength (m) and full width at half maximum of the intensity (s), and whether its intensities are RMT’s labels of the field (TC-1093, TC-1094).
- class optmat.gas.ionisation_validation.YieldRatio(reference, against, intensity, value, against_value)[source]#
Bases:
objectOne calculation’s yield over another’s, in one pulse and with one measure.
- Attributes:
- referencestr
The dataset compared.
- againststr
The dataset it is divided by.
- intensitynumpy.ndarray
The peak intensities, W/m^2.
- valuenumpy.ndarray
reference’s yields.- against_valuenumpy.ndarray
against’s at the same intensities.
- against_value: Float[ndarray, 'n']#
- intensity: Float[ndarray, 'n']#
- property rate_ratio: Float[ndarray, 'n']#
The ratio of the two in rate form.
- Returns:
- numpy.ndarray
\(\ln(1 - Y) / \ln(1 - Y')\): the ratio of the rates integrated over the pulse, if the yield is \(1 - \exp(-\int W dt)\); for one calculation over one electron’s, an effective number of electrons.
- property ratio: Float[ndarray, 'n']#
The yield over the other’s.
- Returns:
- numpy.ndarray
value / against_value.
- value: Float[ndarray, 'n']#
- optmat.gas.ionisation_validation.amplitude(intensity)[source]#
Return the amplitude of the field of a cycle-averaged intensity.
- Parameters:
- intensityarray_like
Intensity, W/m2.
- Returns:
- numpy.ndarray
\(F = (2I/\varepsilon_0 c)^{1/2}\), V/m.
Examples
1e14 W/cm2:
>>> f"{float(amplitude(1e18)):.4e}" '2.7449e+10'
- optmat.gas.ionisation_validation.circular_yield(model, peak_intensity, fwhm)[source]#
Return the fraction a circularly polarised Gaussian pulse ionises.
The field of circular polarisation turns at a constant magnitude \(F = \sqrt{I/\varepsilon_0 c}\) within a cycle, so the rate,
circular_rate(), is followed along the envelope (TC-820).- Parameters:
- modelIonisationRateModel
The rate, at the pulse’s wavelength.
- peak_intensityfloat
Peak intensity, W/m^2.
- fwhmfloat
Full width at half maximum of the intensity, s.
- Returns:
- float
The ionised fraction after the pulse.
- optmat.gas.ionisation_validation.cycle_pulse(peak_intensity, wavelength, ramp_cycles, plateau_cycles=0.0, *, cep=0.0)[source]#
Return the times, the envelope and the field of a pulse counted in cycles.
The vector potential is \(A(t) = -(F_0/\omega)\, e(t) \sin(\omega t + \varphi)\), the field \(-dA/dt\), with the envelope rising as \(\sin^2\) over
ramp_cycles, flat overplateau_cyclesand falling as \(\sin^2\) overramp_cycles: with no plateau a \(\sin^2\) pulse of \(2 \times\)ramp_cyclescycles in all, with one the flat-top pulse of Bauer and Deng (2018; 2-cycle ramps and a 10-cycle plateau). The time origin is the pulse’s centre.- Parameters:
- peak_intensityfloat
Peak of the cycle-averaged intensity, W/m2.
- wavelengthfloat
Carrier wavelength, m.
- ramp_cyclesfloat
Cycles of each \(\sin^2\) ramp, > 0.
- plateau_cyclesfloat, optional
Cycles of the plateau, >= 0.
- cepfloat, optional
Carrier-envelope phase \(\varphi\), rad, relative to the centre.
- Returns:
- tuple of numpy.ndarray
The times (s), the amplitude of the envelope (V/m) and the field (V/m), on a uniform grid of 96 points per cycle.
Examples
A 2-10-2 flat top at 800 nm lasts 14 cycles, 37.4 fs:
>>> times, envelope, field = cycle_pulse(1e18, 800e-9, 2, 10) >>> f"{(times[-1] - times[0]) * 1e15:.1f}" '37.4'
- optmat.gas.ionisation_validation.focal_average(intensity, local)[source]#
Return the yield of a thin target across a Gaussian beam, up to a constant.
Atoms at the radius \(r\) of a Gaussian beam of peak intensity \(I_0\) see \(I = I_0 e^{-2r^2/w^2}\), so that \(2\pi r\, dr = (\pi w^2/2)\, dI/I\) and the number ionised in a target much thinner than the Rayleigh range is
\[S(I_0) = \int_0^{I_0} P(I)\, \frac{dI}{I}\]times \(\pi w^2/2\) and the target’s areal density: Wallace et al.’s (2016) two-dimensional focal-volume average (their eq. 3).
- Parameters:
- intensitynumpy.ndarray
Peak intensities, ascending, shape
(n,); the first must be low enough that the yield below it is negligible.- localnumpy.ndarray
The ionised fraction \(P\) at each, shape
(n,).
- Returns:
- numpy.ndarray
\(S\) at each intensity, shape
(n,).
Examples
A yield proportional to \(I^4\) averages to a quarter of itself:
>>> intensity = np.geomspace(1e-3, 1, 400) >>> f"{float(focal_average(intensity, intensity**4)[-1]):.3f}" '0.250'
- optmat.gas.ionisation_validation.gaussian_pulse(peak_intensity, fwhm, wavelength, *, cep=0.0)[source]#
Return the times, the envelope and the field of a Gaussian pulse.
The vector potential is \(A(t) = -(F_0/\omega)\, e(t) \sin(\omega t + \varphi)\) with the envelope \(e(t) = \exp(-2 \ln 2\, t^2/\tau^2)\), and the field is \(-dA/dt\): the pulse then has no static component however short it is. \(\tau\) is the full width at half maximum of the intensity \(e^2\). For \(\varphi = 0\) the field has a crest at the peak of the envelope. This is the pulse of tRecX (
gauss; Scrinzi 2022) and of the calculations oftravers_2026_trecx.- Parameters:
- peak_intensityfloat
Peak of the cycle-averaged intensity, W/m2.
- fwhmfloat
Full width at half maximum of the intensity, s.
- wavelengthfloat
Carrier wavelength, m.
- cepfloat, optional
Carrier-envelope phase \(\varphi\), rad.
- Returns:
- tuple of numpy.ndarray
The times (s), the amplitude of the envelope (V/m) and the field (V/m), on a uniform grid of 96 points per cycle over three FWHM either side of the peak.
Examples
>>> times, envelope, field = gaussian_pulse(1e18, 6e-15, 800e-9) >>> f"{float(np.max(np.abs(field)) / np.max(envelope)):.4f}" '1.0000'
- optmat.gas.ionisation_validation.hacc_ratios()[source]#
Compare haCC’s argon atom with one electron at its ionisation energy.
Each set-up of
HACC_YIELDShas its own effective ionisation energy (the initial state’s, against the ion’s); one electron’s norm-loss there is the run at exactly that energy and pulse where there is one (HACC_REFERENCES; TC-861), and otherwise interpolated, in its logarithm and linearly in the energy, between the two calculations ofIP_MATCHED_YIELDSat the same intensities. Both measures are the norm-loss 1000 au after the pulse (TC-847).- Returns:
- list of AtomRatio
One per haCC set-up.
- optmat.gas.ionisation_validation.helium_laser_rates(model='default')[source]#
Compare helium’s rate at 390 and 780 nm with Parker et al.’s.
- Parameters:
- modelstr, optional
The rate model.
- Returns:
- list of RateComparison
The cycle-averaged rate in atomic units against the intensity, at 780 nm (1e14 to 1.4e15 W/cm^2) and 390 nm (1e14 to 3e15 W/cm^2): the ranges of the fits above the intensity at which the rate is 1e-12 au.
Examples
>>> infrared, _ = helium_laser_rates() >>> bool(np.all(np.abs(infrared.ratio - 1) < 0.2)) True
- optmat.gas.ionisation_validation.helium_matched_ratios()[source]#
Compare helium’s calculations on matched, box-converged measures.
For each pair of
HELIUM_MATCHED, at the first dataset’s intensities (TC-1092).- Returns:
- list of YieldRatio
One per pair.
- optmat.gas.ionisation_validation.helium_two_electron_ratios()[source]#
Compare helium’s two-electron and haCC yields at 390 nm with one electron’s.
For each pair of
HELIUM_TWO_ELECTRON, at the two-electron (or haCC) calculation’s intensities (TC-1050).- Returns:
- list of AtomRatio
One per pair;
ionization_energyis the one electron’s.
- optmat.gas.ionisation_validation.hydrogen_model(wavelength, coulomb='static')[source]#
Return the rate of atomic hydrogen built as optmat’s
one_electronmodel.Atomic hydrogen is not one of optmat’s gases, but the cleanest test of the rate’s Coulomb factor: its one-electron calculations are exact. The model is the
one_electronform for the 1s electron: \(I_p = 1/2\) hartree, \(l = 0\), one electron, the asymptotic coefficient \(C_0 = 2\) (the 1s orbital \(\pi^{-1/2} e^{-r}\) is \(C_0 \kappa^{3/2} (\kappa r)^{n^* - 1} e^{-\kappa r} Y_{00}\) with \(\kappa = n^* = 1\)), Tong and Lin’s static correction with their \(\alpha\) for hydrogen (HYDROGEN_ALPHA), and the default’s channel sum and averaging (TC-827).- Parameters:
- wavelengthfloat
Wavelength, m.
- coulombstr, optional
The Coulomb factor (
optmat.gas.ionisation_rates.coulomb_factor()).
- Returns:
- IonisationRateModel
The model, status
user.
Examples
>>> model = hydrogen_model(800e-9) >>> f"{float(model.keldysh(amplitude(1e18))):.3f}" '1.067'
- optmat.gas.ionisation_validation.hydrogen_spectra(coulomb='static')[source]#
Compare the hydrogen model with Bauer and Deng’s yields against the frequency.
At their fixed peak intensity, for their 2-10-2 flat-top pulse, whose duration scales with the period; at the vertices of their curve nearest to frequencies 0.005 hartree apart, up to 0.25 hartree. Above 0.13 hartree the wavelength is below the model’s tested range (350 nm): the comparison is made there on purpose, without the warning.
- Parameters:
- coulombstr, optional
The Coulomb factor.
- Returns:
- list of RateComparison
One per spectrum, against the angular frequency (hartree);
wavelengthis NaN.
- optmat.gas.ionisation_validation.hydrogen_yields(coulomb='static')[source]#
Compare the hydrogen model with the one-electron calculations of hydrogen.
The cycle-averaged rate of
hydrogen_model()on each calculation’s envelope (HYDROGEN_YIELDS; no calculation states its carrier-envelope phase), at the points whose stated uncertainty is at most 0.1 of the value: the low yields of Bauer and Deng’s Fig. 1, read on a linear axis to 0.001, are left out.- Parameters:
- coulombstr, optional
The Coulomb factor.
- Returns:
- list of RateComparison
One per calculation, against the peak intensity.
- optmat.gas.ionisation_validation.intensity_scale_test(gas, model='default')[source]#
Test a model on Wallace et al.’s yields, whose scale is free.
The model’s yield for a 5.5 fs pulse at 800 nm (the instantaneous rate on the carrier, averaged over carrier-envelope phases of 0 and \(\pi/2\), the measurement’s phase being random) is averaged over the focus (
focal_average()). With the amplitude free, what the measurement tests is where the yield bends over towards saturation, which depends on the absolute rate: the scale \(\eta\) is found at which \(S_\text{model}(\eta I)\) has the shape of the measured \(S(I)\) between 1e14 and 5e14 W/cm2. One per cent in \(\eta\) is about 5 % in the rate.- Parameters:
- gasGas or str
Ar, Kr or Xe.
- modelstr, optional
The rate model.
- Returns:
- ScaleTest
The scale and the comparison at it.
- optmat.gas.ionisation_validation.ionised_fraction(rate, times)[source]#
Return the fraction ionised by the end of a pulse.
\(1 - \exp(-\int W\, dt)\) (Tong and Lin 2005, eq. 6), by the trapezoid rule.
- Parameters:
- ratenumpy.ndarray
Rate per atom along the pulse, 1/s, shape
(n,).- timesnumpy.ndarray
The times, s, shape
(n,).
- Returns:
- float
The fraction, in [0, 1].
Examples
>>> times = np.linspace(0, 1e-14, 11) >>> f"{ionised_fraction(np.full(11, 1e13), times):.4f}" '0.0952'
- optmat.gas.ionisation_validation.long_pulse_yield(model='one_electron', *, carrier=True)[source]#
Compare argon’s yield of a 42 fs pulse at 800 nm with the one-electron TDSE.
The calculation is of one electron in the 3p, m = 0 orbital of Tong and Lin’s potential, in the pulse of Wahlstrand et al.’s measurement (a Gaussian of 42 fs full width at half maximum of the intensity), and its yield is the ionised fraction, the bound excited states left out.
- Parameters:
- modelstr, optional
The rate model;
one_electroncorresponds to the calculation.- carrierbool, optional
The instantaneous rate on the field (the calculation’s pulse, carrier-envelope phase 0), or the cycle-averaged rate on the envelope.
- Returns:
- RateComparison
The yield against the peak intensity, W/m^2.
- optmat.gas.ionisation_validation.measured_points_test(gas='Kr', model='default')[source]#
Test a model on the measured points of Wallace et al.’s krypton yield.
The supplement of Wallace et al. (2016) tabulates the 37 measured yields of Kr+ behind the fit of
wallace_yield(), with their errors. Unlike the fit, whose shape is that of the authors’ own calculation, the points are the measurement alone. The model’s yield (as inintensity_scale_test()) is fitted to them with its amplitude free, the points weighted by the inverse square of their errors, at each scale \(\eta\) of the intensities; the scale of the least \(\chi^2\) is returned.- Parameters:
- gasGas or str, optional
Kr: the one gas whose points are tabulated.
- modelstr, optional
The rate model.
- Returns:
- PointsTest
The scale and the comparison at it.
- Raises:
- DataError
If no measured points are curated for the gas.
Examples
>>> test = measured_points_test("Kr") >>> len(test.measured) 37 >>> bool(abs(test.scale - 1) < 0.03) True
- optmat.gas.ionisation_validation.measured_yields(gas, model='default', intensities=None)[source]#
Compare the yield of a 42 fs pulse at 800 nm with Wahlstrand et al.’s.
Wahlstrand et al. (2018) measured the electron density a pulse leaves in a thin gas target, from the refractive index of the plasma, against the local peak intensity, which they calibrated through the Kerr phase shift with a measured nonlinear index of argon (13 %). Their Supplemental Material gives the fits \(Y = c_1 I_0^m\), \(I_0\) in TW/cm2.
- Parameters:
- gasGas or str
Ar, Kr, Xe (
optmat.gas.ionisation_rates.ionisation_rate_model()), N2 or O2 (optmat.gas.molecular_ionisation_rates.molecular_rate_model()).- modelstr, optional
The rate model.
- intensitiessequence of float or None, optional
Peak intensities, W/m2. None: ten over the range of the measurement as read from the paper’s Fig. 3 (Ar 45-135, Kr 35-105, Xe 18-78, N2 75-125, O2 40-105 TW/cm2; the fit’s range is not stated).
- Returns:
- RateComparison
The yields, with the cycle-averaged rate on the envelope of a Gaussian pulse of 42 fs.
- Raises:
- DataError
If the gas was not measured.
- optmat.gas.ionisation_validation.parker_pulse_yield(peak_intensity, fwhm, wavelength_nm)[source]#
Return the fraction of helium that Parker et al.’s rate ionises over a pulse.
parker_rate_au()at the intensity of the envelope, \(I_0 e(t)^2\), ofgaussian_pulse(), integrated byionised_fraction(): the rate of a field of constant amplitude followed adiabatically (TC-1050).- Parameters:
- peak_intensityfloat
Peak intensity, W/m2.
- fwhmfloat
Full width at half maximum of the intensity, s.
- wavelength_nmint
390 or 780.
- Returns:
- float
The fraction ionised.
Examples
>>> f"{parker_pulse_yield(5.68981e18, 6e-15, 390):.3e}" '7.000e-03'
- optmat.gas.ionisation_validation.parker_rate_au(intensity, wavelength_nm)[source]#
Return Parker et al.’s fit of the ionisation rate of helium in a laser field.
Parker, Meharg, McKenna and Taylor (2007), eq. (5), fitted “through the centre” of the rates of their integration of the two-electron time-dependent Schrödinger equation:
\[\Gamma = \exp\left(-\frac{R}{\sqrt{a_0 + a_1 \bar I + a_2 \bar I^2 + a_3 \bar I^3}}\right), \qquad \bar I = I R^2, \quad R = \lambda / 390\ \text{nm},\]with \(I\) in \(10^{14}\) W/cm2 and \(\Gamma\) in atomic units. The rate is that of the atom in a field of constant amplitude, the resonances smoothed away. The fits cover 0.3 to 34 (390 nm) and 0.3 to 14.5 (780 nm); no accuracy is stated for them, and the calculation’s is 2 to 4 %.
- Parameters:
- intensityarray_like
Intensity, W/m2.
- wavelength_nmint
390 or 780.
- Returns:
- numpy.ndarray
The rate, atomic units.
- Raises:
- DataError
If the wavelength is not one of the two.
Examples
The paper’s check, 0.0107 au at 30e14 W/cm2 and 390 nm:
>>> f"{float(parker_rate_au(30e18, 390)):.4f}" '0.0107'
- optmat.gas.ionisation_validation.phase_shift_test(reference, model='default')[source]#
Compare a model with a measured phase shift through a laser plasma.
The model’s ionised fraction for the measurement’s pulse (a Gaussian of the stated duration; linear polarisation: the cycle-averaged rate on the envelope; circular:
circular_yield()) is integrated over the focus byplasma_phase_shift()with the beams the dataset states.- Parameters:
- referencestr
The key of an
ionization_phase_shiftdataset.- modelstr, optional
The rate model.
- Returns:
- PhaseShiftTest
The comparison.
- Raises:
- DataError
If the dataset is not a phase shift, or does not state its beams.
- optmat.gas.ionisation_validation.plasma_phase_shift(ionised, grid, peak_intensity, parameters)[source]#
Return the phase a probe picks up from the electrons a focused pump leaves.
Both beams are Gaussian with the same focus and beam quality \(M^2\), the pump \(I(r, z) = I_0 (w_0/w)^2 \exp(-2 r^2/w^2)\), \(w = w_0 \sqrt{1 + (z/z_R)^2}\), \(z_R = \pi w_0^2 / M^2 \lambda\). The ionised fraction at each point is that of the local peak intensity. The phase is Nie et al.’s (2022) Eq. (3), the change of index \(n_e/2 n_c\) averaged over the probe’s profile at each z and integrated along the axis:
\[\Delta\phi = \frac{2\pi}{\lambda_p} \frac{n}{2 n_c} \int dz\, \frac{\int Y(I(r, z))\, I_p(r, z)\, r\, dr}{\int I_p(r, z)\, r\, dr},\]with \(n\) the density of atoms and \(n_c = \varepsilon_0 m_e \omega_p^2 / e^2\) the critical density at the probe’s frequency. Self-focusing is left out, as the authors do at 800 and 400 nm.
- Parameters:
- ionisednumpy.ndarray
The ionised fraction after the pulse, at the peak intensities
grid.- gridnumpy.ndarray
Increasing peak intensities, W/m^2; the fraction is interpolated in the logarithm between them and is 0 below the first.
- peak_intensityarray_like
The pump’s peak intensity at the focus, W/m^2.
- parametersmapping
wavelength_nmandprobe_wavelength_nm;pump_waist_umandprobe_waist_um, the 1/e^2 radii of the intensity at the focus;m2; anddensity_m3, the density of atoms.
- Returns:
- numpy.ndarray
The phase shift, rad, with the shape of
peak_intensity.
Examples
Every atom ionised everywhere: the phase of a column of electrons 80 Rayleigh lengths long (the axis the average covers):
>>> beams = {"wavelength_nm": 800, "probe_wavelength_nm": 400, "m2": 1.25, ... "pump_waist_um": 60.0, "probe_waist_um": 42.0, "density_m3": 2.7e25} >>> phase = plasma_phase_shift(np.ones(2), np.array([1e10, 1e30]), 1e18, beams) >>> length = 80 * np.pi * 60e-6**2 / (1.25 * 800e-9) >>> f"{float(phase) / length:.4e}" '3.0434e+04'
- optmat.gas.ionisation_validation.published_atom_ratios()[source]#
Compare published many-electron calculations with one electron in their pulses.
For each pair of
PUBLISHED_ATOMS, at the published calculation’s intensities: the published probability outside 20 au over one electron’s (TC-858).- Returns:
- list of AtomRatio
One per published curve;
ionization_energyis the one electron’s.
- optmat.gas.ionisation_validation.pulse_yield(model, peak_intensity, fwhm, *, carrier=False, cep=0.0, cycles=None)[source]#
Return the fraction a pulse at the model’s wavelength ionises.
A Gaussian pulse (
gaussian_pulse()), or withcyclesa pulse counted in cycles (cycle_pulse()).- Parameters:
- modelIonisationRateModel or MolecularRateModel
The rate.
- peak_intensityfloat
Peak of the cycle-averaged intensity, W/m^2.
- fwhmfloat
Full width at half maximum of the intensity, s.
- carrierbool, optional
True: the instantaneous rate on the field of
gaussian_pulse(). False: the cycle-averaged rate on its envelope.- cepfloat, optional
Carrier-envelope phase, rad; it matters with
carrieronly.- cyclestuple of float or None, optional
(ramp, plateau)cycles ofcycle_pulse(), in place of the Gaussian;fwhmis then ignored.
- Returns:
- float
The ionised fraction after the pulse.
Examples
Argon, 800 nm, 42 fs, 1e14 W/cm^2:
>>> model = ionisation_rate_model("Ar", 800e-9) >>> f"{pulse_yield(model, 1e18, 42e-15):.4f}" '0.0115'
- optmat.gas.ionisation_validation.rmatrix_rates(gas, model='default')[source]#
Compare a gas’s rate at 390 nm with van der Hart’s all-electron rates.
The R-matrix Floquet rates of He, Ne and Ar (van der Hart 2006, read from the image of its Fig. 6) and the time-dependent R-matrix rates of Ar (van der Hart 2007, Table I and its Fig. 4’s vector drawing), each for the atom with one ionic target state, at 390 nm with linear polarisation: Keldysh parameters from 1.4 to 4.7. The references resolve the resonances of the atom, which no model has.
- Parameters:
- gasGas or str
He, Ne or Ar.
- modelstr, optional
The rate model.
- Returns:
- list of RateComparison
The cycle-averaged rate in atomic units against the intensity, W/m^2.
- Raises:
- DataError
If the gas has no such reference.
- optmat.gas.ionisation_validation.saturation_test(gas, model='default')[source]#
Test a model against Uiterwaal et al.’s saturation intensity of an atom.
Their saturation intensity (TC-853) is the peak intensity at which a single rate ionises \(1 - 1/e\) of the atoms over the pulse: the integral of the rate over the pulse is 1 there. The model’s cycle-averaged rate is integrated over their pulse, a hyperbolic secant squared of 500 fs full width at half maximum of the intensity at 248.6 nm (the wavelength is below the models’ range, whose warning is suppressed), and the peak intensity at which the integral is 1 is found by bisection in its logarithm.
- Parameters:
- gasGas or str
He, Ar or Kr.
- modelstr, optional
The rate model.
- Returns:
- SaturationTest
The comparison.
- Raises:
- DataError
If no saturation intensity is curated for the gas.
- optmat.gas.ionisation_validation.static_rates(gas)[source]#
Compare the static rate of a gas with its curated references.
- Parameters:
- gasGas or str
He, Ne or Ar: the gases with tabulated static rates.
- Returns:
- list of RateComparison
One comparison per reference of
STATIC_REFERENCES, in atomic units of rate against the field in V/m, at the fields up to twice the barrier-suppression field.
- Raises:
- DataError
If the gas has no static reference.
Examples
>>> (first, *_) = static_rates("He") >>> first.label 'Parker et al. 2009, two electrons' >>> bool(np.all(np.abs(first.ratio[5:20] - 1) < 0.15)) True
- optmat.gas.ionisation_validation.tdse_intensity_scale_test(gas='Ar', factor=1.0)[source]#
Put the one-electron calculation in Wallace et al.’s pulse through their test.
As
intensity_scale_test(), with the calculation’s ionised fraction (WALLACE_TDSE, the \(m = 0\) electron, averaged over its phases 0 and \(\pi/2\)) in place of a model’s: \(-\ln(1 - P)\) is interpolated linearly in the logarithms between the calculated intensities, extrapolated with the end slopes beyond them, and multiplied byfactor, an atom’s rate over one electron’s (TC-836).- Parameters:
- gasGas or str, optional
A gas with such a calculation.
- factorfloat, optional
The factor on the calculation’s rate.
- Returns:
- ScaleTest
The scale and the comparison at it; its
modelnames the calculation.
- Raises:
- DataError
If no such calculation is curated for the gas.
- optmat.gas.ionisation_validation.tdse_yields(gas, model='one_electron', *, carrier=True)[source]#
Compare the yields of short pulses with the one-electron calculations.
- Parameters:
- gasGas or str
He or Ar.
- modelstr, optional
The rate model; the calculations are of one electron in the m = 0 orbital, to which
one_electroncorresponds.- carrierbool, optional
The instantaneous rate on the field (the calculations’ pulse,
gaussian_pulse()with a carrier-envelope phase of 0), or the cycle-averaged rate on the envelope.
- Returns:
- list of RateComparison
One comparison per measure of the yield (
TDSE_YIELDS), against the peak intensity.
- Raises:
- DataError
If the gas has no such calculation.
- optmat.gas.ionisation_validation.wallace_yield(gas, intensity)[source]#
Return Wallace et al.’s fit of their measured yield, on its free scale.
Wallace et al. (2016), eq. (4):
\[S(I) = \frac{\exp\left[-\alpha\, (I/I_c)^{-1/2}\right]}{1 + (I/I_c)^{\gamma}},\]for a 5.5 fs pulse at 800 nm and a target thin against the Rayleigh range (
focal_average()). \(\alpha\) and \(\gamma\) were fitted to the authors’ one-electron calculations and \(I_c\) to the measurement, whose intensities are fixed by the yield of atomic hydrogen to 1.3 % (Ar), 1.5 % (Kr) and 2.5 % (Xe). The scale of the yield is free. Valid from 1e14 to 5e14 W/cm2.- Parameters:
- gasGas or str
Ar, Kr or Xe.
- intensityarray_like
Peak intensity, W/m2.
- Returns:
- numpy.ndarray
\(S\), with the shape of
intensity.
- Raises:
- DataError
If the gas was not measured.
- optmat.gas.ionisation_validation.weak_field_factors()[source]#
Compare the atoms’ weak-field coefficients with the model’s one electron.
Tolstikhina et al. (2014) give the rate of an atom in a weak static field as \(|g|^2 W(F)\), with \(g = \sqrt{p} R_N g_N\) from Hartree-Fock orbitals (Table I). For one electron of the model, whose orbital’s tail is Tong, Zhao & Lin’s \(C_l r^{1/\kappa - 1} e^{-\kappa r}\), their Eq. (11) gives \(g_1 = \sqrt{2(2l+1)/\kappa}\, 2^{-1/\kappa} C_l\), with which their Eqs. (1)-(2) are the static rate of
ionisation_rates()without Tong & Lin’s correction, which tends to 1 at weak field. Both at the Hartree-Fock \(\kappa\) (TC-852).- Returns:
- list of WeakFieldFactor
One per atom of
WEAK_FIELD_ATOMS.
- optmat.gas.ionisation_validation.xenon_rmt_ratios()[source]#
Compare RMT’s xenon with one electron in its field and with its measure.
For each entry of
XENON_RMT, at the one-electron runs’ intensities (TC-1093).- Returns:
- list of SurvivalRatio
One per entry.
- optmat.gas.ionisation_validation.xenon_survival(model='default')[source]#
Predict xenon’s ground-state depletion after Hartmann et al.’s pulses.
The rate’s yield (
pulse_yield(), the cycle-averaged rate on a Gaussian envelope) at each dataset’s peak intensity; RMT’s intensities are converted from its field labels (E0 = 0.05336 sqrt(I/1e14 W/cm^2) au) to the intensity whose field has that amplitude. The model ionises; it does not excite (TC-1093, TC-1094).- Parameters:
- modelstr, optional
The rate model.
- Returns:
- list of RateComparison
One per entry of
XENON_SURVIVAL, quantitydepletion: \(-\ln P\), the survival’s logarithm, of the dataset and of the model.