93 BL_PROFILE_REGION(
"erf_substep_MT()");
95 Real dtau =
static_cast<Real>(dtau_d);
99 bool l_rayleigh_impl_for_w = (sinesq_stag_d !=
nullptr);
101 const Real*
dx = geom.CellSize();
102 const GpuArray<Real, AMREX_SPACEDIM>
dxInv = geom.InvCellSizeArray();
103 const int domlo_z = geom.Domain().smallEnd(2);
104 const int domhi_z = geom.Domain().bigEnd(2);
110 MultiFab coeff_A_mf(fast_coeffs, make_alias, 0, 1);
111 MultiFab inv_coeff_B_mf(fast_coeffs, make_alias, 1, 1);
112 MultiFab coeff_C_mf(fast_coeffs, make_alias, 2, 1);
113 MultiFab coeff_P_mf(fast_coeffs, make_alias, 3, 1);
114 MultiFab coeff_Q_mf(fast_coeffs, make_alias, 4, 1);
119 MultiFab beta_s_mf(fast_coeffs, make_alias, 5, 1);
123 const Array<Real,AMREX_SPACEDIM> grav{
zero,
zero, -gravity};
124 const GpuArray<Real,AMREX_SPACEDIM> grav_gpu{grav[0], grav[1], grav[2]};
134 #pragma omp parallel if (Gpu::notInLaunchRegion())
137 FArrayBox temp_rhs_fab;
142 std::array<FArrayBox,AMREX_SPACEDIM> flux;
146 for ( MFIter mfi(S_stg_data[
IntVars::cons],
false); mfi.isValid(); ++mfi)
148 Box bx = mfi.tilebox();
149 Box tbx = surroundingNodes(bx,0);
150 Box tby = surroundingNodes(bx,1);
151 Box tbz = surroundingNodes(bx,2);
153 Box vbx = mfi.validbox();
154 const auto& vbx_hi = ubound(vbx);
161 "erf_substep_MT: MovingFittedMesh requires every grid to span the full height of the domain");
163 const Array4<Real const>& xmom_src_arr = xmom_src.const_array(mfi);
164 const Array4<Real const>& ymom_src_arr = ymom_src.const_array(mfi);
165 const Array4<Real const>& zmom_src_arr = zmom_src.const_array(mfi);
166 const Array4<Real const>& cc_src_arr = cc_src.const_array(mfi);
168 const Array4<const Real> & stg_cons = S_stg_data[
IntVars::cons].const_array(mfi);
169 const Array4<const Real> & stg_xmom = S_stg_data[
IntVars::xmom].const_array(mfi);
170 const Array4<const Real> & stg_ymom = S_stg_data[
IntVars::ymom].const_array(mfi);
171 const Array4<const Real> & stg_zmom = S_stg_data[
IntVars::zmom].const_array(mfi);
172 const Array4<const Real> & prim = S_stg_prim.const_array(mfi);
173 const Array4<const Real> & qt_arr =
qt.const_array(mfi);
175 const Array4<const Real>& slow_rhs_cons = S_slow_rhs[
IntVars::cons].const_array(mfi);
176 const Array4<const Real>& slow_rhs_rho_u = S_slow_rhs[
IntVars::xmom].const_array(mfi);
177 const Array4<const Real>& slow_rhs_rho_v = S_slow_rhs[
IntVars::ymom].const_array(mfi);
178 const Array4<const Real>& slow_rhs_rho_w = S_slow_rhs[
IntVars::zmom].const_array(mfi);
180 const Array4<Real>& cur_cons = S_data[
IntVars::cons].array(mfi);
181 const Array4<Real>& cur_xmom = S_data[
IntVars::xmom].array(mfi);
182 const Array4<Real>& cur_ymom = S_data[
IntVars::ymom].array(mfi);
183 const Array4<Real>& cur_zmom = S_data[
IntVars::zmom].array(mfi);
185 const Array4<Real>& lagged = lagged_delta_rt.array(mfi);
187 const Array4<const Real>& prev_cons = S_prev[
IntVars::cons].const_array(mfi);
188 const Array4<const Real>& prev_xmom = S_prev[
IntVars::xmom].const_array(mfi);
189 const Array4<const Real>& prev_ymom = S_prev[
IntVars::ymom].const_array(mfi);
190 const Array4<const Real>& prev_zmom = S_prev[
IntVars::zmom].const_array(mfi);
193 const Array4<Real>& avg_xmom_arr = avg_xmom.array(mfi);
194 const Array4<Real>& avg_ymom_arr = avg_ymom.array(mfi);
195 const Array4<Real>& avg_zmom_arr = avg_zmom.array(mfi);
197 const Array4<const Real>& z_nd_old = z_phys_nd_old->const_array(mfi);
198 const Array4<const Real>& z_nd_new = z_phys_nd_new->const_array(mfi);
199 const Array4<const Real>& z_nd_stg = z_phys_nd_stg->const_array(mfi);
200 const Array4<const Real>& detJ_old = detJ_cc_old->const_array(mfi);
201 const Array4<const Real>& detJ_new = detJ_cc_new->const_array(mfi);
202 const Array4<const Real>& detJ_stg = detJ_cc_stg->const_array(mfi);
204 const Array4<const Real>& z_t_arr = z_t_rk->const_array(mfi);
205 const Array4<const Real>& zp_t_arr = z_t_pert->const_array(mfi);
207 const Array4< Real>& omega_arr = Omega.array(mfi);
210 const Array4<const Real>& mf_mx = mapfac[
MapFacType::m_x]->const_array(mfi);
211 const Array4<const Real>& mf_my = mapfac[
MapFacType::m_y]->const_array(mfi);
212 const Array4<const Real>& mf_ux = mapfac[
MapFacType::u_x]->const_array(mfi);
213 const Array4<const Real>& mf_vy = mapfac[
MapFacType::v_y]->const_array(mfi);
219 Box gbxo = mfi.nodaltilebox(2);
221 BL_PROFILE(
"fast_MT_making_omega");
222 Box gbxo_lo = gbxo; gbxo_lo.setBig(2,0);
223 ParallelFor(gbxo_lo, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
224 omega_arr(i,j,k) =
zero;
226 Box gbxo_hi = gbxo; gbxo_hi.setSmall(2,gbxo.bigEnd(2));
227 ParallelFor(gbxo_hi, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
228 omega_arr(i,j,k) = prev_zmom(i,j,k) - stg_zmom(i,j,k) - zp_t_arr(i,j,k);
235 gbxo_mid.setSmall(2, std::max(gbxo.smallEnd(2), 1));
236 gbxo_mid.setBig (2, gbxo.bigEnd(2)-1);
238 ParallelFor(gbxo_mid, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
240 (
OmegaFromW(i,j,k,prev_zmom(i,j,k),prev_xmom,prev_ymom,mf_ux,mf_vy,z_nd_old,
dxInv)
241 -
OmegaFromW(i,j,k, stg_zmom(i,j,k), stg_xmom, stg_ymom,mf_ux,mf_vy,z_nd_old,
dxInv) )
247 const Array4<const Real>& pi_stage_ca = pi_stage.const_array(mfi);
249 const Array4<Real>& theta_extrap = extrap.array(mfi);
253 Box gbx = mfi.tilebox(); gbx.grow(1);
254 Box gtbx = mfi.nodaltilebox(0); gtbx.grow(1); gtbx.setSmall(2,0);
255 Box gtby = mfi.nodaltilebox(1); gtby.grow(1); gtby.setSmall(2,0);
259 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
264 theta_extrap(i,j,k) = delta_rt;
268 theta_extrap(i,j,k) *= (
one + RvOverRd*
qv);
271 lagged(i,j,k) = delta_rt;
273 }
else if (use_lagged_delta_rt) {
276 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
278 theta_extrap(i,j,k) = delta_rt + beta_d * (delta_rt - lagged(i,j,k));
282 theta_extrap(i,j,k) *= (
one + RvOverRd*
qv);
285 lagged(i,j,k) = delta_rt;
290 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
295 theta_extrap(i,j,k) *= (
one + RvOverRd*
qv);
299 RHS_fab.resize (tbz,1, The_Async_Arena());
300 soln_fab.resize (tbz,1, The_Async_Arena());
301 temp_rhs_fab.resize(tbz,2, The_Async_Arena());
303 auto const& RHS_a = RHS_fab.array();
304 auto const& soln_a = soln_fab.array();
305 auto const& temp_rhs_arr = temp_rhs_fab.array();
307 auto const& coeffA_a = coeff_A_mf.array(mfi);
308 auto const& inv_coeffB_a = inv_coeff_B_mf.array(mfi);
309 auto const& coeffC_a = coeff_C_mf.array(mfi);
310 auto const& coeffP_a = coeff_P_mf.array(mfi);
311 auto const& coeffQ_a = coeff_Q_mf.array(mfi);
312 auto const& beta_s_a = beta_s_mf.const_array(mfi);
318 BL_PROFILE(
"substep_xymom_T");
320 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
325 Real gp_xi = (theta_extrap(i,j,k) - theta_extrap(i-1,j,k)) * dxi;
326 Real gp_zeta_on_iface = (k == 0) ?
327 myhalf * dzi * ( theta_extrap(i-1,j,k+1) + theta_extrap(i,j,k+1)
328 - theta_extrap(i-1,j,k ) - theta_extrap(i,j,k ) ) :
329 fourth * dzi * ( theta_extrap(i-1,j,k+1) + theta_extrap(i,j,k+1)
330 - theta_extrap(i-1,j,k-1) - theta_extrap(i,j,k-1) );
331 Real gpx = h_zeta_old * gp_xi - h_xi_old * gp_zeta_on_iface;
334 Real q = (l_use_moisture) ?
myhalf * (qt_arr(i-1,j,k) + qt_arr(i,j,k)) :
zero;
336 Real pi_c =
myhalf * (pi_stage_ca(i-1,j,k) + pi_stage_ca(i ,j,k));
340 cur_xmom(i,j,k) = h_zeta_old * prev_xmom(i,j,k) + dtau * fast_rhs_rho_u
341 + dtau * slow_rhs_rho_u(i,j,k)
342 + dtau * xmom_src_arr(i,j,k);
344 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
349 Real gp_eta = (theta_extrap(i,j,k) -theta_extrap(i,j-1,k)) * dyi;
350 Real gp_zeta_on_jface = (k == 0) ?
351 myhalf * dzi * ( theta_extrap(i,j,k+1) + theta_extrap(i,j-1,k+1)
352 - theta_extrap(i,j,k ) - theta_extrap(i,j-1,k ) ) :
353 fourth * dzi * ( theta_extrap(i,j,k+1) + theta_extrap(i,j-1,k+1)
354 - theta_extrap(i,j,k-1) - theta_extrap(i,j-1,k-1) );
355 Real gpy = h_zeta_old * gp_eta - h_eta_old * gp_zeta_on_jface;
358 Real q = (l_use_moisture) ?
myhalf * (qt_arr(i,j-1,k) + qt_arr(i,j,k)) :
zero;
360 Real pi_c =
myhalf * (pi_stage_ca(i,j-1,k) + pi_stage_ca(i,j ,k));
364 cur_ymom(i, j, k) = h_zeta_old * prev_ymom(i,j,k) + dtau * fast_rhs_rho_v
365 + dtau * slow_rhs_rho_v(i,j,k)
366 + dtau * ymom_src_arr(i,j,k);
373 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
374 flux[dir].resize(surroundingNodes(bx,dir),2,The_Async_Arena());
375 flux[dir].setVal<RunOn::Device>(0);
377 const GpuArray<const Array4<Real>, AMREX_SPACEDIM>
378 flx_arr{{AMREX_D_DECL(flux[0].array(), flux[1].array(), flux[2].array())}};
382 BL_PROFILE(
"fast_T_making_rho_rhs");
383 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
387 Real xflux_lo = cur_xmom(i ,j,k) - stg_xmom(i ,j,k)*h_zeta_stg_xlo;
388 Real xflux_hi = cur_xmom(i+1,j,k) - stg_xmom(i+1,j,k)*h_zeta_stg_xhi;
392 Real yflux_lo = cur_ymom(i,j ,k) - stg_ymom(i,j ,k)*h_zeta_stg_ylo;
393 Real yflux_hi = cur_ymom(i,j+1,k) - stg_ymom(i,j+1,k)*h_zeta_stg_yhi;
396 temp_rhs_arr(i,j,k,0) = ( xflux_hi - xflux_lo ) * dxi + ( yflux_hi - yflux_lo ) * dyi;
397 temp_rhs_arr(i,j,k,1) = (( xflux_hi * (prim(i,j,k,0) + prim(i+1,j,k,0)) -
398 xflux_lo * (prim(i,j,k,0) + prim(i-1,j,k,0)) ) * dxi +
399 ( yflux_hi * (prim(i,j,k,0) + prim(i,j+1,k,0)) -
400 yflux_lo * (prim(i,j,k,0) + prim(i,j-1,k,0)) ) * dyi) *
myhalf;
403 (flx_arr[0])(i,j,k,0) = xflux_lo;
404 (flx_arr[0])(i,j,k,1) = (flx_arr[0])(i ,j,k,0) *
myhalf * (prim(i,j,k,0) + prim(i-1,j,k,0));
406 (flx_arr[1])(i,j,k,0) = yflux_lo;
407 (flx_arr[1])(i,j,k,1) = (flx_arr[1])(i,j ,k,0) *
myhalf * (prim(i,j,k,0) + prim(i,j-1,k,0));
410 (flx_arr[0])(i+1,j,k,0) = xflux_hi;
411 (flx_arr[0])(i+1,j,k,1) = (flx_arr[0])(i+1,j,k,0) *
myhalf * (prim(i,j,k,0) + prim(i+1,j,k,0));
414 (flx_arr[1])(i,j+1,k,0) = yflux_hi;
415 (flx_arr[1])(i,j+1,k,1) = (flx_arr[1])(i,j+1,k,0) *
myhalf * (prim(i,j,k,0) + prim(i,j+1,k,0));
422 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
425 cur_xmom(i, j, k) /= h_zeta_new;
426 avg_xmom_arr(i,j,k) += facinv*(cur_xmom(i,j,k) - stg_xmom(i,j,k));
428 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
431 cur_ymom(i, j, k) /= h_zeta_new;
432 avg_ymom_arr(i,j,k) += facinv*(cur_ymom(i,j,k) - stg_ymom(i,j,k));
435 Box bx_shrunk_in_k = bx;
436 int klo = tbz.smallEnd(2);
437 int khi = tbz.bigEnd(2);
438 bx_shrunk_in_k.setSmall(2,
klo+1);
439 bx_shrunk_in_k.setBig(2,
khi-1);
447 BL_PROFILE(
"fast_loop_on_shrunk_t");
449 ParallelFor(bx_shrunk_in_k, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
451 Real dJ_old_kface =
myhalf * (detJ_old(i,j,k) + detJ_old(i,j,k-1));
452 Real dJ_new_kface =
myhalf * (detJ_new(i,j,k) + detJ_new(i,j,k-1));
453 Real dJ_stg_kface =
myhalf * (detJ_stg(i,j,k) + detJ_stg(i,j,k-1));
455 Real coeff_P = coeffP_a(i,j,k);
456 Real coeff_Q = coeffQ_a(i,j,k);
465 - coeff_P * stg_cons(i,j,k ,
RhoTheta_comp) * (dJ_stg_kface/dJ_old_kface)
466 - coeff_Q * stg_cons(i,j,k-1,
RhoTheta_comp) * (dJ_stg_kface/dJ_old_kface)
468 + halfg * ( stg_cons(i,j,k,
Rho_comp) + stg_cons(i,j,k-1,
Rho_comp) ) * (dJ_stg_kface/dJ_old_kface);
474 Real Omega_kp1 = omega_arr(i,j,k+1);
475 Real Omega_k = omega_arr(i,j,k );
476 Real Omega_km1 = omega_arr(i,j,k-1);
482 Real dbeta_1_kp1 =
myhalf * (
one - beta_s_a(i,j,k+1)) - beta_1;
483 Real dbeta_1_km1 =
myhalf * (
one - beta_s_a(i,j,k-1)) - beta_1;
485 Real detJdiff = (detJ_old(i,j,k) - detJ_old(i,j,k-1)) / (detJ_old(i,j,k)*detJ_old(i,j,k-1));
488 R1_tmp += halfg * ( beta_1 * dzi * (Omega_kp1/detJ_old(i,j,k) + detJdiff*Omega_k - Omega_km1/detJ_old(i,j,k-1))
489 + dzi * (dbeta_1_kp1*Omega_kp1/detJ_old(i,j,k) - dbeta_1_km1*Omega_km1/detJ_old(i,j,k-1))
490 + temp_rhs_arr(i,j,k,
Rho_comp)/detJ_old(i,j,k) + temp_rhs_arr(i,j,k-1,
Rho_comp)/detJ_old(i,j,k-1) );
494 coeff_P/detJ_old(i,j,k ) * ( beta_1 * dzi * (Omega_kp1*theta_t_hi - Omega_k*theta_t_mid) + dzi * dbeta_1_kp1*Omega_kp1*theta_t_hi
496 coeff_Q/detJ_old(i,j,k-1) * ( beta_1 * dzi * (Omega_k*theta_t_mid - Omega_km1*theta_t_lo) - dzi * dbeta_1_km1*Omega_km1*theta_t_lo
500 RHS_a(i,j,k) = prev_zmom(i,j,k) - (dJ_stg_kface/dJ_old_kface) * stg_zmom(i,j,k)
501 + dtau * slow_rhs_rho_w(i,j,k) / dJ_stg_kface
502 + dtau * zmom_src_arr(i,j,k);
504 RHS_a(i,j,k) += dtau * R0_tmp;
507 RHS_a(i,j,k) += dtau * dtau*beta_2*R1_tmp;
510 Real UppVpp = (dJ_new_kface/dJ_old_kface) *
OmegaFromW(i,j,k,0.,cur_xmom,cur_ymom,mf_ux,mf_vy,z_nd_new,
dxInv)
511 -(dJ_stg_kface/dJ_old_kface) *
OmegaFromW(i,j,k,0.,stg_xmom,stg_ymom,mf_ux,mf_vy,z_nd_stg,
dxInv);
512 RHS_a(i,j,k) += UppVpp;
519 auto const lo = lbound(bx);
520 auto const hi = ubound(bx);
523 BL_PROFILE(
"substep_b2d_loop_t");
526 ParallelFor(b2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
529 Real rho_on_bdy =
myhalf * ( prev_cons(i,j,
lo.z) + prev_cons(i,j,
lo.z-1) );
530 RHS_a(i,j,
lo.z) = rho_on_bdy * zp_t_arr(i,j,
lo.z);
532 soln_a(i,j,
lo.z) = RHS_a(i,j,
lo.z) * inv_coeffB_a(i,j,
lo.z);
536 RHS_a(i,j,
hi.z+1) = (
hi.z == domhi_z)
538 : dtau * (slow_rhs_rho_w(i,j,
hi.z+1) + zmom_src_arr(i,j,
hi.z+1));
540 for (
int k =
lo.z+1; k <=
hi.z+1; k++) {
541 soln_a(i,j,k) = (RHS_a(i,j,k)-coeffA_a(i,j,k)*soln_a(i,j,k-1)) * inv_coeffB_a(i,j,k);
544 for (
int k =
hi.z; k >=
lo.z; k--) {
545 soln_a(i,j,k) -= ( coeffC_a(i,j,k) * inv_coeffB_a(i,j,k) ) * soln_a(i,j,k+1);
549 cur_zmom(i,j,
hi.z+1) = stg_zmom(i,j,
hi.z+1) + soln_a(i,j,
hi.z+1);
552 for (
int j =
lo.y; j <=
hi.y; ++j) {
554 for (
int i =
lo.x; i <=
hi.x; ++i) {
556 Real rho_on_bdy =
myhalf * ( prev_cons(i,j,
lo.z) + prev_cons(i,j,
lo.z-1) );
557 RHS_a(i,j,
lo.z) = rho_on_bdy * zp_t_arr(i,j,
lo.z);
559 soln_a(i,j,
lo.z) = RHS_a(i,j,
lo.z) * inv_coeffB_a(i,j,
lo.z);
563 for (
int j =
lo.y; j <=
hi.y; ++j) {
565 for (
int i =
lo.x; i <=
hi.x; ++i) {
568 RHS_a(i,j,
hi.z+1) = (
hi.z == domhi_z)
570 : dtau * (slow_rhs_rho_w(i,j,
hi.z+1) + zmom_src_arr(i,j,
hi.z+1));
573 for (
int k =
lo.z+1; k <=
hi.z+1; ++k) {
574 for (
int j =
lo.y; j <=
hi.y; ++j) {
576 for (
int i =
lo.x; i <=
hi.x; ++i) {
577 soln_a(i,j,k) = (RHS_a(i,j,k)-coeffA_a(i,j,k)*soln_a(i,j,k-1)) * inv_coeffB_a(i,j,k);
581 for (
int k =
hi.z; k >=
lo.z; --k) {
582 for (
int j =
lo.y; j <=
hi.y; ++j) {
584 for (
int i =
lo.x; i <=
hi.x; ++i) {
585 soln_a(i,j,k) -= ( coeffC_a(i,j,k) * inv_coeffB_a(i,j,k) ) * soln_a(i,j,k+1);
591 for (
int j =
lo.y; j <=
hi.y; ++j) {
593 for (
int i =
lo.x; i <=
hi.x; ++i) {
594 cur_zmom(i,j,
hi.z+1) = stg_zmom(i,j,
hi.z+1) + soln_a(i,j,
hi.z+1);
601 BL_PROFILE(
"substep_new_drhow");
603 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
608 cur_zmom(i,j,k) =
WFromOmega(i,j,k,rho_on_face*(z_t_arr(i,j,k)+zp_t_arr(i,j,k)),
609 cur_xmom,cur_ymom,mf_ux,mf_vy,z_nd_new,
dxInv);
612 soln_a(i,j,k) =
zero;
618 Real wpp = soln_a(i,j,k) + UppVpp;
619 Real dJ_old_kface =
myhalf * (detJ_old(i,j,k) + detJ_old(i,j,k-1));
620 Real dJ_new_kface =
myhalf * (detJ_new(i,j,k) + detJ_new(i,j,k-1));
622 cur_zmom(i,j,k) = dJ_old_kface * (stg_zmom(i,j,k) + wpp);
623 cur_zmom(i,j,k) /= dJ_new_kface;
625 soln_a(i,j,k) =
OmegaFromW(i,j,k,cur_zmom(i,j,k),cur_xmom,cur_ymom,mf_ux,mf_vy,z_nd_new,
dxInv)
626 -
OmegaFromW(i,j,k,stg_zmom(i,j,k),stg_xmom,stg_ymom,mf_ux,mf_vy,z_nd_stg,
dxInv);
627 soln_a(i,j,k) -= rho_on_face * zp_t_arr(i,j,k);
630 if (l_rayleigh_impl_for_w && k > 0) {
631 Real damping_coeff = l_damp_coef * dtau * sinesq_stag_d[k];
632 cur_zmom(i,j,k) /= (
one + damping_coeff);
641 BL_PROFILE(
"fast_rho_final_update");
642 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
644 Real zflux_lo =
myhalf * (
one + beta_s_a(i,j,k )) * soln_a(i,j,k )
645 +
myhalf * (
one - beta_s_a(i,j,k )) * omega_arr(i,j,k );
646 Real zflux_hi =
myhalf * (
one + beta_s_a(i,j,k+1)) * soln_a(i,j,k+1)
647 +
myhalf * (
one - beta_s_a(i,j,k+1)) * omega_arr(i,j,k+1);
651 avg_zmom_arr(i,j,k) += facinv*zflux_lo / (mf_mx(i,j,0) * mf_my(i,j,0));
653 (flx_arr[2])(i,j,k,0) = zflux_lo / (mf_mx(i,j,0) * mf_my(i,j,0));
659 Real fast_rhs_rho = -(temp_rhs_arr(i,j,k,0) + ( zflux_hi - zflux_lo ) * dzi);
660 Real fast_rhs_rhotheta = -( temp_rhs_arr(i,j,k,1) +
myhalf *
661 ( zflux_hi * (prim(i,j,k) + prim(i,j,k+1))
662 - zflux_lo * (prim(i,j,k) + prim(i,j,k-1)) ) * dzi );
664 cur_cons(i,j,k,0) *= (detJ_old(i,j,k)/detJ_new(i,j,k));
665 cur_cons(i,j,k,1) *= (detJ_old(i,j,k)/detJ_new(i,j,k));
667 cur_cons(i,j,k,0) += dtau * ( slow_rhs_cons(i,j,k,0) + fast_rhs_rho / detJ_new(i,j,k));
668 cur_cons(i,j,k,1) += dtau * ( slow_rhs_cons(i,j,k,1) + fast_rhs_rhotheta / detJ_new(i,j,k));
671 (flx_arr[2])(i,j,k,1) = (flx_arr[2])(i,j,k,0) *
myhalf * (prim(i,j,k) + prim(i,j,k-1));
675 avg_zmom_arr(i,j,k+1) += facinv * zflux_hi / (mf_mx(i,j,0) * mf_my(i,j,0));
677 (flx_arr[2])(i,j,k+1,0) = zflux_hi / (mf_mx(i,j,0) * mf_my(i,j,0));
678 (flx_arr[2])(i,j,k+1,1) = (flx_arr[2])(i,j,k+1,0) *
myhalf * (prim(i,j,k) + prim(i,j,k+1));
690 int strt_comp_reflux = 0;
692 int num_comp_reflux = 1;
693 if (level < finest_level) {
694 fr_as_crse->CrseAdd(mfi,
695 {{AMREX_D_DECL(&(flux[0]), &(flux[1]), &(flux[2]))}},
696 dx, dtau, strt_comp_reflux, strt_comp_reflux, num_comp_reflux, RunOn::Device);
699 fr_as_fine->FineAdd(mfi,
700 {{AMREX_D_DECL(&(flux[0]), &(flux[1]), &(flux[2]))}},
701 dx, dtau, strt_comp_reflux, strt_comp_reflux, num_comp_reflux, RunOn::Device);
707 Gpu::streamSynchronize();
constexpr amrex::Real R_v
Definition: ERF_Constants.H:50
constexpr amrex::Real R_d
Definition: ERF_Constants.H:49
constexpr amrex::Real Gamma
Definition: ERF_Constants.H:70
@ v_y
Definition: ERF_DataStruct.H:39
@ m_y
Definition: ERF_DataStruct.H:39
@ u_x
Definition: ERF_DataStruct.H:38
@ m_x
Definition: ERF_DataStruct.H:38
#define PrimQ1_comp
Definition: ERF_IndexDefines.H:82
#define Rho_comp
Definition: ERF_IndexDefines.H:53
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:54
#define PrimTheta_comp
Definition: ERF_IndexDefines.H:79
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
const int khi
Definition: ERF_InitCustomPert_Bubble.H:25
const int klo
Definition: ERF_InitCustomPert_KE.H:9
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 one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real fourth
Definition: ERF_NumericalConstants.H:42
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real OmegaFromW(int &i, int &j, int &k, amrex::Real w, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &mf_u, const amrex::Array4< const amrex::Real > &mf_v, const amrex::Array4< const amrex::Real > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv)
Definition: ERF_TerrainMetrics.H:802
AMREX_GPU_HOST_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:396
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_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:280
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_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:350
AMREX_GPU_HOST_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:303
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real WFromOmega(int &i, int &j, int &k, amrex::Real omega, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &mf_u, const amrex::Array4< const amrex::Real > &mf_v, const amrex::Array4< const amrex::Real > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv)
Definition: ERF_TerrainMetrics.H:867
@ gpy
Definition: ERF_IndexDefines.H:265
@ gpx
Definition: ERF_IndexDefines.H:264
@ ymom
Definition: ERF_IndexDefines.H:274
@ cons
Definition: ERF_IndexDefines.H:272
@ zmom
Definition: ERF_IndexDefines.H:275
@ xmom
Definition: ERF_IndexDefines.H:273
@ qt
Definition: ERF_Kessler.H:30
@ qv
Definition: ERF_Kessler.H:31
@ q
Definition: ERF_WSM6.H:294