Skip to content

Commit 03fe0c8

Browse files
committed
feat(edmfx): add horizontal component to the EDMFX SGS diffusive flux
Add the horizontal counterpart of the EDMFX environment SGS diffusive flux, enabled by the opt-in `edmfx_sgs_horizontal_diffusive_flux` option: scalar fluxes (total enthalpy via the dry-static-energy + water-enthalpy decomposition, specific humidity with its moist-air mass counterpart, and grid-scale tracers with the sedimentation α weighting), turbulent TKE transport with the horizontal shear production, and the momentum stress τ = -2 K_u S with the full strain rate. The eddy diffusivity uses the TKE-based closure with the mixing length limited by the horizontal node spacing, cached in ᶜK_u_h/ᶜK_h_h with diagnostics lmixh, edth, and evuh. With prognostic updrafts, the separate opt-in `edmfx_horizontal_diffusion` option applies the grid-mean horizontal specific tendencies uniformly to the updraft scalars (mse, q_tot with the ρa dry-mass correction, and SGS tracers). The enthalpy gradient is materialized by ᶜtotal_enthalpy_gradientₕ! into scratch before the weak divergence, since a single fused broadcast with four spectral gradients exceeds GPU kernel parameter limits on topography-warped extruded spaces.
1 parent 77d75ab commit 03fe0c8

16 files changed

Lines changed: 906 additions & 3 deletions

File tree

NEWS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ ClimaAtmos.jl Release Notes
44
main
55
----
66

