Skip to content

Commit 15b65bd

Browse files
committed
Microphysics2M added as an option; next advection and sedimentation
1 parent 756dcf6 commit 15b65bd

File tree

14 files changed

+471
-19
lines changed

14 files changed

+471
-19
lines changed

src/cache/precipitation_precomputed_quantities.jl

Lines changed: 148 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import CloudMicrophysics.MicrophysicsNonEq as CMNe
66
import CloudMicrophysics.Microphysics1M as CM1
7+
import CloudMicrophysics.Microphysics2M as CM2
78

89
import Thermodynamics as TD
910
import ClimaCore.Operators as Operators
@@ -97,6 +98,94 @@ function set_precipitation_velocities!(
9798
) / Y.c.ρ
9899
return nothing
99100
end
101+
function set_precipitation_velocities!(
102+
Y,
103+
p,
104+
moisture_model::NonEquilMoistModel,
105+
precip_model::Microphysics2Moment,
106+
)
107+
(; ᶜwₗ, ᶜwᵢ, ᶜwᵣ, ᶜwₛ, ᶜwNₗ, ᶜwNᵢ, ᶜwNᵣ, ᶜwNₛ, ᶜwₜqₜ, ᶜwₕhₜ, ᶜts, ᶜu) = p.precomputed
108+
(; q_liq, q_ice, q_rai, q_sno) = p.precomputed.ᶜspecific
109+
(; ᶜΦ) = p.core
110+
111+
cm1c = CAP.microphysics_cloud_params(p.params)
112+
cm1p = CAP.microphysics_1m_params(p.params)
113+
cm2p = CAP.microphysics_2m_params(p.params)
114+
thp = CAP.thermodynamics_params(p.params)
115+
116+
# compute the precipitation terminal velocity [m/s]
117+
# TODO sedimentation of snow is based on the 1M scheme
118+
@. ᶜwNᵣ = getindex(CM2.rain_terminal_velocity(
119+
cm2p.sb,
120+
cm2p.tv,
121+
q_rai,
122+
Y.c.ρ,
123+
Y.c.N_rai,
124+
), 1)
125+
@. ᶜwᵣ = getindex(CM2.rain_terminal_velocity(
126+
cm2p.sb,
127+
cm2p.tv,
128+
q_rai,
129+
Y.c.ρ,
130+
Y.c.N_rai,
131+
), 2)
132+
@. ᶜwNₛ = CM1.terminal_velocity(
133+
cm1p.ps,
134+
cm1p.tv.snow,
135+
Y.c.ρ,
136+
q_sno,
137+
)
138+
@. ᶜwₛ = CM1.terminal_velocity(
139+
cm1p.ps,
140+
cm1p.tv.snow,
141+
Y.c.ρ,
142+
q_sno,
143+
)
144+
# compute sedimentation velocity for cloud condensate [m/s]
145+
# TODO sedimentation velocities of cloud condensates are based
146+
# on the 1M scheme.
147+
@. ᶜwNₗ = CMNe.terminal_velocity(
148+
cm1c.liquid,
149+
cm1c.Ch2022.rain,
150+
Y.c.ρ,
151+
q_liq,
152+
)
153+
@. ᶜwₗ = CMNe.terminal_velocity(
154+
cm1c.liquid,
155+
cm1c.Ch2022.rain,
156+
Y.c.ρ,
157+
q_liq,
158+
)
159+
@. ᶜwNᵢ = CMNe.terminal_velocity(
160+
cm1c.ice,
161+
cm1c.Ch2022.small_ice,
162+
Y.c.ρ,
163+
q_ice,
164+
)
165+
@. ᶜwᵢ = CMNe.terminal_velocity(
166+
cm1c.ice,
167+
cm1c.Ch2022.small_ice,
168+
Y.c.ρ,
169+
q_ice,
170+
)
171+
172+
# compute their contributions to energy and total water advection
173+
@. ᶜwₜqₜ =
174+
Geometry.WVector(
175+
ᶜwₗ * Y.c.ρq_liq +
176+
ᶜwᵢ * Y.c.ρq_ice +
177+
ᶜwᵣ * Y.c.ρq_rai +
178+
ᶜwₛ * Y.c.ρq_sno,
179+
) / Y.c.ρ
180+
@. ᶜwₕhₜ =
181+
Geometry.WVector(
182+
ᶜwₗ * Y.c.ρq_liq * (Iₗ(thp, ᶜts) + ᶜΦ + $(Kin(ᶜwₗ, ᶜu))) +
183+
ᶜwᵢ * Y.c.ρq_ice * (Iᵢ(thp, ᶜts) + ᶜΦ + $(Kin(ᶜwᵢ, ᶜu))) +
184+
ᶜwᵣ * Y.c.ρq_rai * (Iₗ(thp, ᶜts) + ᶜΦ + $(Kin(ᶜwᵣ, ᶜu))) +
185+
ᶜwₛ * Y.c.ρq_sno * (Iᵢ(thp, ᶜts) + ᶜΦ + $(Kin(ᶜwₛ, ᶜu))),
186+
) / Y.c.ρ
187+
return nothing
188+
end
100189

101190
"""
102191
set_precipitation_cache!(Y, p, precip_model, turbconv_model)
@@ -262,6 +351,64 @@ function set_precipitation_cache!(
262351
# in edmf sub-domains.
263352
return nothing
264353
end
354+
function set_precipitation_cache!(Y, p, ::Microphysics2Moment, _)
355+
(; dt) = p
356+
(; ᶜts) = p.precomputed
357+
(; ᶜSqₗᵖ, ᶜSqᵢᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ) = p.precomputed
358+
(; ᶜSNₗᵖ, ᶜSNᵢᵖ, ᶜSNᵣᵖ, ᶜSNₛᵖ) = p.precomputed
359+
360+
(; q_liq, q_rai, q_sno) = p.precomputed.ᶜspecific
361+
362+
ᶜSᵖ = p.scratch.ᶜtemp_scalar
363+
ᶜS₂ᵖ = p.scratch.ᶜtemp_scalar_2
364+
365+
# get thermodynamics and microphysics params
366+
(; params) = p
367+
cm1p = CAP.microphysics_1m_params(params)
368+
cm2p = CAP.microphysics_2m_params(params)
369+
thp = CAP.thermodynamics_params(params)
370+
371+
# compute warm precipitation sources on the grid mean (based on SB2006 2M scheme)
372+
compute_warm_precipitation_sources_2M!(
373+
ᶜSᵖ,
374+
ᶜS₂ᵖ,
375+
ᶜSNₗᵖ,
376+
ᶜSNᵣᵖ,
377+
ᶜSqₗᵖ,
378+
ᶜSqᵣᵖ,
379+
Y.c.ρ,
380+
Y.c.N_liq,
381+
Y.c.N_rai,
382+
q_liq,
383+
q_rai,
384+
ᶜts,
385+
dt,
386+
cm2p,
387+
thp,
388+
)
389+
390+
#TODO - implement 2M cold processes!
391+
392+
return nothing
393+
end
394+
function set_precipitation_cache!(
395+
Y,
396+
p,
397+
::Microphysics2Moment,
398+
::DiagnosticEDMFX,
399+
)
400+
error("Not implemented yet")
401+
return nothing
402+
end
403+
function set_precipitation_cache!(
404+
Y,
405+
p,
406+
::Microphysics2Moment,
407+
::PrognosticEDMFX,
408+
)
409+
error("Not implemented yet")
410+
return nothing
411+
end
265412

266413
"""
267414
set_precipitation_surface_fluxes!(Y, p, precipitation model)
@@ -301,7 +448,7 @@ end
301448
function set_precipitation_surface_fluxes!(
302449
Y,
303450
p,
304-
precip_model::Microphysics1Moment,
451+
precip_model::Union{Microphysics1Moment, Microphysics2Moment},
305452
)
306453
(; surface_rain_flux, surface_snow_flux) = p.precomputed
307454
(; col_integrated_precip_energy_tendency,) = p.conservation_check

src/cache/precomputed_quantities.jl

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -126,20 +126,35 @@ function precomputed_quantities(Y, atmos)
126126
)
127127
sedimentation_quantities =
128128
atmos.moisture_model isa NonEquilMoistModel ?
129-
(; ᶜwₗ = similar(Y.c, FT), ᶜwᵢ = similar(Y.c, FT)) : (;)
129+
(; ᶜwₗ = similar(Y.c, FT), ᶜwᵢ = similar(Y.c, FT), ᶜwNₗ = similar(Y.c, FT), ᶜwNᵢ = similar(Y.c, FT)) : (;)
130130
if atmos.precip_model isa Microphysics0Moment
131131
precipitation_quantities =
132132
(; ᶜS_ρq_tot = similar(Y.c, FT), ᶜS_ρe_tot = similar(Y.c, FT))
133-
elseif atmos.precip_model isa Microphysics1Moment
134-
precipitation_quantities = (;
135-
ᶜwᵣ = similar(Y.c, FT),
136-
ᶜwₛ = similar(Y.c, FT),
137-
ᶜSqₗᵖ = similar(Y.c, FT),
138-
ᶜSqᵢᵖ = similar(Y.c, FT),
139-
ᶜSqᵣᵖ = similar(Y.c, FT),
140-
ᶜSqₛᵖ = similar(Y.c, FT),
141-
)
142-
else
133+
elseif atmos.precip_model isa Microphysics1Moment
134+
precipitation_quantities = (;
135+
ᶜwᵣ = similar(Y.c, FT),
136+
ᶜwₛ = similar(Y.c, FT),
137+
ᶜSqₗᵖ = similar(Y.c, FT),
138+
ᶜSqᵢᵖ = similar(Y.c, FT),
139+
ᶜSqᵣᵖ = similar(Y.c, FT),
140+
ᶜSqₛᵖ = similar(Y.c, FT),
141+
)
142+
elseif atmos.precip_model isa Microphysics2Moment
143+
precipitation_quantities = (;
144+
ᶜwᵣ = similar(Y.c, FT),
145+
ᶜwₛ = similar(Y.c, FT),
146+
ᶜSqₗᵖ = similar(Y.c, FT),
147+
ᶜSqᵢᵖ = similar(Y.c, FT),
148+
ᶜSqᵣᵖ = similar(Y.c, FT),
149+
ᶜSqₛᵖ = similar(Y.c, FT),
150+
ᶜwNᵣ = similar(Y.c, FT),
151+
ᶜwNₛ = similar(Y.c, FT),
152+
ᶜSNₗᵖ = similar(Y.c, FT),
153+
ᶜSNᵢᵖ = similar(Y.c, FT),
154+
ᶜSNᵣᵖ = similar(Y.c, FT),
155+
ᶜSNₛᵖ = similar(Y.c, FT),
156+
)
157+
else
143158
precipitation_quantities = (;)
144159
end
145160
precipitation_sgs_quantities =

src/diagnostics/Diagnostics.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import ..NonEquilMoistModel
3131
import ..NoPrecipitation
3232
import ..Microphysics0Moment
3333
import ..Microphysics1Moment
34+
import ..Microphysics2Moment
3435

3536
# radiation
3637
import ClimaAtmos.RRTMGPInterface as RRTMGPI

src/diagnostics/core_diagnostics.jl

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,7 @@ function compute_pr!(
707707
NoPrecipitation,
708708
Microphysics0Moment,
709709
Microphysics1Moment,
710+
Microphysics2Moment,
710711
},
711712
)
712713
if isnothing(out)
@@ -742,6 +743,7 @@ function compute_prra!(
742743
NoPrecipitation,
743744
Microphysics0Moment,
744745
Microphysics1Moment,
746+
Microphysics2Moment,
745747
},
746748
)
747749
if isnothing(out)
@@ -774,6 +776,7 @@ function compute_prsn!(
774776
NoPrecipitation,
775777
Microphysics0Moment,
776778
Microphysics1Moment,
779+
Microphysics2Moment,
777780
},
778781
)
779782
if isnothing(out)
@@ -805,7 +808,10 @@ function compute_husra!(
805808
state,
806809
cache,
807810
time,
808-
precip_model::Microphysics1Moment,
811+
precip_model::Union{
812+
Microphysics1Moment,
813+
Microphysics2Moment,
814+
},
809815
)
810816
if isnothing(out)
811817
return state.c.ρq_rai ./ state.c.ρ
@@ -836,7 +842,10 @@ function compute_hussn!(
836842
state,
837843
cache,
838844
time,
839-
precip_model::Microphysics1Moment,
845+
precip_model::Union{
846+
Microphysics1Moment,
847+
Microphysics2Moment,
848+
},
840849
)
841850
if isnothing(out)
842851
return state.c.ρq_sno ./ state.c.ρ

