OPAL (Object Oriented Parallel Accelerator Library) 2024.2
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
37class AmrPartBunch;
38
39class AmrBoxLib: public AmrObject,
40 public amrex::AmrMesh {
41
42public:
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,
70 KNAPSACK = 3
71 };
72
73public:
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) override;
100
101 void getGridStatistics(std::map<int, long>& gridPtsPerCore,
102 std::vector<int>& gridsPerLevel) const override;
103
107 void initFineLevels() override;
108
109 VectorPair_t getEExtrema() override;
110
111 double getRho(int x, int y, int z) override;
112
113 void computeSelfFields() override;
114
115 void computeSelfFields(int bin) override;
116
117 void computeSelfFields_cycl(double gamma) override;
118
119 void computeSelfFields_cycl(int bin) override;
120
121 void updateMesh() override;
122
127 const Vector_t& getMeshScaling() const;
128
129 Vektor<int, 3> getBaseLevelGridPoints() const override;
130
131 const int& maxLevel() const override;
132 const int& finestLevel() const override;
133
137 double getT() const override;
138
139 void redistributeGrids(int how) override;
140
141protected:
142 /*
143 * AmrMesh functions
144 */
145
154 void RemakeLevel (int lev, AmrReal_t time,
155 const AmrGrid_t& new_grids, const AmrProcMap_t& new_dmap);
156
164 void MakeNewLevel (int lev, AmrReal_t time,
165 const AmrGrid_t& new_grids, const AmrProcMap_t& new_dmap);
166
171 void ClearLevel(int lev);
172
176 virtual void ErrorEst(int lev, TagBoxArray_t& tags,
177 AmrReal_t time, int ngrow);
178
191 void MakeNewLevelFromScratch(int lev, AmrReal_t time,
192 const AmrGrid_t& ba,
193 const AmrProcMap_t& dm);
194
206 void MakeNewLevelFromCoarse(int lev, AmrReal_t time,
207 const AmrGrid_t& ba,
208 const AmrProcMap_t& dm);
209
210private:
217 void doRegrid_m(int lbase, double time);
218
224 void preRegrid_m();
225
231 void postRegrid_m(int old_finest);
232
233 double solvePoisson_m();
234
235 /* ATTENTION
236 * The tagging routines assume the particles to be in the
237 * AMR domain, i.e. [-1, 1]^3
238 */
239
249 void tagForChargeDensity_m(int lev, TagBoxArray_t& tags,
250 AmrReal_t time, int ngrow);
251
262 void tagForPotentialStrength_m(int lev, TagBoxArray_t& tags,
263 AmrReal_t time, int ngrow);
264
275 void tagForEfield_m(int lev, TagBoxArray_t& tags,
276 AmrReal_t time, int ngrow);
277
289 void tagForMomenta_m(int lev, TagBoxArray_t& tags,
290 AmrReal_t time, int ngrow);
291
301 void tagForMaxNumParticles_m(int lev, TagBoxArray_t& tags,
302 AmrReal_t time, int ngrow);
303
313 void tagForMinNumParticles_m(int lev, TagBoxArray_t& tags,
314 AmrReal_t time, int ngrow);
315
322 void initBaseLevel_m(const AmrIntArray_t& nGridPts);
323
333 static void initParmParse_m(const AmrInfo& info, AmrLayout_t* layout_p);
334
340 void fillPhysbc_m(AmrField_t& mf, int lev = 0);
341
342// void gradient(int lev) {
343//
344// phi_m[lev]->FillBoundary(geom[lev].periodicity());
345//
346// for (MFIter_t mfi(*phi_m[lev], true); mfi.isValid(); ++mfi) {
347// const Box_t& tilebx = mfi.tilebox();
348// FArrayBox_t& fab = (*phi_m[lev])[mfi];
349// FArrayBox_t& efab = (*efield_m[lev])[mfi];
350//
351// const int* tlo = tilebx.loVect();
352// const int* thi = tilebx.hiVect();
353//
354// for (int i = tlo[0]; i <= thi[0]; ++i) {
355// for (int j = tlo[1]; j <= thi[1]; ++j) {
356// for (int k = tlo[2]; k <= thi[2]; ++k) {
357//
358// amrex::IntVect iv(D_DECL(i,j,k));
359//
360// // x-field
361// amrex::IntVect liv(D_DECL(i-1,j,k));
362// amrex::IntVect riv(D_DECL(i+1,j,k));
363// efab(iv, 0) = 0.5 * (fab(liv) - fab(riv));
364//
365// // y-field
366// liv = amrex::IntVect(D_DECL(i,j-1,k));
367// riv = amrex::IntVect(D_DECL(i,j+1,k));
368// efab(iv, 1) = 0.5 * (fab(liv) - fab(riv));
369//
370// // z-field
371// liv = amrex::IntVect(D_DECL(i,j-1,k));
372// riv = amrex::IntVect(D_DECL(i,j+1,k));
373// efab(iv, 2) = 0.5 * (fab(liv) - fab(riv));
374// }
375// }
376// }
377// }
378// }
379
380
381private:
384
385 // the layout of the bunch
387
390
393
396
399
400 // only used in case of potential and efield tagging
401 std::vector<bool> isFirstTagging_m;
402
404};
405
406#endif
amr::AmrField_t AmrField_t
Definition PBunchDefs.h:34
amrex::Vector< AmrVectorField_t > AmrVectorFieldContainer_t
Definition AmrDefs.h:42
amrex::DistributionMapping AmrProcMap_t
Definition AmrDefs.h:38
amrex::Geometry AmrGeometry_t
Definition AmrDefs.h:39
amrex::RealBox AmrDomain_t
Definition AmrDefs.h:46
amrex::Vector< AmrGeometry_t > AmrGeomContainer_t
Definition AmrDefs.h:43
amrex::IntVect AmrIntVect_t
Definition AmrDefs.h:48
amrex::Real AmrReal_t
Definition AmrDefs.h:51
amrex::MultiFab AmrField_t
Definition AmrDefs.h:34
amrex::Vector< std::unique_ptr< AmrField_t > > AmrScalarFieldContainer_t
Definition AmrDefs.h:41
amrex::Vector< int > AmrIntArray_t
Definition AmrDefs.h:47
amrex::BoxArray AmrGrid_t
Definition AmrDefs.h:40
amrex::Vector< AmrGrid_t > AmrGridContainer_t
Definition AmrDefs.h:44
amrex::Vector< AmrProcMap_t > AmrProcMapContainer_t
Definition AmrDefs.h:45
amr::AmrGeometry_t AmrGeometry_t
Definition AmrBoxLib.h:54
amr::AmrProcMap_t AmrProcMap_t
Definition AmrBoxLib.h:53
Vector_t meshScaling_m
in particle rest frame, the longitudinal length enlarged
Definition AmrBoxLib.h:398
const Vector_t & getMeshScaling() const
void MakeNewLevelFromScratch(int lev, AmrReal_t time, const AmrGrid_t &ba, const AmrProcMap_t &dm)
virtual void ErrorEst(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
void preRegrid_m()
void getGridStatistics(std::map< int, long > &gridPtsPerCore, std::vector< int > &gridsPerLevel) const override
void computeSelfFields_cycl(double gamma) override
amrex::Box Box_t
Definition AmrBoxLib.h:58
AmrScalarFieldContainer_t rho_m
charge density on the grid for all levels
Definition AmrBoxLib.h:389
void tagForPotentialStrength_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
void tagForMaxNumParticles_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
amrex::MFIter MFIter_t
Definition AmrBoxLib.h:61
void postRegrid_m(int old_finest)
amr::AmrVectorFieldContainer_t AmrVectorFieldContainer_t
Definition AmrBoxLib.h:45
const int & maxLevel() const override
void RemakeLevel(int lev, AmrReal_t time, const AmrGrid_t &new_grids, const AmrProcMap_t &new_dmap)
AmrScalarFieldContainer_t phi_m
scalar potential on the grid for all levels
Definition AmrBoxLib.h:392
amr::AmrField_t AmrField_t
Definition AmrBoxLib.h:43
amr::AmrIntArray_t AmrIntArray_t
Definition AmrBoxLib.h:50
std::vector< bool > isFirstTagging_m
Definition AmrBoxLib.h:401
amr::AmrReal_t AmrReal_t
Definition AmrBoxLib.h:51
amrex::FArrayBox FArrayBox_t
Definition AmrBoxLib.h:57
void redistributeGrids(int how) override
double solvePoisson_m()
amr::AmrProcMapContainer_t AmrProcMapContainer_t
Definition AmrBoxLib.h:48
AmrLayout_t * layout_mp
Definition AmrBoxLib.h:386
void computeSelfFields() override
double getT() const override
amr::AmrGrid_t AmrGrid_t
Definition AmrBoxLib.h:52
VectorPair_t getEExtrema() override
AmrPartBunch * bunch_mp
bunch used for tagging strategies
Definition AmrBoxLib.h:383
amr::AmrScalarFieldContainer_t AmrScalarFieldContainer_t
Definition AmrBoxLib.h:44
void MakeNewLevel(int lev, AmrReal_t time, const AmrGrid_t &new_grids, const AmrProcMap_t &new_dmap)
void tagForEfield_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
void tagForMinNumParticles_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
amrex::TagBoxArray TagBoxArray_t
Definition AmrBoxLib.h:60
Vektor< int, 3 > getBaseLevelGridPoints() const override
void initBaseLevel_m(const AmrIntArray_t &nGridPts)
void updateMesh() override
void MakeNewLevelFromCoarse(int lev, AmrReal_t time, const AmrGrid_t &ba, const AmrProcMap_t &dm)
amr::AmrGeomContainer_t AmrGeomContainer_t
Definition AmrBoxLib.h:46
void doRegrid_m(int lbase, double time)
void tagForMomenta_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
double getRho(int x, int y, int z) override
void initFineLevels() override
void fillPhysbc_m(AmrField_t &mf, int lev=0)
amrex::TagBox TagBox_t
Definition AmrBoxLib.h:59
static std::unique_ptr< AmrBoxLib > create(const AmrInfo &info, AmrPartBunch *bunch_p)
Definition AmrBoxLib.cpp:74
void regrid(double time) override
void tagForChargeDensity_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
amr::AmrDomain_t AmrDomain_t
Definition AmrBoxLib.h:49
AmrVectorFieldContainer_t efield_m
vector field on the grid for all levels
Definition AmrBoxLib.h:395
const int & finestLevel() const override
static void initParmParse_m(const AmrInfo &info, AmrLayout_t *layout_p)
void ClearLevel(int lev)
bool isPoissonSolved_m
Definition AmrBoxLib.h:403
amr::AmrGridContainer_t AmrGridContainer_t
Definition AmrBoxLib.h:47
amr::AmrIntVect_t AmrIntVect_t
Definition AmrBoxLib.h:55
std::pair< Vector_t, Vector_t > VectorPair_t
Definition AmrObject.h:35