chombo-discharge
Loading...
Searching...
No Matches
CD_TracerParticleSolverImplem.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_TRACERPARTICLESOLVERIMPLEM_H
14#define CD_TRACERPARTICLESOLVERIMPLEM_H
15
16// Chombo includes
17#include <ParmParse.H>
18
19// Our includes
21#include <CD_DischargeIO.H>
22#include <CD_ParallelOps.H>
23#include <CD_NamespaceHeader.H>
24
25template <typename P>
27{
28 CH_TIME("TracerParticleSolver::TracerParticleSolver()");
29
30 // Default settings
31 m_verbosity = -1;
32 m_name = "TracerParticleSolver";
33 m_className = "TracerParticleSolver";
34 m_realm = Realm::primal;
35 m_phase = phase::gas;
36 m_plotVelocity = true;
37 m_plotWeight = true;
38 m_volumeScale = false;
39 m_deposition = DepositionType::CIC;
40 m_interpolation = DepositionType::CIC;
41 m_coarseFineDeposition = CoarseFineDeposition::Transition;
42}
43
44template <typename P>
45inline TracerParticleSolver<P>::TracerParticleSolver(const RefCountedPtr<AmrMesh>& a_amr,
46 const RefCountedPtr<ComputationalGeometry>& a_compGeom)
48{
49 CH_TIME("TracerParticleSolver::TracerParticleSolver(RefCountedPtr<AmrMesh>, RefCountedPtr<ComputationalGeometry>)");
50
51 m_amr = a_amr;
52 m_computationalGeometry = a_compGeom;
53}
54
55template <typename P>
57{
58 CH_TIME("TracerParticleSolver::~TracerParticleSolver()");
59}
60
61template <typename P>
62inline void
64{
65 CH_TIME("TracerParticleSolver::parseOptions()");
66 if (m_verbosity > 5) {
67 pout() << m_name + "::parseOptions()" << endl;
68 }
69
70 this->parseDeposition();
71 this->parsePlotVariables();
72 this->parseVerbosity();
73}
74
75template <typename P>
76inline void
78{
79 CH_TIME("TracerParticleSolver::parseRuntimeOptions()");
80 if (m_verbosity > 5) {
81 pout() << m_name + "::parseRuntimeOptions()" << endl;
82 }
83
84 this->parseDeposition();
85 this->parsePlotVariables();
86 this->parseVerbosity();
87}
88
89template <typename P>
90inline void
92{
93 CH_TIME("TracerParticleSolver::parseDeposition()");
94 if (m_verbosity > 5) {
95 pout() << m_name + "::parseDeposition()" << endl;
96 }
97
98 ParmParse pp(m_className.c_str());
99
100 std::string str;
101
102 // Deposition for particle-mesh operations
103 pp.get("deposition", str);
104 if (str == "ngp") {
105 m_deposition = DepositionType::NGP;
106 }
107 else if (str == "cic") {
108 m_deposition = DepositionType::CIC;
109 }
110 else {
111 MayDay::Error("TracerParticleSolver::parseDeposition - unknown deposition method requested.");
112 }
113
114 pp.get("deposition_cf", str);
115 if (str == "interp") {
116 m_coarseFineDeposition = CoarseFineDeposition::Interp;
117 }
118 else if (str == "halo") {
119 m_coarseFineDeposition = CoarseFineDeposition::Halo;
120 }
121 else if (str == "halo_ngp") {
122 m_coarseFineDeposition = CoarseFineDeposition::HaloNGP;
123 }
124 else if (str == "transition") {
125 m_coarseFineDeposition = CoarseFineDeposition::Transition;
126 }
127 else {
128 MayDay::Error("TracerParticleSolver::parseDeposition - unknown coarse-fine deposition method requested.");
129 }
130
131 // Interpolation type particle-mesh operations
132 pp.get("interpolation", str);
133 if (str == "ngp") {
134 m_interpolation = DepositionType::NGP;
135 }
136 else if (str == "cic") {
137 m_interpolation = DepositionType::CIC;
138 }
139 else {
140 MayDay::Error("TracerParticleSolver::parseDeposition - unknown interpolation method requested.");
141 }
142
143 pp.get("volume_scale", m_volumeScale);
144}
145
146template <typename P>
147inline void
149{
150 CH_TIME("TracerParticleSolver::parsePlotVariables()");
151 if (m_verbosity > 5) {
152 pout() << m_name + "::parsePlotVariables()" << endl;
153 }
154
155 ParmParse pp(m_className.c_str());
156
157 pp.get("plot_weight", m_plotWeight);
158 pp.get("plot_velocity", m_plotVelocity);
159}
160
161template <typename P>
162inline void
164{
165 CH_TIME("TracerParticleSolver::parseVerbosity()");
166 if (m_verbosity > 5) {
167 pout() << m_name + "::parseVerbosity()" << endl;
168 }
169
170 ParmParse pp(m_className.c_str());
171
172 pp.get("verbosity", m_verbosity);
173}
174
175template <typename P>
176inline void
178{
179 CH_TIME("TracerParticleSolver::registerOperators()");
180 if (m_verbosity > 5) {
181 pout() << m_name + "::registerOperators()" << endl;
182 }
183
184 if (m_amr.isNull()) {
185 MayDay::Abort("TracerParticleSolver::registerOperators - need to set AmrMesh!");
186 }
187 else {
188 m_amr->registerOperator(s_particle_mesh, m_realm, m_phase);
189 m_amr->registerOperator(s_eb_coar_ave, m_realm, m_phase);
190 }
191}
192
193template <typename P>
194inline void
196{
197 CH_TIME("TracerParticleSolver::allocate()");
198 if (m_verbosity > 5) {
199 pout() << m_name + "::allocate()" << endl;
200 }
201
202 // Allocate data for storing the velocity field on the mesh, and storage for the particles.
203 m_amr->allocate(m_particles, m_realm);
204 m_amr->allocate(m_velocityField, m_realm, m_phase, SpaceDim);
205}
206
207template <typename P>
208inline void
209TracerParticleSolver<P>::setName(const std::string& a_name) noexcept
210{
211 CH_TIME("TracerParticleSolver::setName(std::string)");
212 if (m_verbosity > 5) {
213 pout() << m_name + "::setName(std::string)" << endl;
214 }
215
216 m_name = a_name;
217}
218
219template <typename P>
220inline void
221TracerParticleSolver<P>::setVolumeScale(const bool a_scale) noexcept
222{
223 CH_TIME("TracerParticleSolver::setVolumeScale(bool)");
224 if (m_verbosity > 5) {
225 pout() << m_name + "::setVolumeScale(bool)" << endl;
226 }
227
228 m_volumeScale = a_scale;
229}
230
231template <typename P>
232inline void
233TracerParticleSolver<P>::setRealm(const std::string& a_realm)
234{
235 CH_TIME("TracerParticleSolver::setRealm(std::string)");
236 if (m_verbosity > 5) {
237 pout() << m_name + "::setRealm(std::string)" << endl;
238 }
239
240 m_realm = a_realm;
241}
242
243template <typename P>
244inline void
246{
247 CH_TIME("TracerParticleSolver::setPhase(phase::which_phase)");
248 if (m_verbosity > 5) {
249 pout() << m_name + "::setPhase(phase::which_phase)" << endl;
250 }
251
252 m_phase = a_phase;
253}
254
255template <typename P>
256void
257TracerParticleSolver<P>::setTime(const int a_step, const Real a_time, const Real a_dt)
258{
259 CH_TIME("TracerParticleSolver::setTime(int, Real, Real)");
260 if (m_verbosity > 5) {
261 pout() << m_name + "::setTime(int, Real, Real)" << endl;
262 }
263
264 m_timeStep = a_step;
265 m_time = a_time;
266 m_dt = a_dt;
267}
268
269template <typename P>
270inline void
271TracerParticleSolver<P>::setAmr(const RefCountedPtr<AmrMesh>& a_amrMesh)
272{
273 CH_TIME("TracerParticleSolver::setAmr(RefCountedPtr<AmrMesh>)");
274 if (m_verbosity > 5) {
275 pout() << m_name + "::setAmr(RefCountedPtr<AmrMesh>)" << endl;
276 }
277
278 m_amr = a_amrMesh;
279}
280
281template <typename P>
282inline void
283TracerParticleSolver<P>::setComputationalGeometry(const RefCountedPtr<ComputationalGeometry>& a_compGeom)
284{
285 CH_TIME("TracerParticleSolver::setComputationalGeometry(RefCountedPtr<ComputationalGeometry>)");
286 if (m_verbosity > 5) {
287 pout() << m_name + "::setComputationalGeometry(RefCountedPtr<ComputationalGeometry>)" << endl;
288 }
289
290 m_computationalGeometry = a_compGeom;
291}
292
293template <typename P>
294inline void
295TracerParticleSolver<P>::setVelocity(const EBAMRCellData& a_velocityField)
296{
297 CH_TIME("TracerParticleSolver::setVelocity(EBAMRCellData)");
298 if (m_verbosity > 5) {
299 pout() << m_name + "::setVelocity(EBAMRCellData)" << endl;
300 }
301
302 DataOps::copy(m_velocityField, a_velocityField);
303}
304
305template <typename P>
306inline void
307TracerParticleSolver<P>::preRegrid(const int a_lbase, const int a_oldFinestLevel)
308{
309 CH_TIME("TracerParticleSolver::preRegrid(int, int)");
310 if (m_verbosity > 5) {
311 pout() << m_name + "::preRegrid(int, int)" << endl;
312 }
313
314 CH_assert(a_lbase >= 0);
315
316 // Put particles in pre-regrid mode (the SoA container caches all levels; no lbase needed).
317 m_particles.preRegrid();
318}
319
320template <typename P>
321inline void
322TracerParticleSolver<P>::regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel)
323{
324 CH_TIME("TracerParticleSolver::regrid(int, int, int)");
325 if (m_verbosity > 5) {
326 pout() << m_name + "::regrid(int, int, int)" << endl;
327 }
328
329 CH_assert(a_lmin >= 0);
330 CH_assert(a_oldFinestLevel >= 0);
331 CH_assert(a_newFinestLevel >= 0);
332
333 m_amr->remapToNewGrids(m_particles, a_lmin, a_newFinestLevel);
334 m_amr->allocate(m_velocityField, m_realm, m_phase, SpaceDim);
335}
336
337template <typename P>
338inline void
340{
341 CH_TIME("TracerParticleSolver::remap()");
342 if (m_verbosity > 5) {
343 pout() << m_name + "::remap()" << endl;
344 }
345
346 m_particles.remap();
347}
348
349template <typename P>
350inline void
352{
353 CH_TIME("TracerParticleSolver::setDeposition");
354 if (m_verbosity > 5) {
355 pout() << m_name + "::setDeposition" << endl;
356 }
357
358 m_deposition = a_deposition;
359}
360
361template <typename P>
362inline void
363TracerParticleSolver<P>::deposit(EBAMRCellData& a_phi) const noexcept
364{
365 CH_TIME("TracerParticleSolver::deposit(EBAMRCellData)");
366 if (m_verbosity > 5) {
367 pout() << m_name + "::deposit(EBAMRCellData)" << endl;
368 }
369
370 DataOps::setValue(a_phi, 0.0);
371
372 CH_assert(a_phi[0]->nComp() == 1);
373
374 m_amr->depositWeight(a_phi,
375 m_realm,
376 m_phase,
377 m_particles,
378 m_deposition,
379 m_coarseFineDeposition,
381
382 if (m_volumeScale) {
383 DataOps::volumeScale(a_phi, m_amr->getDx());
384 }
385}
386
387template <typename P>
388void
389TracerParticleSolver<P>::interpolateWeight(const EBAMRCellData& a_scalar) noexcept
390{
391 CH_TIME("TracerParticleSolver::interpolateWeight(EBAMRCellData)");
392 if (m_verbosity > 5) {
393 pout() << m_name + "::interpolateWeight(EBAMRCellData)" << endl;
394 }
395
396 m_amr->interpolateWeight(m_particles, m_realm, m_phase, a_scalar, m_interpolation, true);
397}
398
399template <typename P>
400inline void
402{
403 CH_TIME("TracerParticleSolver::interpolateVelocities()");
404 if (m_verbosity > 5) {
405 pout() << m_name + "::interpolateVelocities()" << endl;
406 }
407
408 m_amr->interpolateParticles<D_DECL(&P::v_x, &P::v_y, &P::v_z)>(m_particles,
409 m_realm,
410 m_phase,
411 m_velocityField,
412 m_interpolation,
413 true);
414}
415
416template <typename P>
417inline void
419{
420 CH_TIME("TracerParticleSolver::writePlotFile()");
421 if (m_verbosity > 5) {
422 pout() << m_name + "::writePlotFile()" << endl;
423 }
424
425 // Number of output components and their names
426 const int numPlotVars = this->getNumberOfPlotVariables();
427 const Vector<std::string> plotVarNames = this->getPlotVariableNames();
428
429 // Allocate storage
430 EBAMRCellData output;
431 m_amr->allocate(output, m_realm, m_phase, numPlotVars);
432 DataOps::setValue(output, 0.0);
433
434 // Copy internal data to be plotted over to 'output'
435 int icomp = 0;
436 for (int lvl = 0; lvl <= m_amr->getFinestLevel(); lvl++) {
437 this->writePlotData(*output[lvl], icomp, m_realm, lvl);
438 }
439
440 // Filename
441 char filename[100];
442 sprintf(filename, "%s.step%07d.%dd.hdf5", m_name.c_str(), m_timeStep, SpaceDim);
443 std::string fname(filename);
444
445 // Alias, because Chombo's EBAMRIO wants raw pointers (but we stick to smart pointers, like God intended).
446 Vector<LevelData<EBCellFAB>*> outputPtr;
447 m_amr->alias(outputPtr, output);
448
449#ifdef CH_USE_HDF5
450 constexpr int numPlotGhost = 0;
451
452 DischargeIO::writeEBHDF5(fname,
453 plotVarNames,
454 m_amr->getGrids(m_realm),
455 outputPtr,
456 m_amr->getDomains(),
457 m_amr->getDx(),
458 m_amr->getRefinementRatios(),
459 m_dt,
460 m_time,
461 m_amr->getProbLo(),
462 m_amr->getFinestLevel() + 1,
463 numPlotGhost);
464#endif
465}
466
467template <typename P>
468inline int
470{
471 CH_TIME("TracerParticleSolver::getNumberOfPlotVariables()");
472 if (m_verbosity > 5) {
473 pout() << m_name + "::getNumberOfPlotVariables()" << endl;
474 }
475
476 int numPlotVars = 0;
477
478 if (m_plotWeight) {
479 numPlotVars += 1;
480 }
481 if (m_plotVelocity) {
482 numPlotVars += SpaceDim;
483 }
484
485 return numPlotVars;
486}
487
488template <typename P>
489inline Vector<std::string>
491{
492 CH_TIME("TracerParticleSolver::getPlotVariableNames()");
493 if (m_verbosity > 5) {
494 pout() << m_name + "::getPlotVariableNames()" << endl;
495 }
496
497 Vector<std::string> plotVarNames(0);
498
499 if (m_plotWeight) {
500 plotVarNames.push_back(m_name + " density");
501 }
502 if (m_plotVelocity) {
503 plotVarNames.push_back("x-velocity " + m_name);
504 }
505 if (m_plotVelocity) {
506 plotVarNames.push_back("y-velocity " + m_name);
507 }
508#if CH_SPACEDIM == 3
509 if (m_plotVelocity) {
510 plotVarNames.push_back("z-velocity " + m_name);
511 }
512#endif
513
514 return plotVarNames;
515}
516
517template <typename P>
518inline void
519TracerParticleSolver<P>::writePlotData(LevelData<EBCellFAB>& a_output,
520 int& a_comp,
521 const std::string& a_outputRealm,
522 const int a_level) const noexcept
523{
524 CH_TIME("TracerParticleSolver::writePlotData");
525 if (m_verbosity > 5) {
526 pout() << m_name + "::writePlotData" << endl;
527 }
528
529 // Write the particle scalars.
530 if (m_plotWeight) {
531 EBAMRCellData weight;
532 m_amr->allocate(weight, m_realm, m_phase, 1);
533
534 this->deposit(weight);
535
536 this->writeData(a_output, a_comp, weight, a_outputRealm, a_level, false, true);
537 }
538
539 // Write the velocity field to the output data holder.
540 if (m_plotVelocity) {
541 this->writeData(a_output, a_comp, m_velocityField, a_outputRealm, a_level, true, true);
542 }
543}
544
545template <typename P>
546void
547TracerParticleSolver<P>::writeData(LevelData<EBCellFAB>& a_output,
548 int& a_comp,
549 const EBAMRCellData& a_data,
550 const std::string a_outputRealm,
551 const int a_level,
552 const bool a_interpToCentroids,
553 const bool a_interpGhost) const noexcept
554{
555 CH_TIMERS("TracerParticleSolver::writeData");
556 CH_TIMER("TracerParticleSolver::writeData::allocate", t1);
557 CH_TIMER("TracerParticleSolver::writeData::local_copy", t2);
558 CH_TIMER("TracerParticleSolver::writeData::interp_ghost", t3);
559 CH_TIMER("TracerParticleSolver::writeData::interp_centroid", t4);
560 CH_TIMER("TracerParticleSolver::writeData::final_copy", t5);
561 if (m_verbosity > 5) {
562 pout() << m_name + "::writeData" << endl;
563 }
564
565 // Number of components we are working with.
566 const int numComp = a_data[a_level]->nComp();
567
568 CH_START(t1);
569 LevelData<EBCellFAB> scratch;
570 m_amr->allocate(scratch, m_realm, m_phase, a_level, numComp);
571 CH_STOP(t1);
572
573 CH_START(t2);
574 m_amr->copyData(scratch, *a_data[a_level], a_level, m_realm, m_realm);
575 CH_STOP(t2);
576
577 // Interpolate ghost cells
578 CH_START(t3);
579 if (a_level > 0 && a_interpGhost) {
580 m_amr->interpGhost(scratch, *a_data[a_level - 1], a_level, m_realm, m_phase);
581 }
582 CH_STOP(t3);
583
584 CH_START(t4);
585 if (a_interpToCentroids) {
586 m_amr->interpToCentroids(scratch, m_realm, m_phase, a_level);
587 }
588 CH_STOP(t4);
589
590 DataOps::setCoveredValue(scratch, *m_amr->getCoveredCells(m_realm, m_phase)[a_level], 0.0);
591
592 CH_START(t5);
593 const Interval srcInterv(0, numComp - 1);
594 const Interval dstInterv(a_comp, a_comp + numComp - 1);
595 m_amr->copyData(a_output, scratch, a_level, a_outputRealm, m_realm, dstInterv, srcInterv);
596 CH_STOP(t5);
597
598 a_comp += numComp;
599}
600
601#ifdef CH_USE_HDF5
602template <typename P>
603inline void
604TracerParticleSolver<P>::writeCheckpointLevel(HDF5Handle& a_handle, const int a_level) const
605{
606 CH_TIME("TracerParticleSolver::writeCheckpointLevel(HDF5Handle, int)");
607 if (m_verbosity > 5) {
608 pout() << m_name + "::writeCheckpointLevel(HDF5Handle, int)" << endl;
609 }
610
611 DischargeIO::writeCheckParticlesToHDF(a_handle, m_particles[a_level], m_name + "_particles");
612}
613#endif
614
615#ifdef CH_USE_HDF5
616template <typename P>
617inline void
618TracerParticleSolver<P>::readCheckpointLevel(HDF5Handle& a_handle, const int a_level)
619{
620 CH_TIME("TracerParticleSolver::readCheckpointLevel(HDF5Handle, int)");
621 if (m_verbosity > 5) {
622 pout() << m_name + "::readCheckpointLevel(HDF5Handle, int)" << endl;
623 }
624
625 DischargeIO::readCheckParticlesFromHDF(a_handle, m_particles[a_level], m_name + "_particles");
626}
627#endif
628
629template <typename P>
630Real
632{
633 CH_TIME("TracerParticleSolver::computeDt()");
634 if (m_verbosity > 5) {
635 pout() << m_name + "::computeDt()" << endl;
636 }
637
638 Real dt = std::numeric_limits<Real>::infinity();
639
640 for (int lvl = 0; lvl <= m_amr->getFinestLevel(); lvl++) {
641 const DisjointBoxLayout& dbl = m_amr->getGrids(m_realm)[lvl];
642 const DataIterator& dit = dbl.dataIterator();
643 const Real dx = m_amr->getDx()[lvl];
644
645 const int nbox = dit.size();
646
647#pragma omp parallel for schedule(runtime) reduction(min : dt)
648 for (int mybox = 0; mybox < nbox; mybox++) {
649 const DataIndex& din = dit[mybox];
650
651 const ParticleSoA<P>& leaf = m_particles[lvl][din];
652 const std::size_t n = leaf.size();
653 const ParticleReal* const v[SpaceDim] = {
654 D_DECL(leaf.template column<&P::v_x>(), leaf.template column<&P::v_y>(), leaf.template column<&P::v_z>())};
655
656 for (std::size_t i = 0; i < n; i++) {
657 for (int dir = 0; dir < SpaceDim; dir++) {
658 dt = std::min(dt, dx / std::abs(static_cast<Real>(v[dir][i])));
659 }
660 }
661 }
662 }
663
664 // Get the minimum of dt over all MPI ranks.
665 dt = ParallelOps::min(dt);
666
667 return dt;
668}
669
670template <typename P>
673{
674 CH_TIME("TracerParticleSolver::getParticles()");
675 if (m_verbosity > 5) {
676 pout() << m_name + "::getParticles()" << endl;
677 }
678
679 return m_particles;
680}
681
682template <typename P>
683inline const ParticleContainer<P>&
685{
686 CH_TIME("TracerParticleSolver::getParticles()");
687 if (m_verbosity > 5) {
688 pout() << m_name + "::getParticles()" << endl;
689 }
690
691 return m_particles;
692}
693
694template <typename P>
695inline const EBAMRCellData&
697{
698 CH_TIME("TracerParticleSolver::getVelocityField()");
699 if (m_verbosity > 5) {
700 pout() << m_name + "::getVelocityField()" << endl;
701 }
702
703 return m_velocityField;
704}
705
706template <typename P>
707inline DepositionType
709{
710 CH_TIME("TracerParticleSolver::getDepositionType");
711 if (m_verbosity > 5) {
712 pout() << m_name + "::getDepositionType" << endl;
713 }
714
715 return m_deposition;
716}
717
718template <typename P>
721{
722 CH_TIME("TracerParticleSolver::getCoarseFineDepositionType");
723 if (m_verbosity > 5) {
724 pout() << m_name + "::getCoarseFineDepositionType" << endl;
725 }
726
727 return m_coarseFineDeposition;
728}
729
730template <typename P>
731inline DepositionType
733{
734 CH_TIME("TracerParticleSolver::getInterpolationType");
735 if (m_verbosity > 5) {
736 pout() << m_name + "::getInterpolationType" << endl;
737 }
738
739 return m_interpolation;
740}
741
742#include <CD_NamespaceFooter.H>
743
744#endif
CoarseFineDeposition
Coarse-fine deposition types (see CD_EBAMRParticleMesh for how these are handled).
Definition CD_CoarseFineDeposition.H:28
DepositionType
Deposition types.
Definition CD_DepositionType.H:24
Silly, but useful functions that override standard Chombo HDF5 IO.
@ Native
Deposit as-is, with no cut-cell treatment at all.
Agglomeration of basic MPI reductions.
CD_PARTICLE_REAL ParticleReal
Floating-point type a user may use for payload columns.
Definition CD_ParticleSoA.H:156
Declaration of a solver class that advances tracer particles.
static void volumeScale(EBAMRCellData &a_data, const Vector< Real > &a_dx)
Scale data by dx^SpaceDim.
Definition CD_DataOps.cpp:2297
static void setValue(LevelData< MFInterfaceFAB< T > > &a_lhs, const T &a_value)
Set value in an MFInterfaceFAB data holder.
Definition CD_DataOpsImplem.H:24
static void setCoveredValue(EBAMRCellData &a_lhs, const EBAMRCellData &a_coveredMask, const int a_comp, const Real a_value)
Set value in covered cells. Does specified component.
Definition CD_DataOps.cpp:2716
static void copy(MFAMRCellData &a_dst, const MFAMRCellData &a_src)
Copy data from one data holder to another.
Definition CD_DataOps.cpp:1262
AMR-hierarchy container of computational particles, stored per patch in Struct-of-Arrays form.
Definition CD_ParticleContainer.H:123
Arena-backed Struct-of-Arrays particle container for a single grid patch.
Definition CD_ParticleSoA.H:655
std::size_t size() const noexcept
Number of particles currently stored.
Definition CD_ParticleSoA.H:882
static const std::string primal
Identifier for perimal realm.
Definition CD_Realm.H:49
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:39
virtual CoarseFineDeposition getCoarseFineDepositionType() const
Get the coarse-fine deposition type.
Definition CD_TracerParticleSolverImplem.H:720
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 parsePlotVariables()
Parse plot variables.
Definition CD_TracerParticleSolverImplem.H:148
virtual void registerOperators() const
Register operators needed for AMR core functionality.
Definition CD_TracerParticleSolverImplem.H:177
virtual void setName(const std::string &a_name) noexcept
Set the solver name.
Definition CD_TracerParticleSolverImplem.H:209
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
virtual void deposit(EBAMRCellData &a_phi) const noexcept
Deposit particle weight on mesh.
Definition CD_TracerParticleSolverImplem.H:363
virtual void writeData(LevelData< EBCellFAB > &a_output, int &a_comp, const EBAMRCellData &a_data, const std::string a_outputRealm, const int a_level, const bool a_interpToCentroids, const bool a_interpGhost) const noexcept
Write data to output. Convenience function.
Definition CD_TracerParticleSolverImplem.H:547
virtual ~TracerParticleSolver()
Destructor.
Definition CD_TracerParticleSolverImplem.H:56
virtual void preRegrid(const int a_lbase, const int a_oldFinestLevel)
Perform pre-regrid operations.
Definition CD_TracerParticleSolverImplem.H:307
virtual ParticleContainer< P > & getParticles()
Get all particles.
Definition CD_TracerParticleSolverImplem.H:672
void parseDeposition()
Parse deposition method.
Definition CD_TracerParticleSolverImplem.H:91
void parseVerbosity()
Parse solver verbosity.
Definition CD_TracerParticleSolverImplem.H:163
RefCountedPtr< AmrMesh > m_amr
Handle to AMR mesh.
Definition CD_TracerParticleSolver.H:328
virtual Vector< std::string > getPlotVariableNames() const
Get plot variable names.
Definition CD_TracerParticleSolverImplem.H:490
RefCountedPtr< ComputationalGeometry > m_computationalGeometry
Handle to computational geometry.
Definition CD_TracerParticleSolver.H:333
virtual void writePlotData(LevelData< EBCellFAB > &a_output, int &a_comp, const std::string &a_outputRealm, const int a_level) const noexcept
Write plot data.
Definition CD_TracerParticleSolverImplem.H:519
virtual void parseRuntimeOptions()
Parse solver run-time options.
Definition CD_TracerParticleSolverImplem.H:77
virtual void writePlotFile()
Write plot file.
Definition CD_TracerParticleSolverImplem.H:418
virtual void setDeposition(const DepositionType a_deposition) noexcept
Set deposition method.
Definition CD_TracerParticleSolverImplem.H:351
virtual void setPhase(const phase::which_phase &a_phase)
Set the solver phase.
Definition CD_TracerParticleSolverImplem.H:245
virtual DepositionType getDepositionType() const
Get the deposition type.
Definition CD_TracerParticleSolverImplem.H:708
virtual void allocate()
Allocate storage for this solver.
Definition CD_TracerParticleSolverImplem.H:195
virtual DepositionType getInterpolationType() const
Get the interpolation type.
Definition CD_TracerParticleSolverImplem.H:732
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:401
const EBAMRCellData & getVelocityField() const
Return the velocity field.
Definition CD_TracerParticleSolverImplem.H:696
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 setVelocity(const EBAMRCellData &a_velocityField)
Set the tracer particle velocity field.
Definition CD_TracerParticleSolverImplem.H:295
virtual void interpolateWeight(const EBAMRCellData &a_scalar) noexcept
Interpolate a scalar field onto the particle weight.
Definition CD_TracerParticleSolverImplem.H:389
virtual int getNumberOfPlotVariables() const
Get the number of plot variables.
Definition CD_TracerParticleSolverImplem.H:469
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:631
virtual void setVolumeScale(const bool a_scale) noexcept
Turn on/off volume scaling.
Definition CD_TracerParticleSolverImplem.H:221
Real min(const Real &a_input) noexcept
Get the minimum of the input, reduced over MPI ranks (in the Chombo communicator)
Definition CD_ParallelOpsImplem.H:59
which_phase
Enumeration of supported phases.
Definition CD_MultiFluidIndexSpace.H:38
@ gas
Gas phase.
Definition CD_MultiFluidIndexSpace.H:39