chombo-discharge
Loading...
Searching...
No Matches
CD_ItoLayoutImplem.H
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021-2026 SINTEF Energy Research
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
13#ifndef CD_ITOLAYOUTIMPLEM_H
14#define CD_ITOLAYOUTIMPLEM_H
15
16// Chombo includes
17#include <CH_Timer.H>
18
19// Our includes
20#include <CD_ItoLayout.H>
21#include <CD_ItoIterator.H>
22#include <CD_NamespaceHeader.H>
23
24template <class T>
26{
27 this->define(a_species);
28 m_solvers.resize(0);
29}
30
31template <class T>
34
35template <class T>
38{
39 return ItoIterator<T>(*this);
40}
41
42template <class T>
43const std::string
45{
46 return m_realm;
47}
48
49template <class T>
50void
52{
54
55 for (auto solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
57 }
58}
59
60template <class T>
61void
63{
64 m_isDefined = true;
65}
66
67template <class T>
68void
70{
71 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
72 iter()->parseOptions();
73 }
74}
75
76template <class T>
77void
79{
80 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
82 }
83}
84
85template <class T>
86void
88{
89 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
90 iter()->allocate();
91 }
92}
93
94template <class T>
95void
97{
98 m_solvers.push_back(a_solver);
99}
100
101template <class T>
102void
104{
105 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
107 }
108}
109
110template <class T>
111void
113{
114 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
116 }
117}
118
119template <class T>
120void
122{
123 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
124 iter()->initialData();
125 }
126}
127
128template <class T>
129void
131{
132 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
134 }
135}
136
137template <class T>
138void
140{
141 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
143 }
144}
145
146template <class T>
147void
149{
150 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
152 }
153}
154
155template <class T>
156void
163
164template <class T>
165void
167{
168 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
170 }
171}
172
173template <class T>
174void
176{
177 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
178 iter()->setVerbosity(a_verbosity);
179 }
180}
181
182template <class T>
183void
185{
186 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
188 }
189}
190
191template <class T>
192void
194{
195 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
196 iter()->organizeParticlesByCell(a_whichContainer);
197 }
198}
199
200template <class T>
201void
203{
204 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
205 iter()->organizeParticlesByPatch(a_whichContainer);
206 }
207}
208
209template <class T>
210void
212{
213 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
214 iter()->makeSuperparticles(a_whichContainer, a_ppc);
215 }
216}
217
218template <class T>
219void
221{
222 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
223 iter()->makeSuperparticles(a_whichContainer, a_ppc);
224 }
225}
226
227template <class T>
228void
230{
231 this->depositParticles(ItoSolver::WhichContainer::Bulk);
232}
233
234template <class T>
235void
242
243template <class T>
244void
246{
247 this->remap(ItoSolver::WhichContainer::Bulk);
248}
249
250template <class T>
251void
253{
254 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
256 }
257}
258
259template <class T>
260size_t
262{
263 size_t ret = 0;
264 for (auto iter = this->iterator(); iter.ok(); ++iter) {
265 ret += iter()->getNumParticles(a_whichContainer, a_localOnly);
266 }
267
268 return ret;
269}
270
271template <class T>
272Real
274{
275 Real minDt = std::numeric_limits<Real>::max();
276
277 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
278 const Real thisDt = iter()->computeDt();
279 minDt = std::min(minDt, thisDt);
280 }
281
282 return minDt;
283}
284
285template <class T>
286Real
288{
289 Real minDt = std::numeric_limits<Real>::max();
290
291 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
292 const Real thisDt = iter()->computeAdvectiveDt();
293 minDt = std::min(minDt, thisDt);
294 }
295
296 return minDt;
297}
298
299template <class T>
300Real
302{
303 Real minDt = std::numeric_limits<Real>::max();
304
305 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
306 const Real thisDt = iter()->computeHopDt(a_maxCellsToMove);
307 minDt = std::min(minDt, thisDt);
308 }
309
310 return minDt;
311}
312
313template <class T>
314Real
316{
317 Real minDt = std::numeric_limits<Real>::max();
318
319 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
320 const Real thisDt = iter()->computeDiffusiveDt();
321 minDt = std::min(minDt, thisDt);
322 }
323
324 return minDt;
325}
326
327template <class T>
330{
331 return m_solvers;
332}
333
334template <class T>
337{
338 return m_species;
339}
340
341template <class T>
344{
345 Vector<EBAMRCellData*> ret(m_solvers.size(), nullptr);
346 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
347 ret[iter.index()] = &(iter()->getVelocityFunction());
348 }
349
350 return ret;
351}
352
353template <class T>
356{
357 Vector<EBAMRCellData*> ret(m_solvers.size(), nullptr);
358 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
359 ret[iter.index()] = &(iter()->getPhi());
360 }
361
362 return ret;
363}
364
365template <class T>
368{
369 Vector<EBAMRCellData*> ret(m_solvers.size(), nullptr);
370 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
371 ret[iter.index()] = &(iter()->getDiffusionFunction());
372 }
373
374 return ret;
375}
376
377template <class T>
380{
381 Vector<EBAMRCellData*> ret(m_solvers.size(), nullptr);
382 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
383 ret[iter.index()] = &(iter()->getMobilityFunction());
384 }
385
386 return ret;
387}
388
389template <class T>
392{
393 Vector<ParticleContainer<ItoParticle>*> ret(m_solvers.size(), nullptr);
394 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
395 ret[iter.index()] = &(iter()->getParticles(a_container));
396 }
397
398 return ret;
399}
400
401template <class T>
404{
405 return m_phase;
406}
407
408template <class T, class S>
411
412template <class T, class S>
415
416template <class T, class S>
419{
420
422
423 // Cast solvers and instantiate them
424 for (int i = 0; i < a_species.size(); i++) {
425 RefCountedPtr<T> solver = RefCountedPtr<T>(static_cast<T*>(new S()));
426 solver->setSpecies(a_species[i]);
427 solver->setVerbosity(-1);
428 itoLayout->addSolver(solver);
429 }
430
431 return itoLayout;
432}
433
434#include <CD_NamespaceFooter.H>
435
436#endif
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:413
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:418
ItoFactory()
Constructor.
Definition CD_ItoLayoutImplem.H:409
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:287
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:367
virtual Real computeDt()
Compute smallest possible time step.
Definition CD_ItoLayoutImplem.H:273
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:379
virtual void makeSuperparticles(const ItoSolver::WhichContainer a_whichContainer, const int a_ppc)
Rearrange the input container particle into new superparticles – this is done for all solvers.
Definition CD_ItoLayoutImplem.H:211
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:315
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:336
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:301
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:343
virtual Vector< ParticleContainer< ItoParticle > * > getParticles(const ItoSolver::WhichContainer a_whichContainer)
Get particle containers of a particular container type.
Definition CD_ItoLayoutImplem.H:391
virtual phase::which_phase getPhase() const
Return phase where the solvers are defined.
Definition CD_ItoLayoutImplem.H:403
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:245
virtual void depositParticles()
All solvers deposit their particles.
Definition CD_ItoLayoutImplem.H:229
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:329
virtual size_t getNumParticles(const ItoSolver::WhichContainer a_ptype, const bool a_localOnly)
Get total number of particles.
Definition CD_ItoLayoutImplem.H:261
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:355
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:50
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:38
virtual void remap()
Remap particles.
Definition CD_TracerParticleSolverImplem.H:339
virtual void setRealm(const std::string &a_realm)
Set the solver realm.
Definition CD_TracerParticleSolverImplem.H:233
void depositParticles(EBAMRCellData &a_phi, const ParticleContainer< T > &a_particles, const DepositionType a_baseDeposition, const CoarseFineDeposition a_coarseFineDeposition) const noexcept
Generic particle deposition method for putting a scalar field onto the mesh.
Definition CD_TracerParticleSolverImplem.H:736
virtual void registerOperators() const
Register operators needed for AMR core functionality.
Definition CD_TracerParticleSolverImplem.H:177
phase::which_phase m_phase
Phase where this solver lives.
Definition CD_TracerParticleSolver.H:367
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:26
virtual void setTime(const int a_step, const Real a_time, const Real a_dt)
Set the time for this solver.
Definition CD_TracerParticleSolverImplem.H:257
std::string m_realm
Realm where this solver lives.
Definition CD_TracerParticleSolver.H:352
virtual void preRegrid(const int a_lbase, const int a_oldFinestLevel)
Perform pre-regrid operations.
Definition CD_TracerParticleSolverImplem.H:307
virtual void parseRuntimeOptions()
Parse solver run-time options.
Definition CD_TracerParticleSolverImplem.H:77
virtual void setPhase(const phase::which_phase &a_phase)
Set the solver phase.
Definition CD_TracerParticleSolverImplem.H:245
virtual void allocate()
Allocate storage for this solver.
Definition CD_TracerParticleSolverImplem.H:195
virtual void setComputationalGeometry(const RefCountedPtr< ComputationalGeometry > &a_compGeom)
Set the computational geometry.
Definition CD_TracerParticleSolverImplem.H:283
virtual void interpolateVelocities()
Interpolate particles velocities.
Definition CD_TracerParticleSolverImplem.H:393
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel)
Regrid this solver.
Definition CD_TracerParticleSolverImplem.H:322
virtual void parseOptions()
Parse solver options.
Definition CD_TracerParticleSolverImplem.H:63
virtual void setAmr(const RefCountedPtr< AmrMesh > &a_amrMesh)
Set AmrMesh.
Definition CD_TracerParticleSolverImplem.H:271
virtual Real computeDt() const
Compute dt = dx/max(v_x, v_y, v_z) minimized over all particles.
Definition CD_TracerParticleSolverImplem.H:623
which_phase
Enumeration of supported phases.
Definition CD_MultiFluidIndexSpace.H:38