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>
25ItoLayout<T>::ItoLayout(const Vector<RefCountedPtr<ItoSpecies>>& a_species)
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
51ItoLayout<T>::setRealm(const std::string& a_realm)
52{
53 m_realm = a_realm;
54
55 for (auto solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
56 solver_it()->setRealm(m_realm);
57 }
58}
59
60template <class T>
61void
62ItoLayout<T>::define(const Vector<RefCountedPtr<ItoSpecies>>& a_species)
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) {
81 iter()->parseRuntimeOptions();
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
96ItoLayout<T>::addSolver(RefCountedPtr<T>& a_solver)
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) {
106 iter()->interpolateVelocities();
107 }
108}
109
110template <class T>
111void
112ItoLayout<T>::preRegrid(const int a_lbase, const int a_finestLevel)
113{
114 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
115 iter()->preRegrid(a_lbase, a_finestLevel);
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
130ItoLayout<T>::regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel)
131{
132 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
133 iter()->regrid(a_lmin, a_oldFinestLevel, a_newFinestLevel);
134 }
135}
136
137template <class T>
138void
140{
141 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
142 iter()->registerOperators();
143 }
144}
145
146template <class T>
147void
148ItoLayout<T>::setAmr(const RefCountedPtr<AmrMesh>& a_amrMesh)
149{
150 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
151 iter()->setAmr(a_amrMesh);
152 }
153}
154
155template <class T>
156void
157ItoLayout<T>::setComputationalGeometry(const RefCountedPtr<ComputationalGeometry>& a_computationalGeometry)
158{
159 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
160 iter()->setComputationalGeometry(a_computationalGeometry);
161 }
162}
163
164template <class T>
165void
167{
168 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
169 iter()->setPhase(a_phase);
170 }
171}
172
173template <class T>
174void
175ItoLayout<T>::setVerbosity(const int a_verbosity)
176{
177 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
178 iter()->setVerbosity(a_verbosity);
179 }
180}
181
182template <class T>
183void
184ItoLayout<T>::setTime(const int a_step, const Real a_time, const Real a_dt)
185{
186 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
187 iter()->setTime(a_step, a_time, a_dt);
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);
215 }
216}
217
218template <class T>
219void
220ItoLayout<T>::makeSuperparticles(const ItoSolver::WhichContainer a_whichContainer, const int a_ppc)
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
229ItoLayout<T>::makeSuperparticles(const ItoSolver::WhichContainer a_whichContainer, const Vector<int>& a_ppc)
230{
231 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
232 iter()->makeSuperparticles(a_whichContainer, a_ppc);
233 }
234}
235
236template <class T>
237void
239 const Vector<int>& a_ppc,
241{
242 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
243 iter()->makeSuperparticles(a_whichContainer, a_ppc, a_method);
244 }
245}
246
247template <class T>
248void
250{
251 this->depositParticles(ItoSolver::WhichContainer::Bulk);
252}
253
254template <class T>
255void
257{
258 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
259 iter()->depositParticles(a_whichContainer);
260 }
261}
262
263template <class T>
264void
266{
267 this->remap(ItoSolver::WhichContainer::Bulk);
268}
269
270template <class T>
271void
273{
274 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
275 iter()->remap(a_whichContainer);
276 }
277}
278
279template <class T>
280size_t
281ItoLayout<T>::getNumParticles(const ItoSolver::WhichContainer a_whichContainer, const bool a_localOnly)
282{
283 size_t ret = 0;
284 for (auto iter = this->iterator(); iter.ok(); ++iter) {
285 ret += iter()->getNumParticles(a_whichContainer, a_localOnly);
286 }
287
288 return ret;
289}
290
291template <class T>
292Real
294{
295 Real minDt = std::numeric_limits<Real>::max();
296
297 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
298 const Real thisDt = iter()->computeDt();
299 minDt = std::min(minDt, thisDt);
300 }
301
302 return minDt;
303}
304
305template <class T>
306Real
308{
309 Real minDt = std::numeric_limits<Real>::max();
310
311 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
312 const Real thisDt = iter()->computeAdvectiveDt();
313 minDt = std::min(minDt, thisDt);
314 }
315
316 return minDt;
317}
318
319template <class T>
320Real
321ItoLayout<T>::computeHopDt(const Real a_maxCellsToMove)
322{
323 Real minDt = std::numeric_limits<Real>::max();
324
325 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
326 const Real thisDt = iter()->computeHopDt(a_maxCellsToMove);
327 minDt = std::min(minDt, thisDt);
328 }
329
330 return minDt;
331}
332
333template <class T>
334Real
336{
337 Real minDt = std::numeric_limits<Real>::max();
338
339 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
340 const Real thisDt = iter()->computeDiffusiveDt();
341 minDt = std::min(minDt, thisDt);
342 }
343
344 return minDt;
345}
346
347template <class T>
348Vector<RefCountedPtr<T>>&
350{
351 return m_solvers;
352}
353
354template <class T>
355Vector<RefCountedPtr<ItoSpecies>>&
357{
358 return m_species;
359}
360
361template <class T>
362Vector<EBAMRCellData*>
364{
365 Vector<EBAMRCellData*> ret(m_solvers.size(), nullptr);
366 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
367 ret[iter.index()] = &(iter()->getVelocityFunction());
368 }
369
370 return ret;
371}
372
373template <class T>
374Vector<EBAMRCellData*>
376{
377 Vector<EBAMRCellData*> ret(m_solvers.size(), nullptr);
378 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
379 ret[iter.index()] = &(iter()->getPhi());
380 }
381
382 return ret;
383}
384
385template <class T>
386Vector<EBAMRCellData*>
388{
389 Vector<EBAMRCellData*> ret(m_solvers.size(), nullptr);
390 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
391 ret[iter.index()] = &(iter()->getDiffusionFunction());
392 }
393
394 return ret;
395}
396
397template <class T>
398Vector<EBAMRCellData*>
400{
401 Vector<EBAMRCellData*> ret(m_solvers.size(), nullptr);
402 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
403 ret[iter.index()] = &(iter()->getMobilityFunction());
404 }
405
406 return ret;
407}
408
409template <class T>
410Vector<ParticleContainer<ItoParticle>*>
412{
413 Vector<ParticleContainer<ItoParticle>*> ret(m_solvers.size(), nullptr);
414 for (ItoIterator<T> iter = this->iterator(); iter.ok(); ++iter) {
415 ret[iter.index()] = &(iter()->getParticles(a_container));
416 }
417
418 return ret;
419}
420
421template <class T>
424{
425 return m_phase;
426}
427
428template <class T, class S>
431
432template <class T, class S>
435
436template <class T, class S>
437RefCountedPtr<ItoLayout<T>>
438ItoFactory<T, S>::newLayout(const Vector<RefCountedPtr<ItoSpecies>>& a_species) const
439{
440
441 auto itoLayout = RefCountedPtr<ItoLayout<T>>(new ItoLayout<T>(a_species));
442
443 // Cast solvers and instantiate them
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);
449 }
450
451 return itoLayout;
452}
453
454#include <CD_NamespaceFooter.H>
455
456#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: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