24
24
prognostic_nt (:: Val{names} , :: Val{K} , vals... ) where {names, K} =
25
25
sorted_nt (Val (names), Val (K), vals... )
26
26
27
+ @generated function construct_tends (:: Val{names} , f, ᶜY, ᶠY, p, t) where {names}
28
+ calls = []
29
+ for name in names
30
+ push! (calls, :(f (Val ($ name), ᶜY, ᶠY, p, t)))
31
+ end
32
+ return quote
33
+ $ (calls... )
34
+ end
35
+ end
36
+
27
37
function ᶜremaining_tendency (ᶜY, ᶠY, p, t)
28
38
names = propertynames (ᶜY)
29
- tends = (;
30
- ᶜremaining_tendency_ρ (ᶜY, ᶠY, p, t)... ,
31
- ᶜremaining_tendency_uₕ (ᶜY, ᶠY, p, t)... ,
32
- ᶜremaining_tendency_ρe_tot (ᶜY, ᶠY, p, t)... ,
33
- ᶜremaining_tendency_ρq_tot (ᶜY, ᶠY, p, t)... ,
34
- ᶜremaining_tendency_ρq_liq (ᶜY, ᶠY, p, t)... ,
35
- ᶜremaining_tendency_ρq_ice (ᶜY, ᶠY, p, t)... ,
36
- ᶜremaining_tendency_ρq_rai (ᶜY, ᶠY, p, t)... ,
37
- ᶜremaining_tendency_ρq_sno (ᶜY, ᶠY, p, t)... ,
38
- ᶜremaining_tendency_sgs⁰ (ᶜY, ᶠY, p, t)... ,
39
- ᶜremaining_tendency_sgsʲs (ᶜY, ᶠY, p, t)... ,
40
- )
41
- return lazy .(prognostic_nt .(Val (names), Val (keys (tends)), values (tends)... ))
39
+ tends = construct_tends (Val (names), ᶜremaining_tendency, ᶜY, ᶠY, p, t)
40
+ # tends = (;
41
+ # ᶜremaining_tendency(Val(:ρ), ᶜY, ᶠY, p, t)...,
42
+ # ᶜremaining_tendency(Val(:uₕ), ᶜY, ᶠY, p, t)...,
43
+ # ᶜremaining_tendency(Val(:ρe_tot), ᶜY, ᶠY, p, t)...,
44
+ # ᶜremaining_tendency(Val(:ρq_tot), ᶜY, ᶠY, p, t)...,
45
+ # ᶜremaining_tendency(Val(:ρq_liq), ᶜY, ᶠY, p, t)...,
46
+ # ᶜremaining_tendency(Val(:ρq_ice), ᶜY, ᶠY, p, t)...,
47
+ # ᶜremaining_tendency(Val(:ρq_rai), ᶜY, ᶠY, p, t)...,
48
+ # ᶜremaining_tendency(Val(:ρq_sno), ᶜY, ᶠY, p, t)...,
49
+ # ᶜremaining_tendency(Val(:sgs⁰), ᶜY, ᶠY, p, t)...,
50
+ # ᶜremaining_tendency(Val(:sgsʲs), ᶜY, ᶠY, p, t)...,
51
+ # )
52
+
53
+ # return lazy.(prognostic_nt.(Val(names), Val(keys(tends)), values(tends)...))
54
+ prog_nt = (NamedTuple{names} ∘ tuple)
55
+ return lazy .(prog_nt .(tends))
42
56
end
43
57
function ᶠremaining_tendency (ᶜY, ᶠY, p, t)
44
58
names = propertynames (ᶠY)
45
- tends = (;
46
- ᶠremaining_tendency_u₃ (ᶜY, ᶠY, p, t)... ,
47
- ᶠremaining_tendency_sgsʲs (ᶜY, ᶠY, p, t)... ,
48
- )
49
- return lazy .(prognostic_nt .(Val (names), Val (keys (tends)), values (tends)... ))
59
+ tends = construct_tends (Val (names), ᶠremaining_tendency, ᶜY, ᶠY, p, t)
60
+ # tends = (;
61
+ # ᶠremaining_tendency(Val(:u₃), ᶜY, ᶠY, p, t)...,
62
+ # ᶠremaining_tendency(Val(:sgsʲs), ᶜY, ᶠY, p, t)...,
63
+ # )
64
+ # return lazy.(prognostic_nt.(Val(names), Val(keys(tends)), values(tends)...))
65
+ prog_nt = (NamedTuple{names} ∘ tuple)
66
+ return lazy .(prog_nt .(tends))
50
67
end
51
68
using ClimaCore. RecursiveApply: rzero
52
- function ᶜremaining_tendency_ρ ( ᶜY, ᶠY, p, t)
69
+ function ᶜremaining_tendency ( :: Val{:ρ} , ᶜY, ᶠY, p, t)
53
70
:ρ in propertynames (ᶜY) || return ()
54
71
∑tendencies = zero (eltype (ᶜY. ρ))
55
72
ᶜJ = Fields. local_geometry_field (ᶜY). J
@@ -60,25 +77,25 @@ function ᶜremaining_tendency_ρ(ᶜY, ᶠY, p, t)
60
77
ᶜwₜqₜ = compute_ᶜwₜqₜ (ᶜY, ᶠY, p, t)
61
78
∑tendencies = sub_tend (∑tendencies, water_adv (ᶜρ, ᶜJ, ᶠJ, ᶜwₜqₜ))
62
79
end
63
- return (;ρ = ∑tendencies)
80
+ return ∑tendencies
64
81
end
65
82
66
83
add_tend (∑tends, t) = lazy .(∑tends .+ t)
67
84
add_tend (∑tends, :: NullBroadcasted ) = ∑tends
68
85
sub_tend (∑tends, :: NullBroadcasted ) = ∑tends
69
86
sub_tend (∑tends, t) = lazy .(∑tends .- t)
70
87
71
- function ᶜremaining_tendency_uₕ ( ᶜY, ᶠY, p, t)
88
+ function ᶜremaining_tendency ( :: Val{:uₕ} , ᶜY, ᶠY, p, t)
72
89
:uₕ in propertynames (ᶜY) || return ()
73
90
∑tendencies = zero (eltype (ᶜY. uₕ))
74
91
(; viscous_sponge, rayleigh_sponge) = p. atmos
75
92
ᶜuₕ = ᶜY. uₕ
76
93
∑tendencies = add_tend (∑tendencies, viscous_sponge_tendency_uₕ (ᶜuₕ, viscous_sponge))
77
94
∑tendencies = add_tend (∑tendencies, rayleigh_sponge_tendency_uₕ (ᶜuₕ, rayleigh_sponge))
78
95
79
- return (;uₕ = ∑tendencies)
96
+ return ∑tendencies
80
97
end
81
- function ᶜremaining_tendency_ρe_tot ( ᶜY, ᶠY, p, t)
98
+ function ᶜremaining_tendency ( :: Val{:ρe_tot} , ᶜY, ᶠY, p, t)
82
99
:ρe_tot in propertynames (ᶜY) || return ()
83
100
∑tendencies = zero (eltype (ᶜY. ρe_tot))
84
101
@@ -112,9 +129,9 @@ function ᶜremaining_tendency_ρe_tot(ᶜY, ᶠY, p, t)
112
129
end
113
130
114
131
∑tendencies = add_tend (∑tendencies, viscous_sponge_tendency_ρe_tot (ᶜρ, ᶜh_tot, viscous_sponge))
115
- return (;ρe_tot = ∑tendencies)
132
+ return ∑tendencies
116
133
end
117
- function ᶜremaining_tendency_ρq_tot ( ᶜY, ᶠY, p, t)
134
+ function ᶜremaining_tendency ( :: Val{:ρq_tot} , ᶜY, ᶠY, p, t)
118
135
:ρq_tot in propertynames (ᶜY) || return ()
119
136
∑tendencies = zero (eltype (ᶜY. ρq_tot))
120
137
ᶜJ = Fields. local_geometry_field (ᶜY). J
@@ -138,39 +155,39 @@ function ᶜremaining_tendency_ρq_tot(ᶜY, ᶠY, p, t)
138
155
∑tendencies = sub_tend (∑tendencies, vtt_central)
139
156
end
140
157
141
- return (;ρq_tot = ∑tendencies)
158
+ return ∑tendencies
142
159
end
143
- function ᶜremaining_tendency_ρq_liq ( ᶜY, ᶠY, p, t)
160
+ function ᶜremaining_tendency ( :: Val{:ρq_liq} , ᶜY, ᶠY, p, t)
144
161
:ρq_liq in propertynames (ᶜY) || return ()
145
162
∑tendencies = zero (eltype (ᶜY. ρq_liq))
146
- return (; ρq_liq = ∑tendencies)
163
+ return ∑tendencies
147
164
end
148
- function ᶜremaining_tendency_ρq_ice ( ᶜY, ᶠY, p, t)
165
+ function ᶜremaining_tendency ( :: Val{:ρq_ice} , ᶜY, ᶠY, p, t)
149
166
:ρq_ice in propertynames (ᶜY) || return ()
150
167
∑tendencies = zero (eltype (ᶜY. ρq_ice))
151
- return (; ρq_ice = ∑tendencies)
168
+ return ∑tendencies
152
169
end
153
- function ᶜremaining_tendency_ρq_rai ( ᶜY, ᶠY, p, t)
170
+ function ᶜremaining_tendency ( :: Val{:ρq_rai} , ᶜY, ᶠY, p, t)
154
171
:ρq_rai in propertynames (ᶜY) || return ()
155
172
∑tendencies = zero (eltype (ᶜY. ρq_rai))
156
- return (; ρq_rai = ∑tendencies)
173
+ return ∑tendencies
157
174
end
158
- function ᶜremaining_tendency_ρq_sno ( ᶜY, ᶠY, p, t)
175
+ function ᶜremaining_tendency ( :: Val{:ρq_sno} , ᶜY, ᶠY, p, t)
159
176
:ρq_sno in propertynames (ᶜY) || return ()
160
177
∑tendencies = zero (eltype (ᶜY. ρq_sno))
161
- return (; ρq_sno = ∑tendencies)
178
+ return ∑tendencies
162
179
end
163
- function ᶜremaining_tendency_sgsʲs ( ᶜY, ᶠY, p, t)
180
+ function ᶜremaining_tendency ( :: Val{:sgsʲs} , ᶜY, ᶠY, p, t)
164
181
:sgsʲs in propertynames (ᶜY) || return ()
165
182
∑tendencies = rzero (eltype (ᶜY. sgsʲs))
166
- return (; sgsʲs = ∑tendencies)
183
+ return ∑tendencies
167
184
end
168
- function ᶜremaining_tendency_sgs⁰ ( ᶜY, ᶠY, p, t)
185
+ function ᶜremaining_tendency ( :: Val{:sgs⁰} , ᶜY, ᶠY, p, t)
169
186
:sgs⁰ in propertynames (ᶜY) || return ()
170
187
∑tendencies = rzero (eltype (ᶜY. sgs⁰))
171
- return (; sgs⁰ = ∑tendencies)
188
+ return ∑tendencies
172
189
end
173
- function ᶠremaining_tendency_u₃ ( ᶜY, ᶠY, p, t)
190
+ function ᶠremaining_tendency ( :: Val{:u₃} , ᶜY, ᶠY, p, t)
174
191
:u₃ in propertynames (ᶠY) || return ()
175
192
∑tendencies = zero (eltype (ᶠY. u₃))
176
193
(; viscous_sponge) = p. atmos
@@ -179,12 +196,12 @@ function ᶠremaining_tendency_u₃(ᶜY, ᶠY, p, t)
179
196
ᶠuₕ³ = compute_ᶠuₕ³ (ᶜuₕ, ᶜρ)
180
197
ᶠu₃ = compute_ᶠu₃_with_bcs (ᶠY. u₃, ᶠuₕ³)
181
198
∑tendencies = add_tend (∑tendencies, viscous_sponge_tendency_u₃ (ᶠu₃, viscous_sponge))
182
- return (;u₃ = ∑tendencies)
199
+ return ∑tendencies
183
200
end
184
- function ᶠremaining_tendency_sgsʲs ( ᶜY, ᶠY, p, t)
201
+ function ᶠremaining_tendency ( :: Val{:sgsʲs} , ᶜY, ᶠY, p, t)
185
202
:sgsʲs in propertynames (ᶠY) || return ()
186
203
∑tendencies = rzero (eltype (ᶠY. sgsʲs))
187
- return (; sgsʲs = ∑tendencies)
204
+ return ∑tendencies
188
205
end
189
206
190
207
0 commit comments