Skip to content

Commit 48b567c

Browse files
authored
Merge pull request #3879 from CliMA/cc/remove_precomputed_new
Remove environmental precomputed quantities
2 parents 0cf21fc + 06b76cc commit 48b567c

28 files changed

+856
-474
lines changed

perf/flame.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ allocs_limit["flame_aquaplanet_progedmf_dense_autodiff"] = 774_712
4848
allocs_limit["flame_aquaplanet_progedmf_sparse_autodiff"] = 774_712
4949
allocs_limit["flame_diffusion"] = 138_432
5050
allocs_limit["flame_threaded"] = 2047_736
51-
allocs_limit["flame_callbacks"] = 391_942
51+
allocs_limit["flame_callbacks"] = 400_942
5252
allocs_limit["flame_gravity_wave"] = 581_381_976
5353
# Ideally, we would like to track all the allocations, but this becomes too
5454
# expensive there is too many of them. Here, we set the default sample rate to

reproducibility_tests/ref_counter.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
250
1+
251
22

33
# **README**
44
#
@@ -20,6 +20,11 @@
2020

2121

2222
#=
23+
251
24+
- Remove ᶜtke⁰, ᶜh_tot, ᶜmse⁰, ᶜρ⁰, and specific quantities from precomputed quantities cache.
25+
Introduce helper functions to compute sums over draft, environmental volumetric variables,
26+
and specific env variables.
27+
2328
250
2429
- Add ARG aerosol activation for 2M microphysics; increase the allocation limit for `flame_callbacks`
2530
from 391864 to 391942 to account for additional allocations when constructing `ClimaAtmosParameters`

src/ClimaAtmos.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import LazyBroadcast
88
import LazyBroadcast: lazy
99
import Thermodynamics as TD
1010
import Thermodynamics
11+
import ClimaCore.MatrixFields: @name
12+
1113

1214
include("compat.jl")
1315
include(joinpath("parameters", "Parameters.jl"))

src/cache/cloud_fraction.jl

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,10 @@ NVTX.@annotate function set_cloud_fraction!(
5959
TD.PhasePartition(thermo_params, ᶜts).ice,
6060
)
6161
else
62-
@. cloud_diagnostics_tuple = make_named_tuple(
63-
ifelse(
64-
specific(Y.c.ρq_liq, Y.c.ρ) + specific(Y.c.ρq_ice, Y.c.ρ) > 0,
65-
1,
66-
0,
67-
),
68-
specific(Y.c.ρq_liq, Y.c.ρ),
69-
specific(Y.c.ρq_ice, Y.c.ρ),
70-
)
62+
q_liq = @. lazy(specific(Y.c.ρq_liq, Y.c.ρ))
63+
q_ice = @. lazy(specific(Y.c.ρq_ice, Y.c.ρ))
64+
@. cloud_diagnostics_tuple =
65+
make_named_tuple(ifelse(q_liq + q_ice > 0, 1, 0), q_liq, q_ice)
7166
end
7267
end
7368

