Source code for colour.phenomena.rayleigh

"""
Rayleigh Optical Depth - Scattering in the Atmosphere
=====================================================

Implement *Rayleigh* scattering and optical depth computation in the
atmosphere.

-   :func:`colour.scattering_cross_section`
-   :func:`colour.phenomena.rayleigh_optical_depth`
-   :func:`colour.rayleigh_scattering`

References
----------
-   :cite:`Bodhaine1999a` : Bodhaine, B. A., Wood, N. B., Dutton, E. G., &
    Slusser, J. R. (1999). On Rayleigh Optical Depth Calculations. Journal of
    Atmospheric and Oceanic Technology, 16(11), 1854-1861.
    doi:10.1175/1520-0426(1999)016<1854:ORODC>2.0.CO;2
-   :cite:`Wikipedia2001c` : Wikipedia. (2001). Rayleigh scattering. Retrieved
    September 23, 2014, from http://en.wikipedia.org/wiki/Rayleigh_scattering
"""

from __future__ import annotations

import typing

import numpy as np

from colour.algebra import sdiv, sdiv_mode
from colour.colorimetry import (
    SPECTRAL_SHAPE_DEFAULT,
    SpectralDistribution,
    SpectralShape,
)
from colour.constants import CONSTANT_AVOGADRO

if typing.TYPE_CHECKING:
    from colour.hints import ArrayLike, Callable, NDArrayFloat

from colour.utilities import as_float, as_float_array, filter_kwargs

__author__ = "Colour Developers"
__copyright__ = "Copyright 2013 Colour Developers"
__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
__maintainer__ = "Colour Developers"
__email__ = "colour-developers@colour-science.org"
__status__ = "Production"

__all__ = [
    "CONSTANT_STANDARD_AIR_TEMPERATURE",
    "CONSTANT_STANDARD_CO2_CONCENTRATION",
    "CONSTANT_AVERAGE_PRESSURE_MEAN_SEA_LEVEL",
    "CONSTANT_DEFAULT_LATITUDE",
    "CONSTANT_DEFAULT_ALTITUDE",
    "air_refraction_index_Penndorf1957",
    "air_refraction_index_Edlen1966",
    "air_refraction_index_Peck1972",
    "air_refraction_index_Bodhaine1999",
    "N2_depolarisation",
    "O2_depolarisation",
    "F_air_Penndorf1957",
    "F_air_Young1981",
    "F_air_Bates1984",
    "F_air_Bodhaine1999",
    "molecular_density",
    "mean_molecular_weights",
    "gravity_List1968",
    "scattering_cross_section",
    "rayleigh_optical_depth",
    "rayleigh_scattering",
    "sd_rayleigh_scattering",
]

CONSTANT_STANDARD_AIR_TEMPERATURE: float = 288.15
"""*Standard air* temperature :math:`T[K]` in kelvin degrees (:math:`15\\circ C`)."""

CONSTANT_STANDARD_CO2_CONCENTRATION: float = 300
"""*Standard air* :math:`CO_2` concentration in parts per million (ppm)."""

CONSTANT_AVERAGE_PRESSURE_MEAN_SEA_LEVEL: float = 101325
"""*Standard air* average pressure :math:`Hg` at mean sea-level in pascal (Pa)."""

CONSTANT_DEFAULT_LATITUDE: float = 0
"""Default latitude in degrees (equator)."""

CONSTANT_DEFAULT_ALTITUDE: float = 0
"""Default altitude in meters (sea level)."""


def air_refraction_index_Penndorf1957(
    wavelength: ArrayLike,
) -> NDArrayFloat:
    """
    Compute the air refraction index :math:`n_s` from the specified wavelength
    :math:`\\lambda` in micrometers (:math:`\\mu m`) using the
    *Penndorf (1957)* method.

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Returns
    -------
    :class:`numpy.ndarray`
        Air refraction index :math:`n_s`.

    Examples
    --------
    >>> air_refraction_index_Penndorf1957(0.555)  # doctest: +ELLIPSIS
    np.float64(1.0002777...)
    """

    wl = as_float_array(wavelength)

    n = 6432.8 + 2949810 / (146 - wl ** (-2)) + 25540 / (41 - wl ** (-2))
    n /= 1.0e8
    n += +1

    return n


