ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_EBAdvectionSrcForState.cpp File Reference

Implements EB advection source terms for density and scalar state. More...

Include dependency graph for ERF_EBAdvectionSrcForState.cpp:

Functions

void EBAdvectionSrcForRho (const Box &bx, const Array4< Real > &advectionSrc, const Array4< const Real > &rho_u, const Array4< const Real > &rho_v, const Array4< const Real > &Omega, const Array4< Real > &avg_xmom, const Array4< Real > &avg_ymom, const Array4< Real > &avg_zmom, 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 Array4< const Real > &mf_uy, const Array4< const Real > &mf_vx, const GpuArray< const Array4< Real >, AMREX_SPACEDIM > &flx_arr, const bool fixed_rho, bool already_on_centroids)
 Compute the EB advective tendency for rho and rho theta. More...
 
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)
 Compute the EB advective tendency for scalars. More...
 

Detailed Description

Implements EB advection source terms for density and scalar state.

Function Documentation

◆ EBAdvectionSrcForRho()

void EBAdvectionSrcForRho ( const Box &  bx,
const Array4< Real > &  advectionSrc,
const Array4< const Real > &  rho_u,
const Array4< const Real > &  rho_v,
const Array4< const Real > &  Omega,
const Array4< Real > &  avg_xmom,
const Array4< Real > &  avg_ymom,
const Array4< Real > &  avg_zmom,
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 Array4< const Real > &  mf_uy,
const Array4< const Real > &  mf_vx,
const GpuArray< const Array4< Real >, AMREX_SPACEDIM > &  flx_arr,
const bool  fixed_rho,
bool  already_on_centroids 
)

Compute the EB advective tendency for rho and rho theta.

This routine forms density fluxes, stores momentum averages for later scalar advection, and evaluates the EB-aware divergence at cell centers.

