13#ifndef CD_ITOLAYOUTIMPLEM_H
14#define CD_ITOLAYOUTIMPLEM_H
22#include <CD_NamespaceHeader.H>
27 this->define(a_species);
55 for (
auto solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
56 solver_it()->setRealm(m_realm);
72 iter()->parseOptions();
81 iter()->parseRuntimeOptions();
98 m_solvers.push_back(a_solver);
106 iter()->interpolateVelocities();
115 iter()->preRegrid(a_lbase, a_finestLevel);
124 iter()->initialData();
133 iter()->regrid(a_lmin, a_oldFinestLevel, a_newFinestLevel);
142 iter()->registerOperators();
151 iter()->setAmr(a_amrMesh);
160 iter()->setComputationalGeometry(a_computationalGeometry);
169 iter()->setPhase(a_phase);
178 iter()->setVerbosity(a_verbosity);
187 iter()->setTime(a_step, a_time, a_dt);
196 iter()->organizeParticlesByCell(a_whichContainer);
205 iter()->organizeParticlesByPatch(a_whichContainer);
214 iter()->makeSuperparticles(a_whichContainer);
223 iter()->makeSuperparticles(a_whichContainer, a_ppc);
232 iter()->makeSuperparticles(a_whichContainer, a_ppc);
239 const Vector<int>& a_ppc,
243 iter()->makeSuperparticles(a_whichContainer, a_ppc, a_method);
251 this->depositParticles(ItoSolver::WhichContainer::Bulk);
259 iter()->depositParticles(a_whichContainer);
267 this->remap(ItoSolver::WhichContainer::Bulk);
275 iter()->remap(a_whichContainer);
284 for (
auto iter = this->iterator(); iter.ok(); ++iter) {
285 ret += iter()->getNumParticles(a_whichContainer, a_localOnly);
295 Real minDt = std::numeric_limits<Real>::max();
298 const Real thisDt = iter()->computeDt();
299 minDt = std::min(minDt, thisDt);
309 Real minDt = std::numeric_limits<Real>::max();
312 const Real thisDt = iter()->computeAdvectiveDt();
313 minDt = std::min(minDt, thisDt);
323 Real minDt = std::numeric_limits<Real>::max();
326 const Real thisDt = iter()->computeHopDt(a_maxCellsToMove);
327 minDt = std::min(minDt, thisDt);
337 Real minDt = std::numeric_limits<Real>::max();
340 const Real thisDt = iter()->computeDiffusiveDt();
341 minDt = std::min(minDt, thisDt);
348Vector<RefCountedPtr<T>>&
355Vector<RefCountedPtr<ItoSpecies>>&
362Vector<EBAMRCellData*>
365 Vector<EBAMRCellData*> ret(m_solvers.size(),
nullptr);
367 ret[iter.index()] = &(iter()->getVelocityFunction());
374Vector<EBAMRCellData*>
377 Vector<EBAMRCellData*> ret(m_solvers.size(),
nullptr);
379 ret[iter.index()] = &(iter()->getPhi());
386Vector<EBAMRCellData*>
389 Vector<EBAMRCellData*> ret(m_solvers.size(),
nullptr);
391 ret[iter.index()] = &(iter()->getDiffusionFunction());
398Vector<EBAMRCellData*>
401 Vector<EBAMRCellData*> ret(m_solvers.size(),
nullptr);
403 ret[iter.index()] = &(iter()->getMobilityFunction());
410Vector<ParticleContainer<ItoParticle>*>
413 Vector<ParticleContainer<ItoParticle>*> ret(m_solvers.size(),
nullptr);
415 ret[iter.index()] = &(iter()->getParticles(a_container));
428template <
class T,
class S>
432template <
class T,
class S>
436template <
class T,
class S>
437RefCountedPtr<ItoLayout<T>>
441 auto itoLayout = RefCountedPtr<ItoLayout<T>>(
new ItoLayout<T>(a_species));
444 for (
int i = 0; i < a_species.size(); i++) {
445 RefCountedPtr<T> solver = RefCountedPtr<T>(
static_cast<T*
>(
new S()));
446 solver->setSpecies(a_species[i]);
447 solver->setVerbosity(-1);
448 itoLayout->addSolver(solver);
454#include <CD_NamespaceFooter.H>
Declaration of an iterator class for ItoLayout.
Declaration of a class that holds a set of ItoSolvers.
~ItoFactory()
Destructor (does nothing).
Definition CD_ItoLayoutImplem.H:433
RefCountedPtr< ItoLayout< T > > newLayout(const Vector< RefCountedPtr< ItoSpecies > > &a_species) const
Factory method which creates a new layout from a set of species. This can do automated casting betwee...
Definition CD_ItoLayoutImplem.H:438
ItoFactory()
Constructor.
Definition CD_ItoLayoutImplem.H:429
"Iterator" class for going through solvers in an ItoLayout.
Definition CD_ItoIterator.H:26
virtual bool ok()
Ok or not.
Definition CD_ItoIteratorImplem.H:72
Class for holding a set of ItoSolvers.
Definition CD_ItoLayout.H:32
virtual Real computeAdvectiveDt()
Compute the classical advection time step for all solvers. This returns dt = dx/max(v) where max(v) t...
Definition CD_ItoLayoutImplem.H:307
virtual void makeSuperparticles(const ItoSolver::WhichContainer a_whichContainer)
Rearrange the input container particles into new superparticles for all solvers, each merging to its ...
Definition CD_ItoLayoutImplem.H:211
virtual void allocate()
Allocate internals for all solvers.
Definition CD_ItoLayoutImplem.H:87
virtual void parseRuntimeOptions()
Utility function – parse runtime options for all solvers.
Definition CD_ItoLayoutImplem.H:78
virtual Vector< EBAMRCellData * > getDiffusionFunctions()
Get all diffusion coefficients.
Definition CD_ItoLayoutImplem.H:387
virtual Real computeDt()
Compute smallest possible time step.
Definition CD_ItoLayoutImplem.H:293
virtual void addSolver(RefCountedPtr< T > &a_solver)
Add solver to the list of solvers.
Definition CD_ItoLayoutImplem.H:96
virtual Vector< EBAMRCellData * > getMobilityFunctions()
Get all mobility mesh functions.
Definition CD_ItoLayoutImplem.H:399
virtual ItoIterator< T > iterator()
Return a fresh iterator. The iterator is a simple random access object that can iterate through the s...
Definition CD_ItoLayoutImplem.H:37
virtual void setVerbosity(const int a_verbosity)
Set verbosity for each solver.
Definition CD_ItoLayoutImplem.H:175
virtual void initialData()
Fill all solvers with initial data.
Definition CD_ItoLayoutImplem.H:121
virtual void organizeParticlesByCell(const ItoSolver::WhichContainer a_whichContainer)
Sort ItoSolver particles by cell – this is done for all solvers.
Definition CD_ItoLayoutImplem.H:193
virtual void interpolateVelocities()
Interpolate velocities.
Definition CD_ItoLayoutImplem.H:103
virtual Real computeDiffusiveDt()
Compute the classical diffusive time step dt = dx*dx/(2*D) where D is the diffusion coefficient (not ...
Definition CD_ItoLayoutImplem.H:335
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel)
Regrid method – calls the regrid method for each solver.
Definition CD_ItoLayoutImplem.H:130
virtual Vector< RefCountedPtr< ItoSpecies > > & getSpecies()
Get species.
Definition CD_ItoLayoutImplem.H:356
virtual void parseOptions()
Utility function – parse options for all solvers.
Definition CD_ItoLayoutImplem.H:69
virtual Real computeHopDt(const Real a_maxCellsToMove)
Compute the largest dt which restricts all particles to move less than a_maxCellsToMove.
Definition CD_ItoLayoutImplem.H:321
virtual void define(const Vector< RefCountedPtr< ItoSpecies > > &a_species)
Define function.
Definition CD_ItoLayoutImplem.H:62
virtual void organizeParticlesByPatch(const ItoSolver::WhichContainer a_whichContainer)
Sort ItoSolver particles by patch – this is done for all solvers.
Definition CD_ItoLayoutImplem.H:202
ItoLayout()=delete
Disallowed weak construction.
virtual Vector< EBAMRCellData * > getVelocityFunctions()
Get all velocity functions.
Definition CD_ItoLayoutImplem.H:363
virtual Vector< ParticleContainer< ItoParticle > * > getParticles(const ItoSolver::WhichContainer a_whichContainer)
Get particle containers of a particular container type.
Definition CD_ItoLayoutImplem.H:411
virtual phase::which_phase getPhase() const
Return phase where the solvers are defined.
Definition CD_ItoLayoutImplem.H:423
virtual void setTime(const int a_step, const Real a_time, const Real a_dt)
Set time for each solver.
Definition CD_ItoLayoutImplem.H:184
virtual ~ItoLayout()
Destructor (does nothing).
Definition CD_ItoLayoutImplem.H:32
virtual void setComputationalGeometry(const RefCountedPtr< ComputationalGeometry > &a_computationalGeometry)
Set the computational geometry. This sets the computational geometry for each solver.
Definition CD_ItoLayoutImplem.H:157
virtual void remap()
Remap function – calls remap(ItoSolver::WhichContainer::bulk) for each solver.
Definition CD_ItoLayoutImplem.H:265
virtual void depositParticles()
All solvers deposit their particles.
Definition CD_ItoLayoutImplem.H:249
virtual const std::string getRealm() const
Get the realm name where the solvers are defined.
Definition CD_ItoLayoutImplem.H:44
virtual void preRegrid(const int a_lbase, const int a_finestLevel)
Utility function which caches states before regrid step.
Definition CD_ItoLayoutImplem.H:112
virtual Vector< RefCountedPtr< T > > & getSolvers()
Get solvers all solvers.
Definition CD_ItoLayoutImplem.H:349
virtual size_t getNumParticles(const ItoSolver::WhichContainer a_ptype, const bool a_localOnly)
Get total number of particles.
Definition CD_ItoLayoutImplem.H:281
virtual void setAmr(const RefCountedPtr< AmrMesh > &a_amr)
Set AmrMesh object for each solver.
Definition CD_ItoLayoutImplem.H:148
virtual void setRealm(const std::string &a_realm)
Set the realm where the solvers are defined.
Definition CD_ItoLayoutImplem.H:51
virtual void registerOperators()
Register operators. Calls registerOperators for each solver.
Definition CD_ItoLayoutImplem.H:139
virtual Vector< EBAMRCellData * > getDensities()
Get all densities.
Definition CD_ItoLayoutImplem.H:375
virtual void setPhase(phase::which_phase a_phase)
Set phase for each solver.
Definition CD_ItoLayoutImplem.H:166
WhichContainer
Enum class for distinguishing various types of particle containers.
Definition CD_ItoSolver.H:51
ParticleMergeMethod
The specific super-particle merge methods.
Definition CD_ParticleManagement.H:40
which_phase
Enumeration of supported phases.
Definition CD_MultiFluidIndexSpace.H:38