def air_refraction_index_Edlen1966(
    wavelength: ArrayLike,
) -> NDArrayFloat:
    """
    Compute the air refraction index :math:`n_s` from the specified wavelength
    :math:`\\lambda` in micrometers (:math:`\\mu m`) using the
    *Edlen (1966)* method.

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Returns
    -------
    :class:`numpy.ndarray`
        Air refraction index :math:`n_s`.

    Examples
    --------
    >>> air_refraction_index_Edlen1966(0.555)  # doctest: +ELLIPSIS
    np.float64(1.0002777...)
    """

    wl = as_float_array(wavelength)

    n = 8342.13 + 2406030 / (130 - wl ** (-2)) + 15997 / (38.9 - wl ** (-2))
    n /= 1.0e8
    n += +1

    return n


def air_refraction_index_Peck1972(
    wavelength: ArrayLike,
) -> NDArrayFloat:
    """
    Compute the air refraction index :math:`n_s` from the specified wavelength
    :math:`\\lambda` in micrometers (:math:`\\mu m`) using the
    *Peck and Reeder (1972)* method.

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Returns
    -------
    :class:`numpy.ndarray`
        Air refraction index :math:`n_s`.

    Examples
    --------
    >>> air_refraction_index_Peck1972(0.555)  # doctest: +ELLIPSIS
    np.float64(1.0002777...)
    """

    wl = as_float_array(wavelength)

    n = 8060.51 + 2480990 / (132.274 - wl ** (-2)) + 17455.7 / (39.32957 - wl ** (-2))
    n /= 1.0e8
    n += +1

    return n


def air_refraction_index_Bodhaine1999(
    wavelength: ArrayLike,
    CO2_concentration: ArrayLike = CONSTANT_STANDARD_CO2_CONCENTRATION,
) -> NDArrayFloat:
    """
    Compute the air refraction index :math:`n_s` from the specified wavelength
    :math:`\\lambda` in micrometers (:math:`\\mu m`) using the
    *Bodhaine, Wood, Dutton and Slusser (1999)* method.

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).
    CO2_concentration
        :math:`CO_2` concentration in parts per million (ppm).

    Returns
    -------
    :class:`numpy.ndarray`
        Air refraction index :math:`n_s`.

    Examples
    --------
    >>> air_refraction_index_Bodhaine1999(0.555)  # doctest: +ELLIPSIS
    np.float64(1.0002777...)
    """

    wl = as_float_array(wavelength)
    CO2_c = as_float_array(CO2_concentration)

    # Converting from parts per million (ppm) to parts per volume (ppv).
    CO2_c = CO2_c * 1e-6

    n = (1 + 0.54 * (CO2_c - 300e-6)) * (air_refraction_index_Peck1972(wl) - 1) + 1

    return as_float(n)


def N2_depolarisation(wavelength: ArrayLike) -> NDArrayFloat:
    """
    Compute the depolarisation of nitrogen :math:`N_2` as a function of
    wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Returns
    -------
    :class:`numpy.ndarray`
        Nitrogen :math:`N_2` depolarisation.

    Examples
    --------
    >>> N2_depolarisation(0.555)  # doctest: +ELLIPSIS
    np.float64(1.0350291...)
    """

    wl = as_float_array(wavelength)

    return 1.034 + 3.17 * 1.0e-4 * (1 / wl**2)


def O2_depolarisation(wavelength: ArrayLike) -> NDArrayFloat:
    """
    Compute the depolarisation of oxygen :math:`O_2` as a function of
    wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Returns
    -------
    :class:`numpy.ndarray`
        Oxygen :math:`O_2` depolarisation.

    Examples
    --------
    >>> O2_depolarisation(0.555)  # doctest: +ELLIPSIS
    np.float64(1.1020225...)
    """

    wl = as_float_array(wavelength)

    return 1.096 + 1.385 * 1.0e-3 * (1 / wl**2) + 1.448 * 1.0e-4 * (1 / wl**4)


def F_air_Penndorf1957(wavelength: ArrayLike) -> NDArrayFloat:
    """
    Compute the depolarisation term :math:`F(air)` or *King Factor* using
    the *Penndorf (1957)* method.

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Returns
    -------
    :class:`numpy.ndarray`
        Air depolarisation term.

    Notes
    -----
    -   The *wavelength* parameter is provided for consistency with other
        air depolarisation methods but is not used in this implementation,
        which returns a constant value.

    Examples
    --------
    >>> F_air_Penndorf1957(0.555)
    np.float64(1.0608)
    """

    wl = as_float_array(wavelength)

    return as_float(np.resize(np.array([1.0608]), wl.shape))


