Skip to content

Commit b9ac9cb

Browse files
szy21claude
andcommitted
Geometric SGS variance: isentropic form of the horizontal term
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1 parent e396b79 commit b9ac9cb

10 files changed

Lines changed: 221 additions & 45 deletions

File tree

‎NEWS.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,16 @@ ClimaAtmos.jl Release Notes
33

44
main
55
----
6+
- ![][badge-🔥behavioralΔ] The horizontal resolved-gradient (geometric) SGS variance
7+
term is now the isentropic form: `q′q′` carries `|∇_h q_tot − r ∇_h θ_li|²`, the
8+
gradient of `q_tot` along the `θ_li` surface with `r = (∂q_tot/∂z)/(∂θ_li/∂z)`, the
9+
stratification floored at the provisional `sgs_variance_isentropic_min_dtheta_dz`,
10+
there is no horizontal `θ′θ′` (or `θ′q′`) term,
11+
and the term carries a stability weight on the saturated moist `N²` — the hard cut
12+
`1[N²_sat > 0]` by default, smoothed over the provisional
13+
`sgs_variance_isentropic_stability_width` when that is positive — so it vanishes where
14+
the layer is moist-neutral or unstable. Changes every run with a nonzero
15+
`sgs_variance_horizontal_scale_factor`.
616
- ![][badge-🔥behavioralΔ] Add a resolved vertical-gradient block
717
`c_g (c_Δz Δz)² (∂_z ψ)²` to `σ_T²`, `σ_q²` (uniform-box exact with the
818
defaults `c_g = 1/12`, `c_Δz = 1`; independent of `l_mix`), so the

‎config/default_configs/default_config.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ use_sgs_quadrature:
262262
help: "Enable subgrid-scale quadrature integration for microphysics tendencies. When true, microphysics tendencies are integrated over the joint SGS PDF of (T, q_tot). [`true` (default), `false`]"
263263
value: true
264264
tq_correlation_model:
265-
help: "Closure for the SGS T-q correlation that couples σ_T and σ_q in the sampled joint PDF. `constant` uses the prescribed `Tq_correlation_coefficient`. `diagnosed` builds T′q′ as the sum of three blocks consistent with the variance decomposition — turbulent (prescribed ρ_turb · σ_T,turb · σ_q,turb), horizontal geometric (c_g (c_Δx Δx_h)² ∇_h θ_li · ∇_h q_tot), and vertical uniform-box (Δz² ∂_z θ_li · ∂_z q_tot / 12) — then forms ρ = T′q′ / √(T′T′ q′q′), falling back to the prescribed value where the variances vanish. [`constant` (default), `diagnosed`]"
265+
help: "Closure for the SGS T-q correlation that couples σ_T and σ_q in the sampled joint PDF. `constant` uses the prescribed `Tq_correlation_coefficient`. `diagnosed` builds T′q′ as the sum of the covariance blocks consistent with the variance decomposition — turbulent (prescribed ρ_turb · σ_T,turb · σ_q,turb) and vertical uniform-box (Δz² ∂_z θ_li · ∂_z q_tot / 12); the isentropic horizontal block carries no θ′ and contributes none — then forms ρ = T′q′ / √(T′T′ q′q′), falling back to the prescribed value where the variances vanish. [`constant` (default), `diagnosed`]"
266266
value: "constant"
267267
sgs_distribution:
268268
help: "Distribution type for SGS quadrature over microphysics. [`gaussian` (default), `lognormal`, `mean` (grid-mean only, no SGS sampling)]"

‎docs/src/prophet_closures.md‎

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -542,21 +542,31 @@ a single isotropic intra-subdomain variance shared across subdomains, driven by
542542
the vertical grid-mean gradients with the grid-mean mixing length.
543543

