Snow model

Warning

This page is a work in progress. If you have any questions or notice any errors, please raise an issue.

Overview

SnowModel is a minimal standalone model of a dynamic snowpack spatially distributed over the given grid. It couples an AbstractSnow process (by default SingleLayerSnow) with a prescribed atmosphere that supplies precipitation and air temperature. It is intended primarily for unit testing of the snow physics in isolation.

Because the model is standalone, the fluxes that a full land model would obtain from the surface energy balance and the snow→soil conduction are instead prescribed input fields: the net surface heat flux snow_surface_heat_flux, the basal conductive heat flux snow_basal_heat_flux, and the sublimation rate (see Prescribed forcing below).

arch = CPU()
grid = ColumnGrid(arch, Float32, ExponentialSpacing(N = 3))
model = SnowModel(grid)
SnowModel{Float32} on CPU()
├── grid:  1×1×3 RectilinearGrid{Float32, Periodic, Flat, Bounded} on CPU with 1×0×3 halo
├── snow:  SingleLayerSnow{Float32, FractionalSnowCover{Float32}, ConstantSnowDensity{Float32}, PowerLawSnowThermalConductivity{Float32}, ConstantSnowHydraulics{Float32}, Terrarium.ConstantSnowAlbedo{Float32}, SnowEnergyTemperatureClosure}
├── atmosphere:  PrescribedAtmosphere{Float32, (:CO2,), RainSnow, LongShortWaveRadiation, SpecificHumidity, Windspeed, ConstantAerodynamics{Float32}, Tuple{TracerGas{Float32, :CO2}}}
├── constants:  PhysicalConstants{Float32}
├── initializer:  DefaultInitializer{Float32}
├── timestepper:  ForwardEuler{Float32}
Terrarium.SnowModel — Type
mutable struct SnowModel{NF, GridType<:Oceananigans.Grids.AbstractGrid, Snow<:Terrarium.AbstractSnow, Atmosphere<:Terrarium.AbstractAtmosphere, Initializer<:Terrarium.AbstractInitializer, Timestepper<:Terrarium.AbstractTimeStepper} <: Terrarium.AbstractSnowModel{NF, GridType}

Minimal standalone model of a single-layer snowpack, intended for unit and differentiability testing. Couples an AbstractSnow process with a prescribed atmosphere providing precipitation and air temperature. The surface and basal heat fluxes (snow_surface_heat_flux, snow_basal_heat_flux) and the sublimation rate are prescribed input fields; in a coupled land model these are supplied by the surface energy balance and the snow→soil conduction. Like the snow state, these fluxes are grid-cell means, i.e. already scaled by the snow cover fraction f (f·S at the top and f·Q_base at the base in the coupled model).

Properties:

  • grid::Oceananigans.Grids.AbstractGrid: Spatial grid type

  • snow::Terrarium.AbstractSnow: Snow processes

  • atmosphere::Terrarium.AbstractAtmosphere: Near-surface atmospheric conditions

  • constants::PhysicalConstants: Physical constants

  • initializer::Terrarium.AbstractInitializer: State variable initializer

  • timestepper::Terrarium.AbstractTimeStepper: Time stepper: a single AbstractTimeStepper (e.g. ForwardEuler, Heun) or an IMEX

source

The prognostic and diagnostic state variables of the assembled model are

