Function for computing the advective tendency for scalar update equations other than density This routine has explicit expressions for all cases (terrain or not) when the horizontal and vertical spatial orders are <= 2, and calls more specialized functions when either (or both) spatial order(s) is greater than two
150 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
152 const Box xbx = surroundingNodes(bx,0);
153 const Box ybx = surroundingNodes(bx,1);
154 const Box zbx = surroundingNodes(bx,2);
163 Box bx_xlo, bx_xhi, bx_ylo, bx_yhi;
165 if ( bx.smallEnd(0) == domain.smallEnd(0)) { bx_xlo = makeSlab( bx,0,domain.smallEnd(0));}
168 if ( bx.bigEnd(0) == domain.bigEnd(0)) { bx_xhi = makeSlab( bx,0,domain.bigEnd(0) );}
171 if ( bx.smallEnd(1) == domain.smallEnd(1)) { bx_ylo = makeSlab( bx,1,domain.smallEnd(1));}
174 if ( bx.bigEnd(1) == domain.bigEnd(1)) { bx_yhi = makeSlab( bx,1,domain.bigEnd(1) );}
177 for (
int n(0); n<ncomp; ++n) {
178 const int cons_index = icomp + n;
186 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
188 const int prim_index = cons_index - 1;
189 const Real prim_on_face =
myhalf * (cell_prim(i,j,k,prim_index) + cell_prim(i-1,j,k,prim_index));
190 (flx_arr[0])(i,j,k) = avg_xmom(i,j,k) * prim_on_face;
192 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
194 const int prim_index = cons_index - 1;
195 const Real prim_on_face =
myhalf * (cell_prim(i,j,k,prim_index) + cell_prim(i,j-1,k,prim_index));
196 (flx_arr[1])(i,j,k) = avg_ymom(i,j,k) * prim_on_face;
198 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
200 const int prim_index = cons_index - 1;
201 const Real prim_on_face =
myhalf * (cell_prim(i,j,k,prim_index) + cell_prim(i,j,k-1,prim_index));
202 (flx_arr[2])(i,j,k) = avg_zmom(i,j,k) * prim_on_face;
207 switch(horiz_adv_type) {
209 AdvectionSrcForScalarsVert<CENTERED2>(bx, cons_index, flx_arr, cell_prim,
210 avg_xmom, avg_ymom, avg_zmom,
211 horiz_upw_frac, vert_upw_frac, vert_adv_type);
214 AdvectionSrcForScalarsVert<UPWIND3>(bx, cons_index, flx_arr, cell_prim,
215 avg_xmom, avg_ymom, avg_zmom,
216 horiz_upw_frac, vert_upw_frac, vert_adv_type);
219 AdvectionSrcForScalarsVert<UPWIND3SL>(bx, cons_index, flx_arr, cell_prim,
220 avg_xmom, avg_ymom, avg_zmom,
221 horiz_upw_frac, vert_upw_frac, vert_adv_type);
224 AdvectionSrcForScalarsVert<CENTERED4>(bx, cons_index, flx_arr, cell_prim,
225 avg_xmom, avg_ymom, avg_zmom,
226 horiz_upw_frac, vert_upw_frac, vert_adv_type);
229 AdvectionSrcForScalarsVert<UPWIND5>(bx, cons_index, flx_arr, cell_prim,
230 avg_xmom, avg_ymom, avg_zmom,
231 horiz_upw_frac, vert_upw_frac, vert_adv_type);
234 AdvectionSrcForScalarsVert<CENTERED6>(bx, cons_index, flx_arr, cell_prim,
235 avg_xmom, avg_ymom, avg_zmom,
236 horiz_upw_frac, vert_upw_frac, vert_adv_type);
239 AdvectionSrcForScalarsWrapper<WENO3,WENO3>(bx, cons_index, flx_arr, cell_prim,
240 avg_xmom, avg_ymom, avg_zmom,
241 horiz_upw_frac, vert_upw_frac);
244 AdvectionSrcForScalarsWrapper<WENO5,WENO5>(bx, cons_index, flx_arr, cell_prim,
245 avg_xmom, avg_ymom, avg_zmom,
246 horiz_upw_frac, vert_upw_frac);
249 AdvectionSrcForScalarsWrapper<WENO7,WENO7>(bx, cons_index, flx_arr, cell_prim,
250 avg_xmom, avg_ymom, avg_zmom,
251 horiz_upw_frac, vert_upw_frac);
254 AdvectionSrcForScalarsWrapper<WENO_Z3,WENO_Z3>(bx, cons_index, flx_arr, cell_prim,
255 avg_xmom, avg_ymom, avg_zmom,
256 horiz_upw_frac, vert_upw_frac);
259 AdvectionSrcForScalarsWrapper<WENO_MZQ3,WENO_MZQ3>(bx, cons_index, flx_arr, cell_prim,
260 avg_xmom, avg_ymom, avg_zmom,
261 horiz_upw_frac, vert_upw_frac);
264 AdvectionSrcForScalarsWrapper<WENO_Z5,WENO_Z5>(bx, cons_index, flx_arr, cell_prim,
265 avg_xmom, avg_ymom, avg_zmom,
266 horiz_upw_frac, vert_upw_frac);
269 AdvectionSrcForScalarsWrapper<WENO_Z7,WENO_Z7>(bx, cons_index, flx_arr, cell_prim,
270 avg_xmom, avg_ymom, avg_zmom,
271 horiz_upw_frac, vert_upw_frac);
278 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
280 if (detJ(i,j,k) >
zero)
282 Real invdetJ =
one / detJ(i,j,k);
283 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
285 advectionSrc(i,j,k,cons_index) = - invdetJ * mfsq * (
286 ( (flx_arr[0])(i+1,j,k) - (flx_arr[0])(i,j,k) ) *
dxInv +
287 ( (flx_arr[1])(i,j+1,k) - (flx_arr[1])(i,j,k) ) * dyInv +
288 ( (flx_arr[2])(i,j,k+1) - (flx_arr[2])(i,j,k) ) * dzInv );
290 advectionSrc(i,j,k,cons_index) =
zero;
300 avg_xmom, avg_ymom, avg_zmom,
301 detJ, cellSizeInv, do_lo);
305 avg_xmom, avg_ymom, avg_zmom,
311 avg_xmom, avg_ymom, avg_zmom,
312 detJ, cellSizeInv, do_lo);
316 avg_xmom, avg_ymom, avg_zmom,
void AdvectionSrcForScalars(const Box &bx, const int icomp, const int ncomp, const Array4< const Real > &avg_xmom, const Array4< const Real > &avg_ymom, const Array4< const Real > &avg_zmom, const Array4< const Real > &cell_prim, const Array4< Real > &advectionSrc, const Array4< const Real > &detJ, const GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &mf_mx, const Array4< const Real > &mf_my, const AdvType horiz_adv_type, const AdvType vert_adv_type, const Real horiz_upw_frac, const Real vert_upw_frac, const GpuArray< const Array4< Real >, AMREX_SPACEDIM > &flx_arr, const Box &domain, const BCRec *bc_ptr_h)
Definition: ERF_AdvectionSrcForState.cpp:129
void AdvectionSrcForOpenBC_Tangent_Cons(const amrex::Box &bx, const int &dir, const int &icomp, const int &ncomp, const amrex::Array4< amrex::Real > &cell_rhs, 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::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const bool do_lo=false)
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
AMREX_ASSERT_WITH_MESSAGE(wbar_cutoff_min > wbar_cutoff_max, "ERROR: wbar_cutoff_min < wbar_cutoff_max")
@ cons_bc
Definition: ERF_IndexDefines.H:86
@ open
Definition: ERF_IndexDefines.H:256