Source code for act.utils.radiance_utils
"""
Module containing utilities for radiance calculations
"""
import inspect
import numpy as np
[docs]def planck_converter(wnum=None, radiance=None, temperature=None, units='cm'):
"""
Planck function to convert radiance to temperature or temperature to
radiance given a corresponding wavenumber value.
Constants have been updated to reflect those used on the NOAA site
https://ncc.nesdis.noaa.gov/data/planck.html
Parameters
----------
wnum : float or list or numpy array
Wave number for corresponding radiance or temperature value.
radiance : float or list or numpy array
Radiance value of corresponding wavenumber in W/m^2/sr/cm.
temperature : float or list or numpy array
Temperature value of corresponding wavenumber in degK/cm.
units : string
Units value to use. Default to cm, other option is m
References
----------
This procedure was created for the AERI vs. IRT comparison from F77 code
orginally written by Jim Liligren and passed to the DQO by the ARM IRT
mentor.
Example
-------
> planck_converter(wnum=1100, temperature=300)
81.49372361846207
> planck_converter(wnum=1100, radiance=81.49)
299.9974150039702
"""
# h = Plancks's constant
# k = Boltzmann's constant
# c = Speed of light in a vacuum
if units == 'cm':
# C1 = 2 h c^2, [W cm^2]
C1 = 1.191042e-5 # For radiance in units of mW m^-2 sr^-1 /cm^-1
# C2 = h c / k, [K cm]
C2 = 1.4387752
if units == 'm':
# C1 = 2 h c^2, [W m^2]
C1 = 1.191042e-16 # For radiance in units of mW m^-2 sr^-1 /cm^-1
# C2 = h c / k, [K m]
C2 = 1.4387752e-2
func_name = inspect.stack()[0][3]
if wnum is None:
raise ValueError(f'No wnum values provided for {func_name}() function.\n')
if radiance is None and temperature is None:
raise ValueError(
f'No radiance or temperature values provided for {func_name}() function.\n'
)
if radiance is not None:
radiance = np.array(radiance, dtype=np.float64)
wnum = np.array(wnum, dtype=np.float64)
return (C2 * wnum) / np.log(1.0 + (C1 * wnum**3 / radiance))
if temperature is not None:
temperature = np.array(temperature, dtype=np.float64)
wnum = np.array(wnum, dtype=np.float64)
return (C1 * wnum**3) / (np.exp(C2 * wnum / temperature) - 1.0)