ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_Diffusion.H
Go to the documentation of this file.
1 /** \file ERF_Diffusion.H */
2 
3 #ifndef ERF_DIFFUSION_H_
4 #define ERF_DIFFUSION_H_
5 
6 #include "AMReX.H"
7 #include "AMReX_MultiFab.H"
8 #include "AMReX_BCRec.H"
9 
10 #include "ERF_DataStruct.H"
11 #include "ERF_IndexDefines.H"
12 #include "ERF_SurfaceLayer.H"
13 #include "ERF_EB.H"
14 #include "ERF_ScalarDiffusion.H"
15 
16 /** \brief Add stress-divergence diffusion source terms to the momentum RHS. */
17 void DiffusionSrcForMom (const amrex::Box& bxx, const amrex::Box& bxy, const amrex::Box& bxz,
18  const amrex::Array4< amrex::Real>& rho_u_rhs,
19  const amrex::Array4< amrex::Real>& rho_v_rhs,
20  const amrex::Array4< amrex::Real>& rho_w_rhs,
21  const amrex::Array4<const amrex::Real>& tau11 ,
22  const amrex::Array4<const amrex::Real>& tau22 ,
23  const amrex::Array4<const amrex::Real>& tau33 ,
24  const amrex::Array4<const amrex::Real>& tau12 , const amrex::Array4<const amrex::Real>& tau21,
25  const amrex::Array4<const amrex::Real>& tau13 , const amrex::Array4<const amrex::Real>& tau31,
26  const amrex::Array4<const amrex::Real>& tau23 , const amrex::Array4<const amrex::Real>& tau32,
27  const amrex::Array4<const amrex::Real>& detJ_arr ,
28  const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
29  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
30  const amrex::Array4<const amrex::Real>& mf_mx ,
31  const amrex::Array4<const amrex::Real>& mf_ux ,
32  const amrex::Array4<const amrex::Real>& mf_vx ,
33  const amrex::Array4<const amrex::Real>& mf_my ,
34  const amrex::Array4<const amrex::Real>& mf_uy ,
35  const amrex::Array4<const amrex::Real>& mf_vy ,
36  const bool use_stretched_dz, const bool use_variable_dz);
37 
38 /** \brief Add embedded-boundary stress-divergence diffusion source terms to the momentum RHS. */
39 void DiffusionSrcForMom_EB (const amrex::MFIter& mfi,
40  [[maybe_unused]] const amrex::Box& domain,
41  const amrex::Box& bxx, const amrex::Box& bxy, const amrex::Box& bxz,
42  const amrex::Array4< amrex::Real>& rho_u_rhs,
43  const amrex::Array4< amrex::Real>& rho_v_rhs,
44  const amrex::Array4< amrex::Real>& rho_w_rhs,
45  const amrex::Array4<const amrex::Real>& u_arr ,
46  const amrex::Array4<const amrex::Real>& v_arr ,
47  const amrex::Array4<const amrex::Real>& w_arr ,
48  const amrex::Array4<const amrex::Real>& tau11 ,
49  const amrex::Array4<const amrex::Real>& tau22 ,
50  const amrex::Array4<const amrex::Real>& tau33 ,
51  const amrex::Array4<const amrex::Real>& tau12 ,
52  const amrex::Array4<const amrex::Real>& tau13 ,
53  const amrex::Array4<const amrex::Real>& tau23 ,
54  const amrex::Array4<const amrex::Real>& u_tau_eb13 ,
55  const amrex::Array4<const amrex::Real>& u_tau_eb23 ,
56  const amrex::Array4<const amrex::Real>& v_tau_eb13 ,
57  const amrex::Array4<const amrex::Real>& v_tau_eb23 ,
58  const amrex::Array4<const amrex::Real>& w_tau_eb13 ,
59  const amrex::Array4<const amrex::Real>& w_tau_eb23 ,
60  const amrex::Real* dx_arr,
61  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
62  const amrex::Array4<const amrex::Real>& mf_mx ,
63  const amrex::Array4<const amrex::Real>& mf_ux ,
64  const amrex::Array4<const amrex::Real>& mf_vx ,
65  const amrex::Array4<const amrex::Real>& mf_my ,
66  const amrex::Array4<const amrex::Real>& mf_uy ,
67  const amrex::Array4<const amrex::Real>& mf_vy ,
68  const SolverChoice& solverChoice,
69  const eb_& ebfact,
70  [[maybe_unused]] const amrex::BCRec* bc_ptr);
71 
72 /**
73  * \brief Add regular-grid state diffusion on a uniform grid without terrain.
74  *
75  * This public routine is the native adapter: for each conserved component it
76  * resolves `scalar_comp = qty_comp - 1`, the coefficient/eddy category, BC
77  * slot, prescribed surface fluxes, diagnostic outputs, scratch `flux_comp`,
78  * and tendency `rhs_comp`. The component-explicit numerical face operators
79  * are declared in ERF_ScalarDiffusion.H and do not infer those selections
80  * from a conserved-state index. Their molecular coefficient is kinematic
81  * alpha with ConstantAlpha and density-weighted rhoAlpha with Constant.
82  * `rho_comp` selects density independently when ConstantAlpha is used;
83  * `eddy_h_comp` and `eddy_v_comp` select density-weighted turbulence
84  * coefficients independently of the scalar storage component.
85  *
86  * The raw vertical face flux is `F_z = -K d_z(chi)`. On terrain the
87  * transformed vertical numerator is
88  * `G_z = F_z - m_x h_xi Fbar_x - m_y h_eta Fbar_y`, and the mapped
89  * conservative transfer is `T_z = G_z/(m_x m_y)`. These quantities have
90  * distinct meanings. Semi-implicit integration scales only raw `F_z`; the
91  * terrain cross terms remain explicit.
92  */
93 void DiffusionSrcForState_N (const amrex::Box& bx, const amrex::Box& domain,
94  int start_comp, int num_comp,
95  const amrex::Array4<const amrex::Real>& u,
96  const amrex::Array4<const amrex::Real>& v,
97  const amrex::Array4<const amrex::Real>& cell_data,
98  const amrex::Array4<const amrex::Real>& cell_prim,
99  const amrex::Array4<amrex::Real>& cell_rhs,
100  const amrex::Array4<amrex::Real>& xflux,
101  const amrex::Array4<amrex::Real>& yflux,
102  const amrex::Array4<amrex::Real>& zflux,
103  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
104  const amrex::Array4<const amrex::Real>& mf_mx,
105  const amrex::Array4<const amrex::Real>& mf_ux,
106  const amrex::Array4<const amrex::Real>& mf_vx,
107  const amrex::Array4<const amrex::Real>& mf_my,
108  const amrex::Array4<const amrex::Real>& mf_uy,
109  const amrex::Array4<const amrex::Real>& mf_vy,
110  amrex::Array4< amrex::Real>& hfx_x,
111  amrex::Array4< amrex::Real>& hfx_y,
112  amrex::Array4< amrex::Real>& hfx_z,
113  amrex::Array4< amrex::Real>& qfx1_x,
114  amrex::Array4< amrex::Real>& qfx1_y,
115  amrex::Array4< amrex::Real>& qfx1_z,
116  amrex::Array4< amrex::Real>& qfx2_z,
117  const amrex::Array4<const amrex::Real>& mu_turb,
118  const SolverChoice& solverChoice,
119  const int level,
120  const amrex::BCRec* bc_ptr,
121  const bool use_SurfLayer,
122  const amrex::Vector<std::unique_ptr<SurfaceLayer>>& SurfLayer,
123  const amrex::Real implicit_fac,
124  const ScalarDiffusionRefluxViews* reflux_flx = nullptr,
125  const amrex::Array4<const amrex::Real>& wall_face33 = amrex::Array4<const amrex::Real>{},
126  const amrex::Array4<const amrex::Real>& wall_hfx = amrex::Array4<const amrex::Real>{});
127 
128 /** \brief Native adapter for regular scalar diffusion on a vertically stretched grid. */
129 void DiffusionSrcForState_S (const amrex::Box& bx, const amrex::Box& domain,
130  int start_comp, int num_comp,
131  const amrex::Array4<const amrex::Real>& cell_data,
132  const amrex::Array4<const amrex::Real>& cell_prim,
133  const amrex::Array4<amrex::Real>& cell_rhs,
134  const amrex::Array4<amrex::Real>& xflux,
135  const amrex::Array4<amrex::Real>& yflux,
136  const amrex::Array4<amrex::Real>& zflux,
137  const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
138  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
139  const amrex::Array4<const amrex::Real>& mf_mx,
140  const amrex::Array4<const amrex::Real>& mf_ux,
141  const amrex::Array4<const amrex::Real>& mf_vx,
142  const amrex::Array4<const amrex::Real>& mf_my,
143  const amrex::Array4<const amrex::Real>& mf_uy,
144  const amrex::Array4<const amrex::Real>& mf_vy,
145  amrex::Array4< amrex::Real>& hfx_x,
146  amrex::Array4< amrex::Real>& hfx_y,
147  amrex::Array4< amrex::Real>& hfx_z,
148  amrex::Array4< amrex::Real>& qfx1_x,
149  amrex::Array4< amrex::Real>& qfx1_y,
150  amrex::Array4< amrex::Real>& qfx1_z,
151  amrex::Array4< amrex::Real>& qfx2_z,
152  const amrex::Array4<const amrex::Real>& mu_turb,
153  const SolverChoice& solverChoice,
154  const int level,
155  const amrex::BCRec* bc_ptr,
156  const bool use_SurfLayer,
157  const amrex::Vector<std::unique_ptr<SurfaceLayer>>& SurfLayer,
158  const amrex::Real implicit_fac,
159  const ScalarDiffusionRefluxViews* reflux_flx = nullptr);
160 
161 /** \brief Native adapter for regular scalar diffusion on terrain-following coordinates. */
162 void DiffusionSrcForState_T (const amrex::Box& bx, const amrex::Box& domain,
163  int start_comp, int num_comp,
164  const bool& rotate,
165  const amrex::Array4<const amrex::Real>& cell_data,
166  const amrex::Array4<const amrex::Real>& cell_prim,
167  const amrex::Array4<amrex::Real>& cell_rhs,
168  const amrex::Array4<amrex::Real>& xflux,
169  const amrex::Array4<amrex::Real>& yflux,
170  const amrex::Array4<amrex::Real>& zflux,
171  const amrex::Array4<const amrex::Real>& z_nd,
172  const amrex::Array4<const amrex::Real>& z_cc,
173  const amrex::Array4<const amrex::Real>& ax,
174  const amrex::Array4<const amrex::Real>& ay,
175  const amrex::Array4<const amrex::Real>& az,
176  const amrex::Array4<const amrex::Real>& detJ,
177  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
178  const amrex::Array4<const amrex::Real>& mf_mx,
179  const amrex::Array4<const amrex::Real>& mf_ux,
180  const amrex::Array4<const amrex::Real>& mf_vx,
181  const amrex::Array4<const amrex::Real>& mf_my,
182  const amrex::Array4<const amrex::Real>& mf_uy,
183  const amrex::Array4<const amrex::Real>& mf_vy,
184  amrex::Array4< amrex::Real>& hfx_x,
185  amrex::Array4< amrex::Real>& hfx_y,
186  amrex::Array4< amrex::Real>& hfx_z,
187  amrex::Array4< amrex::Real>& qfx1_x,
188  amrex::Array4< amrex::Real>& qfx1_y,
189  amrex::Array4< amrex::Real>& qfx1_z,
190  amrex::Array4< amrex::Real>& qfx2_z,
191  const amrex::Array4<const amrex::Real>& mu_turb,
192  const SolverChoice& solverChoice,
193  const int level,
194  const amrex::BCRec* bc_ptr,
195  const amrex::BCRec* bc_ptr_h,
196  const bool use_SurfLayer,
197  const amrex::Vector<std::unique_ptr<SurfaceLayer>>& SurfLayer,
198  const amrex::Real implicit_fac,
199  const ScalarDiffusionRefluxViews* reflux_flx = nullptr);
200 
201 /** \brief The implicit part of the vertical diffusive flux of one component, for refluxing (flat mesh). */
202 void ImplicitVerticalFluxForReflux_N (const amrex::Box& bx, const amrex::Box& domain,
203  const int level, const int n, const amrex::Real implicit_fac,
204  const amrex::Array4<const amrex::Real>& cell_data,
205  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
206  const amrex::Array4<const amrex::Real>& mu_turb,
207  const SolverChoice& solverChoice,
208  const amrex::Array4<const amrex::Real>& mf_mx,
209  const amrex::Array4<const amrex::Real>& mf_my,
210  const bool use_mrf_countergradient,
211  const amrex::Array4< amrex::Real>& zflux);
212 
213 /** \brief As ImplicitVerticalFluxForReflux_N, on a vertically stretched mesh. */
214 void ImplicitVerticalFluxForReflux_S (const amrex::Box& bx, const amrex::Box& domain,
215  const int level, const int n, const amrex::Real implicit_fac,
216  const amrex::Array4<const amrex::Real>& cell_data,
217  const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
218  const amrex::Array4<const amrex::Real>& mu_turb,
219  const SolverChoice& solverChoice,
220  const amrex::Array4<const amrex::Real>& mf_mx,
221  const amrex::Array4<const amrex::Real>& mf_my,
222  const bool use_mrf_countergradient,
223  const amrex::Array4< amrex::Real>& zflux);
224 
225 /** \brief As ImplicitVerticalFluxForReflux_N, on a terrain-following mesh. */
226 void ImplicitVerticalFluxForReflux_T (const amrex::Box& bx, const amrex::Box& domain,
227  const int level, const int n, const amrex::Real implicit_fac,
228  const amrex::Array4<const amrex::Real>& cell_data,
229  const amrex::Array4<const amrex::Real>& z_nd,
230  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
231  const amrex::Array4<const amrex::Real>& mu_turb,
232  const SolverChoice& solverChoice,
233  const amrex::Array4<const amrex::Real>& mf_mx,
234  const amrex::Array4<const amrex::Real>& mf_my,
235  const bool implicit_metric,
236  const bool use_mrf_countergradient,
237  const amrex::Array4< amrex::Real>& zflux);
238 
239 /** \brief Add state diffusion source terms for embedded-boundary cells. */
240 void DiffusionSrcForState_EB (const amrex::Box& bx, const amrex::Box& domain,
241  int start_comp, int num_comp,
242  const amrex::Array4<const amrex::Real>& u,
243  const amrex::Array4<const amrex::Real>& v,
244  const amrex::Array4<const amrex::Real>& cell_data,
245  const amrex::Array4<const amrex::Real>& cell_prim,
246  const amrex::Array4<amrex::Real>& cell_rhs,
247  const amrex::Array4<amrex::Real>& xflux,
248  const amrex::Array4<amrex::Real>& yflux,
249  const amrex::Array4<amrex::Real>& zflux,
250  const amrex::Array4<const amrex::EBCellFlag>& cfg_arr,
251  const amrex::Array4<const amrex::Real>& ax_arr,
252  const amrex::Array4<const amrex::Real>& ay_arr,
253  const amrex::Array4<const amrex::Real>& az_arr,
254  const amrex::Array4<const amrex::Real>& detJ,
255  const amrex::Array4<const amrex::Real>& barea_arr,
256  const amrex::Array4<const amrex::Real>& bcent_arr,
257  const amrex::Real* dx_arr,
258  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
259  amrex::Array4< amrex::Real>& hfx_z,
260  amrex::Array4< amrex::Real>& qfx1_z,
261  amrex::Array4< amrex::Real>& qfx2_z,
262  amrex::Array4< amrex::Real>& hfx_EB,
263  const amrex::Array4<const amrex::Real>& mu_turb,
264  const SolverChoice& solverChoice,
265  const int level,
266  const amrex::BCRec* bc_ptr,
267  const bool use_SurfLayer,
268  const amrex::Vector<std::unique_ptr<SurfaceLayer>>& SurfLayer);
269 
270 /** \brief Compute embedded-boundary stress components for constant viscosity. */
271 void ComputeStressConsVisc_EB (amrex::Box bxcc,
272  amrex::Box tbxxy,
273  amrex::Box tbxxz,
274  amrex::Box tbxyz,
275  amrex::Real mu_eff,
276  const amrex::Array4<const amrex::Real>& cell_data,
277  amrex::Array4<amrex::Real>& tau11,
278  amrex::Array4<amrex::Real>& tau22,
279  amrex::Array4<amrex::Real>& tau33,
280  amrex::Array4<amrex::Real>& tau12,
281  amrex::Array4<amrex::Real>& tau13,
282  amrex::Array4<amrex::Real>& tau23,
283  const amrex::Array4<const amrex::Real>& er_arr,
284  amrex::Array4<const amrex::Real>& vfrac,
285  amrex::Array4<amrex::Real>& tau13i,
286  amrex::Array4<amrex::Real>& tau23i);
287 
288 /** \brief Compute stress components for constant viscosity on a uniform grid without terrain. */
289 void ComputeStressConsVisc_N (amrex::Box bxcc,
290  amrex::Box tbxxy,
291  amrex::Box tbxxz,
292  amrex::Box tbxyz,
293  amrex::Real mu_eff,
294  const amrex::Array4<const amrex::Real>& cell_data,
295  amrex::Array4<amrex::Real>& tau11,
296  amrex::Array4<amrex::Real>& tau22,
297  amrex::Array4<amrex::Real>& tau33,
298  amrex::Array4<amrex::Real>& tau12,
299  amrex::Array4<amrex::Real>& tau13,
300  amrex::Array4<amrex::Real>& tau23,
301  const amrex::Array4<const amrex::Real>& er_arr,
302  amrex::Array4<amrex::Real>& tau13i,
303  amrex::Array4<amrex::Real>& tau23i);
304 
305 /** \brief Compute stress components for constant viscosity on a vertically stretched grid. */
306 void ComputeStressConsVisc_S (amrex::Box bxcc,
307  amrex::Box tbxxy,
308  amrex::Box tbxxz,
309  amrex::Box tbxyz,
310  amrex::Real mu_eff,
311  const amrex::Array4<const amrex::Real>& cell_data,
312  amrex::Array4<amrex::Real>& tau11,
313  amrex::Array4<amrex::Real>& tau22,
314  amrex::Array4<amrex::Real>& tau33,
315  amrex::Array4<amrex::Real>& tau12, amrex::Array4<amrex::Real>& tau21,
316  amrex::Array4<amrex::Real>& tau13, amrex::Array4<amrex::Real>& tau31,
317  amrex::Array4<amrex::Real>& tau23, amrex::Array4<amrex::Real>& tau32,
318  const amrex::Array4<const amrex::Real>& er_arr,
319  const amrex::Array4<const amrex::Real>& mf_mx,
320  const amrex::Array4<const amrex::Real>& mf_ux,
321  const amrex::Array4<const amrex::Real>& mf_vx,
322  const amrex::Array4<const amrex::Real>& mf_my,
323  const amrex::Array4<const amrex::Real>& mf_uy,
324  const amrex::Array4<const amrex::Real>& mf_vy,
325  amrex::Array4<amrex::Real>& tau13i,
326  amrex::Array4<amrex::Real>& tau23i);
327 
328 /** \brief Compute stress components for constant viscosity on terrain-following coordinates. */
329 void ComputeStressConsVisc_T (amrex::Box bxcc,
330  amrex::Box tbxxy,
331  amrex::Box tbxxz,
332  amrex::Box tbxyz,
333  amrex::Real mu_eff,
334  const amrex::Array4<const amrex::Real>& cell_data,
335  amrex::Array4<amrex::Real>& tau11,
336  amrex::Array4<amrex::Real>& tau22,
337  amrex::Array4<amrex::Real>& tau33,
338  amrex::Array4<amrex::Real>& tau12, amrex::Array4<amrex::Real>& tau21,
339  amrex::Array4<amrex::Real>& tau13, amrex::Array4<amrex::Real>& tau31,
340  amrex::Array4<amrex::Real>& tau23, amrex::Array4<amrex::Real>& tau32,
341  const amrex::Array4<const amrex::Real>& er_arr,
342  const amrex::Array4<const amrex::Real>& z_nd,
343  const amrex::Array4<const amrex::Real>& detJ,
344  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
345  const amrex::Array4<const amrex::Real>& mf_mx,
346  const amrex::Array4<const amrex::Real>& mf_ux,
347  const amrex::Array4<const amrex::Real>& mf_vx,
348  const amrex::Array4<const amrex::Real>& mf_my,
349  const amrex::Array4<const amrex::Real>& mf_uy,
350  const amrex::Array4<const amrex::Real>& mf_vy,
351  amrex::Array4<amrex::Real>& tau13i,
352  amrex::Array4<amrex::Real>& tau23i,
353  const bool implicit_metric);
354 
355 /** \brief Compute embedded-boundary stress components for variable viscosity. */
356 void ComputeStressVarVisc_EB (amrex::Box bxcc,
357  amrex::Box tbxxy,
358  amrex::Box tbxxz,
359  amrex::Box tbxyz,
360  amrex::Real mu_eff,
361  const amrex::Array4<const amrex::Real>& mu_turb,
362  const amrex::Array4<const amrex::Real>& cell_data,
363  amrex::Array4<amrex::Real>& tau11,
364  amrex::Array4<amrex::Real>& tau22,
365  amrex::Array4<amrex::Real>& tau33,
366  amrex::Array4<amrex::Real>& tau12,
367  amrex::Array4<amrex::Real>& tau13,
368  amrex::Array4<amrex::Real>& tau23,
369  const amrex::Array4<const amrex::Real>& er_arr,
370  amrex::Array4<const amrex::Real>& vfrac,
371  amrex::Array4<amrex::Real>& tau13i,
372  amrex::Array4<amrex::Real>& tau23i);
373 
374 /** \brief Compute stress components for variable viscosity on a uniform grid without terrain. */
375 void ComputeStressVarVisc_N (amrex::Box bxcc,
376  amrex::Box tbxxy,
377  amrex::Box tbxxz,
378  amrex::Box tbxyz,
379  amrex::Real mu_eff,
380  const amrex::Array4<const amrex::Real>& mu_turb,
381  const amrex::Array4<const amrex::Real>& cell_data,
382  amrex::Array4<amrex::Real>& tau11,
383  amrex::Array4<amrex::Real>& tau22,
384  amrex::Array4<amrex::Real>& tau33,
385  amrex::Array4<amrex::Real>& tau12,
386  amrex::Array4<amrex::Real>& tau13,
387  amrex::Array4<amrex::Real>& tau23,
388  const amrex::Array4<const amrex::Real>& er_arr,
389  amrex::Array4<amrex::Real>& tau13i,
390  amrex::Array4<amrex::Real>& tau23i);
391 
392 /** \brief Compute stress components for variable viscosity on a vertically stretched grid. */
393 void ComputeStressVarVisc_S (amrex::Box bxcc,
394  amrex::Box tbxxy,
395  amrex::Box tbxxz,
396  amrex::Box tbxyz,
397  amrex::Real mu_eff,
398  const amrex::Array4<const amrex::Real>& mu_turb,
399  const amrex::Array4<const amrex::Real>& cell_data,
400  amrex::Array4<amrex::Real>& tau11,
401  amrex::Array4<amrex::Real>& tau22,
402  amrex::Array4<amrex::Real>& tau33,
403  amrex::Array4<amrex::Real>& tau12, amrex::Array4<amrex::Real>& tau21,
404  amrex::Array4<amrex::Real>& tau13, amrex::Array4<amrex::Real>& tau31,
405  amrex::Array4<amrex::Real>& tau23, amrex::Array4<amrex::Real>& tau32,
406  const amrex::Array4<const amrex::Real>& er_arr,
407  const amrex::Array4<const amrex::Real>& mf_mx,
408  const amrex::Array4<const amrex::Real>& mf_ux,
409  const amrex::Array4<const amrex::Real>& mf_vx,
410  const amrex::Array4<const amrex::Real>& mf_my,
411  const amrex::Array4<const amrex::Real>& mf_uy,
412  const amrex::Array4<const amrex::Real>& mf_vy,
413  amrex::Array4<amrex::Real>& tau13i,
414  amrex::Array4<amrex::Real>& tau23i);
415 
416 /** \brief Compute stress components for variable viscosity on terrain-following coordinates. */
417 void ComputeStressVarVisc_T (amrex::Box bxcc,
418  amrex::Box tbxxy,
419  amrex::Box tbxxz,
420  amrex::Box tbxyz,
421  amrex::Real mu_eff,
422  const amrex::Array4<const amrex::Real>& mu_turb,
423  const amrex::Array4<const amrex::Real>& cell_data,
424  amrex::Array4<amrex::Real>& tau11,
425  amrex::Array4<amrex::Real>& tau22,
426  amrex::Array4<amrex::Real>& tau33,
427  amrex::Array4<amrex::Real>& tau12, amrex::Array4<amrex::Real>& tau21,
428  amrex::Array4<amrex::Real>& tau13, amrex::Array4<amrex::Real>& tau31,
429  amrex::Array4<amrex::Real>& tau23, amrex::Array4<amrex::Real>& tau32,
430  const amrex::Array4<const amrex::Real>& er_arr,
431  const amrex::Array4<const amrex::Real>& z_nd,
432  const amrex::Array4<const amrex::Real>& detJ,
433  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
434  const amrex::Array4<const amrex::Real>& mf_mx,
435  const amrex::Array4<const amrex::Real>& mf_ux,
436  const amrex::Array4<const amrex::Real>& mf_vx,
437  const amrex::Array4<const amrex::Real>& mf_my,
438  const amrex::Array4<const amrex::Real>& mf_uy,
439  const amrex::Array4<const amrex::Real>& mf_vy,
440  amrex::Array4<amrex::Real>& tau13i,
441  amrex::Array4<amrex::Real>& tau23i,
442  const bool implicit_metric);
443 
444 /** \brief Compute embedded-boundary strain-rate components. */
445 void ComputeStrain_EB (const amrex::MFIter& mfi,
446  amrex::Box bxcc, amrex::Box tbxxy,
447  amrex::Box tbxxz, amrex::Box tbxyz, amrex::Box domain,
448  const amrex::Array4<const amrex::Real>& u,
449  const amrex::Array4<const amrex::Real>& v,
450  const amrex::Array4<const amrex::Real>& w,
451  amrex::Array4<amrex::Real>& tau11,
452  amrex::Array4<amrex::Real>& tau22,
453  amrex::Array4<amrex::Real>& tau33,
454  amrex::Array4<amrex::Real>& tau12,
455  amrex::Array4<amrex::Real>& tau13,
456  amrex::Array4<amrex::Real>& tau23,
457  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
458  const amrex::BCRec* bc_ptr,
459  const eb_& ebfact,
460  amrex::Array4<amrex::Real>& tau13i,
461  amrex::Array4<amrex::Real>& tau23i);
462 
463 /** \brief Compute strain-rate components on a uniform grid without terrain. */
464 void ComputeStrain_N (amrex::Box bxcc, amrex::Box tbxxy,
465  amrex::Box tbxxz, amrex::Box tbxyz, amrex::Box domain,
466  const amrex::Array4<const amrex::Real>& u,
467  const amrex::Array4<const amrex::Real>& v,
468  const amrex::Array4<const amrex::Real>& w,
469  amrex::Array4<amrex::Real>& tau11,
470  amrex::Array4<amrex::Real>& tau22,
471  amrex::Array4<amrex::Real>& tau33,
472  amrex::Array4<amrex::Real>& tau12,
473  amrex::Array4<amrex::Real>& tau13,
474  amrex::Array4<amrex::Real>& tau23,
475  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
476  const amrex::Array4<const amrex::Real>& mf_mx,
477  const amrex::Array4<const amrex::Real>& mf_ux,
478  const amrex::Array4<const amrex::Real>& mf_vx,
479  const amrex::Array4<const amrex::Real>& mf_my,
480  const amrex::Array4<const amrex::Real>& mf_uy,
481  const amrex::Array4<const amrex::Real>& mf_vy,
482  const amrex::BCRec* bc_ptr,
483  amrex::Array4<amrex::Real>& tau13i,
484  amrex::Array4<amrex::Real>& tau23i);
485 
486 /** \brief Compute strain-rate components on a vertically stretched grid. */
487 void ComputeStrain_S (amrex::Box bxcc, amrex::Box tbxxy,
488  amrex::Box tbxxz, amrex::Box tbxyz, amrex::Box domain,
489  const amrex::Array4<const amrex::Real>& u,
490  const amrex::Array4<const amrex::Real>& v,
491  const amrex::Array4<const amrex::Real>& w,
492  amrex::Array4<amrex::Real>& tau11,
493  amrex::Array4<amrex::Real>& tau22,
494  amrex::Array4<amrex::Real>& tau33,
495  amrex::Array4<amrex::Real>& tau12, amrex::Array4<amrex::Real>& tau21,
496  amrex::Array4<amrex::Real>& tau13, amrex::Array4<amrex::Real>& tau31,
497  amrex::Array4<amrex::Real>& tau23, amrex::Array4<amrex::Real>& tau32,
498  const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
499  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
500  const amrex::Array4<const amrex::Real>& mf_mx,
501  const amrex::Array4<const amrex::Real>& mf_ux,
502  const amrex::Array4<const amrex::Real>& mf_vx,
503  const amrex::Array4<const amrex::Real>& mf_my,
504  const amrex::Array4<const amrex::Real>& mf_uy,
505  const amrex::Array4<const amrex::Real>& mf_vy,
506  const amrex::BCRec* bc_ptr,
507  amrex::Array4<amrex::Real>& tau13i,
508  amrex::Array4<amrex::Real>& tau23i);
509 
510 /** \brief Compute strain-rate components on terrain-following coordinates. */
511 void ComputeStrain_T (amrex::Box bxcc, amrex::Box tbxxy,
512  amrex::Box tbxxz, amrex::Box tbxyz, amrex::Box domain,
513  const amrex::Array4<const amrex::Real>& u,
514  const amrex::Array4<const amrex::Real>& v,
515  const amrex::Array4<const amrex::Real>& w,
516  amrex::Array4<amrex::Real>& tau11,
517  amrex::Array4<amrex::Real>& tau22,
518  amrex::Array4<amrex::Real>& tau33,
519  amrex::Array4<amrex::Real>& tau12, amrex::Array4<amrex::Real>& tau21,
520  amrex::Array4<amrex::Real>& tau13, amrex::Array4<amrex::Real>& tau31,
521  amrex::Array4<amrex::Real>& tau23, amrex::Array4<amrex::Real>& tau32,
522  const amrex::Array4<const amrex::Real>& z_nd,
523  const amrex::Array4<const amrex::Real>& detJ,
524  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxInv,
525  const amrex::Array4<const amrex::Real>& mf_mx,
526  const amrex::Array4<const amrex::Real>& mf_ux,
527  const amrex::Array4<const amrex::Real>& mf_vx,
528  const amrex::Array4<const amrex::Real>& mf_my,
529  const amrex::Array4<const amrex::Real>& mf_uy,
530  const amrex::Array4<const amrex::Real>& mf_vy,
531  const amrex::BCRec* bc_ptr,
532  amrex::Array4<amrex::Real>& tau13i,
533  amrex::Array4<amrex::Real>& tau23i);
534 
535 /** \brief Apply implicit vertical state diffusion on a uniform grid without terrain. */
536 void ImplicitDiffForStateLU_N (const amrex::Box& bx,
537  const amrex::Box& domain,
538  const int level,
539  const int n,
540  const double dt,
541  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM*2>& bc_neumann_vals,
542  const amrex::Array4< amrex::Real>& cell_data,
543  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
544  const amrex::Array4<const amrex::Real>& hfx_z,
545  const amrex::Array4<const amrex::Real>& mu_turb,
546  const SolverChoice& solverChoice,
547  const amrex::BCRec* bc_ptr,
548  const bool use_SurfLayer,
549  const amrex::Real implicit_fac,
550  const bool use_mrf_countergradient = false,
551  const amrex::Array4<const amrex::Real>& wall_face = amrex::Array4<const amrex::Real>{},
552  const amrex::Array4<const amrex::Real>& wall_pin = amrex::Array4<const amrex::Real>{});
553 
554 /** \brief Apply implicit vertical state diffusion on a vertically stretched grid. */
555 void ImplicitDiffForStateLU_S (const amrex::Box& bx,
556  const amrex::Box& domain,
557  const int level,
558  const int n,
559  const double dt,
560  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM*2>& bc_neumann_vals,
561  const amrex::Array4< amrex::Real>& cell_data,
562  const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
563  const amrex::Array4<const amrex::Real>& hfx_z,
564  const amrex::Array4<const amrex::Real>& mu_turb,
565  const SolverChoice& solverChoice,
566  const amrex::BCRec* bc_ptr,
567  const bool use_SurfLayer,
568  const amrex::Real implicit_fac,
569  const bool use_mrf_countergradient = false);
570 
571 /** \brief Apply implicit vertical state diffusion on terrain-following coordinates. */
572 void ImplicitDiffForStateLU_T (const amrex::Box& bx,
573  const amrex::Box& domain,
574  const int level,
575  const int n,
576  const double dt,
577  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM*2>& bc_neumann_vals,
578  const amrex::Array4< amrex::Real>& cell_data,
579  const amrex::Array4<const amrex::Real>& z_nd,
580  const amrex::Array4<const amrex::Real>& detJ,
581  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
582  const amrex::Array4<const amrex::Real>& hfx_z,
583  const amrex::Array4<const amrex::Real>& mu_turb,
584  const SolverChoice& solverChoice,
585  const amrex::BCRec* bc_ptr,
586  const bool use_SurfLayer,
587  const amrex::Real implicit_fac,
588  const bool use_mrf_countergradient = false,
589  const amrex::Array4<const amrex::Real>& mf_mx = {},
590  const amrex::Array4<const amrex::Real>& mf_my = {},
591  const bool implicit_metric = false);
592 
593 /**
594  * \brief Apply implicit vertical momentum diffusion on a uniform grid without terrain.
595  *
596  * col_kext holds, on a z-slab with one ghost cell in x and y, the [klo,khi] extent of the
597  * grid column over each (i,j); it is used to restrict each face column's tridiagonal solve
598  * to the range covered by both of the cell columns adjacent to it. See ERF::define_column_kextent.
599  */
600 template <int stagdir>
601 void ImplicitDiffForMomLU_N (const amrex::Box& bx,
602  const amrex::Box& domain,
603  const int level,
604  const double dt,
605  const amrex::Array4<const int >& col_kext,
606  const amrex::Array4<const amrex::Real>& cell_data,
607  const amrex::Array4< amrex::Real>& face_data,
608  const amrex::Array4<const amrex::Real>& tau,
609  const amrex::Array4<const amrex::Real>& tau_corr,
610  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
611  const amrex::Array4<const amrex::Real>& mu_turb,
612  const SolverChoice& solverChoice,
613  const amrex::BCRec* bc_ptr,
614  const bool use_SurfLayer,
615  const amrex::Real implicit_fac,
616  const bool use_ysu_mom_countergradient,
617  const amrex::Array4<const amrex::Real>& wall_face = amrex::Array4<const amrex::Real>{});
618 
619 /** \brief Apply implicit vertical momentum diffusion on a vertically stretched grid. */
620 template <int stagdir>
621 void ImplicitDiffForMomLU_S (const amrex::Box& bx,
622  const amrex::Box& domain,
623  const int level,
624  const double dt,
625  const amrex::Array4<const int >& col_kext,
626  const amrex::Array4<const amrex::Real>& cell_data,
627  const amrex::Array4< amrex::Real>& face_data,
628  const amrex::Array4<const amrex::Real>& tau,
629  const amrex::Array4<const amrex::Real>& tau_corr,
630  const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
631  const amrex::Array4<const amrex::Real>& mu_turb,
632  const SolverChoice& solverChoice,
633  const amrex::BCRec* bc_ptr,
634  const bool use_SurfLayer,
635  const amrex::Real implicit_fac,
636  const bool use_ysu_mom_countergradient);
637 
638 /** \brief Apply implicit vertical momentum diffusion on terrain-following coordinates. */
639 template <int stagdir>
640 void ImplicitDiffForMomLU_T (const amrex::Box& bx,
641  const amrex::Box& domain,
642  const int level,
643  const double dt,
644  const amrex::Array4<const int >& col_kext,
645  const amrex::Array4<const amrex::Real>& cell_data,
646  const amrex::Array4< amrex::Real>& face_data,
647  const amrex::Array4<const amrex::Real>& tau,
648  const amrex::Array4<const amrex::Real>& tau_corr,
649  const amrex::Array4<const amrex::Real>& z_nd,
650  const amrex::Array4<const amrex::Real>& detJ,
651  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
652  const amrex::Array4<const amrex::Real>& mu_turb,
653  const SolverChoice& solverChoice,
654  const amrex::BCRec* bc_ptr,
655  const bool use_SurfLayer,
656  const amrex::Real implicit_fac,
657  const bool use_ysu_mom_countergradient,
658  const amrex::Array4<const amrex::Real>& mf_x,
659  const amrex::Array4<const amrex::Real>& mf_y,
660  const bool implicit_metric);
661 #endif
@ tau12
Definition: ERF_DataStruct.H:49
@ tau23
Definition: ERF_DataStruct.H:49
@ tau33
Definition: ERF_DataStruct.H:49
@ tau22
Definition: ERF_DataStruct.H:49
@ tau11
Definition: ERF_DataStruct.H:49
@ tau32
Definition: ERF_DataStruct.H:49
@ tau31
Definition: ERF_DataStruct.H:49
@ tau21
Definition: ERF_DataStruct.H:49
@ tau13
Definition: ERF_DataStruct.H:49
void ImplicitDiffForMomLU_N(const amrex::Box &bx, const amrex::Box &domain, const int level, const double dt, const amrex::Array4< const int > &col_kext, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< amrex::Real > &face_data, const amrex::Array4< const amrex::Real > &tau, const amrex::Array4< const amrex::Real > &tau_corr, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Real implicit_fac, const bool use_ysu_mom_countergradient, const amrex::Array4< const amrex::Real > &wall_face=amrex::Array4< const amrex::Real >{})
Apply implicit vertical momentum diffusion on a uniform grid without terrain.
void ComputeStressVarVisc_S(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Real mu_eff, const amrex::Array4< const amrex::Real > &mu_turb, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau21, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau31, amrex::Array4< amrex::Real > &tau23, amrex::Array4< amrex::Real > &tau32, const amrex::Array4< const amrex::Real > &er_arr, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute stress components for variable viscosity on a vertically stretched grid.
void ImplicitVerticalFluxForReflux_T(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const amrex::Real implicit_fac, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_my, const bool implicit_metric, const bool use_mrf_countergradient, const amrex::Array4< amrex::Real > &zflux)
As ImplicitVerticalFluxForReflux_N, on a terrain-following mesh.
void DiffusionSrcForMom(const amrex::Box &bxx, const amrex::Box &bxy, const amrex::Box &bxz, const amrex::Array4< amrex::Real > &rho_u_rhs, const amrex::Array4< amrex::Real > &rho_v_rhs, const amrex::Array4< amrex::Real > &rho_w_rhs, const amrex::Array4< const amrex::Real > &tau11, const amrex::Array4< const amrex::Real > &tau22, const amrex::Array4< const amrex::Real > &tau33, const amrex::Array4< const amrex::Real > &tau12, const amrex::Array4< const amrex::Real > &tau21, const amrex::Array4< const amrex::Real > &tau13, const amrex::Array4< const amrex::Real > &tau31, const amrex::Array4< const amrex::Real > &tau23, const amrex::Array4< const amrex::Real > &tau32, const amrex::Array4< const amrex::Real > &detJ_arr, const amrex::Gpu::DeviceVector< amrex::Real > &stretched_dz_d, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, const bool use_stretched_dz, const bool use_variable_dz)
Add stress-divergence diffusion source terms to the momentum RHS.
void DiffusionSrcForState_S(const amrex::Box &bx, const amrex::Box &domain, int start_comp, int num_comp, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< amrex::Real > &cell_rhs, const amrex::Array4< amrex::Real > &xflux, const amrex::Array4< amrex::Real > &yflux, const amrex::Array4< amrex::Real > &zflux, const amrex::Gpu::DeviceVector< amrex::Real > &stretched_dz_d, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, amrex::Array4< amrex::Real > &hfx_x, amrex::Array4< amrex::Real > &hfx_y, amrex::Array4< amrex::Real > &hfx_z, amrex::Array4< amrex::Real > &qfx1_x, amrex::Array4< amrex::Real > &qfx1_y, amrex::Array4< amrex::Real > &qfx1_z, amrex::Array4< amrex::Real > &qfx2_z, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const int level, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer, const amrex::Real implicit_fac, const ScalarDiffusionRefluxViews *reflux_flx=nullptr)
Native adapter for regular scalar diffusion on a vertically stretched grid.
void ImplicitVerticalFluxForReflux_N(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const amrex::Real implicit_fac, const amrex::Array4< const amrex::Real > &cell_data, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_my, const bool use_mrf_countergradient, const amrex::Array4< amrex::Real > &zflux)
The implicit part of the vertical diffusive flux of one component, for refluxing (flat mesh).
void ImplicitDiffForStateLU_N(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const double dt, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM *2 > &bc_neumann_vals, const amrex::Array4< amrex::Real > &cell_data, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &hfx_z, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Real implicit_fac, const bool use_mrf_countergradient=false, const amrex::Array4< const amrex::Real > &wall_face=amrex::Array4< const amrex::Real >{}, const amrex::Array4< const amrex::Real > &wall_pin=amrex::Array4< const amrex::Real >{})
Apply implicit vertical state diffusion on a uniform grid without terrain.
void DiffusionSrcForState_EB(const amrex::Box &bx, const amrex::Box &domain, int start_comp, int num_comp, const amrex::Array4< const amrex::Real > &u, const amrex::Array4< const amrex::Real > &v, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< amrex::Real > &cell_rhs, const amrex::Array4< amrex::Real > &xflux, const amrex::Array4< amrex::Real > &yflux, const amrex::Array4< amrex::Real > &zflux, const amrex::Array4< const amrex::EBCellFlag > &cfg_arr, const amrex::Array4< const amrex::Real > &ax_arr, const amrex::Array4< const amrex::Real > &ay_arr, const amrex::Array4< const amrex::Real > &az_arr, const amrex::Array4< const amrex::Real > &detJ, const amrex::Array4< const amrex::Real > &barea_arr, const amrex::Array4< const amrex::Real > &bcent_arr, const amrex::Real *dx_arr, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, amrex::Array4< amrex::Real > &hfx_z, amrex::Array4< amrex::Real > &qfx1_z, amrex::Array4< amrex::Real > &qfx2_z, amrex::Array4< amrex::Real > &hfx_EB, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const int level, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer)
Add state diffusion source terms for embedded-boundary cells.
void ComputeStressConsVisc_N(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Real mu_eff, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau23, const amrex::Array4< const amrex::Real > &er_arr, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute stress components for constant viscosity on a uniform grid without terrain.
void ComputeStrain_EB(const amrex::MFIter &mfi, amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Box domain, const amrex::Array4< const amrex::Real > &u, const amrex::Array4< const amrex::Real > &v, const amrex::Array4< const amrex::Real > &w, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau23, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::BCRec *bc_ptr, const eb_ &ebfact, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute embedded-boundary strain-rate components.
void ComputeStrain_T(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Box domain, const amrex::Array4< const amrex::Real > &u, const amrex::Array4< const amrex::Real > &v, const amrex::Array4< const amrex::Real > &w, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau21, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau31, amrex::Array4< amrex::Real > &tau23, amrex::Array4< amrex::Real > &tau32, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, const amrex::BCRec *bc_ptr, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute strain-rate components on terrain-following coordinates.
void ComputeStressConsVisc_EB(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Real mu_eff, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau23, const amrex::Array4< const amrex::Real > &er_arr, amrex::Array4< const amrex::Real > &vfrac, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute embedded-boundary stress components for constant viscosity.
void ComputeStressVarVisc_EB(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Real mu_eff, const amrex::Array4< const amrex::Real > &mu_turb, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau23, const amrex::Array4< const amrex::Real > &er_arr, amrex::Array4< const amrex::Real > &vfrac, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute embedded-boundary stress components for variable viscosity.
void ComputeStressVarVisc_T(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Real mu_eff, const amrex::Array4< const amrex::Real > &mu_turb, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau21, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau31, amrex::Array4< amrex::Real > &tau23, amrex::Array4< amrex::Real > &tau32, const amrex::Array4< const amrex::Real > &er_arr, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i, const bool implicit_metric)
Compute stress components for variable viscosity on terrain-following coordinates.
void ImplicitDiffForMomLU_S(const amrex::Box &bx, const amrex::Box &domain, const int level, const double dt, const amrex::Array4< const int > &col_kext, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< amrex::Real > &face_data, const amrex::Array4< const amrex::Real > &tau, const amrex::Array4< const amrex::Real > &tau_corr, const amrex::Gpu::DeviceVector< amrex::Real > &stretched_dz_d, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Real implicit_fac, const bool use_ysu_mom_countergradient)
Apply implicit vertical momentum diffusion on a vertically stretched grid.
void ComputeStrain_N(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Box domain, const amrex::Array4< const amrex::Real > &u, const amrex::Array4< const amrex::Real > &v, const amrex::Array4< const amrex::Real > &w, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau23, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, const amrex::BCRec *bc_ptr, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute strain-rate components on a uniform grid without terrain.
void ComputeStressConsVisc_T(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Real mu_eff, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau21, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau31, amrex::Array4< amrex::Real > &tau23, amrex::Array4< amrex::Real > &tau32, const amrex::Array4< const amrex::Real > &er_arr, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i, const bool implicit_metric)
Compute stress components for constant viscosity on terrain-following coordinates.
void DiffusionSrcForState_N(const amrex::Box &bx, const amrex::Box &domain, int start_comp, int num_comp, const amrex::Array4< const amrex::Real > &u, const amrex::Array4< const amrex::Real > &v, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< amrex::Real > &cell_rhs, const amrex::Array4< amrex::Real > &xflux, const amrex::Array4< amrex::Real > &yflux, const amrex::Array4< amrex::Real > &zflux, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, amrex::Array4< amrex::Real > &hfx_x, amrex::Array4< amrex::Real > &hfx_y, amrex::Array4< amrex::Real > &hfx_z, amrex::Array4< amrex::Real > &qfx1_x, amrex::Array4< amrex::Real > &qfx1_y, amrex::Array4< amrex::Real > &qfx1_z, amrex::Array4< amrex::Real > &qfx2_z, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const int level, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer, const amrex::Real implicit_fac, const ScalarDiffusionRefluxViews *reflux_flx=nullptr, const amrex::Array4< const amrex::Real > &wall_face33=amrex::Array4< const amrex::Real >{}, const amrex::Array4< const amrex::Real > &wall_hfx=amrex::Array4< const amrex::Real >{})
Add regular-grid state diffusion on a uniform grid without terrain.
void ImplicitDiffForStateLU_T(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const double dt, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM *2 > &bc_neumann_vals, const amrex::Array4< amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &hfx_z, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Real implicit_fac, const bool use_mrf_countergradient=false, const amrex::Array4< const amrex::Real > &mf_mx={}, const amrex::Array4< const amrex::Real > &mf_my={}, const bool implicit_metric=false)
Apply implicit vertical state diffusion on terrain-following coordinates.
void ImplicitDiffForMomLU_T(const amrex::Box &bx, const amrex::Box &domain, const int level, const double dt, const amrex::Array4< const int > &col_kext, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< amrex::Real > &face_data, const amrex::Array4< const amrex::Real > &tau, const amrex::Array4< const amrex::Real > &tau_corr, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Real implicit_fac, const bool use_ysu_mom_countergradient, const amrex::Array4< const amrex::Real > &mf_x, const amrex::Array4< const amrex::Real > &mf_y, const bool implicit_metric)
Apply implicit vertical momentum diffusion on terrain-following coordinates.
void ImplicitVerticalFluxForReflux_S(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const amrex::Real implicit_fac, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Gpu::DeviceVector< amrex::Real > &stretched_dz_d, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_my, const bool use_mrf_countergradient, const amrex::Array4< amrex::Real > &zflux)
As ImplicitVerticalFluxForReflux_N, on a vertically stretched mesh.
void DiffusionSrcForState_T(const amrex::Box &bx, const amrex::Box &domain, int start_comp, int num_comp, const bool &rotate, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< amrex::Real > &cell_rhs, const amrex::Array4< amrex::Real > &xflux, const amrex::Array4< amrex::Real > &yflux, const amrex::Array4< amrex::Real > &zflux, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &z_cc, const amrex::Array4< const amrex::Real > &ax, const amrex::Array4< const amrex::Real > &ay, const amrex::Array4< const amrex::Real > &az, const amrex::Array4< const amrex::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, amrex::Array4< amrex::Real > &hfx_x, amrex::Array4< amrex::Real > &hfx_y, amrex::Array4< amrex::Real > &hfx_z, amrex::Array4< amrex::Real > &qfx1_x, amrex::Array4< amrex::Real > &qfx1_y, amrex::Array4< amrex::Real > &qfx1_z, amrex::Array4< amrex::Real > &qfx2_z, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const int level, const amrex::BCRec *bc_ptr, const amrex::BCRec *bc_ptr_h, const bool use_SurfLayer, const amrex::Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer, const amrex::Real implicit_fac, const ScalarDiffusionRefluxViews *reflux_flx=nullptr)
Native adapter for regular scalar diffusion on terrain-following coordinates.
void DiffusionSrcForMom_EB(const amrex::MFIter &mfi, [[maybe_unused]] const amrex::Box &domain, const amrex::Box &bxx, const amrex::Box &bxy, const amrex::Box &bxz, const amrex::Array4< amrex::Real > &rho_u_rhs, const amrex::Array4< amrex::Real > &rho_v_rhs, const amrex::Array4< amrex::Real > &rho_w_rhs, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &w_arr, const amrex::Array4< const amrex::Real > &tau11, const amrex::Array4< const amrex::Real > &tau22, const amrex::Array4< const amrex::Real > &tau33, const amrex::Array4< const amrex::Real > &tau12, const amrex::Array4< const amrex::Real > &tau13, const amrex::Array4< const amrex::Real > &tau23, const amrex::Array4< const amrex::Real > &u_tau_eb13, const amrex::Array4< const amrex::Real > &u_tau_eb23, const amrex::Array4< const amrex::Real > &v_tau_eb13, const amrex::Array4< const amrex::Real > &v_tau_eb23, const amrex::Array4< const amrex::Real > &w_tau_eb13, const amrex::Array4< const amrex::Real > &w_tau_eb23, const amrex::Real *dx_arr, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, const SolverChoice &solverChoice, const eb_ &ebfact, [[maybe_unused]] const amrex::BCRec *bc_ptr)
Add embedded-boundary stress-divergence diffusion source terms to the momentum RHS.
void ComputeStressConsVisc_S(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Real mu_eff, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau21, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau31, amrex::Array4< amrex::Real > &tau23, amrex::Array4< amrex::Real > &tau32, const amrex::Array4< const amrex::Real > &er_arr, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute stress components for constant viscosity on a vertically stretched grid.
void ComputeStressVarVisc_N(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Real mu_eff, const amrex::Array4< const amrex::Real > &mu_turb, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau23, const amrex::Array4< const amrex::Real > &er_arr, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute stress components for variable viscosity on a uniform grid without terrain.
void ImplicitDiffForStateLU_S(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const double dt, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM *2 > &bc_neumann_vals, const amrex::Array4< amrex::Real > &cell_data, const amrex::Gpu::DeviceVector< amrex::Real > &stretched_dz_d, const amrex::Array4< const amrex::Real > &hfx_z, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Real implicit_fac, const bool use_mrf_countergradient=false)
Apply implicit vertical state diffusion on a vertically stretched grid.
void ComputeStrain_S(amrex::Box bxcc, amrex::Box tbxxy, amrex::Box tbxxz, amrex::Box tbxyz, amrex::Box domain, const amrex::Array4< const amrex::Real > &u, const amrex::Array4< const amrex::Real > &v, const amrex::Array4< const amrex::Real > &w, amrex::Array4< amrex::Real > &tau11, amrex::Array4< amrex::Real > &tau22, amrex::Array4< amrex::Real > &tau33, amrex::Array4< amrex::Real > &tau12, amrex::Array4< amrex::Real > &tau21, amrex::Array4< amrex::Real > &tau13, amrex::Array4< amrex::Real > &tau31, amrex::Array4< amrex::Real > &tau23, amrex::Array4< amrex::Real > &tau32, const amrex::Gpu::DeviceVector< amrex::Real > &stretched_dz_d, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vy, const amrex::BCRec *bc_ptr, amrex::Array4< amrex::Real > &tau13i, amrex::Array4< amrex::Real > &tau23i)
Compute strain-rate components on a vertically stretched grid.
Declares the embedded-boundary factory manager used by ERF levels.
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
Real w
Definition: ERF_Plotfile2DInterpolator.cpp:23
amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > ScalarDiffusionRefluxViews
Definition: ERF_ScalarDiffusion.H:1581
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Owns and exposes cell-centered and face-centered EB factories.
Definition: ERF_EB.H:26
Definition: ERF_DataStruct.H:715