7 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
10 const amrex::Vector<amrex::Box>& bxy_grown,
11 const amrex::Vector<amrex::Box>& bxz_grown,
12 const amrex::Array4<const amrex::Real>& rho_u,
13 const amrex::Array4<const amrex::Real>& rho_v,
14 const amrex::Array4<const amrex::Real>& rho_w,
15 const amrex::Array4<const amrex::Real>& u,
16 const amrex::Array4<const amrex::Real>& v,
17 const amrex::Array4<const amrex::Real>& w,
18 const amrex::Array4<const amrex::EBCellFlag>& u_cflag,
19 const amrex::Array4<const amrex::Real>& u_afrac_x,
20 const amrex::Array4<const amrex::Real>& u_afrac_y,
21 const amrex::Array4<const amrex::Real>& u_afrac_z,
22 const amrex::Array4<const amrex::EBCellFlag>& v_cflag,
23 const amrex::Array4<const amrex::Real>& v_afrac_x,
24 const amrex::Array4<const amrex::Real>& v_afrac_y,
25 const amrex::Array4<const amrex::Real>& v_afrac_z,
26 const amrex::Array4<const amrex::EBCellFlag>& w_cflag,
27 const amrex::Array4<const amrex::Real>& w_afrac_x,
28 const amrex::Array4<const amrex::Real>& w_afrac_y,
29 const amrex::Array4<const amrex::Real>& w_afrac_z,
30 const amrex::Array4<const amrex::Real>& mf_ux_inv,
31 const amrex::Array4<const amrex::Real>& mf_vx_inv,
32 const amrex::Array4<const amrex::Real>& mf_uy_inv,
33 const amrex::Array4<const amrex::Real>& mf_vy_inv,
37 amrex::GpuArray<amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_u_arr,
38 amrex::GpuArray<amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_v_arr,
39 amrex::GpuArray<amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_w_arr,
40 const int lo_z_face,
const int hi_z_face)
43 InterpType_H interp_u_horz(u, upw_frac_h); InterpType_V interp_u_vert(u, upw_frac_v);
44 InterpType_H interp_v_horz(v, upw_frac_h); InterpType_V interp_v_vert(v, upw_frac_v);
45 InterpType_H interp_w_horz(w, upw_frac_h); InterpType_V interp_w_vert(w, upw_frac_v);
48 const int ncells_u_horz = interp_u_horz.GetUpwindCellNumber();
49 const int ncells_u_vert = interp_u_vert.GetUpwindCellNumber();
50 const int ncells_v_horz = interp_v_horz.GetUpwindCellNumber();
51 const int ncells_v_vert = interp_v_vert.GetUpwindCellNumber();
52 const int ncells_w_horz = interp_w_horz.GetUpwindCellNumber();
53 const int ncells_w_vert = interp_w_vert.GetUpwindCellNumber();
60 UPWIND3 interp_u_UPW3(u, upw_frac_h);
61 UPWIND3 interp_v_UPW3(v, upw_frac_h);
62 UPWIND3 interp_w_UPW3(w, upw_frac_h);
68 amrex::ParallelFor(bxx_grown[0], bxx_grown[1], bxx_grown[2],
70 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
72 if ( u_afrac_x(i,j,k) > 0. )
74 amrex::Real rho_u_avg = 0.5 * (rho_u(i-1,j,k) * mf_ux_inv(i-1,j,0) + rho_u(i,j,k) * mf_ux_inv(i,j,0));
80 for (
int ii=0; ii<ncells_u_horz; ++ii) {
81 if (u_cflag(i-ii-1,j,k).isCovered()) {
87 else if (rho_u_avg<0.)
89 for (
int ii=0; ii<ncells_u_horz; ++ii) {
90 if (u_cflag(i+ii,j,k).isCovered()) {
100 if (icell==ncells_u_horz) {
101 interp_u_horz.InterpolateInX(i,j,k,0,interpx,rho_u_avg);
105 }
else if (icell==2) {
109 flx_u_arr[0](i,j,k) = rho_u_avg * interpx;
113 flx_u_arr[0](i,j,k) = 0.;
117 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
119 if ( u_afrac_y(i,j,k) > 0. )
121 amrex::Real rho_v_avg = 0.5 * (rho_v(i,j,k) * mf_vx_inv(i,j,0) + rho_v(i-1,j,k) * mf_vx_inv(i-1,j,0));
127 for (
int jj=0; jj<ncells_u_horz; ++jj) {
128 if (u_cflag(i,j-jj-1,k).isCovered()) {
134 else if (rho_v_avg<0.)
136 for (
int jj=0; jj<ncells_u_horz; ++jj) {
137 if (u_cflag(i,j+jj,k).isCovered()) {
147 if (jcell==ncells_u_horz) {
148 interp_u_horz.InterpolateInY(i,j,k,0,interpy,rho_v_avg);
152 }
else if (jcell==2) {
156 flx_u_arr[1](i,j,k) = rho_v_avg * interpy;
160 flx_u_arr[1](i,j,k) = 0.;
164 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
166 if ( u_afrac_z(i,j,k) > 0. )
168 amrex::Real rho_w_avg = 0.5 * (rho_w(i,j,k) + rho_w(i-1,j,k));
174 for (
int kk=0; kk<ncells_u_vert; ++kk) {
175 if (u_cflag(i,j,k-kk-1).isCovered()) {
181 else if (rho_w_avg<0.)
183 for (
int kk=0; kk<ncells_u_vert; ++kk) {
184 if (u_cflag(i,j,k+kk).isCovered()) {
194 if (kcell==ncells_u_vert) {
195 interp_u_vert.InterpolateInZ(i,j,k,0,interpz,rho_w_avg);
199 }
else if (kcell==2) {
203 flx_u_arr[2](i,j,k) = rho_w_avg * interpz;
207 flx_u_arr[2](i,j,k) = 0.;
215 amrex::ParallelFor(bxy_grown[0], bxy_grown[1], bxy_grown[2],
217 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
219 if ( v_afrac_x(i,j,k) > 0. )
221 amrex::Real rho_u_avg = 0.5 * (rho_u(i,j,k) * mf_uy_inv(i,j,0) + rho_u(i,j-1,k) * mf_uy_inv(i,j-1,0));
227 for (
int ii=0; ii<ncells_v_horz; ++ii) {
228 if (v_cflag(i-ii-1,j,k).isCovered()) {
234 else if (rho_u_avg<0.)
236 for (
int ii=0; ii<ncells_v_horz; ++ii) {
237 if (v_cflag(i+ii,j,k).isCovered()) {
247 if (icell==ncells_v_horz) {
248 interp_v_horz.InterpolateInX(i,j,k,0,interpx,rho_u_avg);
252 }
else if (icell==2) {
256 flx_v_arr[0](i,j,k) = rho_u_avg * interpx;
260 flx_v_arr[0](i,j,k) = 0.;
264 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
266 if ( v_afrac_y(i,j,k) > 0. )
268 amrex::Real rho_v_avg = 0.5 * (rho_v(i,j,k) * mf_vy_inv(i,j,0) + rho_v(i,j-1,k) * mf_vy_inv(i,j-1,0));
274 for (
int jj=0; jj<ncells_v_horz; ++jj) {
275 if (v_cflag(i,j-jj-1,k).isCovered()) {
281 else if (rho_v_avg<0.)
283 for (
int jj=0; jj<ncells_v_horz; ++jj) {
284 if (v_cflag(i,j+jj,k).isCovered()) {
294 if (jcell==ncells_v_horz) {
295 interp_v_horz.InterpolateInY(i,j,k,0,interpy,rho_v_avg);
299 }
else if (jcell==2) {
303 flx_v_arr[1](i,j,k) = rho_v_avg * interpy;
307 flx_v_arr[1](i,j,k) = 0.;
311 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
313 if ( v_afrac_z(i,j,k) > 0. )
315 amrex::Real rho_w_avg = 0.5 * (rho_w(i,j,k) + rho_w(i,j-1,k));
321 for (
int kk=0; kk<ncells_v_vert; ++kk) {
322 if (v_cflag(i,j,k-kk-1).isCovered()) {
328 else if (rho_w_avg<0.)
330 for (
int kk=0; kk<ncells_v_vert; ++kk) {
331 if (v_cflag(i,j,k+kk).isCovered()) {
341 if (kcell==ncells_v_vert) {
342 interp_v_vert.InterpolateInZ(i,j,k,0,interpz,rho_w_avg);
346 }
else if (kcell==2) {
350 flx_v_arr[2](i,j,k) = rho_w_avg * interpz;
354 flx_v_arr[2](i,j,k) = 0.;
362 amrex::ParallelFor(bxz_grown[0], bxz_grown[1], bxz_grown[2],
364 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
366 if ( w_afrac_x(i,j,k) > 0. )
368 amrex::Real rho_u_avg = 0.5 * (rho_u(i,j,k) + rho_u(i,j,k-1)) * mf_ux_inv(i,j,0);
374 for (
int ii=0; ii<ncells_w_horz; ++ii) {
375 if (w_cflag(i-ii-1,j,k).isCovered()) {
381 else if (rho_u_avg<0.)
383 for (
int ii=0; ii<ncells_w_horz; ++ii) {
384 if (w_cflag(i+ii,j,k).isCovered()) {
394 if (icell==ncells_w_horz) {
395 interp_w_horz.InterpolateInX(i,j,k,0,interpx,rho_u_avg);
399 }
else if (icell==2) {
403 flx_w_arr[0](i,j,k) = rho_u_avg * interpx;
407 flx_w_arr[0](i,j,k) = 0.;
411 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
413 if ( w_afrac_y(i,j,k) > 0. )
415 amrex::Real rho_v_avg = 0.5 * (rho_v(i,j,k) + rho_v(i,j,k-1)) * mf_vy_inv(i,j,0);
421 for (
int jj=0; jj<ncells_w_horz; ++jj) {
422 if (w_cflag(i,j-jj-1,k).isCovered()) {
428 else if (rho_v_avg<0.)
430 for (
int jj=0; jj<ncells_w_horz; ++jj) {
431 if (w_cflag(i,j+jj,k).isCovered()) {
441 if (jcell==ncells_w_horz) {
442 interp_w_horz.InterpolateInY(i,j,k,0,interpy,rho_v_avg);
446 }
else if (jcell==2) {
450 flx_w_arr[1](i,j,k) = rho_v_avg * interpy;
454 flx_w_arr[1](i,j,k) = 0.;
458 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
460 if ( w_afrac_z(i,j,k) > 0. )
462 if (k==lo_z_face || k==hi_z_face+1) {
464 flx_w_arr[2](i,j,k) = rho_w(i,j,k) * w(i,j,k);
467 amrex::Real rho_w_avg = 0.5 * (rho_w(i,j,k) + rho_w(i,j,k-1));
473 for (
int kk=0; kk<ncells_w_vert; ++kk) {
474 if (w_cflag(i,j,k-kk-1).isCovered()) {
480 else if (rho_w_avg<0.)
482 for (
int kk=0; kk<ncells_w_vert; ++kk) {
483 if (w_cflag(i,j,k+kk).isCovered()) {
492 if (k == hi_z_face || k == lo_z_face+1) {
493 kcell=std::min(kcell,1);
494 }
else if (k == hi_z_face-1 || k == lo_z_face+2 ) {
495 kcell=std::min(kcell,2);
501 if (kcell==ncells_w_vert) {
502 interp_w_vert.InterpolateInZ(i,j,k,0,interpz,rho_w_avg);
506 }
else if (kcell==2) {
510 flx_w_arr[2](i,j,k) = rho_w_avg * interpz;
515 flx_w_arr[2](i,j,k) = 0.;
524 template<
typename InterpType_H>
527 const amrex::Vector<amrex::Box>& bxy_grown,
528 const amrex::Vector<amrex::Box>& bxz_grown,
529 const amrex::Array4<const amrex::Real>& rho_u,
530 const amrex::Array4<const amrex::Real>& rho_v,
531 const amrex::Array4<const amrex::Real>& rho_w,
532 const amrex::Array4<const amrex::Real>& u,
533 const amrex::Array4<const amrex::Real>& v,
534 const amrex::Array4<const amrex::Real>& w,
535 const amrex::Array4<const amrex::EBCellFlag>& u_cflag,
536 const amrex::Array4<const amrex::Real>& u_afrac_x,
537 const amrex::Array4<const amrex::Real>& u_afrac_y,
538 const amrex::Array4<const amrex::Real>& u_afrac_z,
539 const amrex::Array4<const amrex::EBCellFlag>& v_cflag,
540 const amrex::Array4<const amrex::Real>& v_afrac_x,
541 const amrex::Array4<const amrex::Real>& v_afrac_y,
542 const amrex::Array4<const amrex::Real>& v_afrac_z,
543 const amrex::Array4<const amrex::EBCellFlag>& w_cflag,
544 const amrex::Array4<const amrex::Real>& w_afrac_x,
545 const amrex::Array4<const amrex::Real>& w_afrac_y,
546 const amrex::Array4<const amrex::Real>& w_afrac_z,
547 const amrex::Array4<const amrex::Real>& mf_ux_inv,
548 const amrex::Array4<const amrex::Real>& mf_vx_inv,
549 const amrex::Array4<const amrex::Real>& mf_uy_inv,
550 const amrex::Array4<const amrex::Real>& mf_vy_inv,
554 amrex::GpuArray<amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_u_arr,
555 amrex::GpuArray<amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_v_arr,
556 amrex::GpuArray<amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_w_arr,
557 const int lo_z_face,
const int hi_z_face)
560 EBAdvectionSrcForMomWrapper<InterpType_H,CENTERED2,UPWINDALL>(
561 bxx_grown, bxy_grown, bxz_grown,
562 rho_u, rho_v, rho_w, u, v, w,
563 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
564 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
565 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
566 mf_ux_inv, mf_vx_inv,
567 mf_uy_inv, mf_vy_inv,
568 upw_frac_h, upw_frac_v, vert_adv_type,
569 flx_u_arr, flx_v_arr, flx_w_arr,
570 lo_z_face, hi_z_face);
572 EBAdvectionSrcForMomWrapper<InterpType_H,UPWIND3,UPWINDALL>(
573 bxx_grown, bxy_grown, bxz_grown,
574 rho_u, rho_v, rho_w, u, v, w,
575 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
576 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
577 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
578 mf_ux_inv, mf_vx_inv,
579 mf_uy_inv, mf_vy_inv,
580 upw_frac_h, upw_frac_v, vert_adv_type,
581 flx_u_arr, flx_v_arr, flx_w_arr,
582 lo_z_face, hi_z_face);
584 EBAdvectionSrcForMomWrapper<InterpType_H,CENTERED4,UPWINDALL>(
585 bxx_grown, bxy_grown, bxz_grown,
586 rho_u, rho_v, rho_w, u, v, w,
587 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
588 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
589 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
590 mf_ux_inv, mf_vx_inv,
591 mf_uy_inv, mf_vy_inv,
592 upw_frac_h, upw_frac_v, vert_adv_type,
593 flx_u_arr, flx_v_arr, flx_w_arr,
594 lo_z_face, hi_z_face);
596 EBAdvectionSrcForMomWrapper<InterpType_H,UPWIND5,UPWINDALL>(
597 bxx_grown, bxy_grown, bxz_grown,
598 rho_u, rho_v, rho_w, u, v, w,
599 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
600 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
601 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
602 mf_ux_inv, mf_vx_inv,
603 mf_uy_inv, mf_vy_inv,
604 upw_frac_h, upw_frac_v, vert_adv_type,
605 flx_u_arr, flx_v_arr, flx_w_arr,
606 lo_z_face, hi_z_face);
608 EBAdvectionSrcForMomWrapper<InterpType_H,CENTERED6,UPWINDALL>(
609 bxx_grown, bxy_grown, bxz_grown,
610 rho_u, rho_v, rho_w, u, v, w,
611 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
612 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
613 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
614 mf_ux_inv, mf_vx_inv,
615 mf_uy_inv, mf_vy_inv,
616 upw_frac_h, upw_frac_v, vert_adv_type,
617 flx_u_arr, flx_v_arr, flx_w_arr,
618 lo_z_face, hi_z_face);
620 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme!");
AdvType
Definition: ERF_IndexDefines.H:221
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_Interpolation_UPW.H:10
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void InterpolateInY(const int &i, const int &j, const int &k, const int &qty_index, amrex::Real &val_lo, amrex::Real) const
Definition: ERF_Interpolation_UPW.H:36
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void InterpolateInZ(const int &i, const int &j, const int &k, const int &qty_index, amrex::Real &val_lo, amrex::Real) const
Definition: ERF_Interpolation_UPW.H:54
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void InterpolateInX(const int &i, const int &j, const int &k, const int &qty_index, amrex::Real &val_lo, amrex::Real) const
Definition: ERF_Interpolation_UPW.H:18
Definition: ERF_Interpolation_UPW.H:93
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void InterpolateInZ(const int &i, const int &j, const int &k, const int &qty_index, amrex::Real &val_lo, amrex::Real upw_lo) const
Definition: ERF_Interpolation_UPW.H:155
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void InterpolateInY(const int &i, const int &j, const int &k, const int &qty_index, amrex::Real &val_lo, amrex::Real upw_lo) const
Definition: ERF_Interpolation_UPW.H:129
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void InterpolateInX(const int &i, const int &j, const int &k, const int &qty_index, amrex::Real &val_lo, amrex::Real upw_lo) const
Definition: ERF_Interpolation_UPW.H:103