84 const Real explicit_fac =
one - implicit_fac;
87 Real l_abs_g = std::abs(grav_gpu[2]);
89 int klo = domain.smallEnd(2);
90 int khi = domain.bigEnd(2);
91 auto dz_ptr = stretched_dz_d.data();
93 for (
int n(0); n<num_comp; ++n) {
94 const int qty_index = start_comp + n;
97 if (l_consA && l_turb) {
98 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
100 const int prim_index = qty_index - 1;
104 Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
105 rhoAlpha +=
myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_scal_index])
106 + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_scal_index]) );
112 bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
113 bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
115 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
117 if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoTheta_comp)) {
118 xflux(i,j,k) = hfx_x(i,j,k);
119 }
else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoQ1_comp)) {
120 xflux(i,j,k) = qfx1_x(i,j,k);
122 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
126 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
128 const int prim_index = qty_index - 1;
132 Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
133 rhoAlpha +=
myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_scal_index])
134 + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_scal_index]) );
139 bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
140 bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
142 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
144 if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoTheta_comp)) {
145 yflux(i,j,k) = hfx_y(i,j,k);
146 }
else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoQ1_comp)) {
147 yflux(i,j,k) = qfx1_y(i,j,k);
149 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
153 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
155 const int prim_index = qty_index - 1;
159 Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
160 rhoAlpha +=
myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_scal_index])
161 + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_scal_index]) );
173 bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
174 bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
176 if (ext_dir_on_zlo) {
178 Real dz0 = dz_ptr[k];
179 Real dz1 = dz_ptr[k+1];
186 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
187 +
c2 * cell_prim(i, j, k , prim_index)
188 + c3 * cell_prim(i, j, k+1, prim_index) );
189 }
else if (ext_dir_on_zhi) {
191 Real dz0 = dz_ptr[k-1];
192 Real dz1 = dz_ptr[k-2];
199 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
200 +
c2 * cell_prim(i, j, k-1, prim_index)
201 + c3 * cell_prim(i, j, k-2, prim_index) ) );
205 dzk_inv =
one / dz_ptr[k];
206 }
else if (k==(
khi+1)) {
207 dzk_inv =
one / dz_ptr[k-1];
209 dzk_inv =
two / (dz_ptr[k] + dz_ptr[k-1]);
211 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
214 if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
216 zflux(i,j,k) = hfx_z(i,j,k);
218 zflux(i,j,k) = qfx1_z(i,j,k);
223 zflux(i,j,k) = -rhoAlpha * GradCz;
227 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
228 hfx_z(i,j,k) = zflux(i,j,k);
231 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
232 qfx1_z(i,j,k) = zflux(i,j,k);
235 qfx2_z(i,j,k) = zflux(i,j,k);
240 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
242 const int prim_index = qty_index - 1;
244 Real rhoAlpha = d_alpha_eff[prim_index];
245 rhoAlpha +=
myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_index])
246 + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_index]) );
251 bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
252 bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
254 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
256 if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoTheta_comp)) {
257 xflux(i,j,k) = hfx_x(i,j,k);
258 }
else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoQ1_comp)) {
259 xflux(i,j,k) = qfx1_x(i,j,k);
261 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
265 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
267 const int prim_index = qty_index - 1;
269 Real rhoAlpha = d_alpha_eff[prim_index];
270 rhoAlpha +=
myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_index])
271 + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_index]) );
276 bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
277 bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
279 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
281 if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoTheta_comp)) {
282 yflux(i,j,k) = hfx_y(i,j,k);
283 }
else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoQ1_comp)) {
284 yflux(i,j,k) = qfx1_y(i,j,k);
286 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
290 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
292 const int prim_index = qty_index - 1;
294 Real rhoAlpha = d_alpha_eff[prim_index];
295 rhoAlpha +=
myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_index])
296 + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_index]) );
308 bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
309 bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
311 if (ext_dir_on_zlo) {
313 Real dz0 = dz_ptr[k];
314 Real dz1 = dz_ptr[k+1];
321 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
322 +
c2 * cell_prim(i, j, k , prim_index)
323 + c3 * cell_prim(i, j, k+1, prim_index) );
324 }
else if (ext_dir_on_zhi) {
326 Real dz0 = dz_ptr[k-1];
327 Real dz1 = dz_ptr[k-2];
334 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
335 +
c2 * cell_prim(i, j, k-1, prim_index)
336 + c3 * cell_prim(i, j, k-2, prim_index) ) );
340 dzk_inv =
one / dz_ptr[k];
341 }
else if (k==(
khi+1)) {
342 dzk_inv =
one / dz_ptr[k-1];
344 dzk_inv =
two / (dz_ptr[k] + dz_ptr[k-1]);
346 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
349 if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
351 zflux(i,j,k) = hfx_z(i,j,k);
353 zflux(i,j,k) = qfx1_z(i,j,k);
358 zflux(i,j,k) = -rhoAlpha * GradCz;
362 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
363 hfx_z(i,j,k) = zflux(i,j,k);
366 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
367 qfx1_z(i,j,k) = zflux(i,j,k);
370 qfx2_z(i,j,k) = zflux(i,j,k);
375 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
377 const int prim_index = qty_index - 1;
380 Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
385 bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
386 bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
388 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
390 if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoTheta_comp)) {
391 xflux(i,j,k) = hfx_x(i,j,k);
392 }
else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoQ1_comp)) {
393 xflux(i,j,k) = qfx1_x(i,j,k);
395 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
399 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
401 const int prim_index = qty_index - 1;
404 Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
409 bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
410 bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
412 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
414 if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoTheta_comp)) {
415 yflux(i,j,k) = hfx_y(i,j,k);
416 }
else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoQ1_comp)) {
417 yflux(i,j,k) = qfx1_y(i,j,k);
419 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
423 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
425 const int prim_index = qty_index - 1;
428 Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
440 bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
441 bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
443 if (ext_dir_on_zlo) {
445 Real dz0 = dz_ptr[k];
446 Real dz1 = dz_ptr[k+1];
453 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
454 +
c2 * cell_prim(i, j, k , prim_index)
455 + c3 * cell_prim(i, j, k+1, prim_index) );
456 }
else if (ext_dir_on_zhi) {
458 Real dz0 = dz_ptr[k-1];
459 Real dz1 = dz_ptr[k-2];
466 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
467 +
c2 * cell_prim(i, j, k-1, prim_index)
468 + c3 * cell_prim(i, j, k-2, prim_index) ) );
472 dzk_inv =
one / dz_ptr[k];
473 }
else if (k==(
khi+1)) {
474 dzk_inv =
one / dz_ptr[k-1];
476 dzk_inv =
two / (dz_ptr[k] + dz_ptr[k-1]);
478 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
481 if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
483 zflux(i,j,k) = hfx_z(i,j,k);
485 zflux(i,j,k) = qfx1_z(i,j,k);
490 zflux(i,j,k) = -rhoAlpha * GradCz;
494 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
495 hfx_z(i,j,k) = zflux(i,j,k);
498 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
499 qfx1_z(i,j,k) = zflux(i,j,k);
502 qfx2_z(i,j,k) = zflux(i,j,k);
507 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
509 const int prim_index = qty_index - 1;
511 Real rhoAlpha = d_alpha_eff[prim_index];
516 bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
517 bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
519 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
521 if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoTheta_comp)) {
522 xflux(i,j,k) = hfx_x(i,j,k);
523 }
else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoQ1_comp)) {
524 xflux(i,j,k) = qfx1_x(i,j,k);
526 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * GradCx;
530 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
532 const int prim_index = qty_index - 1;
534 Real rhoAlpha = d_alpha_eff[prim_index];
539 bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
540 bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
542 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
544 if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoTheta_comp)) {
545 yflux(i,j,k) = hfx_y(i,j,k);
546 }
else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoQ1_comp)) {
547 yflux(i,j,k) = qfx1_y(i,j,k);
549 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * GradCy;
553 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
555 const int prim_index = qty_index - 1;
557 Real rhoAlpha = d_alpha_eff[prim_index];
569 bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
570 bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
572 if (ext_dir_on_zlo) {
574 Real dz0 = dz_ptr[k];
575 Real dz1 = dz_ptr[k+1];
582 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
583 +
c2 * cell_prim(i, j, k , prim_index)
584 + c3 * cell_prim(i, j, k+1, prim_index) );
585 }
else if (ext_dir_on_zhi) {
587 Real dz0 = dz_ptr[k-1];
588 Real dz1 = dz_ptr[k-2];
595 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
596 +
c2 * cell_prim(i, j, k-1, prim_index)
597 + c3 * cell_prim(i, j, k-2, prim_index) ) );
601 dzk_inv =
one / dz_ptr[k];
602 }
else if (k==(
khi+1)) {
603 dzk_inv =
one / dz_ptr[k-1];
605 dzk_inv =
two / (dz_ptr[k] + dz_ptr[k-1]);
607 GradCz = dzk_inv * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
610 if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
612 zflux(i,j,k) = hfx_z(i,j,k);
614 zflux(i,j,k) = qfx1_z(i,j,k);
619 zflux(i,j,k) = -rhoAlpha * GradCz;
623 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
624 hfx_z(i,j,k) = zflux(i,j,k);
627 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
628 qfx1_z(i,j,k) = zflux(i,j,k);
631 qfx2_z(i,j,k) = zflux(i,j,k);
637 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
639 xflux(i,j,k) /= mf_uy(i,j,0);
641 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
643 yflux(i,j,k) /= mf_vx(i,j,0);
650 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
652 zflux(i,j,k) *= explicit_fac;
658 ParallelFor(bx,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
660 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
661 Real dzk_inv =
one / dz_ptr[k];
662 Real stateContrib = (xflux(i+1,j ,k ) - xflux(i, j, k)) * dx_inv * mfsq
663 +(yflux(i ,j+1,k ) - yflux(i, j, k)) * dy_inv * mfsq
664 +(zflux(i ,j ,k+1) - zflux(i, j, k)) * dzk_inv;
666 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_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 Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer, const Real implicit_fac)
Definition: ERF_DiffusionSrcForState_S.cpp:45
#define RhoScalar_comp
Definition: ERF_IndexDefines.H:43
#define Rho_comp
Definition: ERF_IndexDefines.H:39
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:40
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:46
#define NSCALARS
Definition: ERF_IndexDefines.H:16
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:45
#define PrimScalar_comp
Definition: ERF_IndexDefines.H:60
#define RhoKE_comp
Definition: ERF_IndexDefines.H:41
const int klo
Definition: ERF_InitCustomPert_ABL.H:75
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);})
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:31
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ RhoScalar_bc_comp
Definition: ERF_IndexDefines.H:93
@ ext_dir
Definition: ERF_IndexDefines.H:297
@ ext_dir_prim
Definition: ERF_IndexDefines.H:300
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
Functor for inverse vertical spacings for stretched grids using a spacing array.
Definition: ERF_PBLModels.H:435