OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
AmrBoxLib.h
Go to the documentation of this file.
1 //
2 // Class AmrBoxLib
3 // Concrete AMR object. It is based on the AMReX library
4 // (cf. https://amrex-codes.github.io/ or https://ccse.lbl.gov/AMReX/).
5 // AMReX is the successor of BoxLib. This class represents the interface
6 // to AMReX and the AMR framework in OPAL. It implements the functions of
7 // the AmrObject class.
8 //
9 // Copyright (c) 2016 - 2020, Matthias Frey, Paul Scherrer Institut, Villigen PSI, Switzerland
10 // All rights reserved
11 //
12 // Implemented as part of the PhD thesis
13 // "Precise Simulations of Multibunches in High Intensity Cyclotrons"
14 //
15 // This file is part of OPAL.
16 //
17 // OPAL is free software: you can redistribute it and/or modify
18 // it under the terms of the GNU General Public License as published by
19 // the Free Software Foundation, either version 3 of the License, or
20 // (at your option) any later version.
21 //
22 // You should have received a copy of the GNU General Public License
23 // along with OPAL. If not, see <https://www.gnu.org/licenses/>.
24 //
25 #ifndef AMR_BOXLIB_H
26 #define AMR_BOXLIB_H
27 
28 #include "Amr/AmrObject.h"
29 
30 // AMReX headers
31 #include <AMReX_AmrMesh.H>
32 #include <AMReX.H>
33 
34 #include <map>
35 #include <vector>
36 
37 class AmrPartBunch;
38 
39 class AmrBoxLib: public AmrObject,
40  public amrex::AmrMesh {
41 
42 public:
56 
57  typedef amrex::FArrayBox FArrayBox_t;
58  typedef amrex::Box Box_t;
59  typedef amrex::TagBox TagBox_t;
60  typedef amrex::TagBoxArray TagBoxArray_t;
61  typedef amrex::MFIter MFIter_t;
62 
66  enum Strategy {
67  RANK_ZERO = 0, // all grids to processor zero
68  PFC = 1,
69  RANDOM = 2,
71  };
72 
73 public:
81  AmrBoxLib(const AmrDomain_t& domain,
82  const AmrIntArray_t& nGridPts,
83  int maxLevel,
84  AmrPartBunch* bunch_p);
85 
93  static std::unique_ptr<AmrBoxLib> create(const AmrInfo& info,
94  AmrPartBunch* bunch_p);
95 
99  void regrid(double time);
100 
101  void getGridStatistics(std::map<int, long>& gridPtsPerCore,
102  std::vector<int>& gridsPerLevel) const;
103 
107  void initFineLevels();
108 
110 
111  double getRho(int x, int y, int z);
112 
113  void computeSelfFields();
114 
115  void computeSelfFields(int bin);
116 
117  void computeSelfFields_cycl(double gamma);
118 
119  void computeSelfFields_cycl(int bin);
120 
121  void updateMesh();
122 
127  const Vector_t& getMeshScaling() const;
128 
130 
131  const int& maxLevel() const;
132  const int& finestLevel() const;
133 
137  double getT() const;
138 
139  void redistributeGrids(int how);
140 
141 
142 protected:
143  /*
144  * AmrMesh functions
145  */
146 
155  void RemakeLevel (int lev, AmrReal_t time,
156  const AmrGrid_t& new_grids, const AmrProcMap_t& new_dmap);
157 
165  void MakeNewLevel (int lev, AmrReal_t time,
166  const AmrGrid_t& new_grids, const AmrProcMap_t& new_dmap);
167 
172  void ClearLevel(int lev);
173 
177  virtual void ErrorEst(int lev, TagBoxArray_t& tags,
178  AmrReal_t time, int ngrow) override;
179 
192  void MakeNewLevelFromScratch(int lev, AmrReal_t time,
193  const AmrGrid_t& ba,
194  const AmrProcMap_t& dm);
195 
207  void MakeNewLevelFromCoarse(int lev, AmrReal_t time,
208  const AmrGrid_t& ba,
209  const AmrProcMap_t& dm);
210 
211 
212 private:
219  void doRegrid_m(int lbase, double time);
220 
226  void preRegrid_m();
227 
233  void postRegrid_m(int old_finest);
234 
235  double solvePoisson_m();
236 
237  /* ATTENTION
238  * The tagging routines assume the particles to be in the
239  * AMR domain, i.e. [-1, 1]^3
240  */
241 
251  void tagForChargeDensity_m(int lev, TagBoxArray_t& tags,
252  AmrReal_t time, int ngrow);
253 
264  void tagForPotentialStrength_m(int lev, TagBoxArray_t& tags,
265  AmrReal_t time, int ngrow);
266 
277  void tagForEfield_m(int lev, TagBoxArray_t& tags,
278  AmrReal_t time, int ngrow);
279 
291  void tagForMomenta_m(int lev, TagBoxArray_t& tags,
292  AmrReal_t time, int ngrow);
293 
303  void tagForMaxNumParticles_m(int lev, TagBoxArray_t& tags,
304  AmrReal_t time, int ngrow);
305 
315  void tagForMinNumParticles_m(int lev, TagBoxArray_t& tags,
316  AmrReal_t time, int ngrow);
317 
324  void initBaseLevel_m(const AmrIntArray_t& nGridPts);
325 
335  static void initParmParse_m(const AmrInfo& info, AmrLayout_t* layout_p);
336 
342  void fillPhysbc_m(AmrField_t& mf, int lev = 0);
343 
344 // void gradient(int lev) {
345 //
346 // phi_m[lev]->FillBoundary(geom[lev].periodicity());
347 //
348 // for (MFIter_t mfi(*phi_m[lev], true); mfi.isValid(); ++mfi) {
349 // const Box_t& tilebx = mfi.tilebox();
350 // FArrayBox_t& fab = (*phi_m[lev])[mfi];
351 // FArrayBox_t& efab = (*efield_m[lev])[mfi];
352 //
353 // const int* tlo = tilebx.loVect();
354 // const int* thi = tilebx.hiVect();
355 //
356 // for (int i = tlo[0]; i <= thi[0]; ++i) {
357 // for (int j = tlo[1]; j <= thi[1]; ++j) {
358 // for (int k = tlo[2]; k <= thi[2]; ++k) {
359 //
360 // amrex::IntVect iv(D_DECL(i,j,k));
361 //
362 // // x-field
363 // amrex::IntVect liv(D_DECL(i-1,j,k));
364 // amrex::IntVect riv(D_DECL(i+1,j,k));
365 // efab(iv, 0) = 0.5 * (fab(liv) - fab(riv));
366 //
367 // // y-field
368 // liv = amrex::IntVect(D_DECL(i,j-1,k));
369 // riv = amrex::IntVect(D_DECL(i,j+1,k));
370 // efab(iv, 1) = 0.5 * (fab(liv) - fab(riv));
371 //
372 // // z-field
373 // liv = amrex::IntVect(D_DECL(i,j-1,k));
374 // riv = amrex::IntVect(D_DECL(i,j+1,k));
375 // efab(iv, 2) = 0.5 * (fab(liv) - fab(riv));
376 // }
377 // }
378 // }
379 // }
380 // }
381 
382 
383 private:
386 
387  // the layout of the bunch
389 
392 
395 
398 
401 
402  // only used in case of potential and efield tagging
403  std::vector<bool> isFirstTagging_m;
404 
406 };
407 
408 #endif
amr::AmrGridContainer_t AmrGridContainer_t
Definition: AmrBoxLib.h:47
AmrVectorFieldContainer_t efield_m
vector field on the grid for all levels
Definition: AmrBoxLib.h:397
amr::AmrProcMapContainer_t AmrProcMapContainer_t
Definition: AmrBoxLib.h:48
amrex::Vector< AmrProcMap_t > AmrProcMapContainer_t
Definition: AmrDefs.h:45
void getGridStatistics(std::map< int, long > &gridPtsPerCore, std::vector< int > &gridsPerLevel) const
Definition: AmrBoxLib.cpp:137
static void initParmParse_m(const AmrInfo &info, AmrLayout_t *layout_p)
Definition: AmrBoxLib.cpp:1217
amr::AmrField_t AmrField_t
Definition: PBunchDefs.h:34
amr::AmrGrid_t AmrGrid_t
Definition: AmrBoxLib.h:52
std::pair< Vector_t, Vector_t > VectorPair_t
Definition: AmrObject.h:35
void ClearLevel(int lev)
Definition: AmrBoxLib.cpp:656
void MakeNewLevel(int lev, AmrReal_t time, const AmrGrid_t &new_grids, const AmrProcMap_t &new_dmap)
Definition: AmrBoxLib.cpp:624
AmrBoxLib(const AmrDomain_t &domain, const AmrIntArray_t &nGridPts, int maxLevel, AmrPartBunch *bunch_p)
Definition: AmrBoxLib.cpp:47
const int & finestLevel() const
Definition: AmrBoxLib.cpp:520
amrex::BoxArray AmrGrid_t
Definition: AmrDefs.h:40
double getT() const
Definition: AmrBoxLib.cpp:525
amr::AmrReal_t AmrReal_t
Definition: AmrBoxLib.h:51
Definition: TSVMeta.h:24
void fillPhysbc_m(AmrField_t &mf, int lev=0)
Definition: AmrBoxLib.cpp:1518
void computeSelfFields_cycl(double gamma)
Definition: AmrBoxLib.cpp:240
AmrLayout_t * layout_mp
Definition: AmrBoxLib.h:388
Vektor< int, 3 > getBaseLevelGridPoints() const
Definition: AmrBoxLib.cpp:503
amr::AmrScalarFieldContainer_t AmrScalarFieldContainer_t
Definition: AmrBoxLib.h:44
bool isPoissonSolved_m
Definition: AmrBoxLib.h:405
amrex::IntVect AmrIntVect_t
Definition: AmrDefs.h:48
void tagForChargeDensity_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
Definition: AmrBoxLib.cpp:858
bool info
Info flag.
Definition: Options.cpp:28
void computeSelfFields()
Definition: AmrBoxLib.cpp:228
amrex::FArrayBox FArrayBox_t
Definition: AmrBoxLib.h:57
amrex::MFIter MFIter_t
Definition: AmrBoxLib.h:61
void tagForMaxNumParticles_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
Definition: AmrBoxLib.cpp:1089
amrex::DistributionMapping AmrProcMap_t
Definition: AmrDefs.h:38
void MakeNewLevelFromScratch(int lev, AmrReal_t time, const AmrGrid_t &ba, const AmrProcMap_t &dm)
Definition: AmrBoxLib.cpp:702
amrex::Geometry AmrGeometry_t
Definition: AmrDefs.h:39
amrex::Vector< std::unique_ptr< AmrField_t > > AmrScalarFieldContainer_t
Definition: AmrDefs.h:41
double solvePoisson_m()
Definition: AmrBoxLib.cpp:809
void redistributeGrids(int how)
Definition: AmrBoxLib.cpp:530
amrex::Vector< int > AmrIntArray_t
Definition: AmrDefs.h:47
amrex::Real AmrReal_t
Definition: AmrDefs.h:51
amrex::Box Box_t
Definition: AmrBoxLib.h:58
void tagForEfield_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
Definition: AmrBoxLib.cpp:965
amr::AmrGeomContainer_t AmrGeomContainer_t
Definition: AmrBoxLib.h:46
amrex::Vector< AmrGeometry_t > AmrGeomContainer_t
Definition: AmrDefs.h:43
void RemakeLevel(int lev, AmrReal_t time, const AmrGrid_t &new_grids, const AmrProcMap_t &new_dmap)
Definition: AmrBoxLib.cpp:591
amrex::MultiFab AmrField_t
Definition: AmrDefs.h:34
amr::AmrProcMap_t AmrProcMap_t
Definition: AmrBoxLib.h:53
static std::unique_ptr< AmrBoxLib > create(const AmrInfo &info, AmrPartBunch *bunch_p)
Definition: AmrBoxLib.cpp:74
void updateMesh()
Definition: AmrBoxLib.cpp:486
void initFineLevels()
Definition: AmrBoxLib.cpp:164
std::vector< bool > isFirstTagging_m
Definition: AmrBoxLib.h:403
amrex::RealBox AmrDomain_t
Definition: AmrDefs.h:46
amr::AmrVectorFieldContainer_t AmrVectorFieldContainer_t
Definition: AmrBoxLib.h:45
void postRegrid_m(int old_finest)
Definition: AmrBoxLib.cpp:770
AmrScalarFieldContainer_t phi_m
scalar potential on the grid for all levels
Definition: AmrBoxLib.h:394
amr::AmrIntArray_t AmrIntArray_t
Definition: AmrBoxLib.h:50
void regrid(double time)
Definition: AmrBoxLib.cpp:106
void initBaseLevel_m(const AmrIntArray_t &nGridPts)
Definition: AmrBoxLib.cpp:1191
virtual void ErrorEst(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow) override
Definition: AmrBoxLib.cpp:669
amr::AmrIntVect_t AmrIntVect_t
Definition: AmrBoxLib.h:55
void tagForMomenta_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
Definition: AmrBoxLib.cpp:1030
void preRegrid_m()
Definition: AmrBoxLib.cpp:754
amr::AmrGeometry_t AmrGeometry_t
Definition: AmrBoxLib.h:54
AmrPartBunch * bunch_mp
bunch used for tagging strategies
Definition: AmrBoxLib.h:385
amrex::TagBox TagBox_t
Definition: AmrBoxLib.h:59
const Vector_t & getMeshScaling() const
Definition: AmrBoxLib.cpp:498
AmrScalarFieldContainer_t rho_m
charge density on the grid for all levels
Definition: AmrBoxLib.h:391
amr::AmrField_t AmrField_t
Definition: AmrBoxLib.h:43
amrex::Vector< AmrGrid_t > AmrGridContainer_t
Definition: AmrDefs.h:44
void MakeNewLevelFromCoarse(int lev, AmrReal_t time, const AmrGrid_t &ba, const AmrProcMap_t &dm)
Definition: AmrBoxLib.cpp:710
void tagForPotentialStrength_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
Definition: AmrBoxLib.cpp:911
double getRho(int x, int y, int z)
Definition: AmrBoxLib.cpp:221
void doRegrid_m(int lbase, double time)
Definition: AmrBoxLib.cpp:718
const int & maxLevel() const
Definition: AmrBoxLib.cpp:515
amrex::Vector< AmrVectorField_t > AmrVectorFieldContainer_t
Definition: AmrDefs.h:42
amrex::TagBoxArray TagBoxArray_t
Definition: AmrBoxLib.h:60
VectorPair_t getEExtrema()
Definition: AmrBoxLib.cpp:198
void tagForMinNumParticles_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
Definition: AmrBoxLib.cpp:1139
Vector_t meshScaling_m
in particle rest frame, the longitudinal length enlarged
Definition: AmrBoxLib.h:400
amr::AmrDomain_t AmrDomain_t
Definition: AmrBoxLib.h:49