Function for computing the advective tendency for the update equations for all scalars other than rho and (rho theta) 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 2.
147 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
149 const Box
xbx = surroundingNodes(bx,0);
150 const Box
ybx = surroundingNodes(bx,1);
151 const Box
zbx = surroundingNodes(bx,2);
160 Box bx_xlo, bx_xhi, bx_ylo, bx_yhi;
162 if ( bx.smallEnd(0) == domain.smallEnd(0)) { bx_xlo = makeSlab( bx,0,domain.smallEnd(0));}
165 if ( bx.bigEnd(0) == domain.bigEnd(0)) { bx_xhi = makeSlab( bx,0,domain.bigEnd(0) );}
168 if ( bx.smallEnd(1) == domain.smallEnd(1)) { bx_ylo = makeSlab( bx,1,domain.smallEnd(1));}
171 if ( bx.bigEnd(1) == domain.bigEnd(1)) { bx_yhi = makeSlab( bx,1,domain.bigEnd(1) );}
174 for (
int n(0); n<ncomp; ++n) {
175 const int cons_index = icomp + n;
183 ParallelFor(
xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
185 const int prim_index = cons_index - 1;
186 const Real prim_on_face = 0.5 * (cell_prim(i,j,k,prim_index) + cell_prim(i-1,j,k,prim_index));
187 (flx_arr[0])(i,j,k) = avg_xmom(i,j,k) * prim_on_face;
189 ParallelFor(
ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
191 const int prim_index = cons_index - 1;
192 const Real prim_on_face = 0.5 * (cell_prim(i,j,k,prim_index) + cell_prim(i,j-1,k,prim_index));
193 (flx_arr[1])(i,j,k) = avg_ymom(i,j,k) * prim_on_face;
195 ParallelFor(
zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
197 const int prim_index = cons_index - 1;
198 const Real prim_on_face = 0.5 * (cell_prim(i,j,k,prim_index) + cell_prim(i,j,k-1,prim_index));
199 (flx_arr[2])(i,j,k) = avg_zmom(i,j,k) * prim_on_face;
204 switch(horiz_adv_type) {
206 AdvectionSrcForScalarsVert<CENTERED2>(bx, cons_index, flx_arr, cell_prim,
207 avg_xmom, avg_ymom, avg_zmom,
208 horiz_upw_frac, vert_upw_frac, vert_adv_type);
211 AdvectionSrcForScalarsVert<UPWIND3>(bx, cons_index, flx_arr, cell_prim,
212 avg_xmom, avg_ymom, avg_zmom,
213 horiz_upw_frac, vert_upw_frac, vert_adv_type);
216 AdvectionSrcForScalarsVert<CENTERED4>(bx, cons_index, flx_arr, cell_prim,
217 avg_xmom, avg_ymom, avg_zmom,
218 horiz_upw_frac, vert_upw_frac, vert_adv_type);
221 AdvectionSrcForScalarsVert<UPWIND5>(bx, cons_index, flx_arr, cell_prim,
222 avg_xmom, avg_ymom, avg_zmom,
223 horiz_upw_frac, vert_upw_frac, vert_adv_type);
226 AdvectionSrcForScalarsVert<CENTERED6>(bx, cons_index, flx_arr, cell_prim,
227 avg_xmom, avg_ymom, avg_zmom,
228 horiz_upw_frac, vert_upw_frac, vert_adv_type);
231 AdvectionSrcForScalarsWrapper<WENO3,WENO3>(bx, cons_index, flx_arr, cell_prim,
232 avg_xmom, avg_ymom, avg_zmom,
233 horiz_upw_frac, vert_upw_frac);
236 AdvectionSrcForScalarsWrapper<WENO5,WENO5>(bx, cons_index, flx_arr, cell_prim,
237 avg_xmom, avg_ymom, avg_zmom,
238 horiz_upw_frac, vert_upw_frac);
241 AdvectionSrcForScalarsWrapper<WENO7,WENO7>(bx, cons_index, flx_arr, cell_prim,
242 avg_xmom, avg_ymom, avg_zmom,
243 horiz_upw_frac, vert_upw_frac);
246 AdvectionSrcForScalarsWrapper<WENO_Z3,WENO_Z3>(bx, cons_index, flx_arr, cell_prim,
247 avg_xmom, avg_ymom, avg_zmom,
248 horiz_upw_frac, vert_upw_frac);
251 AdvectionSrcForScalarsWrapper<WENO_MZQ3,WENO_MZQ3>(bx, cons_index, flx_arr, cell_prim,
252 avg_xmom, avg_ymom, avg_zmom,
253 horiz_upw_frac, vert_upw_frac);
256 AdvectionSrcForScalarsWrapper<WENO_Z5,WENO_Z5>(bx, cons_index, flx_arr, cell_prim,
257 avg_xmom, avg_ymom, avg_zmom,
258 horiz_upw_frac, vert_upw_frac);
261 AdvectionSrcForScalarsWrapper<WENO_Z7,WENO_Z7>(bx, cons_index, flx_arr, cell_prim,
262 avg_xmom, avg_ymom, avg_zmom,
263 horiz_upw_frac, vert_upw_frac);
266 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme!");
283 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
285 (flx_tmp_arr[0])(i,j,k) = (flx_arr[0])(i,j,k);
286 (flx_tmp_arr[1])(i,j,k) = (flx_arr[1])(i,j,k);
287 (flx_tmp_arr[2])(i,j,k) = (flx_arr[2])(i,j,k);
291 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
293 const int prim_index = cons_index - 1;
295 Real max_val = max_s_ptr[cons_index];
296 Real min_val = min_s_ptr[cons_index];
298 Real invdetJ = (detJ(i,j,k) > 0.) ? 1. / detJ(i,j,k) : 1.;
299 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
301 Real RHS = - invdetJ * mfsq * (
302 ( (flx_arr[0])(i+1,j ,k ) - (flx_arr[0])(i,j,k) ) * dxInv +
303 ( (flx_arr[1])(i ,j+1,k ) - (flx_arr[1])(i,j,k) ) * dyInv +
304 ( (flx_arr[2])(i ,j ,k+1) - (flx_arr[2])(i,j,k) ) * dzInv );
311 Real tmp_upd = cur_cons(i,j,k,cons_index) + RHS*dt;
312 if (tmp_upd<min_val || tmp_upd>max_val) {
314 if (avg_xmom(i+1,j,k)>0.0) {
315 (flx_tmp_arr[0])(i+1,j,k) = avg_xmom(i+1,j,k) * cell_prim(i ,j,k,prim_index);
317 (flx_tmp_arr[0])(i+1,j,k) = avg_xmom(i+1,j,k) * cell_prim(i+1,j,k,prim_index);
319 if (avg_ymom(i,j+1,k)>0.0) {
320 (flx_tmp_arr[1])(i,j+1,k) = avg_ymom(i,j+1,k) * cell_prim(i,j ,k,prim_index);
322 (flx_tmp_arr[1])(i,j+1,k) = avg_ymom(i,j+1,k) * cell_prim(i,j+1,k,prim_index);
324 if (avg_zmom(i,j,k+1)>0.0) {
325 (flx_tmp_arr[2])(i,j,k+1) = avg_zmom(i,j,k+1) * cell_prim(i,j,k ,prim_index);
327 (flx_tmp_arr[2])(i,j,k+1) = avg_zmom(i,j,k+1) * cell_prim(i,j,k+1,prim_index);
331 if (avg_xmom(i,j,k)>0.0) {
332 (flx_tmp_arr[0])(i,j,k) = avg_xmom(i,j,k) * cell_prim(i-1,j,k,prim_index);
334 (flx_tmp_arr[0])(i,j,k) = avg_xmom(i,j,k) * cell_prim(i ,j,k,prim_index);
336 if (avg_ymom(i,j,k)>0.0) {
337 (flx_tmp_arr[1])(i,j,k) = avg_ymom(i,j,k) * cell_prim(i,j-1,k,prim_index);
339 (flx_tmp_arr[1])(i,j,k) = avg_ymom(i,j,k) * cell_prim(i,j ,k,prim_index);
341 if (avg_zmom(i,j,k)>0.0) {
342 (flx_tmp_arr[2])(i,j,k) = avg_zmom(i,j,k) * cell_prim(i,j,k-1,prim_index);
344 (flx_tmp_arr[2])(i,j,k) = avg_zmom(i,j,k) * cell_prim(i,j,k ,prim_index);
350 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
352 (flx_arr[0])(i,j,k) = (flx_tmp_arr[0])(i,j,k);
353 (flx_arr[1])(i,j,k) = (flx_tmp_arr[1])(i,j,k);
354 (flx_arr[2])(i,j,k) = (flx_tmp_arr[2])(i,j,k);
358 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
360 if (detJ(i,j,k) > 0.)
362 Real invdetJ = 1.0 / detJ(i,j,k);
363 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
365 advectionSrc(i,j,k,cons_index) = - invdetJ * mfsq * (
366 ( (flx_arr[0])(i+1,j,k) - (flx_arr[0])(i,j,k) ) * dxInv +
367 ( (flx_arr[1])(i,j+1,k) - (flx_arr[1])(i,j,k) ) * dyInv +
368 ( (flx_arr[2])(i,j,k+1) - (flx_arr[2])(i,j,k) ) * dzInv );
370 advectionSrc(i,j,k) = 0.;
378 avg_xmom, avg_ymom, avg_zmom,
379 detJ, cellSizeInv, do_lo);
383 avg_xmom, avg_ymom, avg_zmom,
389 avg_xmom, avg_ymom, avg_zmom,
390 detJ, cellSizeInv, do_lo);
394 avg_xmom, avg_ymom, avg_zmom,
void AdvectionSrcForScalars(const Real &dt, 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 > &cur_cons, const Array4< const Real > &cell_prim, const Array4< Real > &advectionSrc, const bool &use_mono_adv, Real *max_s_ptr, Real *min_s_ptr, 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 GpuArray< Array4< Real >, AMREX_SPACEDIM > &flx_tmp_arr, const Box &domain, const BCRec *bc_ptr_h)
Definition: ERF_AdvectionSrcForState.cpp:120
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)
@ cons_bc
Definition: ERF_IndexDefines.H:76
@ open
Definition: ERF_IndexDefines.H:215