544544
An optional second term adds the subgrid variance implied by the resolved
545-
horizontal field — the leading-order scale-similarity estimate from the
546-
horizontal gradient and the horizontal grid scale alone,
547-
548-
```math
549-
\sigma_{\psi,\mathrm{geo}}^2 = c_g \, (c_{\Delta x} \Delta x_h)^2 \, |\nabla_h \psi|^2 ,
550-
```
551-
552-
added to both the ``\theta_{li}`` and ``q_t`` variances. The term is off by
553-
default (``c_{\Delta x} = 0``). It is not Richardson-weighted: this is a
554-
physical feature of the resolved mean field and is independent of whether the
555-
turbulent closure (above) is active, so the two blocks contribute additively
556-
without double-counting (they are not two estimates of the same quantity).
557-
The total-water standard deviation is then bounded by ``\sigma_q \le r_{\max} q_t`` (``r_{\max} = 0.5``), because a wider Gaussian places a quadrature node
558-
at negative total water, and condensing the clamped excess can drive the
559-
grid-mean vapor negative.
545+
horizontal field. Large-scale stirring of the free troposphere is
546+
quasi-adiabatic, so parcels move along surfaces of ``\theta_{li}``; the
547+
moisture contrast a parcel brings to the cell's level is therefore the
548+
contrast *along the isentrope*, and after the adiabatic displacement to that
549+
level only ``q_t`` differs. The term is the leading-order scale-similarity
550+
estimate built on that gradient,
551+
552+
```math
553+
\sigma_{q,\mathrm{geo}}^2 = c_g \, (c_{\Delta x} \Delta x_h)^2 \,
554+
|\nabla_h q_t - r \nabla_h \theta_{li}|^2 \, w(N^2_{\mathrm{sat}}) ,
555+
\qquad r = \frac{\partial_z q_t}{\max(\partial_z \theta_{li}, \theta_{z,\min})} ,
556+
```
557+
558+
added to the ``q_t`` variance only; there is no horizontal ``\theta_{li}``
559+
variance or ``\theta_{li}``–``q_t`` covariance term. ``r`` is the slope ratio
560+
``(\partial_z q_t)/(\partial_z \theta_{li})`` with the stratification floored at
561+
``\theta_{z,\min}`` (`sgs_variance_isentropic_min_dtheta_dz`), which bounds ``|r|``
562+
by ``|\partial_z q_t| / \theta_{z,\min}`` and treats a neutral or overturned layer
563+
as one of minimal stable stratification rather than as a surface of opposite tilt.
564+
The stability weight ``w`` is the hard cut
565+
``1[N^2_{\mathrm{sat}} > 0]`` on the saturated moist buoyancy frequency, or
566+
``(1 + \tanh(N^2_{\mathrm{sat}}/N^2_w))/2`` when the provisional width
567+
`sgs_variance_isentropic_stability_width` ``N^2_w`` is positive: where
568+
saturated air is buoyant the condensation of the subgrid moist tail is
569+
convective and belongs to the updrafts, so the term is zeroed.
560570

561571
A resolved vertical-gradient block is also added,
562572

@@ -571,9 +581,11 @@ uniform position in a box of size ``\Delta z``. The scale factor
571581
switch (``c_{\Delta z} = 0`` disables the term). This block keeps
572582
``\sigma_T^2``, ``\sigma_q^2`` non-zero where the turbulent closure collapses,
573583
so the quadrature integrand retains in-cell variability in laminar cells and
574-
single-column configurations. It is not Richardson-weighted — the resolved
575-
vertical gradient is a physical feature of the mean profile, not a turbulent
576-
property.
584+
single-column configurations.
585+
586+
The total-water standard deviation is then bounded by ``\sigma_q \le r_{\max} q_t`` (``r_{\max} = 0.5``),
587+
because a wider Gaussian places a quadrature node at negative total water, and
588+
condensing the clamped excess can drive the grid-mean vapor negative.
577589

578590
The cross-covariance is set either as a prescribed correlation,
579591

