Skip to content

Commit cc50357

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

File tree

8 files changed

+193
-43
lines changed

8 files changed

+193
-43
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]

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"

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

src/prognostic_equations/implicit/implicit_tendency.jl

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,32 +70,32 @@ end
7070
# expressions are less convoluted?
7171

7272
function vertical_transport(ᶜρ, ᶠu³, ᶜχ, dt, ::Val{:none})
73-
ᶜJ = Fields.local_geometry_field(ᶜρ).J
74-
ᶠJ = Fields.local_geometry_field(ᶠu³).J
73+
ᶜJ = Fields.local_geometry_field(axes(ᶜρ)).J
74+
ᶠJ = Fields.local_geometry_field(axes(ᶠu³)).J
7575
return @. lazy(-(ᶜadvdivᵥ(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ * ᶠu³ * ᶠinterp(ᶜχ))))
7676
end
7777
function vertical_transport(ᶜρ, ᶠu³, ᶜχ, dt, ::Val{:first_order})
78-
ᶜJ = Fields.local_geometry_field(ᶜρ).J
79-
ᶠJ = Fields.local_geometry_field(ᶠu³).J
78+
ᶜJ = Fields.local_geometry_field(axes(ᶜρ)).J
79+
ᶠJ = Fields.local_geometry_field(axes(ᶠu³)).J
8080
return @. lazy(-(ᶜadvdivᵥ(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ * ᶠupwind1(ᶠu³, ᶜχ))))
8181
end
8282
@static if pkgversion(ClimaCore) v"0.14.22"
8383
function vertical_transport(ᶜρ, ᶠu³, ᶜχ, dt, ::Val{:vanleer_limiter})
84-
ᶜJ = Fields.local_geometry_field(ᶜρ).J
85-
ᶠJ = Fields.local_geometry_field(ᶠu³).J
84+
ᶜJ = Fields.local_geometry_field(axes(ᶜρ)).J
85+
ᶠJ = Fields.local_geometry_field(axes(ᶠu³)).J
8686
return @. lazy(
8787
-(ᶜadvdivᵥ(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ * ᶠlin_vanleer(ᶠu³, ᶜχ, dt))),
8888
)
8989
end
9090
end
9191
function vertical_transport(ᶜρ, ᶠu³, ᶜχ, dt, ::Val{:third_order})
92-
ᶜJ = Fields.local_geometry_field(ᶜρ).J
93-
ᶠJ = Fields.local_geometry_field(ᶠu³).J
92+
ᶜJ = Fields.local_geometry_field(axes(ᶜρ)).J
93+
ᶠJ = Fields.local_geometry_field(axes(ᶠu³)).J
9494
return @. lazy(-(ᶜadvdivᵥ(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ * ᶠupwind3(ᶠu³, ᶜχ))))
9595
end
9696
function vertical_transport(ᶜρ, ᶠu³, ᶜχ, dt, ::Val{:boris_book})
97-
ᶜJ = Fields.local_geometry_field(ᶜρ).J
98-
ᶠJ = Fields.local_geometry_field(ᶠu³).J
97+
ᶜJ = Fields.local_geometry_field(axes(ᶜρ)).J
98+
ᶠJ = Fields.local_geometry_field(axes(ᶠu³)).J
9999
return @. lazy(
100100
-(ᶜadvdivᵥ(
101101
ᶠinterp(ᶜρ * ᶜJ) / ᶠJ * (
@@ -109,8 +109,8 @@ function vertical_transport(ᶜρ, ᶠu³, ᶜχ, dt, ::Val{:boris_book})
109109
)
110110
end
111111
function vertical_transport(ᶜρ, ᶠu³, ᶜχ, dt, ::Val{:zalesak})
112-
ᶜJ = Fields.local_geometry_field(ᶜρ).J
113-
ᶠJ = Fields.local_geometry_field(ᶠu³).J
112+
ᶜJ = Fields.local_geometry_field(axes(ᶜρ)).J
113+
ᶠJ = Fields.local_geometry_field(axes(ᶠu³)).J
114114
return @. lazy(
115115
-(ᶜadvdivᵥ(
116116
ᶠinterp(ᶜρ * ᶜJ) / ᶠJ * (
@@ -137,8 +137,8 @@ function implicit_vertical_advection_tendency!(Yₜ, Y, p, t)
137137
p.atmos
138138
(; dt) = p
139139
n = n_mass_flux_subdomains(turbconv_model)
140-
ᶜJ = Fields.local_geometry_field(Y.c).J
141-
ᶠJ = Fields.local_geometry_field(Y.f).J
140+
ᶜJ = Fields.local_geometry_field(axes(Y.c)).J
141+
ᶠJ = Fields.local_geometry_field(axes(Y.f)).J
142142
(; ᶠgradᵥ_ᶜΦ) = p.core
143143
(; ᶜh_tot, ᶠu³, ᶜp) = p.precomputed
144144

0 commit comments

Comments
 (0)