radis.lbl.broadening module

Summary

A class to handle all broadening related functions (and unload factory.py)

BroadenFactory is inherited by SpectrumFactory eventually

Routine Listing

Most methods are written in inherited class with the following inheritance scheme:

DatabankLoader > BaseFactory > BroadenFactory > BandFactory > SpectrumFactory

Inheritance diagram of radis.lbl.factory.SpectrumFactory

PUBLIC FUNCTIONS - BROADENING

PRIVATE METHODS - BROADENING (all computational-heavy functions: calculates all lines broadening, convolve them, apply them on all calculated range)

  • radis.lbl.broadening.whiting()

  • radis.lbl.broadening._whiting_jit() : precompiled version

  • radis.lbl.broadening.BroadenFactory._calc_broadening_HWHM()

  • radis.lbl.broadening.BroadenFactory._add_voigt_broadening_HWHM()

  • radis.lbl.broadening.BroadenFactory._voigt_broadening()

  • radis.lbl.broadening.BroadenFactory._calc_lineshape()

  • radis.lbl.broadening.BroadenFactory._calc_lineshape_LDM()

  • radis.lbl.broadening.BroadenFactory._apply_lineshape()

  • radis.lbl.broadening.BroadenFactory._apply_lineshape_LDM()

  • radis.lbl.broadening.BroadenFactory._calc_broadening()

  • radis.lbl.broadening.BroadenFactory._calc_broadening_noneq()

  • radis.lbl.broadening.BroadenFactory._find_weak_lines()

  • radis.lbl.broadening.BroadenFactory.calculate_pseudo_continuum()

  • radis.lbl.broadening.BroadenFactory._add_pseudo_continuum()

Notes

Formula in docstrings generated with py2tex()

from pytexit import py2tex
py2tex('...')

class BroadenFactory[source]

Bases: BaseFactory

A class that holds all broadening methods.

Eventually inherited by SpectrumFactory

Inheritance diagram of radis.lbl.factory.SpectrumFactory

See also

SpectrumFactory

calculate_pseudo_continuum(noneq=False)[source]

Find weak lines, add them in pseudo-continuum (note that pseudo- continuum by RADIS definition is actually more a sum of low-resolution lines)

Parameters

noneq (bool) – if True, also returns the emisscoeff pseudo continuum (for noneq cases). Default False

