4 #include <AMReX_REAL.H>
5 #include <AMReX_Vector.H>
6 #include <AMReX_IntegratorBase.H>
25 std::function<void(
T&,
const T&,
const double,
const double)>
rhs;
26 std::function<void(
T&,
T&,
T&,
const double,
const double,
const double,
const int)>
slow_rhs_pre;
27 std::function<void(
T&,
T&,
T&,
T&,
const double,
const double,
const double,
const int)>
slow_rhs_post;
28 std::function<void(
int,
int,
int,
T&,
const T&,
T&,
T&,
const double,
const double,
71 std::function<void (
T&,
T&,
T&,
const double,
const double,
int)>
no_substep;
74 amrex::Vector<std::unique_ptr<T> >
T_store;
86 const bool include_ghost =
true;
90 amrex::IntegratorOps<T>::CreateLike(
T_store, S_data, include_ghost);
92 amrex::IntegratorOps<T>::CreateLike(
T_store, S_data, include_ghost);
184 void set_slow_rhs_pre (std::function<
void(
T&,
T&,
T&,
const double,
const double,
const double,
const int)> F)
198 const double,
const double,
232 std::function<void(
T&,
const T&,
const double,
const double)>
get_rhs ()
245 double advance (
T& S_old,
T& S_new,
double time,
const double time_step)
247 BL_PROFILE_REGION(
"MRI_advance");
248 using namespace amrex;
261 "MRISplitIntegrator::advance: setNoSubstepping, setAnelastic, "
262 "setForceFirstStageSingleSubstep and setNcompCons must be called before advance");
264 "MRISplitIntegrator::advance: integrator storage must be initialized before advance");
291 for (
int i(0); i<n_data; ++i)
294 MultiFab::Copy(S_new[i],S_old[i],0,0,num_vars[i],S_old[i].nGrowVect());
306 double time_stage = time;
307 double old_time_stage;
311 for (
int nrk = 0; nrk < 3; nrk++)
314 old_time_stage = time_stage;
323 nsubsteps = std::max(substep_ratio/3, 1);
333 nsubsteps = std::max(substep_ratio/2, 1);
343 nsubsteps = substep_ratio;
344 dtau =
timestep /
static_cast<double>(nsubsteps);
365 for (
int ks = 0;
ks < nsubsteps; ++
ks)
367 acoustic_substepping(
ks, nsubsteps, nrk, *
F_slow, S_old, S_new, *
S_sum, dtau,
timestep, inv_fac,
368 time +
ks*dtau, time + (
ks+1) * dtau);
400 const bool l_midpoint = (
anelastic_type == AnelasticType::MidPoint);
402 for (
int nrk = 0; nrk < 2; nrk++)
405 old_time_stage = time_stage;
410 time_stage = time + nsubsteps * dtau;
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int idx(int i, int j, int k, int nx, int ny)
Definition: ERF_InitForEnsemble.cpp:404
constexpr amrex::Real three
Definition: ERF_NumericalConstants.H:39
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:38
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Split integrator for MRI simulations handling slow and fast timescales.
Definition: ERF_MRI.H:20
T * F_slow
Definition: ERF_MRI.H:76
std::function< void(T &, const T &, const double, const double)> get_rhs()
Definition: ERF_MRI.H:232
amrex::Vector< std::unique_ptr< T > > T_store
Definition: ERF_MRI.H:74
void set_slow_rhs_post(std::function< void(T &, T &, T &, T &, const double, const double, const double, const int)> F)
Definition: ERF_MRI.H:188
void map_data(std::function< void(T &)> Map)
Apply a mapping function to all internal stored data.
Definition: ERF_MRI.H:434
void set_slow_rhs_pre(std::function< void(T &, T &, T &, const double, const double, const double, const int)> F)
Set the pre-substepping slow RHS function.
Definition: ERF_MRI.H:184
int anelastic
Should we use the anelastic integrator (-1 until setAnelastic is called)
Definition: ERF_MRI.H:50
void setNcompCons(int _ncomp_cons)
Set the number of conservative components.
Definition: ERF_MRI.H:139
void setAnelasticType(AnelasticType _anelastic_type=AnelasticType::RK2)
Set which two-stage scheme the anelastic integrator uses.
Definition: ERF_MRI.H:157
MRISplitIntegrator()=default
std::function< void(T &, const T &, const double, const double)> rhs
rhs is the right-hand-side function the integrator will use.
Definition: ERF_MRI.H:25
void setForceFirstStageSingleSubstep(int _force_stage1_single_substep)
Force the first RK stage to perform only a single substep.
Definition: ERF_MRI.H:175
int force_stage1_single_substep
Do we follow the recommendation to only perform a single substep in the first RK stage (-1 until setF...
Definition: ERF_MRI.H:66
int ncomp_cons
How many components in the cell-centered MultiFab (-1 until setNcompCons is called)
Definition: ERF_MRI.H:60
void setNoSubstepping(int _no_substepping)
Set whether acoustic substepping is disabled.
Definition: ERF_MRI.H:166
AnelasticType anelastic_type
Which two-stage scheme the anelastic integrator uses.
Definition: ERF_MRI.H:55
double timestep
Integrator timestep size (Real)
Definition: ERF_MRI.H:35
std::function< void(T &, T &, T &, const double, const double, const double, const int)> slow_rhs_pre
Definition: ERF_MRI.H:26
void set_no_substep(std::function< void(T &, T &, T &, const double, const double, int)> F)
Set the function to be called when acoustic substepping is disabled.
Definition: ERF_MRI.H:227
void initialize(const T &S_data)
Initialize integrator storage.
Definition: ERF_MRI.H:111
MRISplitIntegrator(MRISplitIntegrator &&) noexcept=default
void initialize_data(const T &S_data)
Allocate internal storage for integrator variables.
Definition: ERF_MRI.H:82
MRISplitIntegrator(const T &S_data)
Definition: ERF_MRI.H:102
std::function< void(T &, T &, T &, T &, const double, const double, const double, const int)> slow_rhs_post
Definition: ERF_MRI.H:27
void setAnelastic(int _anelastic)
Set whether to use the anelastic integrator.
Definition: ERF_MRI.H:148
std::function< void(T &, T &, T &, const double, const double, int)> no_substep
The no_substep function is called when we have no acoustic substepping.
Definition: ERF_MRI.H:71
int get_slow_fast_timestep_ratio()
Get the current slow-to-fast timestep ratio.
Definition: ERF_MRI.H:218
double advance(T &S_old, T &S_new, double time, const double time_step)
Advance the state from time to time + time_step.
Definition: ERF_MRI.H:245
int slow_fast_timestep_ratio
The ratio of slow timestep size / fast timestep size (int)
Definition: ERF_MRI.H:40
void set_acoustic_substepping(std::function< void(int, int, int, T &, const T &, T &, T &, const double, const double, const amrex::Real, const double, const double)> F)
Set the acoustic substepping function.
Definition: ERF_MRI.H:197
~MRISplitIntegrator()=default
void set_slow_fast_timestep_ratio(const int timestep_ratio=1)
Set the ratio of slow to fast timestep sizes.
Definition: ERF_MRI.H:209
T * S_sum
Definition: ERF_MRI.H:75
std::function< void(int, int, int, T &, const T &, T &, T &, const double, const double, const amrex::Real, const double, const double)> acoustic_substepping
Definition: ERF_MRI.H:30
int no_substepping
Should we not do acoustic substepping (-1 until setNoSubstepping is called)
Definition: ERF_MRI.H:45
@ NumTypes
Definition: ERF_IndexDefines.H:276
@ ks
Definition: ERF_SLM.H:74
@ T
Definition: ERF_IndexDefines.H:168
Definition: ERF_ConsoleIO.cpp:17