@@ -37,6 +37,103 @@ NVTX.@annotate function hyperdiffusion_tendency!(Yₜ, Yₜ_lim, Y, p, t)
3737 apply_hyperdiffusion_tendency! (Yₜ, Y, p, t)
3838end
3939
40+ using ClimaCore. RecursiveApply: rzero
41+
42+ # ####
43+ # #### Cell center tendencies
44+ # ####
45+ function ᶜremaining_tendency (ᶜY, ᶠY, p, t)
46+ names = propertynames (ᶜY)
47+ tends = construct_tendencies (Val (names), ᶜremaining_tendency, ᶜY, ᶠY, p, t)
48+ # We cannot broadcast over a NamedTuple, so we need to check that edge case
49+ # first.
50+ if all (t -> ! (t isa Base. Broadcast. Broadcasted), tends)
51+ return make_named_tuple (Val (names), tends... )
52+ else
53+ return lazy .(make_named_tuple .(Val (names), tends... ))
54+ end
55+ end
56+
57+ # ####
58+ # #### Cell face tendencies
59+ # ####
60+ function ᶠremaining_tendency (ᶜY, ᶠY, p, t)
61+ names = propertynames (ᶠY)
62+ tends = construct_tendencies (Val (names), ᶠremaining_tendency, ᶜY, ᶠY, p, t)
63+ # We cannot broadcast over a NamedTuple, so we need to check that edge case
64+ # first.
65+ if all (t -> ! (t isa Base. Broadcast. Broadcasted), tends)
66+ return make_named_tuple (Val (names), tends... )
67+ else
68+ return lazy .(make_named_tuple .(Val (names), tends... ))
69+ end
70+ end
71+
72+ # ####
73+ # #### Individual tendencies
74+ # ####
75+
76+ function ᶜremaining_tendency (:: Val{:ρ} , ᶜY, ᶠY, p, t)
77+ :ρ in propertynames (ᶜY) || return ()
78+ ∑tendencies = zero (eltype (ᶜY. ρ))
79+ return ∑tendencies
80+ end
81+ function ᶜremaining_tendency (:: Val{:uₕ} , ᶜY, ᶠY, p, t)
82+ :uₕ in propertynames (ᶜY) || return ()
83+ ∑tendencies = zero (eltype (ᶜY. uₕ))
84+ return ∑tendencies
85+ end
86+ function ᶜremaining_tendency (:: Val{:ρe_tot} , ᶜY, ᶠY, p, t)
87+ :ρe_tot in propertynames (ᶜY) || return ()
88+ ∑tendencies = zero (eltype (ᶜY. ρe_tot))
89+ return ∑tendencies
90+ end
91+ function ᶜremaining_tendency (:: Val{:ρq_tot} , ᶜY, ᶠY, p, t)
92+ :ρq_tot in propertynames (ᶜY) || return ()
93+ ∑tendencies = zero (eltype (ᶜY. ρq_tot))
94+ return ∑tendencies
95+ end
96+ function ᶜremaining_tendency (:: Val{:ρq_liq} , ᶜY, ᶠY, p, t)
97+ :ρq_liq in propertynames (ᶜY) || return ()
98+ ∑tendencies = zero (eltype (ᶜY. ρq_liq))
99+ return ∑tendencies
100+ end
101+ function ᶜremaining_tendency (:: Val{:ρq_ice} , ᶜY, ᶠY, p, t)
102+ :ρq_ice in propertynames (ᶜY) || return ()
103+ ∑tendencies = zero (eltype (ᶜY. ρq_ice))
104+ return ∑tendencies
105+ end
106+ function ᶜremaining_tendency (:: Val{:ρq_rai} , ᶜY, ᶠY, p, t)
107+ :ρq_rai in propertynames (ᶜY) || return ()
108+ ∑tendencies = zero (eltype (ᶜY. ρq_rai))
109+ return ∑tendencies
110+ end
111+ function ᶜremaining_tendency (:: Val{:ρq_sno} , ᶜY, ᶠY, p, t)
112+ :ρq_sno in propertynames (ᶜY) || return ()
113+ ∑tendencies = zero (eltype (ᶜY. ρq_sno))
114+ return ∑tendencies
115+ end
116+ function ᶜremaining_tendency (:: Val{:sgsʲs} , ᶜY, ᶠY, p, t)
117+ :sgsʲs in propertynames (ᶜY) || return ()
118+ ∑tendencies = rzero (eltype (ᶜY. sgsʲs))
119+ return ∑tendencies
120+ end
121+ function ᶜremaining_tendency (:: Val{:sgs⁰} , ᶜY, ᶠY, p, t)
122+ :sgs⁰ in propertynames (ᶜY) || return ()
123+ ∑tendencies = rzero (eltype (ᶜY. sgs⁰))
124+ return ∑tendencies
125+ end
126+ function ᶠremaining_tendency (:: Val{:u₃} , ᶜY, ᶠY, p, t)
127+ :u₃ in propertynames (ᶠY) || return ()
128+ ∑tendencies = zero (eltype (ᶠY. u₃))
129+ return ∑tendencies
130+ end
131+ function ᶠremaining_tendency (:: Val{:sgsʲs} , ᶜY, ᶠY, p, t)
132+ :sgsʲs in propertynames (ᶠY) || return ()
133+ ∑tendencies = rzero (eltype (ᶠY. sgsʲs))
134+ return ∑tendencies
135+ end
136+
40137"""
41138 remaining_tendency!(Yₜ, Yₜ_lim, Y, p, t)
42139
@@ -64,7 +161,27 @@ Returns:
64161"""
65162NVTX. @annotate function remaining_tendency! (Yₜ, Yₜ_lim, Y, p, t)
66163 Yₜ_lim .= zero (eltype (Yₜ_lim))
67- Yₜ .= zero (eltype (Yₜ))
164+ device = ClimaComms. device (axes (Y. c))
165+ p_kernel = (;
166+ zmax = Spaces. z_max (axes (Y. f)),
167+ atmos = p. atmos,
168+ params = p. params,
169+ dt = p. dt,
170+ )
171+ if :sfc in propertynames (Y) # columnwise! does not yet handle .sfc
172+ parent (Yₜ. sfc) .= zero (Spaces. undertype (axes (Y. c)))
173+ end
174+ Operators. columnwise! (
175+ device,
176+ ᶜremaining_tendency,
177+ ᶠremaining_tendency,
178+ Yₜ. c,
179+ Yₜ. f,
180+ Y. c,
181+ Y. f,
182+ p_kernel,
183+ t,
184+ )
68185 horizontal_tracer_advection_tendency! (Yₜ_lim, Y, p, t)
69186 fill_with_nans! (p) # TODO : would be better to limit this to debug mode (e.g., if p.debug_mode...)
70187 horizontal_dynamics_tendency! (Yₜ, Y, p, t)
0 commit comments