75 const Real explicit_fac = 1.0 - implicit_fac;
78 Real l_abs_g = std::abs(grav_gpu[2]);
80 int klo = domain.smallEnd(2);
81 int khi = domain.bigEnd(2);
82 auto dz_ptr = stretched_dz_d.data();
84 for (
int n(0); n<num_comp; ++n) {
85 const int qty_index = start_comp + n;
89 ParallelFor(
xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
91 const int prim_index = qty_index - 1;
103 Real GradCx =
dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
105 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
107 ParallelFor(
ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
109 const int prim_index = qty_index - 1;
114 rhoAlpha += 0.5 * ( mu_turb(i, j , k,
d_eddy_diff_idy[prim_scal_index])
121 Real GradCy =
dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
123 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
125 ParallelFor(
zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
127 const int prim_index = qty_index - 1;
132 rhoAlpha += 0.5 * ( mu_turb(i, j, k ,
d_eddy_diff_idz[prim_scal_index])
145 bool SurfLayer_on_zlo = ( use_SurfLayer && k ==
dom_lo.z);
147 if (ext_dir_on_zlo) {
149 Real dz0 = dz_ptr[k];
150 Real dz1 = dz_ptr[k+1];
151 Real idz0 = 1.0 / dz0;
152 Real f = (dz1 / dz0) + 2.0;
154 Real c3 = 2.0 / (f - f2);
157 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
158 +
c2 * cell_prim(i, j, k , prim_index)
159 + c3 * cell_prim(i, j, k+1, prim_index) );
160 }
else if (ext_dir_on_zhi) {
162 Real dz0 = dz_ptr[k-1];
163 Real dz1 = dz_ptr[k-2];
164 Real idz0 = 1.0 / dz0;
165 Real f = (dz1 / dz0) + 2.0;
167 Real c3 = 2.0 / (f - f2);
170 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
171 +
c2 * cell_prim(i, j, k-1, prim_index)
172 + c3 * cell_prim(i, j, k-2, prim_index) ) );
176 dzk_inv = 1.0 / dz_ptr[k];
177 }
else if (k==(khi+1)) {
178 dzk_inv = 1.0 / dz_ptr[k-1];
180 dzk_inv = 2.0 / (dz_ptr[k] + dz_ptr[k-1]);
182 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
186 zflux(i,j,k) = hfx_z(i,j,0);
187 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
188 zflux(i,j,k) = qfx1_z(i,j,0);
190 zflux(i,j,k) = -rhoAlpha * GradCz;
194 if (!SurfLayer_on_zlo) {
195 hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
198 if (!SurfLayer_on_zlo) {
199 qfx1_z(i,j,k) = zflux(i,j,k);
202 qfx2_z(i,j,k) = zflux(i,j,k);
207 ParallelFor(
xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
209 const int prim_index = qty_index - 1;
219 Real GradCx =
dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
221 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
223 ParallelFor(
ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
225 const int prim_index = qty_index - 1;
235 Real GradCy =
dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
237 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
239 ParallelFor(
zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
241 const int prim_index = qty_index - 1;
258 if (ext_dir_on_zlo) {
260 Real dz0 = dz_ptr[k];
261 Real dz1 = dz_ptr[k+1];
262 Real idz0 = 1.0 / dz0;
263 Real f = (dz1 / dz0) + 2.0;
265 Real c3 = 2.0 / (f - f2);
268 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
269 +
c2 * cell_prim(i, j, k , prim_index)
270 + c3 * cell_prim(i, j, k+1, prim_index) );
271 }
else if (ext_dir_on_zhi) {
273 Real dz0 = dz_ptr[k-1];
274 Real dz1 = dz_ptr[k-2];
275 Real idz0 = 1.0 / dz0;
276 Real f = (dz1 / dz0) + 2.0;
278 Real c3 = 2.0 / (f - f2);
281 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
282 +
c2 * cell_prim(i, j, k-1, prim_index)
283 + c3 * cell_prim(i, j, k-2, prim_index) ) );
287 dzk_inv = 1.0 / dz_ptr[k];
288 }
else if (k==(khi+1)) {
289 dzk_inv = 1.0 / dz_ptr[k-1];
291 dzk_inv = 2.0 / (dz_ptr[k] + dz_ptr[k-1]);
293 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
296 bool SurfLayer_on_zlo = ( use_SurfLayer && k ==
dom_lo.z);
299 zflux(i,j,k) = hfx_z(i,j,0);
300 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
301 zflux(i,j,k) = qfx1_z(i,j,0);
303 zflux(i,j,k) = -rhoAlpha * GradCz;
307 if (!SurfLayer_on_zlo) {
308 hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
311 if (!SurfLayer_on_zlo) {
312 qfx1_z(i,j,k) = zflux(i,j,k);
315 qfx2_z(i,j,k) = zflux(i,j,k);
320 ParallelFor(
xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
322 const int prim_index = qty_index - 1;
331 Real GradCx =
dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
333 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
335 ParallelFor(
ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
337 const int prim_index = qty_index - 1;
346 Real GradCy =
dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
348 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
350 ParallelFor(
zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
352 const int prim_index = qty_index - 1;
368 if (ext_dir_on_zlo) {
370 Real dz0 = dz_ptr[k];
371 Real dz1 = dz_ptr[k+1];
372 Real idz0 = 1.0 / dz0;
373 Real f = (dz1 / dz0) + 2.0;
375 Real c3 = 2.0 / (f - f2);
378 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
379 +
c2 * cell_prim(i, j, k , prim_index)
380 + c3 * cell_prim(i, j, k+1, prim_index) );
381 }
else if (ext_dir_on_zhi) {
383 Real dz0 = dz_ptr[k-1];
384 Real dz1 = dz_ptr[k-2];
385 Real idz0 = 1.0 / dz0;
386 Real f = (dz1 / dz0) + 2.0;
388 Real c3 = 2.0 / (f - f2);
391 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
392 +
c2 * cell_prim(i, j, k-1, prim_index)
393 + c3 * cell_prim(i, j, k-2, prim_index) ) );
397 dzk_inv = 1.0 / dz_ptr[k];
398 }
else if (k==(khi+1)) {
399 dzk_inv = 1.0 / dz_ptr[k-1];
401 dzk_inv = 2.0 / (dz_ptr[k] + dz_ptr[k-1]);
403 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
406 bool SurfLayer_on_zlo = ( use_SurfLayer && k ==
dom_lo.z);
409 zflux(i,j,k) = hfx_z(i,j,0);
410 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
411 zflux(i,j,k) = qfx1_z(i,j,0);
413 zflux(i,j,k) = -rhoAlpha * GradCz;
417 if (!SurfLayer_on_zlo) {
418 hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
421 if (!SurfLayer_on_zlo) {
422 qfx1_z(i,j,k) = zflux(i,j,k);
425 qfx2_z(i,j,k) = zflux(i,j,k);
430 ParallelFor(
xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
432 const int prim_index = qty_index - 1;
440 Real GradCx =
dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
442 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
444 ParallelFor(
ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
446 const int prim_index = qty_index - 1;
454 Real GradCy =
dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
456 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
458 ParallelFor(
zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
460 const int prim_index = qty_index - 1;
475 if (ext_dir_on_zlo) {
477 Real dz0 = dz_ptr[k];
478 Real dz1 = dz_ptr[k+1];
479 Real idz0 = 1.0 / dz0;
480 Real f = (dz1 / dz0) + 2.0;
482 Real c3 = 2.0 / (f - f2);
485 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
486 +
c2 * cell_prim(i, j, k , prim_index)
487 + c3 * cell_prim(i, j, k+1, prim_index) );
488 }
else if (ext_dir_on_zhi) {
490 Real dz0 = dz_ptr[k-1];
491 Real dz1 = dz_ptr[k-2];
492 Real idz0 = 1.0 / dz0;
493 Real f = (dz1 / dz0) + 2.0;
495 Real c3 = 2.0 / (f - f2);
498 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
499 +
c2 * cell_prim(i, j, k-1, prim_index)
500 + c3 * cell_prim(i, j, k-2, prim_index) ) );
504 dzk_inv = 1.0 / dz_ptr[k];
505 }
else if (k==(khi+1)) {
506 dzk_inv = 1.0 / dz_ptr[k-1];
508 dzk_inv = 2.0 / (dz_ptr[k] + dz_ptr[k-1]);
510 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
513 bool SurfLayer_on_zlo = ( use_SurfLayer && k ==
dom_lo.z);
516 zflux(i,j,k) = hfx_z(i,j,0);
517 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
518 zflux(i,j,k) = qfx1_z(i,j,0);
520 zflux(i,j,k) = -rhoAlpha * GradCz;
524 if (!SurfLayer_on_zlo) {
525 hfx_z(i,j,k) = zflux(i,j,k) * explicit_fac;
528 if (!SurfLayer_on_zlo) {
529 qfx1_z(i,j,k) = zflux(i,j,k);
532 qfx2_z(i,j,k) = zflux(i,j,k);
538 ParallelFor(
xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
540 xflux(i,j,k) /= mf_uy(i,j,0);
542 ParallelFor(
ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
544 yflux(i,j,k) /= mf_vx(i,j,0);
549 ParallelFor(
zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
551 zflux(i,j,k) *= explicit_fac;
557 ParallelFor(bx,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
559 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
560 Real dzk_inv = 1.0 / dz_ptr[k];
561 Real stateContrib = (xflux(i+1,j ,k ) - xflux(i, j, k)) *
dx_inv * mfsq
562 +(yflux(i ,j+1,k ) - yflux(i, j, k)) *
dy_inv * mfsq
563 +(zflux(i ,j ,k+1) - zflux(i, j, k)) * dzk_inv;
565 cell_rhs(i,j,k,qty_index) -= stateContrib;
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:41
const int bc_comp
Definition: ERF_Implicit.H:8
#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:52
int * d_eddy_diff_idx
Definition: ERF_SetupDiff.H:47
const Box zbx
Definition: ERF_SetupDiff.H:9
const Real dx_inv
Definition: ERF_SetupDiff.H:4
const Real dy_inv
Definition: ERF_SetupDiff.H:5
int * d_eddy_diff_idy
Definition: ERF_SetupDiff.H:48
const Box xbx
Definition: ERF_SetupDiff.H:7
const Box ybx
Definition: ERF_SetupDiff.H:8
const auto & dom_hi
Definition: ERF_SetupVertDiff.H:2
bool l_turb
Definition: ERF_SetupVertDiff.H:8
const auto & dom_lo
Definition: ERF_SetupVertDiff.H:1
bool l_consA
Definition: ERF_SetupVertDiff.H:7
int * d_eddy_diff_idz
Definition: ERF_SetupVertDiff.H:107
Real * d_alpha_eff
Definition: ERF_SetupVertDiff.H:104
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ RhoScalar_bc_comp
Definition: ERF_IndexDefines.H:80
@ ext_dir
Definition: ERF_IndexDefines.H:209
@ ext_dir_prim
Definition: ERF_IndexDefines.H:211
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