Source code for pyrad.lbl.hitran.voigt

from numpy import log, pi, sqrt
from scipy.special import wofz

from .doppler import doppler_broadened_halfwidth
from .lorentz import pressure_broadened_halfwidth


[docs]class Voigt(object): """Voigt line profile. Attributes: doppler_halfwidth: Doppler-broadened halfwidth [cm-1]. parameters: List of HITRAN parameter names. pressure_halfwidth: Pressure-broadened halfwidth [cm-1]. """ def __init__(self): self.parameters = ["center", "gamma_air", "gamma_self", "n_air"] self.doppler_halfwidth = None self.pressure_halfwidth = None
[docs] def update(self, spectral_lines, temperature, pressure, partial_pressure): """Calculate per-spectral-line pressure-broadened halfwidths. Args: spectral_lines: SpectralLines object. temperature: Temperature [K]. pressure: Pressure [atm]. partial_pressure: Partial pressure [atm]. """ self.doppler_halfwidth = doppler_broadened_halfwidth(temperature, spectral_lines.mass, spectral_lines.v) self.pressure_halfwidth = pressure_broadened_halfwidth(pressure, partial_pressure, temperature, spectral_lines.n_air, spectral_lines.gamma_air, spectral_lines.gamma_self)
[docs] def profile(self, spectral_lines, v, index): """Calculate Voigt profiles. Args: spectral_lines: SpectralLines object. v: Wavenumber [cm-1]. index: Spectral line index. Returns: Line broadening [cm]. """ return voigt_profile(v - spectral_lines.v[index], self.pressure_halfwidth[index], self.doppler_halfwidth[index])
[docs]def voigt_profile(dv, pressure_halfwidth, doppler_halfwidth): """Calculates a Voigt line profile. Args: dv: Wavenumber distance from line center [cm-1]. pressure_halfwidth: Pressure-broadened line half-width [cm -1]. doppler_halfwidth: Doppler-broadened line half-width [cm -1]. Returns: Voigt line profile broadening [cm]. """ sigma = doppler_halfwidth/sqrt(2*log(2)) return wofz((dv + 1j*pressure_halfwidth)/sigma/sqrt(2)).real/sigma/sqrt(2*pi)