Soil Models
Soil Models
ClimaLand.Soil.AbstractSoilModel
— TypeAbstractSoilModel{FT} <: ClimaLand.AbstractImExModel{FT}
The abstract type for all soil models.
Currently, we only have plans to support a RichardsModel, simulating the flow of liquid water through soil via the Richardson-Richards equation, and a fully integrated soil heat and water model, with phase change.
ClimaLand.Soil.RichardsModel
— TypeRichardsModel
A model for simulating the flow of water in a porous medium by solving the Richardson-Richards Equation.
A variety of boundary condition types are supported, including FluxBC
, RichardsAtmosDrivenFluxBC
, MoistureStateBC
, and FreeDrainage
(only for the bottom of the domain).
If you wish to simulate soil hydrology under the context of a prescribed precipitation volume flux (m/s) as a function of time, the RichardsAtmosDrivenFluxBC
type should be chosen. Please see the documentation for more details.
parameters
: the parameter setdomain
: the soil domain, using ClimaCore.Domainsboundary_conditions
: the boundary conditions, of type AbstractSoilBoundaryConditionssources
: A tuple of sources, each of type AbstractSoilSourcelateral_flow
: A boolean flag which, when false, turns off the horizontal flow of water
ClimaLand.Soil.RichardsModel
— MethodRichardsModel{FT}(;
parameters::RichardsParameters,
domain::D,
boundary_conditions::NamedTuple,
sources::Tuple,
lateral_flow::Bool = true
) where {FT, D}
A constructor for a RichardsModel
, which sets the default value of lateral_flow
to be true.
ClimaLand.Soil.RichardsModel
— MethodRichardsModel{FT}(domain, forcing;
runoff = ClimaLand.Soil.Runoff.TOPMODELRunoff{FT}(f_over = FT(3.28),
R_sb = FT(1.484e-4 / 1000),
f_max = topmodel_fmax(domain.space.surface,FT),
),
retention_parameters = soil_vangenuchten_parameters(domain.space.subsurface, FT),
S_s = ClimaCore.Fields.zeros(domain.space.subsurface) .+ 1e-3,
)
Creates a RichardsModel model with the given float type FT
, domain
and forcing
. Here, forcing
should be a NamedTuple
containing a field atmos
with the atmospheric forcing.
Default spatially varying parameters (for retention curve parameters and specific storativity) are provided but can be changed with keyword arguments.
The runoff parameterization is also provided and can be changed via keyword argument.
ClimaLand.Soil.EnergyHydrology
— TypeEnergyHydrology <: AbstractSoilModel
A model for simulating the flow of water and heat in a porous medium by solving the Richardson-Richards equation and the heat equation, including terms for phase change.
A variety of boundary condition types are supported, including FluxBC
, MoistureStateBC
/TemperatureStateBC
, FreeDrainage
(only for the bottom of the domain), and an AtmosDrivenFluxBC
(under which radiative fluxes and turbulent surface fluxes are computed and used as boundary conditions). Please see the documentation for this boundary condition type for more details.
parameters
: The parameter setsdomain
: the soil domain, using ClimaCore.Domainsboundary_conditions
: the boundary conditions for RRE and heat, of type AbstractSoilBoundaryConditionssources
: A tuple of sources, each of type AbstractSoilSourcelateral_flow
: A boolean flag which, when false, turns off the horizontal flow of water and heat
ClimaLand.Soil.EnergyHydrology
— MethodEnergyHydrology{FT}(;
parameters::PS
domain::D,
boundary_conditions::NamedTuple,
sources::Tuple,
lateral_flow::Bool = false,
) where {FT, D, PS}
A constructor for a EnergyHydrology
model, which sets the default value of the lateral_flow
flag to false.
ClimaLand.Soil.EnergyHydrology
— MethodEnergyHydrology{FT}(domain, forcing, toml_dict::CP.ParamDict;
prognostic_land_components = (:soil),
albedo = CLMTwoBandSoilAlbedo{FT}(; clm_soil_albedo_parameters(domain.space.surface)...),
runoff::Runoff.AbstractRunoffModel = Runoff.TOPMODELRunoff(toml_dict,
f_max = topmodel_fmax(domain.space.surface, FT),
),
retention_parameters = soil_vangenuchten_parameters(domain.space.subsurface, FT),
composition_parameters = soil_composition_parameters(domain.space.subsurface, FT),
S_s = ClimaCore.Fields.zeros(domain.space.subsurface) .+ 1e-3,
z_0m = toml_dict["soil_momentum_roughness_length"],
z_0b = toml_dict["soil_scalar_roughness_length"],
emissivity = toml_dict["emissivity_bare_soil"],
additional_sources = (),
) where {FT <: AbstractFloat}
Creates a EnergyHydrology model with the given float type FT
, domain
, toml_dict
, forcing
, and prognostic land components.
The argument forcing
should be a NamedTuple containing two fields: atmos
and radiation
.
When running the soil model in standalone mode, prognostic_land_components = (:soil,)
, while for running integrated land models, this should be a list of the component models. This value of this argument must be the same across all components in the land model.
Default spatially varying parameters (for retention curve parameters, composition, and specific storativity) are provided but can be changed with keyword arguments. Note that these parameters must all be of the same type: either FT
or ClimaCore Fields. By default they are Fields read in from data, so in practice this means if some values are provided as Floats, all of these parameter defaults must be overwritten as Floats.
retention_parameters
should be a NamedTuple with the following fields:
ν
: soil porosityhydrology_cm
: the hydrology closure model being usedK_sat
: saturated hydraulic conductivityθ_r
: residual water content
composition_parameters
should be a NamedTuple with the following fields:
ν_ss_om
: soil organic matter volume fractionν_ss_quartz
: soil quartz volume fractionν_ss_gravel
: soil gravel volume fraction
The runoff and albedo parameterizations are also provided and can be changed via keyword argument; additional sources may be required in your model if the soil model will be composed with other component models.
Roughness lengths and soil emissivity are currently treated as constants; these can be passed in as Floats by kwarg; otherwise the default values are used.
Soil Parameter Structs
ClimaLand.Soil.RichardsParameters
— TypeRichardsParameters{F <: Union{<: AbstractFloat, ClimaCore.Fields.Field}, C <: AbstractSoilHydrologyClosure}
A struct for storing parameters of the RichardsModel
.
ν
: The porosity of the soil (m^3/m^3)hydrology_cm
: The hydrology closure model: vanGenuchten or BrooksCoreyK_sat
: The saturated hydraulic conductivity (m/s)S_s
: The specific storativity (1/m)θ_r
: The residual water fraction (m^3/m^3)
ClimaLand.Soil.RichardsParameters
— MethodRichardsParameters(;
hydrology_cm::C,
ν::F,
K_sat::F,
S_s::F,
θ_r::F,
) where {F <: Union{<:AbstractFloat, ClimaCore.Fields.Field}, C}
Construct a RichardsParameters
.
ClimaLand.Soil.EnergyHydrologyParameters
— TypeEnergyHydrologyParameters{
FT <: AbstractFloat,
F <: Union{<:AbstractFloat, ClimaCore.Fields.Field},
AP,
C,
PSE,
}
A parameter structure for the integrated soil water and energy equation system.
- soil composition and retention model parameters defined in the interior
- an albedo parameterization
- Scalar parameters: emissivity, α, β, γ, γT_ref, Ω,
roughness lengths z0, dds ) (FT)
κ_dry
: The dry soil thermal conductivity, W/m/Kκ_sat_frozen
: The saturated thermal conductivity of frozen soil, W/m/Kκ_sat_unfrozen
: The saturated thermal conductivity of unfrozen soil, W/m/Kρc_ds
: The volumetric heat capacity of dry soil, J/m^3/K (per volume dry soil, not per volume soil solids)ν
: The porosity of the soil (m^3/m^3)ν_ss_om
: The volumetric fraction of the soil solids in organic matter (m^3/m^3)ν_ss_quartz
: The volumetric fraction of the soil solids in quartz (m^3/m^3)ν_ss_gravel
: The volumetric fraction of the soil solids in gravel (m^3/m^3)α
: The parameter α used in computing Kersten number, unitlessβ
: The parameter β used in computing Kersten number, unitlesshydrology_cm
: The soil hydrology closure model: van Genuchten or Brooks and CoreyK_sat
: The saturated hydraulic conductivity (m/s)S_s
: The specific storativity (1/m)θ_r
: The residual water fraction (m^3/m^3)Ω
: Ice impedance factor for the hydraulic conductivityγ
: Coefficient of viscosity factor for the hydraulic conductivityγT_ref
: Reference temperature for the viscosity factoralbedo
: Soil Albedo Parameterizationemissivity
: Soil Emissivityz_0m
: Roughness length for momentumz_0b
: Roughness length for scalarsd_ds
: Maximum dry soil layer thickness under evaporation (m)earth_param_set
: Physical constants and clima-wide parameters
ClimaLand.Soil.EnergyHydrologyParameters
— MethodEnergyHydrologyParameters(
toml_dict;
ν,
ν_ss_om,
ν_ss_quartz,
ν_ss_gravel,
hydrology_cm,
K_sat,
S_s,
θ_r,
albedo = Soil.ConstantTwoBandSoilAlbedo{FT}(),
kwargs...,)
EnergyHydrologyParameters has two constructors: float-type and toml dict based. Additional parameters must be added manually: ν
, ν_ss_om
, ν_ss_quartz
, ν_ss_gravel
, hydrology_cm
,
Ksat,
Ss, and
θ_r. All parameters can be manually overridden via keyword arguments. Note, however, that certain parameters must have the same type (e.g, if a field is supplied for porosity, it must be supplied for all other parameters defined in the interior of the domain). Some parameters are defined only on the surface of the domain (e.g albedo), while other are defined everywhere (e.g. porosity). These are indicated with types
Fand
SF`. If both dry/wet albedos and general albedos are given as keywords, the dry/wet albedos will override the general albedos.
Please see the EnergyHydrologyParameters documentation for a complete list.
Soil Hydrology Parameterizations
ClimaLand.Soil.volumetric_liquid_fraction
— Functionvolumetric_liquid_fraction(ϑ_l::FT, ν_eff::FT, θ_r::FT) where {FT}
A pointwise function returning the volumetric liquid fraction given the augmented liquid fraction and the effective porosity. The output is guaranteed to be in (θ_r, ν_eff]
.
For Richards model, ν_eff = ν
; and the clipping below is not required, (and will do nothing; ν_eff_safe = ν_eff
), but we leave it in for a simpler interface.
ClimaLand.Soil.pressure_head
— Functionpressure_head(
cm::vanGenuchten{FT},
θ_r::FT,
ϑ_l::FT,
ν_eff::FT,
S_s::FT,
) where {FT}
A point-wise function returning the pressure head in variably saturated soil, using the van Genuchten matric potential if the soil is not saturated, and an approximation of the positive pressure in the soil if the soil is saturated.
pressure_head(
cm::BrooksCorey{FT},
θ_r::FT,
ϑ_l::FT,
ν_eff::FT,
S_s::FT,
) where {FT}
A point-wise function returning the pressure head in variably saturated soil, using the Brooks and Corey matric potential if the soil is not saturated, and an approximation of the positive pressure in the soil if the soil is saturated.
ClimaLand.Soil.hydraulic_conductivity
— Functionhydraulic_conductivity(cm::vanGenuchten{FT}, K_sat::FT, S::FT) where {FT}
A point-wise function returning the hydraulic conductivity, using the van Genuchten formulation.
hydraulic_conductivity(cm::BrooksCorey{FT}, K_sat::FT, S::FT) where {FT}
A point-wise function returning the hydraulic conductivity, using the Brooks and Corey formulation.
ClimaLand.Soil.impedance_factor
— Functionimpedance_factor(
f_i::FT,
Ω::FT
) where {FT}
Returns the multiplicative factor reducing conductivity when a fraction of ice f_i
is present.
Only for use with the EnergyHydrology
model.
ClimaLand.Soil.viscosity_factor
— Functionviscosity_factor(
T::FT,
γ::FT,
γT_ref::FT,
) where {FT}
Returns the multiplicative factor which accounts for the temperature dependence of the conductivity.
Only for use with the EnergyHydrology
model.
ClimaLand.Soil.effective_saturation
— Functioneffective_saturation(ν_eff::FT, ϑ_l::FT, θr::FT) where {FT}
A point-wise function computing the effective saturation given the effective porosity, augmented liquid fraction, and residual water fraction as input.
For Richards model, or any other parameterization where ice is not relevant, νeff = ν; and the clipping below is not required, (and will do nothing; νeffsafe = νeff), but we leave it in for a simpler interface.
ClimaLand.Soil.matric_potential
— Function matric_potential(cm::vanGenuchten{FT}, S::FT) where {FT}
A point-wise function returning the matric potential, using the van Genuchten formulation.
matric_potential(cm::BrooksCorey{FT}, S::FT) where {FT}
A point-wise function returning the matric potential, using the Brooks and Corey formulation.
ClimaLand.Soil.dψdϑ
— Functiondψdϑ(cm::vanGenuchten{FT}, ϑ, ν_eff, θ_r, S_s)
Computes and returns the derivative of the pressure head with respect to ϑ
for the van Genuchten formulation.
dψdϑ(cm::BrooksCorey{FT}, ϑ, νeff, θr, S_s)
Computes and returns the derivative of the pressure head with respect to ϑ for the Brooks and Corey formulation.
ClimaLand.Soil.inverse_matric_potential
— Functioninverse_matric_potential(cm::vanGenuchten{FT}, ψ::FT) where {FT}
A point-wise function returning the effective saturation, given the matric potential, using the van Genuchten formulation.
inverse_matric_potential(cm::BrooksCorey{FT}, ψ::FT) where {FT}
A point-wise function returning the effective saturation, given the matric potential, using the Brooks and Corey formulation.
ClimaLand.Soil.AbstractSoilHydrologyClosure
— TypeAbstractSoilHydrologyClosure{FT <: AbstractFloat}
The abstract type of soil hydrology closure, of which vanGenuchten{FT} and BrooksCorey{FT} are the two supported concrete types.
To add a new parameterization, methods are required for:
- matric_potential,
- inversematricpotential,
- pressure_head,
- dψdϑ,
- hydraulic_conductivity.
ClimaLand.Soil.vanGenuchten
— TypevanGenuchten{FT} <: AbstractSoilHydrologyClosure{FT}
The van Genuchten soil hydrology closure, chosen when the hydraulic conductivity and matric potential are modeled using the van Genuchten parameterization (van Genuchten 1980; see also Table 8.2 of G. Bonan 2019).
α
: The inverse of the air entry potential (1/m)n
: The van Genuchten pore-size distribution index (unitless)m
: The van Genuchten parameter m = 1 - 1/n (unitless)S_c
: A derived parameter: the critical saturation at which capillary flow no longer replenishes the surface
ClimaLand.Soil.BrooksCorey
— TypeBrooksCorey{FT} <: AbstractSoilHydrologyClosure{FT}
The Brooks and Corey soil hydrology closure, chosen when the hydraulic conductivity and matric potential are modeled using the Brooks and Corey parameterization (Brooks and Corey, 1964, 1966; see also Table 8.2 of G. Bonan 2019).
c
: The pore-size distribution index (unitless)ψb
: The air entry matric potential, when S=1 (m)S_c
: A derived parameter: the critical saturation at which capillary flow no longer replenishes the surface
Soil Heat Parameterizations
ClimaLand.Soil.volumetric_heat_capacity
— Functionvolumetric_heat_capacity(
θ_l::FT,
θ_i::FT,
ρc_ds::FT,
earth_param_set::EP,
) where {FT,EP}
Compute the expression for volumetric heat capacity.
ClimaLand.Soil.κ_solid
— Functionκ_solid(ν_ss_om::FT,
ν_ss_quartz::FT,
κ_om::FT,
κ_quartz::FT,
κ_minerals::FT) where {FT}
Computes the thermal conductivity of the solid material in soil. The _ss_
subscript denotes that the volumetric fractions of the soil components are referred to the soil solid components, not including the pore space.
ClimaLand.Soil.κ_sat_frozen
— Functionfunction κ_sat_frozen(
κ_solid::FT,
ν::FT,
κ_ice::FT
) where {FT}
Computes the thermal conductivity for saturated frozen soil.
ClimaLand.Soil.κ_sat_unfrozen
— Functionfunction κ_sat_unfrozen(
κ_solid::FT,
ν::FT,
κ_l::FT
) where {FT}
Computes the thermal conductivity for saturated unfrozen soil.
ClimaLand.Soil.κ_sat
— Functionκ_sat(
θ_l::FT,
θ_i::FT,
κ_sat_unfrozen::FT,
κ_sat_frozen::FT
) where {FT}
Compute the expression for saturated thermal conductivity of soil matrix.
ClimaLand.Soil.κ_dry
— Functionfunction κ_dry(ρp::FT,
ν::FT,
κ_solid::FT,
κ_air::FT;
a = FT(0.053)) where {FT}
Computes the thermal conductivity of dry soil according to the model of Balland and Arp.
ClimaLand.Soil.kersten_number
— Functionkersten_number(
θ_i::FT,
S_r::FT,
α::FT,
β::FT,
ν_ss_om::FT,
ν_ss_quartz::FT,
ν_ss_gravel::FT,
) where {FT}
Compute the expression for the Kersten number, using the Balland and Arp model.
ClimaLand.Soil.relative_saturation
— Functionrelative_saturation(
θ_l::FT,
θ_i::FT,
ν::FT
) where {FT}
Compute the expression for relative saturation. This is referred to as θ_sat in Balland and Arp's paper.
ClimaLand.Soil.volumetric_internal_energy
— Functionvolumetric_internal_energy(θ_i::FT, ρc_s::FT, T::FT,
earth_param_set::EP) where {FT, EP}
A pointwise function for computing the volumetric internal energy of the soil, given the volumetric ice content, volumetric heat capacity, and temperature.
ClimaLand.Soil.volumetric_internal_energy_liq
— Functionvolumetric_internal_energy_liq(T::FT, earth_param_set::EP) where {FT, EP}
A pointwise function for computing the volumetric internal energy of the liquid water in the soil, given the temperature T.
ClimaLand.Soil.temperature_from_ρe_int
— Functiontemperature_from_ρe_int(ρe_int::FT, θ_i::FT, ρc_s::FT
earth_param_set::EP) where {FT, EP}
A pointwise function for computing the temperature from the volumetric internal energy, volumetric ice content, and volumetric heat capacity of the soil.
ClimaLand.Soil.thermal_conductivity
— Functionthermal_conductivity(
κ_dry::FT,
K_e::FT,
κ_sat::FT
) where {FT}
Compute the expression for thermal conductivity of soil matrix.
ClimaLand.Soil.phase_change_source
— Functionphase_change_source(
θ_l::FT,
θ_i::FT,
T::FT,
τ::FT,
ν::FT,
θ_r::FT,
hydrology_cm::CM,
_ρ_i::FT,
_ρ_l::FT,
_LH_f0::FT,
_T_freeze::FT,
_grav::FT
) where {FT, CM}
Returns the source term (1/s) used for converting liquid water and ice into each other during phase changes. Note that there are unitless prefactors multiplying this term in the equations.
Note that these equations match what is in Dall'Amico (for θstar, ψ(T), ψw0). We should double check them in the case where we have ϑl > θl, but they should be very close to the form we want regardless.
ClimaLand.Soil.thermal_time
— Functionthermal_time(ρc::FT, Δz::FT, κ::FT) where {FT}
Returns the thermal timescale for temperature differences across a typical thickness Δz to equilibrate.