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,25 @@ 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. ρ, ᶠface_density(Y. c. ρ)
114106 (; ᶠgradᵥ_ᶜΦ) = p. core
115- (; ᶠu³, ᶜp, ᶜts) = p. precomputed
107+ (; ᶠu³, ᶜts) = p. precomputed
116108 thermo_params = CAP. thermodynamics_params(params)
117109 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- )
110+ ᶜe_tot = @. lazy(specific(Y. c. ρe_tot, ᶜρ))
111+ ᶜh_tot = @. lazy(TD. total_specific_enthalpy(thermo_params, ᶜts, ᶜe_tot))
125112
126- @. Yₜ. c. ρ -= ᶜdivᵥ(ᶠinterp(Y . c . ρ * ᶜJ) / ᶠJ * ᶠu³)
113+ @. Yₜ. c. ρ -= ᶜdivᵥ(ᶠρ * ᶠu³)
127114
128115 # Central vertical advection of active tracers (e_tot and q_tot)
129- vtt = vertical_transport(Y . c . ρ , ᶠu³, ᶜh_tot, dt, Val(:none))
116+ vtt = vertical_transport(ᶜρ , ᶠu³, ᶜh_tot, dt, Val(:none))
130117 @. Yₜ. c. ρe_tot += vtt
131118 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))
119+ ᶜq_tot = @. lazy(specific(Y. c. ρq_tot, ᶜρ ))
120+ vtt = vertical_transport(ᶜρ , ᶠu³, ᶜq_tot, dt, Val(:none))
134121 @. Yₜ. c. ρq_tot += vtt
135122 end
136123
@@ -140,63 +127,39 @@ function implicit_vertical_advection_tendency!(Yₜ, Y, p, t)
140127 # using downward biasing and free outflow bottom boundary condition
141128 if moisture_model isa NonEquilMoistModel
142129 (; ᶜ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- )
130+ q_liq = @. lazy(specific(Y. c. ρq_liq, ᶜρ))
131+ q_ice = @. lazy(specific(Y. c. ρq_ice, ᶜρ))
132+ @. Yₜ. c. ρq_liq -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwₗ) * q_liq))
133+ @. Yₜ. c. ρq_ice -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwᵢ) * q_ice))
153134 end
154135 if microphysics_model isa Microphysics1Moment
155136 (; ᶜ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- )
137+ q_rai = @. lazy(specific(Y. c. ρq_rai, ᶜρ))
138+ q_sno = @. lazy(specific(Y. c. ρq_sno, ᶜρ))
139+ @. Yₜ. c. ρq_rai -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwᵣ) * q_rai))
140+ @. Yₜ. c. ρq_sno -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwₛ) * q_sno))
166141 end
167142 if microphysics_model isa Microphysics2Moment
168143 (; ᶜ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- )
144+ n_liq = @. lazy(specific(Y. c. ρn_liq, ᶜρ))
145+ n_rai = @. lazy(specific(Y. c. ρn_rai, ᶜρ))
146+ q_rai = @. lazy(specific(Y. c. ρq_rai, ᶜρ))
147+ q_sno = @. lazy(specific(Y. c. ρq_sno, ᶜρ))
148+ @. Yₜ. c. ρn_liq -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwₙₗ) * n_liq))
149+ @. Yₜ. c. ρn_rai -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwₙᵣ) * n_rai))
150+ @. Yₜ. c. ρq_rai -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwᵣ) * q_rai))
151+ @. Yₜ. c. ρq_sno -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwₛ) * q_sno))
189152 end
190153 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)
154+ (; ᶜwnᵢ, ᶜwᵢ) = p. precomputed
195155
196156 # 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, ρ)))
157+ n_ice = @. lazy(specific(Y. c. ρn_ice, ᶜρ))
158+ q_rim = @. lazy(specific(Y. c. ρq_rim, ᶜρ))
159+ b_rim = @. lazy(specific(Y. c. ρb_rim, ᶜρ))
160+ @. Yₜ. c. ρn_ice -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwnᵢ) * n_ice))
161+ @. Yₜ. c. ρq_rim -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwᵢ) * q_rim))
162+ @. Yₜ. c. ρb_rim -= ᶜprecipdivᵥ(ᶠρ * ᶠright_bias(- WVec(ᶜwᵢ) * b_rim))
200163 end
201164
202165 # TODO - decide if this needs to be explicit or implicit
@@ -207,8 +170,7 @@ function implicit_vertical_advection_tendency!(Yₜ, Y, p, t)
207170 ᶜθ_v = @. lazy(theta_v(thermo_params, ᶜts))
208171 ᶜθ_vr = @. lazy(theta_vr(thermo_params, ᶜts))
209172 ᶜΠ = @. lazy(dry_exner_function(thermo_params, ᶜts))
210- @. Yₜ. f. u₃ -= ᶠgradᵥ_ᶜΦ - ᶠgradᵥ(ᶜΦ_r) +
211- cp_d * (ᶠinterp(ᶜθ_v - ᶜθ_vr)) * ᶠgradᵥ(ᶜΠ)
173+ @. Yₜ. f. u₃ -= ᶠgradᵥ_ᶜΦ - ᶠgradᵥ(ᶜΦ_r) + cp_d * (ᶠinterp(ᶜθ_v - ᶜθ_vr)) * ᶠgradᵥ(ᶜΠ)
212174
213175 if rayleigh_sponge isa RayleighSponge
214176 ᶠz = Fields. coordinate_field(Y. f). z
@@ -217,8 +179,7 @@ function implicit_vertical_advection_tendency!(Yₜ, Y, p, t)
217179 @. Yₜ. f. u₃ -= β_rayleigh_w(rs, ᶠz, zmax) * Y. f. u₃
218180 if turbconv_model isa PrognosticEDMFX
219181 for j in 1 : n
220- @. Yₜ. f. sgsʲs.:($$ j). u₃ -=
221- β_rayleigh_w(rs, ᶠz, zmax) * Y. f. sgsʲs.:($$ j). u₃
182+ @. Yₜ. f. sgsʲs.:($$ j). u₃ -= β_rayleigh_w(rs, ᶠz, zmax) * Y. f. sgsʲs.:($$ j). u₃
222183 end
223184 end
224185 end
0 commit comments