Skip to content

Commit ec71e2d

Browse files
authored
change albedo parameterization to enforce physicality (#1124)
1 parent 2f3e948 commit ec71e2d

File tree

5 files changed

+17
-18
lines changed

5 files changed

+17
-18
lines changed

experiments/calibration/forward_model.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ function setup_prob(
6464
# α_leaf_scaler,
6565
# α_soil_scaler,
6666
α_0,
67-
α_horizon,
67+
Δα,
6868
k,
6969
beta_snow,
7070
x0_snow,
@@ -318,10 +318,10 @@ function setup_prob(
318318
)
319319

320320
# Snow model
321-
# α_snow = Snow.ZenithAngleAlbedoModel(α_0, α_horizon, k)
321+
# α_snow = Snow.ZenithAngleAlbedoModel(α_0, Δα, k)
322322
α_snow = Snow.ZenithAngleAlbedoModel(
323323
FT(α_0),
324-
FT(α_horizon),
324+
FT(Δα),
325325
FT(k);
326326
β = FT(beta_snow),
327327
x0 = FT(x0_snow),

experiments/calibration/priors.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# EKP.constrained_gaussian("α_leaf_scaler", 1, 0.15, 0.5, 1.5);
1515

1616
prior_α_0 = EKP.constrained_gaussian("α_0", 0.5, 0.2, 0.2, 0.8);
17-
prior_α_horizon = EKP.constrained_gaussian("α_horizon", 0.85, 0.1, 0.7, 1);
17+
prior_Δα = EKP.constrained_gaussian("Δα", 0.2, 0.1, 0.0, 1.0);
1818
prior_k = EKP.constrained_gaussian("k", 10, 5, 2, 25);
1919

2020
prior_beta_snow = EKP.constrained_gaussian("beta_snow", 0.4, 0.2, 0.1, 0.8);
@@ -35,7 +35,7 @@ prior = EKP.combine_distributions([
3535
# # prior_α_snow,
3636
# prior_α_soil_scale,
3737
prior_α_0,
38-
prior_α_horizon,
38+
prior_Δα,
3939
prior_k,
4040
prior_beta_snow,
4141
prior_x0_snow,

src/standalone/Snow/Snow.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ end
108108
109109
Establishes the albedo parameterization where albedo
110110
depends on the cosine of the zenith angle of the sun, as
111-
α = f(x) * [α_0 + (α_horizon - α_0)*exp(-k*cos(θs))],
111+
α = f(x) * [α_0 + Δα*exp(-k*cos(θs))],
112112
113-
where cos θs is the cosine of the zenith angle, α_0, α_1, and k
113+
where cos θs is the cosine of the zenith angle, α_0, Δα, and k
114114
are free parameters. The factor out front is a function of
115115
x = ρ_snow/ρ_liq, of the form f(x) = min(1 - β(x-x0), 1). The parameters
116116
x0 ∈ [0,1] and β ∈ [0,1] are free. Choose β = 0 to remove this dependence on snow density.
@@ -122,9 +122,9 @@ p.drivers. This is available through the PrescribedRadiativeFluxes object.
122122
struct ZenithAngleAlbedoModel{FT} <: AbstractAlbedoModel{FT}
123123
"Free parameter controlling the minimum snow albedo"
124124
α_0::FT
125-
"The albedo of snow when the sun is at the horizon"
126-
α_horizon::FT
127-
"Rate at which albedo drops from α_horizon to its minimum value"
125+
"Free parameter controlling the snow albedo when θs = 90∘"
126+
Δα::FT
127+
"Rate at which albedo drops to its minimum value with zenith angle"
128128
k::FT
129129
"Rate governing how snow albedo changes with snow density, a proxy for grain size and liquid water content, ∈ [0,1]"
130130
β::FT
@@ -134,14 +134,14 @@ end
134134

135135
function ZenithAngleAlbedoModel(
136136
α_0::FT,
137-
α_horizon::FT,
137+
Δα::FT,
138138
k::FT;
139139
β = FT(0),
140140
x0 = FT(0.2),
141141
) where {FT}
142142
@assert 0 x0 1
143143
@assert 0 β 1
144-
ZenithAngleAlbedoModel(α_0, α_horizon, k, β, x0)
144+
ZenithAngleAlbedoModel(α_0, Δα, k, β, x0)
145145
end
146146

147147
"""

src/standalone/Snow/snow_parameterizations.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,9 @@ function update_snow_albedo!(
4747
FT = eltype(earth_param_set)
4848
_ρ_liq = LP.ρ_cloud_liq(earth_param_set)
4949
@. α =
50-
min(1 - m.β * (p.snow.ρ_snow / _ρ_liq - m.x0), 1) * (
51-
m.α_0 +
52-
(m.α_horizon - m.α_0) * exp(-m.k * max(p.drivers.cosθs, eps(FT)))
53-
)
50+
min(1 - m.β * (p.snow.ρ_snow / _ρ_liq - m.x0), 1) *
51+
(m.α_0 + m.Δα * exp(-m.k * max(p.drivers.cosθs, eps(FT))))
52+
@. α = max(min(α, 1), 0)
5453
end
5554
"""
5655
update_snow_cover_fraction!(x::FT; z0 = FT(1e-1), β_scf = FT(2))::FT where {FT}

test/standalone/Snow/parameterizations.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ for FT in (Float32, Float64)
129129
min(m.β_scf * depth / FT(0.05) / (depth / FT(0.05) + 1), 1)
130130
)
131131

132-
m = Snow.ZenithAngleAlbedoModel(FT(0.6), FT(0.7), FT(2); β = FT(0.7))
132+
m = Snow.ZenithAngleAlbedoModel(FT(0.6), FT(0.1), FT(2); β = FT(0.7))
133133
update_snow_albedo!(α_snow, m, nothing, p, 0.0, param_set)
134134
@test all(
135135
@. α_snow
@@ -144,7 +144,7 @@ for FT in (Float32, Float64)
144144
for b in β
145145
m = Snow.ZenithAngleAlbedoModel(
146146
FT(0.6),
147-
FT(0.6),
147+
FT(0.0),
148148
FT(0);
149149
β = b,
150150
x0 = x,

0 commit comments

Comments
 (0)