13#ifndef CD_TRACERPARTICLESOLVERIMPLEM_H
14#define CD_TRACERPARTICLESOLVERIMPLEM_H
23#include <CD_NamespaceHeader.H>
28 CH_TIME(
"TracerParticleSolver::TracerParticleSolver()");
32 m_name =
"TracerParticleSolver";
33 m_className =
"TracerParticleSolver";
36 m_plotVelocity =
true;
38 m_volumeScale =
false;
39 m_deposition = DepositionType::CIC;
40 m_interpolation = DepositionType::CIC;
41 m_coarseFineDeposition = CoarseFineDeposition::Transition;
46 const RefCountedPtr<ComputationalGeometry>& a_compGeom)
49 CH_TIME(
"TracerParticleSolver::TracerParticleSolver(RefCountedPtr<AmrMesh>, RefCountedPtr<ComputationalGeometry>)");
58 CH_TIME(
"TracerParticleSolver::~TracerParticleSolver()");
65 CH_TIME(
"TracerParticleSolver::parseOptions()");
66 if (m_verbosity > 5) {
67 pout() << m_name +
"::parseOptions()" << endl;
70 this->parseDeposition();
71 this->parsePlotVariables();
72 this->parseVerbosity();
79 CH_TIME(
"TracerParticleSolver::parseRuntimeOptions()");
80 if (m_verbosity > 5) {
81 pout() << m_name +
"::parseRuntimeOptions()" << endl;
84 this->parseDeposition();
85 this->parsePlotVariables();
86 this->parseVerbosity();
93 CH_TIME(
"TracerParticleSolver::parseDeposition()");
94 if (m_verbosity > 5) {
95 pout() << m_name +
"::parseDeposition()" << endl;
98 ParmParse pp(m_className.c_str());
103 pp.get(
"deposition", str);
105 m_deposition = DepositionType::NGP;
107 else if (str ==
"cic") {
108 m_deposition = DepositionType::CIC;
111 MayDay::Error(
"TracerParticleSolver::parseDeposition - unknown deposition method requested.");
114 pp.get(
"deposition_cf", str);
115 if (str ==
"interp") {
116 m_coarseFineDeposition = CoarseFineDeposition::Interp;
118 else if (str ==
"halo") {
119 m_coarseFineDeposition = CoarseFineDeposition::Halo;
121 else if (str ==
"halo_ngp") {
122 m_coarseFineDeposition = CoarseFineDeposition::HaloNGP;
124 else if (str ==
"transition") {
125 m_coarseFineDeposition = CoarseFineDeposition::Transition;
128 MayDay::Error(
"TracerParticleSolver::parseDeposition - unknown coarse-fine deposition method requested.");
132 pp.get(
"interpolation", str);
134 m_interpolation = DepositionType::NGP;
136 else if (str ==
"cic") {
137 m_interpolation = DepositionType::CIC;
140 MayDay::Error(
"TracerParticleSolver::parseDeposition - unknown interpolation method requested.");
143 pp.get(
"volume_scale", m_volumeScale);
150 CH_TIME(
"TracerParticleSolver::parsePlotVariables()");
151 if (m_verbosity > 5) {
152 pout() << m_name +
"::parsePlotVariables()" << endl;
155 ParmParse pp(m_className.c_str());
157 pp.get(
"plot_weight", m_plotWeight);
158 pp.get(
"plot_velocity", m_plotVelocity);
165 CH_TIME(
"TracerParticleSolver::parseVerbosity()");
166 if (m_verbosity > 5) {
167 pout() << m_name +
"::parseVerbosity()" << endl;
170 ParmParse pp(m_className.c_str());
172 pp.get(
"verbosity", m_verbosity);
179 CH_TIME(
"TracerParticleSolver::registerOperators()");
180 if (m_verbosity > 5) {
181 pout() << m_name +
"::registerOperators()" << endl;
184 if (m_amr.isNull()) {
185 MayDay::Abort(
"TracerParticleSolver::registerOperators - need to set AmrMesh!");
188 m_amr->registerOperator(s_particle_mesh, m_realm, m_phase);
189 m_amr->registerOperator(s_eb_coar_ave, m_realm, m_phase);
197 CH_TIME(
"TracerParticleSolver::allocate()");
198 if (m_verbosity > 5) {
199 pout() << m_name +
"::allocate()" << endl;
203 m_amr->allocate(m_particles, m_realm);
204 m_amr->allocate(m_velocityField, m_realm, m_phase, SpaceDim);
211 CH_TIME(
"TracerParticleSolver::setName(std::string)");
212 if (m_verbosity > 5) {
213 pout() << m_name +
"::setName(std::string)" << endl;
223 CH_TIME(
"TracerParticleSolver::setVolumeScale(bool)");
224 if (m_verbosity > 5) {
225 pout() << m_name +
"::setVolumeScale(bool)" << endl;
228 m_volumeScale = a_scale;
235 CH_TIME(
"TracerParticleSolver::setRealm(std::string)");
236 if (m_verbosity > 5) {
237 pout() << m_name +
"::setRealm(std::string)" << endl;
247 CH_TIME(
"TracerParticleSolver::setPhase(phase::which_phase)");
248 if (m_verbosity > 5) {
249 pout() << m_name +
"::setPhase(phase::which_phase)" << endl;
259 CH_TIME(
"TracerParticleSolver::setTime(int, Real, Real)");
260 if (m_verbosity > 5) {
261 pout() << m_name +
"::setTime(int, Real, Real)" << endl;
273 CH_TIME(
"TracerParticleSolver::setAmr(RefCountedPtr<AmrMesh>)");
274 if (m_verbosity > 5) {
275 pout() << m_name +
"::setAmr(RefCountedPtr<AmrMesh>)" << endl;
285 CH_TIME(
"TracerParticleSolver::setComputationalGeometry(RefCountedPtr<ComputationalGeometry>)");
286 if (m_verbosity > 5) {
287 pout() << m_name +
"::setComputationalGeometry(RefCountedPtr<ComputationalGeometry>)" << endl;
290 m_computationalGeometry = a_compGeom;
297 CH_TIME(
"TracerParticleSolver::setVelocity(EBAMRCellData)");
298 if (m_verbosity > 5) {
299 pout() << m_name +
"::setVelocity(EBAMRCellData)" << endl;
309 CH_TIME(
"TracerParticleSolver::preRegrid(int, int)");
310 if (m_verbosity > 5) {
311 pout() << m_name +
"::preRegrid(int, int)" << endl;
314 CH_assert(a_lbase >= 0);
317 m_particles.preRegrid();
324 CH_TIME(
"TracerParticleSolver::regrid(int, int, int)");
325 if (m_verbosity > 5) {
326 pout() << m_name +
"::regrid(int, int, int)" << endl;
329 CH_assert(a_lmin >= 0);
330 CH_assert(a_oldFinestLevel >= 0);
331 CH_assert(a_newFinestLevel >= 0);
333 m_amr->remapToNewGrids(m_particles, a_lmin, a_newFinestLevel);
334 m_amr->allocate(m_velocityField, m_realm, m_phase, SpaceDim);
341 CH_TIME(
"TracerParticleSolver::remap()");
342 if (m_verbosity > 5) {
343 pout() << m_name +
"::remap()" << endl;
353 CH_TIME(
"TracerParticleSolver::setDeposition");
354 if (m_verbosity > 5) {
355 pout() << m_name +
"::setDeposition" << endl;
358 m_deposition = a_deposition;
365 CH_TIME(
"TracerParticleSolver::deposit(EBAMRCellData)");
366 if (m_verbosity > 5) {
367 pout() << m_name +
"::deposit(EBAMRCellData)" << endl;
372 CH_assert(a_phi[0]->nComp() == 1);
374 m_amr->depositWeight(a_phi, m_realm, m_phase, m_particles, m_deposition, m_coarseFineDeposition,
false);
385 CH_TIME(
"TracerParticleSolver::interpolateWeight(EBAMRCellData)");
386 if (m_verbosity > 5) {
387 pout() << m_name +
"::interpolateWeight(EBAMRCellData)" << endl;
390 m_amr->interpolateWeight(m_particles, m_realm, m_phase, a_scalar, m_interpolation,
true);
397 CH_TIME(
"TracerParticleSolver::interpolateVelocities()");
398 if (m_verbosity > 5) {
399 pout() << m_name +
"::interpolateVelocities()" << endl;
402 m_amr->interpolateParticles<D_DECL(&P::v_x, &P::v_y, &P::v_z)>(m_particles,
414 CH_TIME(
"TracerParticleSolver::writePlotFile()");
415 if (m_verbosity > 5) {
416 pout() << m_name +
"::writePlotFile()" << endl;
420 const int numPlotVars = this->getNumberOfPlotVariables();
421 const Vector<std::string> plotVarNames = this->getPlotVariableNames();
424 EBAMRCellData output;
425 m_amr->allocate(output, m_realm, m_phase, numPlotVars);
430 for (
int lvl = 0; lvl <= m_amr->getFinestLevel(); lvl++) {
431 this->writePlotData(*output[lvl], icomp, m_realm, lvl);
436 sprintf(filename,
"%s.step%07d.%dd.hdf5", m_name.c_str(), m_timeStep, SpaceDim);
437 std::string fname(filename);
440 Vector<LevelData<EBCellFAB>*> outputPtr;
441 m_amr->alias(outputPtr, output);
444 constexpr int numPlotGhost = 0;
446 DischargeIO::writeEBHDF5(fname,
448 m_amr->getGrids(m_realm),
452 m_amr->getRefinementRatios(),
456 m_amr->getFinestLevel() + 1,
465 CH_TIME(
"TracerParticleSolver::getNumberOfPlotVariables()");
466 if (m_verbosity > 5) {
467 pout() << m_name +
"::getNumberOfPlotVariables()" << endl;
475 if (m_plotVelocity) {
476 numPlotVars += SpaceDim;
483inline Vector<std::string>
486 CH_TIME(
"TracerParticleSolver::getPlotVariableNames()");
487 if (m_verbosity > 5) {
488 pout() << m_name +
"::getPlotVariableNames()" << endl;
491 Vector<std::string> plotVarNames(0);
494 plotVarNames.push_back(m_name +
" density");
496 if (m_plotVelocity) {
497 plotVarNames.push_back(
"x-velocity " + m_name);
499 if (m_plotVelocity) {
500 plotVarNames.push_back(
"y-velocity " + m_name);
503 if (m_plotVelocity) {
504 plotVarNames.push_back(
"z-velocity " + m_name);
515 const std::string& a_outputRealm,
516 const int a_level)
const noexcept
518 CH_TIME(
"TracerParticleSolver::writePlotData");
519 if (m_verbosity > 5) {
520 pout() << m_name +
"::writePlotData" << endl;
525 EBAMRCellData weight;
526 m_amr->allocate(weight, m_realm, m_phase, 1);
528 this->deposit(weight);
530 this->writeData(a_output, a_comp, weight, a_outputRealm, a_level,
false,
true);
534 if (m_plotVelocity) {
535 this->writeData(a_output, a_comp, m_velocityField, a_outputRealm, a_level,
true,
true);
543 const EBAMRCellData& a_data,
544 const std::string a_outputRealm,
546 const bool a_interpToCentroids,
547 const bool a_interpGhost)
const noexcept
549 CH_TIMERS(
"TracerParticleSolver::writeData");
550 CH_TIMER(
"TracerParticleSolver::writeData::allocate", t1);
551 CH_TIMER(
"TracerParticleSolver::writeData::local_copy", t2);
552 CH_TIMER(
"TracerParticleSolver::writeData::interp_ghost", t3);
553 CH_TIMER(
"TracerParticleSolver::writeData::interp_centroid", t4);
554 CH_TIMER(
"TracerParticleSolver::writeData::final_copy", t5);
555 if (m_verbosity > 5) {
556 pout() << m_name +
"::writeData" << endl;
560 const int numComp = a_data[a_level]->nComp();
563 LevelData<EBCellFAB> scratch;
564 m_amr->allocate(scratch, m_realm, m_phase, a_level, numComp);
568 m_amr->copyData(scratch, *a_data[a_level], a_level, m_realm, m_realm);
573 if (a_level > 0 && a_interpGhost) {
574 m_amr->interpGhost(scratch, *a_data[a_level - 1], a_level, m_realm, m_phase);
579 if (a_interpToCentroids) {
580 m_amr->interpToCentroids(scratch, m_realm, m_phase, a_level);
587 const Interval srcInterv(0, numComp - 1);
588 const Interval dstInterv(a_comp, a_comp + numComp - 1);
589 m_amr->copyData(a_output, scratch, a_level, a_outputRealm, m_realm, dstInterv, srcInterv);
600 CH_TIME(
"TracerParticleSolver::writeCheckpointLevel(HDF5Handle, int)");
601 if (m_verbosity > 5) {
602 pout() << m_name +
"::writeCheckpointLevel(HDF5Handle, int)" << endl;
605 DischargeIO::writeCheckParticlesToHDF(a_handle, m_particles[a_level], m_name +
"_particles");
614 CH_TIME(
"TracerParticleSolver::readCheckpointLevel(HDF5Handle, int)");
615 if (m_verbosity > 5) {
616 pout() << m_name +
"::readCheckpointLevel(HDF5Handle, int)" << endl;
619 DischargeIO::readCheckParticlesFromHDF(a_handle, m_particles[a_level], m_name +
"_particles");
627 CH_TIME(
"TracerParticleSolver::computeDt()");
628 if (m_verbosity > 5) {
629 pout() << m_name +
"::computeDt()" << endl;
632 Real dt = std::numeric_limits<Real>::infinity();
634 for (
int lvl = 0; lvl <= m_amr->getFinestLevel(); lvl++) {
635 const DisjointBoxLayout& dbl = m_amr->getGrids(m_realm)[lvl];
636 const DataIterator& dit = dbl.dataIterator();
637 const Real dx = m_amr->getDx()[lvl];
639 const int nbox = dit.size();
641#pragma omp parallel for schedule(runtime) reduction(min : dt)
642 for (
int mybox = 0; mybox < nbox; mybox++) {
643 const DataIndex& din = dit[mybox];
646 const std::size_t n = leaf.
size();
648 D_DECL(leaf.template column<&P::v_x>(), leaf.template column<&P::v_y>(), leaf.template column<&P::v_z>())};
650 for (std::size_t i = 0; i < n; i++) {
651 for (
int dir = 0; dir < SpaceDim; dir++) {
652 dt = std::min(dt, dx / std::abs(
static_cast<Real
>(v[dir][i])));
668 CH_TIME(
"TracerParticleSolver::getParticles()");
669 if (m_verbosity > 5) {
670 pout() << m_name +
"::getParticles()" << endl;
680 CH_TIME(
"TracerParticleSolver::getParticles()");
681 if (m_verbosity > 5) {
682 pout() << m_name +
"::getParticles()" << endl;
689inline const EBAMRCellData&
692 CH_TIME(
"TracerParticleSolver::getVelocityField()");
693 if (m_verbosity > 5) {
694 pout() << m_name +
"::getVelocityField()" << endl;
697 return m_velocityField;
704 CH_TIME(
"TracerParticleSolver::getDepositionType");
705 if (m_verbosity > 5) {
706 pout() << m_name +
"::getDepositionType" << endl;
716 CH_TIME(
"TracerParticleSolver::getCoarseFineDepositionType");
717 if (m_verbosity > 5) {
718 pout() << m_name +
"::getCoarseFineDepositionType" << endl;
721 return m_coarseFineDeposition;
728 CH_TIME(
"TracerParticleSolver::getInterpolationType");
729 if (m_verbosity > 5) {
730 pout() << m_name +
"::getInterpolationType" << endl;
733 return m_interpolation;
736#include <CD_NamespaceFooter.H>
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.
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:2236
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:2655
static void copy(MFAMRCellData &a_dst, const MFAMRCellData &a_src)
Copy data from one data holder to another.
Definition CD_DataOps.cpp:1201
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:714
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:541
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:666
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:484
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:513
virtual void parseRuntimeOptions()
Parse solver run-time options.
Definition CD_TracerParticleSolverImplem.H:77
virtual void writePlotFile()
Write plot file.
Definition CD_TracerParticleSolverImplem.H:412
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:702
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:726
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:395
const EBAMRCellData & getVelocityField() const
Return the velocity field.
Definition CD_TracerParticleSolverImplem.H:690
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:383
virtual int getNumberOfPlotVariables() const
Get the number of plot variables.
Definition CD_TracerParticleSolverImplem.H:463
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:625
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