def F_air_Young1981(wavelength: ArrayLike) -> NDArrayFloat:
    """
    Compute the depolarisation term :math:`F(air)` or *King Factor* using
    the *Young (1981)* method.

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Returns
    -------
    :class:`numpy.ndarray`
        Air depolarisation term.

    Notes
    -----
    -   The *wavelength* parameter is provided for consistency with other
        air depolarisation methods but is not used in this implementation,
        which returns a constant value.

    Examples
    --------
    >>> F_air_Young1981(0.555)
    np.float64(1.048)
    """

    wl = as_float_array(wavelength)

    return as_float(np.resize(np.array([1.0480]), wl.shape))


def F_air_Bates1984(wavelength: ArrayLike) -> NDArrayFloat:
    """
    Compute the depolarisation term :math:`F(air)` or *King Factor* using
    the *Bates (1984)* method.
    (:math:`\\mu m`) using *Bates (1984)* method.

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).

    Returns
    -------
    :class:`numpy.ndarray`
        Air depolarisation term.

    Examples
    --------
    >>> F_air_Bates1984(0.555)  # doctest: +ELLIPSIS
    np.float64(1.0481535...)
    """

    O2 = O2_depolarisation(wavelength)
    N2 = N2_depolarisation(wavelength)
    Ar = 1.00
    CO2 = 1.15

    return (78.084 * N2 + 20.946 * O2 + CO2 + Ar) / (78.084 + 20.946 + Ar + CO2)


def F_air_Bodhaine1999(
    wavelength: ArrayLike,
    CO2_concentration: ArrayLike = CONSTANT_STANDARD_CO2_CONCENTRATION,
) -> NDArrayFloat:
    """
    Compute the depolarisation term :math:`F(air)` or *King Factor* as a
    function of wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`)
    and :math:`CO_2` concentration in parts per million (ppm) using the
    *Bodhaine, Wood, Dutton and Slusser (1999)* method.

    Parameters
    ----------
    wavelength
        Wavelength :math:`\\lambda` in micrometers (:math:`\\mu m`).
    CO2_concentration
        :math:`CO_2` concentration in parts per million (ppm).

    Returns
    -------
    :class:`numpy.ndarray`
        Air depolarisation term.

    Examples
    --------
    >>> F_air_Bodhaine1999(0.555)  # doctest: +ELLIPSIS
    np.float64(1.0487697...)
    """

    O2 = O2_depolarisation(wavelength)
    N2 = N2_depolarisation(wavelength)
    CO2_c = as_float_array(CO2_concentration)

    # Converting from parts per million (ppm) to parts per volume per percent.
    CO2_c = CO2_c * 1e-4

    return (78.084 * N2 + 20.946 * O2 + 0.934 * 1 + CO2_c * 1.15) / (
        78.084 + 20.946 + 0.934 + CO2_c
    )


def molecular_density(
    temperature: ArrayLike = CONSTANT_STANDARD_AIR_TEMPERATURE,
    avogadro_constant: ArrayLike = CONSTANT_AVOGADRO,
) -> NDArrayFloat:
    """
    Compute the molecular density :math:`N_s` (molecules :math:`cm^{-3}`)
    as function of air temperature :math:`T[K]` in kelvin degrees.

    Parameters
    ----------
    temperature
        Air temperature :math:`T[K]` in kelvin degrees.
    avogadro_constant
        *Avogadro*'s number (molecules :math:`mol^{-1}`).

    Returns
    -------
    :class:`numpy.ndarray`
        Molecular density :math:`N_s` (molecules :math:`cm^{-3}`).

    Notes
    -----
    -   The *Avogadro*'s number used in this implementation is the one
        specified by the Committee on Data for Science and Technology
        (CODATA): :math:`6.02214179 \\times 10^{23}`, which differs from
        the reference :cite:`Bodhaine1999a` value
        :math:`6.0221367 \\times 10^{23}`.

    Examples
    --------
    >>> molecular_density(288.15)  # doctest: +ELLIPSIS
    np.float64(2.5469021...e+19)
    >>> molecular_density(288.15, 6.0221367e23)  # doctest: +ELLIPSIS
    np.float64(2.5468999...e+19)
    """

    T = as_float_array(temperature)
    avogadro_constant = as_float_array(avogadro_constant)

    with sdiv_mode():
        return (avogadro_constant / 22.4141) * sdiv(273.15, T) * (1 / 1000)