@@ -194,8 +189,9 @@ NVTX.@annotate function set_cloud_fraction!(
194189
FT = eltype(params)
195190
thermo_params = CAP.thermodynamics_params(params)
196191
(; ᶜts⁰, cloud_diagnostics_tuple) = p.precomputed
197-
(; ᶜρʲs, ᶜtsʲs, ᶜρa⁰, ᶜρ⁰) = p.precomputed
192+
(; ᶜρʲs, ᶜtsʲs) = p.precomputed
198193
(; turbconv_model) = p.atmos
194+
ᶜρa⁰ = @. lazy(ρa⁰(Y.c.ρ, Y.c.sgsʲs, turbconv_model))
199195

200196
# TODO - we should make this default when using diagnostic edmf
201197
# environment
@@ -217,9 +213,9 @@ NVTX.@annotate function set_cloud_fraction!(
217213
# weight cloud diagnostics by environmental area
218214
@. cloud_diagnostics_tuple *= NamedTuple{(:cf, :q_liq, :q_ice)}(
219215
tuple(
220-
draft_area(ᶜρa⁰, ᶜρ⁰),
221-
draft_area(ᶜρa⁰, ᶜρ⁰),
222-
draft_area(ᶜρa⁰, ᶜρ⁰),
216+
draft_area(ᶜρa⁰, TD.air_density(thermo_params, ᶜts⁰)),
217+
draft_area(ᶜρa⁰, TD.air_density(thermo_params, ᶜts⁰)),
218+
draft_area(ᶜρa⁰, TD.air_density(thermo_params, ᶜts⁰)),
223219
),
224220
)
225221
# updrafts

src/cache/diagnostic_edmf_precomputed_quantities.jl

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ NVTX.@annotate function set_diagnostic_edmfx_env_quantities_level!(
6161
local_geometry_halflevel,
6262
turbconv_model,
6363
)
64-
@. u³⁰_halflevel = divide_by_ρa(
64+
@. u³⁰_halflevel = specific(
6565
ρ_level * u³_halflevel -
6666
unrolled_dotproduct(ρaʲs_level, u³ʲs_halflevel),
6767
ρ_level,
@@ -93,23 +93,28 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_bottom_bc!(
9393
FT = eltype(Y)
9494
n = n_mass_flux_subdomains(turbconv_model)
9595
(; ᶜΦ) = p.core
96-
(; ᶜp, ᶠu³, ᶜh_tot, ᶜK) = p.precomputed
97-
(; q_tot) = p.precomputed.ᶜspecific
96+
(; ᶜp, ᶠu³, ᶜK) = p.precomputed
9897
(; ustar, obukhov_length, buoyancy_flux, ρ_flux_h_tot, ρ_flux_q_tot) =
9998
p.precomputed.sfc_conditions
10099
(; ᶜρaʲs, ᶠu³ʲs, ᶜKʲs, ᶜmseʲs, ᶜq_totʲs, ᶜtsʲs, ᶜρʲs) = p.precomputed
101100
(; ᶠu³⁰, ᶜK⁰) = p.precomputed
102101

103102
(; params) = p
103+
104104
thermo_params = CAP.thermodynamics_params(params)
105105
turbconv_params = CAP.turbconv_params(params)
106+
ᶜts = p.precomputed.ᶜts #TODO replace
107+
108+
ᶜq_tot = @. lazy(specific(Y.c.ρq_tot, Y.c.ρ))
109+
ᶜe_tot = @. lazy(specific(Y.c.ρe_tot, Y.c.ρ))
110+
ᶜh_tot = @. lazy(TD.total_specific_enthalpy(thermo_params, ᶜts, ᶜe_tot))
106111

107112
ρ_int_level = Fields.field_values(Fields.level(Y.c.ρ, 1))
108113
uₕ_int_level = Fields.field_values(Fields.level(Y.c.uₕ, 1))
109114
u³_int_halflevel = Fields.field_values(Fields.level(ᶠu³, half))
110115
h_tot_int_level = Fields.field_values(Fields.level(ᶜh_tot, 1))
111116
K_int_level = Fields.field_values(Fields.level(ᶜK, 1))
112-
q_tot_int_level = Fields.field_values(Fields.level(q_tot, 1))
117+
q_tot_int_level = Fields.field_values(Fields.level(ᶜq_tot, 1))
113118

114119
p_int_level = Fields.field_values(Fields.level(ᶜp, 1))
115120
Φ_int_level = Fields.field_values(Fields.level(ᶜΦ, 1))
@@ -305,8 +310,7 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_do_integral!(
305310
(; dt) = p
306311
dt = float(dt)
307312
(; ᶜΦ, ᶜgradᵥ_ᶠΦ) = p.core
308-
(; ᶜp, ᶠu³, ᶜts, ᶜh_tot, ᶜK) = p.precomputed
309-
(; q_tot) = p.precomputed.ᶜspecific
313+
(; ᶜp, ᶠu³, ᶜts, ᶜK) = p.precomputed
310314
(;
311315
ᶜρaʲs,
312316
ᶠu³ʲs,
@@ -321,13 +325,13 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_do_integral!(
321325
ᶠnh_pressure³_buoyʲs,
322326
ᶠnh_pressure³_dragʲs,
323327
) = p.precomputed
324-
(; ᶠu³⁰, ᶜK⁰, ᶜtke⁰) = p.precomputed
328+
(; ᶠu³⁰, ᶜK⁰) = p.precomputed
329+
330+
325331

326332
if microphysics_model isa Microphysics1Moment
327-
ᶜq_liqʲs = p.precomputed.ᶜq_liqʲs
328-
ᶜq_iceʲs = p.precomputed.ᶜq_iceʲs
329-
q_rai = p.precomputed.ᶜqᵣ
330-
q_sno = p.precomputed.ᶜqₛ
333+
q_rai = @. lazy(specific(Y.c.ρq_rai, Y.c.ρ))
334+
q_sno = @. lazy(specific(Y.c.ρq_sno, Y.c.ρ))
331335
end
332336

333337
thermo_params = CAP.thermodynamics_params(params)
@@ -347,13 +351,24 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_do_integral!(
347351
Fields.field_values(Fields.level(Fields.coordinate_field(Y.f).z, half))
348352

349353
# integral
354+
ᶜq_tot = @. lazy(specific(Y.c.ρq_tot, Y.c.ρ))
355+
ᶜh_tot = @. lazy(
356+
TD.total_specific_enthalpy(
357+
thermo_params,
358+
ᶜts,
359+
specific(Y.c.ρe_tot, Y.c.ρ),
360+
),
361+
)
362+
363+
ᶜtke⁰ = @. lazy(specific_tke(Y.c.ρ, Y.c.sgs⁰.ρatke, Y.c.ρ, turbconv_model))
364+
350365
for i in 2:Spaces.nlevels(axes(Y.c))
351366
ρ_level = Fields.field_values(Fields.level(Y.c.ρ, i))
352367
uₕ_level = Fields.field_values(Fields.level(Y.c.uₕ, i))
353368
u³_halflevel = Fields.field_values(Fields.level(ᶠu³, i - half))
354369
K_level = Fields.field_values(Fields.level(ᶜK, i))
355370
h_tot_level = Fields.field_values(Fields.level(ᶜh_tot, i))
356-
q_tot_level = Fields.field_values(Fields.level(q_tot, i))
371+
q_tot_level = Fields.field_values(Fields.level(ᶜq_tot, i))
357372
p_level = Fields.field_values(Fields.level(ᶜp, i))
358373
Φ_level = Fields.field_values(Fields.level(ᶜΦ, i))
359374
local_geometry_level = Fields.field_values(
@@ -378,7 +393,7 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_do_integral!(
378393
u³⁰_data_prev_halflevel = u³⁰_prev_halflevel.components.data.:1
379394
K_prev_level = Fields.field_values(Fields.level(ᶜK, i - 1))
380395
h_tot_prev_level = Fields.field_values(Fields.level(ᶜh_tot, i - 1))
381-
q_tot_prev_level = Fields.field_values(Fields.level(q_tot, i - 1))
396+
q_tot_prev_level = Fields.field_values(Fields.level(ᶜq_tot, i - 1))
382397
ts_prev_level = Fields.field_values(Fields.level(ᶜts, i - 1))
383398
p_prev_level = Fields.field_values(Fields.level(ᶜp, i - 1))
384399
z_prev_level = Fields.field_values(Fields.level(ᶜz, i - 1))
@@ -965,15 +980,14 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_env_closures!
965980
(; dt) = p
966981
(; ᶜp, ᶜu, ᶜts) = p.precomputed
967982
(; ustar, obukhov_length) = p.precomputed.sfc_conditions
968-
(; ᶜtke⁰) = p.precomputed
969983
(; ᶜlinear_buoygrad, ᶜstrain_rate_norm) = p.precomputed
970984
(; ρatke_flux) = p.precomputed
971985
turbconv_params = CAP.turbconv_params(params)
972986
thermo_params = CAP.thermodynamics_params(params)
973987
ᶜlg = Fields.local_geometry_field(Y.c)
974988

975989
if p.atmos.turbconv_model isa DiagnosticEDMFX
976-
(; ᶜρaʲs, ᶠu³ʲs, ᶜdetrʲs, ᶠu³⁰, ᶜu⁰) = p.precomputed
990+
(; ᶠu³⁰, ᶜu⁰) = p.precomputed
977991
elseif p.atmos.turbconv_model isa EDOnlyEDMFX
978992
ᶠu³⁰ = p.precomputed.ᶠu³
979993
ᶜu⁰ = ᶜu
@@ -1042,11 +1056,12 @@ NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_env_precipita
10421056
(; ᶜts, ᶜSqₜᵖ⁰) = p.precomputed
10431057

10441058
# Environment precipitation sources (to be applied to grid mean)
1059+
ᶜq_tot = @. lazy(specific(Y.c.ρq_tot, Y.c.ρ))
10451060
@. ᶜSqₜᵖ⁰ = q_tot_0M_precipitation_sources(
10461061
thermo_params,
10471062
microphys_0m_params,
10481063
dt,
1049-
specific(Y.c.ρq_tot, Y.c.ρ),
1064+
ᶜq_tot,
10501065
ᶜts,
10511066
)
10521067
return nothing

src/cache/precipitation_precomputed_quantities.jl

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,11 @@ function set_precipitation_cache!(
253253
::PrognosticEDMFX,
254254
)
255255
(; ᶜΦ) = p.core
256-
(; ᶜSqₜᵖ⁰, ᶜSqₜᵖʲs, ᶜρa⁰) = p.precomputed
256+
(; ᶜSqₜᵖ⁰, ᶜSqₜᵖʲs) = p.precomputed
257257
(; ᶜS_ρq_tot, ᶜS_ρe_tot) = p.precomputed
258258
(; ᶜts⁰, ᶜtsʲs) = p.precomputed
259259
thermo_params = CAP.thermodynamics_params(p.params)
260+
ᶜρa⁰ = @. lazy(ρa⁰(Y.c.ρ, Y.c.sgsʲs, p.atmos.turbconv_model))
260261

261262
n = n_mass_flux_subdomains(p.atmos.turbconv_model)
262263

@@ -283,7 +284,11 @@ function set_precipitation_cache!(Y, p, ::Microphysics1Moment, _)
283284
(; ᶜts, ᶜwᵣ, ᶜwₛ, ᶜu) = p.precomputed
284285
(; ᶜSqₗᵖ, ᶜSqᵢᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ) = p.precomputed
285286

286-
(; q_tot, q_liq, q_ice, q_rai, q_sno) = p.precomputed.ᶜspecific
287+
ᶜq_tot = @. lazy(specific(Y.c.ρq_tot, Y.c.ρ))
288+
ᶜq_rai = @. lazy(specific(Y.c.ρq_rai, Y.c.ρ))
289+
ᶜq_sno = @. lazy(specific(Y.c.ρq_sno, Y.c.ρ))
290+
ᶜq_liq = @. lazy(specific(Y.c.ρq_liq, Y.c.ρ))
291+
ᶜq_ice = @. lazy(specific(Y.c.ρq_ice, Y.c.ρ))
287292

288293
ᶜSᵖ = p.scratch.ᶜtemp_scalar
289294
ᶜSᵖ_snow = p.scratch.ᶜtemp_scalar_2
@@ -303,11 +308,11 @@ function set_precipitation_cache!(Y, p, ::Microphysics1Moment, _)
303308
ᶜSqᵣᵖ,
304309
ᶜSqₛᵖ,
305310
Y.c.ρ,
306-
q_tot,
307-
q_liq,
308-
q_ice,
309-
q_rai,
310-
q_sno,
311+
ᶜq_tot,
312+
ᶜq_liq,
313+
ᶜq_ice,
314+
ᶜq_rai,
315+
ᶜq_sno,
311316
ᶜts,
312317
dt,
313318
cmp,
@@ -320,11 +325,11 @@ function set_precipitation_cache!(Y, p, ::Microphysics1Moment, _)
320325
ᶜSqᵣᵖ,
321326
ᶜSqₛᵖ,
322327
Y.c.ρ,
323-
q_tot,
324-
q_liq,
325-
q_ice,
326-
q_rai,
327-
q_sno,
328+
ᶜq_tot,
329+
ᶜq_liq,
330+
ᶜq_ice,
331+
ᶜq_rai,
332+
ᶜq_sno,
328333
ᶜts,
329334
dt,
330335
cmp,
@@ -469,14 +474,27 @@ function set_precipitation_surface_fluxes!(
469474
sfc_ρ = @. lazy(int_ρ * int_J / sfc_J)
470475

471476
# Constant extrapolation to surface, consistent with simple downwinding
472-
sfc_wᵣ = sfc_lev(ᶜwᵣ)
473-
sfc_wₛ = sfc_lev(ᶜwₛ)
474-
sfc_wₗ = sfc_lev(ᶜwₗ)
475-
sfc_wᵢ = sfc_lev(ᶜwᵢ)
476-
sfc_qᵣ = lazy.(specific.(sfc_lev(Y.c.ρq_rai), sfc_ρ))
477-
sfc_qₛ = lazy.(specific.(sfc_lev(Y.c.ρq_sno), sfc_ρ))
478-
sfc_qₗ = lazy.(specific.(sfc_lev(Y.c.ρq_liq), sfc_ρ))
479-
sfc_qᵢ = lazy.(specific.(sfc_lev(Y.c.ρq_ice), sfc_ρ))
477+
# Temporary scratch variables are used here until CC.field_values supports <lazy> fields
478+
ᶜq_rai = p.scratch.ᶜtemp_scalar
479+
ᶜq_sno = p.scratch.ᶜtemp_scalar_2
480+
ᶜq_liq = p.scratch.ᶜtemp_scalar_3
481+
ᶜq_ice = p.scratch.ᶜtemp_scalar_4
482+
@. ᶜq_rai = specific(Y.c.ρq_rai, Y.c.ρ)
483+
@. ᶜq_sno = specific(Y.c.ρq_sno, Y.c.ρ)
484+
@. ᶜq_liq = specific(Y.c.ρq_liq, Y.c.ρ)
485+
@. ᶜq_ice = specific(Y.c.ρq_ice, Y.c.ρ)
486+
sfc_qᵣ =
487+
Fields.Field(Fields.field_values(Fields.level(ᶜq_rai, 1)), sfc_space)
488+
sfc_qₛ =
489+
Fields.Field(Fields.field_values(Fields.level(ᶜq_sno, 1)), sfc_space)
490+
sfc_qₗ =
491+
Fields.Field(Fields.field_values(Fields.level(ᶜq_liq, 1)), sfc_space)
492+
sfc_qᵢ =
493+
Fields.Field(Fields.field_values(Fields.level(ᶜq_ice, 1)), sfc_space)
494+
sfc_wᵣ = Fields.Field(Fields.field_values(Fields.level(ᶜwᵣ, 1)), sfc_space)
495+
sfc_wₛ = Fields.Field(Fields.field_values(Fields.level(ᶜwₛ, 1)), sfc_space)
496+
sfc_wₗ = Fields.Field(Fields.field_values(Fields.level(ᶜwₗ, 1)), sfc_space)
497+
sfc_wᵢ = Fields.Field(Fields.field_values(Fields.level(ᶜwᵢ, 1)), sfc_space)
480498

481499
@. surface_rain_flux = sfc_ρ * (sfc_qᵣ * (-sfc_wᵣ) + sfc_qₗ * (-sfc_wₗ))
482500
@. surface_snow_flux = sfc_ρ * (sfc_qₛ * (-sfc_wₛ) + sfc_qᵢ * (-sfc_wᵢ))

0 commit comments

Comments
 (0)