ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_FillZeroAreaFaceFluxes.cpp File Reference
#include "ERF.H"
#include "ERF_Utils.H"
Include dependency graph for ERF_FillZeroAreaFaceFluxes.cpp:

Functions

template<typename T >
void FillZeroAreaFaceFluxes (MultiFab &phi, Array< MultiFab, AMREX_SPACEDIM > &fluxes, const Geometry &geom, EBFArrayBoxFactory const &ebfact, T const &ebfact_u, T const &ebfact_v, T const &ebfact_w)
 
template void FillZeroAreaFaceFluxes (amrex::MultiFab &, amrex::Array< amrex::MultiFab, AMREX_SPACEDIM > &, const amrex::Geometry &, amrex::EBFArrayBoxFactory const &, amrex::EBFArrayBoxFactory const &, amrex::EBFArrayBoxFactory const &, amrex::EBFArrayBoxFactory const &)
 
template void FillZeroAreaFaceFluxes (amrex::MultiFab &, amrex::Array< amrex::MultiFab, AMREX_SPACEDIM > &, const amrex::Geometry &, amrex::EBFArrayBoxFactory const &, eb_aux_ const &, eb_aux_ const &, eb_aux_ const &)
 

Function Documentation

◆ FillZeroAreaFaceFluxes() [1/3]

template void FillZeroAreaFaceFluxes ( amrex::MultiFab &  ,
amrex::Array< amrex::MultiFab, AMREX_SPACEDIM > &  ,
const amrex::Geometry &  ,
amrex::EBFArrayBoxFactory const &  ,
amrex::EBFArrayBoxFactory const &  ,
amrex::EBFArrayBoxFactory const &  ,
amrex::EBFArrayBoxFactory const &   
)

◆ FillZeroAreaFaceFluxes() [2/3]

template void FillZeroAreaFaceFluxes ( amrex::MultiFab &  ,
amrex::Array< amrex::MultiFab, AMREX_SPACEDIM > &  ,
const amrex::Geometry &  ,
amrex::EBFArrayBoxFactory const &  ,
eb_aux_ const &  ,
eb_aux_ const &  ,
eb_aux_ const &   
)

◆ FillZeroAreaFaceFluxes() [3/3]

template<typename T >
void FillZeroAreaFaceFluxes ( MultiFab &  phi,
Array< MultiFab, AMREX_SPACEDIM > &  fluxes,
const Geometry &  geom,
EBFArrayBoxFactory const &  ebfact,
T const &  ebfact_u,
T const &  ebfact_v,
T const &  ebfact_w 
)

Compute phi gradients where the area of the face is zero

Template Parameters
TEB factory or auxiliary EB data type for face-centered grids
Parameters
phiCell-centered solution used to compute gradients
fluxesFace-centered gradient fluxes to fill
geomGeometry used for inverse cell spacing
ebfactCell-centered embedded-boundary factory
ebfact_uEmbedded-boundary data on x-faces
ebfact_vEmbedded-boundary data on y-faces
ebfact_wEmbedded-boundary data on z-faces
26 {
27  BL_PROFILE("ERF::FillZeroAreaFaceFluxes()");
28 
29  const GpuArray<Real, AMREX_SPACEDIM> dxInv = geom.InvCellSizeArray();
30 
31  for (MFIter mfi(phi,TileNoZ()); mfi.isValid(); ++mfi)
32  {
33  const Box& tbx = mfi.tilebox();
34  const Box& xbx = mfi.nodaltilebox(0);
35  const Box& ybx = mfi.nodaltilebox(1);
36  const Box& zbx = mfi.nodaltilebox(2);
37 
38  // EBCellFlagFab const& cflag_fab = (ebfact.get_const_factory())->getMultiEBCellFlagFab()[mfi];
39  EBCellFlagFab const& cflag_fab = (ebfact.getMultiEBCellFlagFab())[mfi];
40  Array4<const EBCellFlag> cflag = cflag_fab.const_array();
41 
42  if (cflag_fab.getType(tbx) == FabType::singlevalued)
43  {
44  Array4<const Real> apx = ebfact.getAreaFrac()[0]->const_array(mfi);
45  Array4<const Real> apy = ebfact.getAreaFrac()[1]->const_array(mfi);
46  Array4<const Real> apz = ebfact.getAreaFrac()[2]->const_array(mfi);
47 
48  Array4<const EBCellFlag> u_cflag = ebfact_u.getMultiEBCellFlagFab()[mfi].const_array();
49  Array4<const EBCellFlag> v_cflag = ebfact_v.getMultiEBCellFlagFab()[mfi].const_array();
50  Array4<const EBCellFlag> w_cflag = ebfact_w.getMultiEBCellFlagFab()[mfi].const_array();
51 
52  Array4<Real const> const& p_arr = phi.const_array(mfi);
53  Array4<Real> const& fx = fluxes[0].array(mfi);
54  Array4<Real> const& fy = fluxes[1].array(mfi);
55  Array4<Real> const& fz = fluxes[2].array(mfi);
56 
57  ParallelFor(xbx, ybx, zbx,
58  // x-face
59  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
60  {
61  if (apx(i,j,k) == zero) {
62  if (!u_cflag(i,j,k).isCovered()) {
63  if (cflag(i,j,k).isCovered() && !cflag(i-1,j,k).isCovered()) {
64  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));
65  } else if (cflag(i-1,j,k).isCovered() && !cflag(i,j,k).isCovered()) {
66  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));
67  }
68  }
69  }
70  },
71  // y-face
72  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
73  {
74  if (apy(i,j,k) == zero) {
75  if (!v_cflag(i,j,k).isCovered()) {
76  if (cflag(i,j,k).isCovered() && !cflag(i,j-1,k).isCovered()) {
77  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));
78  } else if (cflag(i,j-1,k).isCovered() && !cflag(i,j,k).isCovered()) {
79  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));
80  }
81  }
82  }
83  },
84  // z-face
85  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
86  {
87  if (apz(i,j,k) == zero) {
88  if (!w_cflag(i,j,k).isCovered()) {
89  if (cflag(i,j,k).isCovered() && !cflag(i,j,k-1).isCovered()) {
90  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));
91  } else if (cflag(i,j,k-1).isCovered() && !cflag(i,j,k).isCovered()) {
92  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));
93  }
94  }
95  }
96  });
97  } // single-valued
98  } // mfi
99 }
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

Referenced by solve_with_EB_mlmg().

Here is the call graph for this function:
Here is the caller graph for this function: