Skip to content

Commit 1b666dc

Browse files
committed
add advection, sedimentation and diffusion for 2M; next add a test
1 parent d9e5cee commit 1b666dc

File tree

9 files changed

+115
-126
lines changed

9 files changed

+115
-126
lines changed

src/cache/precipitation_precomputed_quantities.jl

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ function set_precipitation_velocities!(
104104
moisture_model::NonEquilMoistModel,
105105
precip_model::Microphysics2Moment,
106106
)
107-
(; ᶜwₗ, ᶜwᵢ, ᶜwᵣ, ᶜwₛ, ᶜwNₗ, ᶜwNᵢ, ᶜwNᵣ, ᶜwNₛ, ᶜwₜqₜ, ᶜwₕhₜ, ᶜts, ᶜu) = p.precomputed
107+
(; ᶜwₗ, ᶜwᵢ, ᶜwᵣ, ᶜwₛ, ᶜwnₗ, ᶜwnᵢ, ᶜwnᵣ, ᶜwnₛ, ᶜwₜqₜ, ᶜwₕhₜ, ᶜts, ᶜu) = p.precomputed
108108
(; q_liq, q_ice, q_rai, q_sno) = p.precomputed.ᶜspecific
109109
(; ᶜΦ) = p.core
110110

@@ -115,21 +115,21 @@ function set_precipitation_velocities!(
115115

116116
# compute the precipitation terminal velocity [m/s]
117117
# TODO sedimentation of snow is based on the 1M scheme
118-
@. ᶜwNᵣ = getindex(CM2.rain_terminal_velocity(
118+
@. ᶜwnᵣ = getindex(CM2.rain_terminal_velocity(
119119
cm2p.sb,
120120
cm2p.tv,
121121
q_rai,
122122
Y.c.ρ,
123-
Y.c.N_rai,
123+
Y.c.ρn_rai,
124124
), 1)
125125
@. ᶜwᵣ = getindex(CM2.rain_terminal_velocity(
126126
cm2p.sb,
127127
cm2p.tv,
128128
q_rai,
129129
Y.c.ρ,
130-
Y.c.N_rai,
130+
Y.c.ρn_rai,
131131
), 2)
132-
@. ᶜwNₛ = CM1.terminal_velocity(
132+
@. ᶜwnₛ = CM1.terminal_velocity(
133133
cm1p.ps,
134134
cm1p.tv.snow,
135135
Y.c.ρ,
@@ -144,7 +144,7 @@ function set_precipitation_velocities!(
144144
# compute sedimentation velocity for cloud condensate [m/s]
145145
# TODO sedimentation velocities of cloud condensates are based
146146
# on the 1M scheme.
147-
@. ᶜwNₗ = CMNe.terminal_velocity(
147+
@. ᶜwnₗ = CMNe.terminal_velocity(
148148
cm1c.liquid,
149149
cm1c.Ch2022.rain,
150150
Y.c.ρ,
@@ -156,7 +156,7 @@ function set_precipitation_velocities!(
156156
Y.c.ρ,
157157
q_liq,
158158
)
159-
@. ᶜwNᵢ = CMNe.terminal_velocity(
159+
@. ᶜwnᵢ = CMNe.terminal_velocity(
160160
cm1c.ice,
161161
cm1c.Ch2022.small_ice,
162162
Y.c.ρ,
@@ -355,35 +355,34 @@ function set_precipitation_cache!(Y, p, ::Microphysics2Moment, _)
355355
(; dt) = p
356356
(; ᶜts) = p.precomputed
357357
(; ᶜSqₗᵖ, ᶜSqᵢᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ) = p.precomputed
358-
(; ᶜSNₗᵖ, ᶜSNᵢᵖ, ᶜSNᵣᵖ, ᶜSNₛᵖ) = p.precomputed
358+
(; ᶜSnₗᵖ, ᶜSnᵢᵖ, ᶜSnᵣᵖ, ᶜSnₛᵖ) = p.precomputed
359359

360-
(; q_liq, q_rai, q_sno) = p.precomputed.ᶜspecific
360+
(; q_liq, q_rai, n_liq, n_rai) = p.precomputed.ᶜspecific
361361

362362
ᶜSᵖ = p.scratch.ᶜtemp_scalar
363363
ᶜS₂ᵖ = p.scratch.ᶜtemp_scalar_2
364364

365365
# get thermodynamics and microphysics params
366366
(; params) = p
367-
cm1p = CAP.microphysics_1m_params(params)
368-
cm2p = CAP.microphysics_2m_params(params)
367+
cmp = CAP.microphysics_2m_params(params)
369368
thp = CAP.thermodynamics_params(params)
370369

371370
# compute warm precipitation sources on the grid mean (based on SB2006 2M scheme)
372371
compute_warm_precipitation_sources_2M!(
373372
ᶜSᵖ,
374373
ᶜS₂ᵖ,
375-
ᶜSNₗᵖ,
376-
ᶜSNᵣᵖ,
374+
ᶜSnₗᵖ,
375+
ᶜSnᵣᵖ,
377376
ᶜSqₗᵖ,
378377
ᶜSqᵣᵖ,
379378
Y.c.ρ,
380-
Y.c.N_liq,
381-
Y.c.N_rai,
379+
n_liq,
380+
n_rai,
382381
q_liq,
383382
q_rai,
384383
ᶜts,
385384
dt,
386-
cm2p,
385+
cmp,
387386
thp,
388387
)
389388

src/cache/precomputed_quantities.jl

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -126,35 +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), ᶜwNₗ = similar(Y.c, FT), ᶜwNᵢ = 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-
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
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
158158
precipitation_quantities = (;)
159159
end
160160
precipitation_sgs_quantities =

src/initial_conditions/atmos_state.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ precip_variables(ls, ::Microphysics1Moment) = (;
130130
precip_variables(ls, ::Microphysics2Moment) = (;
131131
ρq_rai = ls.ρ * ls.precip_state.q_rai,
132132
ρ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,
133+
ρn_rai = ls.ρ * ls.precip_state.n_rai,
134+
ρn_sno = ls.ρ * ls.precip_state.n_sno,
135+
ρn_liq = ls.ρ * ls.precip_state.n_liq,
136+
ρn_ice = ls.ρ * ls.precip_state.n_ice,
137137
)
138138

139139
# We can use paper-based cases for LES type configurations (no TKE)

src/parameterized_tendencies/microphysics/cloud_condensate.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ function cloud_condensate_tendency!(
4747
)
4848
(; ᶜts) = p.precomputed
4949
(; params, dt) = p
50-
(; q_rai, q_sno) = p.precomputed.ᶜspecific
50+
(; q_rai, q_sno, n_liq, n_ice) = p.precomputed.ᶜspecific
5151
FT = eltype(params)
5252
thp = CAP.thermodynamics_params(params)
5353
cmc = CAP.microphysics_cloud_params(params)
5454

5555
@. Yₜ.c.ρq_liq += Y.c.ρ * cloud_sources(cmc.liquid, thp, ᶜts, q_rai, dt)
5656
@. Yₜ.c.ρq_ice += Y.c.ρ * cloud_sources(cmc.ice, thp, ᶜts, q_sno, dt)
5757

58-
@. Yₜ.c.N_liq += aerosol_activation_sources(cmc.liquid, thp, ᶜts, Y.c.ρ, q_rai, Y.c.N_liq, 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)
58+
@. Yₜ.c.ρn_liq += Y.c.ρ * aerosol_activation_sources(cmc.liquid, thp, ᶜts, q_rai, n_liq, cmc.N_cloud_liquid_droplets, dt)
59+
@. Yₜ.c.ρn_ice += Y.c.ρ * aerosol_activation_sources(cmc.ice, thp, ᶜts, q_sno, n_ice, cmc.N_cloud_liquid_droplets, dt)
6060
end

src/parameterized_tendencies/microphysics/microphysics_wrappers.jl

Lines changed: 41 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ function ml_N_cloud_liquid_droplets(cmc, c_dust, c_seasalt, c_SO4, q_liq)
6262
end
6363

6464
"""
65-
cloud_mass_sources(cm_params, thp, ts, dt)
65+
cloud_sources(cm_params, thp, ts, dt)
6666
6767
- cm_params - CloudMicrophysics parameters struct for cloud water or ice condensate
6868
- thp - Thermodynamics parameters struct
@@ -336,10 +336,9 @@ end
336336
- cm_params - CloudMicrophysics parameters struct for cloud water or ice condensate
337337
- thp - Thermodynamics parameters struct
338338
- ts - thermodynamics state
339-
- ρ - air density
340339
- qₚ - precipitation (rain or snow) specific humidity
341-
- N_dp - droplets (liquid or ice) number concentration
342-
_ N_dp_prescribed - droplets (liquid or ice) prescribed number concentration
340+
- n_dp - number concentration droplets (liquid or ice) per mass
341+
_ n_dp_prescribed - prescribed number concentration of droplets (liquid or ice) per mass
343342
- dt - model time step
344343
345344
Returns the activation rate. #TODO This function temporarily computes activation rate
@@ -349,30 +348,29 @@ function aerosol_activation_sources(
349348
cm_params::Union{CMP.CloudLiquid{FT}, CMP.CloudIce{FT}},
350349
thp,
351350
ts,
352-
ρ,
353351
qₚ,
354-
N_dp,
355-
N_dp_prescribed,
352+
n_dp,
353+
n_dp_prescribed,
356354
dt,
357355
) where {FT}
358356
r_dp = FT(2e-6) # 2 μm
359-
m_dp = 4 / 3 * π * r_dp^3
360-
S = ρ * cloud_sources(cm_params, thp, ts, qₚ, dt) / m_dp
357+
m_dp = 4 / 3 * π * r_dp^3 * 1000 # ρ_water = 1000 kg/m^3
358+
Sn = cloud_sources(cm_params, thp, ts, qₚ, dt) / m_dp
361359

362360
return ifelse(
363-
S > FT(0),
364-
triangle_inequality_limiter(S, limit((N_dp_prescribed - N_dp), dt, 2)),
365-
-triangle_inequality_limiter(abs(S), limit(N_dp, dt, 2)),
361+
Sn > FT(0),
362+
triangle_inequality_limiter(Sn, limit((n_dp_prescribed - n_dp), dt, 2)),
363+
-triangle_inequality_limiter(abs(Sn), limit(n_dp, dt, 2)),
366364
)
367365
end
368366

369367
"""
370-
compute_warm_precipitation_sources_2M!(Sᵖ, S₂ᵖ, SNₗᵖ, SNᵣᵖ, Sqₗᵖ, Sqᵣᵖ, ρ, Nₗ, Nᵣ, qₗ, qᵣ, dt, sb, thp)
368+
compute_warm_precipitation_sources_2M!(Sᵖ, S₂ᵖ, Snₗᵖ, Snᵣᵖ, Sqₗᵖ, Sqᵣᵖ, ρ, nₗ, nᵣ, qₗ, qᵣ, dt, sb, thp)
371369
372370
- Sᵖ, S₂ᵖ - temporary containters to help compute precipitation source terms
373-
- SNₗᵖ, SNᵣᵖ, Sqₗᵖ, Sqᵣᵖ - cached storage for precipitation source terms
371+
- Snₗᵖ, Snᵣᵖ, Sqₗᵖ, Sqᵣᵖ - cached storage for precipitation source terms
374372
- ρ - air density
375-
- Nₗ, Nᵣ - cloud liquid and rain number concentration
373+
- nₗ, nᵣ - cloud liquid and rain number concentration per mass
376374
- qₗ, qᵣ - cloud liquid and rain specific humidity
377375
- ts - thermodynamic state (see td package for details)
378376
- dt - model time step
@@ -384,13 +382,13 @@ Seifert and Beheng (2006) scheme.
384382
function compute_warm_precipitation_sources_2M!(
385383
Sᵖ,
386384
S₂ᵖ,
387-
SNₗᵖ,
388-
SNᵣᵖ,
385+
Snₗᵖ,
386+
Snᵣᵖ,
389387
Sqₗᵖ,
390388
Sqᵣᵖ,
391389
ρ,
392-
Nₗ,
393-
Nᵣ,
390+
nₗ,
391+
nᵣ,
394392
qₗ,
395393
qᵣ,
396394
ts,
@@ -400,71 +398,71 @@ function compute_warm_precipitation_sources_2M!(
400398
)
401399

402400
FT = eltype(thp)
403-
@. SNₗᵖ = ρ * FT(0)
404-
@. SNᵣᵖ = ρ * FT(0)
401+
@. Snₗᵖ = ρ * FT(0)
402+
@. Snᵣᵖ = ρ * FT(0)
405403
@. Sqₗᵖ = ρ * FT(0)
406404
@. Sqᵣᵖ = ρ * FT(0)
407405

408406
# auto-conversion (mass)
409407
@. Sᵖ = triangle_inequality_limiter(
410-
CM2.autoconversion(mp.sb.acnv, mp.sb.pdf_c, qₗ, qᵣ, ρ, Nₗ).dq_rai_dt,
408+
CM2.autoconversion(mp.sb.acnv, mp.sb.pdf_c, qₗ, qᵣ, ρ, ρ * nₗ).dq_rai_dt,
411409
limit(qₗ, dt, 5),
412410
)
413411
@. Sqₗᵖ -= Sᵖ
414412
@. Sqᵣᵖ += Sᵖ
415413

416414
# auto-conversion (number) and liquid self-collection
417415
@. Sᵖ = triangle_inequality_limiter(
418-
CM2.autoconversion(mp.sb.acnv, mp.sb.pdf_c, qₗ, qᵣ, ρ, Nₗ).dN_liq_dt,
419-
limit(Nₗ, dt, 10),
416+
CM2.autoconversion(mp.sb.acnv, mp.sb.pdf_c, qₗ, qᵣ, ρ, ρ * nₗ).dN_liq_dt / ρ,
417+
limit(nₗ, dt, 10),
420418
)
421419
@. S₂ᵖ = -triangle_inequality_limiter(
422-
-CM2.liquid_self_collection(mp.sb.acnv, mp.sb.pdf_c, qₗ, ρ, Sᵖ),
423-
limit(Nₗ, dt, 5)
420+
-CM2.liquid_self_collection(mp.sb.acnv, mp.sb.pdf_c, qₗ, ρ, Sᵖ) / ρ,
421+
limit(nₗ / ρ, dt, 5)
424422
)
425-
@. SNₗᵖ += Sᵖ
426-
@. SNₗᵖ += S₂ᵖ
427-
@. SNᵣᵖ -= 0.5*Sᵖ
423+
@. Snₗᵖ += Sᵖ
424+
@. Snₗᵖ += S₂ᵖ
425+
@. Snᵣᵖ -= 0.5*Sᵖ
428426

429427
# rain self-collection and breakup
430428
@. Sᵖ = -triangle_inequality_limiter(
431-
-CM2.rain_self_collection(mp.sb.pdf_r, mp.sb.self, qᵣ, ρ, Nᵣ),
432-
limit(Nᵣ, dt, 5),
429+
-CM2.rain_self_collection(mp.sb.pdf_r, mp.sb.self, qᵣ, ρ, ρ * nᵣ) / ρ,
430+
limit(nᵣ, dt, 5),
433431
)
434432
@. S₂ᵖ = triangle_inequality_limiter(
435-
CM2.rain_breakup(mp.sb.pdf_r, mp.sb.brek, qᵣ, ρ, Nᵣ, Sᵖ),
436-
limit(Nᵣ, dt, 5),
433+
CM2.rain_breakup(mp.sb.pdf_r, mp.sb.brek, qᵣ, ρ, ρ * nᵣ, Sᵖ) / ρ,
434+
limit(nᵣ, dt, 5),
437435
)
438-
@. SNᵣᵖ += Sᵖ
439-
@. SNᵣᵖ += S₂ᵖ
436+
@. Snᵣᵖ += Sᵖ
437+
@. Snᵣᵖ += S₂ᵖ
440438

441439
# accretion (mass)
442440
@. Sᵖ = triangle_inequality_limiter(
443-
CM2.accretion(mp.sb, qₗ, qᵣ, ρ, Nₗ).dq_rai_dt,
441+
CM2.accretion(mp.sb, qₗ, qᵣ, ρ, ρ * nₗ).dq_rai_dt,
444442
limit(qₗ, dt, 5),
445443
)
446444
@. Sqₗᵖ -= Sᵖ
447445
@. Sqᵣᵖ += Sᵖ
448446

449447
# accretion (number)
450448
@. Sᵖ = -triangle_inequality_limiter(
451-
-CM2.accretion(mp.sb, qₗ, qᵣ, ρ, Nₗ).dN_liq_dt,
452-
limit(Nₗ, dt, 5),
449+
-CM2.accretion(mp.sb, qₗ, qᵣ, ρ, ρ * nₗ).dN_liq_dt / ρ,
450+
limit(nₗ, dt, 5),
453451
)
454-
@. SNₗᵖ += Sᵖ
452+
@. Snₗᵖ += Sᵖ
455453

456454
# evaporation (mass)
457455
@. Sᵖ = -triangle_inequality_limiter(
458-
-CM2.rain_evaporation(mp.sb, mp.aps, thp, PP(thp, ts), qᵣ, ρ, Nᵣ, Tₐ(thp, ts)).evap_rate_1,
456+
-CM2.rain_evaporation(mp.sb, mp.aps, thp, PP(thp, ts), qᵣ, ρ, ρ * nᵣ, Tₐ(thp, ts)).evap_rate_1,
459457
limit(qᵣ, dt, 5),
460458
)
461459
@. Sqᵣᵖ += Sᵖ
462460

463461
# evaporation (number)
464462
@. Sᵖ = -triangle_inequality_limiter(
465-
-CM2.rain_evaporation(mp.sb, mp.aps, thp, PP(thp, ts), qᵣ, ρ, Nᵣ, Tₐ(thp, ts)).evap_rate_0,
466-
limit(Nᵣ, dt, 5),
463+
-CM2.rain_evaporation(mp.sb, mp.aps, thp, PP(thp, ts), qᵣ, ρ, ρ * nᵣ, Tₐ(thp, ts)).evap_rate_0 / ρ,
464+
limit(nᵣ, dt, 5),
467465
)
468-
@. SNᵣᵖ += Sᵖ
466+
@. Snᵣᵖ += Sᵖ
469467

470468
end

0 commit comments

Comments
 (0)