Skip to content

Commit

Permalink
remove HydrologyEarthParameters struct
Browse files Browse the repository at this point in the history
  • Loading branch information
juliasloan25 committed Jan 14, 2025
1 parent 260b427 commit 9f09ffb
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 103 deletions.
10 changes: 3 additions & 7 deletions src/standalone/Soil/energy_hydrology.jl
Original file line number Diff line number Diff line change
Expand Up @@ -640,15 +640,11 @@ function ClimaLand.source!(
model,
) where {FT}
params = model.parameters
(; ν, ρc_ds, θ_r, hydrology_cm, earth_param_set) = params
(; ν, ρc_ds, θ_r, earth_param_set) = params
_ρ_l = FT(LP.ρ_cloud_liq(earth_param_set))
_ρ_i = FT(LP.ρ_cloud_ice(earth_param_set))
Δz = model.domain.fields.Δz # center face distance

# Wrap hydrology and earth parameters in one struct to avoid type inference failure. This is allocating! We should remove it.
hydrology_earth_params =
ClimaLand.Soil.HydrologyEarthParameters.(hydrology_cm, earth_param_set)

@. dY.soil.ϑ_l +=
-phase_change_source(
p.soil.θ_l,
Expand All @@ -666,7 +662,7 @@ function ClimaLand.source!(
),
ν,
θ_r,
hydrology_earth_params,
params,
)
@. dY.soil.θ_i +=
(_ρ_l / _ρ_i) * phase_change_source(
Expand All @@ -685,7 +681,7 @@ function ClimaLand.source!(
),
ν,
θ_r,
hydrology_earth_params,
params,
)
end

Expand Down
34 changes: 5 additions & 29 deletions src/standalone/Soil/soil_heat_parameterizations.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ end
τ::FT,
ν::FT,
θ_r::FT,
hydrology_earth_params::HEP
) where {FT, HEP}
params::P
) where {FT, P}
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
Expand All @@ -49,11 +49,10 @@ function phase_change_source(
τ::FT,
ν::FT,
θ_r::FT,
hydrology_earth_params::HEP,
) where {FT, HEP}
params::P,
) where {FT, P}
# Extract parameter sets from their container
hydrology_cm = hydrology_earth_params.hydrology_cm
earth_param_set = hydrology_earth_params.earth_param_set
(; hydrology_cm, earth_param_set) = params

_ρ_i = FT(LP.ρ_cloud_ice(earth_param_set))
_ρ_l = FT(LP.ρ_cloud_liq(earth_param_set))
Expand All @@ -74,29 +73,6 @@ function phase_change_source(
return (θ_l - θstar) / τ
end

"""
struct HydrologyEarthParameters{
HCM <: AbstractSoilHydrologyClosure,
EP <: ClimaLand.Parameters.AbstractLandParameters,
}
A wrapper type around the hydrology closure model and land parameter
structs. This is needed because of a type inference failure coming from
ClimaCore when multiple structs and fields are broadcasted over.
This struct circumvents that issue by wrapping the structs in a single
type, that can be unpacked within the broadcasted function.
See github.com/CliMA/ClimaCore.jl/issues/2065 for more information
"""
struct HydrologyEarthParameters{
HCM <: AbstractSoilHydrologyClosure,
EP <: ClimaLand.Parameters.AbstractLandParameters,
}
hydrology_cm::HCM
earth_param_set::EP
end
Base.broadcastable(x::HydrologyEarthParameters) = tuple(x)

"""
volumetric_heat_capacity(
θ_l::FT,
Expand Down
78 changes: 11 additions & 67 deletions test/standalone/Soil/soil_parameterizations.jl
Original file line number Diff line number Diff line change
Expand Up @@ -307,10 +307,6 @@ for FT in (Float32, Float64)
vg_n = FT(1.4)
hcm = vanGenuchten{FT}(; α = vg_α, n = vg_n)

# Wrap hydrology and earth parameters in one struct to avoid type inference failure
hydrology_earth_params =
ClimaLand.Soil.HydrologyEarthParameters(hcm, param_set)

K_sat = FT(1e-5)
ν_ss_om = FT(0.1)
ν_ss_gravel = FT(0.1)
Expand Down Expand Up @@ -343,26 +339,11 @@ for FT in (Float32, Float64)
ρc_s = volumetric_heat_capacity.(θ_l, θ_i, parameters.ρc_ds, param_set)
τ = thermal_time.(ρc_s, Δz, parameters.κ_dry)
@test (
phase_change_source.(
θ_l,
θ_i,
T,
τ,
ν,
θ_r,
hydrology_earth_params,
) (θ_l .- θ_star) ./ τ
phase_change_source.(θ_l, θ_i, T, τ, ν, θ_r, parameters)
(θ_l .- θ_star) ./ τ
)
@test sum(
phase_change_source.(
θ_l,
θ_i,
T,
τ,
ν,
θ_r,
hydrology_earth_params,
) .> 0.0,
phase_change_source.(θ_l, θ_i, T, τ, ν, θ_r, parameters) .> 0.0,
) == 3

θ_l = FT.([0.11, 0.15, ν])
Expand All @@ -378,15 +359,8 @@ for FT in (Float32, Float64)
ρc_s = volumetric_heat_capacity.(θ_l, θ_i, parameters.ρc_ds, param_set)
τ = thermal_time.(ρc_s, Δz, parameters.κ_dry)
@test (
phase_change_source.(
θ_l,
θ_i,
T,
τ,
ν,
θ_r,
hydrology_earth_params,
) zeros(FT, 3)
phase_change_source.(θ_l, θ_i, T, τ, ν, θ_r, parameters)
zeros(FT, 3)
)
@test (θ_star θ_l)

Expand All @@ -404,26 +378,11 @@ for FT in (Float32, Float64)
ρc_s = volumetric_heat_capacity.(θ_l, θ_i, parameters.ρc_ds, param_set)
τ = thermal_time.(ρc_s, Δz, parameters.κ_dry)
@test (
phase_change_source.(
θ_l,
θ_i,
T,
τ,
ν,
θ_r,
hydrology_earth_params,
) (θ_l .- θ_star) ./ τ
phase_change_source.(θ_l, θ_i, T, τ, ν, θ_r, parameters)
(θ_l .- θ_star) ./ τ
)
@test sum(
phase_change_source.(
θ_l,
θ_i,
T,
τ,
ν,
θ_r,
hydrology_earth_params,
) .< 0.0,
phase_change_source.(θ_l, θ_i, T, τ, ν, θ_r, parameters) .< 0.0,
) == 2


Expand All @@ -440,26 +399,11 @@ for FT in (Float32, Float64)
ρc_s = volumetric_heat_capacity.(θ_l, θ_i, parameters.ρc_ds, param_set)
τ = thermal_time.(ρc_s, Δz, parameters.κ_dry)
@test (
phase_change_source.(
θ_l,
θ_i,
T,
τ,
ν,
θ_r,
hydrology_earth_params,
) (θ_l .- θ_star) ./ τ
phase_change_source.(θ_l, θ_i, T, τ, ν, θ_r, parameters)
(θ_l .- θ_star) ./ τ
)
@test sum(
phase_change_source.(
θ_l,
θ_i,
T,
τ,
ν,
θ_r,
hydrology_earth_params,
) .> 0.0,
phase_change_source.(θ_l, θ_i, T, τ, ν, θ_r, parameters) .> 0.0,
) == 2
end
end

0 comments on commit 9f09ffb

Please sign in to comment.