10 #include <AMReX_Vector.H>
21 template<
typename InterpType_H,
typename InterpType_V>
24 const int& ncomp,
const int& icomp,
25 const amrex::GpuArray<
const amrex::Array4<amrex::Real>, AMREX_SPACEDIM> flx_arr,
26 const amrex::Array4<const amrex::Real>& cell_prim,
27 const amrex::Array4<const amrex::Real>& avg_xmom,
28 const amrex::Array4<const amrex::Real>& avg_ymom,
29 const amrex::Array4<const amrex::Real>& avg_zmom,
30 const amrex::Array4<const amrex::EBCellFlag>& cellflag,
31 const amrex::Array4<const amrex::Real>& ax_arr,
32 const amrex::Array4<const amrex::Real>& ay_arr,
33 const amrex::Array4<const amrex::Real>& az_arr,
38 InterpType_H interp_prim_h(cell_prim, horiz_upw_frac);
39 InterpType_V interp_prim_v(cell_prim, vert_upw_frac);
41 const int ncells_h = interp_prim_h.GetUpwindCellNumber();
42 const int ncells_v = interp_prim_v.GetUpwindCellNumber();
46 UPWIND3 interp_prim_UPW3(cell_prim, horiz_upw_frac);
48 const amrex::Box xbx = amrex::surroundingNodes(bx,0).grow(amrex::IntVect(0, 1, 1));
49 const amrex::Box ybx = amrex::surroundingNodes(bx,1).grow(amrex::IntVect(1, 0, 1));
50 const amrex::Box zbx = amrex::surroundingNodes(bx,2).grow(amrex::IntVect(1, 1, 0));
52 amrex::ParallelFor(xbx, ncomp,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
54 const int cons_index = icomp + n;
56 if ( ax_arr(i,j,k) >
zero )
62 if (avg_xmom(i,j,k)>
zero)
64 for (
int ii=0; ii<ncells_h; ++ii) {
65 if (cellflag(i-ii-1,j,k).isCovered()) {
71 else if (avg_xmom(i,j,k)<
zero)
73 for (
int ii=0; ii<ncells_h; ++ii) {
74 if (cellflag(i+ii,j,k).isCovered()) {
83 const int prim_index = cons_index - 1;
86 if (icell==ncells_h) {
87 interp_prim_h.InterpolateInX(i,j,k,prim_index,interpx,avg_xmom(i,j,k));
90 interp_prim_CEN2.
InterpolateInX(i,j,k,prim_index,interpx,avg_xmom(i,j,k));
91 }
else if (icell==2) {
92 interp_prim_UPW3.
InterpolateInX(i,j,k,prim_index,interpx,avg_xmom(i,j,k));
95 (flx_arr[0])(i,j,k,cons_index) = avg_xmom(i,j,k) * interpx;
99 (flx_arr[0])(i,j,k,cons_index) =
zero;
103 amrex::ParallelFor(ybx, ncomp,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
105 const int cons_index = icomp + n;
107 if ( ay_arr(i,j,k) >
zero )
113 if (avg_ymom(i,j,k)>
zero)
115 for (
int jj=0; jj<ncells_h; ++jj) {
116 if (cellflag(i,j-jj-1,k).isCovered()) {
122 else if (avg_ymom(i,j,k)<
zero)
124 for (
int jj=0; jj<ncells_h; ++jj) {
125 if (cellflag(i,j+jj,k).isCovered()) {
134 const int prim_index = cons_index - 1;
137 if (jcell==ncells_h) {
138 interp_prim_h.InterpolateInY(i,j,k,prim_index,interpy,avg_ymom(i,j,k));
141 interp_prim_CEN2.
InterpolateInY(i,j,k,prim_index,interpy,avg_ymom(i,j,k));
142 }
else if (jcell==2) {
143 interp_prim_UPW3.
InterpolateInY(i,j,k,prim_index,interpy,avg_ymom(i,j,k));
146 (flx_arr[1])(i,j,k,cons_index) = avg_ymom(i,j,k) * interpy;
150 (flx_arr[1])(i,j,k,cons_index) =
zero;
156 amrex::ParallelFor(zbx, ncomp,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
158 const int cons_index = icomp + n;
160 if ( az_arr(i,j,k) >
zero )
166 if (avg_zmom(i,j,k)>
zero)
168 for (
int kk=0; kk<ncells_v; ++kk) {
169 if (cellflag(i,j,k-kk-1).isCovered()) {
175 else if (avg_zmom(i,j,k)<
zero)
177 for (
int kk=0; kk<ncells_v; ++kk) {
178 if (cellflag(i,j,k+kk).isCovered()) {
187 const int prim_index = cons_index - 1;
190 if (kcell==ncells_v) {
191 interp_prim_v.InterpolateInZ(i,j,k,prim_index,interpz,avg_zmom(i,j,k));
194 interp_prim_CEN2.
InterpolateInZ(i,j,k,prim_index,interpz,avg_zmom(i,j,k));
195 }
else if (kcell==2) {
196 interp_prim_UPW3.
InterpolateInZ(i,j,k,prim_index,interpz,avg_zmom(i,j,k));
199 (flx_arr[2])(i,j,k,cons_index) = avg_zmom(i,j,k) * interpz;
203 (flx_arr[2])(i,j,k,cons_index) =
zero;
213 template<
typename InterpType_H>
216 const int& ncomp,
const int& icomp,
217 const amrex::GpuArray<
const amrex::Array4<amrex::Real>, AMREX_SPACEDIM> flx_arr,
218 const amrex::Array4<const amrex::Real>& cell_prim,
219 const amrex::Array4<const amrex::Real>& avg_xmom,
220 const amrex::Array4<const amrex::Real>& avg_ymom,
221 const amrex::Array4<const amrex::Real>& avg_zmom,
222 const amrex::Array4<const amrex::EBCellFlag>& cellflag,
223 const amrex::Array4<const amrex::Real>& ax_arr,
224 const amrex::Array4<const amrex::Real>& ay_arr,
225 const amrex::Array4<const amrex::Real>& az_arr,
230 switch(vert_adv_type) {
232 EBAdvectionSrcForScalarsWrapper<InterpType_H,CENTERED2>(bx, ncomp, icomp,
234 avg_xmom, avg_ymom, avg_zmom,
235 cellflag, ax_arr, ay_arr, az_arr,
236 horiz_upw_frac, vert_upw_frac);
239 EBAdvectionSrcForScalarsWrapper<InterpType_H,UPWIND3>(bx, ncomp, icomp,
241 avg_xmom, avg_ymom, avg_zmom,
242 cellflag, ax_arr, ay_arr, az_arr,
243 horiz_upw_frac, vert_upw_frac);
246 EBAdvectionSrcForScalarsWrapper<InterpType_H,CENTERED4>(bx, ncomp, icomp,
248 avg_xmom, avg_ymom, avg_zmom,
249 cellflag, ax_arr, ay_arr, az_arr,
250 horiz_upw_frac, vert_upw_frac);
253 EBAdvectionSrcForScalarsWrapper<InterpType_H,UPWIND5>(bx, ncomp, icomp,
255 avg_xmom, avg_ymom, avg_zmom,
256 cellflag, ax_arr, ay_arr, az_arr,
257 horiz_upw_frac, vert_upw_frac);
260 EBAdvectionSrcForScalarsWrapper<InterpType_H,CENTERED6>(bx, ncomp, icomp,
262 avg_xmom, avg_ymom, avg_zmom,
263 cellflag, ax_arr, ay_arr, az_arr,
264 horiz_upw_frac, vert_upw_frac);
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
void EBAdvectionSrcForScalarsVert(const amrex::Box &bx, const int &ncomp, const int &icomp, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > flx_arr, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom, const amrex::Array4< const amrex::EBCellFlag > &cellflag, const amrex::Array4< const amrex::Real > &ax_arr, const amrex::Array4< const amrex::Real > &ay_arr, const amrex::Array4< const amrex::Real > &az_arr, const amrex::Real horiz_upw_frac, const amrex::Real vert_upw_frac, const AdvType vert_adv_type)
Dispatch EB scalar flux construction on the vertical advection scheme.
Definition: ERF_EBAdvectionSrcForScalars.H:215
void EBAdvectionSrcForScalarsWrapper(const amrex::Box &bx, const int &ncomp, const int &icomp, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > flx_arr, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom, const amrex::Array4< const amrex::EBCellFlag > &cellflag, const amrex::Array4< const amrex::Real > &ax_arr, const amrex::Array4< const amrex::Real > &ay_arr, const amrex::Array4< const amrex::Real > &az_arr, const amrex::Real horiz_upw_frac, const amrex::Real vert_upw_frac)
Build EB scalar fluxes with selected horizontal and vertical interpolation.
Definition: ERF_EBAdvectionSrcForScalars.H:23
AdvType
Definition: ERF_IndexDefines.H:261
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);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_ASSERT_WITH_MESSAGE(wbar_cutoff_min > wbar_cutoff_max, "ERROR: wbar_cutoff_min < wbar_cutoff_max")
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:38
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:56
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:20
Definition: ERF_Interpolation_UPW.H:95
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void SetUpwinding(amrex::Real upw_frac)
Definition: ERF_Interpolation_UPW.H:205
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:159
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:133
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:107