Skip to content

Commit 1005230

Browse files
Use LazyBroadcast for subsidence tendency
1 parent 799fb93 commit 1005230

File tree

3 files changed

+54
-65
lines changed

3 files changed

+54
-65
lines changed

src/prognostic_equations/forcing/external_forcing.jl

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ function external_forcing_tendency!(
201201
ᶜinv_τ_wind,
202202
ᶜinv_τ_scalar,
203203
) = p.external_forcing
204+
ᶜρ = Y.c.ρ
204205

205206
ᶜlg = Fields.local_geometry_field(Y.c)
206207
ᶜuₕ_nudge = p.scratch.ᶜtemp_C12
@@ -239,19 +240,21 @@ function external_forcing_tendency!(
239240
ᶠls_subsidence³ = p.scratch.ᶠtemp_CT3
240241
@. ᶠls_subsidence³ =
241242
ᶠinterp(ᶜls_subsidence * CT3(unit_basis_vector_data(CT3, ᶜlg)))
242-
subsidence!(
243-
Yₜ.c.ρe_tot,
244-
Y.c.ρ,
243+
Yₜ.c.ρe_tot .+= subsidence_tendency(
244+
Val(:h_tot),
245245
ᶠls_subsidence³,
246-
ᶜh_tot,
247-
Val{:first_order}(),
246+
thermo_params,
247+
ᶜts,
248+
ᶜρ,
249+
ᶜρe_tot,
248250
)
249-
subsidence!(
250-
Yₜ.c.ρq_tot,
251-
Y.c.ρ,
251+
Yₜ.c.ρq_tot .+= subsidence_tendency(
252+
Val(:q_tot),
252253
ᶠls_subsidence³,
253-
ᶜspecific.q_tot,
254-
Val{:first_order}(),
254+
thermo_params,
255+
ᶜts,
256+
ᶜρ,
257+
ᶜρe_tot,
255258
)
256259

257260
# needed to address top boundary condition for forcings. Otherwise upper portion of domain is anomalously cold

src/prognostic_equations/forcing/subsidence.jl

Lines changed: 30 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,63 +3,42 @@
33
#####
44

55
import Thermodynamics as TD
6-
import ClimaCore.Spaces as Spaces
76
import ClimaCore.Fields as Fields
8-
import ClimaCore.Operators as Operators
9-
10-
#####
11-
##### No subsidence
12-
#####
13-
14-
subsidence_tendency!(Yₜ, Y, p, t, ::Nothing) = nothing
157

168
#####
179
##### Subsidence
1810
#####
1911

20-
subsidence!(ᶜρχₜ, ᶜρ, ᶠu³, ᶜχ, ::Val{:none}) =
21-
@. ᶜρχₜ -= ᶜρ * (ᶜsubdivᵥ(ᶠu³ * ᶠinterp(ᶜχ)) - ᶜχ * ᶜsubdivᵥ(ᶠu³))
22-
subsidence!(ᶜρχₜ, ᶜρ, ᶠu³, ᶜχ, ::Val{:first_order}) =
23-
@. ᶜρχₜ -= ᶜρ * (ᶜsubdivᵥ(ᶠupwind1(ᶠu³, ᶜχ)) - ᶜχ * ᶜsubdivᵥ(ᶠu³))
24-
subsidence!(ᶜρχₜ, ᶜρ, ᶠu³, ᶜχ, ::Val{:third_order}) =
25-
@. ᶜρχₜ -= ᶜρ * (ᶜsubdivᵥ(ᶠupwind3(ᶠu³, ᶜχ)) - ᶜχ * ᶜsubdivᵥ(ᶠu³))
26-
27-
function subsidence_tendency!(Yₜ, Y, p, t, ::Subsidence)
28-
(; moisture_model) = p.atmos
29-
subsidence_profile = p.atmos.subsidence.prof
30-
(; ᶜh_tot, ᶜspecific) = p.precomputed
31-
32-
ᶠz = Fields.coordinate_field(axes(Y.f)).z
33-
ᶠlg = Fields.local_geometry_field(Y.f)
34-
ᶠsubsidence³ = p.scratch.ᶠtemp_CT3
35-
@. ᶠsubsidence³ =
36-
subsidence_profile(ᶠz) * CT3(unit_basis_vector_data(CT3, ᶠlg))
37-
38-
# LS Subsidence
39-
subsidence!(Yₜ.c.ρe_tot, Y.c.ρ, ᶠsubsidence³, ᶜh_tot, Val{:first_order}())
40-
subsidence!(
41-
Yₜ.c.ρq_tot,
42-
Y.c.ρ,
43-
ᶠsubsidence³,
44-
ᶜspecific.q_tot,
45-
Val{:first_order}(),
46-
)
47-
if moisture_model isa NonEquilMoistModel
48-
subsidence!(
49-
Yₜ.c.ρq_liq,
50-
Y.c.ρ,
51-
ᶠsubsidence³,
52-
ᶜspecific.q_liq,
53-
Val{:first_order}(),
54-
)
55-
subsidence!(
56-
Yₜ.c.ρq_ice,
57-
Y.c.ρ,
58-
ᶠsubsidence³,
59-
ᶜspecific.q_ice,
60-
Val{:first_order}(),
61-
)
12+
subsidence_tracer(::Val{:h_tot}, thermo_params, ts, ρ, ρe_tot) =
13+
TD.total_specific_enthalpy(thermo_params, ts, ρe_tot / ρ)
14+
subsidence_tracer(::Val{:q_tot}, thermo_params, ts, ρ, ρe_tot) =
15+
TD.total_specific_humidity(thermo_params, ts)
16+
subsidence_tracer(::Val{:q_liq}, thermo_params, ts, ρ, ρe_tot) =
17+
TD.liquid_specific_humidity(thermo_params, ts)
18+
subsidence_tracer(::Val{:q_ice}, thermo_params, ts, ρ, ρe_tot) =
19+
TD.ice_specific_humidity(thermo_params, ts)
20+
21+
function subsidence_tendency(χname, subsidence, thermo_params, ᶜts, ᶜρ, ᶜρe_tot)
22+
subsidence isa Nothing && return NullBroadcasted()
23+
ᶠspace = Spaces.face_space(axes(ᶜρ))
24+
ᶠu³ = if subsidence isa Subsidence
25+
ᶠsubsidence³(ᶠspace, subsidence)
26+
else
27+
subsidence
6228
end
29+
ᶜχ = @. lazy(subsidence_tracer(χname, thermo_params, ᶜts, ᶜρ, ᶜρe_tot))
30+
return subsidence_tendency(ᶜρ, ᶜχ, ᶠu³, Val(:first_order))
31+
end
6332

64-
return nothing
33+
function ᶠsubsidence³(ᶠspace, subsidence::Subsidence)
34+
ᶠz = Fields.coordinate_field(ᶠspace).z
35+
ᶠlg = Fields.local_geometry_field(ᶠspace)
36+
(; prof) = subsidence
37+
return @. lazy(prof(ᶠz) * CT3(unit_basis_vector_data(CT3, ᶠlg)))
6538
end
39+
subsidence_tendency(ᶜρ, ᶜχ, ᶠu³, ::Val{:none}) =
40+
@. lazy(- ᶜρ * (ᶜsubdivᵥ(ᶠu³ * ᶠinterp(ᶜχ)) - ᶜχ * ᶜsubdivᵥ(ᶠu³)))
41+
subsidence_tendency(ᶜρ, ᶜχ, ᶠu³, ::Val{:first_order}) =
42+
@. lazy(- ᶜρ * (ᶜsubdivᵥ(ᶠupwind1(ᶠu³, ᶜχ)) - ᶜχ * ᶜsubdivᵥ(ᶠu³)))
43+
subsidence_tendency(ᶜρ, ᶜχ, ᶠu³, ::Val{:third_order}) =
44+
@. lazy(- ᶜρ * (ᶜsubdivᵥ(ᶠupwind3(ᶠu³, ᶜχ)) - ᶜχ * ᶜsubdivᵥ(ᶠu³)))

src/prognostic_equations/remaining_tendency.jl

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
4040
ᶜuₕ = Y.c.uₕ
4141
ᶠu₃ = Yₜ.f.u₃
4242
ᶜρ = Y.c.ρ
43+
ᶜρe_tot = Y.c.ρe_tot
4344
(; forcing_type, moisture_model, rayleigh_sponge, viscous_sponge) = p.atmos
44-
(; ls_adv, edmf_coriolis) = p.atmos
45+
(; ls_adv, subsidence, edmf_coriolis) = p.atmos
4546
(; params) = p
4647
thermo_params = CAP.thermodynamics_params(params)
4748
(; ᶜp, sfc_conditions, ᶜts) = p.precomputed
@@ -53,6 +54,7 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
5354
hs_args = (ᶜuₕ, ᶜp, params, sfc_conditions.ts, moisture_model, forcing_type)
5455
hs_tendency_uₕ = held_suarez_forcing_tendency_uₕ(hs_args...)
5556
hs_tendency_ρe_tot = held_suarez_forcing_tendency_ρe_tot(ᶜρ, hs_args...)
57+
subs_args = (subsidence, thermo_params, ᶜts, ᶜρ, ᶜρe_tot)
5658
edmf_cor_tend_uₕ = edmf_coriolis_tendency_uₕ(ᶜuₕ, edmf_coriolis)
5759
lsa_args = (ᶜρ, thermo_params, ᶜts, t, ls_adv)
5860
bc_lsa_tend_ρe_tot = large_scale_advection_tendency_ρe_tot(lsa_args...)
@@ -76,12 +78,17 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
7678
@. Yₜ.c.uₕ += hs_tendency_uₕ
7779
@. Yₜ.c.ρe_tot += hs_tendency_ρe_tot
7880

79-
subsidence_tendency!(Yₜ, Y, p, t, p.atmos.subsidence)
81+
if moisture_model isa AbstractMoistModel
82+
Yₜ.c.ρq_tot .+= subsidence_tendency(Val(:q_tot), subs_args...)
83+
end
84+
if moisture_model isa NonEquilMoistModel
85+
Yₜ.c.ρq_liq .+= subsidence_tendency(Val(:q_liq), subs_args...)
86+
Yₜ.c.ρq_ice .+= subsidence_tendency(Val(:q_ice), subs_args...)
87+
end
8088

8189
@. Yₜ.c.ρe_tot += bc_lsa_tend_ρe_tot
8290
if moisture_model isa AbstractMoistModel
83-
bc_lsa_tend_ρq_tot = large_scale_advection_tendency_ρq_tot(lsa_args...)
84-
@. Yₜ.c.ρq_tot += bc_lsa_tend_ρq_tot
91+
Yₜ.c.ρq_tot .+= large_scale_advection_tendency_ρq_tot(lsa_args...)
8592
end
8693

8794
@. Yₜ.c.uₕ += edmf_cor_tend_uₕ

0 commit comments

Comments
 (0)