79 const Real explicit_fac =
one - implicit_fac;
82 Real l_abs_g = std::abs(grav_gpu[2]);
84 int klo = domain.smallEnd(2);
85 int khi = domain.bigEnd(2);
86 auto dz_ptr = stretched_dz_d.data();
88 for (
int n(0); n<num_comp; ++n) {
89 const int qty_index = start_comp + n;
92 if (l_consA && l_turb) {
93 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
95 const int prim_index = qty_index - 1;
99 Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
100 rhoAlpha +=
myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_scal_index])
101 + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_scal_index]) );
107 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
109 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
111 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
113 const int prim_index = qty_index - 1;
117 Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
118 rhoAlpha +=
myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_scal_index])
119 + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_scal_index]) );
125 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
127 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
129 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
131 const int prim_index = qty_index - 1;
135 Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
136 rhoAlpha +=
myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_scal_index])
137 + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_scal_index]) );
149 bool SurfLayer_on_zlo = ( use_SurfLayer && k == dom_lo.z);
151 if (ext_dir_on_zlo) {
153 Real dz0 = dz_ptr[k];
154 Real dz1 = dz_ptr[k+1];
161 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
162 +
c2 * cell_prim(i, j, k , prim_index)
163 + c3 * cell_prim(i, j, k+1, prim_index) );
164 }
else if (ext_dir_on_zhi) {
166 Real dz0 = dz_ptr[k-1];
167 Real dz1 = dz_ptr[k-2];
174 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
175 +
c2 * cell_prim(i, j, k-1, prim_index)
176 + c3 * cell_prim(i, j, k-2, prim_index) ) );
180 dzk_inv =
one / dz_ptr[k];
181 }
else if (k==(
khi+1)) {
182 dzk_inv =
one / dz_ptr[k-1];
184 dzk_inv =
two / (dz_ptr[k] + dz_ptr[k-1]);
186 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
189 if (SurfLayer_on_zlo) {
191 zflux(i,j,k) = hfx_z(i,j,0);
193 zflux(i,j,k) = qfx1_z(i,j,0);
198 zflux(i,j,k) = -rhoAlpha * GradCz;
202 if (!SurfLayer_on_zlo) {
203 hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
206 if (!SurfLayer_on_zlo) {
207 qfx1_z(i,j,k) = zflux(i,j,k) * explicit_fac;
210 qfx2_z(i,j,k) = zflux(i,j,k);
215 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
217 const int prim_index = qty_index - 1;
219 Real rhoAlpha = d_alpha_eff[prim_index];
220 rhoAlpha +=
myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_index])
221 + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_index]) );
227 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
229 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
231 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
233 const int prim_index = qty_index - 1;
235 Real rhoAlpha = d_alpha_eff[prim_index];
236 rhoAlpha +=
myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_index])
237 + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_index]) );
243 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
245 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
247 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
249 const int prim_index = qty_index - 1;
251 Real rhoAlpha = d_alpha_eff[prim_index];
252 rhoAlpha +=
myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_index])
253 + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_index]) );
266 if (ext_dir_on_zlo) {
268 Real dz0 = dz_ptr[k];
269 Real dz1 = dz_ptr[k+1];
276 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
277 +
c2 * cell_prim(i, j, k , prim_index)
278 + c3 * cell_prim(i, j, k+1, prim_index) );
279 }
else if (ext_dir_on_zhi) {
281 Real dz0 = dz_ptr[k-1];
282 Real dz1 = dz_ptr[k-2];
289 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
290 +
c2 * cell_prim(i, j, k-1, prim_index)
291 + c3 * cell_prim(i, j, k-2, prim_index) ) );
295 dzk_inv =
one / dz_ptr[k];
296 }
else if (k==(
khi+1)) {
297 dzk_inv =
one / dz_ptr[k-1];
299 dzk_inv =
two / (dz_ptr[k] + dz_ptr[k-1]);
301 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
304 bool SurfLayer_on_zlo = ( use_SurfLayer && k == dom_lo.z);
306 if (SurfLayer_on_zlo) {
308 zflux(i,j,k) = hfx_z(i,j,0);
310 zflux(i,j,k) = qfx1_z(i,j,0);
315 zflux(i,j,k) = -rhoAlpha * GradCz;
319 if (!SurfLayer_on_zlo) {
320 hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
323 if (!SurfLayer_on_zlo) {
324 qfx1_z(i,j,k) = zflux(i,j,k) * explicit_fac;
327 qfx2_z(i,j,k) = zflux(i,j,k);
332 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
334 const int prim_index = qty_index - 1;
337 Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
343 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
345 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
347 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
349 const int prim_index = qty_index - 1;
352 Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
358 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
360 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
362 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
364 const int prim_index = qty_index - 1;
367 Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
380 if (ext_dir_on_zlo) {
382 Real dz0 = dz_ptr[k];
383 Real dz1 = dz_ptr[k+1];
390 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
391 +
c2 * cell_prim(i, j, k , prim_index)
392 + c3 * cell_prim(i, j, k+1, prim_index) );
393 }
else if (ext_dir_on_zhi) {
395 Real dz0 = dz_ptr[k-1];
396 Real dz1 = dz_ptr[k-2];
403 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
404 +
c2 * cell_prim(i, j, k-1, prim_index)
405 + c3 * cell_prim(i, j, k-2, prim_index) ) );
409 dzk_inv =
one / dz_ptr[k];
410 }
else if (k==(
khi+1)) {
411 dzk_inv =
one / dz_ptr[k-1];
413 dzk_inv =
two / (dz_ptr[k] + dz_ptr[k-1]);
415 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
418 bool SurfLayer_on_zlo = ( use_SurfLayer && k == dom_lo.z);
420 if (SurfLayer_on_zlo) {
422 zflux(i,j,k) = hfx_z(i,j,0);
424 zflux(i,j,k) = qfx1_z(i,j,0);
429 zflux(i,j,k) = -rhoAlpha * GradCz;
433 if (!SurfLayer_on_zlo) {
434 hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
437 if (!SurfLayer_on_zlo) {
438 qfx1_z(i,j,k) = zflux(i,j,k) * explicit_fac;
441 qfx2_z(i,j,k) = zflux(i,j,k);
446 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
448 const int prim_index = qty_index - 1;
450 Real rhoAlpha = d_alpha_eff[prim_index];
456 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
458 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
460 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
462 const int prim_index = qty_index - 1;
464 Real rhoAlpha = d_alpha_eff[prim_index];
470 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
472 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
474 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
476 const int prim_index = qty_index - 1;
478 Real rhoAlpha = d_alpha_eff[prim_index];
491 if (ext_dir_on_zlo) {
493 Real dz0 = dz_ptr[k];
494 Real dz1 = dz_ptr[k+1];
501 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
502 +
c2 * cell_prim(i, j, k , prim_index)
503 + c3 * cell_prim(i, j, k+1, prim_index) );
504 }
else if (ext_dir_on_zhi) {
506 Real dz0 = dz_ptr[k-1];
507 Real dz1 = dz_ptr[k-2];
514 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
515 +
c2 * cell_prim(i, j, k-1, prim_index)
516 + c3 * cell_prim(i, j, k-2, prim_index) ) );
520 dzk_inv =
one / dz_ptr[k];
521 }
else if (k==(
khi+1)) {
522 dzk_inv =
one / dz_ptr[k-1];
524 dzk_inv =
two / (dz_ptr[k] + dz_ptr[k-1]);
526 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
529 bool SurfLayer_on_zlo = ( use_SurfLayer && k == dom_lo.z);
531 if (SurfLayer_on_zlo) {
533 zflux(i,j,k) = hfx_z(i,j,0);
535 zflux(i,j,k) = qfx1_z(i,j,0);
540 zflux(i,j,k) = -rhoAlpha * GradCz;
544 if (!SurfLayer_on_zlo) {
545 hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
548 if (!SurfLayer_on_zlo) {
549 qfx1_z(i,j,k) = zflux(i,j,k) * explicit_fac;
552 qfx2_z(i,j,k) = zflux(i,j,k);
558 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
560 xflux(i,j,k) /= mf_uy(i,j,0);
562 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
564 yflux(i,j,k) /= mf_vx(i,j,0);
571 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
573 zflux(i,j,k) *= explicit_fac;
579 ParallelFor(bx,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
581 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
582 Real dzk_inv =
one / dz_ptr[k];
583 Real stateContrib = (xflux(i+1,j ,k ) - xflux(i, j, k)) * dx_inv * mfsq
584 +(yflux(i ,j+1,k ) - yflux(i, j, k)) * dy_inv * mfsq
585 +(zflux(i ,j ,k+1) - zflux(i, j, k)) * dzk_inv;
587 cell_rhs(i,j,k,qty_index) -= stateContrib;
constexpr amrex::Real two
Definition: ERF_Constants.H:10
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
void DiffusionSrcForState_S(const Box &bx, const Box &domain, int start_comp, int num_comp, 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 Gpu::DeviceVector< Real > &stretched_dz_d, 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_z, 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_S.cpp:45
#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
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
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
@ 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:398