Parameterizing Soil Albedo
We currently support two parameterizations for the soil albedo. These options are defined using Julia types, using simplified code, as follows. We first introduce the abstract type AbstractSoilAlbedoParameterization
, and then the two albedo parameterizations are concrete examples of that abstract type:
ConstantTwoBandSoilAlbedo <: AbstractSoilAlbedoParameterization
CLMTwoBandSoilAlbedo <: AbstractSoilAlbedoParameterization
Each of these types define a method for update_albedo!
, which is called in the soils tendency functions, and each stores the parameters required to compute the albedo for that parameterizations. For example, the parameterization based off of CLM's approach requires the wet and dry soil albedos in the PAR and NIR wavelength bands. For each band, the actual albedo is a linear combination of the wet and dry values, with a weight depending on the soil moisture. The method of update_albedo!
for this parameterization computes this linear combination using a helper function albedo_from_moisture
and ultimately sets
@. p.soil.PAR_albedo =
albedo_from_moisture(S_sfc, PAR_albedo_dry, PAR_albedo_wet)
@. p.soil.NIR_albedo =
albedo_from_moisture(S_sfc, NIR_albedo_dry, NIR_albedo_wet)
where S_sfc
is the effective saturation at the surface.
Creating a new albedo parameterization
Suppose you want to define a new parameterization which models albedo as a linear combination of the albedos of quartz, organic matter, minerals and water, treating NIR and PAR albedos the same.
First, create the type:
struct SoilAlbedoFromComposition{FT <: AbstractFloat} <: AbstractSoilAlbedoParameterization
α_quartz::FT
α_minerals::FT
α_om::FT
α_water::FT
end
And then create the method. For now, don't worry about the other arguments and their types:
function update_albedo!(
bc::AtmosDrivenFluxBC,
albedo::SoilAlbedoFromComposition,
p,
soil_domain,
model_parameters,
)
# unpack parameters of the albedo model
(; α_quartz, α_minerals, α_om, α_water) = albedo
# unpack composition parameters from the soil parameters
(; ν_ss_om, ν_ss_quartz) = model_parameters
# Extract the values at the top level
ν_ss_om_sfc = ClimaLand.Domains.top_center_to_surface(ν_ss_om)
ν_ss_quartz_sfc = ClimaLand.Domains.top_center_to_surface(ν_ss_quartz)
# Extract the top layer's volumetric water content
θ_l_sfc = ClimaLand.Domains.top_center_to_surface(p.soil.θ_l)
# Compute the linear combination
@. p.soil.PAR_albedo = α_water * θ_l_sfc + (1-θ_l_sfc)* (α_quartz * ν_ss_quartz_sfc + α_om * ν_ss_om_sfc + α_minerals * (1-ν_ss_om - ν_ss_quartz))
p.soil.NIR_albedo .= p.soil.PAR_albedo
end
ClimaLand.Soil.CLMTwoBandSoilAlbedo
— Type CLMTwoBandSoilAlbedo{
FT <: AbstractFloat,
SF <: Union{FT, ClimaCore.Fields.Field},
} <: AbstractSoilAlbedoParameterization
A parameterization for soil albedo: the soil albedo is defined in two bands (PAR and NIR), and can spatially vary or be set to scalar. However, it varies temporally due to a dependence on soil water content at the surface, via the effective saturation S(θ_sfc): α = α_wetS + α_dry(1-S)
We use a value for θ_sfc averaged over the depth albedo_calc_top_thickness
. If the model resolution is such that the first layer is thicker than this depth, the value from the first layer is used.
CLM reference: Lawrence, P.J., and Chase, T.N. 2007. Representing a MODIS consistent land surface in the Community Land Model (CLM 3.0). J. Geophys. Res. 112:G01023. DOI:10.1029/2006JG000168.
ClimaLand.Soil.ConstantTwoBandSoilAlbedo
— TypeConstantTwoBandSoilAlbedo{
SF <: Union{AbstractFloat, ClimaCore.Fields.Field},
} <: AbstractSoilAlbedoParameterization
A parameterization for soil albedo: the soil albedo is defined in two bands (PAR and NIR), can spatially vary or be set to scalar, but is assumed not to vary in time (or with water content).
ClimaLand.Soil.update_albedo!
— Functionupdate_albedo!(bc::AtmosDrivenFluxBC, albedo::ConstantTwoBandSoilAlbedo, p, soil_domain, model_parameters)
Updates PAR and NIR albedo using the temporally-constant parameters provided in albedo
; these values may be spatially varying.
For the temporally-constant albedo model, there is no need to update the values each step, or have an allocated spot in the cache for them. This can be optimized in the future.
update_albedo!(bc::AtmosDrivenFluxBC, albedo::CLMTwoBandSoilAlbedo, p, soil_domain, model_parameters)
Calculates and updates PAR and NIR albedo as a function of volumetric soil water content at the top of the soil. If the soil layers are larger than the specified albedo_calc_top_thickness
, the water content of the top layer is used in the calclulation. For the PAR and NIR bands,
α_band = α_{band,dry} * (1 - S_e) + α_{band,wet} * (S_e)
where S_e is the relative soil wetness above some depth, albedo_calc_top_thickness
. This is a modified version of Equation (1) of:
Braghiere, R. K., Wang, Y., Gagné-Landmann, A., Brodrick, P. G., Bloom, A. A., Norton, A. J., et al. (2023). The importance of hyperspectral soil albedo information for improving Earth system model projections. AGU Advances, 4, e2023AV000910. https://doi.org/10.1029/2023AV000910
where effective saturation is used in place of volumetric soil water content. The dry and wet albedo values come from a global soil color map and soil color to albedo map from CLM.
CLM reference: Lawrence, P.J., and Chase, T.N. 2007. Representing a MODIS consistent land surface in the Community Land Model (CLM 3.0). J. Geophys. Res. 112:G01023. DOI:10.1029/2006JG000168.
update_albedo!(bc::AbstractEnergyHydrologyBC, _...)
Does nothing for boundary conditions where albedo is not used.