7+
- [#4657](https://github.com/CliMA/ClimaAtmos.jl/pull/4657) ![][badge-✨feature/enhancement] Add a horizontal component to the EDMFX SGS diffusive flux, enabled by the opt-in `edmfx_sgs_horizontal_diffusive_flux` config option (default `false`), for high-resolution configurations: scalar and TKE fluxes, the momentum stress `τ = -2 K_u S` with the full strain rate, the corresponding TKE shear production from horizontal gradients, and diagnostics `lmixh`, `edth`, and `evuh`. With prognostic updrafts and the separate opt-in `edmfx_horizontal_diffusion` config option (default `false`, requires `edmfx_sgs_horizontal_diffusive_flux`), the grid-mean horizontal specific tendencies are also applied to the updraft scalars (moist static energy, total specific humidity with its area-weighted density counterpart, and SGS tracers), so each subdomain inherits the grid-mean horizontal diffusion.
8+
79
0.42.1
810
-------
911
- [#4693](https://github.com/CliMA/ClimaAtmos.jl/pull/4693) ![][badge-🔥behavioralΔ] Mix the sedimentation flux across subdomains under `PrognosticEDMFX`. The lateral transfer of each sedimenting updraft tracer across tilted updraft boundaries now includes both detrainment (where the updraft narrows with height) and entrainment of the environment sedimentation flux (where it widens), with the environment flux density `ρ⁰w⁰χ⁰` reconstructed from the grid-mean flux minus the updraft contribution. Applied to the condensate/precipitation masses and their number concentrations, with matching implicit-Jacobian updates.

config/default_configs/default_config.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,9 @@ edmfx_nh_pressure:
452452
edmfx_vertical_diffusion:
453453
help: "If set to true, it switches on vertical diffusion of prognostic EDMFX updrafts. [`true`, `false` (default)]"
454454
value: false
455+
edmfx_horizontal_diffusion:
456+
help: "If set to true, it applies the grid-mean horizontal diffusion tendencies to the prognostic EDMFX updrafts. Requires `edmfx_sgs_horizontal_diffusive_flux`. Intended for high-resolution runs. [`true`, `false` (default)]"
457+
value: false
455458
edmfx_entr_model:
456459
help: "EDMFX entrainment closure. [`nothing` (default), `PiGroups`, `Generalized`]"
457460
value: ~
@@ -473,6 +476,9 @@ edmfx_sgs_mass_flux:
473476
edmfx_sgs_diffusive_flux:
474477
help: "If set to true, it switches on EDMFX SGS diffusive flux. [`true`, `false` (default)]"
475478
value: false
479+
edmfx_sgs_horizontal_diffusive_flux:
480+
help: "If set to true, it switches on the horizontal component of the EDMFX SGS diffusive flux. Intended for high-resolution runs. [`true`, `false` (default)]"
481+
value: false
476482
updraft_number:
477483
help: "Sets the number of updrafts for the EDMF scheme"
478484
value: 1

docs/make.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ makedocs(;
5656
"Physics & Parameterizations" => [
5757
"Microphysics" => "microphysics.md",
5858
"EDMF: Prognostic Equations" => "edmf_equations.md",
59+
"EDMF: Horizontal Diffusion" => "edmf_horizontal_diffusion.md",
5960
"Gravity Wave Drag" => [
6061
"Non-orographic Gravity Waves" => "non_orographic_gravity_wave.md",
6162
"Orographic Gravity Waves" => "orographic_gravity_wave.md",
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# Horizontal EDMF diffusion
2+
3+
The EDMFX sub-grid scale (SGS) diffusive closure is, by default, vertical only: it parameterizes turbulent transport along the column with an eddy-diffusivity closure and applies the resulting tendency to the grid mean (and, under `edmfx_vertical_diffusion`, applies the grid-mean tendencies to the prognostic updraft scalars).
4+
Two opt-in configuration options add the analogous horizontal down-gradient terms, both defaulting to `false`:
5+
6+
- `edmfx_sgs_horizontal_diffusive_flux` adds the horizontal component of the grid-mean environment SGS diffusive flux;
7+
- `edmfx_horizontal_diffusion` applies the grid-mean horizontal diffusion tendencies to the prognostic EDMFX updrafts, and requires `edmfx_sgs_horizontal_diffusive_flux`.
8+
9+
Both terms are always explicit: they are applied in the explicit remainder tendency, independently of `diff_mode`, and never enter the implicit column solve.
10+
Each requires a horizontal discretization, so both return immediately on single columns.
11+
12+
## Horizontal eddy diffusivity
13+
14+
The horizontal eddy viscosity and diffusivity use the same TKE-based closure as the vertical flux,
15+
16+
```math
17+
K_u = c_m \, l \, \sqrt{e}, \qquad K_h = K_u \,/\, \mathrm{Pr}_t ,
18+
```
19+
20+
where ``l`` is the horizontal mixing length (see [Mixing length](@ref)), ``e`` is the environment turbulent kinetic energy (TKE), ``c_m`` is the eddy-diffusivity coefficient, and ``\mathrm{Pr}_t`` the turbulent Prandtl number.
21+
`set_horizontal_diffusivities!` evaluates ``K_u`` and ``K_h`` at cell centers on each update of the explicit precomputed cache, storing them in `ᶜK_u_h` and `ᶜK_h_h`.
22+
The horizontal tendencies and the `edth`/`evuh` diagnostics read these cached fields.
23+
24+
Unlike the vertical face pipeline (`set_face_diffusivities!`), the horizontal diffusivities do not include the interfacial entrainment diffusivity ``K_e``: that term parameterizes vertical entrainment across an unresolved inversion face (``K_e = \gamma \, w_e \, \Delta z``) and has no horizontal analogue.
25+
26+
## Grid-mean flux
27+
28+
The grid-mean tendencies from `edmfx_sgs_horizontal_diffusive_flux` are, on cell centers,
29+
30+
```math
31+
\partial_t (\rho e_\text{tot}) \mathrel{+}= \nabla_h \cdot \left[ \rho \, K_h \left( \nabla_h s_\text{d} + \sum_{\mu} (h_\mu + \Phi) \, \nabla_h q_\mu \right) \right],
32+
```
33+
34+
```math
35+
\partial_t (\rho q_\text{tot}) \mathrel{+}= \nabla_h \cdot (\rho \, K_h \, \nabla_h q_\text{tot}),
36+
\qquad
37+
\partial_t (\rho \chi) \mathrel{+}= \nabla_h \cdot (\rho \, \alpha_\chi \, K_h \, \nabla_h \chi),
38+
```
39+
40+
where ``\nabla_h`` and ``\nabla_h\cdot`` are the horizontal gradient and weak divergence, ``s_\text{d}`` is the dry static energy, ``h_\mu`` and ``q_\mu`` are the specific enthalpy and specific humidity of the water species ``\mu \in \{\text{vap}, \text{liq}, \text{ice}\}``, and ``\Phi`` is the geopotential.
41+
The total enthalpy uses the dry-static-energy + water-enthalpy decomposition of the vertical flux, which avoids the spurious enthalpy flux that diffusing ``h_\text{tot}`` directly would carry with the dry-air mass.
42+
The gradient is materialized by `ᶜtotal_enthalpy_gradientₕ!` in two accumulation broadcasts before the weak divergence is applied: a single broadcast holding all four spectral gradients exceeds GPU kernel parameter limits on extruded spaces with warped topography.
43+
A regression test asserts that the ``\rho e_\text{tot}`` tendency equals the sum of the four constituent fluxes (dry static energy, vapor, liquid, ice).
44+
45+
The tracer ``\chi`` ranges over the grid-mean SGS tracers: microphysics species (cloud, precipitation, and, for two-moment schemes, number concentrations) and any passive tracers.
46+
Sedimenting microphysics species carry the tracer diffusion factor ``\alpha_\chi = \alpha`` (`α_vert_diff_tracer`); all other tracers use the unscaled ``K_h`` (``\alpha_\chi = 1``), matching the vertical flux.
47+
The total-specific-humidity flux additionally enters the moist-air-mass tendency,
48+
49+
```math
50+
\partial_t \rho \mathrel{+}= \nabla_h \cdot (\rho \, K_h \, \nabla_h q_\text{tot}),
51+
```
52+
53+
while the condensate and precipitation fluxes do not.
54+
55+
When prognostic TKE is active, the horizontal flux transports TKE and adds the horizontal shear production,
56+
57+
```math
58+
\partial_t (\rho e) \mathrel{+}= \nabla_h \cdot (\rho \, K_u \, \nabla_h e) + 2 \rho \, K_u \, \mathcal{S}_h : \mathcal{S}_h ,
59+
```
60+
61+
with ``\mathcal{S}_h`` the strain rate built from horizontal gradients only.
62+
The shear production is positive definite; the production from vertical gradients and its stencil are applied by the vertical TKE tendency.
63+
64+
The momentum tendency is the horizontal weak divergence of the SGS stress ``\tau = -2 K_u \mathcal{S}``, with ``\mathcal{S}`` the full three-dimensional strain rate of the grid-mean velocity,
65+
66+
```math
67+
\partial_t u_h \mathrel{-}= \frac{1}{\rho} \nabla_h \cdot (\rho \, \tau),
68+
\qquad
69+
\partial_t u_3 \mathrel{-}= \frac{1}{\rho} \nabla_h \cdot (\rho \, \tau),
70+
```
71+
72+
evaluated on cell centers for the horizontal wind and on cell faces for the vertical wind.
73+
The vertical wind is included because the horizontal flux of vertical momentum ``\overline{u_h' w'}`` is a covariance, which the TKE (the half-trace of the velocity covariance) does not carry, so the down-gradient stress is its only representation.
74+
The vertical flux ``\overline{w' w'}`` is a variance represented by the TKE, the mass flux, and the pressure closure, so it is not applied as down-gradient diffusion of the vertical wind; the vertical stress divergence on the horizontal wind is handled by the vertical diffusion pathway.
75+
76+
## Updraft horizontal diffusion
77+
78+
The option `edmfx_horizontal_diffusion` switches on horizontal diffusion of the prognostic updraft variables.
79+
It requires `edmfx_sgs_horizontal_diffusive_flux`: each subdomain scalar receives the specific tendency of the corresponding grid-mean flux, so every subdomain inherits the same horizontal diffusion as the grid box, matching the uniform vertical treatment of `edmfx_vertical_diffusion`.
80+
For each updraft ``j``, the total specific humidity and the SGS tracers receive
81+
82+
```math
83+
\partial_t \chi^j \mathrel{+}= \frac{1}{\rho} \nabla_h \cdot (\rho \, \alpha_\chi \, K_h \, \nabla_h \chi),
84+
```
85+
86+
with ``\alpha_\chi`` as in the grid-mean fluxes, and the moist static energy receives the grid-mean total-enthalpy tendency, ``\partial_t \mathrm{mse}^j \mathrel{+}= \partial_t(\rho e_\text{tot}) \, / \, \rho``.
87+
The updraft dry-air mass is unchanged by the water flux, so the area-weighted density ``\rho a^j`` receives the counterpart tendency ``\rho a^j / (1 - q_\text{tot}^j)`` times the ``q_\text{tot}^j`` tendency, mirroring the grid-mean moist-air mass correction.
88+
Diffusing each subdomain's own scalars instead would erode the updraft-environment contrasts that the mass-flux decomposition maintains.
89+
90+
## Mixing length
91+
92+
The eddy diffusivity depends on direction only through the mixing length ``l``: the TKE ``e`` is isotropic.
93+
The horizontal mixing length is the full physical mixing length ``l_\text{phys}`` of the Lopez-Gomez et al. (2020) closure (the smooth minimum of the wall, TKE-balance, and static-stability scales, unchanged from the vertical closure), limited from above by a grid scale.
94+
It differs from the vertical (master) mixing length only in that grid limiter: the horizontal length uses the spectral-element node scale ``\Delta x_h`` (`horizontal_filter_scale`), whereas the vertical pipeline uses the resolvability filter scale ``\Delta_f = \max(\Delta x_h, \Delta z)`` (`resolvability_filter_scale`),
95+
96+
```math
97+
l_h = \min(l_\text{phys}, \, \Delta x_h),
98+
\qquad
99+
l = \min(l_\text{phys}, \, \Delta_f).
100+
```
101+
102+
Wherever ``\Delta x_h \ge \Delta z`` (single columns and GCM resolutions), the two limiters coincide (``\Delta_f = \Delta x_h``), so ``l_h = l`` and the horizontal diffusivity equals the one built from the master mixing length.
103+
They differ only where ``\Delta z > \Delta x_h`` (gray-zone and LES aspect ratios): there ``\Delta_f = \Delta z`` while the horizontal length remains limited by ``\Delta x_h``, giving the shorter horizontal scale ``l_h \le l`` and the ratio ``l_h / l = \Delta x_h / \Delta z`` wherever ``l_\text{phys}`` exceeds both spacings.
104+
105+
## When to enable it
106+
107+
Horizontal EDMF diffusion is intended for configurations whose horizontal node scale ``\Delta x_h`` is comparable to or smaller than the physical mixing length, so that the horizontal limiter ``\min(l_\text{phys}, \Delta x_h)`` binds.
108+
This is the high-resolution and gray-zone regime, where an anisotropic SGS length scale matters.
109+
110+
At coarse horizontal resolution (for example global runs with ``\Delta x_h`` of tens of kilometers) the horizontal limiter rarely binds, the horizontal diffusivity reduces to the isotropic environment value, and the term is typically negligible next to resolved horizontal transport.
111+
Both options are off by default for that reason.
112+
113+
The Smagorinsky-Lilly and anisotropic-minimum-dissipation closures already supply horizontal SGS diffusion of the same fields, so combining `edmfx_sgs_horizontal_diffusive_flux` with either is rejected at model construction, as is `edmfx_horizontal_diffusion` without `edmfx_sgs_horizontal_diffusive_flux`.
114+
115+
Because the term is explicit, it adds a horizontal diffusive stability limit on the timestep, ``\Delta t \lesssim \Delta x_h^2 / (2 K_h)``.
116+
At the fine horizontal resolutions where this closure is intended, the timestep is in practice already set by the explicit horizontal acoustic limit ``\Delta t \lesssim \Delta x_h / c_s``, which is the more restrictive of the two.
117+
118+
## Configuration
119+
120+
```yaml
121+
edmfx_sgs_horizontal_diffusive_flux: true # default: false
122+
edmfx_horizontal_diffusion: true # default: false; requires the flux option
123+
```
124+
125+
## Diagnostics
126+
127+
Three diagnostic variables expose the horizontal closure fields:
128+
129+
- `lmixh`: the horizontal mixing length ``l_h`` [m], recomputed on demand with the grid-scale limit set by the horizontal node spacing;
130+
- `edth`: the horizontal eddy diffusivity for scalars ``K_h`` [m² s⁻¹], read from the cached `ᶜK_h_h`;
131+
- `evuh`: the horizontal eddy viscosity ``K_u`` [m² s⁻¹], read from the cached `ᶜK_u_h`.
132+
133+
The vertical counterparts are `lmix`, `edt`, and `evu`.

src/cache/precomputed_quantities.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,18 @@ function precomputed_quantities(Y, atmos)
197197
ᶠK_u = similar(Y.f, FT),
198198
ᶠK_entr = similar(Y.f, FT),
199199
ᶜl_mix = similar(Y.c, FT),
200+
# Horizontal eddy viscosity/diffusivity of the TKE-based
201+
# closure, with the mixing length limited by the horizontal
202+
# node spacing; written by `set_horizontal_diffusivities!`.
203+
(
204+
atmos.edmfx_model.sgs_diffusive_flux_horizontal isa
205+
Val{true} ||
206+
atmos.edmfx_model.horizontal_diffusion isa Val{true} ?
207+
(;
208+
ᶜK_u_h = similar(Y.c, FT),
209+
ᶜK_h_h = similar(Y.c, FT),
210+
) : (;)
211+
)...,
200212
) : (;)
201213
)...,
202214
ᶜstrain_rate_norm = similar(Y.c, FT),
@@ -757,6 +769,13 @@ NVTX.@annotate function set_explicit_precomputed_quantities!(Y, p, t)
757769
# from the covariance/cloud-fraction update above.
758770
set_face_diffusivities!(Y, p)
759771

772+
if turbconv_model isa AbstractEDMF && (
773+
p.atmos.edmfx_model.sgs_diffusive_flux_horizontal isa Val{true} ||
774+
p.atmos.edmfx_model.horizontal_diffusion isa Val{true}
775+
)
776+
set_horizontal_diffusivities!(Y, p)
777+
end
778+
760779
# Master mixing length at centers for consumers that live at centers
761780
# (TKE dissipation, covariance closure, updraft internal diffusion,
762781
# diagnostics). When the configuration uses (co)variances, ᶜl_mix is

src/config/model_getters.jl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,25 @@ function check_case_consistency(parsed_args)
744744
"Unknown `config = $(repr(config))`. Valid options are: $(join(valid_configs, ", "))."
745745
)
746746

747+
if parsed_args["edmfx_sgs_horizontal_diffusive_flux"] && (
748+
!isnothing(parsed_args["smagorinsky_lilly"]) || parsed_args["amd_les"]
749+
)
750+
error(
751+
"`edmfx_sgs_horizontal_diffusive_flux` cannot be combined with \
752+
`smagorinsky_lilly` or `amd_les`, which already apply horizontal \
753+
SGS diffusion to the same fields",
754+
)
755+
end
756+
757+
if parsed_args["edmfx_horizontal_diffusion"] &&
758+
!parsed_args["edmfx_sgs_horizontal_diffusive_flux"]
759+
error(
760+
"`edmfx_horizontal_diffusion` requires \
761+
`edmfx_sgs_horizontal_diffusive_flux`: the updraft scalars \
762+
inherit the grid-mean horizontal diffusion tendencies",
763+
)
764+
end
765+
747766
# ISDAC consistency: when initial_condition is ISDAC, surface/rad/external
748767
# forcing must all be set to the matching ISDAC variants. Subsidence,
749768
# scm_coriolis, and ls_adv are owned by the setup, not the YAML schema.
@@ -849,8 +868,10 @@ function AtmosTurbconv(config::AtmosConfig, params, ::Type{FT}) where {FT}
849868
detr_model = get_detrainment_model(pa),
850869
sgs_mass_flux = pa["edmfx_sgs_mass_flux"],
851870
sgs_diffusive_flux = pa["edmfx_sgs_diffusive_flux"],
871+
sgs_diffusive_flux_horizontal = pa["edmfx_sgs_horizontal_diffusive_flux"],
852872
nh_pressure = pa["edmfx_nh_pressure"],
853873
vertical_diffusion = pa["edmfx_vertical_diffusion"],
874+
horizontal_diffusion = pa["edmfx_horizontal_diffusion"],
854875
filter = pa["edmfx_filter"],
855876
scale_blending_method,
856877
)

src/diagnostics/Diagnostics.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ import ..get_physical_w
6767
import ..compute_gm_mixing_length
6868

6969
import ..horizontal_integral_at_boundary
70+
import ..horizontal_filter_scale
7071
import ..ᶜmixing_length
7172
import ..eddy_diffusivity
7273
import ..eddy_viscosity

src/diagnostics/edmfx_diagnostics.jl

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,74 @@ add_diagnostic_variable!(short_name = "kentr", units = "m^2 s^-1",
874874
compute = compute_kentr,
875875
)
876876

877+
###
878+
# Horizontal mixing length (3d)
879+
###
880+
compute_lmixh(state, cache, time) =
881+
compute_lmixh(state, cache, time, cache.atmos.turbconv_model)
882+
compute_lmixh(_, _, _, turbconv_model) =
883+
error_diagnostic_variable("lmixh", turbconv_model)
884+
885+
function compute_lmixh(state, cache, _, ::Union{EDOnlyEDMFX, PrognosticEDMFX})
886+
Δx_h = horizontal_filter_scale(axes(state.c))
887+
return ᶜmixing_length(state, cache; grid_scale = Δx_h)
888+
end
889+
890+
add_diagnostic_variable!(short_name = "lmixh", units = "m",
891+
long_name = "Environment Horizontal Mixing Length",
892+
comments = "Mixing length with the grid-scale limit set by the horizontal \
893+
node spacing rather than the resolvability filter scale",
894+
compute = compute_lmixh,
895+
)
896+
897+
###
898+
# Horizontal diffusivity of heat (3d)
899+
###
900+
compute_edth(state, cache, time) =
901+
compute_edth(state, cache, time, cache.atmos.turbconv_model)
902+
compute_edth(_, _, _, turbconv_model) =
903+
error_diagnostic_variable("edth", turbconv_model)
904+
905+
function compute_edth(state, cache, _, ::Union{EDOnlyEDMFX, PrognosticEDMFX})
906+
hasproperty(cache.precomputed, :ᶜK_h_h) || error_diagnostic_variable(
907+
"Can only compute the horizontal eddy diffusivity when \
908+
`edmfx_sgs_horizontal_diffusive_flux` is enabled",
909+
)
910+
return cache.precomputed.ᶜK_h_h
911+
end
912+
913+
add_diagnostic_variable!(short_name = "edth", units = "m^2 s^-1",
914+
long_name = "Horizontal Eddy Diffusivity Coefficient for Temperature",
915+
comments = "Horizontal diffusion coefficient for scalars in the EDMFX \
916+
horizontal SGS diffusive flux, reported from the cached \
917+
`ᶜK_h_h` applied by the tendency",
918+
compute = compute_edth,
919+
)
920+
921+
###
922+
# Horizontal diffusivity of momentum (3d)
923+
###
924+
compute_evuh(state, cache, time) =
925+
compute_evuh(state, cache, time, cache.atmos.turbconv_model)
926+
compute_evuh(_, _, _, turbconv_model) =
927+
error_diagnostic_variable("evuh", turbconv_model)
928+
929+
function compute_evuh(state, cache, _, ::Union{EDOnlyEDMFX, PrognosticEDMFX})
930+
hasproperty(cache.precomputed, :ᶜK_u_h) || error_diagnostic_variable(
931+
"Can only compute the horizontal eddy viscosity when \
932+
`edmfx_sgs_horizontal_diffusive_flux` is enabled",
933+
)
934+
return cache.precomputed.ᶜK_u_h
935+
end
936+
937+
add_diagnostic_variable!(short_name = "evuh", units = "m^2 s^-1",
938+
long_name = "Horizontal Eddy Viscosity Coefficient for Momentum",
939+
comments = "Horizontal eddy viscosity from the TKE-based closure with the \
940+
mixing length limited by the horizontal node spacing, reported \
941+
from the cached `ᶜK_u_h` applied by the tendency",
942+
compute = compute_evuh,
943+
)
944+
877945
###
878946
# Updraft passive gas tracer A (3d)
879947
###

0 commit comments

Comments
 (0)