Telluris Labs

Geospatial Software and Data Solutions

Radiation

Solar geometry and the radiative fluxes it drives at the surface.

solar — Solar geometry

Solar position and radiation geometry: declination, hour/zenith/elevation angles, daylight length, and extraterrestrial and clear-sky shortwave radiation.

day_of_year

day_of_year(year: 'int', month: 'int', day: 'int') -> 'int'

Day-of-year (ordinal day) for a calendar date.

>>> from atmoflux.solar import day_of_year
>>> day_of_year(2024, 1, 1)
1
>>> day_of_year(2023, 12, 31)
365

solar_declination

solar_declination(doy: 'int') -> 'float'

Solar declination angle for a given day of year.

Cooper (1969)\delta=23.45\sin\!\left(\dfrac{360(284+n)}{365}\right)
>>> from atmoflux.solar import solar_declination
>>> round(solar_declination(172), 2)
23.45
>>> round(solar_declination(355), 2)
-23.45

hour_angle

hour_angle(solar_time: 'float') -> 'float'

Solar hour angle from local solar time.

Hour angleH=15\,(t_\mathrm{solar}-12)
>>> from atmoflux.solar import hour_angle
>>> hour_angle(12.0)
0.0
>>> hour_angle(6.0)
-90.0

solar_zenith_angle

solar_zenith_angle(latitude: 'float', declination: 'float', hour_angle: 'float') -> 'float'

Solar zenith angle from latitude, declination, and hour angle.

Solar zenith angle\cos\theta_z=\sin\varphi\sin\delta+\cos\varphi\cos\delta\cos H
>>> from atmoflux.solar import solar_zenith_angle
>>> round(solar_zenith_angle(0.0, 0.0, 0.0), 2)
0.0
>>> round(solar_zenith_angle(40.0, 20.0, 0.0), 2)
20.0

solar_elevation

solar_elevation(latitude: 'float', declination: 'float', hour_angle: 'float') -> 'float'

Solar elevation (altitude) angle above the horizon.

Solar elevation\beta=90^\circ-\theta_z
>>> from atmoflux.solar import solar_elevation
>>> round(solar_elevation(40.0, 20.0, 0.0), 2)
70.0

sunset_hour_angle

sunset_hour_angle(latitude: 'float', declination: 'float') -> 'float'

Sunset hour angle for a given latitude and declination.

Sunset hour angle\cos H_s=-\tan\varphi\tan\delta
>>> from atmoflux.solar import sunset_hour_angle
>>> round(sunset_hour_angle(0.0, 0.0), 2)
90.0

daylight_hours

daylight_hours(latitude: 'float', declination: 'float') -> 'float'

Length of daylight for a given latitude and declination.

Daylight hoursN=\tfrac{2}{15}\,H_s
>>> from atmoflux.solar import daylight_hours
>>> round(daylight_hours(0.0, 0.0), 2)
12.0

extraterrestrial_radiation

extraterrestrial_radiation(latitude: 'float', doy: 'int') -> 'float'

Daily extraterrestrial (top-of-atmosphere) solar radiation.

FAO-56 (Allen et al., 1998)\begin{aligned}d_r&=1+0.033\cos\!\dfrac{2\pi n}{365}\\ R_a&=\dfrac{24\cdot 60}{\pi}\,G_{sc}\,d_r\big(H_s\sin\varphi\sin\delta+\cos\varphi\cos\delta\sin H_s\big)\end{aligned}
>>> from atmoflux.solar import extraterrestrial_radiation
>>> round(extraterrestrial_radiation(0.0, 172), 2)
33.24

clear_sky_radiation

clear_sky_radiation(extraterrestrial: 'float', sunshine_hours: 'float', daylight: 'float', a: 'float' = 0.25, b: 'float' = 0.5) -> 'float'

Incoming shortwave radiation from the Angstrom-Prescott relation.

Ångström–PrescottR_s=\left(a+b\,\dfrac{n}{N}\right)R_a
>>> from atmoflux.solar import clear_sky_radiation
>>> round(clear_sky_radiation(36.16, 10.0, 12.0), 3)
24.107

