Skip to content

09b - Atmospheric Models and Earth-Atmosphere Transport

LESS represents the external radiation environment as a combination of top-of-atmosphere incident sources and an atmospheric model. The incident source only describes the solar direction and TOA spectrum; the atmospheric model is responsible for direct surface radiation, sky scattering, and model-supported upstream propagation. This chapter first explains how to select a model, and then introduces common parameters and outputs.

Model selection

Requirements Recommended models Description
Simultaneous calculation of surface incident irradiance and atmospheric propagation in sensor direction less.Atmosphere Built-in layered atmosphere, supporting optical, SIF, thermal infrared and path transmission
Using 6S parameter system less.SixSAtmosphere Requires optional dependency less3d[atmosphere]
Known direct and scattered transmission coefficients from TOA to the ground surface less.PrescribedAtmosphere Strictly distinguish between beam transmittance and horizontal scattering transmission coefficient
Vacuum or regardless of the atmosphere less.NoAtmosphere No attenuation of direct radiation, zero diffusion
Quickly generate wide spectrum direct light and isotropic sky light less.SimpleSpectralAtmosphere Simplified spectral attenuation and scattering model
Sky brightness distribution in the visible direction less.HosekWilkieAtmosphere Independent Hosek–Wilkie model

less.Atmosphere is a complete atmospheric boundary and propagation model. Other lighting classes are mainly used to set the light received by the three-dimensional scene, which is not equivalent to the complete surface to sensor atmosphere propagation.

Built-in layered atmosphere

import less

scene = less.Scene()
scene.illumination = less.Illumination(
    source=less.Sun(zenith=30, azimuth=150),
    atmosphere=less.Atmosphere.standard(
        "midlatitude_summer",
        aerosol="continental",
        aot550=0.10,
        ground_altitude_km=0.0,
        streams=8,
        sky_mode="anisotropic",
    ),
)

Standard atmospheric profiles include:

Name Typical conditions
"tropical" Tropical
"midlatitude_summer" Mid-latitude summer
"midlatitude_winter" Mid-latitude winter
"subarctic_summer" Subarctic Summer
"subarctic_winter" Subarctic winter
"us_standard" / "us76" 1976 American Standard Atmosphere

Aerosol types include "continental", "maritime", "urban", "desert", "biomass_burning", and "stratospheric". aot550 is the 550 nm aerosol optical thickness; the larger the value, the stronger the direct light attenuation.

ground_altitude_km is the altitude of the scene ground. sky_mode="isotropic" uses an isotropic sky; "anisotropic" preserves the variation of sky radiance with zenith angle and relative orientation to the sun.

Custom atmospheric profile

You can first obtain the standard profile, and then check the air pressure, temperature and gas column content:

profile = less.AtmosphericProfile.standard("us76")
print(profile.surface_pressure(0.0))
print(profile.column("h2o", ground_altitude_km=0.5))

atmosphere = less.Atmosphere(
    profile=profile,
    aerosol="maritime",
    aot550=0.05,
)

When customizing AtmosphericProfile, the altitude unit is km, the air pressure unit is hPa, and the temperature unit is K; the number density of each gas uses cm^-3.

Solve alone and view the results

import numpy as np
import less

atmosphere = less.Atmosphere.standard("us76", aot550=0.10)
wavelengths = np.arange(400.0, 1001.0, 5.0)
result = atmosphere.solve(
    wavelengths,
    sun_zenith=40,
    output_altitudes_km=[2.0, 8.0, 20.0],
)

direct = result.direct_normal_irradiance
diffuse = result.diffuse_horizontal_irradiance
transmittance = result.upward_transmittance(
    view_zenith=10,
    observer_altitude_km=8.0,
)

Commonly used quantities in less.AtmosphereResult are:

Field or method Meaning
direct_normal_irradiance Surface normal direct solar irradiance
diffuse_horizontal_irradiance Surface horizontal sky scattered irradiance
direct_transmittance Direct solar transmittance
upward_transmittance(...) Directional transmittance from the ground surface to the specified observation height
path_radiance(...) Atmospheric path radiance in the observation direction
to_observer(...) Spread the surface radiance to a specified height
directional_sky_radiance(...) Sky direction radiance distribution

Use W m^-2 nm^-1 for irradiance and W m^-2 sr^-1 nm^-1 for spectral radiance.

Observation altitude and top of atmosphere

Imaging products can be selected from the surface, a specified altitude, or the top of the atmosphere:

projection = less.Orthographic(image_size=512, view_zenith=10, view_azimuth=180)

airborne = scene.simulate(less.OpticalImager(
    projection=projection,
    bands=less.Sentinel2A(),
    spectral_resolution=5,
    observation_altitude_km=8.0,
))

