Skip to content

Commit 6974fc5

Browse files
committed
Add 1M cloud condensate and precip sedimentation in prognostic EDMF
1 parent 5557f30 commit 6974fc5

File tree

10 files changed

+248
-46
lines changed

10 files changed

+248
-46
lines changed

.buildkite/Manifest-v1.11.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,9 +381,9 @@ weakdeps = ["CUDA", "MPI"]
381381

382382
[[deps.ClimaCore]]
383383
deps = ["Adapt", "BandedMatrices", "BlockArrays", "ClimaComms", "CubedSphere", "DataStructures", "ForwardDiff", "GaussQuadrature", "GilbertCurves", "HDF5", "InteractiveUtils", "IntervalSets", "KrylovKit", "LazyBroadcast", "LinearAlgebra", "MultiBroadcastFusion", "NVTX", "PkgVersion", "RecursiveArrayTools", "RootSolvers", "SparseArrays", "StaticArrays", "Statistics", "UnrolledUtilities"]
384-
git-tree-sha1 = "14d3d5810ce1e3c990450a2ce7abc6a1e162855f"
384+
git-tree-sha1 = "a273452127dbb052f2963e3c1095730a996d49a6"
385385
uuid = "d414da3d-4745-48bb-8d80-42e94e092884"
386-
version = "0.14.35"
386+
version = "0.14.36"
387387
weakdeps = ["CUDA", "Krylov"]
388388

389389
[deps.ClimaCore.extensions]

.buildkite/pipeline.yml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ steps:
8383
--config_file $CONFIG_PATH/single_column_precipitation_test.yml
8484
--job_id single_column_precipitation_test
8585
artifact_paths: "single_column_precipitation_test/output_active/*"
86-
86+
8787
- label: ":umbrella: 2-moment precipitation sanity test single column"
8888
command: >
8989
julia --color=yes --project=.buildkite .buildkite/ci_driver.jl
@@ -854,6 +854,15 @@ steps:
854854
agents:
855855
slurm_mem: 20GB
856856

857+
- label: ":genie: Prognostic EDMFX Dycoms RF02 in a column"
858+
command: >
859+
julia --color=yes --project=.buildkite .buildkite/ci_driver.jl
860+
--config_file $CONFIG_PATH/prognostic_edmfx_dycoms_rf02_column.yml
861+
--job_id prognostic_edmfx_dycoms_rf02_column
862+
artifact_paths: "prognostic_edmfx_dycoms_rf02_column/output_active/*"
863+
agents:
864+
slurm_mem: 20GB
865+
857866
- label: ":umbrella: Prognostic EDMFX Rico in a column"
858867
command: >
859868
julia --color=yes --project=.buildkite .buildkite/ci_driver.jl
@@ -1035,9 +1044,9 @@ steps:
10351044
agents:
10361045
slurm_gpus: 1
10371046
slurm_mem: 16GB
1038-
1047+
10391048
- label: ":earth_americas: GPU: Diagnostic EDMFX ERA5 Weather Model Initial Condition"
1040-
command: >
1049+
command: >
10411050
julia --color=yes --project=.buildkite .buildkite/ci_driver.jl
10421051
--config_file $CONFIG_PATH/diagnostic_edmfx_era5_initial_condition.yml
10431052
--job_id diagnostic_edmfx_era5_initial_condition

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ ArgParse = "1"
4343
Artifacts = "1"
4444
AtmosphericProfilesLibrary = "0.1.7"
4545
ClimaComms = "0.6.8"
46-
ClimaCore = "0.14.35"
46+
ClimaCore = "0.14.36"
4747
ClimaDiagnostics = "0.2.12"
4848
ClimaInterpolations = "0.1.0"
4949
ClimaParams = "0.10.35"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
initial_condition: DYCOMS_RF02
2+
subsidence: DYCOMS
3+
scm_coriolis: DYCOMS_RF02
4+
rad: DYCOMS
5+
surface_setup: DYCOMS_RF02
6+
turbconv: "prognostic_edmfx"
7+
implicit_diffusion: false
8+
approximate_linear_solve_iters: 2
9+
edmfx_upwinding: first_order
10+
edmfx_entr_model: "Generalized"
11+
edmfx_detr_model: "Generalized"
12+
edmfx_sgs_mass_flux: true
13+
edmfx_sgs_diffusive_flux: true
14+
edmfx_nh_pressure: true
15+
edmfx_filter: true
16+
prognostic_tke: true
17+
moist: "nonequil"
18+
cloud_model: "quadrature_sgs"
19+
precip_model: "1M"
20+
call_cloud_diagnostics_per_stage: true
21+
config: "column"
22+
x_elem: 2
23+
y_elem: 2
24+
z_elem: 30
25+
z_max: 1500
26+
z_stretch: false
27+
perturb_initstate: false
28+
dt: 10secs
29+
t_end: 6hours
30+
dt_save_state_to_disk: 10mins
31+
toml: [toml/prognostic_edmfx_1M.toml]
32+
netcdf_interpolation_num_points: [8, 8, 30]
33+
diagnostics:
34+
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl, pr]
35+
period: 10mins
36+
- short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, husraup, hussnup]
37+
period: 10mins
38+
- short_name: [waen, taen, thetaaen, haen, husen, huren, clwen, clien, husraen, hussnen, tke]
39+
period: 10mins
40+
- short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
41+
period: 10mins
42+
- short_name: [husra, hussn]
43+
period: 10mins

