34 #include <AMReX_MultiFabUtil.H>
36 #include <AMReX_ParmParse.H>
37 #include <AMReX_BCUtil.H>
49 , amrex::AmrMesh(&domain, maxLevel, nGridPts, 0 )
51 , layout_mp(static_cast<
AmrLayout_t*>(&bunch_p->getLayout()))
54 , efield_m(maxLevel + 1)
55 , meshScaling_m(
Vector_t(1.0, 1.0, 1.0))
56 , isFirstTagging_m(maxLevel + 1, true)
57 , isPoissonSolved_m(false)
80 AmrDomain_t domain = layout_p->Geom(0).ProbDomain();
88 int maxlevel =
info.maxlevel;
95 return std::unique_ptr<AmrBoxLib>(
new AmrBoxLib(domain,
107 *gmsg <<
"* Start regriding:" <<
endl
108 <<
"* Old finest level: "
109 << finest_level <<
endl;
117 int old_finest = finest_level;
119 int lev_top =
std::min(finest_level, max_level - 1);
120 for (
int i = 0; i <= lev_top; ++i) {
122 lev_top =
std::min(finest_level, max_level - 1);
127 *
gmsg <<
"* New finest level: "
128 << finest_level <<
endl
129 <<
"* Finished regriding" <<
endl;
136 std::vector<int>& gridsPerLevel)
const
138 typedef std::vector<int> container_t;
140 gridPtsPerCore.clear();
141 gridsPerLevel.clear();
143 gridsPerLevel.resize(max_level + 1);
145 for (
int lev = 0; lev <= finest_level; ++lev) {
149 const container_t& pmap = this->dmap[lev].ProcessorMap();
152 gridsPerLevel[lev] = pmap.size();
155 for (
unsigned int i = 0; i < ba.size(); ++i) {
156 gridPtsPerCore[pmap[i]] += ba[i].numPts();
164 *
gmsg <<
"* Initialization of all levels" <<
endl;
174 if ( !isForbidTransform ) {
179 if ( max_level > 0 ) {
183 if ( !isForbidTransform ) {
189 *
gmsg <<
"* Initialization done." <<
endl;
201 for (
unsigned int lev = 0; lev <
efield_m.size(); ++lev) {
208 maxE[i] = (maxE[i] <
max) ?
max : maxE[i];
211 minE[i] = (minE[i] >
min) ?
min : minE[i];
221 throw OpalException(
"AmrBoxLib::getRho(x, y, z)",
"Not yet Implemented.");
228 throw OpalException(
"AmrBoxLib::computeSelfFields",
"Not yet Implemented.");
234 throw OpalException(
"AmrBoxLib::computeSelfFields(int bin)",
"Not yet Implemented.");
262 double invGamma = 1.0 / gamma;
263 int nLevel = finest_level + 1;
271 this->
phi_m[i]->mult(scalefactor * l0norm, 0, 1);
272 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
273 this->
efield_m[i][j]->mult(scalefactor * scalefactor * l0norm, 0, 1);
277 for (
int i = 0; i <= finest_level; ++i) {
278 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
279 if ( this->
efield_m[i][j]->contains_nan(
false) )
280 throw OpalException(
"AmrBoxLib::computeSelfFields_cycl(double gamma) ",
281 "Ef: NANs at level " + std::to_string(i) +
".");
313 for (
int i = 0; i < finest_level; ++i)
314 rr[i] = this->MaxRefRatio(i);
319 for (
int i = 0; i <= finest_level; ++i)
324 nLevel, time, scalefactor);
373 for (
int i = 0; i <= finest_level; ++i) {
376 if ( this->
rho_m[i]->contains_nan(
false) )
377 throw OpalException(
"AmrBoxLib::computeSelfFields_cycl(int bin) ",
378 "NANs at level " + std::to_string(i) +
".");
383 for (
int i = 0; i <= finest_level; ++i)
386 for (
int i = 0; i <= finest_level; ++i) {
387 this->
rho_m[i]->mult(1.0 / l0norm, 0, 1);
397 for (
int i = 0; i <= finest_level; ++i) {
399 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
410 for (
int i = 0; i <= finest_level; ++i) {
411 phi_m[i]->FillBoundary(geom[i].periodicity());
412 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
413 efield_m[i][j]->FillBoundary(geom[i].periodicity());
424 this->
phi_m[i]->mult(scalefactor * l0norm, 0, 1);
425 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
426 this->
efield_m[i][j]->mult(scalefactor * scalefactor * l0norm, 0, 1);
430 for (
int i = 0; i <= finest_level; ++i) {
431 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
432 if ( this->
efield_m[i][j]->contains_nan(
false) )
433 throw OpalException(
"AmrBoxLib::computeSelfFields_cycl(double gamma) ",
434 "Ef: NANs at level " + std::to_string(i) +
".");
461 int nLevel = finest_level + 1;
464 for (
int i = 0; i < finest_level; ++i)
465 rr[i] = this->MaxRefRatio(i);
470 for (
int i = 0; i <= finest_level; ++i)
475 nLevel, time, scalefactor);
486 const AmrReal_t* tmp = this->geom[0].CellSize();
489 for (
int i = 0; i < 3; ++i)
502 const Box_t& bx = this->geom[0].Domain();
508 high[1] - low[1] + 1,
509 high[2] - low[2] + 1);
514 return this->max_level;
519 return this->finest_level;
593 SetBoxArray(lev, new_grids);
594 SetDistributionMap(lev, new_dmap);
599 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
604 rho_m[lev]->setVal(0.0, 0);
605 phi_m[lev]->setVal(0.0, 1);
607 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
615 layout_mp->SetParticleBoxArray(lev, new_grids);
616 layout_mp->SetParticleDistributionMap(lev, new_dmap);
626 SetBoxArray(lev, new_grids);
627 SetDistributionMap(lev, new_dmap);
633 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
638 rho_m[lev]->setVal(0.0, 0);
639 phi_m[lev]->setVal(0.0, 1);
640 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
650 layout_mp->SetParticleBoxArray(lev, new_grids);
651 layout_mp->SetParticleDistributionMap(lev, new_dmap);
658 rho_m[lev].reset(
nullptr);
659 phi_m[lev].reset(
nullptr);
660 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
664 ClearDistributionMap(lev);
707 throw OpalException(
"AmrBoxLib::MakeNewLevelFromScratch()",
"Shouldn't be called.");
715 throw OpalException(
"AmrBoxLib::MakeNewLevelFromCoarse()",
"Shouldn't be called.");
723 MakeNewGrids(lbase, time, new_finest, new_grids);
725 PAssert(new_finest <= finest_level+1);
727 for (
int lev = lbase+1; lev <= new_finest; ++lev)
729 if (lev <= finest_level)
731 if (new_grids[lev] != grids[lev])
747 for (
int lev = new_finest+1; lev <= finest_level; ++lev) {
751 finest_level = new_finest;
783 amrpbase_p->
update(0, finest_level,
true);
788 for (
int lev = finest_level+1; lev <= old_finest; ++lev) {
789 if ( LocalNumPerLevel.getLocalNumAtLevel(lev) != 0 ) {
791 "Still particles on level " + std::to_string(lev) +
"!");
794 layout_mp->ClearParticleDistributionMap(lev);
800 std::string levelnum = std::to_string(LocalNumPerLevel.getLocalNumUpToLevel(finest_level));
802 "Number of particles do not agree: " + localnum +
" != " + levelnum);
823 for (
int i = 0; i <= finest_level; ++i) {
824 if ( this->
rho_m[i]->contains_nan(
false) )
826 "NANs at level " + std::to_string(i) +
".");
832 for (
int i = 0; i <= finest_level; ++i)
835 for (
int i = 0; i <= finest_level; ++i) {
836 this->
rho_m[i]->mult(1.0 / l0norm, 0, 1);
846 for (
int i = 0; i <= finest_level; ++i) {
847 phi_m[i]->FillBoundary(geom[i].periodicity());
848 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
849 efield_m[i][j]->FillBoundary(geom[i].periodicity());
864 amrpbase_p->
update(0, lev,
true);
866 for (
int i = lev; i <= finest_level; ++i)
875 for (
int i = lev; i <= finest_level; ++i)
876 rho_m[i]->mult(scalefactor, 0, 1);
878 const int clearval = TagBox_t::CLEAR;
879 const int tagval = TagBox_t::SET;
885 for (
MFIter_t mfi(*
rho_m[lev],
true); mfi.isValid(); ++mfi) {
886 const Box_t& tilebx = mfi.tilebox();
891 const int* tlo = tilebx.loVect();
892 const int* thi = tilebx.hiVect();
894 for (
int i = tlo[0]; i <= thi[0]; ++i) {
895 for (
int j = tlo[1]; j <= thi[1]; ++j) {
896 for (
int k = tlo[2]; k <= thi[2]; ++k) {
898 amrex::IntVect iv(D_DECL(i,j,k));
903 tagfab(iv) = clearval;
920 *
gmsg <<
level2 <<
"* Level " << lev <<
": We need to perform "
921 <<
"charge tagging if a new level is created." <<
endl;
928 const int clearval = TagBox_t::CLEAR;
929 const int tagval = TagBox_t::SET;
939 for (
MFIter_t mfi(*
phi_m[lev],
true); mfi.isValid(); ++mfi) {
941 const Box_t& tilebx = mfi.tilebox();
945 const int* tlo = tilebx.loVect();
946 const int* thi = tilebx.hiVect();
948 for (
int i = tlo[0]; i <= thi[0]; ++i) {
949 for (
int j = tlo[1]; j <= thi[1]; ++j) {
950 for (
int k = tlo[2]; k <= thi[2]; ++k) {
952 amrex::IntVect iv(D_DECL(i,j,k));
954 if (
std::abs( fab(iv) ) >= threshold )
957 tagfab(iv) = clearval;
974 *
gmsg <<
level2 <<
"* Level " << lev <<
": We need to perform "
975 <<
"charge tagging if a new level is created." <<
endl;
982 const int clearval = TagBox_t::CLEAR;
983 const int tagval = TagBox_t::SET;
986 amrex::Vector<AmrReal_t> threshold(AMREX_SPACEDIM);
988 for (
int i = 0; i < 3; ++i) {
989 threshold[i] =
efield_m[lev][i]->norm0(0,
1000 for (
MFIter_t mfi(this->grids[lev], this->dmap[lev],
true); mfi.isValid(); ++mfi) {
1002 const Box_t& tilebx = mfi.tilebox();
1008 const int* tlo = tilebx.loVect();
1009 const int* thi = tilebx.hiVect();
1011 for (
int i = tlo[0]; i <= thi[0]; ++i) {
1012 for (
int j = tlo[1]; j <= thi[1]; ++j) {
1013 for (
int k = tlo[2]; k <= thi[2]; ++k) {
1015 if (
std::abs(xfab(iv)) >= threshold[0])
1016 tagfab(iv) = tagval;
1017 else if (
std::abs(yfab(iv)) >= threshold[1])
1018 tagfab(iv) = tagval;
1019 else if (
std::abs(zfab(iv)) >= threshold[2])
1020 tagfab(iv) = tagval;
1022 tagfab(iv) = clearval;
1036 amrpbase_p->
update(0, lev,
true);
1039 size_t lBegin = LocalNumPerLevel.
begin(lev);
1040 size_t lEnd = LocalNumPerLevel.end(lev);
1043 for (
size_t i = lBegin; i < lEnd; ++i) {
1045 pmax = (
dot(tmp, tmp) >
dot(pmax, pmax) ) ? tmp : pmax;
1050 std::map<AmrIntVect_t, bool> cells;
1051 for (
size_t i = lBegin; i < lEnd; ++i) {
1058 const int clearval = TagBox_t::CLEAR;
1059 const int tagval = TagBox_t::SET;
1063 #pragma omp parallel
1066 for (
MFIter_t mfi(*
rho_m[lev],
true); mfi.isValid(); ++mfi) {
1068 const Box_t& tilebx = mfi.tilebox();
1071 const int* tlo = tilebx.loVect();
1072 const int* thi = tilebx.hiVect();
1074 for (
int i = tlo[0]; i <= thi[0]; ++i) {
1075 for (
int j = tlo[1]; j <= thi[1]; ++j) {
1076 for (
int k = tlo[2]; k <= thi[2]; ++k) {
1078 if ( cells.find(iv) != cells.end() )
1079 tagfab(iv) = tagval;
1081 tagfab(iv) = clearval;
1095 amrpbase_p->
update(0, lev,
true);
1098 size_t lBegin = LocalNumPerLevel.
begin(lev);
1099 size_t lEnd = LocalNumPerLevel.end(lev);
1102 std::map<AmrIntVect_t, size_t> cells;
1103 for (
size_t i = lBegin; i < lEnd; ++i) {
1108 const int clearval = TagBox_t::CLEAR;
1109 const int tagval = TagBox_t::SET;
1113 #pragma omp parallel
1116 for (
MFIter_t mfi(*
rho_m[lev],
true); mfi.isValid(); ++mfi) {
1118 const Box_t& tilebx = mfi.tilebox();
1121 const int* tlo = tilebx.loVect();
1122 const int* thi = tilebx.hiVect();
1124 for (
int i = tlo[0]; i <= thi[0]; ++i) {
1125 for (
int j = tlo[1]; j <= thi[1]; ++j) {
1126 for (
int k = tlo[2]; k <= thi[2]; ++k) {
1128 if ( cells.find(iv) != cells.end() && cells[iv] <=
maxNumPart_m )
1129 tagfab(iv) = tagval;
1131 tagfab(iv) = clearval;
1145 amrpbase_p->
update(0, lev,
true);
1148 size_t lBegin = LocalNumPerLevel.
begin(lev);
1149 size_t lEnd = LocalNumPerLevel.end(lev);
1152 std::map<AmrIntVect_t, size_t> cells;
1153 for (
size_t i = lBegin; i < lEnd; ++i) {
1158 const int clearval = TagBox_t::CLEAR;
1159 const int tagval = TagBox_t::SET;
1163 #pragma omp parallel
1166 for (
MFIter_t mfi(*
rho_m[lev],
true); mfi.isValid(); ++mfi) {
1168 const Box_t& tilebx = mfi.tilebox();
1171 const int* tlo = tilebx.loVect();
1172 const int* thi = tilebx.hiVect();
1174 for (
int i = tlo[0]; i <= thi[0]; ++i) {
1175 for (
int j = tlo[1]; j <= thi[1]; ++j) {
1176 for (
int k = tlo[2]; k <= thi[2]; ++k) {
1178 if ( cells.find(iv) != cells.end() &&
1181 tagfab(iv) = tagval;
1183 tagfab(iv) = clearval;
1201 const Box_t bx(low, high);
1203 ba.maxSize( this->maxGridSize(0) );
1206 ba = this->MakeBaseGrids();
1209 dmap.define(ba, amrex::ParallelDescriptor::NProcs());
1223 amrex::ParmParse pAmr(
"amr");
1224 pAmr.add(
"max_grid_size_x",
info.maxgrid[0]);
1225 pAmr.add(
"max_grid_size_y",
info.maxgrid[1]);
1226 pAmr.add(
"max_grid_size_z",
info.maxgrid[2]);
1228 pAmr.add(
"blocking_factor_x",
info.bf[0]);
1229 pAmr.add(
"blocking_factor_y",
info.bf[1]);
1230 pAmr.add(
"blocking_factor_z",
info.bf[2]);
1232 const int nratios_vect =
info.maxlevel * AMREX_SPACEDIM;
1236 for (
int i = 0; i <
info.maxlevel; ++i) {
1237 refratio[i * AMREX_SPACEDIM] =
info.refratio[0];
1238 refratio[i * AMREX_SPACEDIM + 1] =
info.refratio[1];
1239 refratio[i * AMREX_SPACEDIM + 2] =
info.refratio[2];
1242 pAmr.addarr(
"ref_ratio_vect", refratio);
1244 amrex::ParmParse pGeom(
"geometry");
1246 layout_p->Geom(0).isPeriodic(0),
1247 layout_p->Geom(0).isPeriodic(1),
1248 layout_p->Geom(0).isPeriodic(2)
1250 pGeom.addarr(
"is_periodic", isPeriodic);
1462 pAmr.add(
"n_proper", 1);
1465 pAmr.add(
"grid_eff", 0.95);
1467 int nlev =
info.maxlevel + 1;
1472 pAmr.addarr(
"n_error_buf", error_buf);
1475 pAmr.add(
"refine_grid_layout",
true);
1487 amrex::ParmParse pDmap(
"DistributionMapping");
1493 pDmap.add(
"efficiency", 0.9);
1496 pDmap.add(
"sfc_threshold", 0);
1506 pDmap.add(
"node_size", 0);
1515 pDmap.add(
"strategy",
"SFC");
1530 if (AmrGeometry_t::isAllPeriodic())
1533 amrex::Vector<amrex::BCRec> bc(mf.nComp());
1534 for (
int n = 0;
n < mf.nComp(); ++
n)
1536 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim)
1538 if (AmrGeometry_t::isPeriodic(idim))
1540 bc[
n].setLo(idim, amrex::BCType::int_dir);
1541 bc[
n].setHi(idim, amrex::BCType::int_dir);
1545 bc[
n].setLo(idim, amrex::BCType::foextrap);
1546 bc[
n].setHi(idim, amrex::BCType::foextrap);
1551 amrex::FillDomainBoundary(mf, this->geom[lev], bc);
Tps< T > sqrt(const Tps< T > &x)
Square root.
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
Inform & endl(Inform &inf)
Inform & level2(Inform &inf)
constexpr double epsilon_0
The permittivity of vacuum in As/Vm.
constexpr double c
The velocity of light in m/s.
int amrRegridFreq
After how many steps the AMR grid hierarchy is updated.
int amrYtDumpFreq
The frequency to dump AMR grid data and particles into file.
ParticleLayout< T, Dim > & getLayout()
ParticleAttrib< Vector_t > Ef
ParticleAttrib< int > Bin
ParticleAttrib< Vector_t > Eftmp
size_t getLocalNum() const
ParticleAttrib< Vector_t > P
double getBinGamma(int bin)
Get gamma of one bin.
ParticleAttrib< double > Q
long long getLocalTrackStep() const
short getNumBunch() const
static const unsigned Dimension
ParticleAttrib< Vector_t > Bf
amr::AmrProcMap_t AmrProcMap_t
Vector_t meshScaling_m
in particle rest frame, the longitudinal length enlarged
const Vector_t & getMeshScaling() const
void redistributeGrids(int how)
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) override
const int & maxLevel() const
AmrBoxLib(const AmrDomain_t &domain, const AmrIntArray_t &nGridPts, int maxLevel, AmrPartBunch *bunch_p)
AmrScalarFieldContainer_t rho_m
charge density on the grid for all levels
void tagForPotentialStrength_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
VectorPair_t getEExtrema()
void getGridStatistics(std::map< int, long > &gridPtsPerCore, std::vector< int > &gridsPerLevel) const
void tagForMaxNumParticles_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
void postRegrid_m(int old_finest)
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
amr::AmrField_t AmrField_t
amr::AmrIntArray_t AmrIntArray_t
std::vector< bool > isFirstTagging_m
void computeSelfFields_cycl(double gamma)
amrex::FArrayBox FArrayBox_t
AmrPartBunch * bunch_mp
bunch used for tagging strategies
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
void initBaseLevel_m(const AmrIntArray_t &nGridPts)
void MakeNewLevelFromCoarse(int lev, AmrReal_t time, const AmrGrid_t &ba, const AmrProcMap_t &dm)
const int & finestLevel() const
void doRegrid_m(int lbase, double time)
void tagForMomenta_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
void fillPhysbc_m(AmrField_t &mf, int lev=0)
static std::unique_ptr< AmrBoxLib > create(const AmrInfo &info, AmrPartBunch *bunch_p)
void tagForChargeDensity_m(int lev, TagBoxArray_t &tags, AmrReal_t time, int ngrow)
amr::AmrDomain_t AmrDomain_t
AmrVectorFieldContainer_t efield_m
vector field on the grid for all levels
static void initParmParse_m(const AmrInfo &info, AmrLayout_t *layout_p)
Vektor< int, 3 > getBaseLevelGridPoints() const
amr::AmrGridContainer_t AmrGridContainer_t
amr::AmrIntVect_t AmrIntVect_t
double getRho(int x, int y, int z)
double scaling_m
Scaling factor for tagging [0, 1].
IpplTimings::TimerRef amrRegridTimer_m
@ MIN_NUM_PARTICLES
min. #particles per cell
@ MAX_NUM_PARTICLES
max. #particles per cell
std::pair< Vector_t, Vector_t > VectorPair_t
double chargedensity_m
Tagging value for CHARGE_DENSITY.
bool refined_m
Only set to true in AmrObject::initFineLevels()
TaggingCriteria tagging_m
Tagging strategy.
IpplTimings::TimerRef amrSolveTimer_m
timer for selfField calculation (used in concrete AmrObject classes)
size_t minNumPart_m
Tagging value for MIN_NUM_PARTICLES.
size_t maxNumPart_m
Tagging value for MAX_NUM_PARTICLES.
void writeFields(const amr::AmrScalarFieldContainer_t &rho, const amr::AmrScalarFieldContainer_t &phi, const amr::AmrVectorFieldContainer_t &efield, const amr::AmrIntArray_t &refRatio, const amr::AmrGeomContainer_t &geom, const int &nLevel, const double &time, const double &scale)
void writeBunch(const AmrPartBunch *bunch_p, const double &time, const double &gamma)
void buildLevelMask(int lev, const int ncells=1)
void clearLevelMask(int lev)
AmrIntVect_t Index(AmrParticleBase< BoxLibLayout< T, Dim > > &p, const unsigned int ip, int level) const
void resize(int maxLevel)
void define(const AmrGeomContainer_t &geom)
void gather(ParticleAttrib< FT > &attrib, AmrVectorFieldContainer_t &f, ParticleAttrib< Vektor< PT, Dim > > &pp, int lbase, int lfine)
void scatter(ParticleAttrib< FT > &attrib, AmrScalarFieldContainer_t &f, ParticleAttrib< Vektor< PT, Dim > > &pp, int lbase, int lfine, const ParticleAttrib< int > &pbin, int bin=-1)
void updateLorentzFactor(int bin=0)
void setBaseLevelMeshSpacing(const Vector_t &hr)
PoissonSolver * getFieldSolver()
pbase_t * getAmrParticleBase()
virtual void solve(AmrScalarFieldContainer_t &, AmrScalarFieldContainer_t &, AmrVectorFieldContainer_t &, unsigned short, unsigned short, bool=true)
virtual void hasToRegrid()
The base class for all OPAL exceptions.
bool isForbidTransform() const
const double & getScalingFactor() const
const ParticleLevelCounter_t & getLocalNumPerLevel() const
void setForbidTransform(bool forbidTransform)
const double & domainMapping(bool inverse=false)
void setFinestLevel(int finestLevel)
static void stopTimer(TimerRef t)
static void startTimer(TimerRef t)
Vektor< double, 3 > Vector_t