src/initial_conditions/InitialConditions.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import ..NonEquilMoistModel
77
import ..NoPrecipitation
88
import ..Microphysics0Moment
99
import ..Microphysics1Moment
10+
import ..Microphysics2Moment
1011
import ..PrescribedSurfaceTemperature
1112
import ..PrognosticSurfaceTemperature
1213
import ..ᶜinterp

src/initial_conditions/atmos_state.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ precip_variables(ls, ::Microphysics1Moment) = (;
127127
ρq_rai = ls.ρ * ls.precip_state.q_rai,
128128
ρq_sno = ls.ρ * ls.precip_state.q_sno,
129129
)
130+
precip_variables(ls, ::Microphysics2Moment) = (;
131+
ρq_rai = ls.ρ * ls.precip_state.q_rai,
132+
ρq_sno = ls.ρ * ls.precip_state.q_sno,
133+
N_rai = ls.precip_state.N_rai,
134+
N_sno = ls.precip_state.N_sno,
135+
N_liq = ls.precip_state.N_liq,
136+
N_ice = ls.precip_state.N_ice,
137+
)
130138

131139
# We can use paper-based cases for LES type configurations (no TKE)
132140
# or SGS type configurations (initial TKE needed), so we do not need to assert

src/parameterized_tendencies/microphysics/cloud_condensate.jl

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ function cloud_condensate_tendency!(
1616
::Union{NoPrecipitation, Microphysics0Moment},
1717
)
1818
error(
19-
"NonEquilMoistModel can only be run with Microphysics1Moment precipitation",
19+
"NonEquilMoistModel can only be run with Microphysics1Moment or Microphysics2Moment precipitation",
2020
)
2121
end
2222

@@ -37,3 +37,24 @@ function cloud_condensate_tendency!(
3737
@. Yₜ.c.ρq_liq += Y.c.ρ * cloud_sources(cmc.liquid, thp, ᶜts, q_rai, dt)
3838
@. Yₜ.c.ρq_ice += Y.c.ρ * cloud_sources(cmc.ice, thp, ᶜts, q_sno, dt)
3939
end
40+
41+
function cloud_condensate_tendency!(
42+
Yₜ,
43+
Y,
44+
p,
45+
::NonEquilMoistModel,
46+
::Microphysics2Moment,
47+
)
48+
(; ᶜts) = p.precomputed
49+
(; params, dt) = p
50+
(; q_rai, q_sno) = p.precomputed.ᶜspecific
51+
FT = eltype(params)
52+
thp = CAP.thermodynamics_params(params)
53+
cmc = CAP.microphysics_cloud_params(params)
54+
55+
@. Yₜ.c.ρq_liq += Y.c.ρ * cloud_sources(cmc.liquid, thp, ᶜts, q_rai, dt)
56+
@. Yₜ.c.ρq_ice += Y.c.ρ * cloud_sources(cmc.ice, thp, ᶜts, q_sno, dt)
57+
58+
@. Yₜ.c.N_liq += aerosol_activation_sources(cmc.liquid, thp, ᶜts, Y.c.ρ, q_rai, Y.c.N_ice, cmc.N_cloud_liquid_droplets, dt)
59+
@. Yₜ.c.N_ice += aerosol_activation_sources(cmc.ice, thp, ᶜts, Y.c.ρ, q_sno, Y.c.N_ice, cmc.N_cloud_liquid_droplets, dt)
60+
end

0 commit comments

Comments
 (0)