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

Implements EB redistribution for native and auxiliary EB factories. More...

#include <AMReX_Config.H>
#include <AMReX_Geometry.H>
#include <ERF.H>
#include <ERF_EB.H>
#include <ERF_EBRedistribute.H>
#include "AMReX_EB_Redistribution.H"
Include dependency graph for ERF_EBRedistribute.cpp:

Functions

template<typename EBFactType >
void redistribute_term (int ncomp, const Geometry &geom, MultiFab &result, MultiFab &result_tmp, MultiFab const &state, EBFactType const &ebfact, BCRec const *bc, double local_dt_d, int const igrid)
 Apply EB state redistribution to result_tmp and write the redistributed result. More...
 

Detailed Description

Implements EB redistribution for native and auxiliary EB factories.

Function Documentation

◆ redistribute_term()

template<typename EBFactType >
void redistribute_term ( int  ncomp,
const Geometry &  geom,
MultiFab &  result,
MultiFab &  result_tmp,
MultiFab const &  state,
EBFactType const &  ebfact,
BCRec const *  bc,
double  local_dt_d,
int const  igrid 
)

Apply EB state redistribution to result_tmp and write the redistributed result.

30 {
31  BL_PROFILE_VAR("redistribute_term", redistribute_term);
32  // ************************************************************************
33  // Redistribute result_tmp and pass out result
34  // ************************************************************************
35  AMREX_ASSERT(result.nComp() == state.nComp());
36 
37  Real local_dt = static_cast<Real>(local_dt_d);
38 
39  result_tmp.FillBoundary(geom.periodicity());
40 
41 #ifdef _OPENMP
42 #pragma omp parallel if (Gpu::notInLaunchRegion())
43 #endif
44  for (MFIter mfi(state,TilingIfNotGPU()); mfi.isValid(); ++mfi)
45  {
46  Box const& bx = mfi.tilebox();
47 
48  EBCellFlagFab const& flagfab = ebfact.getMultiEBCellFlagFab()[mfi];
49  Array4<EBCellFlag const> const& flag = flagfab.const_array();
50 
51  // Redistribution operates on a grown box and needs EB geometry data
52  bool is_singlevalued = (flagfab.getType() == FabType::singlevalued);
53  bool is_regular = (flagfab.getType(amrex::grow(bx,4)) == FabType::regular);
54  bool is_covered = (flagfab.getType(bx) == FabType::covered);
55 
56  Array4<Real> out = result.array(mfi);
57  Array4<Real> in = result_tmp.array(mfi);
58 
59  // Only apply redistribution if we have actual cut cells
60  if (is_singlevalued && !is_regular && !is_covered)
61  {
62  auto const& vfrac = ebfact.getVolFrac().const_array(mfi);
63  auto const& ccc = ebfact.getCentroid().const_array(mfi);
64  auto const& apx = ebfact.getAreaFrac()[0]->const_array(mfi);
65  auto const& apy = ebfact.getAreaFrac()[1]->const_array(mfi);
66  auto const& apz = ebfact.getAreaFrac()[2]->const_array(mfi);
67  auto const& fcx = ebfact.getFaceCent()[0]->const_array(mfi);
68  auto const& fcy = ebfact.getFaceCent()[1]->const_array(mfi);
69  auto const& fcz = ebfact.getFaceCent()[2]->const_array(mfi);
70 
71  Box bx_cc = bx;
72  Geometry geom_used = geom;
73 
74  // Handle staggered grids if igrid is specified
75  if (igrid >= 0) {
76  bx_cc = bx_cc.convert(IntVect::TheZeroVector());
77 
78  // Extend box for staggered grids
79  if (igrid == IntVars::xmom) bx_cc = bx_cc.setBig(0, bx_cc.bigEnd(0) + 1);
80  if (igrid == IntVars::ymom) bx_cc = bx_cc.setBig(1, bx_cc.bigEnd(1) + 1);
81  if (igrid == IntVars::zmom) bx_cc = bx_cc.setBig(2, bx_cc.bigEnd(2) + 1);
82 
83  // Extended geometry domain
84  Box domain_grown = geom.Domain();
85  domain_grown.growHi(igrid-1, 1); // Extend geometry domain by 1 in the staggering direction
86  geom_used = Geometry(domain_grown, geom.ProbDomain(), geom.Coord(), geom.isPeriodic());
87  }
88 
89  Box gbx = bx_cc; gbx.grow(3);
90 
91  FArrayBox scratch_fab(gbx,ncomp);
92  Array4<Real> scratch = scratch_fab.array();
93  Elixir eli_scratch = scratch_fab.elixir();
94 
95  std::string redistribution_type = "StateRedist";
96 
97  // State redist acts on the state.
98  Array4<Real const> state_arr = state.const_array(mfi);
99  ApplyRedistribution( bx_cc, ncomp, out, in, state_arr,
100  scratch, flag,
101  apx, apy, apz, vfrac,
102  fcx, fcy, fcz, ccc,
103  bc, geom_used, local_dt, redistribution_type,
104  false, 2, 0.5_rt, {});
105  }
106  else
107  {
108  ParallelFor(bx, ncomp, [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) noexcept
109  {
110  out(i,j,k,n) = in(i,j,k,n);
111  });
112  }
113  } // MFIter
114 }
void redistribute_term(int ncomp, const Geometry &geom, MultiFab &result, MultiFab &result_tmp, MultiFab const &state, EBFactType const &ebfact, BCRec const *bc, double local_dt_d, int const igrid)
Apply EB state redistribution to result_tmp and write the redistributed result.
Definition: ERF_EBRedistribute.cpp:21
struct @28 out
struct @28 in
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
@ ymom
Definition: ERF_IndexDefines.H:196
@ zmom
Definition: ERF_IndexDefines.H:197
@ xmom
Definition: ERF_IndexDefines.H:195
real(c_double), private bc
Definition: ERF_module_mp_morr_two_moment.F90:182
Here is the call graph for this function: