6 #include <AMReX_Vector.H>
12 template<
typename InterpType_H,
typename InterpType_V>
15 const int& ncomp,
const int& icomp,
16 const amrex::GpuArray<
const amrex::Array4<amrex::Real>, AMREX_SPACEDIM> flx_arr,
17 const amrex::Array4<const amrex::Real>& cell_prim,
18 const amrex::Array4<const amrex::Real>& avg_xmom,
19 const amrex::Array4<const amrex::Real>& avg_ymom,
20 const amrex::Array4<const amrex::Real>& avg_zmom,
21 const amrex::Array4<const amrex::EBCellFlag>& cellflag,
22 const amrex::Array4<const amrex::Real>& ax_arr,
23 const amrex::Array4<const amrex::Real>& ay_arr,
24 const amrex::Array4<const amrex::Real>& az_arr,
25 const amrex::Real horiz_upw_frac,
26 const amrex::Real vert_upw_frac)
29 InterpType_H interp_prim_h(cell_prim, horiz_upw_frac);
30 InterpType_V interp_prim_v(cell_prim, vert_upw_frac);
32 const int ncells_h = interp_prim_h.GetUpwindCellNumber();
33 const int ncells_v = interp_prim_v.GetUpwindCellNumber();
37 UPWIND3 interp_prim_UPW3(cell_prim, horiz_upw_frac);
39 const amrex::Box
xbx = amrex::surroundingNodes(bx,0).grow(amrex::IntVect(0, 1, 1));
40 const amrex::Box
ybx = amrex::surroundingNodes(bx,1).grow(amrex::IntVect(1, 0, 1));
41 const amrex::Box
zbx = amrex::surroundingNodes(bx,2).grow(amrex::IntVect(1, 1, 0));
43 amrex::ParallelFor(
xbx, ncomp,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
45 const int cons_index = icomp + n;
47 if ( ax_arr(i,j,k) > 0. )
53 if (avg_xmom(i,j,k)>0.)
55 for (
int ii=0; ii<ncells_h; ++ii) {
56 if (cellflag(i-ii-1,j,k).isCovered()) {
62 else if (avg_xmom(i,j,k)<0.)
64 for (
int ii=0; ii<ncells_h; ++ii) {
65 if (cellflag(i+ii,j,k).isCovered()) {
74 const int prim_index = cons_index - 1;
75 amrex::Real interpx(0.);
77 if (icell==ncells_h) {
78 interp_prim_h.InterpolateInX(i,j,k,prim_index,interpx,avg_xmom(i,j,k));
81 interp_prim_CEN2.
InterpolateInX(i,j,k,prim_index,interpx,avg_xmom(i,j,k));
82 }
else if (icell==2) {
83 interp_prim_UPW3.
InterpolateInX(i,j,k,prim_index,interpx,avg_xmom(i,j,k));
86 (flx_arr[0])(i,j,k,cons_index) = avg_xmom(i,j,k) * interpx;
90 (flx_arr[0])(i,j,k,cons_index) = 0.;
94 amrex::ParallelFor(
ybx, ncomp,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
96 const int cons_index = icomp + n;
98 if ( ay_arr(i,j,k) > 0. )
104 if (avg_ymom(i,j,k)>0.)
106 for (
int jj=0; jj<ncells_h; ++jj) {
107 if (cellflag(i,j-jj-1,k).isCovered()) {
113 else if (avg_ymom(i,j,k)<0.)
115 for (
int jj=0; jj<ncells_h; ++jj) {
116 if (cellflag(i,j+jj,k).isCovered()) {
125 const int prim_index = cons_index - 1;
126 amrex::Real interpy(0.);
128 if (jcell==ncells_h) {
129 interp_prim_h.InterpolateInY(i,j,k,prim_index,interpy,avg_ymom(i,j,k));
132 interp_prim_CEN2.
InterpolateInY(i,j,k,prim_index,interpy,avg_ymom(i,j,k));
133 }
else if (jcell==2) {
134 interp_prim_UPW3.
InterpolateInY(i,j,k,prim_index,interpy,avg_ymom(i,j,k));
137 (flx_arr[1])(i,j,k,cons_index) = avg_ymom(i,j,k) * interpy;
141 (flx_arr[1])(i,j,k,cons_index) = 0.;
147 amrex::ParallelFor(
zbx, ncomp,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
149 const int cons_index = icomp + n;
151 if ( az_arr(i,j,k) > 0. )
157 if (avg_zmom(i,j,k)>0.)
159 for (
int kk=0; kk<ncells_v; ++kk) {
160 if (cellflag(i,j,k-kk-1).isCovered()) {
166 else if (avg_zmom(i,j,k)<0.)
168 for (
int kk=0; kk<ncells_v; ++kk) {
169 if (cellflag(i,j,k+kk).isCovered()) {
178 const int prim_index = cons_index - 1;
179 amrex::Real interpz(0.);
181 if (kcell==ncells_v) {
182 interp_prim_v.InterpolateInZ(i,j,k,prim_index,interpz,avg_zmom(i,j,k));
185 interp_prim_CEN2.
InterpolateInZ(i,j,k,prim_index,interpz,avg_zmom(i,j,k));
186 }
else if (kcell==2) {
187 interp_prim_UPW3.
InterpolateInZ(i,j,k,prim_index,interpz,avg_zmom(i,j,k));
190 (flx_arr[2])(i,j,k,cons_index) = avg_zmom(i,j,k) * interpz;
194 (flx_arr[2])(i,j,k,cons_index) = 0.;
204 template<
typename InterpType_H>
207 const int& ncomp,
const int& icomp,
208 const amrex::GpuArray<
const amrex::Array4<amrex::Real>, AMREX_SPACEDIM> flx_arr,
209 const amrex::Array4<const amrex::Real>& cell_prim,
210 const amrex::Array4<const amrex::Real>& avg_xmom,
211 const amrex::Array4<const amrex::Real>& avg_ymom,
212 const amrex::Array4<const amrex::Real>& avg_zmom,
213 const amrex::Array4<const amrex::EBCellFlag>& cellflag,
214 const amrex::Array4<const amrex::Real>& ax_arr,
215 const amrex::Array4<const amrex::Real>& ay_arr,
216 const amrex::Array4<const amrex::Real>& az_arr,
217 const amrex::Real horiz_upw_frac,
218 const amrex::Real vert_upw_frac,
221 switch(vert_adv_type) {
223 EBAdvectionSrcForScalarsWrapper<InterpType_H,CENTERED2>(bx, ncomp, icomp,
225 avg_xmom, avg_ymom, avg_zmom,
226 cellflag, ax_arr, ay_arr, az_arr,
227 horiz_upw_frac, vert_upw_frac);
230 EBAdvectionSrcForScalarsWrapper<InterpType_H,UPWIND3>(bx, ncomp, icomp,
232 avg_xmom, avg_ymom, avg_zmom,
233 cellflag, ax_arr, ay_arr, az_arr,
234 horiz_upw_frac, vert_upw_frac);
237 EBAdvectionSrcForScalarsWrapper<InterpType_H,CENTERED4>(bx, ncomp, icomp,
239 avg_xmom, avg_ymom, avg_zmom,
240 cellflag, ax_arr, ay_arr, az_arr,
241 horiz_upw_frac, vert_upw_frac);
244 EBAdvectionSrcForScalarsWrapper<InterpType_H,UPWIND5>(bx, ncomp, icomp,
246 avg_xmom, avg_ymom, avg_zmom,
247 cellflag, ax_arr, ay_arr, az_arr,
248 horiz_upw_frac, vert_upw_frac);
251 EBAdvectionSrcForScalarsWrapper<InterpType_H,CENTERED6>(bx, ncomp, icomp,
253 avg_xmom, avg_ymom, avg_zmom,
254 cellflag, ax_arr, ay_arr, az_arr,
255 horiz_upw_frac, vert_upw_frac);
258 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown vertical advection scheme!");
const Box zbx
Definition: ERF_DiffSetup.H:23
const Box xbx
Definition: ERF_DiffSetup.H:21
const Box ybx
Definition: ERF_DiffSetup.H:22
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)
Definition: ERF_EBAdvectionSrcForScalars.H:206
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)
Definition: ERF_EBAdvectionSrcForScalars.H:14
AdvType
Definition: ERF_IndexDefines.H:221
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
void SetUpwinding(amrex::Real upw_frac)
Definition: ERF_Interpolation_UPW.H:199
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