post_processing/ci_plots.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,6 +1400,7 @@ EDMFBoxPlots = Union{
14001400
EDMFBoxPlotsWithPrecip = Union{
14011401
Val{:prognostic_edmfx_rico_column},
14021402
Val{:prognostic_edmfx_trmm_column},
1403+
Val{:prognostic_edmfx_dycoms_rf02_column},
14031404
}
14041405
"""
14051406
plot_edmf_vert_profile!(grid_loc, var_group)

src/cache/precomputed_quantities.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,12 @@ function precomputed_quantities(Y, atmos)
165165
ᶜSqᵢᵖʲs = similar(Y.c, NTuple{n, FT}),
166166
ᶜSqᵣᵖʲs = similar(Y.c, NTuple{n, FT}),
167167
ᶜSqₛᵖʲs = similar(Y.c, NTuple{n, FT}),
168+
ᶜwₗʲs = similar(Y.c, NTuple{n, FT}),
169+
ᶜwᵢʲs = similar(Y.c, NTuple{n, FT}),
170+
ᶜwᵣʲs = similar(Y.c, NTuple{n, FT}),
171+
ᶜwₛʲs = similar(Y.c, NTuple{n, FT}),
172+
ᶜwₜʲs = similar(Y.c, NTuple{n, FT}),
173+
ᶜwₕʲs = similar(Y.c, NTuple{n, FT}),
168174
ᶜSqₗᵖ⁰ = similar(Y.c, FT),
169175
ᶜSqᵢᵖ⁰ = similar(Y.c, FT),
170176
ᶜSqᵣᵖ⁰ = similar(Y.c, FT),

src/cache/prognostic_edmf_precomputed_quantities.jl

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,13 +608,65 @@ NVTX.@annotate function set_prognostic_edmf_precomputed_quantities_precipitation
608608
(; ᶜSqₗᵖ⁰, ᶜSqᵢᵖ⁰, ᶜSqᵣᵖ⁰, ᶜSqₛᵖ⁰, ᶜρ⁰, ᶜts⁰) = p.precomputed
609609
(; ᶜq_tot⁰, ᶜq_liq⁰, ᶜq_ice⁰, ᶜq_rai⁰, ᶜq_sno⁰) = p.precomputed
610610

611+
(; ᶜwₗʲs, ᶜwᵢʲs, ᶜwᵣʲs, ᶜwₛʲs, ᶜwₜʲs, ᶜwₕʲs) = p.precomputed
612+
611613
# TODO - can I re-use them between js and env?
612614
ᶜSᵖ = p.scratch.ᶜtemp_scalar
613615
ᶜSᵖ_snow = p.scratch.ᶜtemp_scalar_2
614616

615617
n = n_mass_flux_subdomains(p.atmos.turbconv_model)
618+
FT = eltype(params)
616619

617620
for j in 1:n
621+
622+
# compute terminal velocity for precipitation
623+
@. ᶜwᵣʲs.:($$j) = CM1.terminal_velocity(
624+
cmp.pr,
625+
cmp.tv.rain,
626+
ᶜρʲs.:($$j),
627+
max(zero(Y.c.ρ), Y.c.sgsʲs.:($$j).q_rai),
628+
)
629+
@. ᶜwₛʲs.:($$j) = CM1.terminal_velocity(
630+
cmp.ps,
631+
cmp.tv.snow,
632+
ᶜρʲs.:($$j),
633+
max(zero(Y.c.ρ), Y.c.sgsʲs.:($$j).q_sno),
634+
)
635+
# compute sedimentation velocity for cloud condensate [m/s]
636+
@. ᶜwₗʲs.:($$j) = CMNe.terminal_velocity(
637+
cmc.liquid,
638+
cmc.Ch2022.rain,
639+
ᶜρʲs.:($$j),
640+
max(zero(Y.c.ρ), Y.c.sgsʲs.:($$j).q_liq),
641+
)
642+
@. ᶜwᵢʲs.:($$j) = CMNe.terminal_velocity(
643+
cmc.ice,
644+
cmc.Ch2022.small_ice,
645+
ᶜρʲs.:($$j),
646+
max(zero(Y.c.ρ), Y.c.sgsʲs.:($$j).q_ice),
647+
)
648+
# compute their contirbutions to energy and total water advection
649+
@. ᶜwₜʲs.:($$j) = ifelse(
650+
Y.c.sgsʲs.:($$j).ρa * Y.c.sgsʲs.:($$j).q_tot > FT(0),
651+
(
652+
ᶜwₗʲs.:($$j) * Y.c.sgsʲs.:($$j).q_liq +
653+
ᶜwᵢʲs.:($$j) * Y.c.sgsʲs.:($$j).q_ice +
654+
ᶜwᵣʲs.:($$j) * Y.c.sgsʲs.:($$j).q_rai +
655+
ᶜwₛʲs.:($$j) * Y.c.sgsʲs.:($$j).q_sno
656+
) / Y.c.sgsʲs.:($$j).ρa / Y.c.sgsʲs.:($$j).q_tot,
657+
FT(0)
658+
)
659+
@. ᶜwₕʲs.:($$j) = ifelse(
660+
Y.c.sgsʲs.:($$j).ρa * abs(Y.c.sgsʲs.:($$j).mse) > FT(0),
661+
(
662+
ᶜwₗʲs.:($$j) * Y.c.sgsʲs.:($$j).q_liq * (Iₗ(thp, ᶜtsʲs.:($$j)) + ᶜΦ) +
663+
ᶜwᵢʲs.:($$j) * Y.c.sgsʲs.:($$j).q_ice * (Iᵢ(thp, ᶜtsʲs.:($$j)) + ᶜΦ) +
664+
ᶜwᵣʲs.:($$j) * Y.c.sgsʲs.:($$j).q_rai * (Iₗ(thp, ᶜtsʲs.:($$j)) + ᶜΦ) +
665+
ᶜwₛʲs.:($$j) * Y.c.sgsʲs.:($$j).q_sno * (Iᵢ(thp, ᶜtsʲs.:($$j)) + ᶜΦ)
666+
) / Y.c.sgsʲs.:($$j).ρa / abs(Y.c.sgsʲs.:($$j).mse),
667+
FT(0)
668+
)
669+
618670
# Precipitation sources and sinks from the updrafts
619671
compute_precipitation_sources!(
620672
ᶜSᵖ,

src/prognostic_equations/advection.jl

Lines changed: 116 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import ClimaCore.Geometry as Geometry
1010
horizontal_dynamics_tendency!(Yₜ, Y, p, t)
1111
1212
Computes tendencies due to horizontal advection for prognostic variables of the
13-
grid mean and EDMFX subdomains, and also applies horizontal pressure gradient and
13+
grid mean and EDMFX subdomains, and also applies horizontal pressure gradient and
1414
gravitational acceleration terms for horizontal momentum.
1515
1616
Specifically, this function calculates:
@@ -339,6 +339,7 @@ function edmfx_sgs_vertical_advection_tendency!(
339339
end
340340

341341
for j in 1:n
342+
# Flux form vertical advection of area farction with the grid mean velocity
342343
@. ᶜa_scalar = draft_area(Y.c.sgsʲs.:($$j).ρa, ᶜρʲs.:($$j))
343344
vtt = vertical_transport(
344345
ᶜρʲs.:($j),
@@ -349,48 +350,138 @@ function edmfx_sgs_vertical_advection_tendency!(
349350
)
350351
@. Yₜ.c.sgsʲs.:($$j).ρa += vtt
351352

353+
# Advective form advection of mse and q_tot with the grid mean velocity
352354
va = vertical_advection(
353355
ᶠu³ʲs.:($j),
354356
Y.c.sgsʲs.:($j).mse,
355357
edmfx_upwinding,
356358
)
357359
@. Yₜ.c.sgsʲs.:($$j).mse += va
358-
359360
va = vertical_advection(
360361
ᶠu³ʲs.:($j),
361362
Y.c.sgsʲs.:($j).q_tot,
362363
edmfx_upwinding,
363364
)
364365
@. Yₜ.c.sgsʲs.:($$j).q_tot += va
366+
365367
if p.atmos.moisture_model isa NonEquilMoistModel &&
366368
p.atmos.microphysics_model isa Microphysics1Moment
367-
# TODO - add precipitation terminal velocity
368-
# TODO - add cloud sedimentation velocity
369-
# TODO - add their contributions to mean energy and mass
370-
va = vertical_advection(
371-
ᶠu³ʲs.:($j),
372-
Y.c.sgsʲs.:($j).q_liq,
373-
edmfx_upwinding,
374-
)
369+
# TODO - add precipitation terminal velocity in implicit solver/tendency with if/else
370+
# TODO - add cloud sedimentation velocity in implicit solver/tendency with if/else
371+
372+
(; ᶜwₗʲs, ᶜwᵢʲs, ᶜwᵣʲs, ᶜwₛʲs, ᶜwₜʲs, ᶜwₕʲs) = p.precomputed
373+
374+
# Advective form advection of moisture tracers with the grid mean velocity
375+
va = vertical_advection(ᶠu³ʲs.:($j), Y.c.sgsʲs.:($j).q_liq, edmfx_upwinding)
375376
@. Yₜ.c.sgsʲs.:($$j).q_liq += va
376-
va = vertical_advection(
377-
ᶠu³ʲs.:($j),
378-
Y.c.sgsʲs.:($j).q_ice,
379-
edmfx_upwinding,
380-
)
377+
va = vertical_advection(ᶠu³ʲs.:($j), Y.c.sgsʲs.:($j).q_ice, edmfx_upwinding)
381378
@. Yₜ.c.sgsʲs.:($$j).q_ice += va
382-
va = vertical_advection(
383-
ᶠu³ʲs.:($j),
384-
Y.c.sgsʲs.:($j).q_rai,
385-
edmfx_upwinding,
386-
)
379+
va = vertical_advection(ᶠu³ʲs.:($j), Y.c.sgsʲs.:($j).q_rai, edmfx_upwinding)
387380
@. Yₜ.c.sgsʲs.:($$j).q_rai += va
388-
va = vertical_advection(
389-
ᶠu³ʲs.:($j),
390-
Y.c.sgsʲs.:($j).q_sno,
391-
edmfx_upwinding,
392-
)
381+
va = vertical_advection(ᶠu³ʲs.:($j), Y.c.sgsʲs.:($j).q_sno, edmfx_upwinding)
393382
@. Yₜ.c.sgsʲs.:($$j).q_sno += va
383+
384+
FT = eltype(params)
385+
(; ᶜwₗʲs, ᶜwᵢʲs, ᶜwᵣʲs, ᶜwₛʲs, ᶜtsʲs) = p.precomputed
386+
387+
ᶠwₗ³ʲs = (@. lazy( CT3(ᶠinterp(Geometry.WVector(-1 * ᶜwₗʲs.:($$j))))))
388+
ᶠwᵢ³ʲs = (@. lazy( CT3(ᶠinterp(Geometry.WVector(-1 * ᶜwᵢʲs.:($$j))))))
389+
ᶠwᵣ³ʲs = (@. lazy( CT3(ᶠinterp(Geometry.WVector(-1 * ᶜwᵣʲs.:($$j))))))
390+
ᶠwₛ³ʲs = (@. lazy( CT3(ᶠinterp(Geometry.WVector(-1 * ᶜwₛʲs.:($$j))))))
391+
392+
ᶜa = (@. lazy(draft_area(Y.c.sgsʲs.:($$j).ρa, ᶜρʲs.:($$j))))
393+
394+
# Flux form vertical advection of rho * area with sedimentation contributions
395+
vtt = vertical_transport(ᶜρʲs.:($j), ᶠwₗ³ʲs, (@. lazy(ᶜa * Y.c.sgsʲs.:($$j).q_liq)), dt, edmfx_upwinding)
396+
@. Yₜ.c.sgsʲs.:($$j).ρa += vtt
397+
vtt = vertical_transport(ᶜρʲs.:($j), ᶠwᵢ³ʲs, (@. lazy(ᶜa * Y.c.sgsʲs.:($$j).q_ice)), dt, edmfx_upwinding)
398+
@. Yₜ.c.sgsʲs.:($$j).ρa += vtt
399+
vtt = vertical_transport(ᶜρʲs.:($j), ᶠwᵣ³ʲs, (@. lazy(ᶜa * Y.c.sgsʲs.:($$j).q_rai)), dt, edmfx_upwinding)
400+
@. Yₜ.c.sgsʲs.:($$j).ρa += vtt
401+
vtt = vertical_transport(ᶜρʲs.:($j), ᶠwₛ³ʲs, (@. lazy(ᶜa * Y.c.sgsʲs.:($$j).q_sno)), dt, edmfx_upwinding)
402+
@. Yₜ.c.sgsʲs.:($$j).ρa += vtt
403+
404+
# q_tot and moisture tracers advective form advection with sedimentation velocity
405+
va = vertical_advection(ᶠwₗ³ʲs, Y.c.sgsʲs.:($j).q_liq, edmfx_upwinding)
406+
@. Yₜ.c.sgsʲs.:($$j).q_tot += (1 - Y.c.sgsʲs.:($$j).q_tot) * va
407+
@. Yₜ.c.sgsʲs.:($$j).q_liq += va
408+
va = vertical_advection(ᶠwᵢ³ʲs, Y.c.sgsʲs.:($j).q_ice, edmfx_upwinding)
409+
@. Yₜ.c.sgsʲs.:($$j).q_tot += (1 - Y.c.sgsʲs.:($$j).q_tot) * va
410+
@. Yₜ.c.sgsʲs.:($$j).q_ice += va
411+
va = vertical_advection(ᶠwᵣ³ʲs, Y.c.sgsʲs.:($j).q_rai, edmfx_upwinding)
412+
@. Yₜ.c.sgsʲs.:($$j).q_tot += (1 - Y.c.sgsʲs.:($$j).q_tot) * va
413+
@. Yₜ.c.sgsʲs.:($$j).q_rai += va
414+
va = vertical_advection(ᶠwₛ³ʲs, Y.c.sgsʲs.:($j).q_sno, edmfx_upwinding)
415+
@. Yₜ.c.sgsʲs.:($$j).q_tot += (1 - Y.c.sgsʲs.:($$j).q_tot) * va
416+
@. Yₜ.c.sgsʲs.:($$j).q_sno += va
417+
418+
# mse advective form advection with sedimentation velocity
419+
(; ᶜΦ) = p.core
420+
thp = CAP.thermodynamics_params(params)
421+
ᶜmseₗ = (@. lazy(Y.c.sgsʲs.:($$j).q_liq * (TD.internal_energy_liquid(thp, ᶜtsʲs.:($$j)) + TD.gas_constant_air(thp, ᶜtsʲs.:($$j)) * TD.air_temperature(thp, ᶜtsʲs.:($$j)) + ᶜΦ)))
422+
ᶜmseᵢ = (@. lazy(Y.c.sgsʲs.:($$j).q_ice * (TD.internal_energy_ice(thp, ᶜtsʲs.:($$j)) + TD.gas_constant_air(thp, ᶜtsʲs.:($$j)) * TD.air_temperature(thp, ᶜtsʲs.:($$j)) + ᶜΦ)))
423+
ᶜmseᵣ = (@. lazy(Y.c.sgsʲs.:($$j).q_rai * (TD.internal_energy_liquid(thp, ᶜtsʲs.:($$j)) + TD.gas_constant_air(thp, ᶜtsʲs.:($$j)) * TD.air_temperature(thp, ᶜtsʲs.:($$j)) + ᶜΦ)))
424+
ᶜmseₛ = (@. lazy(Y.c.sgsʲs.:($$j).q_sno * (TD.internal_energy_ice(thp, ᶜtsʲs.:($$j)) + TD.gas_constant_air(thp, ᶜtsʲs.:($$j)) * TD.air_temperature(thp, ᶜtsʲs.:($$j)) + ᶜΦ)))
425+
426+
# RICO works well but we are missing mse * q_ advection term
427+
va = vertical_advection(ᶠwₗ³ʲs, ᶜmseₗ, edmfx_upwinding)
428+
@. Yₜ.c.sgsʲs.:($$j).mse += va
429+
va = vertical_advection(ᶠwᵢ³ʲs, ᶜmseᵢ, edmfx_upwinding)
430+
@. Yₜ.c.sgsʲs.:($$j).mse += va
431+
va = vertical_advection(ᶠwᵣ³ʲs, ᶜmseᵣ, edmfx_upwinding)
432+
@. Yₜ.c.sgsʲs.:($$j).mse += va
433+
va = vertical_advection(ᶠwₛ³ʲs, ᶜmseₛ, edmfx_upwinding)
434+
@. Yₜ.c.sgsʲs.:($$j).mse += va
435+
#=
436+
va = vertical_advection(ᶠwₗ³ʲs, Y.c.sgsʲs.:($j).q_liq, edmfx_upwinding)
437+
@. Yₜ.c.sgsʲs.:($$j).mse -= Y.c.sgsʲs.:($$j).mse * va
438+
va = vertical_advection(ᶠwᵢ³ʲs, Y.c.sgsʲs.:($j).q_ice, edmfx_upwinding)
439+
@. Yₜ.c.sgsʲs.:($$j).mse -= Y.c.sgsʲs.:($$j).mse * va
440+
va = vertical_advection(ᶠwᵣ³ʲs, Y.c.sgsʲs.:($j).q_rai, edmfx_upwinding)
441+
@. Yₜ.c.sgsʲs.:($$j).mse -= Y.c.sgsʲs.:($$j).mse * va
442+
va = vertical_advection(ᶠwₛ³ʲs, Y.c.sgsʲs.:($j).q_sno, edmfx_upwinding)
443+
@. Yₜ.c.sgsʲs.:($$j).mse -= Y.c.sgsʲs.:($$j).mse * va
444+
=#
445+
446+
# mse, q_tot and moisture tracers terms proportional to 1/ρ̂ ∂zρ̂
447+
ᶜinv_ρ̂ = (@. lazy(divide_by_ρa(FT(1), Y.c.sgsʲs.:($$j).ρa, FT(0), Y.c.ρ, turbconv_model)))
448+
ᶜ∂ρ̂∂zₗ = (@. lazy(upwind_biased_grad(-1 * Geometry.WVector(ᶜwₗʲs.:($$j)), Y.c.sgsʲs.:($$j).ρa)))
449+
ᶜ∂ρ̂∂zᵢ = (@. lazy(upwind_biased_grad(-1 * Geometry.WVector(ᶜwᵢʲs.:($$j)), Y.c.sgsʲs.:($$j).ρa)))
450+
ᶜ∂ρ̂∂zᵣ = (@. lazy(upwind_biased_grad(-1 * Geometry.WVector(ᶜwᵣʲs.:($$j)), Y.c.sgsʲs.:($$j).ρa)))
451+
ᶜ∂ρ̂∂zₛ = (@. lazy(upwind_biased_grad(-1 * Geometry.WVector(ᶜwₛʲs.:($$j)), Y.c.sgsʲs.:($$j).ρa)))
452+
453+
@. Yₜ.c.sgsʲs.:($$j).q_tot -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zₗ, CT3(Geometry.WVector(-1 * ᶜwₗʲs.:($$j)))) * Y.c.sgsʲs.:($$j).q_liq * (1 - Y.c.sgsʲs.:($$j).q_tot)
454+
@. Yₜ.c.sgsʲs.:($$j).q_liq -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zₗ, CT3(Geometry.WVector(-1 * ᶜwₗʲs.:($$j)))) * Y.c.sgsʲs.:($$j).q_liq
455+
@. Yₜ.c.sgsʲs.:($$j).mse -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zₗ, CT3(Geometry.WVector(-1 * ᶜwₗʲs.:($$j)))) * (Y.c.sgsʲs.:($$j).q_liq * Y.c.sgsʲs.:($$j).mse - ᶜmseₗ)
456+
457+
@. Yₜ.c.sgsʲs.:($$j).q_tot -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zᵢ, CT3(Geometry.WVector(-1 * ᶜwᵢʲs.:($$j)))) * Y.c.sgsʲs.:($$j).q_ice * (1 - Y.c.sgsʲs.:($$j).q_tot)
458+
@. Yₜ.c.sgsʲs.:($$j).q_ice -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zᵢ, CT3(Geometry.WVector(-1 * ᶜwᵢʲs.:($$j)))) * Y.c.sgsʲs.:($$j).q_ice
459+
@. Yₜ.c.sgsʲs.:($$j).mse -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zᵢ, CT3(Geometry.WVector(-1 * ᶜwᵢʲs.:($$j)))) * (Y.c.sgsʲs.:($$j).q_ice * Y.c.sgsʲs.:($$j).mse - ᶜmseᵢ)
460+
461+
@. Yₜ.c.sgsʲs.:($$j).q_tot -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zᵣ, CT3(Geometry.WVector(-1 * ᶜwᵣʲs.:($$j)))) * Y.c.sgsʲs.:($$j).q_rai * (1 - Y.c.sgsʲs.:($$j).q_tot)
462+
@. Yₜ.c.sgsʲs.:($$j).q_rai -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zᵣ, CT3(Geometry.WVector(-1 * ᶜwᵣʲs.:($$j)))) * Y.c.sgsʲs.:($$j).q_rai
463+
@. Yₜ.c.sgsʲs.:($$j).mse -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zᵣ, CT3(Geometry.WVector(-1 * ᶜwᵣʲs.:($$j)))) * (Y.c.sgsʲs.:($$j).q_rai * Y.c.sgsʲs.:($$j).mse - ᶜmseᵣ)
464+
465+
@. Yₜ.c.sgsʲs.:($$j).q_tot -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zₛ, CT3(Geometry.WVector(-1 * ᶜwₛʲs.:($$j)))) * Y.c.sgsʲs.:($$j).q_sno * (1 - Y.c.sgsʲs.:($$j).q_tot)
466+
@. Yₜ.c.sgsʲs.:($$j).q_sno -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zₛ, CT3(Geometry.WVector(-1 * ᶜwₛʲs.:($$j)))) * Y.c.sgsʲs.:($$j).q_sno
467+
@. Yₜ.c.sgsʲs.:($$j).mse -= dot(ᶜinv_ρ̂ * ᶜ∂ρ̂∂zₛ, CT3(Geometry.WVector(-1 * ᶜwₛʲs.:($$j)))) * (Y.c.sgsʲs.:($$j).q_sno * Y.c.sgsʲs.:($$j).mse - ᶜmseₛ)
468+
469+
# mse, q_tot and moisture tracer terms proportional to velocity gradients
470+
@. Yₜ.c.sgsʲs.:($$j).q_tot -= ᶜdivᵥ(ᶠwₗ³ʲs) * Y.c.sgsʲs.:($$j).q_liq * (1 - Y.c.sgsʲs.:($$j).q_tot)
471+
@. Yₜ.c.sgsʲs.:($$j).q_liq -= ᶜdivᵥ(ᶠwₗ³ʲs) * Y.c.sgsʲs.:($$j).q_liq
472+
@. Yₜ.c.sgsʲs.:($$j).mse -= ᶜdivᵥ(ᶠwₗ³ʲs) * (Y.c.sgsʲs.:($$j).q_liq * Y.c.sgsʲs.:($$j).mse - ᶜmseₗ)
473+
474+
@. Yₜ.c.sgsʲs.:($$j).q_tot -= ᶜdivᵥ(ᶠwᵢ³ʲs) * Y.c.sgsʲs.:($$j).q_ice * (1 - Y.c.sgsʲs.:($$j).q_tot)
475+
@. Yₜ.c.sgsʲs.:($$j).q_ice -= ᶜdivᵥ(ᶠwᵢ³ʲs) * Y.c.sgsʲs.:($$j).q_ice
476+
@. Yₜ.c.sgsʲs.:($$j).mse -= ᶜdivᵥ(ᶠwᵢ³ʲs) * (Y.c.sgsʲs.:($$j).q_ice * Y.c.sgsʲs.:($$j).mse - ᶜmseᵢ)
477+
478+
@. Yₜ.c.sgsʲs.:($$j).q_tot -= ᶜdivᵥ(ᶠwᵣ³ʲs) * Y.c.sgsʲs.:($$j).q_rai * (1 - Y.c.sgsʲs.:($$j).q_tot)
479+
@. Yₜ.c.sgsʲs.:($$j).q_rai -= ᶜdivᵥ(ᶠwᵣ³ʲs) * Y.c.sgsʲs.:($$j).q_rai
480+
@. Yₜ.c.sgsʲs.:($$j).mse -= ᶜdivᵥ(ᶠwᵣ³ʲs) * (Y.c.sgsʲs.:($$j).q_rai * Y.c.sgsʲs.:($$j).mse - ᶜmseᵣ)
481+
482+
@. Yₜ.c.sgsʲs.:($$j).q_tot -= ᶜdivᵥ(ᶠwₛ³ʲs) * Y.c.sgsʲs.:($$j).q_sno * (1 - Y.c.sgsʲs.:($$j).q_tot)
483+
@. Yₜ.c.sgsʲs.:($$j).q_sno -= ᶜdivᵥ(ᶠwₛ³ʲs) * Y.c.sgsʲs.:($$j).q_sno
484+
@. Yₜ.c.sgsʲs.:($$j).mse -= ᶜdivᵥ(ᶠwₛ³ʲs) * (Y.c.sgsʲs.:($$j).q_sno * Y.c.sgsʲs.:($$j).mse - ᶜmseₛ)
394485
end
395486
end
396487
end

0 commit comments

Comments
 (0)