@@ -582,17 +594,19 @@ The cross-covariance is set either as a prescribed correlation,
582594
\qquad (\texttt{tq\_correlation\_model: constant}, \text{default})
583595
```
584596

585-
or as a diagnosed covariance that combines the three variance blocks with the
597+
or as a diagnosed covariance that combines the variance blocks with the
586598
correlation structure appropriate to each
587599
(``\texttt{tq\_correlation\_model: diagnosed}``):
588600

589601
```math
590602
\langle T' q_t' \rangle
591603
= r_{\mathrm{turb}} \sigma_{T,\mathrm{turb}} \sigma_{q,\mathrm{turb}}
592-
+ c_g (c_{\Delta x} \Delta x_h)^2 \, \nabla_h \theta_{li} \cdot \nabla_h q_t
593604
+ c_g (c_{\Delta z} \Delta z)^2 \, \partial_z \theta_{li} \, \partial_z q_t ,
594605
```
595606

607+
the isentropic horizontal block contributing nothing (no ``\theta_{li}'`` along
608+
the surface), so its ``q_t`` variance only dilutes the correlation,
609+
596610
followed by the thermodynamic Jacobian transform to ``T`` basis and
597611
``r = \langle T' q_t' \rangle / \sqrt{\sigma_T^2 \sigma_q^2}``, which is
598612
naturally in ``[-1, 1]`` because each variance block satisfies Cauchy-Schwarz

‎reproducibility_tests/ref_counter.jl‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
425
1+
426
22

33
# **README**
44
#
@@ -32,6 +32,10 @@
3232
# 3) (optional) leave a link to the buildkite run that prompted this ref counter bump.
3333

3434
#=
35+
426
36+
- The horizontal geometric SGS variance term is the isentropic form (gradient of q_tot
37+
along the θ_li surface in q′q′ only, with a saturated-N² stability weight).
38+
3539
425
3640
- Add SGS T–q correlation closure and resolved vertical-gradient variance block.
3741

‎src/config/model_getters.jl‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,10 +1142,6 @@ function AtmosWater(config::AtmosConfig, params, ::Type{FT}) where {FT}
11421142
microphysics_model = get_microphysics_model(pa)
11431143
sgs_quadrature = get_sgs_quadrature(pa, params)
11441144
tq_correlation_model = get_tq_correlation_model(pa)
1145-
# No horizontal-term requirement for `DiagnosedTqCorrelation`: the vertical
1146-
# resolved-gradient block (uniform-box, always on) and the prescribed-ρ_turb
1147-
# turbulent cross together give a well-defined T′q′ even in single-column
1148-
# configurations where `sgs_variance_horizontal_scale_factor = 0`.
11491145

11501146
if microphysics_model isa DryModel
11511147
@warn "Running simulations without any moisture present."

‎src/parameterized_tendencies/microphysics/cloud_fraction.jl‎

Lines changed: 112 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,73 @@ function materialized_mixing_length!(Y, p)
223223
end
224224
end
225225

226+
"""
227+
isentropic_validity_weight(N²_sat, width)
228+
229+
Validity weight `w ∈ [0, 1]` of the isentropic geometric variance term from the
230+
saturated buoyancy frequency squared `N²_sat` [s⁻²]: the sub-grid moist tail the
231+
term feeds into the quadrature condenses in place only where saturated air is
232+
stably stratified; where it is buoyant its condensation is convective and
233+
belongs to the EDMF plumes, so the term is zeroed there.
234+
With `width = 0` (`sgs_variance_isentropic_stability_width`) the
235+
weight is the hard cut `1[N²_sat > 0]`; a positive width smooths it, with
236+
w = (1 + tanh(N²_sat / width)) / 2
237+
"""
238+
@inline function isentropic_validity_weight(N²_sat, width)
239+
FT = typeof(N²_sat)
240+
smooth = (one(FT) + tanh(N²_sat / max(width, eps(FT)))) / 2
241+
hard = ifelse(N²_sat > 0, one(FT), zero(FT))
242+
return ifelse(width > zero(FT), smooth, hard)
243+
end
244+
245+
"""
246+
ᶜsgs_isentropic_weight(Y, p)
247+
248+
Lazy broadcast of `isentropic_validity_weight` with the width
249+
`sgs_variance_isentropic_stability_width`, evaluated on the squared buoyancy
250+
frequency of saturated air (`blended_N²` with cloud fraction 1).
251+
"""
252+
function ᶜsgs_isentropic_weight(Y, p)
253+
(; ᶜbg_coeffs, ᶜgradᵥ_θ_liq_ice, ᶜgradᵥ_q_tot) = p.precomputed
254+
FT = eltype(Y.c.ρ)
255+
width = FT(CAP.sgs_variance_isentropic_stability_width(p.params))
256+
ᶜlg = Fields.local_geometry_field(Y.c)
257+
return @. lazy(
258+
isentropic_validity_weight(
259+
blended_N²(
260+
ᶜbg_coeffs,
261+
one(FT),
262+
projected_vector_data(C3, ᶜgradᵥ_θ_liq_ice, ᶜlg),
263+
projected_vector_data(C3, ᶜgradᵥ_q_tot, ᶜlg),
264+
),
265+
width,
266+
),
267+
)
268+
end
269+
270+
"""
271+
isentropic_slope_ratio(∂q∂z, ∂θ∂z, θz_min)
272+
273+
Ratio `r = (∂q_tot/∂z) / max(∂θ_li/∂z, θz_min)` that converts the horizontal
274+
gradient of `θ_li` into the vertical displacement a horizontal excursion along a
275+
sloping `θ_li` surface implies, times the vertical `q_tot` gradient (the isentropic
276+
geometric variance term). The floor `θz_min` (`sgs_variance_isentropic_min_dtheta_dz`)
277+
on the stratification keeps the ratio finite and bounds it by `|∂q/∂z| / θz_min`: a
278+
neutral or overturned layer (`∂θ_li/∂z ≤ θz_min`) is treated as one of minimal stable
279+
stratification.
280+
"""
281+
@inline isentropic_slope_ratio(∂q∂z, ∂θ∂z, θz_min) = ∂q∂z / max(∂θ∂z, θz_min)
282+
283+
"""
284+
isentropic_gradient_invariant(inv_q, inv_θq, inv_θ, r)
285+
286+
`|∇_h q_tot − r ∇_h θ_li|² = |∇_h q|² − 2 r (∇_h θ_li · ∇_h q) + r² |∇_h θ_li|²`, the
287+
squared horizontal gradient of `q_tot` along the `θ_li` surface; floored
288+
at zero against round-off.
289+
"""
290+
@inline isentropic_gradient_invariant(inv_q, inv_θq, inv_θ, r) =
291+
max(inv_q - 2 * r * inv_θq + r^2 * inv_θ, zero(inv_q))
292+
226293
"""
227294
hgrad_invariant!(ᶜinv, ᶜψ, p)
228295
@@ -264,8 +331,9 @@ Diagnosed SGS T–q correlation `clamp(T′q′ / √(T′T′ q′q′), -1, 1)
264331
`fallback` where the product of the variances is at the round-off floor.
265332
266333
In exact arithmetic each variance block satisfies its own Cauchy-Schwarz
267-
inequality and the Cauchy-Schwarz bound on the sum of the three (turbulent,
268-
horizontal geometric, vertical uniform-box) covariances also holds, so
334+
inequality and the Cauchy-Schwarz bound on the sum of the two (turbulent,
335+
vertical uniform-box) covariances also holds — the isentropic horizontal block
336+
contributes variance to q′q′ only and no covariance — so
269337
`|ρ| ≤ 1` by construction. The explicit clamp is a cheap safeguard against
270338
(a) Float32 roundoff at the Cauchy-Schwarz boundary (which can produce
271339
`|ρ| = 1 + O(ε)` and feed NaN into downstream `√(1 − ρ²)` in the bivariate
@@ -322,10 +390,10 @@ Pipeline:
322390
`ρ_turb` scalar as `ρ_turb · σ_T,turb · σ_q,turb` (not the gradient-direction
323391
product), so the turbulent block carries a physical correlation independent of
324392
the sign of `∂_z θ · ∂_z q`.
325-
3. Add the horizontal resolved-gradient (geometric) term to θ′θ′ (skipped when
326-
`sgs_variance_horizontal_scale_factor` is 0). For the diagnosed correlation,
327-
add the geometric cross `∇_h θ_li · ∇_h q_tot` with the same element filter.
328-
Not Richardson-weighted (consistent with the vertical uniform-box block).
393+
3. Add the horizontal resolved-gradient (geometric) term, the isentropic form
394+
`|∇_h q_tot − r ∇_h θ_li|²` times the stability weight `w(N²_sat)`, to q′q′
395+
only — no horizontal θ′θ′ and no horizontal cross term (skipped when
396+
`sgs_variance_horizontal_scale_factor` is 0).
329397
4. Add the resolved vertical-gradient (uniform-box) term
330398
`c_g (c_Δz Δz)² (∂_z ψ)²` to both variances, and the exact cross
331399
`c_g (c_Δz Δz)² ∂_z θ · ∂_z q` to θ′q′ (skipped when
@@ -414,27 +482,52 @@ function set_covariance_cache!(Y, p, thermo_params)
414482
# ----------------------------------------------------------------------
415483
# 2. Horizontal resolved-gradient (geometric) block.
416484
# `geo_h |∇_h ψ|²`: leading-order scale-similarity estimate from the
417-
# resolved horizontal field. Not Richardson-weighted — like the
418-
# vertical uniform-box block below, the resolved horizontal gradient
419-
# is a physical feature of the mean profile, independent of whether
420-
# the turbulent closure is active. q′q′ is in native q basis so adding
485+
# resolved horizontal field. q′q′ is in native q basis so adding
421486
# here (before the θ→T transform) is equivalent to adding after.
487+
# The block is the isentropic form: no horizontal θ′θ′ term, because
488+
# θ_li is constant along the surface the excursion follows, so the whole
489+
# geometric variance is carried by q′q′ as the gradient of q_tot ALONG
490+
# the θ_li surface,
491+
# |∇_θ q|² = |∇_h q − r ∇_h θ_li|², r = (∂q/∂z)/max(∂θ_li/∂z, θz_min)
492+
# (`isentropic_slope_ratio`): a horizontal excursion δ on a sloping
493+
# isentrope carries the parcel down/up by r-weighted amounts, so aligned
494+
# (warm = moist) gradients amplify and anti-aligned ones cancel the
495+
# saturation variance. The validity weight 1[N²_sat > 0]
496+
# (`ᶜsgs_isentropic_weight`) zeroes the WHOLE term where the layer is
497+
# moist-neutral or unstable (no isentrope to displace along; the SGS
498+
# variability there is convective, carried by the EDMF plumes). The
499+
# weight is optionally smoothed over `sgs_variance_isentropic_stability_width`.
500+
# With the diagnosed T–q correlation this block adds nothing to T′q′
501+
# (no θ′ along the surface), so the correlation is carried by the
502+
# turbulent and vertical blocks. Scratch: `ᶜtemp_scalar_2` is free until
503+
# the θ→T transform below, `_3` (θ_li), `_5` (|∇q|²), `_6` (cross term).
422504
# ----------------------------------------------------------------------
423505
if use_geometric
424506
(; ᶜT, ᶜq_liq, ᶜq_ice) = p.precomputed
425507
ᶜθ_li = p.scratch.ᶜtemp_scalar_3
426508
@. ᶜθ_li = TD.liquid_ice_pottemp(
427509
thermo_params, ᶜT, Y.c.ρ, ᶜq_tot_nonneg, ᶜq_liq, ᶜq_ice,
428510
)
429-
ᶜinv = p.scratch.ᶜtemp_scalar_5 # reused for 2–3 invariants
430-
hgrad_invariant!(ᶜinv, ᶜθ_li, p)
431-
@. ᶜT′T′ += geo_h * ᶜinv
432-
hgrad_invariant!(ᶜinv, ᶜq_tot_nonneg, p)
433-
@. ᶜq′q′ += geo_h * ᶜinv
434-
if diag_corr
435-
hgrad_cross_invariant!(ᶜinv, ᶜθ_li, ᶜq_tot_nonneg, p)
436-
@. p.precomputed.ᶜT′q′ += geo_h * ᶜinv
437-
end
511+
ᶜinv_q = p.scratch.ᶜtemp_scalar_5
512+
ᶜinv_θ = p.scratch.ᶜtemp_scalar_2
513+
ᶜinv_θq = p.scratch.ᶜtemp_scalar_6
514+
hgrad_invariant!(ᶜinv_q, ᶜq_tot_nonneg, p)
515+
hgrad_invariant!(ᶜinv_θ, ᶜθ_li, p)
516+
hgrad_cross_invariant!(ᶜinv_θq, ᶜθ_li, ᶜq_tot_nonneg, p)
517+
θz_min = CAP.sgs_variance_isentropic_min_dtheta_dz(p.params)
518+
ᶜlg = Fields.local_geometry_field(Y.c)
519+
@. ᶜinv_q = isentropic_gradient_invariant(
520+
ᶜinv_q,
521+
ᶜinv_θq,
522+
ᶜinv_θ,
523+
isentropic_slope_ratio(
524+
projected_vector_data(C3, ᶜgradᵥ_q_tot, ᶜlg),
525+
projected_vector_data(C3, ᶜgradᵥ_θ_liq_ice, ᶜlg),
526+
θz_min,
527+
),
528+
)
529+
ᶜisen_weight = ᶜsgs_isentropic_weight(Y, p)
530+
@. ᶜq′q′ += ᶜisen_weight * (geo_h * ᶜinv_q)
438531
end
439532

440533
# ----------------------------------------------------------------------

‎src/parameters/Parameters.jl‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,14 @@ not yet define.
270270
SGS quadrature, in `[-1, 1]`. Used verbatim by `tq_correlation_model: constant`;
271271
used as the turbulent-block cross `ρ_turb` (and the fallback where all variance
272272
blocks vanish) by `tq_correlation_model: diagnosed` [-].
273+
- `sgs_variance_isentropic_min_dtheta_dz`: Floor `θz_min` on the stratification in
274+
the slope ratio `r = (∂q/∂z) / max(∂θ_li/∂z, θz_min)` of the isentropic geometric
275+
variance term; keeps `r` finite and bounded by `|∂q/∂z| / θz_min` in neutral and
276+
overturned layers [K m^-1].
277+
- `sgs_variance_isentropic_stability_width`: Width of the stability weight
278+
`w = (1 + tanh(N²_sat / width)) / 2` of the isentropic term
279+
(`isentropic_validity_weight`); `0` (the default) is the hard cut
280+
`1[N²_sat > 0]` [s^-2].
273281
- `cloud_fraction_steepness_scale`: Steepness scale `α` of the
274282
cloud-fraction/condensate relationship; 1 for exact Gaussian or lognormal SGS
275283
distributions [-].
@@ -302,6 +310,8 @@ Base.@kwdef struct SGSQuadratureParameters{FT} <: ASQP
302310
cloud_fraction_floor_release_abs_margin::FT
303311
cloud_fraction_floor_release_sharpness::FT
304312
cloud_fraction_floor_residual::FT
313+
sgs_variance_isentropic_min_dtheta_dz::FT
314+
sgs_variance_isentropic_stability_width::FT
305315
end
306316

307317
"""

‎src/parameters/create_parameters.jl‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,11 @@ function SGSQuadratureParameters(
594594
cloud_fraction_floor_release_abs_margin = FT(1),
595595
cloud_fraction_floor_release_sharpness = FT(1),
596596
cloud_fraction_floor_residual = FT(1),
597+
# Isentropic geometric variance term:
598+
# floor on ∂θ_li/∂z [K/m] in the slope ratio.
599+
sgs_variance_isentropic_min_dtheta_dz = FT(1e-3),
600+
# Smoothing width of the stability weight; 0 = hard cut 1[N²_sat > 0].
601+
sgs_variance_isentropic_stability_width = FT(0),
597602
)
598603
provisional_present = filter(collect(keys(provisional_defaults))) do name
599604
haskey(toml_dict.data, string(name))

‎test/parameter_tests.jl‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ end
121121
@test CAP.sgs_variance_max_rel_std(sq) == FT(0.5)
122122
@test CAP.sgs_liquid_uniform_fraction(sq) == FT(1)
123123
@test CAP.sgs_ice_uniform_fraction(sq) == FT(1)
124+
@test CAP.sgs_variance_isentropic_min_dtheta_dz(sq) == FT(1e-3)
125+
@test CAP.sgs_variance_isentropic_stability_width(sq) == FT(0)
124126
end
125127
# A run toml overrides the defaults.
126128
mktemp() do path, io

0 commit comments

Comments
 (0)