At such a face one of the two adjacent cells is covered, so the gradient is extrapolated from the two nearest face gradients on the uncovered side, which reaches three cells away. Give phi three filled ghost cells to get that stencil everywhere; with fewer, faces near the edge of a box fall back to a first-order one-sided gradient, and the result then depends on the grid decomposition.
33 BL_PROFILE(
"ERF::FillZeroAreaFaceFluxes()");
35 const GpuArray<Real, AMREX_SPACEDIM>
dxInv = geom.InvCellSizeArray();
37 for (MFIter mfi(phi,
TileNoZ()); mfi.isValid(); ++mfi)
39 const Box& tbx = mfi.tilebox();
40 const Box& xbx = mfi.nodaltilebox(0);
41 const Box& ybx = mfi.nodaltilebox(1);
42 const Box& zbx = mfi.nodaltilebox(2);
45 EBCellFlagFab
const& cflag_fab = (ebfact.getMultiEBCellFlagFab())[mfi];
46 Array4<const EBCellFlag> cflag = cflag_fab.const_array();
48 if (cflag_fab.getType(tbx) == FabType::singlevalued)
50 Array4<const Real> apx = ebfact.getAreaFrac()[0]->const_array(mfi);
51 Array4<const Real> apy = ebfact.getAreaFrac()[1]->const_array(mfi);
52 Array4<const Real> apz = ebfact.getAreaFrac()[2]->const_array(mfi);
54 Array4<const EBCellFlag> u_cflag = ebfact_u.getMultiEBCellFlagFab()[mfi].const_array();
55 Array4<const EBCellFlag> v_cflag = ebfact_v.getMultiEBCellFlagFab()[mfi].const_array();
56 Array4<const EBCellFlag> w_cflag = ebfact_w.getMultiEBCellFlagFab()[mfi].const_array();
58 Array4<Real const>
const& p_arr = phi.const_array(mfi);
59 Array4<Real>
const& fx = fluxes[0].array(mfi);
60 Array4<Real>
const& fy = fluxes[1].array(mfi);
61 Array4<Real>
const& fz = fluxes[2].array(mfi);
68 const Box rbx = phi[mfi].box() & geom.growPeriodicDomain(phi.nGrowVect());
69 const auto rlo = lbound(rbx);
70 const auto rhi = ubound(rbx);
74 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
76 if (apx(i,j,k) ==
zero) {
77 if (!u_cflag(i,j,k).isCovered()) {
78 if (cflag(i,j,k).isCovered() && !cflag(i-1,j,k).isCovered()) {
81 fx(i,j,k) = dxInv[0] * (p_arr(i-3,j,k) - three*p_arr(i-2,j,k) + two*p_arr(i-1,j,k));
82 }
else if (i-2 >= rlo.x) {
83 fx(i,j,k) = dxInv[0] * (p_arr(i-1,j,k) - p_arr(i-2,j,k));
85 }
else if (cflag(i-1,j,k).isCovered() && !cflag(i,j,k).isCovered()) {
88 fx(i,j,k) = dxInv[0] * (three*p_arr(i+1,j,k) - p_arr(i+2,j,k) - two*p_arr(i,j,k));
89 }
else if (i+1 <=
rhi.x) {
90 fx(i,j,k) = dxInv[0] * (p_arr(i+1,j,k) - p_arr(i,j,k));
97 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
99 if (apy(i,j,k) ==
zero) {
100 if (!v_cflag(i,j,k).isCovered()) {
101 if (cflag(i,j,k).isCovered() && !cflag(i,j-1,k).isCovered()) {
104 fy(i,j,k) =
dxInv[1] * (p_arr(i,j-3,k) -
three*p_arr(i,j-2,k) +
two*p_arr(i,j-1,k));
105 }
else if (j-2 >= rlo.y) {
106 fy(i,j,k) =
dxInv[1] * (p_arr(i,j-1,k) - p_arr(i,j-2,k));
108 }
else if (cflag(i,j-1,k).isCovered() && !cflag(i,j,k).isCovered()) {
111 fy(i,j,k) =
dxInv[1] * (
three*p_arr(i,j+1,k) - p_arr(i,j+2,k) -
two*p_arr(i,j,k));
112 }
else if (j+1 <=
rhi.y) {
113 fy(i,j,k) =
dxInv[1] * (p_arr(i,j+1,k) - p_arr(i,j,k));
120 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
122 if (apz(i,j,k) ==
zero) {
123 if (!w_cflag(i,j,k).isCovered()) {
124 if (cflag(i,j,k).isCovered() && !cflag(i,j,k-1).isCovered()) {
127 fz(i,j,k) =
dxInv[2] * (p_arr(i,j,k-3) -
three*p_arr(i,j,k-2) +
two*p_arr(i,j,k-1));
128 }
else if (k-2 >= rlo.z) {
129 fz(i,j,k) =
dxInv[2] * (p_arr(i,j,k-1) - p_arr(i,j,k-2));
131 }
else if (cflag(i,j,k-1).isCovered() && !cflag(i,j,k).isCovered()) {
134 fz(i,j,k) =
dxInv[2] * (
three*p_arr(i,j,k+1) - p_arr(i,j,k+2) -
two*p_arr(i,j,k));
135 }
else if (k+1 <=
rhi.z) {
136 fz(i,j,k) =
dxInv[2] * (p_arr(i,j,k+1) - p_arr(i,j,k));
if(l_use_mynn &&start_comp<=RhoKE_comp &&end_comp >=RhoKE_comp)
Definition: ERF_AddQKESources.H:2
constexpr amrex::Real three
Definition: ERF_Constants.H:11
constexpr amrex::Real two
Definition: ERF_Constants.H:10
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
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_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
@ rhi
Definition: ERF_WSM6.H:250