toa = scene.simulate(less.OpticalImager(
    projection=projection,
    bands=less.Sentinel2A(),
    spectral_resolution=5,
    observation_level="toa",
))

observation_altitude_km uses altitude; the geometric height of the projection class only determines the starting point of the ray in the three-dimensional scene, and the two have different meanings.

Optical, SIF, Thermal IR and LiDAR

  • Optical imaging uses both downlink direct/scattered light, uplink transmittance and path radiance.
  • SIF imaging uses the upstream transmittance of the emission band; the observation layer can be specified via observation_level or observation_altitude_km.
  • Thermal infrared calculates atmospheric downward long waves, surface thermal emission, upward absorption and atmospheric path emission.
  • LiDAR Two-way atmospheric attenuation using launch and return paths.

6S model

After installing the optional dependencies, you can use 6S to calculate surface direct and scattered light:

pip install "less3d[atmosphere]"
scene.illumination = less.Illumination(
    source=less.Sun(zenith=30, azimuth=150),
    atmosphere=less.SixSAtmosphere(
        atmosphere_profile="midlatitude_summer",
        aerosol_type="continental",
        aot550=0.1,
        ground_altitude=0.0,
    ),
)

Available profiles include tropical, midlatitude_summer, midlatitude_winter, subarctic_summer, subarctic_winter, and us_standard. Commonly used aerosols include no_aerosols, continental, maritime, urban, desert and biomass_burning.

User specified atmospheric transmission

scene.illumination = less.Illumination(
    source=less.Sun(
        zenith=40,
        azimuth=160,
        wavelengths=[450, 550, 650],
        irradiance=[1.85, 1.88, 1.55],  # TOA beam normal spectrum, W m^-2 nm^-1
    ),
    atmosphere=less.PrescribedAtmosphere(
        wavelengths=[450, 550, 650],
        direct_beam_transmittance=[0.60, 0.70, 0.78],
        diffuse_horizontal_transmittance=[0.20, 0.14, 0.09],
    ),
)

direct_beam_transmittance is the solar direct beam transmittance:

Surface beam normal direct irradiance / TOA beam normal irradiance

diffuse_horizontal_transmittance is the horizontal scattering transmission coefficient:

Surface horizontal scattered irradiance / TOA Sunlight projected irradiance on the horizontal plane

The latter is not the proportion of scattering in the total surface illumination, nor is it the direct beam transmittance. If the TOA beam normal irradiance is E_toa, and the solar zenith angle is θ, then the surface direct beam normal irradiance is E_toa × direct_beam_transmittance, the surface horizontal scattered irradiance is E_toa × cos(θ) × diffuse_horizontal_transmittance. Both parameters are dimensionless, Scalars can be used; when using spectral arrays you should also provide reference wavelengths, LESS will interpolate the coefficients to the actual solution wavelength. The band-by-band sum of the two in the passive shortwave atmosphere shall not exceed 1.

Simplify the atmosphere and surface boundary model

# vacuum boundary
scene.illumination = less.Illumination(
    source=less.Sun(zenith=30, azimuth=150),
    atmosphere=less.NoAtmosphere(),
)

# Broad spectrum simplifies the atmosphere
scene.illumination = less.Illumination(
    source=less.Sun(zenith=30, azimuth=150),
    atmosphere=less.SimpleSpectralAtmosphere(turbidity=2.5),
)

# Visible light Hosek–Wilkie direction sky
scene.illumination = less.Illumination(
    source=less.Sun(zenith=30, azimuth=150),
    atmosphere=less.HosekWilkieAtmosphere(turbidity=2.5),
)

Usage suggestions

  • Surface reflectance products and satellite imaging preferentially use less.Atmosphere.
  • Use less.SixSAtmosphere when 6S atmospheric transmission is required.
  • Use less.PrescribedAtmosphere when the direct and diffuse transmission coefficients from TOA to the surface are known.
  • Use less.NoAtmosphere when atmospheric attenuation is not considered.
  • Quick RGB preview available with less.HosekWilkieAtmosphere.
  • less.Illuminationless.Sun
  • less.Atmosphereless.Atmosphere.standard()less.Atmosphere.solve()
  • less.AtmosphericProfileless.AtmosphericProfile.standard()
  • less.AtmosphereResultto_observer()upward_transmittance()path_radiance()
  • less.AtmosphereDatabase
  • less.SixSAtmosphereless.PrescribedAtmosphereless.NoAtmosphere
  • less.SimpleSpectralAtmosphereless.HosekWilkieAtmosphere
  • less.OpticalImagerless.SIFImagerless.ThermalImager

The next chapter introduces satellite pushbroom imaging and instrument response.