chombo-discharge
Loading...
Searching...
No Matches
CD_MeshODEStepperImplem.H
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021-2026 SINTEF Energy Research
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
13#ifndef CD_MESHODESTEPPERIMPLEM_H
14#define CD_MESHODESTEPPERIMPLEM_H
15
16// Our includes
17#include <CD_TimeStepper.H>
18#include <CD_MeshODESolver.H>
19#include <CD_NamespaceHeader.H>
20
21using namespace Physics::MeshODE;
22
23template <size_t N>
25{
26 CH_TIME("MeshODEStepper::MeshODEStepper");
27
28 m_verbosity = 10;
31
32 this->parseOptions();
33}
34
35template <size_t N>
37{
38 CH_TIME("MeshODEStepper::~MeshODEStepper");
39 if (m_verbosity > 5) {
40 pout() << "MeshODEStepper::~MeshODEStepper" << endl;
41 }
42}
43
44template <size_t N>
45void
47{
48 CH_TIME("MeshODEStepper::setupSolvers");
49 if (m_verbosity > 5) {
50 pout() << "MeshODEStepper::setupSolvers" << endl;
51 }
52
54
55 m_solver->setPhase(m_phase);
56 m_solver->setRealm(m_realm);
57 m_solver->parseOptions();
58}
59
60template <size_t N>
61void
63{
64 CH_TIME("MeshODEStepper::allocate()");
65 if (m_verbosity > 5) {
66 pout() << "MeshODEStepper::allocate()" << endl;
67 }
68
69 m_solver->allocate();
70}
71
72template <size_t N>
73void
75{
76 CH_TIME("MeshODEStepper::initialData()");
77 if (m_verbosity > 5) {
78 pout() << "MeshODEStepper::initialData()" << endl;
79 }
80
81 m_solver->setPhi(m_initialData);
82 m_solver->computeRHS(m_rhsFunction);
83}
84
85template <size_t N>
86void
88{
89 CH_TIME("MeshODEStepper::postInitialize()");
90 if (m_verbosity > 5) {
91 pout() << "MeshODEStepper::postInitialize()" << endl;
92 }
93}
94
95template <size_t N>
96void
98{
99 CH_TIME("MeshODEStepper::postCheckpointSetup()");
100 if (m_verbosity > 5) {
101 pout() << "MeshODEStepper::postCheckpointSetup()" << endl;
102 }
103
104 m_solver->computeRHS(m_rhsFunction);
105}
106
107template <size_t N>
108void
110{
111 CH_TIME("MeshODEStepper::registerRealms()");
112 if (m_verbosity > 5) {
113 pout() << "MeshODEStepper::registerRealms()" << endl;
114 }
115
116 m_amr->registerRealm(Realm::Primal);
117}
118
119template <size_t N>
120void
122{
123 CH_TIME("MeshODEStepper::registerOperators()");
124 if (m_verbosity > 5) {
125 pout() << "MeshODEStepper::registerOperators()" << endl;
126 }
127
128 m_solver->registerOperators();
129}
130
131template <size_t N>
132void
134{
135 CH_TIME("MeshODEStepper::parseOptions()");
136 if (m_verbosity > 5) {
137 pout() << "MeshODEStepper::parseOptions()" << endl;
138 }
139
140 this->parseIntegrator();
141 this->parseVerbosity();
142 this->parseProblem();
143}
144
145template <size_t N>
146void
148{
149 CH_TIME("MeshODEStepper::parseRuntimeOptions()");
150 if (m_verbosity > 5) {
151 pout() << "MeshODEStepper::parseRuntimeOptions()" << endl;
152 }
153
154 m_solver->parseRuntimeOptions();
155
156 this->parseIntegrator();
157 this->parseVerbosity();
158}
159
160template <size_t N>
161void
163{
164 CH_TIME("MeshODEStepper::parseProblem()");
165 if (m_verbosity > 5) {
166 pout() << "MeshODEStepper::parseProblem()" << endl;
167 }
168
169 ParmParse pp("MeshODEStepper");
170
171 Real initPhi = 0.0;
172 Real frequency = 0.0;
173
174 pp.get("init_phi", initPhi);
175 pp.get("frequency", frequency);
176 pp.get("dt", m_dt);
177
178 m_initialData = [initPhi](const RealVect& a_pos) -> std::array<Real, N> {
180
181 for (auto& y : Y) {
182 y = initPhi;
183 }
184
185 return Y;
186 };
187
188 m_rhsFunction = [frequency](const std::array<Real, N> Y, const Real t) -> std::array<Real, N> {
190
191 for (auto& r : rhs) {
192 r = cos(2 * M_PI * frequency * t);
193 }
194
195 return rhs;
196 };
197}
198
199#ifdef CH_USE_HDF5
200template <size_t N>
201void
203{
204 CH_TIME("MeshODEStepper::writeCheckpointData(HDF5Handle, int)");
205 if (m_verbosity > 5) {
206 pout() << "MeshODEStepper::writeCheckpointData(HDF5Handle, int)" << endl;
207 }
208
209 m_solver->writeCheckpointLevel(a_handle, a_lvl);
210}
211#endif
212
213#ifdef CH_USE_HDF5
214template <size_t N>
215void
217{
218 CH_TIME("MeshODEStepper::readCheckpointData(HDF5Handle, int)");
219 if (m_verbosity > 5) {
220 pout() << "MeshODEStepper::readCheckpointData(HDF5Handle, int)" << endl;
221 }
222
223 m_solver->readCheckpointLevel(a_handle, a_lvl);
224}
225#endif
226
227template <size_t N>
228int
230{
231 CH_TIME("MeshODEStepper::getNumberOfPlotVariables()");
232 if (m_verbosity > 5) {
233 pout() << "MeshODEStepper::getNumberOfPlotVariables()" << endl;
234 }
235
236 return m_solver->getNumberOfPlotVariables();
237}
238
239template <size_t N>
242{
243 CH_TIME("MeshODEStepper::getPlotVariableNames()");
244 if (m_verbosity > 5) {
245 pout() << "MeshODEStepper::getPlotVariableNames()" << endl;
246 }
247
248 return m_solver->getPlotVariableNames();
249}
250
251template <size_t N>
252void
254 int& a_icomp,
256 const int a_level) const
257{
258 CH_TIME("MeshODEStepper::writePlotData");
259 if (m_verbosity > 5) {
260 pout() << "MeshODEStepper::writePlotData" << endl;
261 }
262
263 m_solver->writePlotData(a_output, a_icomp, a_outputRealm, a_level);
264}
265
266template <size_t N>
267Real
269{
270 CH_TIME("MeshODEStepper::computeDt()");
271 if (m_verbosity > 5) {
272 pout() << "MeshODEStepper::computeDt()" << endl;
273 }
274
275 return m_dt;
276}
277
278template <size_t N>
279Real
281{
282 CH_TIME("MeshODEStepper::advance(Real)");
283 if (m_verbosity > 5) {
284 pout() << "MeshODEStepper::advance(Real)" << endl;
285 }
286
287 switch (m_algorithm) {
288 case IntegrationAlgorithm::Euler: {
289 this->advanceEuler(a_dt);
290
291 break;
292 }
293 case IntegrationAlgorithm::RK2: {
294 this->advanceRK2(a_dt);
295
296 break;
297 }
298 case IntegrationAlgorithm::RK4: {
299 this->advanceRK4(a_dt);
300
301 break;
302 }
303 default: {
304 MayDay::Error("MeshODEStepper::advance -- logic bust");
305
306 break;
307 }
308 }
309
310 // Update the source term.
311 m_solver->computeRHS(m_rhsFunction);
312
313 return a_dt;
314}
315
316template <size_t N>
317void
319{
320 CH_TIME("MeshODEStepper::synchronizeSolverTimes(int, Real, Real)");
321 if (m_verbosity > 5) {
322 pout() << "MeshODEStepper::synchronizeSolverTimes(int, Real, Real)" << endl;
323 }
324
326 m_time = a_time;
327
328 m_solver->setTime(a_step, a_time, a_dt);
329}
330
331template <size_t N>
332void
334{
335 CH_TIME("MeshODEStepper::preRegrid(int, int)");
336 if (m_verbosity > 5) {
337 pout() << "MeshODEStepper::preRegrid(int, int)" << endl;
338 }
339
340 m_solver->preRegrid(a_lmin, a_oldFinestLevel);
341}
342
343template <size_t N>
344void
346{
347 CH_TIME("MeshODEStepper::regrid(int, int, int)");
348 if (m_verbosity > 5) {
349 pout() << "MeshODEStepper::regrid(int, int, int)" << endl;
350 }
351
352 m_solver->regrid(a_lmin, a_oldFinestLevel, a_newFinestLevel);
353}
354
355template <size_t N>
356void
358{
359 CH_TIME("MeshODEStepper::postRegrid()");
360 if (m_verbosity > 5) {
361 pout() << "MeshODEStepper::postRegrid()" << endl;
362 }
363
364 // Compute new right-hand side.
365 m_solver->computeRHS(m_rhsFunction);
366}
367
368template <size_t N>
369void
371{
372 CH_TIME("MeshODEStepper::parseIntegrator()");
373 if (m_verbosity > 5) {
374 pout() << "MeshODEStepper::parseIntegrator()" << endl;
375 }
376
377 ParmParse pp("MeshODEStepper");
378
380
381 pp.get("integration", str);
382 if (str == "euler") {
383 m_algorithm = IntegrationAlgorithm::Euler;
384 }
385 else if (str == "rk2") {
386 m_algorithm = IntegrationAlgorithm::RK2;
387 }
388 else if (str == "rk4") {
389 m_algorithm = IntegrationAlgorithm::RK4;
390 }
391 else {
392 MayDay::Error("MeshODEStepper::parseIntegrator -- logic bust");
393 }
394}
395
396template <size_t N>
397void
399{
400 CH_TIME("MeshODEStepper::parseVerbosity()");
401 if (m_verbosity > 5) {
402 pout() << "MeshODEStepper::parseVerbosity()" << endl;
403 }
404
405 ParmParse pp("MeshODEStepper");
406
407 pp.get("verbosity", m_verbosity);
408}
409
410template <size_t N>
411void
413{
414 CH_TIME("MeshODEStepper::advanceEuler()");
415 if (m_verbosity > 5) {
416 pout() << "MeshODEStepper::advanceEuler()" << endl;
417 }
418
419 // Let Y = Y + S * dt
420 EBAMRCellData& phi = m_solver->getPhi();
421 EBAMRCellData& rhs = m_solver->getRHS();
422
423 m_solver->computeRHS(rhs, m_rhsFunction);
424
426}
427
428template <size_t N>
429void
431{
432 CH_TIME("MeshODEStepper::advanceRK2()");
433 if (m_verbosity > 5) {
434 pout() << "MeshODEStepper::advanceRK2()" << endl;
435 }
436
437 EBAMRCellData& phi = m_solver->getPhi();
438
441
444
445 m_solver->computeRHS(k1, m_rhsFunction);
447
448 m_solver->computeRHS(k2, m_rhsFunction);
449 DataOps::incr(phi, k2, 0.5 * a_dt);
450 DataOps::incr(phi, k1, -0.5 * a_dt);
451}
452
453template <size_t N>
454void
456{
457 CH_TIME("MeshODEStepper::advanceRK4()");
458 if (m_verbosity > 5) {
459 pout() << "MeshODEStepper::advanceRK4()" << endl;
460 }
461
462 MayDay::Error("MeshODEStepper::advanceRK4 -- not implemented");
463}
464
465#include <CD_NamespaceFooter.H>
466
467#endif
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
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: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 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
void parseVerbosity()
Parse solver verbosity.
Definition CD_TracerParticleSolverImplem.H:163
int m_verbosity
Verbosity level.
Definition CD_TracerParticleSolver.H:387
RefCountedPtr< AmrMesh > m_amr
Handle to AMR mesh.
Definition CD_TracerParticleSolver.H:327
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 parseOptions()
Parse solver options.
Definition CD_TracerParticleSolverImplem.H:63
Real m_time
Time.
Definition CD_TracerParticleSolver.H:377
@ gas
Gas phase.
Definition CD_MultiFluidIndexSpace.H:39