Source code for pyrad.lbl.hitran.doppler
from numpy import exp, log, pi, sqrt
[docs]class Doppler(object):
"""Doppler line profile.
Attributes:
halfwidth: Doppler-broadened halfwidth [cm-1].
parameters: List of HITRAN parameter names.
"""
def __init__(self):
self.parameters = ["center"]
self.halfwidth = None
[docs] def update(self, spectral_lines, temperature, *args, **kwargs):
"""Calculate per-spectral-line doppler-broadened halfwidths.
Args:
spectral_lines: SpectralLines object.
temperature: Temperature [K].
"""
self.halfwidth = doppler_broadened_halfwidth(temperature, spectral_lines.mass,
spectral_lines.v)
[docs] def profile(self, spectral_lines, v, index):
"""Calculate doppler profiles.
Args:
spectral_lines: SpectralLines object.
v: Wavenumber [cm-1].
index: Spectral line index.
Returns:
Line broadening [cm].
"""
return doppler_profile(v - spectral_lines.v[index], self.halfwidth[index])
[docs]def doppler_broadened_halfwidth(temperature, mass, transition_wavenumber):
"""Calculate the doppler-broadened line halfwidth.
Args:
temperature: Temperature [K].
mass: Molecular mass [g].
transition_wavenumber: Transition wavenumber [cm-1].
Returns:
Doppler-broadened line halfwidth [cm-1].
"""
m = mass/6.023e23 # Mass/Avagadro's number [g].
c = 2.99792458e10 # Speed of light [cm s-1].
kb = 1.380658e-16 # Boltzmann constant [erg K-1].
return sqrt(log(2.))*transition_wavenumber*sqrt(2.*kb*temperature/(m*c*c))
[docs]def doppler_profile(dv, halfwidth):
"""Calculates a Doppler line profile.
Args:
dv: Wavenumber distance from line center [cm-1].
halfwidth: Doppler-broadened line half-width [cm -1].
Returns:
Doppler line profile broadening [cm].
"""
alpha_d = halfwidth/sqrt(log(2))
return exp(-1.*dv*dv/(alpha_d*alpha_d))/(alpha_d*sqrt(pi))