Parameters
[in]bxBox over which the state is updated.
[out]advectionSrcTendency for the density update equation.
[in]rho_ux-component of momentum.
[in]rho_vy-component of momentum.
[in]OmegaMomentum component normal to the z-coordinate surface.
[out]avg_xmomx-face momentum average defined by this routine.
[out]avg_ymomy-face momentum average defined by this routine.
[out]avg_zmomz-face momentum average defined by this routine.
[in]mask_arrCell-centered mask used for EB face interpolation.
[in]cfg_arrCell-centered EB flags.
[in]ax_arrArea fraction on x-faces.
[in]ay_arrArea fraction on y-faces.
[in]az_arrArea fraction on z-faces.
[in]fcx_arrFace centroid on x-faces.
[in]fcy_arrFace centroid on y-faces.
[in]fcz_arrFace centroid on z-faces.
[in]detJJacobian of the metric transformation.
[in]cellSizeInvInverse grid spacing.
[in]mf_mxx-direction map factor at cell centers.
[in]mf_myy-direction map factor at cell centers.
[in]mf_uyMap factor used for x-momentum fluxes.
[in]mf_vxMap factor used for y-momentum fluxes.
[out]flx_arrDirectional flux arrays.
[in]fixed_rhoWhether density tendency is forced to zero.
[in]already_on_centroidsWhether EB geometric data are already centroid-adjusted.
73 {
74  BL_PROFILE_VAR("EBAdvectionSrcForRho", EBAdvectionSrcForRho);
75  auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
76 
77  const Box xbx = surroundingNodes(bx,0).grow(IntVect(0, 1, 1));
78  const Box ybx = surroundingNodes(bx,1).grow(IntVect(1, 0, 1));
79  const Box zbx = surroundingNodes(bx,2).grow(IntVect(1, 1, 0));
80 
81  ParallelFor(xbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
82  {
83  flx_arr[0](i,j,k,0) = rho_u(i,j,k) / mf_uy(i,j,0);
84  avg_xmom(i,j,k) = flx_arr[0](i,j,k,0);
85  });
86  ParallelFor(ybx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
87  {
88  flx_arr[1](i,j,k,0) = rho_v(i,j,k) / mf_vx(i,j,0);
89  avg_ymom(i,j,k) = flx_arr[1](i,j,k,0);
90  });
91  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
92  {
93  Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
94  flx_arr[2](i,j,k,0) = Omega(i,j,k) / mfsq;
95  avg_zmom(i,j,k) = flx_arr[2](i,j,k,0);
96  });
97 
98  if (fixed_rho) {
99  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
100  {
101  advectionSrc(i,j,k,0) = zero;
102  });
103  } else
104  {
105  if (already_on_centroids) {
106 
107  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
108  {
109  if (detJ(i,j,k) > zero) {
110  Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
111  advectionSrc(i,j,k,0) = - mfsq / detJ(i,j,k) * (
112  ( ax_arr(i+1,j,k) * flx_arr[0](i+1,j,k,0) - ax_arr(i,j,k) * flx_arr[0](i,j,k,0) ) * dxInv +
113  ( ay_arr(i,j+1,k) * flx_arr[1](i,j+1,k,0) - ay_arr(i,j,k) * flx_arr[1](i,j,k,0) ) * dyInv +
114  ( az_arr(i,j,k+1) * flx_arr[2](i,j,k+1,0) - az_arr(i,j,k) * flx_arr[2](i,j,k,0) ) * dzInv );
115  } else {
116  advectionSrc(i,j,k,0) = zero;
117  }
118  });
119 
120  } else {
121 
122  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
123  {
124  if (detJ(i,j,k) > zero) {
125  Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
126  if (cfg_arr(i,j,k).isCovered())
127  {
128  advectionSrc(i,j,k,0) = zero;
129  }
130  else if (cfg_arr(i,j,k).isRegular())
131  {
132  advectionSrc(i,j,k,0) = - mfsq / detJ(i,j,k) * (
133  ( ax_arr(i+1,j,k) * flx_arr[0](i+1,j,k,0) - ax_arr(i,j,k) * flx_arr[0](i,j,k,0) ) * dxInv +
134  ( ay_arr(i,j+1,k) * flx_arr[1](i,j+1,k,0) - ay_arr(i,j,k) * flx_arr[1](i,j,k,0) ) * dyInv +
135  ( az_arr(i,j,k+1) * flx_arr[2](i,j,k+1,0) - az_arr(i,j,k) * flx_arr[2](i,j,k,0) ) * dzInv );
136  }
137  else
138  {
139  // Bilinear interpolation
140  Real fxm = flx_arr[0](i,j,k,0);
141  if (ax_arr(i,j,k) != zero && ax_arr(i,j,k) != one) {
142  int jj = j + static_cast<int>(std::copysign(one, fcx_arr(i,j,k,0)));
143  int kk = k + static_cast<int>(std::copysign(one, fcx_arr(i,j,k,1)));
144  Real fracy = (mask_arr(i-1,jj,k) || mask_arr(i,jj,k)) ? std::abs(fcx_arr(i,j,k,0)) : zero;
145  Real fracz = (mask_arr(i-1,j,kk) || mask_arr(i,j,kk)) ? std::abs(fcx_arr(i,j,k,1)) : zero;
146  fxm = (one-fracy)*(one-fracz)*fxm
147  + fracy *(one-fracz)*flx_arr[0](i,jj,k ,0)
148  + fracz *(one-fracy)*flx_arr[0](i,j ,kk,0)
149  + fracy * fracz *flx_arr[0](i,jj,kk,0);
150  }
151 
152  Real fxp = flx_arr[0](i+1,j,k,0);
153  if (ax_arr(i+1,j,k) != zero && ax_arr(i+1,j,k) != one) {
154  int jj = j + static_cast<int>(std::copysign(one,fcx_arr(i+1,j,k,0)));
155  int kk = k + static_cast<int>(std::copysign(one,fcx_arr(i+1,j,k,1)));
156  Real fracy = (mask_arr(i,jj,k) || mask_arr(i+1,jj,k)) ? std::abs(fcx_arr(i+1,j,k,0)) : zero;
157  Real fracz = (mask_arr(i,j,kk) || mask_arr(i+1,j,kk)) ? std::abs(fcx_arr(i+1,j,k,1)) : zero;
158  fxp = (one-fracy)*(one-fracz)*fxp
159  + fracy *(one-fracz)*flx_arr[0](i+1,jj,k ,0)
160  + fracz *(one-fracy)*flx_arr[0](i+1,j ,kk,0)
161  + fracy * fracz *flx_arr[0](i+1,jj,kk,0);
162  }
163 
164  Real fym = flx_arr[1](i,j,k,0);
165  if (ay_arr(i,j,k) != zero && ay_arr(i,j,k) != one) {
166  int ii = i + static_cast<int>(std::copysign(one,fcy_arr(i,j,k,0)));
167  int kk = k + static_cast<int>(std::copysign(one,fcy_arr(i,j,k,1)));
168  Real fracx = (mask_arr(ii,j-1,k) || mask_arr(ii,j,k)) ? std::abs(fcy_arr(i,j,k,0)) : zero;
169  Real fracz = (mask_arr(i,j-1,kk) || mask_arr(i,j,kk)) ? std::abs(fcy_arr(i,j,k,1)) : zero;
170  fym = (one-fracx)*(one-fracz)*fym
171  + fracx *(one-fracz)*flx_arr[1](ii,j,k ,0)
172  + fracz *(one-fracx)*flx_arr[1](i ,j,kk,0)
173  + fracx * fracz *flx_arr[1](ii,j,kk,0);
174  }
175 
176  Real fyp = flx_arr[1](i,j+1,k,0);
177  if (ay_arr(i,j+1,k) != zero && ay_arr(i,j+1,k) != one) {
178  int ii = i + static_cast<int>(std::copysign(one,fcy_arr(i,j+1,k,0)));
179  int kk = k + static_cast<int>(std::copysign(one,fcy_arr(i,j+1,k,1)));
180  Real fracx = (mask_arr(ii,j,k) || mask_arr(ii,j+1,k)) ? std::abs(fcy_arr(i,j+1,k,0)) : zero;
181  Real fracz = (mask_arr(i,j,kk) || mask_arr(i,j+1,kk)) ? std::abs(fcy_arr(i,j+1,k,1)) : zero;
182  fyp = (one-fracx)*(one-fracz)*fyp
183  + fracx *(one-fracz)*flx_arr[1](ii,j+1,k ,0)
184  + fracz *(one-fracx)*flx_arr[1](i ,j+1,kk,0)
185  + fracx * fracz *flx_arr[1](ii,j+1,kk,0);
186  }
187 
188  Real fzm = flx_arr[2](i,j,k,0);
189  if (az_arr(i,j,k) != zero && az_arr(i,j,k) != one) {
190  int ii = i + static_cast<int>(std::copysign(one,fcz_arr(i,j,k,0)));
191  int jj = j + static_cast<int>(std::copysign(one,fcz_arr(i,j,k,1)));
192  Real fracx = (mask_arr(ii,j,k-1) || mask_arr(ii,j,k)) ? std::abs(fcz_arr(i,j,k,0)) : zero;
193  Real fracy = (mask_arr(i,jj,k-1) || mask_arr(i,jj,k)) ? std::abs(fcz_arr(i,j,k,1)) : zero;
194  fzm = (one-fracx)*(one-fracy)*fzm
195  + fracx *(one-fracy)*flx_arr[2](ii,j ,k,0)
196  + fracy *(one-fracx)*flx_arr[2](i ,jj,k,0)
197  + fracx * fracy *flx_arr[2](ii,jj,k,0);
198  }
199 
200  Real fzp = flx_arr[2](i,j,k+1,0);
201  if (az_arr(i,j,k+1) != zero && az_arr(i,j,k+1) != one) {
202  int ii = i + static_cast<int>(std::copysign(one,fcz_arr(i,j,k+1,0)));
203  int jj = j + static_cast<int>(std::copysign(one,fcz_arr(i,j,k+1,1)));
204  Real fracx = (mask_arr(ii,j,k) || mask_arr(ii,j,k+1)) ? std::abs(fcz_arr(i,j,k+1,0)) : zero;
205  Real fracy = (mask_arr(i,jj,k) || mask_arr(i,jj,k+1)) ? std::abs(fcz_arr(i,j,k+1,1)) : zero;
206  fzp = (one-fracx)*(one-fracy)*fzp
207  + fracx *(one-fracy)*flx_arr[2](ii,j ,k+1,0)
208  + fracy *(one-fracx)*flx_arr[2](i ,jj,k+1,0)
209  + fracx * fracy *flx_arr[2](ii,jj,k+1,0);
210  }
211 
212  advectionSrc(i,j,k,0) = - mfsq / detJ(i,j,k) * (
213  ( ax_arr(i+1,j,k) * fxp - ax_arr(i,j,k) * fxm ) * dxInv +
214  ( ay_arr(i,j+1,k) * fyp - ay_arr(i,j,k) * fym ) * dyInv +
215  ( az_arr(i,j,k+1) * fzp - az_arr(i,j,k) * fzm ) * dzInv );
216  }
217  } else {
218  advectionSrc(i,j,k,0) = zero;
219  }
220  });
221 
222  } // already_on_centroids
223  } // fixed_rho
224 }
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
void EBAdvectionSrcForRho(const Box &bx, const Array4< Real > &advectionSrc, const Array4< const Real > &rho_u, const Array4< const Real > &rho_v, const Array4< const Real > &Omega, const Array4< Real > &avg_xmom, const Array4< Real > &avg_ymom, const Array4< Real > &avg_zmom, 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 Array4< const Real > &mf_uy, const Array4< const Real > &mf_vx, const GpuArray< const Array4< Real >, AMREX_SPACEDIM > &flx_arr, const bool fixed_rho, bool already_on_centroids)
Compute the EB advective tendency for rho and rho theta.
Definition: ERF_EBAdvectionSrcForState.cpp:48
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::Real Real
Definition: ERF_ShocInterface.H:19
Here is the call graph for this function:

◆ EBAdvectionSrcForScalars()

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 
)

Compute the EB advective tendency for scalars.

Parameters
[in]bxBox over which the scalars are updated.
[in]icompComponent of the first scalar to update.
[in]ncompNumber of scalar components to update.
[in]avg_xmomx-face momentum average from EBAdvectionSrcForRho.
[in]avg_ymomy-face momentum average from EBAdvectionSrcForRho.
[in]avg_zmomz-face momentum average from EBAdvectionSrcForRho.
[in]cell_primPrimitive scalar variables.
[out]advectionSrcTendency for the scalar update equation.
[in]mask_arrCell-centered mask used for EB face interpolation.
[in]cfg_arrCell-centered EB flags.
[in]ax_arrArea fraction on x-faces.
[in]ay_arrArea fraction on y-faces.
[in]az_arrArea fraction on z-faces.
[in]fcx_arrFace centroid on x-faces.
[in]fcy_arrFace centroid on y-faces.
[in]fcz_arrFace centroid on z-faces.
[in]detJJacobian of the metric transformation.
[in]cellSizeInvInverse grid spacing.
[in]mf_mxx-direction map factor at cell centers.
[in]mf_myy-direction map factor at cell centers.
[in]horiz_adv_typeHorizontal advection scheme.
[in]vert_adv_typeVertical advection scheme.
[in]horiz_upw_fracHorizontal upwinding fraction for blended schemes.
[in]vert_upw_fracVertical upwinding fraction for blended schemes.
[out]flx_arrDirectional flux arrays.
[in]domainProblem-domain box used to detect open boundaries.
[in]bc_ptr_hBoundary conditions for conserved components.
[in]already_on_centroidsWhether EB geometric data are already centroid-adjusted.
288 {
289  BL_PROFILE_VAR("EBAdvectionSrcForScalars", EBAdvectionSrcForScalars);
290  auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
291 
292  const Box xbx = surroundingNodes(bx,0).grow(IntVect(0, 1, 1));
293  const Box ybx = surroundingNodes(bx,1).grow(IntVect(1, 0, 1));
294  const Box zbx = surroundingNodes(bx,2).grow(IntVect(1, 1, 0));
295 
296  // Open bc will be imposed upon all vars (we only access cons here for simplicity)
297  const bool xlo_open = (bc_ptr_h[BCVars::cons_bc].lo(0) == ERFBCType::open);
298  const bool xhi_open = (bc_ptr_h[BCVars::cons_bc].hi(0) == ERFBCType::open);
299  const bool ylo_open = (bc_ptr_h[BCVars::cons_bc].lo(1) == ERFBCType::open);
300  const bool yhi_open = (bc_ptr_h[BCVars::cons_bc].hi(1) == ERFBCType::open);
301 
302  // Only advection operations in bndry normal direction with OPEN BC
303  Box bx_xlo, bx_xhi, bx_ylo, bx_yhi;
304  if (xlo_open) {
305  if ( bx.smallEnd(0) == domain.smallEnd(0)) { bx_xlo = makeSlab( bx,0,domain.smallEnd(0));}
306  }
307  if (xhi_open) {
308  if ( bx.bigEnd(0) == domain.bigEnd(0)) { bx_xhi = makeSlab( bx,0,domain.bigEnd(0) );}
309  }
310  if (ylo_open) {
311  if ( bx.smallEnd(1) == domain.smallEnd(1)) { bx_ylo = makeSlab( bx,1,domain.smallEnd(1));}
312  }
313  if (yhi_open) {
314  if ( bx.bigEnd(1) == domain.bigEnd(1)) { bx_yhi = makeSlab( bx,1,domain.bigEnd(1) );}
315  }
316 
317  // Inline with 2nd order for efficiency
318  // NOTE: For EB, avg_xmom, avg_ymom, avg_zmom were are weighted by area fractions in AdvectionSrcForRho
319  // The flux is weighted by area fraction after its interpolation.
320  if (horiz_adv_type == AdvType::Centered_2nd && vert_adv_type == AdvType::Centered_2nd)
321  {
322  ParallelFor(xbx, ncomp,[=] AMREX_GPU_DEVICE (int i, int j, int k, int n) noexcept
323  {
324  const int cons_index = icomp + n;
325  const int prim_index = cons_index - 1;
326  const Real prim_on_face = myhalf * (cell_prim(i,j,k,prim_index) + cell_prim(i-1,j,k,prim_index));
327  flx_arr[0](i,j,k,cons_index) = avg_xmom(i,j,k) * prim_on_face;
328  });
329  ParallelFor(ybx, ncomp,[=] AMREX_GPU_DEVICE (int i, int j, int k, int n) noexcept
330  {
331  const int cons_index = icomp + n;
332  const int prim_index = cons_index - 1;
333  const Real prim_on_face = myhalf * (cell_prim(i,j,k,prim_index) + cell_prim(i,j-1,k,prim_index));
334  flx_arr[1](i,j,k,cons_index) = avg_ymom(i,j,k) * prim_on_face;
335  });
336  ParallelFor(zbx, ncomp,[=] AMREX_GPU_DEVICE (int i, int j, int k, int n) noexcept
337  {
338  const int cons_index = icomp + n;
339  const int prim_index = cons_index - 1;
340  const Real prim_on_face = myhalf * (cell_prim(i,j,k,prim_index) + cell_prim(i,j,k-1,prim_index));
341  flx_arr[2](i,j,k,cons_index) = avg_zmom(i,j,k) * prim_on_face;
342  });
343 
344  // Template higher order methods (horizontal first)
345  } else {
346  switch(horiz_adv_type) {
348  EBAdvectionSrcForScalarsVert<CENTERED2>(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);
351  break;
352  case AdvType::Upwind_3rd:
353  EBAdvectionSrcForScalarsVert<UPWIND3>(bx, ncomp, icomp, flx_arr, cell_prim,
354  avg_xmom, avg_ymom, avg_zmom, cfg_arr, ax_arr, ay_arr, az_arr,
355  horiz_upw_frac, vert_upw_frac, vert_adv_type);
356  break;
358  EBAdvectionSrcForScalarsVert<CENTERED4>(bx, ncomp, icomp, flx_arr, cell_prim,
359  avg_xmom, avg_ymom, avg_zmom, cfg_arr, ax_arr, ay_arr, az_arr,
360  horiz_upw_frac, vert_upw_frac, vert_adv_type);
361  break;
362  case AdvType::Upwind_5th:
363  EBAdvectionSrcForScalarsVert<UPWIND5>(bx, ncomp, icomp, flx_arr, cell_prim,
364  avg_xmom, avg_ymom, avg_zmom, cfg_arr, ax_arr, ay_arr, az_arr,
365  horiz_upw_frac, vert_upw_frac, vert_adv_type);
366  break;
368  EBAdvectionSrcForScalarsVert<CENTERED6>(bx, ncomp, icomp, flx_arr, cell_prim,
369  avg_xmom, avg_ymom, avg_zmom, cfg_arr, ax_arr, ay_arr, az_arr,
370  horiz_upw_frac, vert_upw_frac, vert_adv_type);
371  break;
372  default:
373  AMREX_ASSERT_WITH_MESSAGE(false, "Unknown advection scheme! WENO is currently not supported for EB.");
374  }
375  }
376 
377  // Compute divergence
378 
379  if (already_on_centroids) {
380 
381  ParallelFor(bx, ncomp, [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) noexcept
382  {
383  const int cons_index = icomp + n;
384  if (detJ(i,j,k) > zero)
385  {
386  Real invdetJ = one / detJ(i,j,k);
387  Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
388 
389  advectionSrc(i,j,k,cons_index) = - invdetJ * mfsq * (
390  ( 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 +
391  ( 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 +
392  ( 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 );
393  } else {
394  advectionSrc(i,j,k,cons_index) = zero;
395  }
396  });
397 
398  } else {
399 
400  AMREX_HOST_DEVICE_FOR_4D(bx,ncomp,i,j,k,n,
401  {
402  const int cons_index = icomp + n;
403  if (detJ(i,j,k) > zero)
404  {
405  Real invdetJ = one / detJ(i,j,k);
406  Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
407  if (cfg_arr(i,j,k).isCovered())
408  {
409  advectionSrc(i,j,k,cons_index) = zero;
410  }
411  else if (cfg_arr(i,j,k).isRegular())
412  {
413  advectionSrc(i,j,k,cons_index) = - invdetJ * mfsq * (
414  ( 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 +
415  ( 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 +
416  ( 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 );
417  }
418  else
419  {
420  // Bilinear interpolation
421  Real fxm = flx_arr[0](i,j,k,cons_index);
422  if (ax_arr(i,j,k) != zero && ax_arr(i,j,k) != one) {
423  int jj = j + static_cast<int>(std::copysign(one, fcx_arr(i,j,k,0)));
424  int kk = k + static_cast<int>(std::copysign(one, fcx_arr(i,j,k,1)));
425  Real fracy = (mask_arr(i-1,jj,k) || mask_arr(i,jj,k)) ? std::abs(fcx_arr(i,j,k,0)) : zero;
426  Real fracz = (mask_arr(i-1,j,kk) || mask_arr(i,j,kk)) ? std::abs(fcx_arr(i,j,k,1)) : zero;
427  fxm = (one-fracy)*(one-fracz)*fxm
428  + fracy *(one-fracz)*flx_arr[0](i,jj,k ,cons_index)
429  + fracz *(one-fracy)*flx_arr[0](i,j ,kk,cons_index)
430  + fracy * fracz *flx_arr[0](i,jj,kk,cons_index);
431  }
432 
433  Real fxp = flx_arr[0](i+1,j,k,cons_index);
434  if (ax_arr(i+1,j,k) != zero && ax_arr(i+1,j,k) != one) {
435  int jj = j + static_cast<int>(std::copysign(one,fcx_arr(i+1,j,k,0)));
436  int kk = k + static_cast<int>(std::copysign(one,fcx_arr(i+1,j,k,1)));
437  Real fracy = (mask_arr(i,jj,k) || mask_arr(i+1,jj,k)) ? std::abs(fcx_arr(i+1,j,k,0)) : zero;
438  Real fracz = (mask_arr(i,j,kk) || mask_arr(i+1,j,kk)) ? std::abs(fcx_arr(i+1,j,k,1)) : zero;
439  fxp = (one-fracy)*(one-fracz)*fxp
440  + fracy *(one-fracz)*flx_arr[0](i+1,jj,k ,cons_index)
441  + fracz *(one-fracy)*flx_arr[0](i+1,j ,kk,cons_index)
442  + fracy * fracz *flx_arr[0](i+1,jj,kk,cons_index);
443  }
444 
445  Real fym = flx_arr[1](i,j,k,cons_index);
446  if (ay_arr(i,j,k) != zero && ay_arr(i,j,k) != one) {
447  int ii = i + static_cast<int>(std::copysign(one,fcy_arr(i,j,k,0)));
448  int kk = k + static_cast<int>(std::copysign(one,fcy_arr(i,j,k,1)));
449  Real fracx = (mask_arr(ii,j-1,k) || mask_arr(ii,j,k)) ? std::abs(fcy_arr(i,j,k,0)) : zero;
450  Real fracz = (mask_arr(i,j-1,kk) || mask_arr(i,j,kk)) ? std::abs(fcy_arr(i,j,k,1)) : zero;
451  fym = (one-fracx)*(one-fracz)*fym
452  + fracx *(one-fracz)*flx_arr[1](ii,j,k ,cons_index)
453  + fracz *(one-fracx)*flx_arr[1](i ,j,kk,cons_index)
454  + fracx * fracz *flx_arr[1](ii,j,kk,cons_index);
455  }
456 
457  Real fyp = flx_arr[1](i,j+1,k,cons_index);
458  if (ay_arr(i,j+1,k) != zero && ay_arr(i,j+1,k) != one) {
459  int ii = i + static_cast<int>(std::copysign(one,fcy_arr(i,j+1,k,0)));
460  int kk = k + static_cast<int>(std::copysign(one,fcy_arr(i,j+1,k,1)));
461  Real fracx = (mask_arr(ii,j,k) || mask_arr(ii,j+1,k)) ? std::abs(fcy_arr(i,j+1,k,0)) : zero;
462  Real fracz = (mask_arr(i,j,kk) || mask_arr(i,j+1,kk)) ? std::abs(fcy_arr(i,j+1,k,1)) : zero;
463  fyp = (one-fracx)*(one-fracz)*fyp
464  + fracx *(one-fracz)*flx_arr[1](ii,j+1,k ,cons_index)
465  + fracz *(one-fracx)*flx_arr[1](i ,j+1,kk,cons_index)
466  + fracx * fracz *flx_arr[1](ii,j+1,kk,cons_index);
467  }
468 
469  Real fzm = flx_arr[2](i,j,k,cons_index);
470  if (az_arr(i,j,k) != zero && az_arr(i,j,k) != one) {
471  int ii = i + static_cast<int>(std::copysign(one,fcz_arr(i,j,k,0)));
472  int jj = j + static_cast<int>(std::copysign(one,fcz_arr(i,j,k,1)));
473  Real fracx = (mask_arr(ii,j,k-1) || mask_arr(ii,j,k)) ? std::abs(fcz_arr(i,j,k,0)) : zero;
474  Real fracy = (mask_arr(i,jj,k-1) || mask_arr(i,jj,k)) ? std::abs(fcz_arr(i,j,k,1)) : zero;
475  fzm = (one-fracx)*(one-fracy)*fzm
476  + fracx *(one-fracy)*flx_arr[2](ii,j ,k,cons_index)
477  + fracy *(one-fracx)*flx_arr[2](i ,jj,k,cons_index)
478  + fracx * fracy *flx_arr[2](ii,jj,k,cons_index);
479  }
480 
481  Real fzp = flx_arr[2](i,j,k+1,cons_index);
482  if (az_arr(i,j,k+1) != zero && az_arr(i,j,k+1) != one) {
483  int ii = i + static_cast<int>(std::copysign(one,fcz_arr(i,j,k+1,0)));
484  int jj = j + static_cast<int>(std::copysign(one,fcz_arr(i,j,k+1,1)));
485  Real fracx = (mask_arr(ii,j,k) || mask_arr(ii,j,k+1)) ? std::abs(fcz_arr(i,j,k+1,0)) : zero;
486  Real fracy = (mask_arr(i,jj,k) || mask_arr(i,jj,k+1)) ? std::abs(fcz_arr(i,j,k+1,1)) : zero;
487  fzp = (one-fracx)*(one-fracy)*fzp
488  + fracx *(one-fracy)*flx_arr[2](ii,j ,k+1,cons_index)
489  + fracy *(one-fracx)*flx_arr[2](i ,jj,k+1,cons_index)
490  + fracx * fracy *flx_arr[2](ii,jj,k+1,cons_index);
491  }
492 
493  advectionSrc(i,j,k,cons_index) = - invdetJ * mfsq * (
494  ( ax_arr(i+1,j,k) * fxp - ax_arr(i,j,k) * fxm ) * dxInv
495  + ( ay_arr(i,j+1,k) * fyp - ay_arr(i,j,k) * fym ) * dyInv
496  + ( az_arr(i,j,k+1) * fzp - az_arr(i,j,k) * fzm ) * dzInv );
497  }
498 
499  // eb_compute_divergence(i,j,k,n,advectionSrc,AMREX_D_DECL(flx_arr[0],flx_arr[1],flx_arr[2]),
500  // mask_arr, cfg_arr, detJ, AMREX_D_DECL(ax_arr,ay_arr,az_arr),
501  // AMREX_D_DECL(fcx_arr,fcy_arr,fcz_arr), cellSizeInv, already_on_centroids);
502 
503 
504  } else {
505  advectionSrc(i,j,k,cons_index) = zero;
506  }
507  });
508 
509  }
510 
511  // Special advection operator for open BC (bndry tangent operations)
512  if (xlo_open) {
513  bool do_lo = true;
514  AdvectionSrcForOpenBC_Tangent_Cons(bx_xlo, 0, icomp, ncomp, advectionSrc, cell_prim,
515  avg_xmom, avg_ymom, avg_zmom,
516  detJ, cellSizeInv, do_lo);
517  }
518  if (xhi_open) {
519  AdvectionSrcForOpenBC_Tangent_Cons(bx_xhi, 0, icomp, ncomp, advectionSrc, cell_prim,
520  avg_xmom, avg_ymom, avg_zmom,
521  detJ, cellSizeInv);
522  }
523  if (ylo_open) {
524  bool do_lo = true;
525  AdvectionSrcForOpenBC_Tangent_Cons(bx_ylo, 1, icomp, ncomp, advectionSrc, cell_prim,
526  avg_xmom, avg_ymom, avg_zmom,
527  detJ, cellSizeInv, do_lo);
528  }
529  if (yhi_open) {
530  AdvectionSrcForOpenBC_Tangent_Cons(bx_yhi, 1, icomp, ncomp, advectionSrc, cell_prim,
531  avg_xmom, avg_ymom, avg_zmom,
532  detJ, cellSizeInv);
533  }
534 }
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 myhalf
Definition: ERF_Constants.H:13
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)
Compute the EB advective tendency for scalars.
Definition: ERF_EBAdvectionSrcForState.cpp:260
@ Centered_4th
@ Centered_6th
@ Centered_2nd
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
Here is the call graph for this function: