@@ -22,26 +22,16 @@ function ν₄(hyperdiff, Y)
2222    return  (; ν₄_scalar, ν₄_vorticity)
2323end 
2424
25- hyperdiffusion_cache (Y, atmos) =  hyperdiffusion_cache (
26-     Y,
27-     atmos. hyperdiff,
28-     atmos. turbconv_model,
29-     atmos. moisture_model,
30-     atmos. microphysics_model,
31- )
32- 
33- #  No hyperdiffiusion
34- hyperdiffusion_cache (Y, hyperdiff:: Nothing , _, _, _) =  (;)
25+ function  hyperdiffusion_cache (Y, atmos)
26+     (; hyperdiff, turbconv_model, moisture_model, microphysics_model) =  atmos
27+     isnothing (hyperdiff) &&  return  (;)  #  No hyperdiffiusion
28+     hyperdiffusion_cache (Y, hyperdiff, turbconv_model, moisture_model, microphysics_model)
29+ end 
3530
3631function  hyperdiffusion_cache (
37-     Y,
38-     hyperdiff:: ClimaHyperdiffusion ,
39-     turbconv_model,
40-     moisture_model,
41-     microphysics_model,
32+     Y, hyperdiff:: ClimaHyperdiffusion , turbconv_model, moisture_model, microphysics_model,
4233)
43-     quadrature_style = 
44-         Spaces. quadrature_style (Spaces. horizontal_space (axes (Y. c)))
34+     quadrature_style =  Spaces. quadrature_style (Spaces. horizontal_space (axes (Y. c)))
4535    FT =  eltype (Y)
4636    n =  n_mass_flux_subdomains (turbconv_model)
4737
@@ -54,9 +44,7 @@ function hyperdiffusion_cache(
5444    )
5545
5646    #  Sub-grid scale quantities
57-     ᶜ∇²uʲs = 
58-         turbconv_model isa  PrognosticEDMFX ?  similar (Y. c, NTuple{n, C123{FT}}) : 
59-         (;)
47+     ᶜ∇²uʲs =  turbconv_model isa  PrognosticEDMFX ?  similar (Y. c, NTuple{n, C123{FT}}) :  (;)
6048    moisture_sgs_quantities = 
6149        moisture_model isa  NonEquilMoistModel && 
6250        microphysics_model isa  Microphysics1Moment ? 
@@ -86,17 +74,13 @@ function hyperdiffusion_cache(
8674            moisture_sgs_quantities... ,
8775        ) :  (;)
8876    maybe_ᶜ∇²tke⁰ = 
89-         use_prognostic_tke (turbconv_model) ?  (; ᶜ∇²tke⁰ =  similar (Y. c, FT)) : 
90-         (;)
77+         use_prognostic_tke (turbconv_model) ?  (; ᶜ∇²tke⁰ =  similar (Y. c, FT)) :  (;)
9178    sgs_quantities =  (; sgs_quantities... , maybe_ᶜ∇²tke⁰... )
9279    quantities =  (; gs_quantities... , sgs_quantities... )
9380    if  do_dss (axes (Y. c))
9481        quantities =  (;
9582            quantities... ,
96-             hyperdiffusion_ghost_buffer =  map (
97-                 Spaces. create_dss_buffer,
98-                 quantities,
99-             ),
83+             hyperdiffusion_ghost_buffer =  map (Spaces. create_dss_buffer, quantities),
10084        )
10185    end 
10286    return  (; quantities... , ᶜ∇²u, ᶜ∇²uʲs)
@@ -115,28 +99,25 @@ NVTX.@annotate function prep_hyperdiffusion_tendency!(Yₜ, Y, p, t)
11599
116100    n =  n_mass_flux_subdomains (turbconv_model)
117101    diffuse_tke =  use_prognostic_tke (turbconv_model)
118-     (; ᶜp) =  p. precomputed
102+     (; ᶜp, ᶜu ) =  p. precomputed
119103    (; ᶜ∇²u, ᶜ∇²specific_energy) =  p. hyperdiff
120104    if  turbconv_model isa  PrognosticEDMFX
121105        (; ᶜ∇²uₕʲs, ᶜ∇²uᵥʲs, ᶜ∇²uʲs, ᶜ∇²mseʲs) =  p. hyperdiff
106+         (; ᶜuʲs) =  p. precomputed
122107    end 
123108
124109    #  Grid scale hyperdiffusion
125-     @.  ᶜ∇²u = 
126-         C123 (wgradₕ (divₕ (p. precomputed. ᶜu))) - 
127-         C123 (wcurlₕ (C123 (curlₕ (p. precomputed. ᶜu))))
110+     @.  ᶜ∇²u =  C123 (wgradₕ (divₕ (ᶜu))) -  C123 (wcurlₕ (C123 (curlₕ (ᶜu))))
128111
129112    ᶜh_ref =  @.  lazy (h_dr (thermo_params, ᶜts, ᶜΦ))
130113
131-     @.  ᶜ∇²specific_energy = 
132-         wdivₕ (gradₕ (specific (Y. c. ρe_tot, Y. c. ρ) +  ᶜp /  Y. c. ρ -  ᶜh_ref))
114+     @.  ᶜ∇²specific_energy =  wdivₕ (gradₕ (specific (Y. c. ρe_tot, Y. c. ρ) +  ᶜp /  Y. c. ρ -  ᶜh_ref))
133115
134116    if  diffuse_tke
135117        ᶜρa⁰ = 
136118            turbconv_model isa  PrognosticEDMFX ? 
137119            (@.  lazy (ρa⁰ (Y. c. ρ, Y. c. sgsʲs, turbconv_model))) :  Y. c. ρ
138-         ᶜtke⁰ = 
139-             @.  lazy (specific_tke (Y. c. ρ, Y. c. sgs⁰. ρatke, ᶜρa⁰, turbconv_model))
120+         ᶜtke⁰ =  @.  lazy (specific_tke (Y. c. ρ, Y. c. sgs⁰. ρatke, ᶜρa⁰, turbconv_model))
140121        (; ᶜ∇²tke⁰) =  p. hyperdiff
141122        @.  ᶜ∇²tke⁰ =  wdivₕ (gradₕ (ᶜtke⁰))
142123    end 
@@ -145,8 +126,7 @@ NVTX.@annotate function prep_hyperdiffusion_tendency!(Yₜ, Y, p, t)
145126    if  turbconv_model isa  PrognosticEDMFX
146127        for  j in  1 : n
147128            @.  ᶜ∇²uʲs.:($$ j) = 
148-                 C123 (wgradₕ (divₕ (p. precomputed. ᶜuʲs.:($$ j)))) - 
149-                 C123 (wcurlₕ (C123 (curlₕ (p. precomputed. ᶜuʲs.:($$ j)))))
129+                 C123 (wgradₕ (divₕ (ᶜuʲs.:($$ j)))) -  C123 (wcurlₕ (C123 (curlₕ (ᶜuʲs.:($$ j)))))
150130            @.  ᶜ∇²mseʲs.:($$ j) =  wdivₕ (gradₕ (Y. c. sgsʲs.:($$ j). mse))
151131            @.  ᶜ∇²uₕʲs.:($$ j) =  C12 (ᶜ∇²uʲs.:($$ j))
152132            @.  ᶜ∇²uᵥʲs.:($$ j) =  C3 (ᶜ∇²uʲs.:($$ j))
@@ -165,11 +145,12 @@ NVTX.@annotate function apply_hyperdiffusion_tendency!(Yₜ, Y, p, t)
165145
166146    n =  n_mass_flux_subdomains (turbconv_model)
167147    diffuse_tke =  use_prognostic_tke (turbconv_model)
148+     ᶜρ =  Y. c. ρ
168149    ᶜJ =  Fields. local_geometry_field (Y. c). J
169150    point_type =  eltype (Fields. coordinate_field (Y. c))
170151    (; ᶜ∇²u, ᶜ∇²specific_energy) =  p. hyperdiff
171152    if  turbconv_model isa  PrognosticEDMFX
172-         ᶜρa⁰ =  @.  lazy (ρa⁰ (Y . c . ρ , Y. c. sgsʲs, turbconv_model))
153+         ᶜρa⁰ =  @.  lazy (ρa⁰ (ᶜρ , Y. c. sgsʲs, turbconv_model))
173154        (; ᶜ∇²uₕʲs, ᶜ∇²uᵥʲs, ᶜ∇²uʲs, ᶜ∇²mseʲs) =  p. hyperdiff
174155    end 
175156    if  use_prognostic_tke (turbconv_model)
@@ -183,13 +164,13 @@ NVTX.@annotate function apply_hyperdiffusion_tendency!(Yₜ, Y, p, t)
183164    end 
184165
185166    #  re-use to store the curl-curl part
186-     @.  ᶜ∇²u = 
167+     ᶜ∇⁴u  =   @.  ᶜ∇²u = 
187168        divergence_damping_factor *  C123 (wgradₕ (divₕ (ᶜ∇²u))) - 
188169        C123 (wcurlₕ (C123 (curlₕ (ᶜ∇²u))))
189-     @.  Yₜ. c. uₕ -=  ν₄_vorticity *  C12 (ᶜ∇² u)
190-     @.  Yₜ. f. u₃ -=  ν₄_vorticity *  ᶠwinterp (ᶜJ *  Y . c . ρ , C3 (ᶜ∇² u))
170+     @.  Yₜ. c. uₕ -=  ν₄_vorticity *  C12 (ᶜ∇⁴ u)
171+     @.  Yₜ. f. u₃ -=  ν₄_vorticity *  ᶠwinterp (ᶜJ *  ᶜρ , C3 (ᶜ∇⁴ u))
191172
192-     @.  Yₜ. c. ρe_tot -=  ν₄_scalar *  wdivₕ (Y . c . ρ  *  gradₕ (ᶜ∇²specific_energy))
173+     @.  Yₜ. c. ρe_tot -=  ν₄_scalar *  wdivₕ (ᶜρ  *  gradₕ (ᶜ∇²specific_energy))
193174
194175    #  Sub-grid scale hyperdiffusion continued
195176    if  (turbconv_model isa  PrognosticEDMFX) &&  diffuse_tke
@@ -199,18 +180,16 @@ NVTX.@annotate function apply_hyperdiffusion_tendency!(Yₜ, Y, p, t)
199180        for  j in  1 : n
200181            if  point_type <:  Geometry.Abstract3DPoint 
201182                #  only need curl-curl part
202-                 @.  ᶜ∇²uᵥʲs.:($$ j) =  C3 (wcurlₕ (C123 (curlₕ (ᶜ∇²uʲs.:($$ j)))))
203-                 @.  Yₜ. f. sgsʲs.:($$ j). u₃ += 
204-                     ν₄_vorticity *  ᶠwinterp (ᶜJ *  Y. c. ρ, ᶜ∇²uᵥʲs.:($$ j))
183+                 ᶜ∇⁴uᵥʲ =  @.  ᶜ∇²uᵥʲs.:($$ j) =  C3 (wcurlₕ (C123 (curlₕ (ᶜ∇²uʲs.:($$ j)))))
184+                 @.  Yₜ. f. sgsʲs.:($$ j). u₃ +=  ν₄_vorticity *  ᶠwinterp (ᶜJ *  ᶜρ, ᶜ∇⁴uᵥʲ)
205185            end 
206186            #  Note: It is more correct to have ρa inside and outside the divergence
207-             @.  Yₜ. c. sgsʲs.:($$ j). mse -= 
208-                 ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²mseʲs.:($$ j)))
187+             @.  Yₜ. c. sgsʲs.:($$ j). mse -=  ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²mseʲs.:($$ j)))
209188        end 
210189    end 
211190
212191    if  turbconv_model isa  DiagnosticEDMFX &&  diffuse_tke
213-         @.  Yₜ. c. sgs⁰. ρatke -=  ν₄_vorticity *  wdivₕ (Y . c . ρ  *  gradₕ (ᶜ∇²tke⁰))
192+         @.  Yₜ. c. sgs⁰. ρatke -=  ν₄_vorticity *  wdivₕ (ᶜρ  *  gradₕ (ᶜ∇²tke⁰))
214193    end 
215194end 
216195
@@ -268,15 +247,14 @@ function dss_hyperdiffusion_tendency_pairs(p)
268247            p. hyperdiff. ᶜ∇²q_liqʲs =>  buffer. ᶜ∇²q_liqʲs,
269248            p. hyperdiff. ᶜ∇²q_raiʲs =>  buffer. ᶜ∇²q_raiʲs,
270249        ) :  ()
271-     tracer_pairs = 
272-         (core_tracer_pairs... , tc_tracer_pairs... , tc_moisture_pairs... )
250+     tracer_pairs =  (core_tracer_pairs... , tc_tracer_pairs... , tc_moisture_pairs... )
273251    return  (dynamics_pairs... , tracer_pairs... )
274252end 
275253
276254#  This should prep variables that we will dss in
277255#  dss_hyperdiffusion_tendency_pairs
278256NVTX. @annotate  function  prep_tracer_hyperdiffusion_tendency! (Yₜ, Y, p, t)
279-     (; hyperdiff, turbconv_model) =  p. atmos
257+     (; hyperdiff, turbconv_model, moisture_model, microphysics_model ) =  p. atmos
280258    isnothing (hyperdiff) &&  return  nothing 
281259
282260    (; ᶜ∇²specific_tracers) =  p. hyperdiff
@@ -294,8 +272,8 @@ NVTX.@annotate function prep_tracer_hyperdiffusion_tendency!(Yₜ, Y, p, t)
294272            #  Note: It is more correct to have ρa inside and outside the divergence
295273            @.  ᶜ∇²q_totʲs.:($$ j) =  wdivₕ (gradₕ (Y. c. sgsʲs.:($$ j). q_tot))
296274        end 
297-         if  p . atmos . moisture_model isa  NonEquilMoistModel && 
298-            p . atmos . microphysics_model isa  Microphysics1Moment
275+         if  moisture_model isa  NonEquilMoistModel && 
276+            microphysics_model isa  Microphysics1Moment
299277            (; ᶜ∇²q_liqʲs, ᶜ∇²q_iceʲs, ᶜ∇²q_raiʲs, ᶜ∇²q_snoʲs) =  p. hyperdiff
300278            for  j in  1 : n
301279                #  Note: It is more correct to have ρa inside and outside the divergence
@@ -304,16 +282,10 @@ NVTX.@annotate function prep_tracer_hyperdiffusion_tendency!(Yₜ, Y, p, t)
304282                @.  ᶜ∇²q_raiʲs.:($$ j) =  wdivₕ (gradₕ (Y. c. sgsʲs.:($$ j). q_rai))
305283                @.  ᶜ∇²q_snoʲs.:($$ j) =  wdivₕ (gradₕ (Y. c. sgsʲs.:($$ j). q_sno))
306284            end 
307-         elseif  p. atmos. moisture_model isa  NonEquilMoistModel && 
308-                p. atmos. microphysics_model isa  Microphysics2Moment
309-             (;
310-                 ᶜ∇²q_liqʲs,
311-                 ᶜ∇²q_iceʲs,
312-                 ᶜ∇²q_raiʲs,
313-                 ᶜ∇²q_snoʲs,
314-                 ᶜ∇²n_liqʲs,
315-                 ᶜ∇²n_raiʲs,
316-             ) =  p. hyperdiff
285+         elseif  moisture_model isa  NonEquilMoistModel && 
286+                microphysics_model isa  Microphysics2Moment
287+             (; ᶜ∇²q_liqʲs, ᶜ∇²q_iceʲs, ᶜ∇²q_raiʲs, ᶜ∇²q_snoʲs, ᶜ∇²n_liqʲs, ᶜ∇²n_raiʲs) = 
288+                 p. hyperdiff
317289            for  j in  1 : n
318290                #  Note: It is more correct to have ρa inside and outside the divergence
319291                @.  ᶜ∇²q_liqʲs.:($$ j) =  wdivₕ (gradₕ (Y. c. sgsʲs.:($$ j). q_liq))
331303#  This requires dss to have been called on
332304#  variables in dss_hyperdiffusion_tendency_pairs
333305NVTX. @annotate  function  apply_tracer_hyperdiffusion_tendency! (Yₜ, Y, p, t)
334-     (; hyperdiff, turbconv_model) =  p. atmos
306+     (; hyperdiff, turbconv_model, moisture_model, microphysics_model ) =  p. atmos
335307    isnothing (hyperdiff) &&  return  nothing 
336308
337309    #  Rescale the hyperdiffusivity for precipitating species.
@@ -359,41 +331,28 @@ NVTX.@annotate function apply_tracer_hyperdiffusion_tendency!(Yₜ, Y, p, t)
359331        (; ᶜ∇²q_totʲs) =  p. hyperdiff
360332        for  j in  1 : n
361333            @.  Yₜ. c. sgsʲs.:($$ j). ρa -= 
362-                 ν₄_scalar * 
363-                 wdivₕ (Y. c. sgsʲs.:($$ j). ρa *  gradₕ (ᶜ∇²q_totʲs.:($$ j)))
364-             @.  Yₜ. c. sgsʲs.:($$ j). q_tot -= 
365-                 ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_totʲs.:($$ j)))
334+                 ν₄_scalar *  wdivₕ (Y. c. sgsʲs.:($$ j). ρa *  gradₕ (ᶜ∇²q_totʲs.:($$ j)))
335+             @.  Yₜ. c. sgsʲs.:($$ j). q_tot -=  ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_totʲs.:($$ j)))
366336        end 
367-         if  p . atmos . moisture_model isa  NonEquilMoistModel && 
368-            p . atmos . microphysics_model isa  Microphysics1Moment
337+         if  moisture_model isa  NonEquilMoistModel && 
338+            microphysics_model isa  Microphysics1Moment
369339            (; ᶜ∇²q_liqʲs, ᶜ∇²q_iceʲs, ᶜ∇²q_raiʲs, ᶜ∇²q_snoʲs) =  p. hyperdiff
370340            for  j in  1 : n
371-                 @.  Yₜ. c. sgsʲs.:($$ j). q_liq -= 
372-                     ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_liqʲs.:($$ j)))
373-                 @.  Yₜ. c. sgsʲs.:($$ j). q_ice -= 
374-                     ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_iceʲs.:($$ j)))
341+                 @.  Yₜ. c. sgsʲs.:($$ j). q_liq -=  ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_liqʲs.:($$ j)))
342+                 @.  Yₜ. c. sgsʲs.:($$ j). q_ice -=  ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_iceʲs.:($$ j)))
375343                @.  Yₜ. c. sgsʲs.:($$ j). q_rai -= 
376344                    ν₄_scalar_for_precip *  wdivₕ (gradₕ (ᶜ∇²q_raiʲs.:($$ j)))
377345                @.  Yₜ. c. sgsʲs.:($$ j). q_sno -= 
378346                    ν₄_scalar_for_precip *  wdivₕ (gradₕ (ᶜ∇²q_snoʲs.:($$ j)))
379347            end 
380-         elseif  p. atmos. moisture_model isa  NonEquilMoistModel && 
381-                p. atmos. microphysics_model isa  Microphysics2Moment
382-             (;
383-                 ᶜ∇²q_liqʲs,
384-                 ᶜ∇²q_iceʲs,
385-                 ᶜ∇²q_raiʲs,
386-                 ᶜ∇²q_snoʲs,
387-                 ᶜ∇²n_liqʲs,
388-                 ᶜ∇²n_raiʲs,
389-             ) =  p. hyperdiff
348+         elseif  moisture_model isa  NonEquilMoistModel && 
349+                microphysics_model isa  Microphysics2Moment
350+             (; ᶜ∇²q_liqʲs, ᶜ∇²q_iceʲs, ᶜ∇²q_raiʲs, ᶜ∇²q_snoʲs, ᶜ∇²n_liqʲs, ᶜ∇²n_raiʲs) = 
351+                 p. hyperdiff
390352            for  j in  1 : n
391-                 @.  Yₜ. c. sgsʲs.:($$ j). q_liq -= 
392-                     ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_liqʲs.:($$ j)))
393-                 @.  Yₜ. c. sgsʲs.:($$ j). q_ice -= 
394-                     ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_iceʲs.:($$ j)))
395-                 @.  Yₜ. c. sgsʲs.:($$ j). n_liq -= 
396-                     ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²n_liqʲs.:($$ j)))
353+                 @.  Yₜ. c. sgsʲs.:($$ j). q_liq -=  ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_liqʲs.:($$ j)))
354+                 @.  Yₜ. c. sgsʲs.:($$ j). q_ice -=  ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²q_iceʲs.:($$ j)))
355+                 @.  Yₜ. c. sgsʲs.:($$ j). n_liq -=  ν₄_scalar *  wdivₕ (gradₕ (ᶜ∇²n_liqʲs.:($$ j)))
397356                @.  Yₜ. c. sgsʲs.:($$ j). q_rai -= 
398357                    ν₄_scalar_for_precip *  wdivₕ (gradₕ (ᶜ∇²q_raiʲs.:($$ j)))
399358                @.  Yₜ. c. sgsʲs.:($$ j). q_sno -= 
0 commit comments