Source code for sasktran2.constituent.rayleigh
from __future__ import annotations
import numpy as np
import sasktran2 as sk
from sasktran2._core_rust import PyRayleigh
from .base import Constituent
[docs]
class Rayleigh(Constituent):
_rayleigh: PyRayleigh
[docs]
def __init__(
self,
method: str = "bates",
n2_percentage: float = 78.084,
o2_percentage: float = 20.946,
ar_percentage: float = 0.934,
co2_percentage: float = 0.036,
wavelengths_nm: np.ndarray = None,
xs: np.ndarray = None,
king_factor: np.ndarray = None,
) -> None:
"""
An implementation of Rayleigh scattering. Cross sections (and depolarization factors) can be
calculated multiple ways, with the default method being that of 'bates'.
Rayleigh scattering number density is estimated through the ideal gas law.
This Constituent requires that the atmosphere object have `temperature_k`, `pressure_pa`, and
`wavelength_nm` are all defined inside the :py:class:`sasktran2.Atmosphere` object.
Parameters
----------
method : str, default='bates'
Method to use to calculate the cross section. Supported methods are
['bates', 'manual'], by default 'bates'
n2_percentage : float, optional
Percentage of N2 in the atmosphere, by default 78.084
o2_percentage : float, optional
Percentage of O2 in the atmosphere, by default 20.946
ar_percentage : float, optional
Percentage of Ar in the atmosphere, by default 0.934
co2_percentage : float, optional
Percentage of CO2 in the atmosphere, by default 0.036
wavelengths_nm : numpy.ndarray
Wavelengths in nm to use for the cross section
xs : numpy.ndarray
Cross section in m2/molecule to use for the cross section
king_factor : numpy.ndarray
King factor to use for the cross section
Raises
------
ValueError
If input method is not supported
"""
self._rayleigh = PyRayleigh(
method=method.lower(),
n2_percentage=n2_percentage,
o2_percentage=o2_percentage,
ar_percentage=ar_percentage,
co2_percentage=co2_percentage,
wavelengths_nm=(
wavelengths_nm.astype(np.float64)
if wavelengths_nm is not None
else None
),
xs=xs.astype(np.float64) if xs is not None else None,
king_factor=(
king_factor.astype(np.float64) if king_factor is not None else None
),
)
def add_to_atmosphere(self, atmo: sk.Atmosphere):
"""
Parameters
----------
atmo : sk.Atmosphere
:meta private:
"""
self._rayleigh.add_to_atmosphere(atmo)
def register_derivative(self, atmo: sk.Atmosphere, name: str):
self._rayleigh.register_derivative(atmo, name)