Source code for solrat.atom_model.shared.utility.functions
import numpy as np
from numpy import exp
from solrat.atom_model.shared.utility.constants import c_cm_sm1, h_erg_s, kB_erg_Km1, mu0_erg_gaussm1
from solrat.engine.functions.decorators import log_function
from solrat.engine.functions.special import FloatOrNDArrayT
[docs]
def get_planck_BP(nu_sm1: FloatOrNDArrayT, temperature_K: float) -> FloatOrNDArrayT:
"""
Planck function
Reference: (below 5.40)
"""
return 2 * h_erg_s * nu_sm1**3 / c_cm_sm1**2 / (exp(h_erg_s * nu_sm1 / kB_erg_Km1 / temperature_K) - 1)
[docs]
def nu_larmor(magnetic_field_gauss: np.ndarray) -> np.ndarray:
"""
Larmor frequency in Hz
Reference: (3.10)
"""
return magnetic_field_gauss * mu0_erg_gaussm1 / h_erg_s
[docs]
def energy_cmm1_to_frequency_sm1(energy_cmm1: FloatOrNDArrayT) -> FloatOrNDArrayT:
"""
Convert energy to frequency
"""
return c_cm_sm1 * energy_cmm1
[docs]
def lambda_cm_to_frequency_sm1(lambda_cm: FloatOrNDArrayT) -> FloatOrNDArrayT:
"""
Convert wavelength to frequency
"""
return c_cm_sm1 / lambda_cm
[docs]
def lambda_A_to_frequency_sm1(lambda_A: FloatOrNDArrayT) -> FloatOrNDArrayT:
"""
Convert wavelength to frequency
"""
return c_cm_sm1 * 1e8 / lambda_A
[docs]
def frequency_sm1_to_lambda_A(frequency_sm1: FloatOrNDArrayT) -> FloatOrNDArrayT:
"""
Convert frequency to wavelength
"""
return c_cm_sm1 / frequency_sm1 * 1e8
[docs]
def energy_cmm1_to_erg(energy_cmm1: float) -> float:
"""
Convert energy units
"""
return h_erg_s * c_cm_sm1 * energy_cmm1
[docs]
def lambda_vacuum_to_air(lambda_vacuum_A: FloatOrNDArrayT) -> FloatOrNDArrayT:
"""
Convert vacuum wavelength to air wavelength (Angstrom).
Uses the Edlen (1966) formula, valid for ~2000-10000 A.
Reference: 10.1088/0026-1394/2/2/002
"""
sigma2 = (1e4 / lambda_vacuum_A) ** 2
n = 1 + (8342.13 + 2406030.0 / (130.0 - sigma2) + 15997.0 / (38.9 - sigma2)) * 1e-8
return lambda_vacuum_A / n
[docs]
def lambda_air_to_vacuum(lambda_air_A: FloatOrNDArrayT, n_iter: int = 3) -> FloatOrNDArrayT:
"""
Convert air wavelength to vacuum wavelength (Angstrom).
Inverts Edlen (1966) vacuum-to-air relation by fixed-point iteration.
Reference: 10.1088/0026-1394/2/2/002
"""
lambda_vac = lambda_air_A # initial guess
for _ in range(n_iter):
sigma2 = (1e4 / lambda_vac) ** 2
n = 1 + (8342.13 + 2406030.0 / (130.0 - sigma2) + 15997.0 / (38.9 - sigma2)) * 1e-8
lambda_vac = lambda_air_A * n
return lambda_vac
[docs]
@log_function
def get_frequencies_from_air_wavelength_range(
lower_wavelength_A: float, upper_wavelength_A: float, step_A: float
) -> np.ndarray:
"""
Build a frequency array (Hz) from a vacuum wavelength range (Angstrom).
"""
lambda_A_air = np.arange(lower_wavelength_A, upper_wavelength_A, step_A)
lambda_A_vac = lambda_air_to_vacuum(lambda_A_air)
return lambda_A_to_frequency_sm1(lambda_A_vac)