7373# the implicit tendency function. Since dt >= dtγ, we can safely use dt for now.
7474
7575function vertical_transport (ᶜρ, ᶠu³, ᶜχ, dt, :: Val{:none} )
76- ᶜJ = Fields. local_geometry_field (axes (ᶜρ)). J
77- ᶠJ = Fields. local_geometry_field (axes (ᶠu³)). J
78- return @. lazy (- (ᶜadvdivᵥ (ᶠinterp (ᶜρ * ᶜJ) / ᶠJ * ᶠu³ * ᶠinterp (ᶜχ))))
76+ ᶠρ = face_density (ᶜρ)
77+ return @. lazy (- (ᶜadvdivᵥ (ᶠρ * ᶠu³ * ᶠinterp (ᶜχ))))
7978end
8079function vertical_transport (ᶜρ, ᶠu³, ᶜχ, dt, :: Val{:first_order} )
81- ᶜJ = Fields. local_geometry_field (axes (ᶜρ)). J
82- ᶠJ = Fields. local_geometry_field (axes (ᶠu³)). J
83- return @. lazy (- (ᶜadvdivᵥ (ᶠinterp (ᶜρ * ᶜJ) / ᶠJ * ᶠupwind1 (ᶠu³, ᶜχ))))
80+ ᶠρ = face_density (ᶜρ)
81+ return @. lazy (- (ᶜadvdivᵥ (ᶠρ * ᶠupwind1 (ᶠu³, ᶜχ))))
8482end
8583@static if pkgversion (ClimaCore) ≥ v " 0.14.22"
8684 function vertical_transport (ᶜρ, ᶠu³, ᶜχ, dt, :: Val{:vanleer_limiter} )
87- ᶜJ = Fields. local_geometry_field (axes (ᶜρ)). J
88- ᶠJ = Fields. local_geometry_field (axes (ᶠu³)). J
89- return @. lazy (
90- - (ᶜadvdivᵥ (ᶠinterp (ᶜρ * ᶜJ) / ᶠJ * ᶠlin_vanleer (ᶠu³, ᶜχ, dt))),
91- )
85+ ᶠρ = face_density (ᶜρ)
86+ return @. lazy (- (ᶜadvdivᵥ (ᶠρ * ᶠlin_vanleer (ᶠu³, ᶜχ, dt))))
9287 end
9388end
9489function vertical_transport (ᶜρ, ᶠu³, ᶜχ, dt, :: Val{:third_order} )
95- ᶜJ = Fields. local_geometry_field (axes (ᶜρ)). J
96- ᶠJ = Fields. local_geometry_field (axes (ᶠu³)). J
97- return @. lazy (- (ᶜadvdivᵥ (ᶠinterp (ᶜρ * ᶜJ) / ᶠJ * ᶠupwind3 (ᶠu³, ᶜχ))))
90+ ᶠρ = face_density (ᶜρ)
91+ return @. lazy (- (ᶜadvdivᵥ (ᶠρ * ᶠupwind3 (ᶠu³, ᶜχ))))
9892end
9993
10094vertical_advection (ᶠu³, ᶜχ, :: Val{:none} ) =
@@ -105,32 +99,26 @@ vertical_advection(ᶠu³, ᶜχ, ::Val{:third_order}) =
10599 @. lazy (- (ᶜadvdivᵥ (ᶠupwind3 (ᶠu³, ᶜχ)) - ᶜχ * ᶜadvdivᵥ (ᶠu³)))
106100
107101function implicit_vertical_advection_tendency! (Yₜ, Y, p, t)
108- (; moisture_model, turbconv_model, rayleigh_sponge, microphysics_model) =
109- p. atmos
102+ (; moisture_model, turbconv_model, rayleigh_sponge, microphysics_model) = p. atmos
110103 (; params, dt) = p
111104 n = n_mass_flux_subdomains (turbconv_model)
112- ᶜJ = Fields . local_geometry_field ( axes ( Y. c)) . J
113- ᶠJ = Fields . local_geometry_field ( axes (Y . f)) . J
105+ ᶜρ = Y. c. ρ
106+ ᶠρ = face_density (ᶜρ)
114107 (; ᶠgradᵥ_ᶜΦ) = p. core
115108 (; ᶠu³, ᶜp, ᶜts) = p. precomputed
116109 thermo_params = CAP. thermodynamics_params (params)
117110 cp_d = CAP. cp_d (params)
118- ᶜh_tot = @. lazy (
119- TD. total_specific_enthalpy (
120- thermo_params,
121- ᶜts,
122- specific (Y. c. ρe_tot, Y. c. ρ),
123- ),
124- )
111+ e_tot = @. lazy (specific (Y. c. ρe_tot, ᶜρ))
112+ ᶜh_tot = @. lazy (TD. total_specific_enthalpy (thermo_params, ᶜts, e_tot))
125113
126- @. Yₜ. c. ρ -= ᶜdivᵥ (ᶠinterp (Y . c . ρ * ᶜJ) / ᶠJ * ᶠu³)
114+ @. Yₜ. c. ρ -= ᶜdivᵥ (ᶠρ * ᶠu³)
127115
128116 # Central vertical advection of active tracers (e_tot and q_tot)
129- vtt = vertical_transport (Y . c . ρ , ᶠu³, ᶜh_tot, dt, Val (:none ))
117+ vtt = vertical_transport (ᶜρ , ᶠu³, ᶜh_tot, dt, Val (:none ))
130118 @. Yₜ. c. ρe_tot += vtt
131119 if ! (moisture_model isa DryModel)
132- ᶜq_tot = @. lazy (specific (Y. c. ρq_tot, Y . c . ρ ))
133- vtt = vertical_transport (Y . c . ρ , ᶠu³, ᶜq_tot, dt, Val (:none ))
120+ ᶜq_tot = @. lazy (specific (Y. c. ρq_tot, ᶜρ ))
121+ vtt = vertical_transport (ᶜρ , ᶠu³, ᶜq_tot, dt, Val (:none ))
134122 @. Yₜ. c. ρq_tot += vtt
135123 end
136124
@@ -140,63 +128,41 @@ function implicit_vertical_advection_tendency!(Yₜ, Y, p, t)
140128 # using downward biasing and free outflow bottom boundary condition
141129 if moisture_model isa NonEquilMoistModel
142130 (; ᶜwₗ, ᶜwᵢ) = p. precomputed
143- @. Yₜ. c. ρq_liq -= ᶜprecipdivᵥ (
144- ᶠinterp (Y. c. ρ * ᶜJ) / ᶠJ * ᶠright_bias (
145- Geometry. WVector (- (ᶜwₗ)) * specific (Y. c. ρq_liq, Y. c. ρ),
146- ),
147- )
148- @. Yₜ. c. ρq_ice -= ᶜprecipdivᵥ (
149- ᶠinterp (Y. c. ρ * ᶜJ) / ᶠJ * ᶠright_bias (
150- Geometry. WVector (- (ᶜwᵢ)) * specific (Y. c. ρq_ice, Y. c. ρ),
151- ),
152- )
131+ q_liq = @. lazy (specific (Y. c. ρq_liq, ᶜρ))
132+ q_ice = @. lazy (specific (Y. c. ρq_ice, ᶜρ))
133+ @. Yₜ. c. ρq_liq -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwₗ) * q_liq))
134+ @. Yₜ. c. ρq_ice -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwᵢ) * q_ice))
153135 end
154136 if microphysics_model isa Microphysics1Moment
155137 (; ᶜwᵣ, ᶜwₛ) = p. precomputed
156- @. Yₜ. c. ρq_rai -= ᶜprecipdivᵥ (
157- ᶠinterp (Y. c. ρ * ᶜJ) / ᶠJ * ᶠright_bias (
158- Geometry. WVector (- (ᶜwᵣ)) * specific (Y. c. ρq_rai, Y. c. ρ),
159- ),
160- )
161- @. Yₜ. c. ρq_sno -= ᶜprecipdivᵥ (
162- ᶠinterp (Y. c. ρ * ᶜJ) / ᶠJ * ᶠright_bias (
163- Geometry. WVector (- (ᶜwₛ)) * specific (Y. c. ρq_sno, Y. c. ρ),
164- ),
165- )
138+ q_rai = @. lazy (specific (Y. c. ρq_rai, ᶜρ))
139+ q_sno = @. lazy (specific (Y. c. ρq_sno, ᶜρ))
140+ @. Yₜ. c. ρq_rai -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwᵣ) * q_rai))
141+ @. Yₜ. c. ρq_sno -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwₛ) * q_sno))
166142 end
167143 if microphysics_model isa Microphysics2Moment
168144 (; ᶜwₙₗ, ᶜwₙᵣ, ᶜwᵣ, ᶜwₛ) = p. precomputed
169- @. Yₜ. c. ρn_liq -= ᶜprecipdivᵥ (
170- ᶠinterp (Y. c. ρ * ᶜJ) / ᶠJ * ᶠright_bias (
171- Geometry. WVector (- (ᶜwₙₗ)) * specific (Y. c. ρn_liq, Y. c. ρ),
172- ),
173- )
174- @. Yₜ. c. ρn_rai -= ᶜprecipdivᵥ (
175- ᶠinterp (Y. c. ρ * ᶜJ) / ᶠJ * ᶠright_bias (
176- Geometry. WVector (- (ᶜwₙᵣ)) * specific (Y. c. ρn_rai, Y. c. ρ),
177- ),
178- )
179- @. Yₜ. c. ρq_rai -= ᶜprecipdivᵥ (
180- ᶠinterp (Y. c. ρ * ᶜJ) / ᶠJ * ᶠright_bias (
181- Geometry. WVector (- (ᶜwᵣ)) * specific (Y. c. ρq_rai, Y. c. ρ),
182- ),
183- )
184- @. Yₜ. c. ρq_sno -= ᶜprecipdivᵥ (
185- ᶠinterp (Y. c. ρ * ᶜJ) / ᶠJ * ᶠright_bias (
186- Geometry. WVector (- (ᶜwₛ)) * specific (Y. c. ρq_sno, Y. c. ρ),
187- ),
188- )
145+ n_liq = @. lazy (specific (Y. c. ρn_liq, ᶜρ))
146+ n_rai = @. lazy (specific (Y. c. ρn_rai, ᶜρ))
147+ q_rai = @. lazy (specific (Y. c. ρq_rai, ᶜρ))
148+ q_sno = @. lazy (specific (Y. c. ρq_sno, ᶜρ))
149+ @. Yₜ. c. ρn_liq -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwₙₗ) * n_liq))
150+ @. Yₜ. c. ρn_rai -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwₙᵣ) * n_rai))
151+ @. Yₜ. c. ρq_rai -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwᵣ) * q_rai))
152+ @. Yₜ. c. ρq_sno -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwₛ) * q_sno))
189153 end
190154 if microphysics_model isa Microphysics2MomentP3
191- (; ρ, ρn_ice, ρq_rim, ρb_rim) = Y. c
192- ᶜwnᵢ = @. lazy (Geometry. WVector (p. precomputed. ᶜwnᵢ))
193- ᶜwᵢ = @. lazy (Geometry. WVector (p. precomputed. ᶜwᵢ))
194- ᶠρ = @. lazy (ᶠinterp (ρ * ᶜJ) / ᶠJ)
155+ (; ᶜwnᵢ, ᶜwᵢ) = p. precomputed
156+ ᶜρ = Y. c. ρ
157+ ᶠρ = face_density (ᶜρ)
195158
196159 # Note: `ρq_ice` is handled above, in `moisture_model isa NonEquilMoistModel`
197- @. Yₜ. c. ρn_ice -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- ᶜwnᵢ * specific (ρn_ice, ρ)))
198- @. Yₜ. c. ρq_rim -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- ᶜwᵢ * specific (ρq_rim, ρ)))
199- @. Yₜ. c. ρb_rim -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- ᶜwᵢ * specific (ρb_rim, ρ)))
160+ n_ice = @. lazy (specific (Y. c. ρn_ice, ᶜρ))
161+ q_rim = @. lazy (specific (Y. c. ρq_rim, ᶜρ))
162+ b_rim = @. lazy (specific (Y. c. ρb_rim, ᶜρ))
163+ @. Yₜ. c. ρn_ice -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwnᵢ) * n_ice))
164+ @. Yₜ. c. ρq_rim -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwᵢ) * q_rim))
165+ @. Yₜ. c. ρb_rim -= ᶜprecipdivᵥ (ᶠρ * ᶠright_bias (- WVec (ᶜwᵢ) * b_rim))
200166 end
201167
202168 # TODO - decide if this needs to be explicit or implicit
@@ -207,8 +173,7 @@ function implicit_vertical_advection_tendency!(Yₜ, Y, p, t)
207173 ᶜθ_v = @. lazy (theta_v (thermo_params, ᶜts))
208174 ᶜθ_vr = @. lazy (theta_vr (thermo_params, ᶜts))
209175 ᶜΠ = @. lazy (dry_exner_function (thermo_params, ᶜts))
210- @. Yₜ. f. u₃ -= ᶠgradᵥ_ᶜΦ - ᶠgradᵥ (ᶜΦ_r) +
211- cp_d * (ᶠinterp (ᶜθ_v - ᶜθ_vr)) * ᶠgradᵥ (ᶜΠ)
176+ @. Yₜ. f. u₃ -= ᶠgradᵥ_ᶜΦ - ᶠgradᵥ (ᶜΦ_r) + cp_d * (ᶠinterp (ᶜθ_v - ᶜθ_vr)) * ᶠgradᵥ (ᶜΠ)
212177
213178 if rayleigh_sponge isa RayleighSponge
214179 ᶠz = Fields. coordinate_field (Y. f). z
@@ -217,8 +182,7 @@ function implicit_vertical_advection_tendency!(Yₜ, Y, p, t)
217182 @. Yₜ. f. u₃ -= β_rayleigh_w (rs, ᶠz, zmax) * Y. f. u₃
218183 if turbconv_model isa PrognosticEDMFX
219184 for j in 1 : n
220- @. Yₜ. f. sgsʲs.:($$ j). u₃ -=
221- β_rayleigh_w (rs, ᶠz, zmax) * Y. f. sgsʲs.:($$ j). u₃
185+ @. Yₜ. f. sgsʲs.:($$ j). u₃ -= β_rayleigh_w (rs, ᶠz, zmax) * Y. f. sgsʲs.:($$ j). u₃
222186 end
223187 end
224188 end
0 commit comments