ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_DiffusionSrcForState_T.cpp File Reference
#include "ERF_Diffusion.H"
#include "ERF_EddyViscosity.H"
#include "ERF_TerrainMetrics.H"
#include "ERF_PBLModels.H"
#include "ERF_SetupDiff.H"
#include "ERF_AddTKESources.H"
#include "ERF_AddQKESources.H"
Include dependency graph for ERF_DiffusionSrcForState_T.cpp:

Functions

void DiffusionSrcForState_T (const Box &bx, const Box &domain, int start_comp, int num_comp, const bool &rotate, const Array4< const Real > &u, const Array4< const Real > &v, const Array4< const Real > &cell_data, const Array4< const Real > &cell_prim, const Array4< Real > &cell_rhs, const Array4< Real > &xflux, const Array4< Real > &yflux, const Array4< Real > &zflux, const Array4< const Real > &z_nd, const Array4< const Real > &z_cc, const Array4< const Real > &ax, const Array4< const Real > &ay, const Array4< const Real > &, const Array4< const Real > &detJ, const GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &SmnSmn_a, const Array4< const Real > &mf_mx, const Array4< const Real > &mf_ux, const Array4< const Real > &mf_vx, const Array4< const Real > &mf_my, const Array4< const Real > &mf_uy, const Array4< const Real > &mf_vy, Array4< Real > &hfx_x, Array4< Real > &hfx_y, Array4< Real > &hfx_z, Array4< Real > &qfx1_x, Array4< Real > &qfx1_y, Array4< Real > &qfx1_z, Array4< Real > &qfx2_z, Array4< Real > &diss, const Array4< const Real > &mu_turb, const SolverChoice &solverChoice, const int level, const Array4< const Real > &tm_arr, const GpuArray< Real, AMREX_SPACEDIM > grav_gpu, const BCRec *bc_ptr, const bool use_SurfLayer, const Real implicit_fac)
 

Function Documentation

◆ DiffusionSrcForState_T()

void DiffusionSrcForState_T ( const Box &  bx,
const Box &  domain,
int  start_comp,
int  num_comp,
const bool &  rotate,
const Array4< const Real > &  u,
const Array4< const Real > &  v,
const Array4< const Real > &  cell_data,
const Array4< const Real > &  cell_prim,
const Array4< Real > &  cell_rhs,
const Array4< Real > &  xflux,
const Array4< Real > &  yflux,
const Array4< Real > &  zflux,
const Array4< const Real > &  z_nd,
const Array4< const Real > &  z_cc,
const Array4< const Real > &  ax,
const Array4< const Real > &  ay,
const Array4< const Real > &  ,
const Array4< const Real > &  detJ,
const GpuArray< Real, AMREX_SPACEDIM > &  cellSizeInv,
const Array4< const Real > &  SmnSmn_a,
const Array4< const Real > &  mf_mx,
const Array4< const Real > &  mf_ux,
const Array4< const Real > &  mf_vx,
const Array4< const Real > &  mf_my,
const Array4< const Real > &  mf_uy,
const Array4< const Real > &  mf_vy,
Array4< Real > &  hfx_x,
Array4< Real > &  hfx_y,
Array4< Real > &  hfx_z,
Array4< Real > &  qfx1_x,
Array4< Real > &  qfx1_y,
Array4< Real > &  qfx1_z,
Array4< Real > &  qfx2_z,
Array4< Real > &  diss,
const Array4< const Real > &  mu_turb,
const SolverChoice solverChoice,
const int  level,
const Array4< const Real > &  tm_arr,
const GpuArray< Real, AMREX_SPACEDIM >  grav_gpu,
const BCRec *  bc_ptr,
const bool  use_SurfLayer,
const Real  implicit_fac 
)

Function for computing the scalar RHS for diffusion operator with terrain-fitted coordinates.

