chombo-discharge
Loading...
Searching...
No Matches
CD_CdrLayoutImplem.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_CDRLAYOUTIMPLEM_H
14#define CD_CDRLAYOUTIMPLEM_H
15
16// Our includes
17#include <CD_CdrLayout.H>
18#include <CD_CdrIterator.H>
19#include <CD_Units.H>
20#include <CD_DataOps.H>
21#include <CD_NamespaceHeader.H>
22
23template <class T>
25{
26 CH_TIME("CdrLayout<T>::CdrLayout()");
27
28 // Default settings.
29 m_verbosity = -1;
30 m_species = a_species;
32
33 m_solvers.resize(0);
34}
35
36template <class T>
38{
39 CH_TIME("CdrLayout<T>::~CdrLayout()");
40}
41
42template <class T>
45{
46 CH_TIME("CdrLayout<T>::getPhase()");
47 if (m_verbosity > 6) {
48 pout() << "CdrLayout<T>::getPhase()" << endl;
49 }
50
51 return m_phase;
52}
53
54template <class T>
57{
58 CH_TIME("CdrLayout<T>::iterator()");
59 if (m_verbosity > 6) {
60 pout() << "CdrLayout<T>::iterator()" << endl;
61 }
62
63 return CdrIterator<T>(*this);
64}
65
66template <class T>
69{
70 CH_TIME("CdrLayout<T>::getRealm()");
71 if (m_verbosity > 6) {
72 pout() << "CdrLayout<T>::getRealm()" << endl;
73 }
74
75 return m_realm;
76}
77
78template <class T>
79void
81{
82 CH_TIME("CdrLayout<T>::setRealm()");
83 if (m_verbosity > 6) {
84 pout() << "CdrLayout<T>::setRealm()" << endl;
85 }
86
88
89 for (auto solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
90 solver_it()->setRealm(a_realm);
91 }
92}
93
94template <class T>
95void
97{
98 CH_TIME("CdrLayout<T>::addSolver(RefCountedPtr<T>");
99 if (m_verbosity > 6) {
100 pout() << "CdrLayout<T>::addSolver()" << endl;
101 }
102
103 m_solvers.push_back(a_solver);
104}
105
106template <class T>
107void
109{
110 CH_TIME("CdrLayout<T>::parseOptions()");
111 if (m_verbosity > 6) {
112 pout() << "CdrLayout<T>::parseOptions()" << endl;
113 }
114
115 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
116 solver_it()->parseOptions();
117 }
118}
119
120template <class T>
121void
123{
124 CH_TIME("CdrLayout<T>::parseRuntimeOptions()");
125 if (m_verbosity > 6) {
126 pout() << "CdrLayout<T>::parseRuntimeOptions()" << endl;
127 }
128
129 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
130 solver_it()->parseRuntimeOptions();
131 }
132}
133
134template <class T>
135void
137{
138 CH_TIME("CdrLayout<T>::allocate()");
139 if (m_verbosity > 6) {
140 pout() << "CdrLayout<T>::allocate()" << endl;
141 }
142
143 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
144 solver_it()->allocate();
145 }
146}
147
148template <class T>
149void
151{
152 CH_TIME("CdrLayout<T>::deallocate()");
153 if (m_verbosity > 6) {
154 pout() << "CdrLayout<T>::deallocate()" << endl;
155 }
156
157 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
158 solver_it()->deallocate();
159 }
160}
161
162template <class T>
163void
165{
166 CH_TIME("CdrLayout<T>::preRegrid(int, int)");
167 if (m_verbosity > 6) {
168 pout() << "CdrLayout<T>::preRegrid(int, int)" << endl;
169 }
170
171 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
172 solver_it()->preRegrid(a_lbase, a_oldFinestLevel);
173 }
174}
175
176template <class T>
177void
179{
180 CH_TIME("CdrLayout<T>::initialData()");
181 if (m_verbosity > 6) {
182 pout() << "CdrLayout<T>::initialData()" << endl;
183 }
184
185 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
186 solver_it()->initialData();
187 }
188}
189
190template <class T>
191void
193{
194 CH_TIME("CdrLayout<T>::regrid(int, int, int)");
195 if (m_verbosity > 5) {
196 pout() << "CdrLayout<T>::regrid(int, int, int)" << endl;
197 }
198
199 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
201 }
202}
203
204template <class T>
205void
207{
208 CH_TIME("CdrLayout<T>::registerOperators()");
209 if (m_verbosity > 5) {
210 pout() << "CdrLayout<T>::registerOperators()" << endl;
211 }
212
213 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
214 solver_it()->registerOperators();
215 }
216}
217
218template <class T>
219void
221{
222 CH_TIME("CdrLayout<T>::setAmr(RefCountedPtr<AmrMesh>)");
223 if (m_verbosity > 5) {
224 pout() << "CdrLayout<T>::setAmr(RefCountedPtr<AmrMesh>)" << endl;
225 }
226
227 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
228 solver_it()->setAmr(a_amrMesh);
229 }
230}
231
232template <class T>
233void
235{
236 CH_TIME("CdrLayout<T>::setComputationalGeometry(RefCountedPtr<ComputationalGeometry>)");
237 if (m_verbosity > 5) {
238 pout() << "CdrLayout<T>::setComputationalGeometry(RefCountedPtr<ComputationalGeometry>)" << endl;
239 }
240
241 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
242 solver_it()->setComputationalGeometry(a_computationalGeometry);
243 }
244}
245
246template <class T>
247void
249{
250 CH_TIME("CdrLayout<T>::setPhase(phase::which_phase)");
251 if (m_verbosity > 5) {
252 pout() << "CdrLayout<T>::setPhase(phase::which_phase)" << endl;
253 }
254
256
257 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
258 solver_it()->setPhase(m_phase);
259 }
260}
261
262template <class T>
263void
265{
266 CH_TIME("CdrLayout<T>::setVerbosity(int)");
268 if (m_verbosity > 5) {
269 pout() << "CdrLayout<T>::setVerbosity(int)" << endl;
270 }
271
272 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
273 solver_it()->setVerbosity(a_verbosity);
274 }
275}
276
277template <class T>
278void
280{
281 CH_TIME("CdrLayout<T>::setTime(int, int, int)");
282 if (m_verbosity > 5) {
283 pout() << "CdrLayout<T>::setTime(int, int, int)" << endl;
284 }
285
286 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
287 solver_it()->setTime(a_step, a_time, a_dt);
288 }
289}
290
291template <class T>
292void
294{
295 CH_TIME("CdrLayout<T>::writePlotFile()");
296 if (m_verbosity > 5) {
297 pout() << "CdrLayout<T>::writePlotFile()" << endl;
298 }
299
300 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
301 solver_it()->writePlotFile();
302 }
303}
304
305template <class T>
306Real
308{
309 CH_TIME("CdrLayout<T>::computeAdvectionDt()");
310 if (m_verbosity > 5) {
311 pout() << "CdrLayout<T>::computeAdvectionDt()" << endl;
312 }
313
314 Real dt = std::numeric_limits<Real>::max();
315
316 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
317 const Real curDt = solver_it()->computeAdvectionDt();
318
319 dt = std::min(dt, curDt);
320 }
321
322 return dt;
323}
324
325template <class T>
326Real
328{
329 CH_TIME("CdrLayout<T>::computeDiffusionDt()");
330 if (m_verbosity > 5) {
331 pout() << "CdrLayout<T>::computeDiffusionDt()" << endl;
332 }
333
334 Real dt = std::numeric_limits<Real>::max();
335
336 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
337 const Real curDt = solver_it()->computeDiffusionDt();
338
339 dt = std::min(dt, curDt);
340 }
341
342 return dt;
343}
344
345template <class T>
346Real
348{
349 CH_TIME("CdrLayout<T>::computeAdvectionDiffusionDt()");
350 if (m_verbosity > 5) {
351 pout() << "CdrLayout<T>::computeAdvectionDiffusionDt()" << endl;
352 }
353
354 Real dt = std::numeric_limits<Real>::max();
355
356 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
357 const Real curDt = solver_it()->computeAdvectionDiffusionDt();
358
359 dt = std::min(dt, curDt);
360 }
361
362 return dt;
363}
364
365template <class T>
368{
369 CH_TIME("CdrLayout<T>::getSolvers()");
370 if (m_verbosity > 5) {
371 pout() << "CdrLayout<T>::getSolvers()" << endl;
372 }
373
374 return (m_solvers);
375}
376
377template <class T>
380{
381 CH_TIME("CdrLayout<T>::getSpecies()");
382 if (m_verbosity > 5) {
383 pout() << "CdrLayout<T>::getSpecies()" << endl;
384 }
385
386 return (m_species);
387}
388
389template <class T>
392{
393 CH_TIME("CdrLayout<T>::getPhis()");
394 if (m_verbosity > 5) {
395 pout() << "CdrLayout<T>::getPhis()" << endl;
396 }
397
399
400 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
401 states.push_back(&(solver_it()->getPhi()));
402 }
403
404 return states;
405}
406
407template <class T>
410{
411 CH_TIME("CdrLayout<T>::getSources()");
412 if (m_verbosity > 5) {
413 pout() << "CdrLayout<T>::getSources()" << endl;
414 }
415
417
418 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
419 sources.push_back(&(solver_it()->getSource()));
420 }
421
422 return sources;
423}
424
425template <class T>
428{
429 CH_TIME("CdrLayout<T>::getVelocities()");
430 if (m_verbosity > 5) {
431 pout() << "CdrLayout<T>::getVelocities()" << endl;
432 }
433
435
436 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
437 velocities.push_back(&(solver_it()->getCellCenteredVelocity()));
438 }
439
440 return velocities;
441}
442
443template <class T>
446{
447 CH_TIME("CdrLayout<T>::getCellCenteredDiffusionCoefficients()");
448 if (m_verbosity > 5) {
449 pout() << "CdrLayout<T>::getCellCenteredDiffusionCoefficients()" << endl;
450 }
451
453
454 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
455 diffCo.push_back(&(solver_it()->getCellCenteredDiffusionCoefficient()));
456 }
457
458 return diffCo;
459}
460
461template <class T>
464{
465 CH_TIME("CdrLayout<T>::getFaceCenteredDiffusionCoefficient()");
466 if (m_verbosity > 5) {
467 pout() << "CdrLayout<T>::getFaceCenteredDiffusionCoefficient()" << endl;
468 }
469
471
472 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
473 diffCo.push_back(&(solver_it()->getFaceCenteredDiffusionCoefficient()));
474 }
475
476 return diffCo;
477}
478
479template <class T>
482{
483 CH_TIME("CdrLayout<T>::getEbCenteredDiffusionCoefficient");
484 if (m_verbosity > 5) {
485 pout() << "CdrLayout<T>::getEbCenteredDiffusionCoefficient" << endl;
486 }
487
489
490 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
491 diffCo.push_back(&(solver_it()->getEbCenteredDiffusionCoefficient()));
492 }
493
494 return diffCo;
495}
496
497template <class T>
500{
501 CH_TIME("CdrLayout<T>::getEbFlux()");
502 if (m_verbosity > 5) {
503 pout() << "CdrLayout<T>::getEbFlux()" << endl;
504 }
505
507
508 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
509 ebFlux.push_back(&(solver_it()->getEbFlux()));
510 }
511
512 return ebFlux;
513}
514
515template <class T>
518{
519 CH_TIME("CdrLayout<T>::getDomainFlux()");
520 if (m_verbosity > 5) {
521 pout() << "CdrLayout<T>::getDomainFlux()" << endl;
522 }
523
525
526 for (CdrIterator<T> solver_it = this->iterator(); solver_it.ok(); ++solver_it) {
527 domainFlux.push_back(&(solver_it()->getDomainFlux()));
528 }
529
530 return domainFlux;
531}
532
533template <class T, class S>
535{
536 CH_TIME("CdrFactory<T, S>::CdrFactory()");
537}
538
539template <class T, class S>
541{
542 CH_TIME("CdrFactory<T, S>::~CdrFactory()");
543}
544
545template <class T, class S>
548{
549 CH_TIME("CdrFactory<T, S>::newLayout(Vector<RefCountedPtr<CdrSpecies> >)");
550
551 // Instantiate the return CdrLayout object first.
553
554 // Cast solvers and instantiate them
555 for (int i = 0; i < a_species.size(); i++) {
556
557 auto solver = RefCountedPtr<T>(static_cast<T*>(new S()));
558
559 solver->setSpecies(a_species[i]);
561 solver->setVerbosity(-1);
562
563 cdr->addSolver(solver);
564 }
565
566 return cdr;
567}
568
569#include <CD_NamespaceFooter.H>
570
571#endif
Declaration of an iterator class for CdrLayout (for iterating through subsets of solvers).
Declaration of a class that holds a set of CdrSolvers (to cut down on typing).
Agglomeration of useful data operations.
Declaration of various useful units.
CdrFactory()
Default constructor (does nothing)
Definition CD_CdrLayoutImplem.H:534
~CdrFactory()
Default constructor (does nothing)
Definition CD_CdrLayoutImplem.H:540
RefCountedPtr< CdrLayout< T > > newLayout(const Vector< RefCountedPtr< CdrSpecies > > &a_species) const
Factory method, create a new CdrLayout.
Definition CD_CdrLayoutImplem.H:547
virtual void setPhase(const phase::which_phase a_phase=phase::gas)
Set phase for all CdrSolvers.
Definition CD_CdrLayoutImplem.H:248
virtual std::string getRealm() const
Get the realm where the Cdr solvers live.
Definition CD_CdrLayoutImplem.H:68
virtual void parseOptions()
Parse class options.
Definition CD_CdrLayoutImplem.H:108
virtual void parseRuntimeOptions()
Parse runtime options.
Definition CD_CdrLayoutImplem.H:122
virtual Vector< EBAMRCellData * > getPhis()
Get all cell-centered states.
Definition CD_CdrLayoutImplem.H:391
virtual Vector< EBAMRIVData * > getEbFlux()
Get all EB flux data holders.
Definition CD_CdrLayoutImplem.H:499
virtual Vector< EBAMRCellData * > getSources()
Get all source terms.
Definition CD_CdrLayoutImplem.H:409
virtual phase::which_phase getPhase() const
Get phase.
Definition CD_CdrLayoutImplem.H:44
virtual void preRegrid(const int a_lbase, const int a_oldFinestLevel)
Call preRegrid(...) method for all the CdrSolvers.
Definition CD_CdrLayoutImplem.H:164
virtual Vector< EBAMRIFData * > getDomainFlux()
Get domain flux data holders.
Definition CD_CdrLayoutImplem.H:517
virtual Vector< EBAMRCellData * > getVelocities()
Get all cell-centered velocities.
Definition CD_CdrLayoutImplem.H:427
virtual void writePlotFile()
Convenience function. All solvers write plot files (for debugging purposes)
Definition CD_CdrLayoutImplem.H:293
virtual void setComputationalGeometry(const RefCountedPtr< ComputationalGeometry > &a_computationalGeometry)
Set the computational geometry for all CdrSolvers.
Definition CD_CdrLayoutImplem.H:234
virtual void setAmr(const RefCountedPtr< AmrMesh > &a_amrMesh)
Set AmrMesh for all CdrSolvers.
Definition CD_CdrLayoutImplem.H:220
virtual Real computeDiffusionDt()
Get time step for explicit diffusion.
Definition CD_CdrLayoutImplem.H:327
virtual ~CdrLayout()
Destructor.
Definition CD_CdrLayoutImplem.H:37
virtual void addSolver(RefCountedPtr< T > &a_solver)
Add solver. This appends a_solver to m_solvers.
Definition CD_CdrLayoutImplem.H:96
virtual Vector< EBAMRIVData * > getEbCenteredDiffusionCoefficient()
Get all EB-centered diffusion coefficients.
Definition CD_CdrLayoutImplem.H:481
virtual void setTime(const int a_step, const Real a_time, const Real a_dt)
Set time.
Definition CD_CdrLayoutImplem.H:279
virtual Real computeAdvectionDiffusionDt()
Get the time step for explicit advection-diffusion.
Definition CD_CdrLayoutImplem.H:347
virtual Vector< EBAMRFluxData * > getFaceCenteredDiffusionCoefficient()
Get all face-centered diffusion coefficients.
Definition CD_CdrLayoutImplem.H:463
virtual void setVerbosity(const int a_verbosity)
Set verbosity for all CdrSolvers.
Definition CD_CdrLayoutImplem.H:264
virtual void registerOperators()
Register operators.
Definition CD_CdrLayoutImplem.H:206
CdrLayout()=delete
Disallowed weak constructor. Use the full constructor.
virtual Vector< RefCountedPtr< T > > & getSolvers()
Get solvers.
Definition CD_CdrLayoutImplem.H:367
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel)
Regrid method. Calls regrid(...) for every CdrSolver.
Definition CD_CdrLayoutImplem.H:192
virtual Vector< EBAMRCellData * > getCellCenteredDiffusionCoefficients()
Get all cell-centered diffusion coefficients.
Definition CD_CdrLayoutImplem.H:445
virtual void allocate()
Allocate internal storage for solvers.
Definition CD_CdrLayoutImplem.H:136
virtual void initialData()
Initial data. Fill all solvers with initial data.
Definition CD_CdrLayoutImplem.H:178
virtual Vector< RefCountedPtr< CdrSpecies > > & getSpecies()
Get species.
Definition CD_CdrLayoutImplem.H:379
virtual void setRealm(const std::string &a_realm)
Set realm for all CdrSolvers.
Definition CD_CdrLayoutImplem.H:80
virtual CdrIterator< T > iterator()
Get an iterator which can iterate through the various Cdr solvers.
Definition CD_CdrLayoutImplem.H:56
virtual Real computeAdvectionDt()
Get CFL time for advection.
Definition CD_CdrLayoutImplem.H:307
virtual void deallocate()
Deallocate solver internals.
Definition CD_CdrLayoutImplem.H:150
static const std::string Primal
Identifier for perimal realm.
Definition CD_Realm.H:39
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:38
phase::which_phase m_phase
Phase where this solver lives.
Definition CD_TracerParticleSolver.H:367
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:26
std::string m_realm
Realm where this solver lives.
Definition CD_TracerParticleSolver.H:352
int m_verbosity
Verbosity level.
Definition CD_TracerParticleSolver.H:387
virtual void setPhase(const phase::which_phase &a_phase)
Set the solver phase.
Definition CD_TracerParticleSolverImplem.H:245
which_phase
Enumeration of supported phases.
Definition CD_MultiFluidIndexSpace.H:38
@ gas
Gas phase.
Definition CD_MultiFluidIndexSpace.H:39