36#include <AMReX_MultiFabUtil.H>
38#include <AMReX_ParmParse.H>
39#include <AMReX_BCUtil.H>
51 , amrex::AmrMesh(&domain, maxLevel, nGridPts, 0 )
53 , layout_mp(static_cast<
AmrLayout_t*>(&bunch_p->getLayout()))
56 , efield_m(maxLevel + 1)
57 , meshScaling_m(
Vector_t(1.0, 1.0, 1.0))
58 , isFirstTagging_m(maxLevel + 1, true)
59 , isPoissonSolved_m(false)
82 AmrDomain_t domain = layout_p->Geom(0).ProbDomain();
90 int maxlevel =
info.maxlevel;
97 return std::unique_ptr<AmrBoxLib>(
new AmrBoxLib(domain,
109 *gmsg <<
"* Start regriding:" <<
endl
110 <<
"* Old finest level: "
111 << finest_level <<
endl;
119 int old_finest = finest_level;
121 int lev_top =
std::min(finest_level, max_level - 1);
122 for (
int i = 0; i <= lev_top; ++i) {
124 lev_top =
std::min(finest_level, max_level - 1);
129 *
gmsg <<
"* New finest level: "
130 << finest_level <<
endl
131 <<
"* Finished regriding" <<
endl;
138 std::vector<int>& gridsPerLevel)
const
140 typedef std::vector<int> container_t;
142 gridPtsPerCore.clear();
143 gridsPerLevel.clear();
145 gridsPerLevel.resize(max_level + 1);
147 for (
int lev = 0; lev <= finest_level; ++lev) {
151 const container_t& pmap = this->dmap[lev].ProcessorMap();
154 gridsPerLevel[lev] = pmap.size();
157 for (
unsigned int i = 0; i < ba.size(); ++i) {
158 gridPtsPerCore[pmap[i]] += ba[i].numPts();
166 *
gmsg <<
"* Initialization of all levels" <<
endl;
176 if ( !isForbidTransform ) {
181 if ( max_level > 0 ) {
185 if ( !isForbidTransform ) {
191 *
gmsg <<
"* Initialization done." <<
endl;
203 for (
unsigned int lev = 0; lev <
efield_m.size(); ++lev) {
210 maxE[i] = (maxE[i] <
max) ?
max : maxE[i];
213 minE[i] = (minE[i] >
min) ?
min : minE[i];
223 throw OpalException(
"AmrBoxLib::getRho(x, y, z)",
"Not yet Implemented.");
230 throw OpalException(
"AmrBoxLib::computeSelfFields",
"Not yet Implemented.");
236 throw OpalException(
"AmrBoxLib::computeSelfFields(int bin)",
"Not yet Implemented.");
264 double invGamma = 1.0 / gamma;
265 int nLevel = finest_level + 1;
273 this->
phi_m[i]->mult(scalefactor * l0norm, 0, 1);
274 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
275 this->
efield_m[i][j]->mult(scalefactor * scalefactor * l0norm, 0, 1);
279 for (
int i = 0; i <= finest_level; ++i) {
280 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
281 if ( this->
efield_m[i][j]->contains_nan(
false) )
282 throw OpalException(
"AmrBoxLib::computeSelfFields_cycl(double gamma) ",
283 "Ef: NANs at level " + std::to_string(i) +
".");
315 for (
int i = 0; i < finest_level; ++i)
316 rr[i] = this->MaxRefRatio(i);
321 for (
int i = 0; i <= finest_level; ++i)
326 nLevel, time, scalefactor);
375 for (
int i = 0; i <= finest_level; ++i) {
378 if ( this->
rho_m[i]->contains_nan(
false) )
379 throw OpalException(
"AmrBoxLib::computeSelfFields_cycl(int bin) ",
380 "NANs at level " + std::to_string(i) +
".");
385 for (
int i = 0; i <= finest_level; ++i)
388 for (
int i = 0; i <= finest_level; ++i) {
389 this->
rho_m[i]->mult(1.0 / l0norm, 0, 1);
399 for (
int i = 0; i <= finest_level; ++i) {
401 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
412 for (
int i = 0; i <= finest_level; ++i) {
413 phi_m[i]->FillBoundary(geom[i].periodicity());
414 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
415 efield_m[i][j]->FillBoundary(geom[i].periodicity());
426 this->
phi_m[i]->mult(scalefactor * l0norm, 0, 1);
427 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
428 this->
efield_m[i][j]->mult(scalefactor * scalefactor * l0norm, 0, 1);
432 for (
int i = 0; i <= finest_level; ++i) {
433 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
434 if ( this->
efield_m[i][j]->contains_nan(
false) )
435 throw OpalException(
"AmrBoxLib::computeSelfFields_cycl(double gamma) ",
436 "Ef: NANs at level " + std::to_string(i) +
".");
463 int nLevel = finest_level + 1;
466 for (
int i = 0; i < finest_level; ++i)
467 rr[i] = this->MaxRefRatio(i);
472 for (
int i = 0; i <= finest_level; ++i)
477 nLevel, time, scalefactor);
488 const AmrReal_t* tmp = this->geom[0].CellSize();
491 for (
int i = 0; i < 3; ++i)
504 const Box_t& bx = this->geom[0].Domain();
510 high[1] - low[1] + 1,
511 high[2] - low[2] + 1);
516 return this->max_level;
521 return this->finest_level;
595 SetBoxArray(lev, new_grids);
596 SetDistributionMap(lev, new_dmap);
601 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
606 rho_m[lev]->setVal(0.0, 0);
607 phi_m[lev]->setVal(0.0, 1);
609 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
617 layout_mp->SetParticleBoxArray(lev, new_grids);
618 layout_mp->SetParticleDistributionMap(lev, new_dmap);
628 SetBoxArray(lev, new_grids);
629 SetDistributionMap(lev, new_dmap);
635 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
640 rho_m[lev]->setVal(0.0, 0);
641 phi_m[lev]->setVal(0.0, 1);
642 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
652 layout_mp->SetParticleBoxArray(lev, new_grids);
653 layout_mp->SetParticleDistributionMap(lev, new_dmap);
660 rho_m[lev].reset(
nullptr);
661 phi_m[lev].reset(
nullptr);
662 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
666 ClearDistributionMap(lev);
709 throw OpalException(
"AmrBoxLib::MakeNewLevelFromScratch()",
"Shouldn't be called.");
717 throw OpalException(
"AmrBoxLib::MakeNewLevelFromCoarse()",
"Shouldn't be called.");
725 MakeNewGrids(lbase, time, new_finest, new_grids);
727 PAssert(new_finest <= finest_level+1);
729 for (
int lev = lbase+1; lev <= new_finest; ++lev)
731 if (lev <= finest_level)
733 if (new_grids[lev] != grids[lev])
749 for (
int lev = new_finest+1; lev <= finest_level; ++lev) {
753 finest_level = new_finest;
785 amrpbase_p->
update(0, finest_level,
true);
790 for (
int lev = finest_level+1; lev <= old_finest; ++lev) {
791 if ( LocalNumPerLevel.getLocalNumAtLevel(lev) != 0 ) {
793 "Still particles on level " + std::to_string(lev) +
"!");
796 layout_mp->ClearParticleDistributionMap(lev);
802 std::string levelnum = std::to_string(LocalNumPerLevel.getLocalNumUpToLevel(finest_level));
804 "Number of particles do not agree: " + localnum +
" != " + levelnum);
825 for (
int i = 0; i <= finest_level; ++i) {
826 if ( this->
rho_m[i]->contains_nan(
false) )
828 "NANs at level " + std::to_string(i) +
".");
834 for (
int i = 0; i <= finest_level; ++i)
837 for (
int i = 0; i <= finest_level; ++i) {
838 this->
rho_m[i]->mult(1.0 / l0norm, 0, 1);
848 for (
int i = 0; i <= finest_level; ++i) {
849 phi_m[i]->FillBoundary(geom[i].periodicity());
850 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
851 efield_m[i][j]->FillBoundary(geom[i].periodicity());
866 amrpbase_p->
update(0, lev,
true);
868 for (
int i = lev; i <= finest_level; ++i)
877 for (
int i = lev; i <= finest_level; ++i)
878 rho_m[i]->mult(scalefactor, 0, 1);
880 const int clearval = TagBox_t::CLEAR;
881 const int tagval = TagBox_t::SET;
887 for (
MFIter_t mfi(*
rho_m[lev],
true); mfi.isValid(); ++mfi) {
888 const Box_t& tilebx = mfi.tilebox();
893 const int* tlo = tilebx.loVect();
894 const int* thi = tilebx.hiVect();
896 for (
int i = tlo[0]; i <= thi[0]; ++i) {
897 for (
int j = tlo[1]; j <= thi[1]; ++j) {
898 for (
int k = tlo[2]; k <= thi[2]; ++k) {
900 amrex::IntVect iv(D_DECL(i,j,k));
905 tagfab(iv) = clearval;
922 *
gmsg <<
level2 <<
"* Level " << lev <<
": We need to perform "
923 <<
"charge tagging if a new level is created." <<
endl;
930 const int clearval = TagBox_t::CLEAR;
931 const int tagval = TagBox_t::SET;
941 for (
MFIter_t mfi(*
phi_m[lev],
true); mfi.isValid(); ++mfi) {
943 const Box_t& tilebx = mfi.tilebox();
947 const int* tlo = tilebx.loVect();
948 const int* thi = tilebx.hiVect();
950 for (
int i = tlo[0]; i <= thi[0]; ++i) {
951 for (
int j = tlo[1]; j <= thi[1]; ++j) {
952 for (
int k = tlo[2]; k <= thi[2]; ++k) {
954 amrex::IntVect iv(D_DECL(i,j,k));
956 if (
std::abs( fab(iv) ) >= threshold )
959 tagfab(iv) = clearval;
976 *
gmsg <<
level2 <<
"* Level " << lev <<
": We need to perform "
977 <<
"charge tagging if a new level is created." <<
endl;
984 const int clearval = TagBox_t::CLEAR;
985 const int tagval = TagBox_t::SET;
988 amrex::Vector<AmrReal_t> threshold(AMREX_SPACEDIM);
990 for (
int i = 0; i < 3; ++i) {
991 threshold[i] =
efield_m[lev][i]->norm0(0,
1002 for (
MFIter_t mfi(this->grids[lev], this->dmap[lev],
true); mfi.isValid(); ++mfi) {
1004 const Box_t& tilebx = mfi.tilebox();
1010 const int* tlo = tilebx.loVect();
1011 const int* thi = tilebx.hiVect();
1013 for (
int i = tlo[0]; i <= thi[0]; ++i) {
1014 for (
int j = tlo[1]; j <= thi[1]; ++j) {
1015 for (
int k = tlo[2]; k <= thi[2]; ++k) {
1017 if (
std::abs(xfab(iv)) >= threshold[0])
1018 tagfab(iv) = tagval;
1019 else if (
std::abs(yfab(iv)) >= threshold[1])
1020 tagfab(iv) = tagval;
1021 else if (
std::abs(zfab(iv)) >= threshold[2])
1022 tagfab(iv) = tagval;
1024 tagfab(iv) = clearval;
1038 amrpbase_p->
update(0, lev,
true);
1041 size_t lBegin = LocalNumPerLevel.
begin(lev);
1042 size_t lEnd = LocalNumPerLevel.end(lev);
1045 for (
size_t i = lBegin; i < lEnd; ++i) {
1047 pmax = (
dot(tmp, tmp) >
dot(pmax, pmax) ) ? tmp : pmax;
1052 std::map<AmrIntVect_t, bool> cells;
1053 for (
size_t i = lBegin; i < lEnd; ++i) {
1060 const int clearval = TagBox_t::CLEAR;
1061 const int tagval = TagBox_t::SET;
1068 for (
MFIter_t mfi(*
rho_m[lev],
true); mfi.isValid(); ++mfi) {
1070 const Box_t& tilebx = mfi.tilebox();
1073 const int* tlo = tilebx.loVect();
1074 const int* thi = tilebx.hiVect();
1076 for (
int i = tlo[0]; i <= thi[0]; ++i) {
1077 for (
int j = tlo[1]; j <= thi[1]; ++j) {
1078 for (
int k = tlo[2]; k <= thi[2]; ++k) {
1080 if ( cells.find(iv) != cells.end() )
1081 tagfab(iv) = tagval;
1083 tagfab(iv) = clearval;
1097 amrpbase_p->
update(0, lev,
true);
1100 size_t lBegin = LocalNumPerLevel.
begin(lev);
1101 size_t lEnd = LocalNumPerLevel.end(lev);
1104 std::map<AmrIntVect_t, size_t> cells;
1105 for (
size_t i = lBegin; i < lEnd; ++i) {
1110 const int clearval = TagBox_t::CLEAR;
1111 const int tagval = TagBox_t::SET;
1118 for (
MFIter_t mfi(*
rho_m[lev],
true); mfi.isValid(); ++mfi) {
1120 const Box_t& tilebx = mfi.tilebox();
1123 const int* tlo = tilebx.loVect();
1124 const int* thi = tilebx.hiVect();
1126 for (
int i = tlo[0]; i <= thi[0]; ++i) {
1127 for (
int j = tlo[1]; j <= thi[1]; ++j) {
1128 for (
int k = tlo[2]; k <= thi[2]; ++k) {
1130 if ( cells.find(iv) != cells.end() && cells[iv] <=
maxNumPart_m )
1131 tagfab(iv) = tagval;
1133 tagfab(iv) = clearval;
1147 amrpbase_p->
update(0, lev,
true);
1150 size_t lBegin = LocalNumPerLevel.
begin(lev);
1151 size_t lEnd = LocalNumPerLevel.end(lev);
1154 std::map<AmrIntVect_t, size_t> cells;
1155 for (
size_t i = lBegin; i < lEnd; ++i) {
1160 const int clearval = TagBox_t::CLEAR;
1161 const int tagval = TagBox_t::SET;
1168 for (
MFIter_t mfi(*
rho_m[lev],
true); mfi.isValid(); ++mfi) {
1170 const Box_t& tilebx = mfi.tilebox();
1173 const int* tlo = tilebx.loVect();
1174 const int* thi = tilebx.hiVect();
1176 for (
int i = tlo[0]; i <= thi[0]; ++i) {
1177 for (
int j = tlo[1]; j <= thi[1]; ++j) {
1178 for (
int k = tlo[2]; k <= thi[2]; ++k) {
1180 if ( cells.find(iv) != cells.end() &&
1183 tagfab(iv) = tagval;
1185 tagfab(iv) = clearval;
1203 const Box_t bx(low, high);
1205 ba.maxSize( this->maxGridSize(0) );
1208 ba = this->MakeBaseGrids();
1211 dmap.define(ba, amrex::ParallelDescriptor::NProcs());
1225 amrex::ParmParse pAmr(
"amr");
1226 pAmr.add(
"max_grid_size_x",
info.maxgrid[0]);
1227 pAmr.add(
"max_grid_size_y",
info.maxgrid[1]);
1228 pAmr.add(
"max_grid_size_z",
info.maxgrid[2]);
1230 pAmr.add(
"blocking_factor_x",
info.bf[0]);
1231 pAmr.add(
"blocking_factor_y",
info.bf[1]);
1232 pAmr.add(
"blocking_factor_z",
info.bf[2]);
1234 const int nratios_vect =
info.maxlevel * AMREX_SPACEDIM;
1238 for (
int i = 0; i <
info.maxlevel; ++i) {
1239 refratio[i * AMREX_SPACEDIM] =
info.refratio[0];
1240 refratio[i * AMREX_SPACEDIM + 1] =
info.refratio[1];
1241 refratio[i * AMREX_SPACEDIM + 2] =
info.refratio[2];
1244 pAmr.addarr(
"ref_ratio_vect", refratio);
1246 amrex::ParmParse pGeom(
"geometry");
1248 layout_p->Geom(0).isPeriodic(0),
1249 layout_p->Geom(0).isPeriodic(1),
1250 layout_p->Geom(0).isPeriodic(2)
1252 pGeom.addarr(
"is_periodic", isPeriodic);
1464 pAmr.add(
"n_proper", 1);
1467 pAmr.add(
"grid_eff", 0.95);
1469 int nlev =
info.maxlevel + 1;
1474 pAmr.addarr(
"n_error_buf", error_buf);
1477 pAmr.add(
"refine_grid_layout",
true);
1489 amrex::ParmParse pDmap(
"DistributionMapping");
1495 pDmap.add(
"efficiency", 0.9);
1498 pDmap.add(
"sfc_threshold", 0);
1508 pDmap.add(
"node_size", 0);
1517 pDmap.add(
"strategy",
"SFC");
1532 if (AmrGeometry_t::isAllPeriodic())
1535 amrex::Vector<amrex::BCRec> bc(mf.nComp());
1536 for (
int n = 0;
n < mf.nComp(); ++
n)
1538 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim)
1540 if (AmrGeometry_t::isPeriodic(idim))
1542 bc[
n].setLo(idim, amrex::BCType::int_dir);
1543 bc[
n].setHi(idim, amrex::BCType::int_dir);
1547 bc[
n].setLo(idim, amrex::BCType::foextrap);
1548 bc[
n].setHi(idim, amrex::BCType::foextrap);
1553 amrex::FillDomainBoundary(mf, this->geom[lev], bc);
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.
Tps< T > sqrt(const Tps< T > &x)
Square root.
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 & level2(Inform &inf)
Inform & endl(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