Parameters
[in]bxcell center box to loop over
[in]domainbox of the whole domain
[in]start_compstarting component index
[in]num_compnumber of components
[in]rotateflag to rotate terrain-aligned fluxes
[in]uvelocity in x-dir
[in]vvelocity in y-dir
[in]cell_dataconserved cell center vars
[in]cell_primprimitive cell center vars
[out]cell_rhsRHS for cell center vars
[in]xfluxflux in x-dir
[in]yfluxflux in y-dir
[in]zfluxflux in z-dir
[in]z_ndphysical z height
[in]z_cccell-centered physical z height
[in]axarea fraction of x-faces
[in]ayarea fraction of y-faces
[in]detJJacobian determinant
[in]cellSizeInvinverse cell size array
[in]SmnSmn_astrain rate magnitude
[in]mf_mxx map factor at cell centers
[in]mf_uxx map factor at x-faces
[in]mf_vxx map factor at y-faces
[in]mf_myy map factor at cell centers
[in]mf_uyy map factor at x-faces
[in]mf_vyy map factor at y-faces
[in,out]hfx_xheat flux in x-dir
[in,out]hfx_yheat flux in y-dir
[in,out]hfx_zheat flux in z-dir
[in,out]qfx1_xheat flux in x-dir
[in,out]qfx1_yheat flux in y-dir
[in,out]qfx1_zheat flux in z-dir
[out]qfx2_zheat flux in z-dir
[in]dissdissipation of TKE
[in]mu_turbturbulent viscosity
[in]solverChoicecontainer of solver and diffusion parameters
[in]levelAMR level
[in]tm_arrtheta mean array
[in]grav_gpugravity vector
[in]bc_ptrcontainer with boundary conditions
[in]use_SurfLayerwhether we have turned on subgrid diffusion
[in]implicit_fac– factor of implicitness for vertical differences only
96 {
97  BL_PROFILE_VAR("DiffusionSrcForState_T()",DiffusionSrcForState_T);
98 
99  const Real explicit_fac = one - implicit_fac;
100 
101 #include "ERF_SetupDiff.H"
102  Real l_abs_g = std::abs(grav_gpu[2]);
103 
104  const Real dz_inv = cellSizeInv[2];
105 
106  // We need to grow these boxes in the vertical direction when tiling so that we can access xflux and yflux
107  // to modify zflux
108  Box xbx_g1(xbx); Box ybx_g1(ybx);
109  if (xbx_g1.smallEnd(2) != dom_lo.z) xbx_g1.growLo(2,1);
110  if (ybx_g1.smallEnd(2) != dom_lo.z) ybx_g1.growLo(2,1);
111  if (xbx_g1.bigEnd(2) != dom_hi.z) xbx_g1.growHi(2,1);
112  if (ybx_g1.bigEnd(2) != dom_hi.z) ybx_g1.growHi(2,1);
113 
114  for (int n(0); n<num_comp; ++n) {
115  const int qty_index = start_comp + n;
116 
117  // Constant alpha & Turb model
118  if (l_consA && l_turb) {
119  ParallelFor(xbx_g1, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
120  {
121  const int prim_index = qty_index - 1;
122  const int prim_scal_index = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ? PrimScalar_comp : prim_index;
123 
124  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i-1, j, k, Rho_comp) );
125  Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
126  rhoAlpha += myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_scal_index])
127  + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_scal_index]) );
128 
129  Real met_h_xi = Compute_h_xi_AtIface (i,j,k,cellSizeInv,z_nd);
130 
131  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
132  BCVars::RhoScalar_bc_comp : qty_index;
133  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
134 
135  bool SurfLayer_on_zlo = ( use_SurfLayer && rotate && k == dom_lo.z);
136 
137  Real idz_hi = one / (z_cc(i ,j,k+1) - z_cc(i ,j,k-1));
138  Real idz_lo = one / (z_cc(i-1,j,k+1) - z_cc(i-1,j,k-1));
139  Real GradCz = myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i-1, j, k+1, prim_index)*idz_lo
140  - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i-1, j, k-1, prim_index)*idz_lo );
141  Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
142 
143  if (SurfLayer_on_zlo && (qty_index == RhoTheta_comp)) {
144  xflux(i,j,k) = hfx_x(i,j,0);
145  } else if (SurfLayer_on_zlo && (qty_index == RhoQ1_comp)) {
146  xflux(i,j,k) = qfx1_x(i,j,0);
147  } else {
148  xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * ( GradCx - met_h_xi*GradCz );
149  }
150  });
151  ParallelFor(ybx_g1, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
152  {
153  const int prim_index = qty_index - 1;
154  const int prim_scal_index = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ? PrimScalar_comp : prim_index;
155 
156  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i, j-1, k, Rho_comp) );
157  Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
158  rhoAlpha += myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_scal_index])
159  + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_scal_index]) );
160 
161  Real met_h_eta = Compute_h_eta_AtJface (i,j,k,cellSizeInv,z_nd);
162 
163  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
164  BCVars::RhoScalar_bc_comp : qty_index;
165  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
166  bool SurfLayer_on_zlo = ( use_SurfLayer && rotate && k == dom_lo.z);
167 
168  Real idz_hi = one / (z_cc(i,j ,k+1) - z_cc(i,j ,k-1));
169  Real idz_lo = one / (z_cc(i,j-1,k+1) - z_cc(i,j-1,k-1));
170  Real GradCz = myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i, j-1, k+1, prim_index)*idz_lo
171  - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i, j-1, k-1, prim_index)*idz_lo );
172  Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
173 
174  if (SurfLayer_on_zlo && (qty_index == RhoTheta_comp)) {
175  yflux(i,j,k) = hfx_y(i,j,0);
176  } else if (SurfLayer_on_zlo && (qty_index == RhoQ1_comp)) {
177  yflux(i,j,k) = qfx1_y(i,j,0);
178  } else {
179  yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * ( GradCy - met_h_eta*GradCz );
180  }
181  });
182  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
183  {
184  const int prim_index = qty_index - 1;
185  const int prim_scal_index = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ? PrimScalar_comp : prim_index;
186 
187  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i, j, k-1, Rho_comp) );
188  Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
189  rhoAlpha += myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_scal_index])
190  + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_scal_index]) );
191 
192  Real GradCz;
193  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
194  BCVars::RhoScalar_bc_comp : qty_index;
195  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
196  bool ext_dir_on_zlo = ( ((bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir) ||
197  (bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir_prim))
198  && k == dom_lo.z);
199  bool ext_dir_on_zhi = ( ((bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir) ||
200  (bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir_prim) )
201  && k == dom_hi.z+1);
202  bool SurfLayer_on_zlo = ( use_SurfLayer && k == dom_lo.z);
203 
204  if (ext_dir_on_zlo) {
205  // Third order stencil with variable dz
206  Real zm = Compute_Z_AtWFace(i,j,k+1,z_nd);
207  Real dz0 = zm - Compute_Z_AtWFace(i,j,k,z_nd);
208  Real dz1 = Compute_Z_AtWFace(i,j,k+2,z_nd) - zm;
209  Real idz0 = one / dz0;
210  Real f = (dz1 / dz0) + two;
211  Real f2 = f*f;
212  Real c3 = two / (f - f2);
213  Real c2 = -f2*c3;
214  Real c1 = -(one-f2)*c3;
215  GradCz = idz0 * ( c1 * cell_prim(i, j, k-1, prim_index)
216  + c2 * cell_prim(i, j, k , prim_index)
217  + c3 * cell_prim(i, j, k+1, prim_index) );
218  } else if (ext_dir_on_zhi) {
219  // Third order stencil with variable dz
220  Real zm = Compute_Z_AtWFace(i,j,k-1,z_nd);
221  Real dz0 = Compute_Z_AtWFace(i,j,k,z_nd) - zm;
222  Real dz1 = zm - Compute_Z_AtWFace(i,j,k-2,z_nd);
223  Real idz0 = one / dz0;
224  Real f = (dz1 / dz0) + two;
225  Real f2 = f*f;
226  Real c3 = two / (f - f2);
227  Real c2 = -f2*c3;
228  Real c1 = -(one-f2)*c3;
229  GradCz = idz0 * ( -( c1 * cell_prim(i, j, k , prim_index)
230  + c2 * cell_prim(i, j, k-1, prim_index)
231  + c3 * cell_prim(i, j, k-2, prim_index) ) );
232  } else {
233  Real met_h_zeta = Compute_h_zeta_AtKface(i,j,k,cellSizeInv,z_nd);
234  GradCz = (dz_inv/met_h_zeta) * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
235  }
236 
237  if (SurfLayer_on_zlo) {
238  if (qty_index == RhoTheta_comp) {
239  zflux(i,j,k) = hfx_z(i,j,0);
240  } else if (qty_index == RhoQ1_comp) {
241  zflux(i,j,k) = qfx1_z(i,j,0);
242  } else {
243  zflux(i,j,k) = zero;
244  }
245  } else {
246  zflux(i,j,k) = -rhoAlpha * GradCz;
247  }
248 
249  if (qty_index == RhoTheta_comp) {
250  if (!SurfLayer_on_zlo) {
251  hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
252  }
253  } else if (qty_index == RhoQ1_comp) {
254  if (!SurfLayer_on_zlo) {
255  qfx1_z(i,j,k) = zflux(i,j,k) * explicit_fac;
256  }
257  } else if (qty_index == RhoQ2_comp) {
258  qfx2_z(i,j,k) = zflux(i,j,k);
259  }
260  });
261  // Constant rho*alpha & Turb model
262  } else if (l_turb) {
263  ParallelFor(xbx_g1, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
264  {
265  const int prim_index = qty_index - 1;
266 
267  Real rhoAlpha = d_alpha_eff[prim_index];
268  rhoAlpha += myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_index])
269  + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_index]) );
270 
271  Real met_h_xi = Compute_h_xi_AtIface (i,j,k,cellSizeInv,z_nd);
272 
273  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
274  BCVars::RhoScalar_bc_comp : qty_index;
275  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
276  bool SurfLayer_on_zlo = ( use_SurfLayer && rotate && k == dom_lo.z);
277 
278  Real idz_hi = one / (z_cc(i ,j,k+1) - z_cc(i ,j,k-1));
279  Real idz_lo = one / (z_cc(i-1,j,k+1) - z_cc(i-1,j,k-1));
280  Real GradCz = myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i-1, j, k+1, prim_index)*idz_lo
281  - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i-1, j, k-1, prim_index)*idz_lo );
282  Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
283 
284  if (SurfLayer_on_zlo && (qty_index == RhoTheta_comp)) {
285  xflux(i,j,k) = hfx_x(i,j,0);
286  } else if (SurfLayer_on_zlo && (qty_index == RhoQ1_comp)) {
287  xflux(i,j,k) = qfx1_x(i,j,0);
288  } else {
289  xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * ( GradCx - met_h_xi*GradCz );
290  }
291  });
292  ParallelFor(ybx_g1, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
293  {
294  const int prim_index = qty_index - 1;
295 
296  Real rhoAlpha = d_alpha_eff[prim_index];
297  rhoAlpha += myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_index])
298  + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_index]) );
299 
300  Real met_h_eta = Compute_h_eta_AtJface (i,j,k,cellSizeInv,z_nd);
301 
302  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
303  BCVars::RhoScalar_bc_comp : qty_index;
304  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
305  bool SurfLayer_on_zlo = ( use_SurfLayer && rotate && k == dom_lo.z);
306 
307  Real idz_hi = one / (z_cc(i,j ,k+1) - z_cc(i,j ,k-1));
308  Real idz_lo = one / (z_cc(i,j-1,k+1) - z_cc(i,j-1,k-1));
309  Real GradCz = myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i, j-1, k+1, prim_index)*idz_lo
310  - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i, j-1, k-1, prim_index)*idz_lo );
311  Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
312 
313  if (SurfLayer_on_zlo && (qty_index == RhoTheta_comp)) {
314  yflux(i,j,k) = hfx_y(i,j,0);
315  } else if (SurfLayer_on_zlo && (qty_index == RhoQ1_comp)) {
316  yflux(i,j,k) = qfx1_y(i,j,0);
317  } else {
318  yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * ( GradCy - met_h_eta*GradCz );
319  }
320  });
321  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
322  {
323  const int prim_index = qty_index - 1;
324 
325  Real rhoAlpha = d_alpha_eff[prim_index];
326  rhoAlpha += myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_index])
327  + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_index]) );
328 
329  Real GradCz;
330  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
331  BCVars::RhoScalar_bc_comp : qty_index;
332  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
333  bool ext_dir_on_zlo = ( ((bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir) ||
334  (bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir_prim))
335  && k == dom_lo.z);
336  bool ext_dir_on_zhi = ( ((bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir) ||
337  (bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir_prim))
338  && k == dom_hi.z+1);
339  bool SurfLayer_on_zlo = ( use_SurfLayer && k == dom_lo.z);
340 
341  if (ext_dir_on_zlo) {
342  // Third order stencil with variable dz
343  Real zm = Compute_Z_AtWFace(i,j,k+1,z_nd);
344  Real dz0 = zm - Compute_Z_AtWFace(i,j,k,z_nd);
345  Real dz1 = Compute_Z_AtWFace(i,j,k+2,z_nd) - zm;
346  Real idz0 = one / dz0;
347  Real f = (dz1 / dz0) + two;
348  Real f2 = f*f;
349  Real c3 = two / (f - f2);
350  Real c2 = -f2*c3;
351  Real c1 = -(one-f2)*c3;
352  GradCz = idz0 * ( c1 * cell_prim(i, j, k-1, prim_index)
353  + c2 * cell_prim(i, j, k , prim_index)
354  + c3 * cell_prim(i, j, k+1, prim_index) );
355  } else if (ext_dir_on_zhi) {
356  // Third order stencil with variable dz
357  Real zm = Compute_Z_AtWFace(i,j,k-1,z_nd);
358  Real dz0 = Compute_Z_AtWFace(i,j,k,z_nd) - zm;
359  Real dz1 = zm - Compute_Z_AtWFace(i,j,k-2,z_nd);
360  Real idz0 = one / dz0;
361  Real f = (dz1 / dz0) + two;
362  Real f2 = f*f;
363  Real c3 = two / (f - f2);
364  Real c2 = -f2*c3;
365  Real c1 = -(one-f2)*c3;
366  GradCz = idz0 * ( -( c1 * cell_prim(i, j, k , prim_index)
367  + c2 * cell_prim(i, j, k-1, prim_index)
368  + c3 * cell_prim(i, j, k-2, prim_index) ) );
369  } else {
370  Real met_h_zeta = Compute_h_zeta_AtKface(i,j,k,cellSizeInv,z_nd);
371  GradCz = (dz_inv/met_h_zeta) * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
372  }
373 
374  if (SurfLayer_on_zlo) {
375  if (qty_index == RhoTheta_comp) {
376  zflux(i,j,k) = hfx_z(i,j,0);
377  } else if (qty_index == RhoQ1_comp) {
378  zflux(i,j,k) = qfx1_z(i,j,0);
379  } else {
380  zflux(i,j,k) = zero;
381  }
382  } else {
383  zflux(i,j,k) = -rhoAlpha * GradCz;
384  }
385 
386  if (qty_index == RhoTheta_comp) {
387  if (!SurfLayer_on_zlo) {
388  hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
389  }
390  } else if (qty_index == RhoQ1_comp) {
391  if (!SurfLayer_on_zlo) {
392  qfx1_z(i,j,k) = zflux(i,j,k) * explicit_fac;
393  }
394  } else if (qty_index == RhoQ2_comp) {
395  qfx2_z(i,j,k) = zflux(i,j,k);
396  }
397 
398  });
399  // Constant alpha & no LES/PBL model
400  } else if(l_consA) {
401  ParallelFor(xbx_g1, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
402  {
403  const int prim_index = qty_index - 1;
404 
405  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i-1, j, k, Rho_comp) );
406  Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
407 
408  Real met_h_xi = Compute_h_xi_AtIface (i,j,k,cellSizeInv,z_nd);
409 
410  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
411  BCVars::RhoScalar_bc_comp : qty_index;
412  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
413  bool SurfLayer_on_zlo = ( use_SurfLayer && rotate && k == dom_lo.z);
414 
415  Real idz_hi = one / (z_cc(i ,j,k+1) - z_cc(i ,j,k-1));
416  Real idz_lo = one / (z_cc(i-1,j,k+1) - z_cc(i-1,j,k-1));
417  Real GradCz = myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i-1, j, k+1, prim_index)*idz_lo
418  - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i-1, j, k-1, prim_index)*idz_lo );
419  Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
420 
421  if (SurfLayer_on_zlo && (qty_index == RhoTheta_comp)) {
422  xflux(i,j,k) = hfx_x(i,j,0);
423  } else if (SurfLayer_on_zlo && (qty_index == RhoQ1_comp)) {
424  xflux(i,j,k) = qfx1_x(i,j,0);
425  } else {
426  xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * ( GradCx - met_h_xi*GradCz );
427  }
428  });
429  ParallelFor(ybx_g1, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
430  {
431  const int prim_index = qty_index - 1;
432 
433  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i, j-1, k, Rho_comp) );
434  Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
435 
436  Real met_h_eta = Compute_h_eta_AtJface (i,j,k,cellSizeInv,z_nd);
437 
438  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
439  BCVars::RhoScalar_bc_comp : qty_index;
440  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
441  bool SurfLayer_on_zlo = ( use_SurfLayer && rotate && k == dom_lo.z);
442 
443  Real idz_hi = one / (z_cc(i,j ,k+1) - z_cc(i,j ,k-1));
444  Real idz_lo = one / (z_cc(i,j-1,k+1) - z_cc(i,j-1,k-1));
445  Real GradCz = myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i, j-1, k+1, prim_index)*idz_lo
446  - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i, j-1, k-1, prim_index)*idz_lo );
447  Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
448 
449  if (SurfLayer_on_zlo && (qty_index == RhoTheta_comp)) {
450  yflux(i,j,k) = hfx_y(i,j,0);
451  } else if (SurfLayer_on_zlo && (qty_index == RhoQ1_comp)) {
452  yflux(i,j,k) = qfx1_y(i,j,0);
453  } else {
454  yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * ( GradCy - met_h_eta*GradCz );
455  }
456  });
457  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
458  {
459  const int prim_index = qty_index - 1;
460 
461  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i, j, k-1, Rho_comp) );
462  Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
463 
464  Real GradCz;
465  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
466  BCVars::RhoScalar_bc_comp : qty_index;
467  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
468  bool ext_dir_on_zlo = ( ((bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir) ||
469  (bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir_prim))
470  && k == dom_lo.z);
471  bool ext_dir_on_zhi = ( ((bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir) ||
472  (bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir_prim))
473  && k == dom_hi.z+1);
474  bool SurfLayer_on_zlo = ( use_SurfLayer && k == dom_lo.z);
475 
476  if (ext_dir_on_zlo) {
477  // Third order stencil with variable dz
478  Real zm = Compute_Z_AtWFace(i,j,k+1,z_nd);
479  Real dz0 = zm - Compute_Z_AtWFace(i,j,k,z_nd);
480  Real dz1 = Compute_Z_AtWFace(i,j,k+2,z_nd) - zm;
481  Real idz0 = one / dz0;
482  Real f = (dz1 / dz0) + two;
483  Real f2 = f*f;
484  Real c3 = two / (f - f2);
485  Real c2 = -f2*c3;
486  Real c1 = -(one-f2)*c3;
487  GradCz = idz0 * ( c1 * cell_prim(i, j, k-1, prim_index)
488  + c2 * cell_prim(i, j, k , prim_index)
489  + c3 * cell_prim(i, j, k+1, prim_index) );
490  } else if (ext_dir_on_zhi) {
491  // Third order stencil with variable dz
492  Real zm = Compute_Z_AtWFace(i,j,k-1,z_nd);
493  Real dz0 = Compute_Z_AtWFace(i,j,k,z_nd) - zm;
494  Real dz1 = zm - Compute_Z_AtWFace(i,j,k-2,z_nd);
495  Real idz0 = one / dz0;
496  Real f = (dz1 / dz0) + two;
497  Real f2 = f*f;
498  Real c3 = two / (f - f2);
499  Real c2 = -f2*c3;
500  Real c1 = -(one-f2)*c3;
501  GradCz = idz0 * ( -( c1 * cell_prim(i, j, k , prim_index)
502  + c2 * cell_prim(i, j, k-1, prim_index)
503  + c3 * cell_prim(i, j, k-2, prim_index) ) );
504  } else {
505  Real met_h_zeta = Compute_h_zeta_AtKface(i,j,k,cellSizeInv,z_nd);
506  GradCz = (dz_inv/met_h_zeta) * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
507  }
508 
509  if (SurfLayer_on_zlo) {
510  if (qty_index == RhoTheta_comp) {
511  zflux(i,j,k) = hfx_z(i,j,0);
512  } else if (qty_index == RhoQ1_comp) {
513  zflux(i,j,k) = qfx1_z(i,j,0);
514  } else {
515  zflux(i,j,k) = zero;
516  }
517  } else {
518  zflux(i,j,k) = -rhoAlpha * GradCz;
519  }
520 
521  if (qty_index == RhoTheta_comp) {
522  if (!SurfLayer_on_zlo) {
523  hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
524  }
525  } else if (qty_index == RhoQ1_comp) {
526  if (!SurfLayer_on_zlo) {
527  qfx1_z(i,j,k) = zflux(i,j,k) * explicit_fac;
528  }
529  } else if (qty_index == RhoQ2_comp) {
530  qfx2_z(i,j,k) = zflux(i,j,k);
531  }
532  });
533  // Constant rho*alpha & no LES/PBL model
534  } else {
535  ParallelFor(xbx_g1, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
536  {
537  const int prim_index = qty_index - 1;
538 
539  Real rhoAlpha = d_alpha_eff[prim_index];
540 
541  Real met_h_xi = Compute_h_xi_AtIface (i,j,k,cellSizeInv,z_nd);
542 
543  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
544  BCVars::RhoScalar_bc_comp : qty_index;
545  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
546  bool SurfLayer_on_zlo = ( use_SurfLayer && rotate && k == dom_lo.z);
547 
548  Real idz_hi = one / (z_cc(i ,j,k+1) - z_cc(i ,j,k-1));
549  Real idz_lo = one / (z_cc(i-1,j,k+1) - z_cc(i-1,j,k-1));
550  Real GradCz = myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i-1, j, k+1, prim_index)*idz_lo
551  - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i-1, j, k-1, prim_index)*idz_lo );
552  Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
553 
554  if (SurfLayer_on_zlo && (qty_index == RhoTheta_comp)) {
555  xflux(i,j,k) = hfx_x(i,j,0);
556  } else if (SurfLayer_on_zlo && (qty_index == RhoQ1_comp)) {
557  xflux(i,j,k) = qfx1_x(i,j,0);
558  } else {
559  xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * ( GradCx - met_h_xi*GradCz );
560  }
561  });
562  ParallelFor(ybx_g1, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
563  {
564  const int prim_index = qty_index - 1;
565 
566  Real rhoAlpha = d_alpha_eff[prim_index];
567 
568  Real met_h_eta = Compute_h_eta_AtJface (i,j,k,cellSizeInv,z_nd);
569 
570  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
571  BCVars::RhoScalar_bc_comp : qty_index;
572  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
573  bool SurfLayer_on_zlo = ( use_SurfLayer && rotate && k == dom_lo.z);
574 
575  Real idz_hi = one / (z_cc(i,j ,k+1) - z_cc(i,j ,k-1));
576  Real idz_lo = one / (z_cc(i,j-1,k+1) - z_cc(i,j-1,k-1));
577  Real GradCz = myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i, j-1, k+1, prim_index)*idz_lo
578  - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i, j-1, k-1, prim_index)*idz_lo );
579  Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
580 
581  if (SurfLayer_on_zlo && (qty_index == RhoTheta_comp)) {
582  yflux(i,j,k) = hfx_y(i,j,0);
583  } else if (SurfLayer_on_zlo && (qty_index == RhoQ1_comp)) {
584  yflux(i,j,k) = qfx1_y(i,j,0);
585  } else {
586  yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * ( GradCy - met_h_eta*GradCz );
587  }
588  });
589  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
590  {
591  const int prim_index = qty_index - 1;
592 
593  Real rhoAlpha = d_alpha_eff[prim_index];
594 
595 
596  Real GradCz;
597  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
598  BCVars::RhoScalar_bc_comp : qty_index;
599  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
600  bool ext_dir_on_zlo = ( ((bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir) ||
601  (bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir_prim))
602  && k == dom_lo.z);
603  bool ext_dir_on_zhi = ( ((bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir) ||
604  (bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir_prim))
605  && k == dom_hi.z+1);
606  bool SurfLayer_on_zlo = ( use_SurfLayer && k == dom_lo.z);
607 
608  if (ext_dir_on_zlo) {
609  // Third order stencil with variable dz
610  Real zm = Compute_Z_AtWFace(i,j,k+1,z_nd);
611  Real dz0 = zm - Compute_Z_AtWFace(i,j,k,z_nd);
612  Real dz1 = Compute_Z_AtWFace(i,j,k+2,z_nd) - zm;
613  Real idz0 = one / dz0;
614  Real f = (dz1 / dz0) + two;
615  Real f2 = f*f;
616  Real c3 = two / (f - f2);
617  Real c2 = -f2*c3;
618  Real c1 = -(one-f2)*c3;
619  GradCz = idz0 * ( c1 * cell_prim(i, j, k-1, prim_index)
620  + c2 * cell_prim(i, j, k , prim_index)
621  + c3 * cell_prim(i, j, k+1, prim_index) );
622  } else if (ext_dir_on_zhi) {
623  // Third order stencil with variable dz
624  Real zm = Compute_Z_AtWFace(i,j,k-1,z_nd);
625  Real dz0 = Compute_Z_AtWFace(i,j,k,z_nd) - zm;
626  Real dz1 = zm - Compute_Z_AtWFace(i,j,k-2,z_nd);
627  Real idz0 = one / dz0;
628  Real f = (dz1 / dz0) + two;
629  Real f2 = f*f;
630  Real c3 = two / (f - f2);
631  Real c2 = -f2*c3;
632  Real c1 = -(one-f2)*c3;
633  GradCz = idz0 * ( -( c1 * cell_prim(i, j, k , prim_index)
634  + c2 * cell_prim(i, j, k-1, prim_index)
635  + c3 * cell_prim(i, j, k-2, prim_index) ) );
636  } else {
637  Real met_h_zeta = Compute_h_zeta_AtKface(i,j,k,cellSizeInv,z_nd);
638  GradCz = (dz_inv/met_h_zeta) * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
639  }
640 
641  if (SurfLayer_on_zlo) {
642  if (qty_index == RhoTheta_comp) {
643  zflux(i,j,k) = hfx_z(i,j,0);
644  } else if (qty_index == RhoQ1_comp) {
645  zflux(i,j,k) = qfx1_z(i,j,0);
646  } else {
647  zflux(i,j,k) = zero;
648  }
649  } else {
650  zflux(i,j,k) = -rhoAlpha * GradCz;
651  }
652 
653  if (qty_index == RhoTheta_comp) {
654  if (!SurfLayer_on_zlo) {
655  hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
656  }
657  } else if (qty_index == RhoQ1_comp) {
658  if (!SurfLayer_on_zlo) {
659  qfx1_z(i,j,k) = zflux(i,j,k) * explicit_fac;
660  }
661  } else if (qty_index == RhoQ2_comp) {
662  qfx2_z(i,j,k) = zflux(i,j,k);
663  }
664  });
665  }
666 
667  // NOTE: With terrain, we implicitly treat the leading order vertical gradient (no metric terms)
668  // This allows us to do semi-implicit discretization of the vertical diffusive terms
669  if (qty_index == RhoTheta_comp ||
670  qty_index == RhoKE_comp ||
671  qty_index == RhoQ1_comp) {
672  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
673  {
674  zflux(i,j,k) *= explicit_fac;
675  });
676  }
677 
678  //-----------------------------------------------------------------------------------
679  //
680  // Modify fluxes by terrain and use fluxes to compute RHS
681  //
682  // Note that we combine all of these operations in order to keep this section
683  // of the loop tiling-safe.
684  //-----------------------------------------------------------------------------------
685  ParallelFor(bx,[=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
686  {
687  Real xfluxbar_lo, yfluxbar_lo;
688  Real met_h_xi_lo = Compute_h_xi_AtKface (i,j,k ,cellSizeInv,z_nd);
689  Real met_h_eta_lo = Compute_h_eta_AtKface(i,j,k ,cellSizeInv,z_nd);
690  if (k == dom_lo.z) {
691  Real xfluxlo = myhalf * ( xflux(i,j,k ) + xflux(i+1,j,k ) );
692  Real xfluxhi = myhalf * ( xflux(i,j,k+1) + xflux(i+1,j,k+1) );
693  xfluxbar_lo = Real(1.5)*xfluxlo - myhalf*xfluxhi;
694 
695  Real yfluxlo = myhalf * ( yflux(i,j,k ) + yflux(i,j+1,k ) );
696  Real yfluxhi = myhalf * ( yflux(i,j,k+1) + yflux(i,j+1,k+1) );
697  yfluxbar_lo = Real(1.5)*yfluxlo - myhalf*yfluxhi;
698  } else {
699  xfluxbar_lo = fourth * ( xflux(i,j,k ) + xflux(i+1,j ,k )
700  + xflux(i,j,k-1) + xflux(i+1,j ,k-1) );
701  yfluxbar_lo = fourth * ( yflux(i,j,k ) + yflux(i ,j+1,k )
702  + yflux(i,j,k-1) + yflux(i ,j+1,k-1) );
703  }
704 
705  Real xfluxbar_hi, yfluxbar_hi;
706  Real met_h_xi_hi = Compute_h_xi_AtKface (i,j,k+1,cellSizeInv,z_nd);
707  Real met_h_eta_hi = Compute_h_eta_AtKface(i,j,k+1,cellSizeInv,z_nd);
708  if (k == dom_hi.z) {
709  Real xfluxlo = myhalf * ( xflux(i,j,k-1) + xflux(i+1,j,k-1) );
710  Real xfluxhi = myhalf * ( xflux(i,j,k ) + xflux(i+1,j,k ) );
711  xfluxbar_hi = Real(1.5)*xfluxhi - myhalf*xfluxlo;
712 
713  Real yfluxlo = myhalf * ( yflux(i,j,k-1) + yflux(i,j+1,k-1) );
714  Real yfluxhi = myhalf * ( yflux(i,j,k ) + yflux(i,j+1,k ) );
715  yfluxbar_hi = Real(1.5)*yfluxhi - myhalf*yfluxlo;
716  } else {
717  xfluxbar_hi = fourth * ( xflux(i,j,k+1) + xflux(i+1,j ,k+1)
718  + xflux(i,j,k ) + xflux(i+1,j ,k ) );
719  yfluxbar_hi = fourth * ( yflux(i,j,k+1) + yflux(i ,j+1,k+1)
720  + yflux(i,j,k ) + yflux(i ,j+1,k ) );
721  }
722 
723  // Allow semi-implicit discretization of the vertical diffusive terms
724  Real zflux_lo;
725  if ( use_SurfLayer &&
726  k == dom_lo.z &&
727  qty_index != RhoTheta_comp &&
728  qty_index != RhoQ1_comp ) {
729  zflux_lo = zero;
730  } else {
731  zflux_lo = zflux(i,j,k )
732  - met_h_xi_lo * mf_mx(i,j,0) * xfluxbar_lo
733  - met_h_eta_lo * mf_my(i,j,0) * yfluxbar_lo;
734  }
735  Real zflux_hi = zflux(i,j,k+1)
736  - met_h_xi_hi * mf_mx(i,j,0) * xfluxbar_hi
737  - met_h_eta_hi * mf_my(i,j,0) * yfluxbar_hi;
738 
739  Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
740  Real stateContrib = ( xflux(i+1,j ,k ) * ax(i+1,j,k) / mf_uy(i+1,j,0)
741  -xflux(i ,j ,k ) * ax(i ,j,k) / mf_uy(i ,j,0) ) * dx_inv * mfsq // Diffusive flux in x-dir
742  +( yflux(i ,j+1,k ) * ay(i,j+1,k) / mf_vx(i,j+1,0)
743  -yflux(i ,j ,k ) * ay(i,j ,k) / mf_vx(i,j ,0) ) * dy_inv * mfsq // Diffusive flux in y-dir
744  +( zflux_hi - zflux_lo) * dz_inv; // Diffusive flux in z-dir
745 
746  stateContrib /= detJ(i,j,k);
747 
748  cell_rhs(i,j,k,qty_index) -= stateContrib;
749  });
750  } // n
751 
752  const PBLDerivativeDzInv_T pbl_derivative_dz_inv{z_cc};
753 #include "ERF_AddTKESources.H"
754 #include "ERF_AddQKESources.H"
755 }
constexpr amrex::Real two
Definition: ERF_Constants.H:10
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real fourth
Definition: ERF_Constants.H:14
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
void DiffusionSrcForState_T(const Box &bx, const Box &domain, int start_comp, int num_comp, const bool &rotate, const Array4< const Real > &u, const Array4< const Real > &v, const Array4< const Real > &cell_data, const Array4< const Real > &cell_prim, const Array4< Real > &cell_rhs, const Array4< Real > &xflux, const Array4< Real > &yflux, const Array4< Real > &zflux, const Array4< const Real > &z_nd, const Array4< const Real > &z_cc, const Array4< const Real > &ax, const Array4< const Real > &ay, const Array4< const Real > &, const Array4< const Real > &detJ, const GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &SmnSmn_a, const Array4< const Real > &mf_mx, const Array4< const Real > &mf_ux, const Array4< const Real > &mf_vx, const Array4< const Real > &mf_my, const Array4< const Real > &mf_uy, const Array4< const Real > &mf_vy, Array4< Real > &hfx_x, Array4< Real > &hfx_y, Array4< Real > &hfx_z, Array4< Real > &qfx1_x, Array4< Real > &qfx1_y, Array4< Real > &qfx1_z, Array4< Real > &qfx2_z, Array4< Real > &diss, const Array4< const Real > &mu_turb, const SolverChoice &solverChoice, const int level, const Array4< const Real > &tm_arr, const GpuArray< Real, AMREX_SPACEDIM > grav_gpu, const BCRec *bc_ptr, const bool use_SurfLayer, const Real implicit_fac)
Definition: ERF_DiffusionSrcForState_T.cpp:55
#define RhoScalar_comp
Definition: ERF_IndexDefines.H:40
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:43
#define NSCALARS
Definition: ERF_IndexDefines.H:16
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
#define PrimScalar_comp
Definition: ERF_IndexDefines.H:57
#define RhoKE_comp
Definition: ERF_IndexDefines.H:38
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtIface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:117
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtKface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:184
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Z_AtWFace(const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:376
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtKface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:198
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtJface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:170
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtKface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:211
@ RhoScalar_bc_comp
Definition: ERF_IndexDefines.H:90
@ ext_dir
Definition: ERF_IndexDefines.H:249
@ ext_dir_prim
Definition: ERF_IndexDefines.H:252
real(c_double), parameter c2
Definition: ERF_module_model_constants.F90:35
real(c_double), private c1
Definition: ERF_module_mp_morr_two_moment.F90:212
Definition: ERF_PBLModels.H:416
Here is the call graph for this function: