1#ifndef AMREX_TIME_INTEGRATOR_H
2#define AMREX_TIME_INTEGRATOR_H
10#ifdef AMREX_USE_SUNDIALS
28 std::unique_ptr<IntegratorBase<T> > integrator_ptr;
35 std::string integrator_str;
36 pp.
get(
"type", integrator_str);
38 if (integrator_str ==
"ForwardEuler") {
40 }
else if (integrator_str ==
"RungeKutta") {
42 }
else if (integrator_str ==
"SUNDIALS") {
46 integrator_type = std::stoi(integrator_str,
nullptr);
47 }
catch (
const std::invalid_argument& ia) {
48 Print() <<
"Invalid integration.type: " << ia.what() <<
'\n';
49 Error(
"Failed to initialize AMReX TimeIntegrator class.");
56#ifndef AMREX_USE_SUNDIALS
58 Error(
"AMReX has not been compiled with SUNDIALS. Recompile with USE_SUNDIALS=TRUE.");
65 void set_default_functions ()
111 switch (integrator_type)
114 integrator_ptr = std::make_unique<FEIntegrator<T> >(S_data, time);
117 integrator_ptr = std::make_unique<RKIntegrator<T> >(S_data, time);
119#ifdef AMREX_USE_SUNDIALS
121 integrator_ptr = std::make_unique<SundialsIntegrator<T> >(S_data, time);
125 amrex::Error(
"integrator type did not match a valid integrator type.");
130 set_default_functions();
135 integrator_ptr->set_rhs(
F);
141 integrator_ptr->set_imex_rhs(Fi, Fe);
146 integrator_ptr->set_fast_rhs(
F);
151 integrator_ptr->set_post_stage_action(A);
156 integrator_ptr->set_post_step_action(A);
161 integrator_ptr->set_post_fast_stage_action(A);
166 integrator_ptr->set_post_fast_step_action(A);
171 return integrator_ptr->get_time_step();
176 integrator_ptr->set_time_step(dt);
181 integrator_ptr->set_adaptive_step();
186 integrator_ptr->set_fast_time_step(dt);
191 integrator_ptr->set_adaptive_fast_step();
196 integrator_ptr->set_max_steps(steps);
201 integrator_ptr->set_tolerances(rtol, atol);
206 integrator_ptr->set_fast_tolerances(rtol, atol);
211 integrator_ptr->advance(S_old, S_new, time, dt);
216 integrator_ptr->evolve(S_out, time_out);
220 const amrex::Real end_time,
const int start_step,
const int max_steps)
225 for (
int m_step_number = start_step; m_step_number < max_steps && !stop; ++m_step_number)
227 if (end_time - m_time < m_timestep) {
228 m_timestep = end_time - m_time;
232 if (m_step_number > start_step) {
233 std::swap(S_old, S_new);
237 integrator_ptr->advance(S_old, S_new, m_time, m_timestep);
240 m_time += m_timestep;
246 integrator_ptr->time_interpolate(S_new, S_old, timestep_fraction, data);
251 integrator_ptr->map_data(Map);
#define AMREX_ALWAYS_ASSERT(EX)
Definition AMReX_BLassert.H:50
amrex::ParmParse pp
Input file parser instance for the given namespace.
Definition AMReX_HypreIJIface.cpp:15
Parse Parameters From Command Line and Input Files.
Definition AMReX_ParmParse.H:353
void get(std::string_view name, bool &ref, int ival=FIRST) const
Same as getkth() but searches for the last occurrence of name.
Definition AMReX_ParmParse.cpp:1959
This class provides the user with a few print options.
Definition AMReX_Print.H:35
Definition AMReX_TimeIntegrator.H:26
void set_adaptive_step()
Definition AMReX_TimeIntegrator.H:179
void set_adaptive_fast_step()
Definition AMReX_TimeIntegrator.H:189
void integrate(T &S_old, T &S_new, amrex::Real start_time, const amrex::Real start_timestep, const amrex::Real end_time, const int start_step, const int max_steps)
Definition AMReX_TimeIntegrator.H:219
TimeIntegrator(const T &S_data, const amrex::Real time=0.0)
Definition AMReX_TimeIntegrator.H:95
void set_max_steps(int steps)
Definition AMReX_TimeIntegrator.H:194
void set_post_step_action(std::function< void(T &, amrex::Real)> A)
Definition AMReX_TimeIntegrator.H:154
void map_data(std::function< void(T &)> Map)
Definition AMReX_TimeIntegrator.H:249
void set_imex_rhs(std::function< void(T &, T &, const amrex::Real)> Fi, std::function< void(T &, T &, const amrex::Real)> Fe)
Definition AMReX_TimeIntegrator.H:138
void set_fast_rhs(std::function< void(T &, T &, const amrex::Real)> F)
Definition AMReX_TimeIntegrator.H:144
void evolve(T &S_out, const amrex::Real time_out)
Definition AMReX_TimeIntegrator.H:214
void set_tolerances(amrex::Real rtol, amrex::Real atol)
Definition AMReX_TimeIntegrator.H:199
void set_post_fast_stage_action(std::function< void(T &, amrex::Real)> A)
Definition AMReX_TimeIntegrator.H:159
void initialize_integrator(IntegratorTypes integrator_type, const T &S_data, const amrex::Real time=0.0)
Create an integrator of the given type. This resets the right-hand side and post stage/step functions...
Definition AMReX_TimeIntegrator.H:109
void set_post_fast_step_action(std::function< void(T &, amrex::Real)> A)
Definition AMReX_TimeIntegrator.H:164
void set_post_stage_action(std::function< void(T &, amrex::Real)> A)
Definition AMReX_TimeIntegrator.H:149
void set_rhs(std::function< void(T &, T &, const amrex::Real)> F)
Definition AMReX_TimeIntegrator.H:133
void time_interpolate(const T &S_new, const T &S_old, amrex::Real timestep_fraction, T &data)
Definition AMReX_TimeIntegrator.H:244
void set_time_step(amrex::Real dt)
Definition AMReX_TimeIntegrator.H:174
amrex::Real get_time_step()
Definition AMReX_TimeIntegrator.H:169
virtual ~TimeIntegrator()
Definition AMReX_TimeIntegrator.H:102
void advance(T &S_old, T &S_new, amrex::Real time, const amrex::Real dt)
Definition AMReX_TimeIntegrator.H:209
TimeIntegrator(IntegratorTypes integrator_type, const T &S_data, const amrex::Real time=0.0)
Definition AMReX_TimeIntegrator.H:89
void set_fast_tolerances(amrex::Real rtol, amrex::Real atol)
Definition AMReX_TimeIntegrator.H:204
void set_fast_time_step(amrex::Real dt)
Definition AMReX_TimeIntegrator.H:184
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:80
Definition AMReX_Amr.cpp:50
void Error(const std::string &msg)
Print a message to stderr and abort the program.
Definition AMReX.cpp:236
IntegratorTypes
Definition AMReX_TimeIntegrator.H:18
void Abort(const std::string &msg)
Print a fatal-error message to stderr and abort execution.
Definition AMReX.cpp:242