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,
379 m_coarseFineDeposition,
391 CH_TIME(
"TracerParticleSolver::interpolateWeight(EBAMRCellData)");
392 if (m_verbosity > 5) {
393 pout() << m_name +
"::interpolateWeight(EBAMRCellData)" << endl;
396 m_amr->interpolateWeight(m_particles, m_realm, m_phase, a_scalar, m_interpolation,
true);
403 CH_TIME(
"TracerParticleSolver::interpolateVelocities()");
404 if (m_verbosity > 5) {
405 pout() << m_name +
"::interpolateVelocities()" << endl;
408 m_amr->interpolateParticles<D_DECL(&P::v_x, &P::v_y, &P::v_z)>(m_particles,
420 CH_TIME(
"TracerParticleSolver::writePlotFile()");
421 if (m_verbosity > 5) {
422 pout() << m_name +
"::writePlotFile()" << endl;
426 const int numPlotVars = this->getNumberOfPlotVariables();
427 const Vector<std::string> plotVarNames = this->getPlotVariableNames();
430 EBAMRCellData output;
431 m_amr->allocate(output, m_realm, m_phase, numPlotVars);
436 for (
int lvl = 0; lvl <= m_amr->getFinestLevel(); lvl++) {
437 this->writePlotData(*output[lvl], icomp, m_realm, lvl);
442 sprintf(filename,
"%s.step%07d.%dd.hdf5", m_name.c_str(), m_timeStep, SpaceDim);
443 std::string fname(filename);
446 Vector<LevelData<EBCellFAB>*> outputPtr;
447 m_amr->alias(outputPtr, output);
450 constexpr int numPlotGhost = 0;
452 DischargeIO::writeEBHDF5(fname,
454 m_amr->getGrids(m_realm),
458 m_amr->getRefinementRatios(),
462 m_amr->getFinestLevel() + 1,
471 CH_TIME(
"TracerParticleSolver::getNumberOfPlotVariables()");
472 if (m_verbosity > 5) {
473 pout() << m_name +
"::getNumberOfPlotVariables()" << endl;
481 if (m_plotVelocity) {
482 numPlotVars += SpaceDim;
489inline Vector<std::string>
492 CH_TIME(
"TracerParticleSolver::getPlotVariableNames()");
493 if (m_verbosity > 5) {
494 pout() << m_name +
"::getPlotVariableNames()" << endl;
497 Vector<std::string> plotVarNames(0);
500 plotVarNames.push_back(m_name +
" density");
502 if (m_plotVelocity) {
503 plotVarNames.push_back(
"x-velocity " + m_name);
505 if (m_plotVelocity) {
506 plotVarNames.push_back(
"y-velocity " + m_name);
509 if (m_plotVelocity) {
510 plotVarNames.push_back(
"z-velocity " + m_name);
521 const std::string& a_outputRealm,
522 const int a_level)
const noexcept
524 CH_TIME(
"TracerParticleSolver::writePlotData");
525 if (m_verbosity > 5) {
526 pout() << m_name +
"::writePlotData" << endl;
531 EBAMRCellData weight;
532 m_amr->allocate(weight, m_realm, m_phase, 1);
534 this->deposit(weight);
536 this->writeData(a_output, a_comp, weight, a_outputRealm, a_level,
false,
true);
540 if (m_plotVelocity) {
541 this->writeData(a_output, a_comp, m_velocityField, a_outputRealm, a_level,
true,
true);
549 const EBAMRCellData& a_data,
550 const std::string a_outputRealm,
552 const bool a_interpToCentroids,
553 const bool a_interpGhost)
const noexcept
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;
566 const int numComp = a_data[a_level]->nComp();
569 LevelData<EBCellFAB> scratch;
570 m_amr->allocate(scratch, m_realm, m_phase, a_level, numComp);
574 m_amr->copyData(scratch, *a_data[a_level], a_level, m_realm, m_realm);
579 if (a_level > 0 && a_interpGhost) {
580 m_amr->interpGhost(scratch, *a_data[a_level - 1], a_level, m_realm, m_phase);
585 if (a_interpToCentroids) {
586 m_amr->interpToCentroids(scratch, m_realm, m_phase, a_level);
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);
606 CH_TIME(
"TracerParticleSolver::writeCheckpointLevel(HDF5Handle, int)");
607 if (m_verbosity > 5) {
608 pout() << m_name +
"::writeCheckpointLevel(HDF5Handle, int)" << endl;
611 DischargeIO::writeCheckParticlesToHDF(a_handle, m_particles[a_level], m_name +
"_particles");
620 CH_TIME(
"TracerParticleSolver::readCheckpointLevel(HDF5Handle, int)");
621 if (m_verbosity > 5) {
622 pout() << m_name +
"::readCheckpointLevel(HDF5Handle, int)" << endl;
625 DischargeIO::readCheckParticlesFromHDF(a_handle, m_particles[a_level], m_name +
"_particles");
633 CH_TIME(
"TracerParticleSolver::computeDt()");
634 if (m_verbosity > 5) {
635 pout() << m_name +
"::computeDt()" << endl;
638 Real dt = std::numeric_limits<Real>::infinity();
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];
645 const int nbox = dit.size();
647#pragma omp parallel for schedule(runtime) reduction(min : dt)
648 for (
int mybox = 0; mybox < nbox; mybox++) {
649 const DataIndex& din = dit[mybox];
652 const std::size_t n = leaf.
size();
654 D_DECL(leaf.template column<&P::v_x>(), leaf.template column<&P::v_y>(), leaf.template column<&P::v_z>())};
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])));
674 CH_TIME(
"TracerParticleSolver::getParticles()");
675 if (m_verbosity > 5) {
676 pout() << m_name +
"::getParticles()" << endl;
686 CH_TIME(
"TracerParticleSolver::getParticles()");
687 if (m_verbosity > 5) {
688 pout() << m_name +
"::getParticles()" << endl;
695inline const EBAMRCellData&
698 CH_TIME(
"TracerParticleSolver::getVelocityField()");
699 if (m_verbosity > 5) {
700 pout() << m_name +
"::getVelocityField()" << endl;
703 return m_velocityField;
710 CH_TIME(
"TracerParticleSolver::getDepositionType");
711 if (m_verbosity > 5) {
712 pout() << m_name +
"::getDepositionType" << endl;
722 CH_TIME(
"TracerParticleSolver::getCoarseFineDepositionType");
723 if (m_verbosity > 5) {
724 pout() << m_name +
"::getCoarseFineDepositionType" << endl;
727 return m_coarseFineDeposition;
734 CH_TIME(
"TracerParticleSolver::getInterpolationType");
735 if (m_verbosity > 5) {
736 pout() << m_name +
"::getInterpolationType" << endl;
739 return m_interpolation;
742#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.
@ 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