Radiative Transfer

Breeze.jl integrates with RRTMGP.jl to provide radiative transfer capabilities for atmospheric simulations. The radiative transfer model computes longwave and shortwave radiative fluxes, which can be incorporated into energy tendency equations.

Gray Atmosphere Radiation

The simplest radiative transfer option is gray atmosphere radiation, which uses the optical thickness parameterization from Schneider (2004) and O'Gorman and Schneider (2008). This approximation treats the atmosphere as having a single effective absorption coefficient rather than computing full spectral radiation.

Basic Usage

To use gray radiation in a Breeze simulation, create a RadiativeTransferModel model with the GrayOptics optics flavor and pass it to the AtmosphereModel constructor:

using Breeze
using Breeze.AtmosphereModels
using Oceananigans.Units
using Dates
using RRTMGP

Nz = 64
λ, φ = -70.9, 42.5  # longitude, latitude
grid = RectilinearGrid(size=Nz, x=λ, y=φ, z=(0, 20kilometers),
                       topology=(Flat, Flat, Bounded))

# Thermodynamic setup
surface_temperature = 300
constants = ThermodynamicConstants()

reference_state = ReferenceState(grid, constants;
                                 surface_pressure = 101325,
                                 potential_temperature = surface_temperature)

dynamics = AnelasticDynamics(reference_state)

# Create gray radiation model
radiation = RadiativeTransferModel(grid, GrayOptics(), constants;
                                   surface_temperature,
                                   surface_emissivity = 0.98,
                                   surface_albedo = 0.1,
                                   solar_constant = 1361) # W/m²

# Create atmosphere model with DateTime clock for solar position
clock = Clock(time=DateTime(2024, 9, 27, 16, 0, 0))
model = AtmosphereModel(grid; clock, dynamics, radiation)
AtmosphereModel{CPU, RectilinearGrid}(time = 2024-09-27T16:00:00, iteration = 0)
├── grid: 1×1×64 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── dynamics: AnelasticDynamics(p₀=101325.0, θ₀=300.0)
├── formulation: LiquidIcePotentialTemperatureFormulation
├── timestepper: SSPRungeKutta3
├── advection scheme: 
│   ├── momentum: Centered(order=2)
│   ├── ρθ: Centered(order=2)
│   └── ρqᵗ: Centered(order=2)
├── tracers: ()
├── coriolis: Nothing
└── microphysics: Nothing

When a DateTime clock is used, the solar zenith angle is computed automatically from the time and grid location (longitude and latitude).

Gray Radiation Model

The RadiativeTransferModel model computes:

  • Longwave radiation: Both upwelling and downwelling thermal radiation using RRTMGP's two-stream solver
  • Shortwave radiation: Direct beam solar radiation

The gray atmosphere optical thickness for longwave follows the parameterization by O'Gorman and Schneider (2008),

\[τ_{lw} = α \frac{Δp}{p_0} \left[ f_l + 4 (1 - f_l) \left(\frac{p}{p_0}\right)^3 \right] \left[ τ_e + (τ_p - τ_e) \sin^2 φ \right]\]

where $φ$ is latitude and $α$, $f_l$, $τ_e$, and $τ_p$ are empirical parameters.

For shortwave:

\[τ_{sw} = 2 τ_0 \frac{Δp}{p_0} \frac{p}{p_0}\]

where $τ_0 = 0.22$ is the shortwave optical depth parameter.

The above two expressions are identical to those in the RRTMGP documentation.

Radiative Fluxes

After running set!, the radiative fluxes are available from the radiation model:

# Longwave fluxes (ZFaceFields)
ℐ_lw_up = radiation.upwelling_longwave_flux
ℐ_lw_dn = radiation.downwelling_longwave_flux

# Shortwave flux (direct beam only for non-scattering solver)
ℐ_sw = radiation.downwelling_shortwave_flux
Shortwave Radiation

The gray atmosphere uses a non-scattering shortwave approximation, so only the direct beam flux is computed. There is no diffuse shortwave or upwelling shortwave in this model.

Solar Zenith Angle

When using a DateTime clock, the solar zenith angle is computed from:

  • Grid location (longitude from x, latitude from y for single-column grids)
  • Date and time from model.clock.time

The calculation accounts for:

  • Day of year (for solar declination)
  • Hour angle (based on solar time)
  • Latitude (for observer position)

Clear-sky Full-spectrum Radiation

For more accurate radiative transfer calculations, use the ClearSkyOptics optics flavor which computes full-spectrum gas optics using RRTMGP's lookup tables:

using Breeze, Oceananigans.Units
using RRTMGP, NCDatasets # Required for RRTMGP lookup tables

grid = RectilinearGrid(; size=16, x=0, y=45, z=(0, 10kilometers),
                       topology=(Flat, Flat, Bounded))
constants = ThermodynamicConstants()
radiation = RadiativeTransferModel(grid, ClearSkyOptics(), constants;
                                   surface_temperature = 300,
                                   surface_emissivity = 0.98,
                                   surface_albedo = 0.1,
                                   background_atmosphere = BackgroundAtmosphere(CO₂ = 400e-6))
RadiativeTransferModel
├── solar_constant: 1361.0 W m⁻²
├── surface_temperature: ConstantField(300.0) K
├── surface_emissivity: ConstantField(0.98)
├── direct_surface_albedo: ConstantField(0.1)
└── diffuse_surface_albedo: ConstantField(0.1)

The BackgroundAtmosphere struct specifies volume mixing ratios for radiatively active gases (CO₂, CH₄, N₂O, O₃, etc.). Water vapor is computed from the model's prognostic moisture field.

Surface Properties

The RadiativeTransferModel model requires surface properties:

PropertyDescriptionTypical Values
surface_temperatureTemperature at the surface [K]280-310
surface_emissivityLongwave emissivity (0-1)0.95-0.99
surface_albedoShortwave albedo (0-1)0.1-0.3
solar_constantTOA solar flux [W/m²]1361

Integration with dynamics

Radiative fluxes can be used to compute heating rates for the energy equation. The radiative heating rate is computed from flux divergence:

\[F_{\mathscr{I}} = -\frac{1}{\rho cᵖᵐ} \frac{\partial \mathscr{I}_{net}}{\partial z}\]

where $\mathscr{I}_{net}$ is the net radiative flux (upwelling minus downwelling), $cᵖᵐ$ is the mixture heat capacity, and $F_{\mathscr{I}}$ is the radiative flux divergence (heating rate).

Architecture Support

The radiative transfer implementation supports both CPU and GPU architectures. The column-based RRTMGP solver is called from Oceananigans' field data arrays with appropriate data layout conversions.