radiative — Radiative fluxes

Surface radiative fluxes: blackbody emission, net shortwave and longwave, net all-wave radiation, clear-sky emissivity, and the diffuse fraction.

blackbody_radiation

blackbody_radiation(temp: 'float', emissivity: 'float' = 1.0, unit: 'str' = 'K') -> 'float'

Radiant emittance of a surface from the Stefan-Boltzmann law.

Stefan–Boltzmann lawL=\varepsilon\,\sigma\,T^4
>>> from atmoflux.radiative import blackbody_radiation
>>> round(blackbody_radiation(288.0), 2)
390.11
>>> round(blackbody_radiation(15.0, 0.97, unit="C"), 2)
379.19

net_shortwave

net_shortwave(sw_down: 'float', albedo: 'float') -> 'float'

Net shortwave radiation absorbed at a surface.

Net shortwaveSW_\mathrm{net}=SW_\downarrow\,(1-\alpha)
>>> from atmoflux.radiative import net_shortwave
>>> net_shortwave(800.0, 0.2)
640.0

net_longwave

net_longwave(lw_down: 'float', temp_surface: 'float', emissivity: 'float' = 1.0, unit: 'str' = 'K') -> 'float'

Net longwave radiation at a surface (positive into the surface).

Net longwave\begin{aligned}LW_\uparrow&=\varepsilon\sigma T_s^4+(1-\varepsilon)\,LW_\downarrow\\ LW_\mathrm{net}&=LW_\downarrow-LW_\uparrow\end{aligned}
>>> from atmoflux.radiative import net_longwave
>>> round(net_longwave(350.0, 288.0), 2)
-40.11

net_radiation

net_radiation(sw_down: 'float', lw_down: 'float', albedo: 'float', temp_surface: 'float', emissivity: 'float' = 1.0, unit: 'str' = 'K') -> 'float'

Net all-wave radiation at a surface.

Net all-wave radiationR_n=SW_\mathrm{net}+LW_\mathrm{net}=SW_\downarrow(1-\alpha)+(LW_\downarrow-LW_\uparrow)
>>> from atmoflux.radiative import net_radiation
>>> round(net_radiation(800.0, 350.0, 0.2, 288.0), 2)
599.89

clear_sky_emissivity

clear_sky_emissivity(temp_air: 'float', vapor_pressure: 'float', unit: 'str' = 'C') -> 'float'

Clear-sky atmospheric emissivity using Brutsaert's relation.

Brutsaert (1975)\varepsilon=1.24\left(\dfrac{e}{T}\right)^{1/7}
>>> from atmoflux.radiative import clear_sky_emissivity
>>> round(clear_sky_emissivity(20, 1.5), 4)
0.8109

net_longwave_cloud

net_longwave_cloud(temp_air: 'float', vapor_pressure: 'float', cloud_fraction: 'float', unit: 'str' = 'C') -> 'float'

Net longwave radiation at the surface with a cloud adjustment (FAO-56 style).

FAO-56 net longwaveR_{nl}=\sigma T^4\,(0.34-0.14\sqrt{e})\left(1.35\,\dfrac{R_s}{R_{so}}-0.35\right)
>>> from atmoflux.radiative import net_longwave_cloud
>>> round(net_longwave_cloud(20, 1.5, 1.0), 2)
70.58

diffuse_fraction

diffuse_fraction(clearness_index: 'float') -> 'float'

Diffuse fraction of global shortwave radiation from the clearness index.

Erbs et al. (1982)k_d=\begin{cases}1-0.09\,k_t & k_t\le 0.22\\[2pt]0.9511-0.1604\,k_t+4.388\,k_t^2-16.638\,k_t^3+12.336\,k_t^4 & 0.22<k_t\le 0.80\\[2pt]0.165 & k_t>0.80\end{cases}
>>> from atmoflux.radiative import diffuse_fraction
>>> round(diffuse_fraction(0.5), 4)
0.6591