def mean_molecular_weights(
    CO2_concentration: ArrayLike = CONSTANT_STANDARD_CO2_CONCENTRATION,
) -> NDArrayFloat:
    """
    Compute the mean molecular weights :math:`m_a` for dry air as a function
    of :math:`CO_2` concentration in parts per million (ppm).

    Parameters
    ----------
    CO2_concentration
        :math:`CO_2` concentration in parts per million (ppm).

    Returns
    -------
    :class:`numpy.ndarray`
        Mean molecular weights :math:`m_a` for dry air.

    Examples
    --------
    >>> mean_molecular_weights()  # doctest: +ELLIPSIS
    np.float64(28.9640166...)
    """

    CO2_concentration = as_float_array(CO2_concentration)

    CO2_c = CO2_concentration * 1.0e-6

    return 15.0556 * CO2_c + 28.9595


def gravity_List1968(
    latitude: ArrayLike = CONSTANT_DEFAULT_LATITUDE,
    altitude: ArrayLike = CONSTANT_DEFAULT_ALTITUDE,
) -> NDArrayFloat:
    """
    Compute the gravity :math:`g` in :math:`cm/s^2` (gal) representative of
    the mass-weighted column of air molecules above the site at the specified
    latitude and altitude using the *List (1968)* method.

    Parameters
    ----------
    latitude
        Latitude of the site in degrees.
    altitude
        Altitude of the site in meters.

    Returns
    -------
    :class:`numpy.ndarray`
        Gravity :math:`g` in :math:`cm/s^2` (gal).

    Examples
    --------
    >>> gravity_List1968()  # doctest: +ELLIPSIS
    np.float64(978.0356070...)
    >>> gravity_List1968(0.0, 1500.0)  # doctest: +ELLIPSIS
    np.float64(977.5726106...)

    Gravity :math:`g` for Paris:

    >>> gravity_List1968(48.8567, 35.0)  # doctest: +ELLIPSIS
    np.float64(980.9524178...)
    """

    latitude = as_float_array(latitude)
    altitude = as_float_array(altitude)

    cos2phi = np.cos(2 * np.radians(latitude))

    # Sea level acceleration of gravity.
    g0 = 980.6160 * (1 - 0.0026373 * cos2phi + 0.0000059 * cos2phi**2)

    return (
        g0
        - (3.085462e-4 + 2.27e-7 * cos2phi) * altitude
        + (7.254e-11 + 1.0e-13 * cos2phi) * altitude**2
        - (1.517e-17 + 6e-20 * cos2phi) * altitude**3
    )


[docs] def scattering_cross_section( wavelength: ArrayLike, CO2_concentration: ArrayLike = CONSTANT_STANDARD_CO2_CONCENTRATION, temperature: ArrayLike = CONSTANT_STANDARD_AIR_TEMPERATURE, avogadro_constant: ArrayLike = CONSTANT_AVOGADRO, n_s_function: Callable = air_refraction_index_Bodhaine1999, F_air_function: Callable = F_air_Bodhaine1999, ) -> NDArrayFloat: """ Compute the scattering cross-section per molecule :math:`\\sigma` of dry air as a function of wavelength :math:`\\lambda` in centimeters (cm) using the specified :math:`CO_2` concentration in parts per million (ppm) and temperature :math:`T[K]` in kelvin degrees following the *Van de Hulst (1957)* method. Parameters ---------- wavelength Wavelength :math:`\\lambda` in centimeters (cm). CO2_concentration :math:`CO_2` concentration in parts per million (ppm). temperature Air temperature :math:`T[K]` in kelvin degrees. avogadro_constant *Avogadro*'s number (molecules :math:`mol^{-1}`). n_s_function Air refraction index :math:`n_s` computation method. F_air_function :math:`(6+3_p)/(6-7_p)`, the depolarisation term :math:`F(air)` or *King Factor* computation method. Returns ------- :class:`numpy.ndarray` Scattering cross-section per molecule :math:`\\sigma` of dry air. Warnings -------- Unlike most objects of :mod:`colour.phenomena.rayleigh` module, :func:`colour.scattering_cross_section` expects wavelength :math:`\\lambda` to be expressed in centimeters (cm). References ---------- :cite:`Bodhaine1999a`, :cite:`Wikipedia2001c` Examples -------- >>> scattering_cross_section(555 * 10e-8) # doctest: +ELLIPSIS np.float64(4.3466692...e-27) """ wl = as_float_array(wavelength) CO2_c = as_float_array(CO2_concentration) temperature = as_float_array(temperature) wl_micrometers = wl * 10e3 N_s = molecular_density(temperature, avogadro_constant) n_s = n_s_function(wl_micrometers) # n_s = n_s_function(**filter_kwargs( # n_s_function, wavelength=wl_micrometers, CO2_concentration=CO2_c)) F_air = F_air_function( **filter_kwargs( F_air_function, wavelength=wl_micrometers, CO2_concentration=CO2_c ) ) sigma = 24 * np.pi**3 * (n_s**2 - 1) ** 2 / (wl**4 * N_s**2 * (n_s**2 + 2) ** 2) sigma *= F_air return sigma
[docs] def rayleigh_optical_depth( wavelength: ArrayLike, CO2_concentration: ArrayLike = CONSTANT_STANDARD_CO2_CONCENTRATION, temperature: ArrayLike = CONSTANT_STANDARD_AIR_TEMPERATURE, pressure: ArrayLike = CONSTANT_AVERAGE_PRESSURE_MEAN_SEA_LEVEL, latitude: ArrayLike = CONSTANT_DEFAULT_LATITUDE, altitude: ArrayLike = CONSTANT_DEFAULT_ALTITUDE, avogadro_constant: ArrayLike = CONSTANT_AVOGADRO, n_s_function: Callable = air_refraction_index_Bodhaine1999, F_air_function: Callable = F_air_Bodhaine1999, ) -> NDArrayFloat: """ Compute the *Rayleigh* optical depth :math:`T_r(\\lambda)` as a function of wavelength :math:`\\lambda` in centimeters (cm). Parameters ---------- wavelength Wavelength :math:`\\lambda` in centimeters (cm). CO2_concentration :math:`CO_2` concentration in parts per million (ppm). temperature Air temperature :math:`T[K]` in kelvin degrees. pressure Surface pressure :math:`P` of the measurement site. latitude Latitude of the site in degrees. altitude Altitude of the site in meters. avogadro_constant *Avogadro*'s number (molecules :math:`mol^{-1}`). n_s_function Air refraction index :math:`n_s` computation method. F_air_function :math:`(6+3_p)/(6-7_p)`, the depolarisation term :math:`F(air)` or *King Factor* computation method. Returns ------- :class:`numpy.ndarray` *Rayleigh* optical depth :math:`T_r(\\lambda)`. Warnings -------- Unlike most objects of :mod:`colour.phenomena.rayleigh` module, :func:`colour.phenomena.rayleigh_optical_depth` expects wavelength :math:`\\lambda` to be expressed in centimeters (cm). References ---------- :cite:`Bodhaine1999a`, :cite:`Wikipedia2001c` Examples -------- >>> rayleigh_optical_depth(555 * 10e-8) # doctest: +ELLIPSIS np.float64(0.0936290...) """ wavelength = as_float_array(wavelength) CO2_c = as_float_array(CO2_concentration) pressure = as_float_array(pressure) latitude = as_float_array(latitude) altitude = as_float_array(altitude) avogadro_constant = as_float_array(avogadro_constant) # Conversion from pascal to dyne/cm2. P = as_float_array(pressure * 10) sigma = scattering_cross_section( wavelength, CO2_c, temperature, avogadro_constant, n_s_function, F_air_function, ) m_a = mean_molecular_weights(CO2_c) g = gravity_List1968(latitude, altitude) T_R = sigma * (P * avogadro_constant) / (m_a * g) return as_float(T_R)
rayleigh_scattering = rayleigh_optical_depth
[docs] def sd_rayleigh_scattering( shape: SpectralShape = SPECTRAL_SHAPE_DEFAULT, CO2_concentration: ArrayLike = CONSTANT_STANDARD_CO2_CONCENTRATION, temperature: ArrayLike = CONSTANT_STANDARD_AIR_TEMPERATURE, pressure: ArrayLike = CONSTANT_AVERAGE_PRESSURE_MEAN_SEA_LEVEL, latitude: ArrayLike = CONSTANT_DEFAULT_LATITUDE, altitude: ArrayLike = CONSTANT_DEFAULT_ALTITUDE, avogadro_constant: ArrayLike = CONSTANT_AVOGADRO, n_s_function: Callable = air_refraction_index_Bodhaine1999, F_air_function: Callable = F_air_Bodhaine1999, ) -> SpectralDistribution: """ Generate *Rayleigh* scattering spectral distribution for the specified spectral shape. Parameters ---------- shape Spectral shape used to create the *Rayleigh* scattering spectral distribution. CO2_concentration :math:`CO_2` concentration in parts per million (ppm). temperature Air temperature :math:`T[K]` in kelvin degrees. pressure Surface pressure :math:`P` of the measurement site. latitude Latitude of the site in degrees. altitude Altitude of the site in meters. avogadro_constant *Avogadro*'s number (molecules :math:`mol^{-1}`). n_s_function Air refraction index :math:`n_s` computation method. F_air_function :math:`(6+3_p)/(6-7_p)`, the depolarisation term :math:`F(air)` or *King Factor* computation method. Returns ------- :class:`colour.SpectralDistribution` *Rayleigh* optical depth spectral distribution. References ---------- :cite:`Bodhaine1999a`, :cite:`Wikipedia2001c` Examples -------- >>> from colour.utilities import numpy_print_options >>> with numpy_print_options(suppress=True): ... sd_rayleigh_scattering() # doctest: +ELLIPSIS SpectralDistribution([[360. , 0.5602465...], [361. , 0.5537481...], [362. , 0.5473446...], [363. , 0.5410345...], [364. , 0.5348161...], [365. , 0.5286877...], [366. , 0.5226477...], [367. , 0.5166948...], [368. , 0.5108272...], [369. , 0.5050436...], [370. , 0.4993425...], [371. , 0.4937224...], [372. , 0.4881820...], [373. , 0.4827199...], [374. , 0.4773348...], [375. , 0.4720253...], [376. , 0.4667902...], [377. , 0.4616282...], [378. , 0.4565380...], [379. , 0.4515186...], [380. , 0.4465686...], [381. , 0.4416869...], [382. , 0.4368724...], [383. , 0.4321240...], [384. , 0.4274405...], [385. , 0.4228209...], [386. , 0.4182641...], [387. , 0.4137692...], [388. , 0.4093350...], [389. , 0.4049607...], [390. , 0.4006451...], [391. , 0.3963874...], [392. , 0.3921867...], [393. , 0.3880419...], [394. , 0.3839523...], [395. , 0.3799169...], [396. , 0.3759348...], [397. , 0.3720053...], [398. , 0.3681274...], [399. , 0.3643003...], [400. , 0.3605233...], [401. , 0.3567956...], [402. , 0.3531163...], [403. , 0.3494847...], [404. , 0.3459001...], [405. , 0.3423617...], [406. , 0.3388689...], [407. , 0.3354208...], [408. , 0.3320169...], [409. , 0.3286563...], [410. , 0.3253386...], [411. , 0.3220629...], [412. , 0.3188287...], [413. , 0.3156354...], [414. , 0.3124822...], [415. , 0.3093687...], [416. , 0.3062941...], [417. , 0.3032579...], [418. , 0.3002596...], [419. , 0.2972985...], [420. , 0.2943741...], [421. , 0.2914858...], [422. , 0.2886332...], [423. , 0.2858157...], [424. , 0.2830327...], [425. , 0.2802837...], [426. , 0.2775683...], [427. , 0.2748860...], [428. , 0.2722362...], [429. , 0.2696185...], [430. , 0.2670324...], [431. , 0.2644775...], [432. , 0.2619533...], [433. , 0.2594594...], [434. , 0.2569952...], [435. , 0.2545605...], [436. , 0.2521548...], [437. , 0.2497776...], [438. , 0.2474285...], [439. , 0.2451072...], [440. , 0.2428133...], [441. , 0.2405463...], [442. , 0.2383059...], [443. , 0.2360916...], [444. , 0.2339033...], [445. , 0.2317404...], [446. , 0.2296026...], [447. , 0.2274895...], [448. , 0.2254009...], [449. , 0.2233364...], [450. , 0.2212956...], [451. , 0.2192782...], [452. , 0.2172839...], [453. , 0.2153124...], [454. , 0.2133633...], [455. , 0.2114364...], [456. , 0.2095313...], [457. , 0.2076478...], [458. , 0.2057855...], [459. , 0.2039442...], [460. , 0.2021235...], [461. , 0.2003233...], [462. , 0.1985432...], [463. , 0.1967829...], [464. , 0.1950423...], [465. , 0.1933209...], [466. , 0.1916186...], [467. , 0.1899351...], [468. , 0.1882702...], [469. , 0.1866236...], [470. , 0.1849951...], [471. , 0.1833844...], [472. , 0.1817913...], [473. , 0.1802156...], [474. , 0.1786570...], [475. , 0.1771153...], [476. , 0.1755903...], [477. , 0.1740818...], [478. , 0.1725895...], [479. , 0.1711133...], [480. , 0.1696529...], [481. , 0.1682082...], [482. , 0.1667789...], [483. , 0.1653648...], [484. , 0.1639658...], [485. , 0.1625816...], [486. , 0.1612121...], [487. , 0.1598570...], [488. , 0.1585163...], [489. , 0.1571896...], [490. , 0.1558769...], [491. , 0.1545779...], [492. , 0.1532925...], [493. , 0.1520205...], [494. , 0.1507617...], [495. , 0.1495160...], [496. , 0.1482832...], [497. , 0.1470632...], [498. , 0.1458558...], [499. , 0.1446607...], [500. , 0.1434780...], [501. , 0.1423074...], [502. , 0.1411488...], [503. , 0.140002...], [504. , 0.1388668...], [505. , 0.1377433...], [506. , 0.1366311...], [507. , 0.1355301...], [508. , 0.1344403...], [509. , 0.1333615...], [510. , 0.1322936...], [511. , 0.1312363...], [512. , 0.1301897...], [513. , 0.1291535...], [514. , 0.1281277...], [515. , 0.1271121...], [516. , 0.1261065...], [517. , 0.1251110...], [518. , 0.1241253...], [519. , 0.1231493...], [520. , 0.1221829...], [521. , 0.1212261...], [522. , 0.1202786...], [523. , 0.1193405...], [524. , 0.1184115...], [525. , 0.1174915...], [526. , 0.1165806...], [527. , 0.1156784...], [528. , 0.1147851...], [529. , 0.1139004...], [530. , 0.1130242...], [531. , 0.1121564...], [532. , 0.1112971...], [533. , 0.1104459...], [534. , 0.1096030...], [535. , 0.1087681...], [536. , 0.1079411...], [537. , 0.1071221...], [538. , 0.1063108...], [539. , 0.1055072...], [540. , 0.1047113...], [541. , 0.1039229...], [542. , 0.1031419...], [543. , 0.1023682...], [544. , 0.1016019...], [545. , 0.1008427...], [546. , 0.1000906...], [547. , 0.0993456...], [548. , 0.0986075...], [549. , 0.0978763...], [550. , 0.0971519...], [551. , 0.0964342...], [552. , 0.0957231...], [553. , 0.0950186...], [554. , 0.0943206...], [555. , 0.0936290...], [556. , 0.0929438...], [557. , 0.0922649...], [558. , 0.0915922...], [559. , 0.0909256...], [560. , 0.0902651...], [561. , 0.0896106...], [562. , 0.0889620...], [563. , 0.0883194...], [564. , 0.0876825...], [565. , 0.0870514...], [566. , 0.0864260...], [567. , 0.0858063...], [568. , 0.0851921...], [569. , 0.0845834...], [570. , 0.0839801...], [571. , 0.0833822...], [572. , 0.0827897...], [573. , 0.0822025...], [574. , 0.0816204...], [575. , 0.0810436...], [576. , 0.0804718...], [577. , 0.0799051...], [578. , 0.0793434...], [579. , 0.0787866...], [580. , 0.0782347...], [581. , 0.0776877...], [582. , 0.0771454...], [583. , 0.0766079...], [584. , 0.0760751...], [585. , 0.0755469...], [586. , 0.0750234...], [587. , 0.0745043...], [588. , 0.0739898...], [589. , 0.0734797...], [590. , 0.0729740...], [591. , 0.0724727...], [592. , 0.0719757...], [593. , 0.0714830...], [594. , 0.0709944...], [595. , 0.0705101...], [596. , 0.0700299...], [597. , 0.0695538...], [598. , 0.0690818...], [599. , 0.0686137...], [600. , 0.0681497...], [601. , 0.0676895...], [602. , 0.0672333...], [603. , 0.0667809...], [604. , 0.0663323...], [605. , 0.0658875...], [606. , 0.0654464...], [607. , 0.0650091...], [608. , 0.0645753...], [609. , 0.0641453...], [610. , 0.0637187...], [611. , 0.0632958...], [612. , 0.0628764...], [613. , 0.0624604...], [614. , 0.0620479...], [615. , 0.0616388...], [616. , 0.0612331...], [617. , 0.0608307...], [618. , 0.0604316...], [619. , 0.0600358...], [620. , 0.0596433...], [621. , 0.0592539...], [622. , 0.0588678...], [623. , 0.0584848...], [624. , 0.0581049...], [625. , 0.0577281...], [626. , 0.0573544...], [627. , 0.0569837...], [628. , 0.0566160...], [629. , 0.0562513...], [630. , 0.0558895...], [631. , 0.0555306...], [632. , 0.0551746...], [633. , 0.0548215...], [634. , 0.0544712...], [635. , 0.0541237...], [636. , 0.0537789...], [637. , 0.0534369...], [638. , 0.0530977...], [639. , 0.0527611...], [640. , 0.0524272...], [641. , 0.0520960...], [642. , 0.0517674...], [643. , 0.0514413...], [644. , 0.0511179...], [645. , 0.0507970...], [646. , 0.0504786...], [647. , 0.0501627...], [648. , 0.0498493...], [649. , 0.0495383...], [650. , 0.0492298...], [651. , 0.0489236...], [652. , 0.0486199...], [653. , 0.0483185...], [654. , 0.0480194...], [655. , 0.0477227...], [656. , 0.0474283...], [657. , 0.0471361...], [658. , 0.0468462...], [659. , 0.0465585...], [660. , 0.0462730...], [661. , 0.0459898...], [662. , 0.0457087...], [663. , 0.0454297...], [664. , 0.0451529...], [665. , 0.0448782...], [666. , 0.0446055...], [667. , 0.0443350...], [668. , 0.0440665...], [669. , 0.0438000...], [670. , 0.0435356...], [671. , 0.0432731...], [672. , 0.0430127...], [673. , 0.0427542...], [674. , 0.0424976...], [675. , 0.0422430...], [676. , 0.0419902...], [677. , 0.0417394...], [678. , 0.0414905...], [679. , 0.0412434...], [680. , 0.0409981...], [681. , 0.0407547...], [682. , 0.0405131...], [683. , 0.0402732...], [684. , 0.0400352...], [685. , 0.0397989...], [686. , 0.0395643...], [687. , 0.0393315...], [688. , 0.0391004...], [689. , 0.0388710...], [690. , 0.0386433...], [691. , 0.0384173...], [692. , 0.0381929...], [693. , 0.0379701...], [694. , 0.0377490...], [695. , 0.0375295...], [696. , 0.0373115...], [697. , 0.0370952...], [698. , 0.0368804...], [699. , 0.0366672...], [700. , 0.0364556...], [701. , 0.0362454...], [702. , 0.0360368...], [703. , 0.0358297...], [704. , 0.0356241...], [705. , 0.0354199...], [706. , 0.0352172...], [707. , 0.0350160...], [708. , 0.0348162...], [709. , 0.0346178...], [710. , 0.0344208...], [711. , 0.0342253...], [712. , 0.0340311...], [713. , 0.0338383...], [714. , 0.0336469...], [715. , 0.0334569...], [716. , 0.0332681...], [717. , 0.0330807...], [718. , 0.0328947...], [719. , 0.0327099...], [720. , 0.0325264...], [721. , 0.0323443...], [722. , 0.0321634...], [723. , 0.0319837...], [724. , 0.0318054...], [725. , 0.0316282...], [726. , 0.0314523...], [727. , 0.0312777...], [728. , 0.0311042...], [729. , 0.0309319...], [730. , 0.0307609...], [731. , 0.0305910...], [732. , 0.0304223...], [733. , 0.0302548...], [734. , 0.0300884...], [735. , 0.0299231...], [736. , 0.0297590...], [737. , 0.0295960...], [738. , 0.0294342...], [739. , 0.0292734...], [740. , 0.0291138...], [741. , 0.0289552...], [742. , 0.0287977...], [743. , 0.0286413...], [744. , 0.0284859...], [745. , 0.0283316...], [746. , 0.0281784...], [747. , 0.0280262...], [748. , 0.0278750...], [749. , 0.0277248...], [750. , 0.0275757...], [751. , 0.0274275...], [752. , 0.0272804...], [753. , 0.0271342...], [754. , 0.0269890...], [755. , 0.0268448...], [756. , 0.0267015...], [757. , 0.0265592...], [758. , 0.0264179...], [759. , 0.0262775...], [760. , 0.0261380...], [761. , 0.0259995...], [762. , 0.0258618...], [763. , 0.0257251...], [764. , 0.0255893...], [765. , 0.0254544...], [766. , 0.0253204...], [767. , 0.0251872...], [768. , 0.0250550...], [769. , 0.0249236...], [770. , 0.0247930...], [771. , 0.0246633...], [772. , 0.0245345...], [773. , 0.0244065...], [774. , 0.0242794...], [775. , 0.0241530...], [776. , 0.0240275...], [777. , 0.0239029...], [778. , 0.0237790...], [779. , 0.0236559...], [780. , 0.0235336...]], SpragueInterpolator, {}, Extrapolator, {'method': 'Constant', 'left': None, 'right': None}) """ return SpectralDistribution( rayleigh_optical_depth( shape.wavelengths * 10e-8, CO2_concentration, temperature, pressure, latitude, altitude, avogadro_constant, n_s_function, F_air_function, ), shape.wavelengths, name=( "Rayleigh Scattering - " f"{CO2_concentration!r} ppm, " f"{temperature!r} K, " f"{pressure!r} Pa, " f"{latitude!r} Degrees, " f"{altitude!r} m" ), )