Function for computing the advective tendency for scalars when terrain_type is EB.
270 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
272 const Box xbx = surroundingNodes(bx,0);
273 const Box ybx = surroundingNodes(bx,1);
274 const Box zbx = surroundingNodes(bx,2);
283 Box bx_xlo, bx_xhi, bx_ylo, bx_yhi;
285 if ( bx.smallEnd(0) == domain.smallEnd(0)) { bx_xlo = makeSlab( bx,0,domain.smallEnd(0));}
288 if ( bx.bigEnd(0) == domain.bigEnd(0)) { bx_xhi = makeSlab( bx,0,domain.bigEnd(0) );}
291 if ( bx.smallEnd(1) == domain.smallEnd(1)) { bx_ylo = makeSlab( bx,1,domain.smallEnd(1));}
294 if ( bx.bigEnd(1) == domain.bigEnd(1)) { bx_yhi = makeSlab( bx,1,domain.bigEnd(1) );}
302 ParallelFor(xbx, ncomp,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
304 const int cons_index = icomp + n;
305 const int prim_index = cons_index - 1;
306 const Real prim_on_face = 0.5 * (cell_prim(i,j,k,prim_index) + cell_prim(i-1,j,k,prim_index));
307 flx_arr[0](i,j,k,cons_index) = avg_xmom(i,j,k) * prim_on_face;
309 ParallelFor(ybx, ncomp,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
311 const int cons_index = icomp + n;
312 const int prim_index = cons_index - 1;
313 const Real prim_on_face = 0.5 * (cell_prim(i,j,k,prim_index) + cell_prim(i,j-1,k,prim_index));
314 flx_arr[1](i,j,k,cons_index) = avg_ymom(i,j,k) * prim_on_face;
316 ParallelFor(zbx, ncomp,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
318 const int cons_index = icomp + n;
319 const int prim_index = cons_index - 1;
320 const Real prim_on_face = 0.5 * (cell_prim(i,j,k,prim_index) + cell_prim(i,j,k-1,prim_index));
321 flx_arr[2](i,j,k,cons_index) = avg_zmom(i,j,k) * prim_on_face;
326 switch(horiz_adv_type) {
328 EBAdvectionSrcForScalarsVert<CENTERED2>(bx, ncomp, icomp, flx_arr, cell_prim,
329 avg_xmom, avg_ymom, avg_zmom, cfg_arr, ax_arr, ay_arr, az_arr,
330 horiz_upw_frac, vert_upw_frac, vert_adv_type);
333 EBAdvectionSrcForScalarsVert<UPWIND3>(bx, ncomp, icomp, flx_arr, cell_prim,
334 avg_xmom, avg_ymom, avg_zmom, cfg_arr, ax_arr, ay_arr, az_arr,
335 horiz_upw_frac, vert_upw_frac, vert_adv_type);
338 EBAdvectionSrcForScalarsVert<CENTERED4>(bx, ncomp, icomp, flx_arr, cell_prim,
339 avg_xmom, avg_ymom, avg_zmom, cfg_arr, ax_arr, ay_arr, az_arr,
340 horiz_upw_frac, vert_upw_frac, vert_adv_type);
343 EBAdvectionSrcForScalarsVert<UPWIND5>(bx, ncomp, icomp, flx_arr, cell_prim,
344 avg_xmom, avg_ymom, avg_zmom, cfg_arr, ax_arr, ay_arr, az_arr,
345 horiz_upw_frac, vert_upw_frac, vert_adv_type);
348 EBAdvectionSrcForScalarsVert<CENTERED6>(bx, ncomp, icomp, flx_arr, cell_prim,
349 avg_xmom, avg_ymom, avg_zmom, cfg_arr, ax_arr, ay_arr, az_arr,
350 horiz_upw_frac, vert_upw_frac, vert_adv_type);
353 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme! WENO is currently not supported for EB.");
359 if (already_on_centroids) {
361 ParallelFor(bx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
363 const int cons_index = icomp + n;
364 if (detJ(i,j,k) > 0.)
366 Real invdetJ = 1.0 / detJ(i,j,k);
367 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
369 advectionSrc(i,j,k,cons_index) = - invdetJ * mfsq * (
370 ( ax_arr(i+1,j,k) * flx_arr[0](i+1,j,k,cons_index) - ax_arr(i,j,k) * flx_arr[0](i ,j,k,cons_index) ) * dxInv +
371 ( ay_arr(i,j+1,k) * flx_arr[1](i,j+1,k,cons_index) - ay_arr(i,j,k) * flx_arr[1](i,j ,k,cons_index) ) * dyInv +
372 ( az_arr(i,j,k+1) * flx_arr[2](i,j,k+1,cons_index) - az_arr(i,j,k) * flx_arr[2](i,j,k ,cons_index) ) * dzInv );
374 advectionSrc(i,j,k,cons_index) = 0.;
380 AMREX_HOST_DEVICE_FOR_4D(bx,ncomp,i,j,k,n,
382 const int cons_index = icomp + n;
383 if (detJ(i,j,k) > 0.)
385 Real invdetJ = 1.0 / detJ(i,j,k);
386 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
387 if (cfg_arr(i,j,k).isCovered())
389 advectionSrc(i,j,k,cons_index) = Real(0.0);
391 else if (cfg_arr(i,j,k).isRegular())
393 advectionSrc(i,j,k,cons_index) = - invdetJ * mfsq * (
394 ( ax_arr(i+1,j,k) * flx_arr[0](i+1,j,k,cons_index) - ax_arr(i,j,k) * flx_arr[0](i ,j,k,cons_index) ) * dxInv +
395 ( ay_arr(i,j+1,k) * flx_arr[1](i,j+1,k,cons_index) - ay_arr(i,j,k) * flx_arr[1](i,j ,k,cons_index) ) * dyInv +
396 ( az_arr(i,j,k+1) * flx_arr[2](i,j,k+1,cons_index) - az_arr(i,j,k) * flx_arr[2](i,j,k ,cons_index) ) * dzInv );
401 Real fxm = flx_arr[0](i,j,k,cons_index);
402 if (ax_arr(i,j,k) != Real(0.0) && ax_arr(i,j,k) != Real(1.0)) {
403 int jj = j +
static_cast<int>(std::copysign(Real(1.0), fcx_arr(i,j,k,0)));
404 int kk = k +
static_cast<int>(std::copysign(Real(1.0), fcx_arr(i,j,k,1)));
405 Real fracy = (mask_arr(i-1,jj,k) || mask_arr(i,jj,k)) ? std::abs(fcx_arr(i,j,k,0)) : Real(0.0);
406 Real fracz = (mask_arr(i-1,j,kk) || mask_arr(i,j,kk)) ? std::abs(fcx_arr(i,j,k,1)) : Real(0.0);
407 fxm = (Real(1.0)-fracy)*(Real(1.0)-fracz)*fxm
408 + fracy *(Real(1.0)-fracz)*flx_arr[0](i,jj,k ,cons_index)
409 + fracz *(Real(1.0)-fracy)*flx_arr[0](i,j ,kk,cons_index)
410 + fracy * fracz *flx_arr[0](i,jj,kk,cons_index);
413 Real fxp = flx_arr[0](i+1,j,k,cons_index);
414 if (ax_arr(i+1,j,k) != Real(0.0) && ax_arr(i+1,j,k) != Real(1.0)) {
415 int jj = j +
static_cast<int>(std::copysign(Real(1.0),fcx_arr(i+1,j,k,0)));
416 int kk = k +
static_cast<int>(std::copysign(Real(1.0),fcx_arr(i+1,j,k,1)));
417 Real fracy = (mask_arr(i,jj,k) || mask_arr(i+1,jj,k)) ? std::abs(fcx_arr(i+1,j,k,0)) : Real(0.0);
418 Real fracz = (mask_arr(i,j,kk) || mask_arr(i+1,j,kk)) ? std::abs(fcx_arr(i+1,j,k,1)) : Real(0.0);
419 fxp = (Real(1.0)-fracy)*(Real(1.0)-fracz)*fxp
420 + fracy *(Real(1.0)-fracz)*flx_arr[0](i+1,jj,k ,cons_index)
421 + fracz *(Real(1.0)-fracy)*flx_arr[0](i+1,j ,kk,cons_index)
422 + fracy * fracz *flx_arr[0](i+1,jj,kk,cons_index);
425 Real fym = flx_arr[1](i,j,k,cons_index);
426 if (ay_arr(i,j,k) != Real(0.0) && ay_arr(i,j,k) != Real(1.0)) {
427 int ii = i +
static_cast<int>(std::copysign(Real(1.0),fcy_arr(i,j,k,0)));
428 int kk = k +
static_cast<int>(std::copysign(Real(1.0),fcy_arr(i,j,k,1)));
429 Real fracx = (mask_arr(ii,j-1,k) || mask_arr(ii,j,k)) ? std::abs(fcy_arr(i,j,k,0)) : Real(0.0);
430 Real fracz = (mask_arr(i,j-1,kk) || mask_arr(i,j,kk)) ? std::abs(fcy_arr(i,j,k,1)) : Real(0.0);
431 fym = (Real(1.0)-fracx)*(Real(1.0)-fracz)*fym
432 + fracx *(Real(1.0)-fracz)*flx_arr[1](ii,j,k ,cons_index)
433 + fracz *(Real(1.0)-fracx)*flx_arr[1](i ,j,kk,cons_index)
434 + fracx * fracz *flx_arr[1](ii,j,kk,cons_index);
437 Real fyp = flx_arr[1](i,j+1,k,cons_index);
438 if (ay_arr(i,j+1,k) != Real(0.0) && ay_arr(i,j+1,k) != Real(1.0)) {
439 int ii = i +
static_cast<int>(std::copysign(Real(1.0),fcy_arr(i,j+1,k,0)));
440 int kk = k +
static_cast<int>(std::copysign(Real(1.0),fcy_arr(i,j+1,k,1)));
441 Real fracx = (mask_arr(ii,j,k) || mask_arr(ii,j+1,k)) ? std::abs(fcy_arr(i,j+1,k,0)) : Real(0.0);
442 Real fracz = (mask_arr(i,j,kk) || mask_arr(i,j+1,kk)) ? std::abs(fcy_arr(i,j+1,k,1)) : Real(0.0);
443 fyp = (Real(1.0)-fracx)*(Real(1.0)-fracz)*fyp
444 + fracx *(Real(1.0)-fracz)*flx_arr[1](ii,j+1,k ,cons_index)
445 + fracz *(Real(1.0)-fracx)*flx_arr[1](i ,j+1,kk,cons_index)
446 + fracx * fracz *flx_arr[1](ii,j+1,kk,cons_index);
449 Real fzm = flx_arr[2](i,j,k,cons_index);
450 if (az_arr(i,j,k) != Real(0.0) && az_arr(i,j,k) != Real(1.0)) {
451 int ii = i +
static_cast<int>(std::copysign(Real(1.0),fcz_arr(i,j,k,0)));
452 int jj = j +
static_cast<int>(std::copysign(Real(1.0),fcz_arr(i,j,k,1)));
453 Real fracx = (mask_arr(ii,j,k-1) || mask_arr(ii,j,k)) ? std::abs(fcz_arr(i,j,k,0)) : Real(0.0);
454 Real fracy = (mask_arr(i,jj,k-1) || mask_arr(i,jj,k)) ? std::abs(fcz_arr(i,j,k,1)) : Real(0.0);
455 fzm = (Real(1.0)-fracx)*(Real(1.0)-fracy)*fzm
456 + fracx *(Real(1.0)-fracy)*flx_arr[2](ii,j ,k,cons_index)
457 + fracy *(Real(1.0)-fracx)*flx_arr[2](i ,jj,k,cons_index)
458 + fracx * fracy *flx_arr[2](ii,jj,k,cons_index);
461 Real fzp = flx_arr[2](i,j,k+1,cons_index);
462 if (az_arr(i,j,k+1) != Real(0.0) && az_arr(i,j,k+1) != Real(1.0)) {
463 int ii = i +
static_cast<int>(std::copysign(Real(1.0),fcz_arr(i,j,k+1,0)));
464 int jj = j +
static_cast<int>(std::copysign(Real(1.0),fcz_arr(i,j,k+1,1)));
465 Real fracx = (mask_arr(ii,j,k) || mask_arr(ii,j,k+1)) ? std::abs(fcz_arr(i,j,k+1,0)) : Real(0.0);
466 Real fracy = (mask_arr(i,jj,k) || mask_arr(i,jj,k+1)) ? std::abs(fcz_arr(i,j,k+1,1)) : Real(0.0);
467 fzp = (Real(1.0)-fracx)*(Real(1.0)-fracy)*fzp
468 + fracx *(Real(1.0)-fracy)*flx_arr[2](ii,j ,k+1,cons_index)
469 + fracy *(Real(1.0)-fracx)*flx_arr[2](i ,jj,k+1,cons_index)
470 + fracx * fracy *flx_arr[2](ii,jj,k+1,cons_index);
473 advectionSrc(i,j,k,cons_index) = - invdetJ * mfsq * (
474 ( ax_arr(i+1,j,k) * fxp - ax_arr(i,j,k) * fxm ) * dxInv
475 + ( ay_arr(i,j+1,k) * fyp - ay_arr(i,j,k) * fym ) * dyInv
476 + ( az_arr(i,j,k+1) * fzp - az_arr(i,j,k) * fzm ) * dzInv );
485 advectionSrc(i,j,k,cons_index) = 0.;
495 avg_xmom, avg_ymom, avg_zmom,
496 detJ, cellSizeInv, do_lo);
500 avg_xmom, avg_ymom, avg_zmom,
506 avg_xmom, avg_ymom, avg_zmom,
507 detJ, cellSizeInv, do_lo);
511 avg_xmom, avg_ymom, avg_zmom,
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)
void EBAdvectionSrcForScalars(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 int > &mask_arr, const Array4< const EBCellFlag > &cfg_arr, const Array4< const Real > &ax_arr, const Array4< const Real > &ay_arr, const Array4< const Real > &az_arr, const Array4< const Real > &fcx_arr, const Array4< const Real > &fcy_arr, const Array4< const Real > &fcz_arr, 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, bool already_on_centroids)
Definition: ERF_EBAdvectionSrcForState.cpp:240
@ cons_bc
Definition: ERF_IndexDefines.H:76
@ open
Definition: ERF_IndexDefines.H:215