Block-Structured AMR Software Framework
AMReX_MLLinOp_temp.H
Go to the documentation of this file.
1 #ifndef AMREX_MLLINOP_TEMP_H_
2 #define AMREX_MLLINOP_TEMP_H_
3 
5 
6 #include <AMReX_MLLinOp.H>
7 
8 namespace amrex_temp
9 {
10 
12  : public amrex::MLLinOp
13 {
14 public:
15 
18 
20 
21  virtual ~MLLinOpTemp () {}
22 
23  MLLinOpTemp (const MLLinOpTemp&) = delete;
24  MLLinOpTemp (MLLinOpTemp&&) = delete;
25  MLLinOpTemp& operator= (const MLLinOpTemp&) = delete;
27 
29  const amrex::Vector<amrex::BoxArray>& a_grids,
31  const amrex::LPInfo& a_info = amrex::LPInfo(),
32  const amrex::Vector<amrex::FabFactory<amrex::FArrayBox> const*>& a_factory = {})
33  {
34  define(a_geom, a_grids, a_dmap, a_info, a_factory);
35  }
36 
38  const amrex::Vector<amrex::BoxArray>& a_grids,
40  const amrex::LPInfo& a_info = amrex::LPInfo(),
41  const amrex::Vector<amrex::FabFactory<amrex::FArrayBox> const*>& a_factory = {})
42  {
43  amrex::MLLinOp::define(a_geom, a_grids, a_dmap, a_info, a_factory);
44  }
45 
53  virtual amrex::BottomSolver getDefaultBottomSolver () const override {
55  }
56 
64  virtual amrex::Any AnyMake (int amrlev, int mglev, amrex::IntVect const& ng) const override
65  {
66  auto const& ba = m_grids[amrlev][mglev];
67  auto const& dm = m_dmap [amrlev][mglev];
68  auto const& fc = *m_factory[amrlev][mglev];
70  dm, 1, ng, amrex::MFInfo(), fc),
72  dm, 1, ng, amrex::MFInfo(), fc),
74  dm, 1, ng, amrex::MFInfo(), fc)});
75  }
76 
85  virtual amrex::Any AnyMakeCoarseMG (int amrlev, int mglev, amrex::IntVect const& ng) const override
86  {
87  auto ratio = (amrlev > 0) ? amrex::IntVect(2) : this->mg_coarsen_ratio_vec[mglev];
88  auto const& ba = amrex::coarsen(m_grids[amrlev][mglev], ratio);
89  auto const& dm = m_dmap[amrlev][mglev];
91  dm, 1, ng),
93  dm, 1, ng),
95  dm, 1, ng)});
96  }
97 
105  virtual amrex::Any AnyMakeCoarseAmr (int famrlev, amrex::IntVect const& ng) const override
106  {
107  amrex::IntVect ratio(this->AMRRefRatio(famrlev-1));
108  auto const& ba = amrex::coarsen(m_grids[famrlev][0], ratio);
109  auto const& dm = m_dmap[famrlev][0];
111  dm, 1, ng),
113  dm, 1, ng),
115  dm, 1, ng)});
116  }
117 
123  virtual amrex::Any AnyMakeAlias (amrex::Any const& a) const override
124  {
125  auto const& rhs = a.get<Container>();
127  amrex::MultiFab(rhs[1], amrex::make_alias, 0, 1),
128  amrex::MultiFab(rhs[2], amrex::make_alias, 0, 1)});
129  }
130 
136  virtual amrex::IntVect AnyGrowVect (amrex::Any const& a) const override
137  {
138  auto const& mfs = a.get<Container>();
139  return mfs[0].nGrowVect();
140  }
141 
149  virtual void AnyCopy (amrex::Any& dst, amrex::Any const& src, amrex::IntVect const& ng) const override
150  {
151  auto& dmf = dst.get<Container>();
152  auto const& smf = src.get<Container>();
153  for (int idim=0; idim < 3; ++idim) {
154  amrex::MultiFab::Copy(dmf[idim], smf[idim], 0, 0, 1, ng);
155  }
156  }
157 
165  virtual void AnyAdd (amrex::Any& dst, amrex::Any const& src, amrex::IntVect const& ng) const override
166  {
167  auto& dmf = dst.get<Container>();
168  auto const& smf = src.get<Container>();
169  for (int idim=0; idim < 3; ++idim) {
170  amrex::MultiFab::Add(dmf[idim], smf[idim], 0, 0, 1, ng);
171  }
172  }
173 
179  virtual void AnySetToZero (amrex::Any& a) const override
180  {
181  auto& mfs = a.get<Container>();
182  for (int idim=0; idim < 3; ++idim) {
183  mfs[idim].setVal(amrex::Real(0.0));
184  }
185  }
186 
192  virtual void AnySetBndryToZero (amrex::Any& a) const override
193  {
194  auto& mfs = a.get<Container>();
195  for (int idim=0; idim < 3; ++idim) {
196  mfs[idim].setBndry(amrex::Real(0.0), 0, 1);
197  }
198  }
199 
200 #ifdef AMREX_USE_EB
206  virtual void AnySetCoveredToZero (amrex::Any& a) const override
207  {
208  auto& mfs = a.get<Container>();
209  for (int idim=0; idim < 3; ++idim) {
210  amrex::EB_set_covered(mfs[idim], 0, 1, 0, amrex::Real(0.0));
211  }
212  }
213 #endif
214 
224  virtual void AnyParallelCopy (amrex::Any& dst, amrex::Any const& src,
225  amrex::IntVect const& src_nghost, amrex::IntVect const& dst_nghost,
226  amrex::Periodicity const& period = amrex::Periodicity::NonPeriodic()) const override
227  {
228  auto& dmf = dst.get<Container>();
229  auto const& smf = src.get<Container>();
230  for (int idim=0; idim < 3; ++idim) {
231  dmf[idim].ParallelCopy_nowait(smf[idim], 0, 0, 1, src_nghost, dst_nghost, period);
232  }
233  for (int idim=0; idim < 3; ++idim) {
234  dmf[idim].ParallelCopy_finish();
235  }
236  }
237 
243  virtual amrex::Real AnyNormInf (amrex::Any& a) const override
244  {
245  auto& mfs = a.get<Container>();
246  amrex::Real r = amrex::Real(0.0);
247  for (int idim=0; idim < 3; ++idim) {
248  auto tmp = mfs[idim].norminf(0, 0, true);
249  r = std::max(r, tmp);
250  }
252  return r;
253  }
254 
265  virtual amrex::Real AnyNormInfMask (int amrlev, amrex::Any const& a, bool local) const override
266  {
267  amrex::ignore_unused(amrlev, a, local);
268  amrex::Abort("TODO: AnyNormInfMask");
269  // This is only needed for multi-level composite solve
270  return amrex::Real(0.0);
271  }
272 
283  virtual void AnySolutionResidual (int amrlev, amrex::Any& resid, amrex::Any& x, amrex::Any const& b,
284  amrex::Any const* crse_bcdata = nullptr) override
285  {
286  amrex::ignore_unused(amrlev, resid, x, b, crse_bcdata);
287  amrex::Abort("TODO: AnySolutionResidual");
288  }
289 
301  virtual void AnyCorrectionResidual (int amrlev, int mglev, amrex::Any& resid, amrex::Any& x,
302  const amrex::Any& b, MLLinOp::BCMode bc_mode,
303  const amrex::Any* crse_bcdata=nullptr) override
304  {
305  amrex::ignore_unused(amrlev, mglev, resid, x, b, bc_mode, crse_bcdata);
306  amrex::Abort("TODO: AnyCorrectionResidual");
307  }
308 
322  virtual void AnyReflux (int crse_amrlev,
323  amrex::Any& res, const amrex::Any& crse_sol, const amrex::Any& crse_rhs,
324  amrex::Any& fine_res, amrex::Any& fine_sol, const amrex::Any& fine_rhs) override
325  {
326  amrex::ignore_unused(crse_amrlev, res, crse_sol, crse_rhs, fine_res, fine_sol, fine_rhs);
327  amrex::Abort("TODO: AnyReflux");
328  // This is only needed for multi-level composite solve
329  }
330 
338  virtual void AnyAvgDownResAmr (int clev, amrex::Any& cres, amrex::Any const& fres) const override
339  {
340  amrex::ignore_unused(clev, cres, fres);
341  amrex::Abort("TODO: AnyAvgDownResAmr");
342  // This is only needed for mulit-level composite solve.
343  // And maybe there is nothing neeed to be done here, like in the nodal projection solver.
344  }
345 
355  virtual void AnyAvgDownResMG (int clev, amrex::Any& cres, amrex::Any const& fres) const override
356  {
357  amrex::ignore_unused(clev, cres, fres);
358  amrex::Abort("TODO: AnyAvgDownResMG"); // Not needed for V-cycle.
359  }
360 
370  virtual void AnySmooth (int amrlev, int mglev, amrex::Any& sol, const amrex::Any& rhs,
371  bool skip_fillboundary=false) const override
372  {
373  amrex::ignore_unused(amrlev, mglev, sol, rhs, skip_fillboundary);
374  amrex::Abort("TODO: AnySmooth");
375  }
376 
385  virtual void AnyRestriction (int amrlev, int cmglev, amrex::Any& crse, amrex::Any& fine) const override
386  {
387  amrex::ignore_unused(amrlev, cmglev, crse, fine);
388  amrex::Abort("TODO: AnyRestriction");
389  }
390 
401  virtual void AnyInterpolationMG (int amrlev, int fmglev, amrex::Any& fine, const amrex::Any& crse) const override
402  {
403  amrex::ignore_unused(amrlev, fmglev, fine, crse);
404  amrex::Abort("TODO: AnyInterpolationMG");
405  }
406 
418  virtual void AnyInterpAssignMG (int amrlev, int fmglev, amrex::Any& fine, amrex::Any& crse) const override
419  {
420  amrex::ignore_unused(amrlev, fmglev, fine, crse);
421  amrex::Abort("TODO: AnyInterpAssignMG"); // not needed for V-cycle.
422  }
423 
431  virtual void AnyInterpolationAmr (int famrlev, amrex::Any& fine, const amrex::Any& crse,
432  amrex::IntVect const& /*nghost*/) const override
433  {
434  amrex::ignore_unused(famrlev, fine, crse);
435  // This is only needed for multi-level composite solve
436  amrex::Abort("TODO: AnyInterpolationAmr");
437  }
438 
450  virtual void AnyAverageDownSolutionRHS (int camrlev, amrex::Any& crse_sol, amrex::Any& crse_rhs,
451  const amrex::Any& fine_sol, const amrex::Any& fine_rhs) override
452  {
453  amrex::ignore_unused(camrlev, crse_sol, crse_rhs, fine_sol, fine_rhs);
454  // This is only needed for multi-level composite solve
455  amrex::Abort("AnyAverageDownSolutionRHS");
456  }
457 
467  virtual void AnyAverageDownAndSync (amrex::Vector<amrex::Any>& sol) const override
468  {
470  // Even for single level, we shoudl synchronize the data on level 0.
471  amrex::Abort("TODO: AnyAverageDownAndSync");
472  }
473 
477  virtual void prepareForSolve () override
478  {
479  amrex::Abort("TODO: prepareForSolve");
480  }
481 };
482 
483 }
484 
485 
486 #endif
Array4< Real > fine
Definition: AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition: AMReX_InterpFaceRegister.cpp:92
Definition: AMReX_Any.H:16
MF & get()
Returns a reference to the contained object.
Definition: AMReX_Any.H:51
Definition: AMReX_IntVect.H:47
Definition: AMReX_MLLinOp.H:81
Vector< IntVect > mg_coarsen_ratio_vec
Definition: AMReX_MLLinOp.H:369
Vector< Vector< BoxArray > > m_grids
Definition: AMReX_MLLinOp.H:373
Vector< Vector< DistributionMapping > > m_dmap
Definition: AMReX_MLLinOp.H:374
const Vector< int > & AMRRefRatio() const noexcept
Definition: AMReX_MLLinOp.H:416
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info, const Vector< FabFactory< FArrayBox > const * > &a_factory, bool eb_limit_coarsening=true)
Definition: AMReX_MLLinOp.cpp:132
Vector< Vector< std::unique_ptr< FabFactory< FArrayBox > > > > m_factory
Definition: AMReX_MLLinOp.H:375
A collection (stored as an array) of FArrayBox objects. This class is useful for storing floating poi...
Definition: AMReX_MultiFab.H:40
static void Add(MultiFab &dst, const MultiFab &src, int srccomp, int dstcomp, int numcomp, int nghost)
Add src to dst including nghost ghost cells. The two MultiFabs MUST have the same underlying BoxArray...
Definition: AMReX_MultiFab.cpp:151
static void Copy(MultiFab &dst, const MultiFab &src, int srccomp, int dstcomp, int numcomp, int nghost)
Copy from src to dst including nghost ghost cells. The two MultiFabs MUST have the same underlying Bo...
Definition: AMReX_MultiFab.cpp:171
This provides length of period for periodic domains. 0 means it is not periodic in that direction....
Definition: AMReX_Periodicity.H:17
static const Periodicity & NonPeriodic() noexcept
Definition: AMReX_Periodicity.cpp:49
Definition: AMReX_MLLinOp_temp.H:13
virtual void AnyAverageDownSolutionRHS(int camrlev, amrex::Any &crse_sol, amrex::Any &crse_rhs, const amrex::Any &fine_sol, const amrex::Any &fine_rhs) override
Average down x and b from fine to coarse AMR level.
Definition: AMReX_MLLinOp_temp.H:450
virtual amrex::Any AnyMakeAlias(amrex::Any const &a) const override
Make an alias of the given Any without deepcopying.
Definition: AMReX_MLLinOp_temp.H:123
MLLinOpTemp & operator=(const MLLinOpTemp &)=delete
virtual void prepareForSolve() override
Prepare the solver for MG cycle.
Definition: AMReX_MLLinOp_temp.H:477
virtual void AnyAvgDownResAmr(int clev, amrex::Any &cres, amrex::Any const &fres) const override
Average down residual from fine to coarse AMR level.
Definition: AMReX_MLLinOp_temp.H:338
virtual void AnyReflux(int crse_amrlev, amrex::Any &res, const amrex::Any &crse_sol, const amrex::Any &crse_rhs, amrex::Any &fine_res, amrex::Any &fine_sol, const amrex::Any &fine_rhs) override
Reflux.
Definition: AMReX_MLLinOp_temp.H:322
amrex::Array< amrex::MultiFab, 3 > Container
In this example, there are 3 edge based MultiFabs.
Definition: AMReX_MLLinOp_temp.H:17
virtual void AnySmooth(int amrlev, int mglev, amrex::Any &sol, const amrex::Any &rhs, bool skip_fillboundary=false) const override
Smooth the given level.
Definition: AMReX_MLLinOp_temp.H:370
virtual ~MLLinOpTemp()
Definition: AMReX_MLLinOp_temp.H:21
virtual void AnyInterpAssignMG(int amrlev, int fmglev, amrex::Any &fine, amrex::Any &crse) const override
Assign (i.e., copy) interpolated coarse data onto the fine MG level.
Definition: AMReX_MLLinOp_temp.H:418
MLLinOpTemp(MLLinOpTemp &&)=delete
virtual void AnyInterpolationAmr(int famrlev, amrex::Any &fine, const amrex::Any &crse, amrex::IntVect const &) const override
Interpolate data from coarse to fine AMR level.
Definition: AMReX_MLLinOp_temp.H:431
virtual void AnyParallelCopy(amrex::Any &dst, amrex::Any const &src, amrex::IntVect const &src_nghost, amrex::IntVect const &dst_nghost, amrex::Periodicity const &period=amrex::Periodicity::NonPeriodic()) const override
ParallelCopy from source Any ot destination Any.
Definition: AMReX_MLLinOp_temp.H:224
virtual amrex::IntVect AnyGrowVect(amrex::Any const &a) const override
Retuen the number of ghost cells in the given Any.
Definition: AMReX_MLLinOp_temp.H:136
MLLinOpTemp(const amrex::Vector< amrex::Geometry > &a_geom, const amrex::Vector< amrex::BoxArray > &a_grids, const amrex::Vector< amrex::DistributionMapping > &a_dmap, const amrex::LPInfo &a_info=amrex::LPInfo(), const amrex::Vector< amrex::FabFactory< amrex::FArrayBox > const * > &a_factory={})
Definition: AMReX_MLLinOp_temp.H:28
virtual amrex::BottomSolver getDefaultBottomSolver() const override
Return the default solver at the bottom of MG cycles. By default, MLLinOp uses a BiCGStab solver impl...
Definition: AMReX_MLLinOp_temp.H:53
virtual void AnyCopy(amrex::Any &dst, amrex::Any const &src, amrex::IntVect const &ng) const override
Copy data from source Any to destination Any.
Definition: AMReX_MLLinOp_temp.H:149
virtual amrex::Real AnyNormInf(amrex::Any &a) const override
Return the infinity norm of the given Any.
Definition: AMReX_MLLinOp_temp.H:243
virtual amrex::Real AnyNormInfMask(int amrlev, amrex::Any const &a, bool local) const override
Return the infinity norm of the masked region of the given Any.
Definition: AMReX_MLLinOp_temp.H:265
virtual amrex::Any AnyMake(int amrlev, int mglev, amrex::IntVect const &ng) const override
Make data container (e.g., MultiFabs stored in Any) for given level.
Definition: AMReX_MLLinOp_temp.H:64
virtual void AnyCorrectionResidual(int amrlev, int mglev, amrex::Any &resid, amrex::Any &x, const amrex::Any &b, MLLinOp::BCMode bc_mode, const amrex::Any *crse_bcdata=nullptr) override
Compute residual of the residual correction form, r = b - Ax.
Definition: AMReX_MLLinOp_temp.H:301
virtual void AnyRestriction(int amrlev, int cmglev, amrex::Any &crse, amrex::Any &fine) const override
Restriction from fine to coarse MG level.
Definition: AMReX_MLLinOp_temp.H:385
virtual void AnySolutionResidual(int amrlev, amrex::Any &resid, amrex::Any &x, amrex::Any const &b, amrex::Any const *crse_bcdata=nullptr) override
Compute residual of the original form, r = b - Ax.
Definition: AMReX_MLLinOp_temp.H:283
virtual amrex::Any AnyMakeCoarseAmr(int famrlev, amrex::IntVect const &ng) const override
Make data container with coarsened BoxArray and DistributionMapping of the given AMR level.
Definition: AMReX_MLLinOp_temp.H:105
void define(const amrex::Vector< amrex::Geometry > &a_geom, const amrex::Vector< amrex::BoxArray > &a_grids, const amrex::Vector< amrex::DistributionMapping > &a_dmap, const amrex::LPInfo &a_info=amrex::LPInfo(), const amrex::Vector< amrex::FabFactory< amrex::FArrayBox > const * > &a_factory={})
Definition: AMReX_MLLinOp_temp.H:37
virtual amrex::Any AnyMakeCoarseMG(int amrlev, int mglev, amrex::IntVect const &ng) const override
Make data container with coarsened BoxArray and DistributionMapping of the give MG level.
Definition: AMReX_MLLinOp_temp.H:85
virtual void AnySetToZero(amrex::Any &a) const override
Set the given Any to zero.
Definition: AMReX_MLLinOp_temp.H:179
MLLinOpTemp()
Definition: AMReX_MLLinOp_temp.H:19
virtual void AnyAverageDownAndSync(amrex::Vector< amrex::Any > &sol) const override
Average down and synchronize AMR data.
Definition: AMReX_MLLinOp_temp.H:467
MLLinOpTemp(const MLLinOpTemp &)=delete
virtual void AnyInterpolationMG(int amrlev, int fmglev, amrex::Any &fine, const amrex::Any &crse) const override
Add interpolated coarse data onto the fine MG level.
Definition: AMReX_MLLinOp_temp.H:401
virtual void AnyAvgDownResMG(int clev, amrex::Any &cres, amrex::Any const &fres) const override
Average down residual from fine to coarse MG level.
Definition: AMReX_MLLinOp_temp.H:355
virtual void AnyAdd(amrex::Any &dst, amrex::Any const &src, amrex::IntVect const &ng) const override
Add data from source Any to destination Any.
Definition: AMReX_MLLinOp_temp.H:165
virtual void AnySetBndryToZero(amrex::Any &a) const override
Set boundary (i.e., ghost cells) the given Any to zero.
Definition: AMReX_MLLinOp_temp.H:192
void Max(ValLocPair< TV, TI > &vi, MPI_Comm comm)
Definition: AMReX_ParallelReduce.H:125
MPI_Comm CommunicatorSub() noexcept
sub-communicator for current frame
Definition: AMReX_ParallelContext.H:69
@ max
Definition: AMReX_ParallelReduce.H:17
This is a template for writing your own linear operator class for Ax=b.
Definition: AMReX_MLLinOp_temp.H:9
@ make_alias
Definition: AMReX_MakeType.H:7
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Box convert(const Box &b, const IntVect &typ) noexcept
Returns a Box with different type.
Definition: AMReX_Box.H:1323
void EB_set_covered(MultiFab &mf, Real val)
Definition: AMReX_EBMultiFabUtil.cpp:21
BottomSolver
Definition: AMReX_MLLinOp.H:25
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition: AMReX.H:101
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Box coarsen(const Box &b, int ref_ratio) noexcept
Coarsen Box by given (positive) refinement ratio. NOTE: if type(dir) = CELL centered: lo <- lo/ratio ...
Definition: AMReX_Box.H:1210
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition: AMReX.cpp:191
std::array< T, N > Array
Definition: AMReX_Array.H:23
Definition: AMReX_MLLinOp.H:36
Definition: AMReX_FabArray.H:116