13#ifndef CD_MESHODESTEPPERIMPLEM_H
14#define CD_MESHODESTEPPERIMPLEM_H
19#include <CD_NamespaceHeader.H>
21using namespace Physics::MeshODE;
26 CH_TIME(
"MeshODEStepper::MeshODEStepper");
38 CH_TIME(
"MeshODEStepper::~MeshODEStepper");
39 if (m_verbosity > 5) {
40 pout() <<
"MeshODEStepper::~MeshODEStepper" << endl;
48 CH_TIME(
"MeshODEStepper::setupSolvers");
49 if (m_verbosity > 5) {
50 pout() <<
"MeshODEStepper::setupSolvers" << endl;
55 m_solver->setPhase(m_phase);
56 m_solver->setRealm(m_realm);
57 m_solver->parseOptions();
64 CH_TIME(
"MeshODEStepper::allocate()");
65 if (m_verbosity > 5) {
66 pout() <<
"MeshODEStepper::allocate()" << endl;
76 CH_TIME(
"MeshODEStepper::initialData()");
77 if (m_verbosity > 5) {
78 pout() <<
"MeshODEStepper::initialData()" << endl;
81 m_solver->setPhi(m_initialData);
82 m_solver->computeRHS(m_rhsFunction);
89 CH_TIME(
"MeshODEStepper::postInitialize()");
90 if (m_verbosity > 5) {
91 pout() <<
"MeshODEStepper::postInitialize()" << endl;
99 CH_TIME(
"MeshODEStepper::postCheckpointSetup()");
100 if (m_verbosity > 5) {
101 pout() <<
"MeshODEStepper::postCheckpointSetup()" << endl;
104 m_solver->computeRHS(m_rhsFunction);
111 CH_TIME(
"MeshODEStepper::registerRealms()");
112 if (m_verbosity > 5) {
113 pout() <<
"MeshODEStepper::registerRealms()" << endl;
123 CH_TIME(
"MeshODEStepper::registerOperators()");
124 if (m_verbosity > 5) {
125 pout() <<
"MeshODEStepper::registerOperators()" << endl;
128 m_solver->registerOperators();
135 CH_TIME(
"MeshODEStepper::parseOptions()");
136 if (m_verbosity > 5) {
137 pout() <<
"MeshODEStepper::parseOptions()" << endl;
140 this->parseIntegrator();
141 this->parseVerbosity();
142 this->parseProblem();
149 CH_TIME(
"MeshODEStepper::parseRuntimeOptions()");
150 if (m_verbosity > 5) {
151 pout() <<
"MeshODEStepper::parseRuntimeOptions()" << endl;
154 m_solver->parseRuntimeOptions();
156 this->parseIntegrator();
157 this->parseVerbosity();
164 CH_TIME(
"MeshODEStepper::parseProblem()");
165 if (m_verbosity > 5) {
166 pout() <<
"MeshODEStepper::parseProblem()" << endl;
169 ParmParse pp(
"MeshODEStepper");
172 Real frequency = 0.0;
174 pp.get(
"init_phi", initPhi);
175 pp.get(
"frequency", frequency);
178 m_initialData = [initPhi](
const RealVect& a_pos) -> std::array<Real, N> {
179 std::array<Real, N> Y;
188 m_rhsFunction = [frequency](
const std::array<Real, N> Y,
const Real t) -> std::array<Real, N> {
189 std::array<Real, N> rhs;
191 for (
auto& r : rhs) {
192 r = cos(2 * M_PI * frequency * t);
204 CH_TIME(
"MeshODEStepper::writeCheckpointData(HDF5Handle, int)");
205 if (m_verbosity > 5) {
206 pout() <<
"MeshODEStepper::writeCheckpointData(HDF5Handle, int)" << endl;
209 m_solver->writeCheckpointLevel(a_handle, a_lvl);
218 CH_TIME(
"MeshODEStepper::readCheckpointData(HDF5Handle, int)");
219 if (m_verbosity > 5) {
220 pout() <<
"MeshODEStepper::readCheckpointData(HDF5Handle, int)" << endl;
223 m_solver->readCheckpointLevel(a_handle, a_lvl);
231 CH_TIME(
"MeshODEStepper::getNumberOfPlotVariables()");
232 if (m_verbosity > 5) {
233 pout() <<
"MeshODEStepper::getNumberOfPlotVariables()" << endl;
236 return m_solver->getNumberOfPlotVariables();
243 CH_TIME(
"MeshODEStepper::getPlotVariableNames()");
244 if (m_verbosity > 5) {
245 pout() <<
"MeshODEStepper::getPlotVariableNames()" << endl;
248 return m_solver->getPlotVariableNames();
255 const std::string& a_outputRealm,
256 const int a_level)
const
258 CH_TIME(
"MeshODEStepper::writePlotData");
259 if (m_verbosity > 5) {
260 pout() <<
"MeshODEStepper::writePlotData" << endl;
263 m_solver->writePlotData(a_output, a_icomp, a_outputRealm, a_level);
270 CH_TIME(
"MeshODEStepper::computeDt()");
271 if (m_verbosity > 5) {
272 pout() <<
"MeshODEStepper::computeDt()" << endl;
282 CH_TIME(
"MeshODEStepper::advance(Real)");
283 if (m_verbosity > 5) {
284 pout() <<
"MeshODEStepper::advance(Real)" << endl;
287 switch (m_algorithm) {
288 case IntegrationAlgorithm::Euler: {
289 this->advanceEuler(a_dt);
293 case IntegrationAlgorithm::RK2: {
294 this->advanceRK2(a_dt);
298 case IntegrationAlgorithm::RK4: {
299 this->advanceRK4(a_dt);
304 MayDay::Error(
"MeshODEStepper::advance -- logic bust");
311 m_solver->computeRHS(m_rhsFunction);
320 CH_TIME(
"MeshODEStepper::synchronizeSolverTimes(int, Real, Real)");
321 if (m_verbosity > 5) {
322 pout() <<
"MeshODEStepper::synchronizeSolverTimes(int, Real, Real)" << endl;
328 m_solver->setTime(a_step, a_time, a_dt);
335 CH_TIME(
"MeshODEStepper::preRegrid(int, int)");
336 if (m_verbosity > 5) {
337 pout() <<
"MeshODEStepper::preRegrid(int, int)" << endl;
340 m_solver->preRegrid(a_lmin, a_oldFinestLevel);
347 CH_TIME(
"MeshODEStepper::regrid(int, int, int)");
348 if (m_verbosity > 5) {
349 pout() <<
"MeshODEStepper::regrid(int, int, int)" << endl;
352 m_solver->regrid(a_lmin, a_oldFinestLevel, a_newFinestLevel);
359 CH_TIME(
"MeshODEStepper::postRegrid()");
360 if (m_verbosity > 5) {
361 pout() <<
"MeshODEStepper::postRegrid()" << endl;
365 m_solver->computeRHS(m_rhsFunction);
372 CH_TIME(
"MeshODEStepper::parseIntegrator()");
373 if (m_verbosity > 5) {
374 pout() <<
"MeshODEStepper::parseIntegrator()" << endl;
377 ParmParse pp(
"MeshODEStepper");
381 pp.get(
"integration", str);
382 if (str ==
"euler") {
383 m_algorithm = IntegrationAlgorithm::Euler;
385 else if (str ==
"rk2") {
386 m_algorithm = IntegrationAlgorithm::RK2;
388 else if (str ==
"rk4") {
389 m_algorithm = IntegrationAlgorithm::RK4;
392 MayDay::Error(
"MeshODEStepper::parseIntegrator -- logic bust");
400 CH_TIME(
"MeshODEStepper::parseVerbosity()");
401 if (m_verbosity > 5) {
402 pout() <<
"MeshODEStepper::parseVerbosity()" << endl;
405 ParmParse pp(
"MeshODEStepper");
407 pp.get(
"verbosity", m_verbosity);
414 CH_TIME(
"MeshODEStepper::advanceEuler()");
415 if (m_verbosity > 5) {
416 pout() <<
"MeshODEStepper::advanceEuler()" << endl;
420 EBAMRCellData& phi = m_solver->getPhi();
421 EBAMRCellData& rhs = m_solver->getRHS();
423 m_solver->computeRHS(rhs, m_rhsFunction);
432 CH_TIME(
"MeshODEStepper::advanceRK2()");
433 if (m_verbosity > 5) {
434 pout() <<
"MeshODEStepper::advanceRK2()" << endl;
437 EBAMRCellData& phi = m_solver->getPhi();
442 m_amr->allocate(k1, m_realm, m_phase, N);
443 m_amr->allocate(k2, m_realm, m_phase, N);
445 m_solver->computeRHS(k1, m_rhsFunction);
448 m_solver->computeRHS(k2, m_rhsFunction);
457 CH_TIME(
"MeshODEStepper::advanceRK4()");
458 if (m_verbosity > 5) {
459 pout() <<
"MeshODEStepper::advanceRK4()" << endl;
462 MayDay::Error(
"MeshODEStepper::advanceRK4 -- not implemented");
465#include <CD_NamespaceFooter.H>
Encapsulation of an ODE solver on the mesh.
Declaration of main (abstract) time stepper class.
static void incr(MFAMRCellData &a_lhs, const MFAMRCellData &a_rhs, const Real a_scale) noexcept
Function which increments data in the form a_lhs = a_lhs + a_rhs*a_scale for all components.
Definition CD_DataOps.cpp:820
Class for solving dy/dt = f on an AMR hierarchy.
Definition CD_MeshODESolver.H:29
TimeStepper for advancing a system of N coupled ODEs on an AMR mesh.
Definition CD_MeshODEStepper.H:49
virtual void advanceEuler(const Real a_dt)
Advance using the explicit Euler rule.
Definition CD_MeshODEStepperImplem.H:412
virtual Real advance(const Real a_dt) override
Advancement method. Swaps between various kernels.
Definition CD_MeshODEStepperImplem.H:280
void registerOperators() override
Register operators.
Definition CD_MeshODEStepperImplem.H:121
void parseRuntimeOptions() override
Parse runtime options.
Definition CD_MeshODEStepperImplem.H:147
virtual Vector< std::string > getPlotVariableNames() const override
Get plot variable names.
Definition CD_MeshODEStepperImplem.H:241
virtual void advanceRK2(const Real a_dt)
Advance using a second-order Runge-Kutta method.
Definition CD_MeshODEStepperImplem.H:430
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel) override
Time stepper regrid method.
Definition CD_MeshODEStepperImplem.H:345
virtual void parseIntegrator()
Parse integrator.
Definition CD_MeshODEStepperImplem.H:370
void initialData() override
Fill problem with initial data.
Definition CD_MeshODEStepperImplem.H:74
void allocate() override
Allocate storage for solvers and time stepper.
Definition CD_MeshODEStepperImplem.H:62
virtual void synchronizeSolverTimes(const int a_step, const Real a_time, const Real a_dt) override
Synchronize solver times and time steps.
Definition CD_MeshODEStepperImplem.H:318
virtual ~MeshODEStepper()
Destructor.
Definition CD_MeshODEStepperImplem.H:36
virtual void parseVerbosity()
Parse chattiness.
Definition CD_MeshODEStepperImplem.H:398
virtual void parseProblem()
Parse the problem type.
Definition CD_MeshODEStepperImplem.H:162
void setupSolvers() override
Instantiate the ODE solver.
Definition CD_MeshODEStepperImplem.H:46
virtual void advanceRK4(const Real a_dt)
Advance using a fourth order Runge-Kutta method.
Definition CD_MeshODEStepperImplem.H:455
virtual void preRegrid(const int a_lmin, const int a_oldFinestLevel) override
Perform pre-regrid operations.
Definition CD_MeshODEStepperImplem.H:333
void postCheckpointSetup() override
Post checkpoint operations.
Definition CD_MeshODEStepperImplem.H:97
virtual int getNumberOfPlotVariables() const override
Get the number of plot variables for this time stepper.
Definition CD_MeshODEStepperImplem.H:229
void registerRealms() override
Register realms. Primal is the only realm we need.
Definition CD_MeshODEStepperImplem.H:109
virtual void writePlotData(LevelData< EBCellFAB > &a_output, int &a_icomp, const std::string &a_outputRealm, const int a_level) const override
Write plot data to output holder.
Definition CD_MeshODEStepperImplem.H:253
void parseOptions()
Parse options.
Definition CD_MeshODEStepperImplem.H:133
virtual void postRegrid() override
Perform post-regrid operations.
Definition CD_MeshODEStepperImplem.H:357
void postInitialize() override
Perform any post-initialization steps.
Definition CD_MeshODEStepperImplem.H:87
MeshODEStepper()
Constructor. Does nothing.
Definition CD_MeshODEStepperImplem.H:24
virtual Real computeDt() override
Compute a time step.
Definition CD_MeshODEStepperImplem.H:268
static const std::string Primal
Identifier for perimal realm.
Definition CD_Realm.H:44
@ gas
Gas phase.
Definition CD_MultiFluidIndexSpace.H:39