variables(model)
Variables
├─ Prognostic: 
├── snow_energy [J m^-2] on XY{Center, Center, Nothing} of the snow domain
├── snow_water_equivalent [m] on XY{Center, Center, Nothing} of the snow domain
├─ Auxiliary: 
├── snow_temperature [°C] on XY{Center, Center, Nothing} of the snow domain
├── snow_liquid_fraction [-] on XY{Center, Center, Nothing} of the snow domain
├── snow_depth [m] on XY{Center, Center, Nothing} of the snow domain
├── snow_cover_fraction [-] on XY{Center, Center, Nothing} of the snow domain
├── meltwater_flux [m s^-1] on XY{Center, Center, Nothing} of the snow domain
├─ Inputs: 
├── snow_surface_heat_flux [W m^-2] on XY{Center, Center, Terrarium.Coordinate{typeof(lastindex), Face}} of the snow domain
├── snow_basal_heat_flux [W m^-2] on XY{Center, Center, Terrarium.Coordinate{typeof(firstindex), Face}} of the snow domain
├── sublimation [m s^-1] on XY{Center, Center, Terrarium.Coordinate{typeof(lastindex), Face}} of the snow domain
├── air_temperature [°C] on XY{Center, Center, Nothing} of the atmosphere domain
├── air_pressure [Pa] on XY{Center, Center, Nothing} of the atmosphere domain
├── windspeed [m s^-1] on XY{Center, Center, Nothing} of the atmosphere domain
├── specific_humidity [-] on XY{Center, Center, Nothing} of the atmosphere domain
├── rainfall [m s^-1] on XY{Center, Center, Nothing} of the atmosphere domain
├── snowfall [m s^-1] on XY{Center, Center, Nothing} of the atmosphere domain
├── surface_shortwave_down [W m^-2] on XY{Center, Center, Nothing} of the atmosphere domain
├── surface_longwave_down [W m^-2] on XY{Center, Center, Nothing} of the atmosphere domain
├── daytime_length [hr] on XY{Center, Center, Nothing} of the atmosphere domain
├── CO2 [ppm] on XY{Center, Center, Nothing} of the atmosphere domain
├─ Namespaces:

The two prognostic variables are the depth-integrated (column) internal energy $\bar{U}_\text{snow}$ (J/m², snow_energy) and the snow water equivalent $W_\text{snow}$ (m, snow_water_equivalent); their mass and energy balances are documented on the Snow mass balance and Snow energy balance pages.

Components

FieldTypeScopeProcess page
snowAbstractSnowSingle-layer snowpack mass and energy balanceSnow
atmosphereAbstractAtmospherePrescribed near-surface forcing (precipitation, air temperature)Atmospheric inputs

In addition to the physics components, SnowModel carries the standard model machinery: constants (PhysicalConstants), an initializer, and a timestepper.

Snow

The snow component is the single-layer snowpack process. The default is SingleLayerSnow, a lumped layer of constant bulk density loosely based on the Utah Energy Balance model [5], composed of independently swappable sub-parameterizations for areal cover, density, thermal conductivity, and hydraulic properties. See the Snow overview and Snow parameterizations for details.

Atmosphere

The atmosphere component provides the near-surface forcing consumed by the snow tendencies — snowfall, rainfall, and air temperature — together with the humidity and wind quantities used to diagnose sublimation. The default is PrescribedAtmosphere.

Prescribed forcing

Unlike the coupled land model, the standalone SnowModel does not solve a surface energy balance or a snow→soil conduction. The corresponding fluxes are therefore declared as input fields and must be supplied (they default to zero):

FieldUnitsMeaningSupplied in the coupled model by
snow_surface_heat_fluxW/m²Net heat flux at the snow surface (positive upward)Surface energy balance closure
snow_basal_heat_fluxW/m²Conductive heat flux at the snow base (positive upward, soil → snow)Snow→soil conduction
sublimationm/sSublimation/evaporation rate from the snow surface (SWE)Surface energy balance latent flux

In the Land model these three inputs become diagnosed couplings: snow_surface_heat_flux and sublimation are set by the surface energy balance, and snow_basal_heat_flux by the snow→soil conductive interface.

Model interface

SnowModel implements the standard model interface: initialize! runs the model/field initializers and then the snow process initializer (the inverse closure $(T_\text{snow}, W_\text{snow}) \to \bar{U}_\text{snow}$), compute_auxiliary! diagnoses the geometric and thermal properties of the snowpack as well as the and energy-temperature closure, and compute_tendencies! accumulates the mass and energy tendencies from the prescribed fluxes and atmospheric forcing. closure! first enforces the constraints on the snow state (non-negative snow water equivalent, and no energy without snow) and then applies the energy-temperature closure:

Terrarium.enforce_snow_constraints! — Function
enforce_snow_constraints!(
    state,
    grid,
    snow::Terrarium.AbstractSnow
)

Enforce the constraints on the snow state that are not part of its tendencies: clip negative snow water equivalent to zero and remove the energy of a pack without snow. Called by closure! of models with snow before the snow closure, so that the closure sees an admissible state.

The clipping does not conserve mass; the water it adds to a pack that was overdrawn by an explicit step is not taken from anywhere.

source