13#ifndef CD_TRACERPARTICLESTEPPERIMPLEM_H
14#define CD_TRACERPARTICLESTEPPERIMPLEM_H
23#include <CD_NamespaceHeader.H>
30 CH_TIME(
"TracerParticleStepper::TracerParticleStepper");
41 CH_TIME(
"TracerParticleStepper::~TracerParticleStepper");
43 pout() <<
"TracerParticleStepper::~TracerParticleStepper" <<
endl;
51 CH_TIME(
"TracerParticleStepper::setupSolvers()");
53 pout() <<
"TracerParticleStepper::setupSolvers()" <<
endl;
67 CH_TIME(
"TracerParticleStepper::allocate()");
69 pout() <<
"TracerParticleStepper::allocate()" <<
endl;
80 CH_TIME(
"TracerParticleStepper::initialData()");
82 pout() <<
"TracerParticleStepper::initialData()" <<
endl;
86 this->initialParticles();
88 m_solver->setVelocity(m_velocity);
89 m_solver->interpolateVelocities();
96 CH_TIME(
"TracerParticleStepper::registerRealms()");
98 pout() <<
"TracerParticleStepper::registerRealms()" <<
endl;
108 CH_TIME(
"TracerParticleStepper::registerOperators()");
110 pout() <<
"TracerParticleStepper::registerOperators()" <<
endl;
113 m_solver->registerOperators();
120 CH_TIME(
"TracerParticleStepper::parseOptions()");
122 pout() <<
"TracerParticleStepper::parseOptions()" <<
endl;
125 this->parseIntegrator();
126 this->parseVelocityField();
127 this->parseInitialConditions();
134 CH_TIME(
"TracerParticleStepper::parseRuntimeOptions()");
136 pout() <<
"TracerParticleStepper::parseRuntimeOptions()" <<
endl;
139 this->parseIntegrator();
141 m_solver->parseRuntimeOptions();
148 CH_TIME(
"TracerParticleStepper::parseIntegrator()");
150 pout() <<
"TracerParticleStepper::parseIntegrator()" <<
endl;
158 pp.get(
"cfl", m_cfl);
159 pp.get(
"integration",
str);
160 if (
str ==
"euler") {
161 m_algorithm = IntegrationAlgorithm::Euler;
163 else if (
str ==
"rk2") {
164 m_algorithm = IntegrationAlgorithm::RK2;
166 else if (
str ==
"rk4") {
167 m_algorithm = IntegrationAlgorithm::RK4;
170 MayDay::Error(
"TracerParticleStepper::parseIntegrator -- logic bust");
178 CH_TIME(
"TracerParticleStepper::parseVelocityField()");
180 pout() <<
"TracerParticleStepper::parseVelocityField()" <<
endl;
186 pp.get(
"velocity_field",
v);
195 MayDay::Error(
"TracerParticleStepper::parseVelocityField -- logic bust");
203 CH_TIME(
"TracerParticleStepper::parseInitialConditions()");
205 pout() <<
"TracerParticleStepper::parseInitialConditions()" <<
endl;
221 CH_TIME(
"TracerParticleStepper::writeCheckpointData(HDF5Handle, int)");
223 pout() <<
"TracerParticleStepper::writeCheckpointData(HDF5Handle, int)" <<
endl;
235 CH_TIME(
"TracerParticleStepper::readCheckpointData(HDF5Handle, int)");
237 pout() <<
"TracerParticleStepper::readCheckpointData(HDF5Handle, int)" <<
endl;
248 CH_TIME(
"TracerParticleStepper::getNumberOfPlotVariables()");
250 pout() <<
"TracerParticleStepper::getNumberOfPlotVariables()" <<
endl;
253 return m_solver->getNumberOfPlotVariables();
260 CH_TIME(
"TracerParticleStepper::getPlotVariableNames()");
262 pout() <<
"TracerParticleStepper::getPlotVariableNames()" <<
endl;
265 return m_solver->getPlotVariableNames();
275 CH_TIME(
"TracerParticleStepper::writePlotData(EBAMRCellData, Vector<std::string>, int)");
277 pout() <<
"TracerParticleStepper::writePlotData(EBAMRCellData, Vector<std::string>, int)" <<
endl;
290 CH_TIME(
"TracerParticleStepper::computeDt()");
292 pout() <<
"TracerParticleStepper::computeDt()" <<
endl;
295 return m_cfl * m_solver->computeDt();
302 CH_TIME(
"TracerParticleStepper::advance(Real)");
304 pout() <<
"TracerParticleStepper::advance(Real)" <<
endl;
307 switch (m_algorithm) {
308 case IntegrationAlgorithm::Euler: {
309 this->advanceParticlesEuler(
a_dt);
313 case IntegrationAlgorithm::RK2: {
314 this->advanceParticlesRK2(
a_dt);
318 case IntegrationAlgorithm::RK4: {
319 this->advanceParticlesRK4(
a_dt);
324 MayDay::Error(
"TracerParticleStepper::advance -- logic bust");
335 CH_TIME(
"TracerParticleStepper::synchronizeSolverTimes");
337 pout() <<
"TracerParticleStepper::synchronizeSolverTimes" <<
endl;
351 CH_TIME(
"TracerParticleStepper::preRegrid(int, int)");
353 pout() <<
"TracerParticleStepper::preRegrid(int, int)" <<
endl;
363 CH_TIME(
"TracerParticleStepper::regrid(int, int, int)");
365 pout() <<
"TracerParticleStepper::regrid(int, int, int)" <<
endl;
380 CH_TIME(
"TracerParticleStepper::postRegrid()");
382 pout() <<
"TracerParticleStepper::postRegrid()" <<
endl;
387 m_solver->interpolateVelocities();
394 CH_TIME(
"TracerParticleStepper::setVelocity()");
396 pout() <<
"TracerParticleStepper::setVelocity()" <<
endl;
402 case VelocityField::Diagonal: {
409 case VelocityField::Rotational: {
435 CH_TIME(
"TracerParticleStepper::initialParticles()");
437 pout() <<
"TracerParticleStepper::initialParticles()" <<
endl;
465 ParticleManagement::drawRandomParticles(initialParticles, m_numInitialParticles,
uniformDistribution);
467 lit().weight() = 1.0;
476 pout() <<
"removing particles" <<
endl;
478 pout() <<
"done initial particles" <<
endl;
485 CH_TIME(
"TracerParticleStepper::advanceParticlesEuler()");
487 pout() <<
"TracerParticleStepper::advanceParticlesEuler()" <<
endl;
500#pragma omp parallel for schedule(runtime)
509 p.position() += p.velocity() *
a_dt;
524 CH_TIME(
"TracerParticleStepper::advanceParticlesRK2()");
526 pout() <<
"TracerParticleStepper::advanceParticlesRK2()" <<
endl;
540#pragma omp parallel for schedule(runtime)
549 p.template
vect<0>() = p.position();
550 p.template
vect<1>() = p.velocity();
552 p.position() += p.velocity() *
a_dt;
569#pragma omp parallel for schedule(runtime)
579 p.position() = p.template
vect<0>() + 0.5 *
a_dt * (p.template
vect<1>() + p.velocity());
594 CH_TIME(
"TracerParticleStepper::advanceParticlesRK4()");
596 pout() <<
"TracerParticleStepper::advanceParticlesRK4()" <<
endl;
615#pragma omp parallel for schedule(runtime)
623 p.template
vect<0>() = p.position();
625 p.template
vect<1>() = p.velocity();
644#pragma omp parallel for schedule(runtime)
651 p.template
vect<2>() = p.velocity();
670#pragma omp parallel for schedule(runtime)
677 p.template
vect<3>() = p.velocity();
678 p.position() = p.template
vect<0>() +
a_dt * p.velocity();
696#pragma omp parallel for schedule(runtime)
717#include <CD_NamespaceFooter.H>
Namespace containing various particle management utilities.
File containing some useful static methods related to random number generation.
Declaration of the Physics::TracerParticle::TracerParticleStepper TimeStepper.
static void setValue(LevelData< MFInterfaceFAB< T > > &a_lhs, const T &a_value)
Set value in an MFInterfaceFAB data holder.
Definition CD_DataOpsImplem.H:24
TimeStepper for advancing tracer particles in a prescribed velocity field on an AMR mesh.
Definition CD_TracerParticleStepper.H:56
void registerRealms() override
Register realms. Primal is the only realm we need.
Definition CD_TracerParticleStepperImplem.H:94
virtual void parseInitialConditions()
Parse initial conditions.
Definition CD_TracerParticleStepperImplem.H:201
void parseRuntimeOptions() override
Parse runtime options.
Definition CD_TracerParticleStepperImplem.H:132
void initialData() override
Fill problem with initial data.
Definition CD_TracerParticleStepperImplem.H:78
void registerOperators() override
Register operators.
Definition CD_TracerParticleStepperImplem.H:106
virtual Real computeDt() override
Compute a time step to be used by Driver.
Definition CD_TracerParticleStepperImplem.H:288
int getNumberOfPlotVariables() const override
Get number of plot variables for this physics module.
Definition CD_TracerParticleStepperImplem.H:246
virtual void advanceParticlesEuler(const Real a_dt)
Advance particles using explicit Euler rule.
Definition CD_TracerParticleStepperImplem.H:483
virtual void preRegrid(const int a_lmin, const int a_oldFinestLevel) override
Perform pre-regrid operations.
Definition CD_TracerParticleStepperImplem.H:349
void allocate() override
Allocate storage for solvers and time stepper.
Definition CD_TracerParticleStepperImplem.H:65
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:270
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel) override
Time stepper regrid method.
Definition CD_TracerParticleStepperImplem.H:361
virtual Real advance(const Real a_dt) override
Advancement method. Swaps between various kernels.
Definition CD_TracerParticleStepperImplem.H:300
void parseOptions()
Parse options.
Definition CD_TracerParticleStepperImplem.H:118
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:333
virtual void advanceParticlesRK2(const Real a_dt)
Advance particles using second order Runge-Kutta.
Definition CD_TracerParticleStepperImplem.H:522
void setupSolvers() override
Instantiate the tracer particle solver.
Definition CD_TracerParticleStepperImplem.H:49
virtual ~TracerParticleStepper()
Destructor.
Definition CD_TracerParticleStepperImplem.H:39
virtual void advanceParticlesRK4(const Real a_dt)
Advance particles using fourth order Runge-Kutta.
Definition CD_TracerParticleStepperImplem.H:592
Vector< std::string > getPlotVariableNames() const override
Get plot variable names.
Definition CD_TracerParticleStepperImplem.H:258
virtual void parseVelocityField()
Parse velocity field.
Definition CD_TracerParticleStepperImplem.H:176
virtual void parseIntegrator()
Parse integration algorithm from input script.
Definition CD_TracerParticleStepperImplem.H:146
virtual void postRegrid() override
Perform post-regrid operations.
Definition CD_TracerParticleStepperImplem.H:378
virtual void initialParticles()
Fill initial particles.
Definition CD_TracerParticleStepperImplem.H:433
TracerParticleStepper()
Constructor. Does nothing.
Definition CD_TracerParticleStepperImplem.H:28
virtual void setVelocity()
Set the velocity on the mesh.
Definition CD_TracerParticleStepperImplem.H:392
static Real getUniformReal01()
Get a uniform real number on the interval [0,1].
Definition CD_RandomImplem.H:156
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
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
phase::which_phase m_phase
Phase where this solver lives.
Definition CD_TracerParticleSolver.H:367
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
std::string m_realm
Realm where this solver lives.
Definition CD_TracerParticleSolver.H:352
virtual ParticleContainer< P > & getParticles()
Get all particles.
Definition CD_TracerParticleSolverImplem.H:663
int m_verbosity
Verbosity level.
Definition CD_TracerParticleSolver.H:387
RefCountedPtr< AmrMesh > m_amr
Handle to AMR mesh.
Definition CD_TracerParticleSolver.H:327
RefCountedPtr< ComputationalGeometry > m_computationalGeometry
Handle to computational geometry.
Definition CD_TracerParticleSolver.H:332
virtual void setPhase(const phase::which_phase &a_phase)
Set the solver phase.
Definition CD_TracerParticleSolverImplem.H:245
Real m_dt
Time step.
Definition CD_TracerParticleSolver.H:372
virtual void allocate()
Allocate storage for this solver.
Definition CD_TracerParticleSolverImplem.H:195
int m_timeStep
Time step.
Definition CD_TracerParticleSolver.H:382
virtual void interpolateVelocities()
Interpolate particles velocities.
Definition CD_TracerParticleSolverImplem.H:393
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
Real m_time
Time.
Definition CD_TracerParticleSolver.H:377
EBAMRCellData m_velocityField
Mesh-based velocity field. Must be set through setVelocity.
Definition CD_TracerParticleSolver.H:407
Namespace for encapsulating physics code for tracer particles.
Definition CD_TracerParticlePhysics.H:22
@ gas
Gas phase.
Definition CD_MultiFluidIndexSpace.H:39