Function for computing the scalar RHS for diffusion operator with terrain-fitted coordinates.
100 const Real explicit_fac =
one - implicit_fac;
103 Real l_abs_g = std::abs(grav_gpu[2]);
105 const Real dz_inv = cellSizeInv[2];
109 Box xbx_g1(xbx); Box ybx_g1(ybx);
110 if (xbx_g1.smallEnd(2) != dom_lo.z) xbx_g1.growLo(2,1);
111 if (ybx_g1.smallEnd(2) != dom_lo.z) ybx_g1.growLo(2,1);
112 if (xbx_g1.bigEnd(2) != dom_hi.z) xbx_g1.growHi(2,1);
113 if (ybx_g1.bigEnd(2) != dom_hi.z) ybx_g1.growHi(2,1);
115 for (
int n(0); n<num_comp; ++n) {
116 const int qty_index = start_comp + n;
119 if (l_consA && l_turb) {
120 ParallelFor(xbx_g1, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
122 const int prim_index = qty_index - 1;
126 Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
127 rhoAlpha +=
myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_scal_index])
128 + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_scal_index]) );
136 bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
137 bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
138 bool SurfLayer_on_zlo = ( SurfLayer_zlo && rotate && k == dom_lo.z);
140 Real idz_hi =
one / (z_cc(i ,j,k+1) - z_cc(i ,j,k-1));
141 Real idz_lo =
one / (z_cc(i-1,j,k+1) - z_cc(i-1,j,k-1));
142 Real GradCz =
myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i-1, j, k+1, prim_index)*idz_lo
143 - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i-1, j, k-1, prim_index)*idz_lo );
144 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
146 if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoTheta_comp)) {
147 xflux(i,j,k) = hfx_x(i,j,k);
148 }
else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoQ1_comp)) {
149 xflux(i,j,k) = qfx1_x(i,j,k);
150 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoTheta_comp)) {
151 xflux(i,j,k) = hfx_x(i,j,0);
152 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
153 xflux(i,j,k) = qfx1_x(i,j,0);
155 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * ( GradCx - met_h_xi*GradCz );
159 ParallelFor(ybx_g1, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
161 const int prim_index = qty_index - 1;
165 Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
166 rhoAlpha +=
myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_scal_index])
167 + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_scal_index]) );
174 bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
175 bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
176 bool SurfLayer_on_zlo = ( SurfLayer_zlo && rotate && k == dom_lo.z);
178 Real idz_hi =
one / (z_cc(i,j ,k+1) - z_cc(i,j ,k-1));
179 Real idz_lo =
one / (z_cc(i,j-1,k+1) - z_cc(i,j-1,k-1));
180 Real GradCz =
myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i, j-1, k+1, prim_index)*idz_lo
181 - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i, j-1, k-1, prim_index)*idz_lo );
182 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
184 if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoTheta_comp)) {
185 yflux(i,j,k) = hfx_y(i,j,k);
186 }
else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoQ1_comp)) {
187 yflux(i,j,k) = qfx1_y(i,j,k);
188 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoTheta_comp)) {
189 yflux(i,j,k) = hfx_y(i,j,0);
190 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
191 yflux(i,j,k) = qfx1_y(i,j,0);
193 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * ( GradCy - met_h_eta*GradCz );
197 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
199 const int prim_index = qty_index - 1;
203 Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
204 rhoAlpha +=
myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_scal_index])
205 + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_scal_index]) );
217 bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
218 bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
220 if (ext_dir_on_zlo) {
231 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
232 +
c2 * cell_prim(i, j, k , prim_index)
233 + c3 * cell_prim(i, j, k+1, prim_index) );
234 }
else if (ext_dir_on_zhi) {
245 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
246 +
c2 * cell_prim(i, j, k-1, prim_index)
247 + c3 * cell_prim(i, j, k-2, prim_index) ) );
250 GradCz = (dz_inv/met_h_zeta) * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
253 if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
255 zflux(i,j,k) = hfx_z(i,j,k);
257 zflux(i,j,k) = qfx1_z(i,j,k);
262 zflux(i,j,k) = -rhoAlpha * GradCz;
266 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
267 hfx_z(i,j,k) = zflux(i,j,k);
270 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
271 qfx1_z(i,j,k) = zflux(i,j,k);
274 qfx2_z(i,j,k) = zflux(i,j,k);
279 ParallelFor(xbx_g1, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
281 const int prim_index = qty_index - 1;
283 Real rhoAlpha = d_alpha_eff[prim_index];
284 rhoAlpha +=
myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_index])
285 + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_index]) );
292 bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
293 bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
294 bool SurfLayer_on_zlo = ( SurfLayer_zlo && rotate && k == dom_lo.z);
296 Real idz_hi =
one / (z_cc(i ,j,k+1) - z_cc(i ,j,k-1));
297 Real idz_lo =
one / (z_cc(i-1,j,k+1) - z_cc(i-1,j,k-1));
298 Real GradCz =
myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i-1, j, k+1, prim_index)*idz_lo
299 - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i-1, j, k-1, prim_index)*idz_lo );
300 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
302 if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoTheta_comp)) {
303 xflux(i,j,k) = hfx_x(i,j,k);
304 }
else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoQ1_comp)) {
305 xflux(i,j,k) = qfx1_x(i,j,k);
306 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoTheta_comp)) {
307 xflux(i,j,k) = hfx_x(i,j,0);
308 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
309 xflux(i,j,k) = qfx1_x(i,j,0);
311 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * ( GradCx - met_h_xi*GradCz );
315 ParallelFor(ybx_g1, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
317 const int prim_index = qty_index - 1;
319 Real rhoAlpha = d_alpha_eff[prim_index];
320 rhoAlpha +=
myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_index])
321 + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_index]) );
328 bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
329 bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
330 bool SurfLayer_on_zlo = ( SurfLayer_zlo && rotate && k == dom_lo.z);
332 Real idz_hi =
one / (z_cc(i,j ,k+1) - z_cc(i,j ,k-1));
333 Real idz_lo =
one / (z_cc(i,j-1,k+1) - z_cc(i,j-1,k-1));
334 Real GradCz =
myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i, j-1, k+1, prim_index)*idz_lo
335 - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i, j-1, k-1, prim_index)*idz_lo );
336 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
338 if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoTheta_comp)) {
339 yflux(i,j,k) = hfx_y(i,j,k);
340 }
else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoQ1_comp)) {
341 yflux(i,j,k) = qfx1_y(i,j,k);
342 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoTheta_comp)) {
343 yflux(i,j,k) = hfx_y(i,j,0);
344 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
345 yflux(i,j,k) = qfx1_y(i,j,0);
347 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * ( GradCy - met_h_eta*GradCz );
351 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
353 const int prim_index = qty_index - 1;
355 Real rhoAlpha = d_alpha_eff[prim_index];
356 rhoAlpha +=
myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_index])
357 + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_index]) );
369 bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
370 bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
372 if (ext_dir_on_zlo) {
383 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
384 +
c2 * cell_prim(i, j, k , prim_index)
385 + c3 * cell_prim(i, j, k+1, prim_index) );
386 }
else if (ext_dir_on_zhi) {
397 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
398 +
c2 * cell_prim(i, j, k-1, prim_index)
399 + c3 * cell_prim(i, j, k-2, prim_index) ) );
402 GradCz = (dz_inv/met_h_zeta) * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
405 if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
407 zflux(i,j,k) = hfx_z(i,j,k);
409 zflux(i,j,k) = qfx1_z(i,j,k);
414 zflux(i,j,k) = -rhoAlpha * GradCz;
418 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
419 hfx_z(i,j,k) = zflux(i,j,k);
422 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
423 qfx1_z(i,j,k) = zflux(i,j,k);
426 qfx2_z(i,j,k) = zflux(i,j,k);
431 ParallelFor(xbx_g1, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
433 const int prim_index = qty_index - 1;
436 Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
443 bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
444 bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
445 bool SurfLayer_on_zlo = ( SurfLayer_zlo && rotate && k == dom_lo.z);
447 Real idz_hi =
one / (z_cc(i ,j,k+1) - z_cc(i ,j,k-1));
448 Real idz_lo =
one / (z_cc(i-1,j,k+1) - z_cc(i-1,j,k-1));
449 Real GradCz =
myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i-1, j, k+1, prim_index)*idz_lo
450 - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i-1, j, k-1, prim_index)*idz_lo );
451 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
453 if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoTheta_comp)) {
454 xflux(i,j,k) = hfx_x(i,j,k);
455 }
else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoQ1_comp)) {
456 xflux(i,j,k) = qfx1_x(i,j,k);
457 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoTheta_comp)) {
458 xflux(i,j,k) = hfx_x(i,j,0);
459 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
460 xflux(i,j,k) = qfx1_x(i,j,0);
462 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * ( GradCx - met_h_xi*GradCz );
466 ParallelFor(ybx_g1, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
468 const int prim_index = qty_index - 1;
471 Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
478 bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
479 bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
480 bool SurfLayer_on_zlo = ( SurfLayer_zlo && rotate && k == dom_lo.z);
482 Real idz_hi =
one / (z_cc(i,j ,k+1) - z_cc(i,j ,k-1));
483 Real idz_lo =
one / (z_cc(i,j-1,k+1) - z_cc(i,j-1,k-1));
484 Real GradCz =
myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i, j-1, k+1, prim_index)*idz_lo
485 - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i, j-1, k-1, prim_index)*idz_lo );
486 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
488 if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoTheta_comp)) {
489 yflux(i,j,k) = hfx_y(i,j,k);
490 }
else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoQ1_comp)) {
491 yflux(i,j,k) = qfx1_y(i,j,k);
492 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoTheta_comp)) {
493 yflux(i,j,k) = hfx_y(i,j,0);
494 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
495 yflux(i,j,k) = qfx1_y(i,j,0);
497 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * ( GradCy - met_h_eta*GradCz );
501 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
503 const int prim_index = qty_index - 1;
506 Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
518 bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
519 bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
521 if (ext_dir_on_zlo) {
532 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
533 +
c2 * cell_prim(i, j, k , prim_index)
534 + c3 * cell_prim(i, j, k+1, prim_index) );
535 }
else if (ext_dir_on_zhi) {
546 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
547 +
c2 * cell_prim(i, j, k-1, prim_index)
548 + c3 * cell_prim(i, j, k-2, prim_index) ) );
551 GradCz = (dz_inv/met_h_zeta) * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
554 if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
556 zflux(i,j,k) = hfx_z(i,j,k);
558 zflux(i,j,k) = qfx1_z(i,j,k);
563 zflux(i,j,k) = -rhoAlpha * GradCz;
567 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
568 hfx_z(i,j,k) = zflux(i,j,k);
571 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
572 qfx1_z(i,j,k) = zflux(i,j,k);
575 qfx2_z(i,j,k) = zflux(i,j,k);
580 ParallelFor(xbx_g1, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
582 const int prim_index = qty_index - 1;
584 Real rhoAlpha = d_alpha_eff[prim_index];
591 bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
592 bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
593 bool SurfLayer_on_zlo = ( SurfLayer_zlo && rotate && k == dom_lo.z);
595 Real idz_hi =
one / (z_cc(i ,j,k+1) - z_cc(i ,j,k-1));
596 Real idz_lo =
one / (z_cc(i-1,j,k+1) - z_cc(i-1,j,k-1));
597 Real GradCz =
myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i-1, j, k+1, prim_index)*idz_lo
598 - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i-1, j, k-1, prim_index)*idz_lo );
599 Real GradCx = dx_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i-1, j, k , prim_index) );
601 if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoTheta_comp)) {
602 xflux(i,j,k) = hfx_x(i,j,k);
603 }
else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index ==
RhoQ1_comp)) {
604 xflux(i,j,k) = qfx1_x(i,j,k);
605 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoTheta_comp)) {
606 xflux(i,j,k) = hfx_x(i,j,0);
607 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
608 xflux(i,j,k) = qfx1_x(i,j,0);
610 xflux(i,j,k) = -rhoAlpha * mf_ux(i,j,0) * ( GradCx - met_h_xi*GradCz );
614 ParallelFor(ybx_g1, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
616 const int prim_index = qty_index - 1;
618 Real rhoAlpha = d_alpha_eff[prim_index];
625 bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
626 bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
627 bool SurfLayer_on_zlo = ( SurfLayer_zlo && rotate && k == dom_lo.z);
629 Real idz_hi =
one / (z_cc(i,j ,k+1) - z_cc(i,j ,k-1));
630 Real idz_lo =
one / (z_cc(i,j-1,k+1) - z_cc(i,j-1,k-1));
631 Real GradCz =
myhalf * ( cell_prim(i, j, k+1, prim_index)*idz_hi + cell_prim(i, j-1, k+1, prim_index)*idz_lo
632 - cell_prim(i, j, k-1, prim_index)*idz_hi - cell_prim(i, j-1, k-1, prim_index)*idz_lo );
633 Real GradCy = dy_inv * ( cell_prim(i, j, k , prim_index) - cell_prim(i, j-1, k , prim_index) );
635 if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoTheta_comp)) {
636 yflux(i,j,k) = hfx_y(i,j,k);
637 }
else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index ==
RhoQ1_comp)) {
638 yflux(i,j,k) = qfx1_y(i,j,k);
639 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoTheta_comp)) {
640 yflux(i,j,k) = hfx_y(i,j,0);
641 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
642 yflux(i,j,k) = qfx1_y(i,j,0);
644 yflux(i,j,k) = -rhoAlpha * mf_vy(i,j,0) * ( GradCy - met_h_eta*GradCz );
648 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
650 const int prim_index = qty_index - 1;
652 Real rhoAlpha = d_alpha_eff[prim_index];
665 bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
666 bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
668 if (ext_dir_on_zlo) {
679 GradCz = idz0 * (
c1 * cell_prim(i, j, k-1, prim_index)
680 +
c2 * cell_prim(i, j, k , prim_index)
681 + c3 * cell_prim(i, j, k+1, prim_index) );
682 }
else if (ext_dir_on_zhi) {
693 GradCz = idz0 * ( -(
c1 * cell_prim(i, j, k , prim_index)
694 +
c2 * cell_prim(i, j, k-1, prim_index)
695 + c3 * cell_prim(i, j, k-2, prim_index) ) );
698 GradCz = (dz_inv/met_h_zeta) * ( cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index) );
701 if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
703 zflux(i,j,k) = hfx_z(i,j,k);
705 zflux(i,j,k) = qfx1_z(i,j,k);
710 zflux(i,j,k) = -rhoAlpha * GradCz;
714 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
715 hfx_z(i,j,k) = zflux(i,j,k);
718 if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
719 qfx1_z(i,j,k) = zflux(i,j,k);
722 qfx2_z(i,j,k) = zflux(i,j,k);
732 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
734 zflux(i,j,k) *= explicit_fac;
745 ParallelFor(bx,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
747 Real xfluxbar_lo, yfluxbar_lo;
751 Real xfluxlo =
myhalf * ( xflux(i,j,k ) + xflux(i+1,j,k ) );
752 Real xfluxhi =
myhalf * ( xflux(i,j,k+1) + xflux(i+1,j,k+1) );
753 xfluxbar_lo =
Real(1.5)*xfluxlo -
myhalf*xfluxhi;
755 Real yfluxlo =
myhalf * ( yflux(i,j,k ) + yflux(i,j+1,k ) );
756 Real yfluxhi =
myhalf * ( yflux(i,j,k+1) + yflux(i,j+1,k+1) );
757 yfluxbar_lo =
Real(1.5)*yfluxlo -
myhalf*yfluxhi;
759 xfluxbar_lo =
fourth * ( xflux(i,j,k ) + xflux(i+1,j ,k )
760 + xflux(i,j,k-1) + xflux(i+1,j ,k-1) );
761 yfluxbar_lo =
fourth * ( yflux(i,j,k ) + yflux(i ,j+1,k )
762 + yflux(i,j,k-1) + yflux(i ,j+1,k-1) );
765 Real xfluxbar_hi, yfluxbar_hi;
769 Real xfluxlo =
myhalf * ( xflux(i,j,k-1) + xflux(i+1,j,k-1) );
770 Real xfluxhi =
myhalf * ( xflux(i,j,k ) + xflux(i+1,j,k ) );
771 xfluxbar_hi =
Real(1.5)*xfluxhi -
myhalf*xfluxlo;
773 Real yfluxlo =
myhalf * ( yflux(i,j,k-1) + yflux(i,j+1,k-1) );
774 Real yfluxhi =
myhalf * ( yflux(i,j,k ) + yflux(i,j+1,k ) );
775 yfluxbar_hi =
Real(1.5)*yfluxhi -
myhalf*yfluxlo;
777 xfluxbar_hi =
fourth * ( xflux(i,j,k+1) + xflux(i+1,j ,k+1)
778 + xflux(i,j,k ) + xflux(i+1,j ,k ) );
779 yfluxbar_hi =
fourth * ( yflux(i,j,k+1) + yflux(i ,j+1,k+1)
780 + yflux(i,j,k ) + yflux(i ,j+1,k ) );
785 if ( SurfLayer_zlo &&
791 zflux_lo = zflux(i,j,k )
792 - met_h_xi_lo * mf_mx(i,j,0) * xfluxbar_lo
793 - met_h_eta_lo * mf_my(i,j,0) * yfluxbar_lo;
795 Real zflux_hi = zflux(i,j,k+1)
796 - met_h_xi_hi * mf_mx(i,j,0) * xfluxbar_hi
797 - met_h_eta_hi * mf_my(i,j,0) * yfluxbar_hi;
799 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
800 Real stateContrib = ( xflux(i+1,j ,k ) * ax(i+1,j,k) / mf_uy(i+1,j,0)
801 -xflux(i ,j ,k ) * ax(i ,j,k) / mf_uy(i ,j,0) ) * dx_inv * mfsq
802 +( yflux(i ,j+1,k ) * ay(i,j+1,k) / mf_vx(i,j+1,0)
803 -yflux(i ,j ,k ) * ay(i,j ,k) / mf_vx(i,j ,0) ) * dy_inv * mfsq
804 +( zflux_hi - zflux_lo) * dz_inv;
806 stateContrib /= detJ(i,j,k);
808 cell_rhs(i,j,k,qty_index) -= stateContrib;
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 Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer, const Real implicit_fac)
Definition: ERF_DiffusionSrcForState_T.cpp:55
#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
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 fourth
Definition: ERF_NumericalConstants.H:35
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
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:292
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:409
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:729
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:433
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:385
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:456
@ 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 terrain-following grids using cell-center heights.
Definition: ERF_PBLModels.H:461