1#ifndef AMREX_TIME_INTEGRATOR_H
2#define AMREX_TIME_INTEGRATOR_H
10#ifdef AMREX_USE_SUNDIALS
29 std::unique_ptr<IntegratorBase<T> > integrator_ptr;
35 int integrator_type = -1;
36 std::string integrator_str;
37 pp.
get(
"type", integrator_str);
39 if (integrator_str ==
"ForwardEuler") {
41 }
else if (integrator_str ==
"RungeKutta") {
43 }
else if (integrator_str ==
"SUNDIALS") {
47 integrator_type = std::stoi(integrator_str,
nullptr);
48 }
catch (
const std::logic_error& ia) {
49 Print() <<
"Invalid integration.type: " << ia.what() <<
'\n';
50 Error(
"Failed to initialize AMReX TimeIntegrator class.");
57#ifndef AMREX_USE_SUNDIALS
59 Error(
"AMReX has not been compiled with SUNDIALS. Recompile with USE_SUNDIALS=TRUE.");
66 void set_default_functions ()
112 switch (integrator_type)
115 integrator_ptr = std::make_unique<FEIntegrator<T> >(S_data, time);
118 integrator_ptr = std::make_unique<RKIntegrator<T> >(S_data, time);
120#ifdef AMREX_USE_SUNDIALS
122 integrator_ptr = std::make_unique<SundialsIntegrator<T> >(S_data, time);
126 amrex::Error(
"integrator type did not match a valid integrator type.");
131 set_default_functions();
136 integrator_ptr->set_rhs(
F);
142 integrator_ptr->set_imex_rhs(Fi, Fe);
147 integrator_ptr->set_fast_rhs(
F);
152 integrator_ptr->set_post_stage_action(A);
157 integrator_ptr->set_post_step_action(A);
162 integrator_ptr->set_post_fast_stage_action(A);
167 integrator_ptr->set_post_fast_step_action(A);
172 return integrator_ptr->get_time_step();
177 integrator_ptr->set_time_step(dt);
182 integrator_ptr->set_adaptive_step();
187 integrator_ptr->set_fast_time_step(dt);
192 integrator_ptr->set_adaptive_fast_step();
197 integrator_ptr->set_max_steps(steps);
202 integrator_ptr->set_tolerances(rtol, atol);
207 integrator_ptr->set_fast_tolerances(rtol, atol);
212 integrator_ptr->advance(S_old, S_new, time, dt);
217 integrator_ptr->evolve(S_out, time_out);
221 const amrex::Real end_time,
const int start_step,
const int max_steps)
226 for (
int m_step_number = start_step; m_step_number < max_steps && !stop; ++m_step_number)
228 if (end_time - m_time < m_timestep) {
229 m_timestep = end_time - m_time;
233 if (m_step_number > start_step) {
234 std::swap(S_old, S_new);
238 integrator_ptr->advance(S_old, S_new, m_time, m_timestep);
241 m_time += m_timestep;
247 integrator_ptr->time_interpolate(S_new, S_old, timestep_fraction, data);
252 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:18
Parse Parameters From Command Line and Input Files.
Definition AMReX_ParmParse.H:354
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:1993
This class provides the user with a few print options.
Definition AMReX_Print.H:35
Definition AMReX_TimeIntegrator.H:27
void set_adaptive_step()
Definition AMReX_TimeIntegrator.H:180
void set_adaptive_fast_step()
Definition AMReX_TimeIntegrator.H:190
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:220
TimeIntegrator(const T &S_data, const amrex::Real time=0.0)
Definition AMReX_TimeIntegrator.H:96
void set_max_steps(int steps)
Definition AMReX_TimeIntegrator.H:195
void set_post_step_action(std::function< void(T &, amrex::Real)> A)
Definition AMReX_TimeIntegrator.H:155
void map_data(std::function< void(T &)> Map)
Definition AMReX_TimeIntegrator.H:250
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:139
void set_fast_rhs(std::function< void(T &, T &, const amrex::Real)> F)
Definition AMReX_TimeIntegrator.H:145
void evolve(T &S_out, const amrex::Real time_out)
Definition AMReX_TimeIntegrator.H:215
void set_tolerances(amrex::Real rtol, amrex::Real atol)
Definition AMReX_TimeIntegrator.H:200
void set_post_fast_stage_action(std::function< void(T &, amrex::Real)> A)
Definition AMReX_TimeIntegrator.H:160
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:110
void set_post_fast_step_action(std::function< void(T &, amrex::Real)> A)
Definition AMReX_TimeIntegrator.H:165
void set_post_stage_action(std::function< void(T &, amrex::Real)> A)
Definition AMReX_TimeIntegrator.H:150
void set_rhs(std::function< void(T &, T &, const amrex::Real)> F)
Definition AMReX_TimeIntegrator.H:134
void time_interpolate(const T &S_new, const T &S_old, amrex::Real timestep_fraction, T &data)
Definition AMReX_TimeIntegrator.H:245
void set_time_step(amrex::Real dt)
Definition AMReX_TimeIntegrator.H:175
amrex::Real get_time_step()
Definition AMReX_TimeIntegrator.H:170
virtual ~TimeIntegrator()
Definition AMReX_TimeIntegrator.H:103
void advance(T &S_old, T &S_new, amrex::Real time, const amrex::Real dt)
Definition AMReX_TimeIntegrator.H:210
TimeIntegrator(IntegratorTypes integrator_type, const T &S_data, const amrex::Real time=0.0)
Definition AMReX_TimeIntegrator.H:90
void set_fast_tolerances(amrex::Real rtol, amrex::Real atol)
Definition AMReX_TimeIntegrator.H:205
void set_fast_time_step(amrex::Real dt)
Definition AMReX_TimeIntegrator.H:185
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:238
IntegratorTypes
Definition AMReX_TimeIntegrator.H:19
void Abort(const std::string &msg)
Print a fatal-error message to stderr and abort execution.
Definition AMReX.cpp:244