OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
BoxLibLayout.h
Go to the documentation of this file.
1 #ifndef BOXLIB_LAYOUT_H
2 #define BOXLIB_LAYOUT_H
3 
6 
7 #include "Amr/AmrDefs.h"
8 
9 #include <AMReX_ParGDB.H>
10 
29 template<class T, unsigned Dim>
30 class BoxLibLayout : public ParticleAmrLayout<T, Dim>,
31  public amrex::ParGDB
32 {
33 
34 public:
39 
46 
59 
60  typedef amrex::BaseFab<int> basefab_t;
61  typedef amrex::FabArray<basefab_t> mask_t;
62 
70 
77 
78 public:
79 
83  BoxLibLayout();
84 
88  BoxLibLayout(const BoxLibLayout* layout_p);
89 
94  BoxLibLayout(int nGridPoints, int maxGridSize);
95 
103  BoxLibLayout(const AmrGeometry_t &geom,
104  const AmrProcMap_t &dmap,
105  const AmrGrid_t &ba);
106 
117  BoxLibLayout(const AmrGeomContainer_t &geom,
118  const AmrProcMapContainer_t &dmap,
119  const AmrGridContainer_t &ba,
120  const AmrIntArray_t &rr);
121 
122 
123  /*
124  * Overloaded functions of ParticleAmrLayout
125  */
126 
135  void setBoundingBox(double dh);
136 
144  void setDomainRatio(const std::vector<double>& ratio);
145 
146 
147  /*
148  * Functions of IpplParticleBase
149  */
150 
156  const ParticleAttrib<char>* canSwap = 0);
157 
170  int lev_min = 0, int lev_max = -1, bool isRegrid = false);
171 
172 
173  /*
174  * Functions from AMReX that are adjusted to work with Ippl AmrParticleBase class
175  */
176 
185  const unsigned int ip, int level) const;
186 
193  AmrIntVect_t Index (SingleParticlePos_t &R, int lev) const;
194 
195 
196  /*
197  * Additional methods
198  */
199 
200 
206  void buildLevelMask(int lev, const int ncells = 1);
207 
208  void clearLevelMask(int lev);
209 
210  const std::unique_ptr<mask_t>& getLevelMask(int lev) const;
211 
212 
224  void resize(int maxLevel) {
225  int length = maxLevel + 1;
226  this->m_geom.resize(length);
227  this->m_dmap.resize(length);
228  this->m_ba.resize(length);
229  this->m_nlevels = length;
230  this->refRatio_m.resize(maxLevel);
231 // this->m_rr.resize(maxLevel);
232  this->maxLevel_m = maxLevel;
233  }
234 
235 
242  void define(const AmrGeomContainer_t& geom) {
243  for (unsigned int i = 0; i < geom.size(); ++i)
244  this->m_geom[i] = geom[i];
245  }
246 
247 
255  for (unsigned int i = 0; i < refRatio.size(); ++i) {
256  refRatio_m[i] = refRatio[i];
257  }
258  }
259 
260  /*
261  * ParGDB overwritten functions
262  */
263 
269  inline bool LevelDefined (int level) const;
270 
274  inline int finestLevel () const;
275 
279  inline int maxLevel () const;
280 
286  inline AmrIntVect_t refRatio (int level) const;
287 
293  inline int MaxRefRatio (int level) const;
294 
295 private:
296 
305  void initBaseBox_m(int nGridPoints, int maxGridSize, double dh = 0.04);
306 
307 
308  /*
309  * Functions from AMReX that are adjusted to work with Ippl AmrParticleBase class
310  */
311 
324  const unsigned int ip,
325  int lev_min = 0, int lev_max = -1, int nGrow = 0) const;
326 
339  const unsigned int ip,
340  int lev_min = 0, int lev_max = -1) const;
341 
350  bool PeriodicShift (SingleParticlePos_t R) const;
351 
362  const unsigned int ip,
363  int lev_min, int lev_max, int nGrow) const;
364 
365 private:
366 
367  // don't use m_rr from ParGDB since it is the same refinement in all directions
369 
370  /* mask to reduce spurious self-field forces at
371  * coarse-fine interfaces
372  */
373  std::vector<std::unique_ptr<mask_t> > masks_m;
374 };
375 
376 #include "BoxLibLayout.hpp"
377 
378 #endif
amrex::Geometry AmrGeometry_t
Definition: AmrDefs.h:19
void resize(int maxLevel)
Definition: BoxLibLayout.h:224
void update(IpplParticleBase< BoxLibLayout< T, Dim > > &PData, const ParticleAttrib< char > *canSwap=0)
AmrIntVect_t refRatio(int level) const
ParticleAmrLayout< T, Dim >::ParticlePos_t ParticlePos_t
Definition: BoxLibLayout.h:44
const std::unique_ptr< mask_t > & getLevelMask(int lev) const
void locateParticle(AmrParticleBase< BoxLibLayout< T, Dim > > &p, const unsigned int ip, int lev_min, int lev_max, int nGrow) const
amrex::BaseFab< int > basefab_t
Definition: BoxLibLayout.h:60
amr::AmrIntVect_t AmrIntVect_t
Definition: BoxLibLayout.h:53
amr::AmrGeomContainer_t AmrGeomContainer_t
Definition: BoxLibLayout.h:50
ParticleAmrLayout< T, Dim >::Index_t Index_t
Definition: BoxLibLayout.h:38
amrex::IntVect AmrIntVect_t
Definition: AmrDefs.h:28
amrex::Vector< AmrGeometry_t > AmrGeomContainer_t
Definition: AmrDefs.h:23
amr::AmrProcMapContainer_t AmrProcMapContainer_t
Definition: BoxLibLayout.h:52
ParticleAmrLayout< T, Dim >::SingleParticlePos_t SingleParticlePos_t
Definition: BoxLibLayout.h:37
amrex::FabArray< basefab_t > mask_t
Definition: BoxLibLayout.h:61
static Vector_t lowerBound
Definition: BoxLibLayout.h:69
ParticleAttrib< Index_t > ParticleIndex_t
Definition: BoxLibLayout.h:45
amrex::MultiFab AmrField_t
Definition: AmrDefs.h:14
int finestLevel() const
static Vector_t upperBound
Definition: BoxLibLayout.h:76
amr::AmrDomain_t AmrDomain_t
Definition: BoxLibLayout.h:56
ParticleAmrLayout< T, Dim >::pair_iterator pair_iterator
Definition: BoxLibLayout.h:36
amr::AmrGridContainer_t AmrGridContainer_t
Definition: BoxLibLayout.h:51
amrex::DistributionMapping AmrProcMap_t
Definition: AmrDefs.h:18
amrex::Vector< int > AmrIntArray_t
Definition: AmrDefs.h:27
void setDomainRatio(const std::vector< double > &ratio)
amrex::RealBox AmrDomain_t
Definition: AmrDefs.h:26
amr::AmrGrid_t AmrGrid_t
Definition: BoxLibLayout.h:48
amrex::Vector< AmrIntVect_t > AmrIntVectContainer_t
Definition: AmrDefs.h:29
amrex::Box AmrBox_t
Definition: AmrDefs.h:30
bool Where(AmrParticleBase< BoxLibLayout< T, Dim > > &p, const unsigned int ip, int lev_min=0, int lev_max=-1, int nGrow=0) const
int maxLevel() const
amr::AmrBox_t AmrBox_t
Definition: BoxLibLayout.h:57
amr::AmrIntVectContainer_t AmrIntVectContainer_t
Definition: BoxLibLayout.h:54
ParticleAmrLayout< T, Dim >::pair_t pair_t
Definition: BoxLibLayout.h:35
bool EnforcePeriodicWhere(AmrParticleBase< BoxLibLayout< T, Dim > > &prt, const unsigned int ip, int lev_min=0, int lev_max=-1) const
amrex::Vector< AmrGrid_t > AmrGridContainer_t
Definition: AmrDefs.h:24
int MaxRefRatio(int level) const
void clearLevelMask(int lev)
AmrIntVect_t Index(AmrParticleBase< BoxLibLayout< T, Dim > > &p, const unsigned int ip, int level) const
amr::AmrReal_t AmrReal_t
Definition: BoxLibLayout.h:58
amrex::BoxArray AmrGrid_t
Definition: AmrDefs.h:20
amr::AmrGeometry_t AmrGeometry_t
Definition: BoxLibLayout.h:49
std::vector< std::unique_ptr< mask_t > > masks_m
Refinement ratios [0:finest_level-1].
Definition: BoxLibLayout.h:373
std::array< std::unique_ptr< AmrField_t >, AMREX_SPACEDIM > AmrVectorField_t
Definition: AmrDefs.h:17
void buildLevelMask(int lev, const int ncells=1)
int maxLevel_m
Maximum level allowed.
bool LevelDefined(int level) const
amr::AmrField_t AmrField_t
Definition: BoxLibLayout.h:40
amr::AmrProcMap_t AmrProcMap_t
Definition: BoxLibLayout.h:47
void define(const AmrGeomContainer_t &geom)
Definition: BoxLibLayout.h:242
bool PeriodicShift(SingleParticlePos_t R) const
amr::AmrVectorFieldContainer_t AmrVectorFieldContainer_t
Definition: BoxLibLayout.h:43
amr::AmrIntArray_t AmrIntArray_t
Definition: BoxLibLayout.h:55
void define(const AmrIntVectContainer_t &refRatio)
Definition: BoxLibLayout.h:254
void initBaseBox_m(int nGridPoints, int maxGridSize, double dh=0.04)
amrex::Vector< AmrProcMap_t > AmrProcMapContainer_t
Definition: AmrDefs.h:25
void setBoundingBox(double dh)
amrex::Vector< AmrVectorField_t > AmrVectorFieldContainer_t
Definition: AmrDefs.h:22
amr::AmrVectorField_t AmrVectorField_t
Definition: BoxLibLayout.h:41
AmrIntVectContainer_t refRatio_m
Definition: BoxLibLayout.h:368
amr::AmrScalarFieldContainer_t AmrScalarFieldContainer_t
Definition: BoxLibLayout.h:42
amrex::Vector< std::unique_ptr< AmrField_t > > AmrScalarFieldContainer_t
Definition: AmrDefs.h:21
ParticleLayout< T, Dim >::Index_t Index_t
amrex::Real AmrReal_t
Definition: AmrDefs.h:31