Source code for radarx.fundamentals.scattering

"""
Rayleigh Scattering Approximations
==================================

Functions for computing backscatter cross-sections, size parameters,
and absorption, scattering, and extinction coefficients under Rayleigh
scattering assumptions.

.. autosummary::
   :nosignatures:
   :toctree: generated/

   backscatter_cross_section
   normalized_backscatter_cross_section
   size_parameter
   absorption_coefficient
   scattering_coefficient
   extinction_coefficient

References
----------
- Rinehart (1997). Radar for Meteorologists.
- Battan (1973). Radar Observations of the Atmosphere.
"""

import numpy as np


[docs] def backscatter_cross_section(diameter, wavelength, dielectric=0.93): """ Rayleigh backscatter cross-section for a water sphere. Parameters ---------- diameter : float or array-like Drop diameter [m] wavelength : float Radar wavelength [m] dielectric : float Dielectric factor (default: 0.93 for water) Returns ------- float or array-like Backscatter cross-section [m^2] """ d = np.asarray(diameter) return (np.pi**5 * dielectric**2 * d**6) / wavelength**4
[docs] def normalized_backscatter_cross_section(diameter, wavelength, dielectric=0.93): """ Normalize Rayleigh backscatter cross-section by projected area. Parameters ---------- diameter : float or array-like Drop diameter [m] wavelength : float Radar wavelength [m] dielectric : float, optional Dielectric factor (default: 0.93) Returns ------- float or array-like Normalized cross-section [unitless] """ sigma = backscatter_cross_section(diameter, wavelength, dielectric) area = np.pi * (np.asarray(diameter) / 2.0) ** 2 return sigma / area
[docs] def size_parameter(diameter, wavelength): """ Calculate size parameter alpha = π * D / λ. Parameters ---------- diameter : float or array-like Drop diameter [m] wavelength : float Radar wavelength [m] Returns ------- float or array-like Size parameter (unitless) """ return np.pi * np.asarray(diameter) / wavelength
def _size_parameter(radius, wavelength): """ Calculate size parameter x = 2π * radius / wavelength. Parameters ---------- radius : float or array-like Particle radius [m] wavelength : float Radar wavelength [m] Returns ------- float or array-like Size parameter (unitless) """ return 2 * np.pi * np.asarray(radius) / wavelength def _complex_ratio(refractive_index): """ Calculate the complex ratio (m^2 - 1) / (m^2 + 2). Parameters ---------- refractive_index : complex Complex refractive index of the particle Returns ------- complex or array-like of complex Complex ratio used in scattering calculations """ m = refractive_index m2 = m * m return (m2 - 1) / (m2 + 2)
[docs] def absorption_coefficient(radius, wavelength, refractive_index): """ Compute Rayleigh absorption coefficient. Parameters ---------- radius : float or array-like Particle radius [m] wavelength : float Radar wavelength [m] refractive_index : complex Complex refractive index of the particle Returns ------- float or array-like Absorption efficiency (Qa) """ x = 2 * np.pi * radius / wavelength m = refractive_index m2 = m * m return np.maximum(4 * x * np.imag((m2 - 1) / (m2 + 2)), 0.0)
[docs] def scattering_coefficient(radius, wavelength, refractive_index): """ Compute Rayleigh scattering coefficient. Parameters ---------- radius : float or array-like Particle radius [m] wavelength : float Radar wavelength [m] refractive_index : complex Complex refractive index of the particle Returns ------- float or array-like Scattering efficiency (Qs) """ x = _size_parameter(radius, wavelength) ratio = _complex_ratio(refractive_index) return (8 / 3) * x**4 * np.abs(ratio) ** 2
[docs] def extinction_coefficient(radius, wavelength, refractive_index): """ Compute Rayleigh extinction coefficient (Qa + Qs). Parameters ---------- radius : float or array-like Particle radius [m] wavelength : float Radar wavelength [m] refractive_index : complex Complex refractive index of the particle Returns ------- float or array-like Extinction efficiency (Qe) """ return np.maximum( absorption_coefficient(radius, wavelength, refractive_index) + scattering_coefficient(radius, wavelength, refractive_index), 0.0, )
__all__ = [ "backscatter_cross_section", "normalized_backscatter_cross_section", "size_parameter", "absorption_coefficient", "scattering_coefficient", "extinction_coefficient", ]