Skip to content

Commit 91d4650

Browse files
committed
restructure env, specific helper functions
1 parent 51ad848 commit 91d4650

21 files changed

+420
-319
lines changed

src/cache/cloud_fraction.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ NVTX.@annotate function set_cloud_fraction!(
8484
(; turbconv_model) = p.atmos
8585

8686
if isnothing(turbconv_model)
87-
ᶜρa⁰ = @.lazy(ρa⁰(Y.c))
8887
if p.atmos.call_cloud_diagnostics_per_stage isa
8988
CallCloudDiagnosticsPerStage
9089
(; ᶜgradᵥ_θ_virt, ᶜgradᵥ_q_tot, ᶜgradᵥ_θ_liq_ice) = p.precomputed
@@ -191,7 +190,7 @@ NVTX.@annotate function set_cloud_fraction!(
191190
(; ᶜts⁰, ᶜmixing_length, cloud_diagnostics_tuple) = p.precomputed
192191
(; ᶜρʲs, ᶜtsʲs) = p.precomputed
193192
(; turbconv_model) = p.atmos
194-
ᶜρa⁰ = @.lazy(ρa(Y.c))
193+
ᶜρa⁰_vals = ᶜρa(Y.c, p)
195194

196195
# TODO - we should make this default when using diagnostic edmf
197196
# environment
@@ -210,9 +209,9 @@ NVTX.@annotate function set_cloud_fraction!(
210209
# weight cloud diagnostics by environmental area
211210
@. cloud_diagnostics_tuple *= NamedTuple{(:cf, :q_liq, :q_ice)}(
212211
tuple(
213-
draft_area(ᶜρa⁰, TD.air_density(thermo_params, ᶜts⁰)),
214-
draft_area(ᶜρa⁰, TD.air_density(thermo_params, ᶜts⁰)),
215-
draft_area(ᶜρa⁰, TD.air_density(thermo_params, ᶜts⁰)),
212+
draft_area(ᶜρa⁰_vals, TD.air_density(thermo_params, ᶜts⁰)),
213+
draft_area(ᶜρa⁰_vals, TD.air_density(thermo_params, ᶜts⁰)),
214+
draft_area(ᶜρa⁰_vals, TD.air_density(thermo_params, ᶜts⁰)),
216215
),
217216
)
218217
# updrafts

src/cache/diagnostic_edmf_precomputed_quantities.jl

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -105,21 +105,24 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_bottom_bc!(
105105
turbconv_params = CAP.turbconv_params(params)
106106
ᶜts = p.precomputed.ᶜts #TODO replace
107107

108-
q_tot = specific(Y.c.ρq_tot, Y.c.ρ)
108+
q_tot = @. lazy(specific(Y.c.ρq_tot, Y.c.ρ))
109+
ᶜe_tot = @. lazy(specific(Y.c.ρe_tot, Y.c.ρ))
109110
ᶜh_tot = @. lazy(
110111
TD.total_specific_enthalpy(
111112
thermo_params,
112113
ᶜts,
113-
specific(Y.c.ρe_tot, Y.c.ρ),
114+
ᶜe_tot,
114115
),
115116
)
116117

117118
ρ_int_level = Fields.field_values(Fields.level(Y.c.ρ, 1))
118119
uₕ_int_level = Fields.field_values(Fields.level(Y.c.uₕ, 1))
119120
u³_int_halflevel = Fields.field_values(Fields.level(ᶠu³, half))
120-
h_tot_int_level = Fields.field_values(Fields.level(ᶜh_tot, 1))
121+
h_tot_int_level =
122+
Fields.field_values(Fields.level(Base.materialize(ᶜh_tot), 1))
121123
K_int_level = Fields.field_values(Fields.level(ᶜK, 1))
122-
q_tot_int_level = Fields.field_values(Fields.level(q_tot, 1))
124+
q_tot_int_level =
125+
Fields.field_values(Fields.level(Base.materialize(q_tot), 1))
123126

124127
p_int_level = Fields.field_values(Fields.level(ᶜp, 1))
125128
Φ_int_level = Fields.field_values(Fields.level(ᶜΦ, 1))
@@ -330,7 +333,9 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_do_integral!(
330333
ᶠnh_pressure³_buoyʲs,
331334
ᶠnh_pressure³_dragʲs,
332335
) = p.precomputed
333-
(; ᶠu³⁰, ᶜK⁰, ᶜtke⁰) = p.precomputed
336+
(; ᶠu³⁰, ᶜK⁰) = p.precomputed
337+
338+
334339

335340
if microphysics_model isa Microphysics1Moment
336341
q_rai = @. lazy(specific(Y.c.ρq_rai, Y.c.ρ))
@@ -354,14 +359,25 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_do_integral!(
354359
Fields.field_values(Fields.level(Fields.coordinate_field(Y.f).z, half))
355360

356361
# integral
357-
q_tot = specific(Y.c.ρq_tot, Y.c.ρ)
362+
q_tot = @. lazy(specific(Y.c.ρq_tot, Y.c.ρ))
363+
ᶜh_tot = @. lazy(
364+
TD.total_specific_enthalpy(
365+
thermo_params,
366+
ᶜts,
367+
specific(Y.c.ρe_tot, Y.c.ρ),
368+
),
369+
)
370+
ᶜtke⁰ = ᶜspecific_tke(Y.c.sgs⁰, Y.c, p)
371+
358372
for i in 2:Spaces.nlevels(axes(Y.c))
359373
ρ_level = Fields.field_values(Fields.level(Y.c.ρ, i))
360374
uₕ_level = Fields.field_values(Fields.level(Y.c.uₕ, i))
361375
u³_halflevel = Fields.field_values(Fields.level(ᶠu³, i - half))
362376
K_level = Fields.field_values(Fields.level(ᶜK, i))
363-
h_tot_level = Fields.field_values(Fields.level(ᶜh_tot, i))
364-
q_tot_level = Fields.field_values(Fields.level(q_tot, i))
377+
h_tot_level =
378+
Fields.field_values(Fields.level(Base.materialize(ᶜh_tot), i))
379+
q_tot_level =
380+
Fields.field_values(Fields.level(Base.materialize(q_tot), i))
365381
p_level = Fields.field_values(Fields.level(ᶜp, i))
366382
Φ_level = Fields.field_values(Fields.level(ᶜΦ, i))
367383
local_geometry_level = Fields.field_values(
@@ -385,8 +401,10 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_do_integral!(
385401
Fields.field_values(Fields.level(ᶠu³⁰, i - 1 - half))
386402
u³⁰_data_prev_halflevel = u³⁰_prev_halflevel.components.data.:1
387403
K_prev_level = Fields.field_values(Fields.level(ᶜK, i - 1))
388-
h_tot_prev_level = Fields.field_values(Fields.level(ᶜh_tot, i - 1))
389-
q_tot_prev_level = Fields.field_values(Fields.level(q_tot, i - 1))
404+
h_tot_prev_level =
405+
Fields.field_values(Fields.level(Base.materialize(ᶜh_tot), i - 1))
406+
q_tot_prev_level =
407+
Fields.field_values(Fields.level(Base.materialize(q_tot), i - 1))
390408
ts_prev_level = Fields.field_values(Fields.level(ᶜts, i - 1))
391409
p_prev_level = Fields.field_values(Fields.level(ᶜp, i - 1))
392410
z_prev_level = Fields.field_values(Fields.level(ᶜz, i - 1))
@@ -486,7 +504,9 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_do_integral!(
486504
Fields.field_values(Fields.level(ᶜq_iceʲ, i - 1))
487505
end
488506

489-
tke_prev_level = Fields.field_values(Fields.level(ᶜtke⁰, i - 1))
507+
tke_prev_level = Fields.field_values(
508+
Fields.level(Base.materialize(ᶜtke⁰), i - 1),
509+
)
490510

491511
@. entrʲ_prev_level = entrainment(
492512
thermo_params,
@@ -1015,6 +1035,8 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_env_closures!
10151035
@. ᶜprandtl_nvec =
10161036
turbulent_prandtl_number(params, ᶜlinear_buoygrad, ᶜstrain_rate_norm)
10171037

1038+
ᶜtke⁰ = ᶜspecific_tke(Y.c.sgs⁰, Y.c, p)
1039+
10181040
ᶜtke_exch = p.scratch.ᶜtemp_scalar_2
10191041
@. ᶜtke_exch = 0
10201042
# using ᶜu⁰ would be more correct, but this is more consistent with the
@@ -1025,7 +1047,7 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_env_closures!
10251047
(1 / 2 * norm_sqr(ᶜinterp(ᶠu³⁰) - ᶜinterp(ᶠu³ʲs.:($$j))) - ᶜtke⁰)
10261048
end
10271049

1028-
sfc_tke = Fields.level(ᶜtke⁰, 1)
1050+
sfc_tke = Fields.level(Base.materialize(ᶜtke⁰), 1)
10291051
z_sfc = Fields.level(Fields.coordinate_field(Y.f).z, half)
10301052
@. ᶜmixing_length_tuple = mixing_length(
10311053
params,
@@ -1090,12 +1112,12 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_env_precipita
10901112
(; ᶜts, ᶜSqₜᵖ⁰) = p.precomputed
10911113

10921114
# Environment precipitation sources (to be applied to grid mean)
1093-
q_tot = @. lazy(specific(Y.c.ρq_tot, Y.c.ρ))
1115+
ᶜq_tot = @. lazy(specific(Y.c.ρq_tot, Y.c.ρ))
10941116
@. ᶜSqₜᵖ⁰ = q_tot_0M_precipitation_sources(
10951117
thermo_params,
10961118
microphys_0m_params,
10971119
dt,
1098-
specific(Y.c.ρq_tot, Y.c.ρ),
1120+
ᶜq_tot,
10991121
ᶜts,
11001122
)
11011123
return nothing

src/cache/precipitation_precomputed_quantities.jl

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -262,14 +262,14 @@ function set_precipitation_cache!(
262262
(; ᶜS_ρq_tot, ᶜS_ρe_tot) = p.precomputed
263263
(; ᶜts⁰, ᶜtsʲs) = p.precomputed
264264
thermo_params = CAP.thermodynamics_params(p.params)
265-
ᶜρa⁰ = @.lazy(ρa(Y.c))
265+
ᶜρa⁰_vals = ᶜρa(Y.c, p)
266266

267267
n = n_mass_flux_subdomains(p.atmos.turbconv_model)
268268

269-
@. ᶜS_ρq_tot = ᶜSqₜᵖ⁰ * ᶜρa⁰
269+
@. ᶜS_ρq_tot = ᶜSqₜᵖ⁰ * ᶜρa⁰_vals
270270
@. ᶜS_ρe_tot =
271271
ᶜSqₜᵖ⁰ *
272-
ᶜρa⁰ *
272+
ᶜρa⁰_vals *
273273
e_tot_0M_precipitation_sources_helper(thermo_params, ᶜts⁰, ᶜΦ)
274274
for j in 1:n
275275
@. ᶜS_ρq_tot += ᶜSqₜᵖʲs.:($$j) * Y.c.sgsʲs.:($$j).ρa
@@ -289,8 +289,11 @@ function set_precipitation_cache!(Y, p, ::Microphysics1Moment, _)
289289
(; ᶜts, ᶜwᵣ, ᶜwₛ, ᶜu) = p.precomputed
290290
(; ᶜSqₗᵖ, ᶜSqᵢᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ) = p.precomputed
291291

292-
q_rai = specific(Y.c.ρq_rai, Y.c.ρ)
293-
q_sno = specific(Y.c.ρq_sno, Y.c.ρ)
292+
q_tot = @. lazy(specific(Y.c.ρq_tot, Y.c.ρ))
293+
q_rai = @. lazy(specific(Y.c.ρq_rai, Y.c.ρ))
294+
q_sno = @. lazy(specific(Y.c.ρq_sno, Y.c.ρ))
295+
q_liq = @. lazy(specific(Y.c.ρq_liq, Y.c.ρ))
296+
q_ice = @. lazy(specific(Y.c.ρq_ice, Y.c.ρ))
294297

295298
ᶜSᵖ = p.scratch.ᶜtemp_scalar
296299
ᶜSᵖ_snow = p.scratch.ᶜtemp_scalar_2
@@ -364,10 +367,10 @@ function set_precipitation_cache!(Y, p, ::Microphysics2Moment, _)
364367
(; ᶜSqₗᵖ, ᶜSqᵢᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ) = p.precomputed
365368
(; ᶜSnₗᵖ, ᶜSnᵣᵖ) = p.precomputed
366369

367-
q_liq = specific(Y.c.ρq_liq, Y.c.ρ)
368-
q_rai = specific(Y.c.ρq_rai, Y.c.ρ)
369-
n_liq = specific(Y.c.ρn_liq, Y.c.ρ)
370-
n_rai = specific(Y.c.ρn_rai, Y.c.ρ)
370+
q_liq = @. lazy(specific(Y.c.ρq_liq, Y.c.ρ))
371+
q_rai = @. lazy(specific(Y.c.ρq_rai, Y.c.ρ))
372+
n_liq = @. lazy(specific(Y.c.ρn_liq, Y.c.ρ))
373+
n_rai = @. lazy(specific(Y.c.ρn_rai, Y.c.ρ))
371374

372375
ᶜSᵖ = p.scratch.ᶜtemp_scalar
373376
ᶜS₂ᵖ = p.scratch.ᶜtemp_scalar_2
@@ -481,20 +484,24 @@ function set_precipitation_surface_fluxes!(
481484
sfc_ρ = @. lazy(int_ρ * int_J / sfc_J)
482485

483486
# Constant extrapolation to surface, consistent with simple downwinding
487+
ᶜq_rai = @. lazy(specific(Y.c.ρq_rai, Y.c.ρ))
488+
ᶜq_sno = @. lazy(specific(Y.c.ρq_sno, Y.c.ρ))
489+
ᶜq_liq = @. lazy(specific(Y.c.ρq_liq, Y.c.ρ))
490+
ᶜq_ice = @. lazy(specific(Y.c.ρq_ice, Y.c.ρ))
484491
sfc_qᵣ = Fields.Field(
485-
Fields.field_values(Fields.level(specific(Y.c.ρq_rai, Y.c.ρ), 1)),
492+
Fields.field_values(Fields.level(Base.materialize(ᶜq_rai), 1)),
486493
sfc_space,
487494
)
488495
sfc_qₛ = Fields.Field(
489-
Fields.field_values(Fields.level(specific(Y.c.ρq_sno, Y.c.ρ), 1)),
496+
Fields.field_values(Fields.level(Base.materialize(ᶜq_sno), 1)),
490497
sfc_space,
491498
)
492499
sfc_qₗ = Fields.Field(
493-
Fields.field_values(Fields.level(specific(Y.c.ρq_liq, Y.c.ρ), 1)),
500+
Fields.field_values(Fields.level(Base.materialize(ᶜq_liq), 1)),
494501
sfc_space,
495502
)
496503
sfc_qᵢ = Fields.Field(
497-
Fields.field_values(Fields.level(specific(Y.c.ρq_ice, Y.c.ρ), 1)),
504+
Fields.field_values(Fields.level(Base.materialize(ᶜq_ice), 1)),
498505
sfc_space,
499506
)
500507
sfc_wᵣ = Fields.Field(Fields.field_values(Fields.level(ᶜwᵣ, 1)), sfc_space)

src/cache/precomputed_quantities.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,9 @@ function set_sgs_ᶠu₃!(w_function, ᶠu₃, Y, turbconv_model)
319319
return nothing
320320
end
321321

322-
function add_sgs_ᶜK!(ᶜK, Y, ᶜρa⁰, ᶠu₃⁰, turbconv_model)
323-
@. ᶜK += ᶜρa⁰ * ᶜinterp(dot(ᶠu₃⁰ - Yf.u₃, CT3(ᶠu₃⁰ - Yf.u₃))) / 2 / Yc.ρ
322+
function add_sgs_ᶜK!(ᶜK, Y, ᶜρa⁰_vals, ᶠu₃⁰, turbconv_model)
323+
@. ᶜK +=
324+
ᶜρa⁰_vals * ᶜinterp(dot(ᶠu₃⁰ - Yf.u₃, CT3(ᶠu₃⁰ - Yf.u₃))) / 2 / Yc.ρ
324325
for j in 1:n_mass_flux_subdomains(turbconv_model)
325326
ᶜρaʲ = Y.c.sgsʲs.:($j).ρa
326327
ᶠu₃ʲ = Y.f.sgsʲs.:($j).u₃
@@ -473,8 +474,6 @@ NVTX.@annotate function set_implicit_precomputed_quantities!(Y, p, t)
473474
set_prognostic_edmf_precomputed_quantities_draft!(Y, p, ᶠuₕ³, t)
474475
set_prognostic_edmf_precomputed_quantities_environment!(Y, p, ᶠuₕ³, t)
475476
set_prognostic_edmf_precomputed_quantities_implicit_closures!(Y, p, t)
476-
elseif turbconv_model isa DiagnosticEDMFX
477-
set_diagnostic_edmf_precomputed_quantities!(Y, p, t)
478477
elseif !(isnothing(turbconv_model))
479478
# Do nothing for other turbconv models for now
480479
end

0 commit comments

Comments
 (0)