103 BL_PROFILE_REGION(
"erf_substep_T()");
105 Real dtau =
static_cast<Real>(dtau_d);
107 const Box& domain = geom.Domain();
108 auto const domlo = lbound(domain);
109 auto const domhi = ubound(domain);
112 int ihi = domhi.x + 1;
114 int jhi = domhi.y + 1;
118 bool l_rayleigh_impl_for_w = (sinesq_stag_d !=
nullptr);
120 const Real*
dx = geom.CellSize();
121 const GpuArray<Real, AMREX_SPACEDIM>
dxInv = geom.InvCellSizeArray();
124 const Array<Real,AMREX_SPACEDIM> grav{
zero,
zero, -gravity};
125 const GpuArray<Real,AMREX_SPACEDIM> grav_gpu{grav[0], grav[1], grav[2]};
131 const auto& dm = S_stage_data[
IntVars::cons].DistributionMap();
133 MultiFab Delta_rho_u( convert(ba,IntVect(1,0,0)), dm, 1, 1);
134 MultiFab Delta_rho_v( convert(ba,IntVect(0,1,0)), dm, 1, 1);
135 MultiFab Delta_rho_w( convert(ba,IntVect(0,0,1)), dm, 1, IntVect(1,1,0));
136 MultiFab Delta_rho ( ba , dm, 1, 1);
137 MultiFab Delta_rho_theta( ba , dm, 1, 1);
139 MultiFab New_rho_u(convert(ba,IntVect(1,0,0)), dm, 1, 1);
140 MultiFab New_rho_v(convert(ba,IntVect(0,1,0)), dm, 1, 1);
142 MultiFab coeff_A_mf(fast_coeffs, make_alias, 0, 1);
143 MultiFab inv_coeff_B_mf(fast_coeffs, make_alias, 1, 1);
144 MultiFab coeff_C_mf(fast_coeffs, make_alias, 2, 1);
145 MultiFab coeff_P_mf(fast_coeffs, make_alias, 3, 1);
146 MultiFab coeff_Q_mf(fast_coeffs, make_alias, 4, 1);
151 MultiFab beta_s_mf(fast_coeffs, make_alias, 5, 1);
161 #pragma omp parallel if (Gpu::notInLaunchRegion())
163 for ( MFIter mfi(S_stage_data[
IntVars::cons],TilingIfNotGPU()); mfi.isValid(); ++mfi)
165 const Array4<Real> & cur_cons = S_data[
IntVars::cons].array(mfi);
166 const Array4<const Real>& prev_cons = S_prev[
IntVars::cons].const_array(mfi);
167 const Array4<const Real>& stage_cons = S_stage_data[
IntVars::cons].const_array(mfi);
168 const Array4<Real>& lagged_arr = lagged_delta_rt.array(mfi);
170 const Array4<Real>& old_drho = Delta_rho.array(mfi);
171 const Array4<Real>& old_drho_u = Delta_rho_u.array(mfi);
172 const Array4<Real>& old_drho_v = Delta_rho_v.array(mfi);
173 const Array4<Real>& old_drho_w = Delta_rho_w.array(mfi);
174 const Array4<Real>& old_drho_theta = Delta_rho_theta.array(mfi);
176 const Array4<const Real>& prev_xmom = S_prev[
IntVars::xmom].const_array(mfi);
177 const Array4<const Real>& prev_ymom = S_prev[
IntVars::ymom].const_array(mfi);
178 const Array4<const Real>& prev_zmom = S_prev[
IntVars::zmom].const_array(mfi);
180 const Array4<const Real>& stage_xmom = S_stage_data[
IntVars::xmom].const_array(mfi);
181 const Array4<const Real>& stage_ymom = S_stage_data[
IntVars::ymom].const_array(mfi);
182 const Array4<const Real>& stage_zmom = S_stage_data[
IntVars::zmom].const_array(mfi);
184 const Array4<Real>& theta_extrap = extrap.array(mfi);
185 const Array4<const Real>& prim = S_stage_prim.const_array(mfi);
187 Box bx = mfi.validbox();
195 Box gbx = mfi.growntilebox(1);
198 ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
204 Box gtbx = mfi.grownnodaltilebox(0,IntVect(1,1,0));
205 Box gtby = mfi.grownnodaltilebox(1,IntVect(1,1,0));
206 Box gtbz = mfi.grownnodaltilebox(2,IntVect(1,1,0));
208 const auto& bx_lo = lbound(bx);
209 const auto& bx_hi = ubound(bx);
215 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
216 old_drho_u(i,j,k) = prev_xmom(i,j,k) - stage_xmom(i,j,k);
217 if (k == bx_lo.z && k != domlo.z) {
218 old_drho_u(i,j,k-1) = old_drho_u(i,j,k);
221 old_drho_u(i,j,k+1) = old_drho_u(i,j,k);
224 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
225 old_drho_v(i,j,k) = prev_ymom(i,j,k) - stage_ymom(i,j,k);
226 if (k == bx_lo.z && k != domlo.z) {
227 old_drho_v(i,j,k-1) = old_drho_v(i,j,k);
230 old_drho_v(i,j,k+1) = old_drho_v(i,j,k);
233 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
234 old_drho_w(i,j,k) = prev_zmom(i,j,k) - stage_zmom(i,j,k);
240 ParallelFor(gbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
246 theta_extrap(i,j,k) = old_drho_theta(i,j,k);
248 theta_extrap(i,j,k) = old_drho_theta(i,j,k) + beta_d *
249 ( old_drho_theta(i,j,k) - lagged_arr(i,j,k) );
255 theta_extrap(i,j,k) *= (
one + RvOverRd*
qv);
258 lagged_arr(i,j,k) = old_drho_theta(i,j,k);
266 #pragma omp parallel if (Gpu::notInLaunchRegion())
268 for ( MFIter mfi(S_stage_data[
IntVars::cons],TilingIfNotGPU()); mfi.isValid(); ++mfi)
270 Box bx = mfi.validbox();
271 Box tbx = mfi.nodaltilebox(0);
272 Box tby = mfi.nodaltilebox(1);
274 const Array4<Real const>& xmom_src_arr = xmom_src.const_array(mfi);
275 const Array4<Real const>& ymom_src_arr = ymom_src.const_array(mfi);
277 const Array4<const Real> & stage_xmom = S_stage_data[
IntVars::xmom].const_array(mfi);
278 const Array4<const Real> & stage_ymom = S_stage_data[
IntVars::ymom].const_array(mfi);
279 const Array4<const Real> & qt_arr =
qt.const_array(mfi);
281 const Array4<Real>& old_drho_u = Delta_rho_u.array(mfi);
282 const Array4<Real>& old_drho_v = Delta_rho_v.array(mfi);
284 const Array4<const Real>& slow_rhs_rho_u = S_slow_rhs[
IntVars::xmom].const_array(mfi);
285 const Array4<const Real>& slow_rhs_rho_v = S_slow_rhs[
IntVars::ymom].const_array(mfi);
287 const Array4<Real>& new_drho_u = New_rho_u.array(mfi);
288 const Array4<Real>& new_drho_v = New_rho_v.array(mfi);
290 const Array4<Real>& cur_xmom = S_data[
IntVars::xmom].array(mfi);
291 const Array4<Real>& cur_ymom = S_data[
IntVars::ymom].array(mfi);
294 const Array4<Real>& avg_xmom_arr = avg_xmom.array(mfi);
295 const Array4<Real>& avg_ymom_arr = avg_ymom.array(mfi);
297 const Array4<const Real>& z_nd = z_phys_nd->const_array(mfi);
299 const Array4<const Real>& pi_stage_ca = pi_stage.const_array(mfi);
301 const Array4<Real>& theta_extrap = extrap.array(mfi);
304 const Array4<const Real>& mf_ux = mapfac[
MapFacType::u_x]->const_array(mfi);
305 const Array4<const Real>& mf_uy = mapfac[
MapFacType::u_y]->const_array(mfi);
306 const Array4<const Real>& mf_vx = mapfac[
MapFacType::v_x]->const_array(mfi);
307 const Array4<const Real>& mf_vy = mapfac[
MapFacType::v_y]->const_array(mfi);
319 BL_PROFILE(
"substep_xymom_T");
321 const auto& bx_lo = lbound(bx);
322 const auto& bx_hi = ubound(bx);
325 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
330 Real gp_xi = (theta_extrap(i,j,k) - theta_extrap(i-1,j,k)) * dxi;
331 Real gp_zeta_on_iface = (k == 0) ?
332 myhalf * dzi * ( theta_extrap(i-1,j,k+1) + theta_extrap(i,j,k+1)
333 - theta_extrap(i-1,j,k ) - theta_extrap(i,j,k ) ) :
334 fourth * dzi * ( theta_extrap(i-1,j,k+1) + theta_extrap(i,j,k+1)
335 - theta_extrap(i-1,j,k-1) - theta_extrap(i,j,k-1) );
336 Real gpx = (l_real_bc && (level==0) && (i==ilo || i==ihi)) ?
Real(0.) :
337 gp_xi - (met_h_xi / met_h_zeta) * gp_zeta_on_iface;
341 Real q = (l_use_moisture) ?
myhalf * (qt_arr(i,j,k) + qt_arr(i-1,j,k)) :
zero;
343 Real pi_c =
myhalf * (pi_stage_ca(i-1,j,k,0) + pi_stage_ca(i ,j,k,0));
346 new_drho_u(i, j, k) = old_drho_u(i,j,k) + dtau * fast_rhs_rho_u
347 + dtau * slow_rhs_rho_u(i,j,k)
348 + dtau * xmom_src_arr(i,j,k);
349 if (k == bx_lo.z && k != domlo.z) {
350 new_drho_u(i,j,k-1) = new_drho_u(i,j,k);
353 new_drho_u(i,j,k+1) = new_drho_u(i,j,k);
360 avg_xmom_arr(i,j,k) += facinv * new_drho_u(i,j,k) * met_h_zeta / mf_uy(i,j,0);
362 cur_xmom(i,j,k) = stage_xmom(i,j,k) + new_drho_u(i,j,k);
364 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
369 Real gp_eta = (theta_extrap(i,j,k) - theta_extrap(i,j-1,k)) * dyi;
370 Real gp_zeta_on_jface = (k == 0) ?
371 myhalf * dzi * ( theta_extrap(i,j,k+1) + theta_extrap(i,j-1,k+1)
372 - theta_extrap(i,j,k ) - theta_extrap(i,j-1,k ) ) :
373 fourth * dzi * ( theta_extrap(i,j,k+1) + theta_extrap(i,j-1,k+1)
374 - theta_extrap(i,j,k-1) - theta_extrap(i,j-1,k-1) );
375 Real gpy = (l_real_bc && (level==0) && (j==jlo || j==jhi)) ?
Real(0.) :
376 gp_eta - (met_h_eta / met_h_zeta) * gp_zeta_on_jface;
380 Real q = (l_use_moisture) ?
myhalf * (qt_arr(i,j,k) + qt_arr(i,j-1,k)) :
zero;
382 Real pi_c =
myhalf * (pi_stage_ca(i,j-1,k,0) + pi_stage_ca(i,j ,k,0));
385 new_drho_v(i, j, k) = old_drho_v(i,j,k) + dtau * fast_rhs_rho_v
386 + dtau * slow_rhs_rho_v(i,j,k)
387 + dtau * ymom_src_arr(i,j,k);
389 if (k == bx_lo.z && k != domlo.z) {
390 new_drho_v(i,j,k-1) = new_drho_v(i,j,k);
393 new_drho_v(i,j,k+1) = new_drho_v(i,j,k);
400 avg_ymom_arr(i,j,k) += facinv * new_drho_v(i,j,k) * met_h_zeta / mf_vx(i,j,0);
402 cur_ymom(i,j,k) = stage_ymom(i,j,k) + new_drho_v(i,j,k);
409 for (
int dir = 0; dir < 2; ++dir) {
410 if (!cf_fluxes.
tgt[dir] && !cf_fluxes.
rec[dir]) {
continue; }
411 const bool has_tgt = (cf_fluxes.
tgt[dir] !=
nullptr);
412 const bool has_rec = (cf_fluxes.
rec[dir] !=
nullptr);
413 const Box& fbx = (dir == 0) ? tbx : tby;
414 const Array4<const Real> tgt = (has_tgt) ? cf_fluxes.
tgt[dir]->const_array(mfi) : Array4<const Real>{};
415 const Array4< Real> rec = (has_rec) ? cf_fluxes.
rec[dir]->array(mfi) : Array4<Real>{};
416 const Array4<Real>& pert = (dir == 0) ? new_drho_u : new_drho_v;
417 const Array4<Real>& cur = (dir == 0) ? cur_xmom : cur_ymom;
418 const Array4<Real>& avg = (dir == 0) ? avg_xmom_arr : avg_ymom_arr;
419 const Array4<const Real>& stage = (dir == 0) ? stage_xmom : stage_ymom;
420 const Array4<const Real>& mf = (dir == 0) ? mf_uy : mf_vx;
421 ParallelFor(fbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
425 if (has_tgt && tgt(i,j,k,1) >
myhalf) {
426 Real new_pert = tgt(i,j,k,0) * mf(i,j,0) / h_zeta - stage(i,j,k);
427 avg(i,j,k) += facinv * (new_pert - pert(i,j,k)) * h_zeta / mf(i,j,0);
428 pert(i,j,k) = new_pert;
429 if (k == bx_lo.z && k != domlo.z) {
430 pert(i,j,k-1) = new_pert;
431 }
else if (k == bx_hi.z) {
432 pert(i,j,k+1) = new_pert;
434 cur(i,j,k) = stage(i,j,k) + new_pert;
437 rec(i,j,k) = (stage(i,j,k) + pert(i,j,k)) * h_zeta / mf(i,j,0);
445 #pragma omp parallel if (Gpu::notInLaunchRegion())
448 std::array<FArrayBox,AMREX_SPACEDIM> flux;
451 Box bx = mfi.tilebox();
452 Box tbz = surroundingNodes(bx,2);
454 Box vbx = mfi.validbox();
455 const auto& vbx_hi = ubound(vbx);
457 const Array4<Real const>& zmom_src_arr = zmom_src.const_array(mfi);
458 const Array4<Real const>& cc_src_arr = cc_src.const_array(mfi);
460 const Array4<const Real> & stage_xmom = S_stage_data[
IntVars::xmom].const_array(mfi);
461 const Array4<const Real> & stage_ymom = S_stage_data[
IntVars::ymom].const_array(mfi);
462 const Array4<const Real> & stage_zmom = S_stage_data[
IntVars::zmom].const_array(mfi);
463 const Array4<const Real> & prim = S_stage_prim.const_array(mfi);
465 const Array4<Real>& old_drho_u = Delta_rho_u.array(mfi);
466 const Array4<Real>& old_drho_v = Delta_rho_v.array(mfi);
467 const Array4<Real>& old_drho_w = Delta_rho_w.array(mfi);
468 const Array4<Real>& old_drho = Delta_rho.array(mfi);
469 const Array4<Real>& old_drho_theta = Delta_rho_theta.array(mfi);
471 const Array4<const Real>& slow_rhs_cons = S_slow_rhs[
IntVars::cons].const_array(mfi);
472 const Array4<const Real>& slow_rhs_rho_w = S_slow_rhs[
IntVars::zmom].const_array(mfi);
474 const Array4<Real>& new_drho_u = New_rho_u.array(mfi);
475 const Array4<Real>& new_drho_v = New_rho_v.array(mfi);
477 const Array4<Real>& cur_cons = S_data[
IntVars::cons].array(mfi);
478 const Array4<Real>& cur_zmom = S_data[
IntVars::zmom].array(mfi);
481 const Array4<Real>& avg_zmom_arr = avg_zmom.array(mfi);
483 const Array4<const Real>& z_nd = z_phys_nd->const_array(mfi);
484 const Array4<const Real>& detJ = detJ_cc->const_array(mfi);
486 const Array4< Real>& omega_arr = Omega.array(mfi);
489 const Array4<const Real>& mf_mx = mapfac[
MapFacType::m_x]->const_array(mfi);
490 const Array4<const Real>& mf_my = mapfac[
MapFacType::m_y]->const_array(mfi);
491 const Array4<const Real>& mf_ux = mapfac[
MapFacType::u_x]->const_array(mfi);
492 const Array4<const Real>& mf_uy = mapfac[
MapFacType::u_y]->const_array(mfi);
493 const Array4<const Real>& mf_vx = mapfac[
MapFacType::v_x]->const_array(mfi);
494 const Array4<const Real>& mf_vy = mapfac[
MapFacType::v_y]->const_array(mfi);
502 FArrayBox temp_rhs_fab;
506 RHS_fab.resize (tbz,1,The_Async_Arena());
507 soln_fab.resize (tbz,1,The_Async_Arena());
508 temp_rhs_fab.resize(tbz,2,The_Async_Arena());
510 auto const& RHS_a = RHS_fab.array();
511 auto const& soln_a = soln_fab.array();
512 auto const& temp_rhs_arr = temp_rhs_fab.array();
514 auto const& coeffA_a = coeff_A_mf.array(mfi);
515 auto const& inv_coeffB_a = inv_coeff_B_mf.array(mfi);
516 auto const& coeffC_a = coeff_C_mf.array(mfi);
517 auto const& coeffP_a = coeff_P_mf.array(mfi);
518 auto const& coeffQ_a = coeff_Q_mf.array(mfi);
519 auto const& beta_s_a = beta_s_mf.const_array(mfi);
524 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
525 flux[dir].resize(surroundingNodes(bx,dir),2,The_Async_Arena());
526 flux[dir].setVal<RunOn::Device>(0);
528 const GpuArray<const Array4<Real>, AMREX_SPACEDIM>
529 flx_arr{{AMREX_D_DECL(flux[0].array(), flux[1].array(), flux[2].array())}};
535 BL_PROFILE(
"fast_T_making_rho_rhs");
536 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
538 ( z_nd(i+1,j ,k+1) + z_nd(i+1,j+1,k+1)
539 -z_nd(i+1,j ,k ) - z_nd(i+1,j+1,k ) );
542 ( z_nd(i ,j ,k+1) + z_nd(i ,j+1,k+1)
543 -z_nd(i ,j ,k ) - z_nd(i ,j+1,k ) );
546 ( z_nd(i ,j+1,k+1) + z_nd(i+1,j+1,k+1)
547 -z_nd(i ,j+1,k ) - z_nd(i+1,j+1,k ) );
550 ( z_nd(i ,j ,k+1) + z_nd(i+1,j ,k+1)
551 -z_nd(i ,j ,k ) - z_nd(i+1,j ,k ) );
553 Real xflux_lo = new_drho_u(i ,j,k)*h_zeta_cc_xface_lo / mf_uy(i ,j,0);
554 Real xflux_hi = new_drho_u(i+1,j,k)*h_zeta_cc_xface_hi / mf_uy(i+1,j,0);
555 Real yflux_lo = new_drho_v(i,j ,k)*h_zeta_cc_yface_lo / mf_vx(i,j ,0);
556 Real yflux_hi = new_drho_v(i,j+1,k)*h_zeta_cc_yface_hi / mf_vx(i,j+1,0);
558 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
561 temp_rhs_arr(i,j,k,0) = ( xflux_hi - xflux_lo ) * dxi * mfsq +
562 ( yflux_hi - yflux_lo ) * dyi * mfsq;
563 temp_rhs_arr(i,j,k,1) = (( xflux_hi * (prim(i,j,k,0) + prim(i+1,j,k,0)) -
564 xflux_lo * (prim(i,j,k,0) + prim(i-1,j,k,0)) ) * dxi * mfsq+
565 ( yflux_hi * (prim(i,j,k,0) + prim(i,j+1,k,0)) -
566 yflux_lo * (prim(i,j,k,0) + prim(i,j-1,k,0)) ) * dyi * mfsq) *
myhalf;
569 (flx_arr[0])(i,j,k,0) = xflux_lo;
570 (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));
572 (flx_arr[1])(i,j,k,0) = yflux_lo;
573 (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));
576 (flx_arr[0])(i+1,j,k,0) = xflux_hi;
577 (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));
580 (flx_arr[1])(i,j+1,k,0) = yflux_hi;
581 (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));
594 Box gbxo = mfi.nodaltilebox(2);
597 if (gbxo.smallEnd(2) == domlo.z) {
598 Box gbxo_lo = gbxo; gbxo_lo.setBig(2,gbxo.smallEnd(2));
599 gbxo_mid.setSmall(2,gbxo.smallEnd(2)+1);
600 ParallelFor(gbxo_lo, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
601 omega_arr(i,j,k) =
zero;
604 if (gbxo.bigEnd(2) == domhi.z+1) {
605 Box gbxo_hi = gbxo; gbxo_hi.setSmall(2,gbxo.bigEnd(2));
606 gbxo_mid.setBig(2,gbxo.bigEnd(2)-1);
607 ParallelFor(gbxo_hi, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
608 omega_arr(i,j,k) = old_drho_w(i,j,k);
611 ParallelFor(gbxo_mid, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
612 omega_arr(i,j,k) =
OmegaFromW(i,j,k,old_drho_w(i,j,k),
613 old_drho_u,old_drho_v,
614 mf_ux,mf_vy,z_nd,
dxInv);
622 Box bx_shrunk_in_k = bx;
623 int klo = tbz.smallEnd(2);
624 int khi = tbz.bigEnd(2);
625 bx_shrunk_in_k.setSmall(2,
klo+1);
626 bx_shrunk_in_k.setBig(2,
khi-1);
634 BL_PROFILE(
"fast_loop_on_shrunk_t");
635 ParallelFor(bx_shrunk_in_k, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
637 Real coeff_P = coeffP_a(i,j,k);
638 Real coeff_Q = coeffQ_a(i,j,k);
645 Real R0_tmp = -halfg * old_drho(i,j,k ) + coeff_P * old_drho_theta(i,j,k )
646 -halfg * old_drho(i,j,k-1) + coeff_Q * old_drho_theta(i,j,k-1);
654 Real Omega_kp1 = omega_arr(i,j,k+1);
655 Real Omega_k = omega_arr(i,j,k );
656 Real Omega_km1 = omega_arr(i,j,k-1);
662 Real dbeta_1_kp1 =
myhalf * (
one - beta_s_a(i,j,k+1)) - beta_1;
663 Real dbeta_1_km1 =
myhalf * (
one - beta_s_a(i,j,k-1)) - beta_1;
665 Real detJdiff = (detJ(i,j,k) - detJ(i,j,k-1)) / (detJ(i,j,k)*detJ(i,j,k-1));
668 R1_tmp += halfg * ( beta_1 * dzi * (Omega_kp1/detJ(i,j,k) + detJdiff*Omega_k - Omega_km1/detJ(i,j,k-1))
669 + dzi * (dbeta_1_kp1*Omega_kp1/detJ(i,j,k) - dbeta_1_km1*Omega_km1/detJ(i,j,k-1))
670 + temp_rhs_arr(i,j,k,
Rho_comp)/detJ(i,j,k) + temp_rhs_arr(i,j,k-1,
Rho_comp)/detJ(i,j,k-1) );
673 R1_tmp += -( coeff_P/detJ(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 + temp_rhs_arr(i,j,k ,
RhoTheta_comp) )
674 + coeff_Q/detJ(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 + temp_rhs_arr(i,j,k-1,
RhoTheta_comp) ) );
678 RHS_a(i,j,k) = dtau * (slow_rhs_rho_w(i,j,k) + zmom_src_arr(i,j,k) + R0_tmp + dtau*beta_2*R1_tmp);
682 new_drho_u,new_drho_v,
683 mf_ux,mf_vy,z_nd,
dxInv);
692 auto const lo = lbound(bx);
693 auto const hi = ubound(bx);
698 const bool has_tgt_z = (cf_fluxes.
tgt[2] !=
nullptr);
699 const bool has_rec_z = (cf_fluxes.
rec[2] !=
nullptr);
700 const Array4<const Real> tgt_z = (has_tgt_z) ? cf_fluxes.
tgt[2]->const_array(mfi) : Array4<const Real>{};
701 const Array4<const Real> tgt_om = (has_tgt_z) ? cf_fluxes.
tgt_w->const_array(mfi) : Array4<const Real>{};
702 const Array4< Real> rec_z = (has_rec_z) ? cf_fluxes.
rec[2]->array(mfi) : Array4<Real>{};
703 const Array4< Real> rec_om = (has_rec_z) ? cf_fluxes.
rec_w->array(mfi) : Array4<Real>{};
704 const bool has_rec_z_old = (cf_fluxes.
rec_w_old !=
nullptr);
705 const Array4< Real> rec_om_old = (has_rec_z_old) ? cf_fluxes.
rec_w_old->array(mfi) : Array4<Real>{};
706 const int dklo = domlo.z;
707 const int dkhi = domhi.z;
708 #define CF_OMEGA_STAGE(I,J,K) cf_omega_stage(I,J,K,dklo,dkhi,stage_zmom,stage_xmom,stage_ymom,mf_ux,mf_vy,z_nd,dxInv)
711 BL_PROFILE(
"substep_b2d_loop_t");
720 ParallelFor(b2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
725 RHS_a(i,j,
lo.z ) = (
lo.z == domlo.z)
728 new_drho_u,new_drho_v,
729 mf_ux,mf_vy,z_nd,
dxInv)
730 + dtau * slow_rhs_rho_w(i,j,
lo.z )
731 + dtau * zmom_src_arr(i,j,
lo.z );
732 RHS_a(i,j,
hi.z+1) = (
hi.z == domhi.z)
735 new_drho_u,new_drho_v,
736 mf_ux,mf_vy,z_nd,
dxInv)
737 + dtau * slow_rhs_rho_w(i,j,
hi.z+1)
738 + dtau * zmom_src_arr(i,j,
hi.z+1);
748 ParallelFor(b2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
751 soln_a(i,j,
lo.z) = RHS_a(i,j,
lo.z) * inv_coeffB_a(i,j,
lo.z);
754 for (
int k =
lo.z+1; k <=
hi.z+1; k++) {
755 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);
759 for (
int k =
hi.z; k >=
lo.z; k--) {
760 soln_a(i,j,k) -= ( coeffC_a(i,j,k) * inv_coeffB_a(i,j,k) ) *soln_a(i,j,k+1);
765 for (
int j =
lo.y; j <=
hi.y; ++j) {
767 for (
int i =
lo.x; i <=
hi.x; ++i) {
768 soln_a(i,j,
lo.z) = RHS_a(i,j,
lo.z) * inv_coeffB_a(i,j,
lo.z);
775 for (
int k =
lo.z+1; k <=
hi.z+1; ++k) {
776 for (
int j =
lo.y; j <=
hi.y; ++j) {
778 for (
int i =
lo.x; i <=
hi.x; ++i) {
779 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);
785 for (
int k =
hi.z; k >=
lo.z; --k) {
786 for (
int j =
lo.y; j <=
hi.y; ++j) {
788 for (
int i =
lo.x; i <=
hi.x; ++i) {
789 soln_a(i,j,k) -= ( coeffC_a(i,j,k) * inv_coeffB_a(i,j,k) ) * soln_a(i,j,k+1);
799 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
805 if (k == domhi.z+1) {
808 wpp = WFromOmega(i,j,k,soln_a(i,j,k),
809 new_drho_u,new_drho_v,
810 mf_ux,mf_vy,z_nd,dxInv);
813 cur_zmom(i,j,k) = stage_zmom(i,j,k) + wpp;
819 const bool imposed = has_tgt_z && (tgt_z(i,j,k,1) >
myhalf);
820 if (k > domlo.z && !imposed && l_rayleigh_impl_for_w) {
821 Real damping_coeff = l_damp_coef * dtau * sinesq_stag_d[k];
822 cur_zmom(i,j,k) /= (
one + damping_coeff);
830 BL_PROFILE(
"fast_rho_final_update");
831 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
833 Real zflux_lo =
myhalf * (
one + beta_s_a(i,j,k )) * soln_a(i,j,k )
834 +
myhalf * (
one - beta_s_a(i,j,k )) * omega_arr(i,j,k );
835 Real zflux_hi =
myhalf * (
one + beta_s_a(i,j,k+1)) * soln_a(i,j,k+1)
836 +
myhalf * (
one - beta_s_a(i,j,k+1)) * omega_arr(i,j,k+1);
840 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
842 if (tgt_z(i,j,k+1,1) >
myhalf) { zflux_hi = tgt_z(i,j,k+1,0) * mfsq -
CF_OMEGA_STAGE(i,j,k+1); }
848 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
850 rec_z (i,j,k) = (zflux_lo + om_k) / mfsq;
851 rec_om(i,j,k) = om_k + soln_a(i,j,k);
852 if (has_rec_z_old) { rec_om_old(i,j,k) = om_k + omega_arr(i,j,k); }
855 rec_z (i,j,k+1) = (zflux_hi + om_kp1) / mfsq;
856 rec_om(i,j,k+1) = om_kp1 + soln_a(i,j,k+1);
857 if (has_rec_z_old) { rec_om_old(i,j,k+1) = om_kp1 + omega_arr(i,j,k+1); }
863 avg_zmom_arr(i,j,k) += facinv*zflux_lo / (mf_mx(i,j,0) * mf_my(i,j,0));
865 (flx_arr[2])(i,j,k,0) = zflux_lo / (mf_mx(i,j,0) * mf_my(i,j,0));
869 avg_zmom_arr(i,j,k+1) += facinv * zflux_hi / (mf_mx(i,j,0) * mf_my(i,j,0));
871 (flx_arr[2])(i,j,k+1,0) = zflux_hi / (mf_mx(i,j,0) * mf_my(i,j,0));
872 (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));
876 Real fast_rhs_rho = -(temp_rhs_arr(i,j,k,0) + ( zflux_hi - zflux_lo ) * dzi) / detJ(i,j,k);
878 cur_cons(i,j,k,0) += dtau * (slow_rhs_cons(i,j,k,0) + fast_rhs_rho);
880 Real fast_rhs_rhotheta = -( temp_rhs_arr(i,j,k,1) +
myhalf *
881 ( zflux_hi * (prim(i,j,k) + prim(i,j,k+1)) -
882 zflux_lo * (prim(i,j,k) + prim(i,j,k-1)) ) * dzi ) / detJ(i,j,k);
884 cur_cons(i,j,k,1) += dtau * (slow_rhs_cons(i,j,k,1) + fast_rhs_rhotheta);
887 (flx_arr[2])(i,j,k,1) = (flx_arr[2])(i,j,k,0) *
myhalf * (prim(i,j,k) + prim(i,j,k-1));
898 int strt_comp_reflux = 0;
900 int num_comp_reflux = 1;
901 if (level < finest_level) {
902 fr_as_crse->CrseAdd(mfi,
903 {{AMREX_D_DECL(&(flux[0]), &(flux[1]), &(flux[2]))}},
904 dx, dtau, strt_comp_reflux, strt_comp_reflux, num_comp_reflux, RunOn::Device);
907 fr_as_fine->FineAdd(mfi,
908 {{AMREX_D_DECL(&(flux[0]), &(flux[1]), &(flux[2]))}},
909 dx, dtau, strt_comp_reflux, strt_comp_reflux, num_comp_reflux, RunOn::Device);
915 Gpu::streamSynchronize();
918 #undef CF_OMEGA_STAGE
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_x
Definition: ERF_DataStruct.H:38
@ u_y
Definition: ERF_DataStruct.H:39
@ 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
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
#define CF_OMEGA_STAGE(I, J, K)
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_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
@ 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
std::array< amrex::MultiFab *, AMREX_SPACEDIM > rec
Definition: ERF_TI_fast_headers.H:29
amrex::MultiFab * rec_w
Definition: ERF_TI_fast_headers.H:30
const amrex::MultiFab * tgt_w
Definition: ERF_TI_fast_headers.H:33
std::array< const amrex::MultiFab *, AMREX_SPACEDIM > tgt
Definition: ERF_TI_fast_headers.H:32
amrex::MultiFab * rec_w_old
Definition: ERF_TI_fast_headers.H:31