12#ifndef CD_TracerParticleStepperImplem_H
13#define CD_TracerParticleStepperImplem_H
22#include <CD_NamespaceHeader.H>
29 CH_TIME(
"TracerParticleStepper::TracerParticleStepper");
40 CH_TIME(
"TracerParticleStepper::~TracerParticleStepper");
42 pout() <<
"TracerParticleStepper::~TracerParticleStepper" <<
endl;
50 CH_TIME(
"TracerParticleStepper::setupSolvers()");
52 pout() <<
"TracerParticleStepper::setupSolvers()" <<
endl;
66 CH_TIME(
"TracerParticleStepper::allocate()");
68 pout() <<
"TracerParticleStepper::allocate()" <<
endl;
79 CH_TIME(
"TracerParticleStepper::initialData()");
81 pout() <<
"TracerParticleStepper::initialData()" <<
endl;
85 this->initialParticles();
87 m_solver->setVelocity(m_velocity);
88 m_solver->interpolateVelocities();
95 CH_TIME(
"TracerParticleStepper::registerRealms()");
97 pout() <<
"TracerParticleStepper::registerRealms()" <<
endl;
107 CH_TIME(
"TracerParticleStepper::registerOperators()");
109 pout() <<
"TracerParticleStepper::registerOperators()" <<
endl;
112 m_solver->registerOperators();
119 CH_TIME(
"TracerParticleStepper::parseOptions()");
121 pout() <<
"TracerParticleStepper::parseOptions()" <<
endl;
124 this->parseIntegrator();
125 this->parseVelocityField();
126 this->parseInitialConditions();
133 CH_TIME(
"TracerParticleStepper::parseRuntimeOptions()");
135 pout() <<
"TracerParticleStepper::parseRuntimeOptions()" <<
endl;
138 this->parseIntegrator();
140 m_solver->parseRuntimeOptions();
147 CH_TIME(
"TracerParticleStepper::parseIntegrator()");
149 pout() <<
"TracerParticleStepper::parseIntegrator()" <<
endl;
157 pp.get(
"cfl", m_cfl);
158 pp.get(
"integration",
str);
159 if (
str ==
"euler") {
160 m_algorithm = IntegrationAlgorithm::Euler;
162 else if (
str ==
"rk2") {
163 m_algorithm = IntegrationAlgorithm::RK2;
165 else if (
str ==
"rk4") {
166 m_algorithm = IntegrationAlgorithm::RK4;
169 MayDay::Error(
"TracerParticleStepper::parseIntegrator -- logic bust");
177 CH_TIME(
"TracerParticleStepper::parseVelocityField()");
179 pout() <<
"TracerParticleStepper::parseVelocityField()" <<
endl;
185 pp.get(
"velocity_field",
v);
194 MayDay::Error(
"TracerParticleStepper::parseVelocityField -- logic bust");
202 CH_TIME(
"TracerParticleStepper::parseInitialConditions()");
204 pout() <<
"TracerParticleStepper::parseInitialConditions()" <<
endl;
220 CH_TIME(
"TracerParticleStepper::writeCheckpointData(HDF5Handle, int)");
222 pout() <<
"TracerParticleStepper::writeCheckpointData(HDF5Handle, int)" <<
endl;
234 CH_TIME(
"TracerParticleStepper::readCheckpointData(HDF5Handle, int)");
236 pout() <<
"TracerParticleStepper::readCheckpointData(HDF5Handle, int)" <<
endl;
247 CH_TIME(
"TracerParticleStepper::getNumberOfPlotVariables()");
249 pout() <<
"TracerParticleStepper::getNumberOfPlotVariables()" <<
endl;
252 return m_solver->getNumberOfPlotVariables();
259 CH_TIME(
"TracerParticleStepper::getPlotVariableNames()");
261 pout() <<
"TracerParticleStepper::getPlotVariableNames()" <<
endl;
264 return m_solver->getPlotVariableNames();
274 CH_TIME(
"TracerParticleStepper::writePlotData(EBAMRCellData, Vector<std::string>, int)");
276 pout() <<
"TracerParticleStepper::writePlotData(EBAMRCellData, Vector<std::string>, int)" <<
endl;
289 CH_TIME(
"TracerParticleStepper::computeDt()");
291 pout() <<
"TracerParticleStepper::computeDt()" <<
endl;
294 return m_cfl * m_solver->computeDt();
301 CH_TIME(
"TracerParticleStepper::advance(Real)");
303 pout() <<
"TracerParticleStepper::advance(Real)" <<
endl;
306 switch (m_algorithm) {
307 case IntegrationAlgorithm::Euler: {
308 this->advanceParticlesEuler(
a_dt);
312 case IntegrationAlgorithm::RK2: {
313 this->advanceParticlesRK2(
a_dt);
317 case IntegrationAlgorithm::RK4: {
318 this->advanceParticlesRK4(
a_dt);
323 MayDay::Error(
"TracerParticleStepper::advance -- logic bust");
334 CH_TIME(
"TracerParticleStepper::synchronizeSolverTimes");
336 pout() <<
"TracerParticleStepper::synchronizeSolverTimes" <<
endl;
350 CH_TIME(
"TracerParticleStepper::preRegrid(int, int)");
352 pout() <<
"TracerParticleStepper::preRegrid(int, int)" <<
endl;
362 CH_TIME(
"TracerParticleStepper::regrid(int, int, int)");
364 pout() <<
"TracerParticleStepper::regrid(int, int, int)" <<
endl;
379 CH_TIME(
"TracerParticleStepper::postRegrid()");
381 pout() <<
"TracerParticleStepper::postRegrid()" <<
endl;
386 m_solver->interpolateVelocities();
393 CH_TIME(
"TracerParticleStepper::setVelocity()");
395 pout() <<
"TracerParticleStepper::setVelocity()" <<
endl;
401 case VelocityField::Diagonal: {
408 case VelocityField::Rotational: {
430 CH_TIME(
"TracerParticleStepper::initialParticles()");
432 pout() <<
"TracerParticleStepper::initialParticles()" <<
endl;
460 ParticleManagement::drawRandomParticles(initialParticles, m_numInitialParticles,
uniformDistribution);
462 lit().weight() = 1.0;
471 pout() <<
"removing particles" <<
endl;
473 pout() <<
"done initial particles" <<
endl;
480 CH_TIME(
"TracerParticleStepper::advanceParticlesEuler()");
482 pout() <<
"TracerParticleStepper::advanceParticlesEuler()" <<
endl;
495#pragma omp parallel for schedule(runtime)
504 p.position() += p.velocity() *
a_dt;
519 CH_TIME(
"TracerParticleStepper::advanceParticlesRK2()");
521 pout() <<
"TracerParticleStepper::advanceParticlesRK2()" <<
endl;
535#pragma omp parallel for schedule(runtime)
544 p.template
vect<0>() = p.position();
545 p.template
vect<1>() = p.velocity();
547 p.position() += p.velocity() *
a_dt;
564#pragma omp parallel for schedule(runtime)
574 p.position() = p.template
vect<0>() + 0.5 *
a_dt * (p.template
vect<1>() + p.velocity());
589 CH_TIME(
"TracerParticleStepper::advanceParticlesRK4()");
591 pout() <<
"TracerParticleStepper::advanceParticlesRK4()" <<
endl;
610#pragma omp parallel for schedule(runtime)
618 p.template
vect<0>() = p.position();
620 p.template
vect<1>() = p.velocity();
639#pragma omp parallel for schedule(runtime)
646 p.template
vect<2>() = p.velocity();
665#pragma omp parallel for schedule(runtime)
672 p.template
vect<3>() = p.velocity();
673 p.position() = p.template
vect<0>() +
a_dt * p.velocity();
691#pragma omp parallel for schedule(runtime)
712#include <CD_NamespaceFooter.H>
Namespace containing various particle management utilities.
File containing some useful static methods related to random number generation.
Declaration of a TimeStepper implementation for advancing a tracer particle solver.
static void setValue(LevelData< MFInterfaceFAB< T > > &a_lhs, const T &a_value)
Set value in an MFInterfaceFAB data holder.
Definition CD_DataOpsImplem.H:23
Implementation of TimeStepper for advancing tracer particles in a fixed velocity field.
Definition CD_TracerParticleStepper.H:51
void registerRealms() override
Register realms. Primal is the only realm we need.
Definition CD_TracerParticleStepperImplem.H:93
virtual void parseInitialConditions()
Parse initial conditions.
Definition CD_TracerParticleStepperImplem.H:200
void parseRuntimeOptions() override
Parse runtime options.
Definition CD_TracerParticleStepperImplem.H:131
void initialData() override
Fill problem with initial data.
Definition CD_TracerParticleStepperImplem.H:77
void registerOperators() override
Register operators.
Definition CD_TracerParticleStepperImplem.H:105
virtual Real computeDt() override
Compute a time step to be used by Driver.
Definition CD_TracerParticleStepperImplem.H:287
void writePlotData(LevelData< EBCellFAB > &a_output, int &a_icomp, const std::string a_realm, const int a_level) const override
Write plot data to output holder.
Definition CD_TracerParticleStepperImplem.H:269
int getNumberOfPlotVariables() const override
Get number of plot variables for this physics module.
Definition CD_TracerParticleStepperImplem.H:245
virtual void advanceParticlesEuler(const Real a_dt)
Advance particles using explicit Euler rule.
Definition CD_TracerParticleStepperImplem.H:478
virtual void preRegrid(const int a_lmin, const int a_oldFinestLevel) override
Perform pre-regrid operations.
Definition CD_TracerParticleStepperImplem.H:348
void allocate() override
Allocate storage for solvers and time stepper.
Definition CD_TracerParticleStepperImplem.H:64
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel) override
Time stepper regrid method.
Definition CD_TracerParticleStepperImplem.H:360
virtual Real advance(const Real a_dt) override
Advancement method. Swaps between various kernels.
Definition CD_TracerParticleStepperImplem.H:299
void parseOptions()
Parse options.
Definition CD_TracerParticleStepperImplem.H:117
virtual void synchronizeSolverTimes(const int a_step, const Real a_time, const Real a_dt) override
Synchronize solver times and time steps.
Definition CD_TracerParticleStepperImplem.H:332
virtual void advanceParticlesRK2(const Real a_dt)
Advance particles using second order Runge-Kutta.
Definition CD_TracerParticleStepperImplem.H:517
void setupSolvers() override
Instantiate the tracer particle solver.
Definition CD_TracerParticleStepperImplem.H:48
virtual ~TracerParticleStepper()
Destructor.
Definition CD_TracerParticleStepperImplem.H:38
virtual void advanceParticlesRK4(const Real a_dt)
Advance particles using fourth order Runge-Kutta.
Definition CD_TracerParticleStepperImplem.H:587
Vector< std::string > getPlotVariableNames() const override
Get plot variable names.
Definition CD_TracerParticleStepperImplem.H:257
virtual void parseVelocityField()
Parse velocity field.
Definition CD_TracerParticleStepperImplem.H:175
virtual void parseIntegrator()
Parse reactive integrator.
Definition CD_TracerParticleStepperImplem.H:145
virtual void postRegrid() override
Perform post-regrid operations.
Definition CD_TracerParticleStepperImplem.H:377
virtual void initialParticles()
Fill initial particles.
Definition CD_TracerParticleStepperImplem.H:428
TracerParticleStepper()
Constructor. Does nothing.
Definition CD_TracerParticleStepperImplem.H:27
virtual void setVelocity()
Set the velocity on the mesh.
Definition CD_TracerParticleStepperImplem.H:391
static Real getUniformReal01()
Get a uniform real number on the interval [0,1].
Definition CD_RandomImplem.H:152
static const std::string Primal
Identifier for perimal realm.
Definition CD_Realm.H:38
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:37
virtual void remap()
Remap particles.
Definition CD_TracerParticleSolverImplem.H:338
virtual void setRealm(const std::string &a_realm)
Set the solver realm.
Definition CD_TracerParticleSolverImplem.H:232
phase::which_phase m_phase
Phase where this solver lives.
Definition CD_TracerParticleSolver.H:360
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:25
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:256
std::string m_realm
Realm where this solver lives.
Definition CD_TracerParticleSolver.H:345
virtual ParticleContainer< P > & getParticles()
Get all particles.
Definition CD_TracerParticleSolverImplem.H:662
int m_verbosity
Verbosity level.
Definition CD_TracerParticleSolver.H:380
RefCountedPtr< AmrMesh > m_amr
Handle to AMR mesh.
Definition CD_TracerParticleSolver.H:320
RefCountedPtr< ComputationalGeometry > m_computationalGeometry
Handle to computational geometry.
Definition CD_TracerParticleSolver.H:325
virtual void setPhase(const phase::which_phase &a_phase)
Set the solver phase.
Definition CD_TracerParticleSolverImplem.H:244
Real m_dt
Time step.
Definition CD_TracerParticleSolver.H:365
virtual void allocate()
Allocate storage for this solver.
Definition CD_TracerParticleSolverImplem.H:194
int m_timeStep
Time step.
Definition CD_TracerParticleSolver.H:375
virtual void interpolateVelocities()
Interpolate particles velocities.
Definition CD_TracerParticleSolverImplem.H:392
virtual void parseOptions()
Parse solver options.
Definition CD_TracerParticleSolverImplem.H:62
virtual void setVelocity(const EBAMRCellData &a_velocityField)
Set the tracer particle velocity field.
Definition CD_TracerParticleSolverImplem.H:294
Real m_time
Time.
Definition CD_TracerParticleSolver.H:370
EBAMRCellData m_velocityField
Mesh-based velocity field. Must be set through setVelocity.
Definition CD_TracerParticleSolver.H:400
Namespace for encapsulating physics code for tracer particles.
Definition CD_TracerParticlePhysics.H:21