Grid-scale condensation

Introduction

GridScaleCondensation is a Stepper implementing large-scale (stratiform) condensation: wherever the air becomes supersaturated with respect to water, the excess vapour condenses, releases latent heat, and is assumed to fall out immediately as precipitation. It is the grid-scale complement to a convective scheme — it removes the supersaturation that resolved ascent produces on the model grid, rather than sub-grid convective plumes.

Physics

At each level the scheme compares the specific humidity \(q\) against the saturation specific humidity \(q^*(T, p)\). Where \(q > q^*\), the excess is condensed. Because condensation warms the air (raising \(q^*\)), the adjustment is solved so that the air is left exactly at saturation, accounting for the latent-heating feedback:

\[ \Delta q = -(q - q^*), \qquad \Delta T = -\frac{L}{c_p}\,\Delta q, \]

iterated (or solved) to consistency between the new temperature and the saturation humidity it implies. All condensed water is assumed to precipitate — none is retained as cloud — so the column integral of the condensed water gives the precipitation:

\[ \text{precipitation amount} = -\frac{1}{g}\int (\Delta q)\, dp . \]

The component returns updated air_temperature and specific_humidity, and the precipitation_amount as a diagnostic.

Constructor

climt.GridScaleCondensation()

The component takes no physical parameters; the latent heat, gravity and gas constants come from climt’s registered constants.

State

Role Quantity Dims Units
in air_temperature [mid_levels, *] degK
in specific_humidity [mid_levels, *] kg/kg
in air_pressure [mid_levels, *] Pa
in air_pressure_on_interface_levels [interface_levels, *] Pa
out air_temperature [mid_levels, *] degK
out specific_humidity [mid_levels, *] kg/kg
diag precipitation_amount [*] kg m^-2

Example

from datetime import timedelta
import climt
from climt import get_default_state, get_grid

condensation = climt.GridScaleCondensation()
state = get_default_state([condensation], grid_state=get_grid(nx=1, ny=1, nz=30))

# Supersaturate a layer.
state["specific_humidity"].values[:] = 0.02

diagnostics, new_state = condensation(state, timedelta(seconds=600))
print(diagnostics["precipitation_amount"].values)   # kg/m^2 condensed and rained out

Source