@@ -10,12 +10,20 @@ NVTX.@annotate function hyperdiffusion_tendency!(Yₜ, Yₜ_lim, Y, p, t)
10
10
apply_hyperdiffusion_tendency! (Yₜ, Y, p, t)
11
11
end
12
12
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
17
22
end
18
23
24
+ prognostic_nt (:: Val{names} , :: Val{K} , vals... ) where {names, K} =
25
+ sorted_nt (Val (names), Val (K), vals... )
26
+
19
27
function ᶜremaining_tendency (ᶜY, ᶠY, p, t)
20
28
names = propertynames (ᶜY)
21
29
tends = (;
@@ -30,22 +38,23 @@ function ᶜremaining_tendency(ᶜY, ᶠY, p, t)
30
38
ᶜremaining_tendency_sgs⁰ (ᶜY, ᶠY, p, t)... ,
31
39
ᶜremaining_tendency_sgsʲs (ᶜY, ᶠY, p, t)... ,
32
40
)
33
- return lazy .(prognostic_nt .(Val (names); tends... ))
41
+ return lazy .(prognostic_nt .(Val (names), Val ( keys ( tends)), values (tends) ... ))
34
42
end
35
43
function ᶠremaining_tendency (ᶜY, ᶠY, p, t)
36
44
names = propertynames (ᶠY)
37
45
tends = (;
38
46
ᶠremaining_tendency_u₃ (ᶜY, ᶠY, p, t)... ,
39
47
ᶠremaining_tendency_sgsʲs (ᶜY, ᶠY, p, t)... ,
40
48
)
41
- return lazy .(prognostic_nt .(Val (names); tends... ))
49
+ return lazy .(prognostic_nt .(Val (names), Val ( keys ( tends)), values (tends) ... ))
42
50
end
43
51
using ClimaCore. RecursiveApply: rzero
44
52
function ᶜremaining_tendency_ρ (ᶜY, ᶠY, p, t)
45
53
:ρ in propertynames (ᶜY) || return ()
46
54
∑tendencies = zero (eltype (ᶜY. ρ))
47
55
ᶜJ = Fields. local_geometry_field (ᶜY). J
48
56
ᶠJ = Fields. local_geometry_field (ᶠY). J
57
+ ᶜρ = ᶜY. ρ
49
58
50
59
if ! (p. atmos. moisture_model isa DryModel)
51
60
ᶜwₜqₜ = compute_ᶜwₜqₜ (ᶜY, ᶠY, p, t)
@@ -178,7 +187,8 @@ function ᶠremaining_tendency_sgsʲs(ᶜY, ᶠY, p, t)
178
187
end
179
188
180
189
181
- water_adv (ᶜρ, ᶜJ, ᶠJ, ᶜχ) =
190
+ water_adv (ᶜρ, ᶜJ, ᶠJ, ᶜχ:: Real ) = zero (eltype (ᶜρ))
191
+ water_adv (ᶜρ, ᶜJ, ᶠJ, ᶜχ) = # only valid when ᶜχ is a field
182
192
@. lazy (ᶜprecipdivᵥ (ᶠinterp (ᶜρ * ᶜJ) / ᶠJ * ᶠright_bias (- (ᶜχ))))
183
193
184
194
function surface_velocity_full (ᶠu₃, ᶠuₕ³)
0 commit comments