Returns

  • k_continuum (numpy array (1/(#.cm-2))) – abscoeff semi-continuum on wavenumber space

  • j_continuum (numpy array) – only returned if noneq=True : emisscoeff semi-continuum on wavenumber space

  • Also – self.df1 is updated, lines are removed local variables self._Nlines_in_continuum and self._Nlines_calculated are created

Notes

continuum can be exported in Spectrum is using the self.export_continuum boolean. This is not available as a User input but can be edited manually in the Factory.

The Weak line characterization [1]_ is only based on abscoeff. For strong nonequilibrium cases there may be lines consired as weak in terms of absorption but not weaks in emission, or the other way around. It should be negligible, though, so a dual conditioning (looking at both abscoeff and emisscoeff) was not implemented. See radis.lbl.broadening._find_weak_lines() if you want to change that

1

RADIS User Guide, RADIS Paper

plot_broadening(i=0, pressure_atm=None, mole_fraction=None, Tgas=None)[source]

Recalculate and plot broadening for line of index i.

Used mainly for testing.

Parameters
  • i (int) – line index

  • pressure_atm (atm) – if None, defaults to model pressure

  • mole_fraction ([0-1]) – if None, defaults to model mole fraction

  • Tgas (K) – if None, defaults to model translational temperature

Examples

from radis import SpectrumFactory
sf=SpectrumFactory(...)
sf.eq_spectrum(...)
sf.plot_broadening(i=500)   # plot line number 500
doppler_broadening_HWHM(wav, molar_mass, Tgas)[source]

Computes Gaussian (Doppler) broadening HWHM over all lines with [1]_, [2]_

\[\frac{w}{c} \sqrt{\frac{2N_a k_b T_{gas} \ln 2}{M}}\]

with k and c in CGS

Parameters
  • wav (array like (nm / cm-1)) – transition waverange [length N = number of lines]

  • molar_mass (array like (g/mol)) – molar mass for isotope of given transition, in g/mol [length N]

  • Tgas (float (K)) – (translational) gas temperature

Returns

array – gaussian HWHM for all lines

Return type

(nm / cm-1) [shape N]

References

\[f_{G} = \frac{1}{\alpha} \sqrt{\frac{\ln 2}{\pi}} exp\left(- \ln 2 \left(\frac{w - w_0}{\alpha}\right)^2 \right)\]

with α the full-width half maximum (HWHM) calculated in cm-1, nm or Hz:

1
HITRAN.org

Eqn. (5) [in cm-1]. c in CGS, HWHM alpha in nm, M in g/mol:

\[\alpha w_G= \frac{w}{c_{CGS}} \sqrt{\frac{2N_a k_b T \ln 2}{M}}\]
2
Laux et al, 2003, “Optical diagnostics of atmospheric pressure air plasmas”

Eqn. (6) [in nm]. FWHM Delta in nm, M in g/mol:

\[\alpha \lambda_G=3.58\times 10^{-07} \lambda \sqrt{\frac{T}{M}}\]
3

Wikipedia [in Hz]

\[\alpha f_G=\frac{1}{2} \sqrt{\frac{8 k T \ln 2}{m c^2}} f_0\]

Here we work in cm-1 with the CGS nomenclature (molar mass M in g/mol)

Notes

equation generated from the Python formula with py2tex()

gaussian_FT(w_centered, hwhm)[source]

Fourier Transform of a Gaussian lineshape.

\[\operatorname{exp}\left(\frac{-\left({\left(2\pi w_{centered} hwhm\right)}^2\right)}{4\ln2}\right)\]
Parameters
  • w_centered (2D array [one per line: shape W x N]) – waverange (nm / cm-1) (centered on 0)

  • hwhm (array [shape N = number of lines]) – Half-width at half-maximum (HWHM) of Gaussian

Return type

array

gaussian_lineshape(w_centered, hwhm)[source]

Computes Doppler (Gaussian) lineshape over all lines with [1]_, [2]_

\[\frac{1}{\alpha_g} \sqrt{\frac{\ln 2}{\pi}} \operatorname{exp}\left(-\ln 2 {\left(\frac{w_{centered}}{\alpha_g}\right)}^2\right)\]

with \(\alpha_g\) half-width at half maximum (HWHM)

Parameters
  • w_centered (2D array [one per line: shape W x N]) – waverange (nm / cm-1) (centered on 0, size W = broadening width size)

  • hwhm (array [shape N = number of lines]) – Half-width at half-maximum (HWHM) of Gaussian

  • Tgas (K) – (translational) gas temperature

Returns

array – line profile

Return type

[shape N x W]

References

1

Wikipedia (in \(cm^{-1}\))

2

Laux et al, 2003, “Optical diagnostics of atmospheric pressure air plasmas” (in nm)

Both give the same results.

Notes

formula generated from the Python equation with py2tex()

lorentzian_FT(w_centered, gamma_lb)[source]

Fourier Transform of a Lorentzian lineshape.

\[\operatorname{exp}\left(-2\pi w_{centered} \gamma_{lb}\right)\]
Parameters
  • w_centered (2D array [one per line: shape W x N]) – waverange (nm / cm-1) (centered on 0)

  • gamma_lb (array (cm-1) [length N]) – half-width half maximum coefficient (HWHM) for pressure broadening calculation

Return type

array

lorentzian_lineshape(w_centered, gamma_lb)[source]

Computes collisional broadening over all lines [1]_

\[\frac{1}{\pi} \frac{\gamma_{lb}}{\gamma_{lb}^2+w_{centered}^2}\]
Parameters
  • w_centered (2D array [one per line: shape W x N]) – waverange (nm / cm-1) (centered on 0)

  • gamma_lb (array (cm-1) [length N]) – half-width half maximum coefficient (HWHM) for pressure broadening calculation

Returns

array – line profile

Return type

[shape N x W]

References

1

Rothman 1998 (HITRAN 1996) eq (A.14)

Notes

formula generated from the Python equation with py2tex()

olivero_1977(wg, wl)[source]

Calculate approximate Voigt FWHM with [Olivero-1977].

also in NEQAIR 96 manual Eqn. (D2) Note that formula is given in wavelength (nm) [doesnt change anything] and uses full width half maximum (FWHM) of Gaussian and Lorentzian profiles.

For use with the Whiting formula of voigt_lineshape().

Parameters
  • wg (numpy array) – Gaussian profile FWHM

  • wl (numpy array) – Lorentzian profile FWHM

Returns

gamma_voigt – Voigt FWHM

Return type

numpy array

References

[Olivero-1977] uses FWHM.

\[ \begin{align}\begin{aligned}s_d=\frac{w_l-w_g}{w_l+w_g}\\w_v=\left(1-0.18121\left(1-{s_d}^2\right)-\left(0.023665\operatorname{exp}\left(0.6s_d\right)+0.00418\operatorname{exp}\left(-1.9s_d\right)\right) sin\left(\pi s_d\right)\right) \left(w_l+w_g\right)\end{aligned}\end{align} \]
pressure_broadening_HWHM(airbrd, selbrd, Tdpair, Tdpsel, pressure_atm, mole_fraction, Tgas, Tref)[source]

Calculates collisional broadening HWHM over all lines by scaling tabulated HWHM for new pressure and mole fractions conditions [1]_

Note that collisional broadening is computed with a different coefficient for air broadening and self broadening. In the case of non-air mixtures, then the results should be used with caution, or better, the air broadening coefficient be replaced with the gas broadening coefficient

Parameters
  • airbrd (array like [length N]) – half-width half max coefficient (HWHM ) for collisional broadening with air

  • selbrd (array like [length N]) – half-width half max coefficient (HWHM ) for resonant (self) broadening with air

  • Tdpair (array like [length N]) – temperature dependance coefficient for collisional broadening with air

  • Tdpsel (array like, optional [length N]) – temperature dependance coefficient for resonant (self) broadening. If None, use Tdpair.

  • pressure_atm (float [atm]) – pressure in atmosphere (warning, not bar!)

  • mole_fraction (float [0-1]) – mole fraction

  • Tgas (float [K]) – (translational) gas temperature

  • Tref (float [K]) – reference temperature at which tabulated HWHM pressure broadening coefficients were tabulated

Returns

Lorentzian half-width at half-maximum (HWHM) for each line profile

Return type

pandas Series [shape N]

References

\[\gamma_{lb}={\left(\frac{T_{ref}}{T_{gas}}\right)}^{n_{air}} \gamma_{air} P \left(1-x\right)+{\left(\frac{T_{ref}}{T_{gas}}\right)}^{n_{self}} \gamma_{self} P x\]

With \(n_{air}, n_{self}\) the temperature dependance coefficients Tdpair, Tdpsel ; \(\gamma_{air}, \gamma_{self}\) the air and resonant HWHM broadening tabulated at \(T_{ref}\), \(x\) the mole_fraction.

1

Rothman 1998 (HITRAN 1996) eq (A.14)

project_lines_on_grid(df, wavenumber, wstep)[source]

Quickly sums all lines on wavespace grid as rectangles of HWHM corresponding to hwhm_voigt and a spectral absorption coefficient value so that linestrength is conserved.

i.e. profiles are approximated as a rectangle of width \(\alpha \cdot FWHM_{Voigt}\), and with the same linestrength.

Parameters
  • df (pandas Dataframe) – Contains shiftwav (wavenumbers) and S (linestrengths) and hwhm_voigt (Voigt HWHM) size N (number of lines)

  • wavenumber (np.array) – spectral grid. Size W. Expected to be regular

  • wstep (float (cm-1)) – wavenumber step

Returns

  • k_rough_spectrum (np.array) – spectral absorption coefficient for the waverange wavenumber, calculated by assuming a rectangular profile for each line. Size W

  • S_density_on_grid – average spectral linestrength intensity of each line (abscoeff ~k), assuming rectangular profile. size N

  • line2grid_projection – closest index of the center of each line in df on the spectral grid wavenumber. Size N

project_lines_on_grid_noneq(df, wavenumber, wstep)[source]

Quickly sums all lines on wavespace grid as rectangles of HWHM corresponding to hwhm_voigt and a spectral absorption coefficient value so that linestrength is conserved.

i.e. profiles are approximated as a rectangle of width \(\alpha \cdot FWHM_{Voigt}\), and with the same linestrength.

Parameters
  • df (pandas Dataframe) – Contains shiftwav (wavenumbers) and S (linestrengths) and hwhm_voigt (Voigt HWHM) size N (number of lines)

  • wavenumber (np.array) – spectral grid. Size W. Expected to be regular

  • wstep (float (cm-1)) – wavenumber step

  • quantity (‘S’ or ‘Ei’) – use ‘S’ for Linestrength, ‘Ei’ for emission integral. Default ‘S’

Returns

  • k_rough_spectrum (np.array) – spectral absorption coefficient for the waverange wavenumber, calculated by assuming a rectangular profile for each line. Size W

  • j_rough_spectrum (np.array) – spectral emission coefficient for the waverange wavenumber, calculated by assuming a rectangular profile for each line. Size W

  • S_density_on_grid – average spectral linestrength intensity of each line (abscoeff ~k), assuming rectangular profile. size N

  • Ei_density_on_grid – average spectral emission intensity of each line (emisscoeff ~j), assuming rectangular profile. size N

  • line2grid_projection – closest index of the center of each line in df on the spectral grid wavenumber. Size N

Notes

Similar to project_lines_on_grid() except that we also calculate the approximate emission intensity (noneq > it cannot be recomputed from the linestrength).

voigt_FT(w_lineshape_ft, hwhmG, hwhmL)[source]

Fourier Transform of a Voigt lineshape

Parameters
  • w_centered (2D array [one per line: shape W x N]) – waverange (nm / cm-1) (centered on 0)

  • hwhmG (array [shape N = number of lines]) – Half-width at half-maximum (HWHM) of Gaussian

  • hwhmL (array (cm-1) [length N]) – Half-width at half-maximum (HWHM) of Lorentzian

voigt_broadening_HWHM(airbrd, selbrd, Tdpair, Tdpsel, wav, molar_mass, pressure_atm, mole_fraction, Tgas, Tref)[source]

Calculate Voigt profile half-width at half-maximum (HWHM) from the Gaussian and Collisional broadening with the empirical formula of [Olivero-1977]

Gaussian broadening is calculated with [2]_, Collisional broadening with [3]_

Exact for a pure Gaussian and pure Lorentzian

Parameters
  • Line parameters [length N]

  • airbrd (np.array [length N] (cm-1/atm)) – air broadening half-width half maximum (HWHM)

  • selbrd (np.array [length N] (cm-1/atm)) – self broadening half-width half maximum (HWHM)

  • Tdpair (np.array [length N]) – temperature dependance of collisional broadening by air

  • Tdpsel (np.array [length N]) – temperature dependance of collisional self-broadening

  • wav (np.array [length N] (cm-1)) – transition wavenumber

  • molar_mass (np.array [length N] (g/mol)) – molar mass for isotope of given transition

  • Environment parameters

  • pressure_atm (float [atm]) – pressure

  • mole_fraction (float [0-1]) – mole fraction

  • Tgas (K) – (translational) gas temperature

  • Tref (K) – reference temperature at which tabulated HWHM pressure broadening coefficients were tabulated

Returns

gamma_voigt, gamma_lb, gamma_db – Voigt, Lorentz, and Gaussian HWHM

Return type

numpy array

References

Notes: [Olivero-1977] uses FWHM.

Olivero-1977(1,2,3,4,5)

Olivero 1977 “Empirical fits to the Voigt line width: A brief review” Also found in NEQAIR96 Manual.

2

Wikipedia (in cm-1)

3

Eq. (A.12) in [Rothman-1998]

voigt_lineshape(w_centered, hwhm_lorentz, hwhm_voigt, jit=True)[source]

Calculates Voigt lineshape using the approximation of the Voigt profile of [NEQAIR-1996], [Whiting-1968] that maintains a good accuracy in the far wings. Exact for a pure Gaussian and pure Lorentzian.

Parameters
  • w_centered (2D array [one per line: shape W x N]) – waverange (nm / cm-1) (centered on 0)

  • hwhm_lorentz (array (cm-1) [length N]) – half-width half maximum coefficient (HWHM) for Lorentzian broadening

  • hwhm_voigt (array (cm-1) [length N]) – half-width half maximum coefficient (HWHM) for Voigt broadening, calculated by voigt_broadening_HWHM()

Other Parameters

jit (boolean) – if True, use just in time compiler. Usually faster when > 10k lines. Default True.

Returns

lineshape – line profile

Return type

pandas Series [shape N x W]

References

NEQAIR-1996

NEQAIR 1996 User Manual, Appendix D

whiting1968(w_centered, wl, wv)[source]

A pseudo-voigt analytical approximation.

\[\Phi(w)=\left(1-\frac{w_l}{w_v}\right) \operatorname{exp}\left(-2.772{\left(\frac{w}{w_v}\right)}^{2.25}\right)+\frac{1\frac{w_l}{w_v}}{1+4{\left(\frac{w}{w_v}\right)}^{2.25}}+0.016\left(1-\frac{w_l}{w_v}\right) \frac{w_l}{w_v} \left(\operatorname{exp}\left(-0.4w_{wv,225}\right)-\frac{10}{10+{\left(\frac{w}{w_v}\right)}^{2.25}}\right)\]
Parameters
  • w_centered (2D array) – broadening spectral range for all lines

  • wl (array) – Lorentzian FWHM

  • wv (array) – Voigt FWHM

References

Whiting-1968

Whiting 1968 “An empirical approximation to the Voigt profile”, JQSRT

Used in the expression of [Olivero-1977]

Notes

Performances:

using @jit yield a performance increase from 8.9s down to 5.1s on a 50k lines, 250k wavegrid case (performances.py)

See also

olivero_1977()