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 GrayRadiativeTransferModel model and pass it to the AtmosphereModel constructor:
using Breeze
using Oceananigans.Units
using Dates
using RRTMGP.AtmosphericStates: GrayOpticalThicknessOGorman2008
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
optical_thickness = GrayOpticalThicknessOGorman2008(eltype(grid))
radiation = RadiativeTransferModel(grid, constants, optical_thickness;
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: RungeKutta3TimeStepper
├── advection scheme:
│ ├── momentum: Centered(order=2)
│ ├── ρθ: Centered(order=2)
│ └── ρqᵗ: Centered(order=2)
├── tracers: ()
├── coriolis: Nothing
└── microphysics: NothingWhen 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_fluxThe 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 fromyfor 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)
Surface Properties
The RadiativeTransferModel model requires surface properties:
| Property | Description | Typical Values |
|---|---|---|
surface_temperature | Temperature at the surface [K] | 280-310 |
surface_emissivity | Longwave emissivity (0-1) | 0.95-0.99 |
surface_albedo | Shortwave albedo (0-1) | 0.1-0.3 |
solar_constant | TOA 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.