Snow Model
Snow Parameters
ClimaLand.Snow.SnowParameters
— TypeSnowParameters{FT <: AbstractFloat, PSE}
A struct for storing parameters of the SnowModel
.
Note that in our current implementation of runoff, a physical timescale is required and computed using Ksat and the depth of the snow. For shallow snowpacks, this will fall below the timestep of the model. For that reason, we pass the timestep of the model as a parameter, and take the larger of the timestep and the physical timescale as the value used in the model. Future implementations will revisit this.
density
: Choice of parameterization for snow densityz_0m
: Roughness length over snow for momentum (m)z_0b
: Roughness length over snow for scalars (m)α_snow
: Albedo of snow (unitless)ϵ_snow
: Emissivity of snow (unitless)θ_r
: Volumetric holding capacity of water in snow (unitless)Ksat
: Hydraulic conductivity of wet snow (m/s)κ_ice
: Thermal conductivity of ice (W/m/K)Δt
: Timestep of the model (s)ρcD_g
: Areal specific heat of ground interacting with snow (J/m^2/K)earth_param_set
: Clima-wide parameters
Snow Functions of State
ClimaLand.Snow.specific_heat_capacity
— Functionspecific_heat_capacity(q_l::FT,
parameters::SnowParameters{FT}
) where {FT}
Computes the specific heat capacity of the snow, neglecting any contribution from air in the pore spaces, given the liquid water mass fraction q_l and other parameters.
ClimaLand.Snow.snow_surface_temperature
— Functionsnow_surface_temperature(T::FT) where {FT}
Returns the snow surface temperature assuming it is the same as the bulk temperature T.
ClimaLand.Snow.snow_depth
— Functionsnow_depth(model::AbstractDensityModel{FT}, Y, p, params) where {FT}
Returns the snow depth given SWE, snow density ρsnow, and the density of liquid water ρl. This can be extended for additional types of parameterizations.
ClimaLand.Snow.snow_thermal_conductivity
— Functionsnow_thermal_conductivity(ρ_snow::FT,
parameters::SnowParameters{FT},
) where {FT}
Computes the thermal conductivity, given the density of the snow, according to Equation 5.33 from Bonan's textbook, which in turn is taken from Jordan (1991).
We have adjusted the original equation to make the coefficients non-dimensional by multiplying by the first by x = ρice/ρice and the second by x², with ρ_ice in kg/m³.
When ρsnow = ρice, we recover κsnow = κice.
ClimaLand.Snow.snow_bulk_temperature
— Functionsnow_bulk_temperature(U::FT,
SWE::FT,
q_l::FT,
parameters::SnowParameters{FT}) where {FT}
Computes the bulk snow temperature from the snow water equivalent SWE, energy per unit area U, liquid water mass fraction ql, and specific heat capacity cs, along with other needed parameters.
If there is no snow (U = SWE = 0), the bulk temperature is the reference temperature, which is 273.16K.
ClimaLand.Snow.snow_liquid_mass_fraction
— Functionsnow_liquid_mass_fraction(U::FT, SWE::FT, parameters::SnowParameters{FT}) where {FT}
Computes the snow liquid water mass fraction, given the snow water equivalent SWE, snow energy per unit area U, and other needed parameters.
ClimaLand.Snow.maximum_liquid_mass_fraction
— Functionmaximum_liquid_mass_fraction(T::FT, ρ_snow::FT, parameters::SnowParameters{FT}) where {FT}
Computes the maximum liquid water mass fraction, given the bulk temperature of the snow T, the density of the snow ρ_snow, and parameters.
ClimaLand.Snow.runoff_timescale
— Functionrunoff_timescale(z::FT, Ksat::FT, Δt::FT) where {FT}
Computes the timescale for liquid water to percolate and leave the snowpack, given the depth of the snowpack z and the hydraulic conductivity Ksat.
ClimaLand.Snow.compute_water_runoff
— Functioncompute_energy_runoff(S::FT, q_l::FT, T::FT, parameters) where {FT}
Computes the rate of change in the snow water equivalent S due to loss of liquid water (runoff) from the snowpack.
Runoff occurs as the snow melts and exceeds the water holding capacity.
ClimaLand.Snow.energy_from_q_l_and_swe
— Functionenergy_from_q_l_and_swe(S::FT, q_l::FT, parameters) where {FT}
A helper function for compute the snow energy per unit area, given snow water equivalent S, liquid fraction q_l, and snow model parameters.
Note that liquid water can only exist at the freezing point in this model, so temperature is not required as an input.
ClimaLand.Snow.energy_from_T_and_swe
— Functionenergy_from_T_and_swe(S::FT, T::FT, parameters) where {FT}
A helper function for compute the snow energy per unit area, given snow water equivalent S, bulk temperature T, and snow model parameters.
If T = Tfreeze, we return the energy as if ql = 0.
ClimaLand.Snow.snow_cover_fraction
— Functionsnow_cover_fraction(x::FT; α = FT(1e-3))::FT where {FT}
Returns the snow cover fraction, assuming it is a heaviside function at 1e-3 meters.
In the future we can play around with other forms.
Computing fluxes for snow
ClimaLand.Snow.snow_boundary_fluxes!
— Functionsnow_boundary_fluxes!(bc::AtmosDrivenSnowBC, model::SnowModel, Y, p, t)
Updates in place various volumetric water flux (m/s) and energy flux (W/m^2) terms for the snow model:
- p.snow.turbulent fluxes (latent, sensible, and evaporative fluxes)
- p.snow.R_n (radiative fluxes)
- p.snow.totalwaterflux
- p.snow.totalenergyflux
The two latter fluxes also include contributions from fluxes due to melt and precipitation, but note that precipitation and melt flux are not computed or updated in snow_boundary_fluxes
currently. Instead, they are updated in update_aux!
, which happens prior to the snow_boundary_fluxes!
call, and used in the snow_boundary_fluxes!
call.
This function calls the turbulent_fluxes
and net_radiation
functions, which use the snow surface conditions as well as the atmos and radiation conditions in order to compute the surface fluxes using Monin Obukhov Surface Theory. It also accounts for the presence of other components, if run as part of an integrated land model, and their effect on boundary conditions.
snow_boundary_fluxes!(
bc::AtmosDrivenSnowBC,
prognostic_land_components::Val{(:snow,)},
model::SnowModel{FT},
Y,
p,
t,
) where {FT}
Computes the boundary fluxes for the snow model in standalone mode.
The ground heat flux is assumed to be zero, and the snow surface is assumed to be bare (no vegetation).
snow_boundary_fluxes!(
bc::AtmosDrivenSnowBC,
prognostic_land_components::Val{(:snow, :soil)},
model::SnowModel{FT},
Y,
p,
t,
) where {FT}
A method of snow_boundary_fluxes!
which computes the boundary fluxes for the snow model accounting for a heat flux between the soil and snow.
The snow surface is assumed to be bare (no vegetation).
Currently this is almost identical to the method for snow alone, except for the inclusion of the ground heat flux (precomputed by the integrated land model). However, this will change more if e.g. we allow for transmission of radiation through the snowpack.
ClimaLand.Snow.AtmosDrivenSnowBC
— TypeAtmosDrivenSnowBC{
A <: AbstractAtmosphericDrivers,
B <: AbstractRadiativeDrivers,
C::Tuple
} <: AbstractSnowBC
A struct used to specify the snow fluxes, referred to as ``boundary conditions", at the surface and bottom of the snowpack, for water and energy.
These fluxes include turbulent surface fluxes computed with Monin-Obukhov theory, and radiative fluxes.
atmos
: The atmospheric conditions driving the modelradiation
: The radiative fluxes driving the modelprognostic_land_components
: Prognostic land components present