@@ -10,7 +10,7 @@ import ClimaCore.Geometry as Geometry
10
10
horizontal_dynamics_tendency!(Yₜ, Y, p, t)
11
11
12
12
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
14
14
gravitational acceleration terms for horizontal momentum.
15
15
16
16
Specifically, this function calculates:
@@ -339,6 +339,7 @@ function edmfx_sgs_vertical_advection_tendency!(
339
339
end
340
340
341
341
for j in 1 : n
342
+ # Flux form vertical advection of area farction with the grid mean velocity
342
343
@. ᶜa_scalar = draft_area (Y. c. sgsʲs.:($$ j). ρa, ᶜρʲs.:($$ j))
343
344
vtt = vertical_transport (
344
345
ᶜρʲs.:($ j),
@@ -349,48 +350,138 @@ function edmfx_sgs_vertical_advection_tendency!(
349
350
)
350
351
@. Yₜ. c. sgsʲs.:($$ j). ρa += vtt
351
352
353
+ # Advective form advection of mse and q_tot with the grid mean velocity
352
354
va = vertical_advection (
353
355
ᶠu³ʲs.:($ j),
354
356
Y. c. sgsʲs.:($ j). mse,
355
357
edmfx_upwinding,
356
358
)
357
359
@. Yₜ. c. sgsʲs.:($$ j). mse += va
358
-
359
360
va = vertical_advection (
360
361
ᶠu³ʲs.:($ j),
361
362
Y. c. sgsʲs.:($ j). q_tot,
362
363
edmfx_upwinding,
363
364
)
364
365
@. Yₜ. c. sgsʲs.:($$ j). q_tot += va
366
+
365
367
if p. atmos. moisture_model isa NonEquilMoistModel &&
366
368
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)
375
376
@. 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)
381
378
@. 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)
387
380
@. 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)
393
382
@. 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ₛ)
394
485
end
395
486
end
396
487
end
0 commit comments