@@ -10,12 +10,20 @@ NVTX.@annotate function hyperdiffusion_tendency!(Yₜ, Yₜ_lim, Y, p, t)
1010 apply_hyperdiffusion_tendency! (Yₜ, Y, p, t)
1111end
1212
13- function prognostic_nt (:: Val{names} ; tends... ) where {names}
14- nt_ordered = NamedTuple {names} (rzero (values (tends)))
15- nt_values = NamedTuple {keys(tends)} (values (tends))
16- return merge (nt_ordered, nt_values)
13+ @generated function sorted_nt (:: Val{snames} , :: Val{unames} , vals... ) where {snames,unames}
14+ svals_exprs = []
15+ for sn in snames
16+ i = findfirst (un -> un == sn, unames):: Int
17+ push! (svals_exprs, :(getfield (vals, $ i)))
18+ end
19+ return quote
20+ NamedTuple {snames} (($ (svals_exprs... ),))
21+ end
1722end
1823
24+ prognostic_nt (:: Val{names} , :: Val{K} , vals... ) where {names, K} =
25+ sorted_nt (Val (names), Val (K), vals... )
26+
1927function ᶜremaining_tendency (ᶜY, ᶠY, p, t)
2028 names = propertynames (ᶜY)
2129 tends = (;
@@ -30,22 +38,23 @@ function ᶜremaining_tendency(ᶜY, ᶠY, p, t)
3038 ᶜremaining_tendency_sgs⁰ (ᶜY, ᶠY, p, t)... ,
3139 ᶜremaining_tendency_sgsʲs (ᶜY, ᶠY, p, t)... ,
3240 )
33- return lazy .(prognostic_nt .(Val (names); tends... ))
41+ return lazy .(prognostic_nt .(Val (names), Val ( keys ( tends)), values (tends) ... ))
3442end
3543function ᶠremaining_tendency (ᶜY, ᶠY, p, t)
3644 names = propertynames (ᶠY)
3745 tends = (;
3846 ᶠremaining_tendency_u₃ (ᶜY, ᶠY, p, t)... ,
3947 ᶠremaining_tendency_sgsʲs (ᶜY, ᶠY, p, t)... ,
4048 )
41- return lazy .(prognostic_nt .(Val (names); tends... ))
49+ return lazy .(prognostic_nt .(Val (names), Val ( keys ( tends)), values (tends) ... ))
4250end
4351using ClimaCore. RecursiveApply: rzero
4452function ᶜremaining_tendency_ρ (ᶜY, ᶠY, p, t)
4553 :ρ in propertynames (ᶜY) || return ()
4654 ∑tendencies = zero (eltype (ᶜY. ρ))
4755 ᶜJ = Fields. local_geometry_field (ᶜY). J
4856 ᶠJ = Fields. local_geometry_field (ᶠY). J
57+ ᶜρ = ᶜY. c. ρ
4958
5059 if ! (p. atmos. moisture_model isa DryModel)
5160 ᶜwₜqₜ = compute_ᶜwₜqₜ (ᶜY, ᶠY, p, t)
0 commit comments