@@ -6,6 +6,8 @@ using LinearAlgebra: ×, dot
6
6
import ClimaCore. Fields as Fields
7
7
import ClimaCore. Geometry as Geometry
8
8
9
+ import PrettyTables as PRT
10
+
9
11
NVTX. @annotate function horizontal_advection_tendency! (Yₜ, Y, p, t)
10
12
n = n_mass_flux_subdomains (p. atmos. turbconv_model)
11
13
(; ᶜΦ) = p. core
@@ -230,58 +232,111 @@ function edmfx_sgs_vertical_advection_tendency!(
230
232
end
231
233
232
234
for j in 1 : n
235
+ # Flux form vertical advection of area farction with the grid mean velocity
233
236
@. ᶜa_scalar = draft_area (Y. c. sgsʲs.:($$ j). ρa, ᶜρʲs.:($$ j))
234
- vtt = vertical_transport (
235
- ᶜρʲs.:($ j),
236
- ᶠu³ʲs.:($ j),
237
- ᶜa_scalar,
238
- dt,
239
- edmfx_upwinding,
240
- )
237
+ vtt = vertical_transport (ᶜρʲs.:($ j), ᶠu³ʲs.:($ j), ᶜa_scalar, dt, edmfx_upwinding)
241
238
@. Yₜ. c. sgsʲs.:($$ j). ρa += vtt
242
239
243
- va = vertical_advection (
244
- ᶠu³ʲs.:($ j),
245
- Y. c. sgsʲs.:($ j). mse,
246
- edmfx_upwinding,
247
- )
240
+ # Advective form advection of mse and q_tot with the grid mean velocity
241
+ va = vertical_advection (ᶠu³ʲs.:($ j), Y. c. sgsʲs.:($ j). mse, edmfx_upwinding)
248
242
@. Yₜ. c. sgsʲs.:($$ j). mse += va
249
-
250
- va = vertical_advection (
251
- ᶠu³ʲs.:($ j),
252
- Y. c. sgsʲs.:($ j). q_tot,
253
- edmfx_upwinding,
254
- )
243
+ va = vertical_advection (ᶠu³ʲs.:($ j), Y. c. sgsʲs.:($ j). q_tot, edmfx_upwinding)
255
244
@. Yₜ. c. sgsʲs.:($$ j). q_tot += va
245
+
256
246
if p. atmos. moisture_model isa NonEquilMoistModel &&
257
247
p. atmos. precip_model isa Microphysics1Moment
258
- # TODO - add precipitation terminal velocity
259
- # TODO - add cloud sedimentation velocity
260
- # TODO - add their contributions to mean energy and mass
261
- va = vertical_advection (
262
- ᶠu³ʲs.:($ j),
263
- Y. c. sgsʲs.:($ j). q_liq,
264
- edmfx_upwinding,
265
- )
248
+ # TODO - add precipitation terminal velocity in implicit solver/tendency with if/else
249
+ # TODO - add cloud sedimentation velocity in implicit solver/tendency with if/else
250
+
251
+ # Advective form advection of moisture tracers with the grid mean velocity
252
+ va = vertical_advection (ᶠu³ʲs.:($ j), Y. c. sgsʲs.:($ j). q_liq, edmfx_upwinding)
266
253
@. Yₜ. c. sgsʲs.:($$ j). q_liq += va
267
- va = vertical_advection (
268
- ᶠu³ʲs.:($ j),
269
- Y. c. sgsʲs.:($ j). q_ice,
270
- edmfx_upwinding,
271
- )
254
+ va = vertical_advection (ᶠu³ʲs.:($ j), Y. c. sgsʲs.:($ j). q_ice, edmfx_upwinding)
272
255
@. Yₜ. c. sgsʲs.:($$ j). q_ice += va
273
- va = vertical_advection (
274
- ᶠu³ʲs.:($ j),
275
- Y. c. sgsʲs.:($ j). q_rai,
276
- edmfx_upwinding,
277
- )
256
+ va = vertical_advection (ᶠu³ʲs.:($ j), Y. c. sgsʲs.:($ j). q_rai, edmfx_upwinding)
278
257
@. Yₜ. c. sgsʲs.:($$ j). q_rai += va
279
- va = vertical_advection (
280
- ᶠu³ʲs.:($ j),
281
- Y. c. sgsʲs.:($ j). q_sno,
282
- edmfx_upwinding,
283
- )
258
+ va = vertical_advection (ᶠu³ʲs.:($ j), Y. c. sgsʲs.:($ j). q_sno, edmfx_upwinding)
284
259
@. Yₜ. c. sgsʲs.:($$ j). q_sno += va
285
- end
260
+
261
+ FT = eltype (params)
262
+ (; ᶜwₗʲs, ᶜwᵢʲs, ᶜwᵣʲs, ᶜwₛʲs, ᶜtsʲs) = p. precomputed
263
+
264
+ ᶜinv_ρ̂_∂ρ̂∂z = (@. lazy (divide_by_ρa (FT (1 ), Y. c. sgsʲs.:($$ j). ρa, FT (0 ), Y. c. ρ, turbconv_model) * ᶜgradᵥ (ᶠinterp (Y. c. sgsʲs.:($$ j). ρa))))
265
+ ᶠwₗ³ʲs = (@. lazy ( CT3 (ᶠinterp (Geometry. WVector (- 1 * ᶜwₗʲs.:($$ j))))))
266
+ ᶠwᵢ³ʲs = (@. lazy ( CT3 (ᶠinterp (Geometry. WVector (- 1 * ᶜwᵢʲs.:($$ j))))))
267
+ ᶠwᵣ³ʲs = (@. lazy ( CT3 (ᶠinterp (Geometry. WVector (- 1 * ᶜwᵣʲs.:($$ j))))))
268
+ ᶠwₛ³ʲs = (@. lazy ( CT3 (ᶠinterp (Geometry. WVector (- 1 * ᶜwₛʲs.:($$ j))))))
269
+
270
+ ᶜa = (@. lazy (draft_area (Y. c. sgsʲs.:($$ j). ρa, ᶜρʲs.:($$ j))))
271
+
272
+ # Flux form vertical advection of rho * area with sedimantation contributions
273
+ vtt = vertical_transport (ᶜρʲs.:($ j), ᶠwₗ³ʲs, (@. lazy (ᶜa * Y. c. sgsʲs.:($$ j). q_liq)), dt, edmfx_upwinding)
274
+ @. Yₜ. c. sgsʲs.:($$ j). ρa += vtt
275
+ vtt = vertical_transport (ᶜρʲs.:($ j), ᶠwᵢ³ʲs, (@. lazy (ᶜa * Y. c. sgsʲs.:($$ j). q_ice)), dt, edmfx_upwinding)
276
+ @. Yₜ. c. sgsʲs.:($$ j). ρa += vtt
277
+ vtt = vertical_transport (ᶜρʲs.:($ j), ᶠwᵣ³ʲs, (@. lazy (ᶜa * Y. c. sgsʲs.:($$ j). q_rai)), dt, edmfx_upwinding)
278
+ @. Yₜ. c. sgsʲs.:($$ j). ρa += vtt
279
+ vtt = vertical_transport (ᶜρʲs.:($ j), ᶠwₛ³ʲs, (@. lazy (ᶜa * Y. c. sgsʲs.:($$ j). q_sno)), dt, edmfx_upwinding)
280
+ @. Yₜ. c. sgsʲs.:($$ j). ρa += vtt
281
+
282
+ # q_tot and moisture tracers advective form advection with sedimentation velocity
283
+ va = vertical_advection (ᶠwₗ³ʲs, Y. c. sgsʲs.:($ j). q_liq, edmfx_upwinding)
284
+ @. Yₜ. c. sgsʲs.:($$ j). q_tot += (1 - Y. c. sgsʲs.:($$ j). q_tot) * va
285
+ @. Yₜ. c. sgsʲs.:($$ j). q_liq += va
286
+ va = vertical_advection (ᶠwᵢ³ʲs, Y. c. sgsʲs.:($ j). q_ice, edmfx_upwinding)
287
+ @. Yₜ. c. sgsʲs.:($$ j). q_tot += (1 - Y. c. sgsʲs.:($$ j). q_tot) * va
288
+ @. Yₜ. c. sgsʲs.:($$ j). q_ice += va
289
+ va = vertical_advection (ᶠwᵣ³ʲs, Y. c. sgsʲs.:($ j). q_rai, edmfx_upwinding)
290
+ @. Yₜ. c. sgsʲs.:($$ j). q_tot += (1 - Y. c. sgsʲs.:($$ j). q_tot) * va
291
+ @. Yₜ. c. sgsʲs.:($$ j). q_rai += va
292
+ va = vertical_advection (ᶠwₛ³ʲs, Y. c. sgsʲs.:($ j). q_sno, edmfx_upwinding)
293
+ @. Yₜ. c. sgsʲs.:($$ j). q_tot += (1 - Y. c. sgsʲs.:($$ j). q_tot) * va
294
+ @. Yₜ. c. sgsʲs.:($$ j). q_sno += va
295
+
296
+ # q_tot and moisture tracers terms proportional to 1/ρ̂ ∂zρ̂
297
+ @. 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)
298
+ @. Yₜ. c. sgsʲs.:($$ j). q_liq -= dot (ᶜinv_ρ̂_∂ρ̂∂z, CT3 (Geometry. WVector (- 1 * ᶜwₗʲs.:($$ j)))) * Y. c. sgsʲs.:($$ j). q_liq
299
+ @. 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)
300
+ @. Yₜ. c. sgsʲs.:($$ j). q_ice -= dot (ᶜinv_ρ̂_∂ρ̂∂z, CT3 (Geometry. WVector (- 1 * ᶜwᵢʲs.:($$ j)))) * Y. c. sgsʲs.:($$ j). q_ice
301
+ @. 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)
302
+ @. Yₜ. c. sgsʲs.:($$ j). q_rai -= dot (ᶜinv_ρ̂_∂ρ̂∂z, CT3 (Geometry. WVector (- 1 * ᶜwᵣʲs.:($$ j)))) * Y. c. sgsʲs.:($$ j). q_rai
303
+ @. 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)
304
+ @. Yₜ. c. sgsʲs.:($$ j). q_sno -= dot (ᶜinv_ρ̂_∂ρ̂∂z, CT3 (Geometry. WVector (- 1 * ᶜwₛʲs.:($$ j)))) * Y. c. sgsʲs.:($$ j). q_sno
305
+
306
+ # q_tot and moisture tracer terms proportional to velocity gradients
307
+ @. 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)
308
+ @. Yₜ. c. sgsʲs.:($$ j). q_liq -= ᶜdivᵥ (ᶠwₗ³ʲs) * Y. c. sgsʲs.:($$ j). q_liq
309
+ @. 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)
310
+ @. Yₜ. c. sgsʲs.:($$ j). q_ice -= ᶜdivᵥ (ᶠwᵢ³ʲs) * Y. c. sgsʲs.:($$ j). q_ice
311
+ @. 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)
312
+ @. Yₜ. c. sgsʲs.:($$ j). q_rai -= ᶜdivᵥ (ᶠwᵣ³ʲs) * Y. c. sgsʲs.:($$ j). q_rai
313
+ @. 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)
314
+ @. Yₜ. c. sgsʲs.:($$ j). q_sno -= ᶜdivᵥ (ᶠwₛ³ʲs) * Y. c. sgsʲs.:($$ j). q_sno
315
+ end
286
316
end
287
317
end
318
+
319
+ # (; ᶜΦ) = p.core
320
+ # thp = CAP.thermodynamics_params(params)
321
+
322
+ # @. ᶜa_scalar = Iₗ(thp, ᶜtsʲs.:($$j)) + ᶜΦ
323
+ # vtt = vertical_transport(FT(1), (@. lazy( CT3(ᶠinterp(Geometry.WVector(ᶜwᵣʲs.:($$j)))))), ᶜa_scalar, dt, edmfx_upwinding)
324
+ # @. Yₜ.c.sgsʲs.:($$j).q_rai -= vtt
325
+ # @. Yₜ.c.sgsʲs.:($$j).q_rai -= ᶜinv_ρ̂_∂ρ̂∂z * ᶜwᵣʲs.:($$j) * (Iₗ(thp, ᶜtsʲs.:($$j)) + ᶜϕ)
326
+
327
+ # (@. lazy(ᶠu³ʲs.:($$j) - CT3(ᶠinterp(Geometry.WVector(ᶜwₗʲs.:($$j)))))),
328
+
329
+ # @. Yₜ.c.sgsʲs.:($$j).mse -= ifelse(
330
+ # Y.c.sgsʲs.:($$j).ρa <= eps(FT),
331
+ # FT(0),
332
+ # (
333
+ # 1 / Y.c.sgsʲs.:($$j).ρa *
334
+ # ᶜdivᵥ(ᶠinterp(Y.c.sgsʲs.:($$j).ρa * (
335
+ # Geometry.WVector(ᶜwₗʲs.:($$j)) * (Iₗ(thp, ᶜtsʲs.:($$j)) + ᶜΦ) +
336
+ # Geometry.WVector(ᶜwᵢʲs.:($$j)) * (Iᵢ(thp, ᶜtsʲs.:($$j)) + ᶜΦ) +
337
+ # Geometry.WVector(ᶜwᵣʲs.:($$j)) * (Iₗ(thp, ᶜtsʲs.:($$j)) + ᶜΦ) +
338
+ # Geometry.WVector(ᶜwₛʲs.:($$j)) * (Iᵢ(thp, ᶜtsʲs.:($$j)) + ᶜΦ)
339
+ # )))
340
+ # )
341
+ # )
342
+
0 commit comments