ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
MRISplitIntegrator< T > Class Template Reference

Split integrator for MRI simulations handling slow and fast timescales. More...

#include <ERF_MRI.H>

Collaboration diagram for MRISplitIntegrator< T >:

Public Member Functions

 MRISplitIntegrator ()=default
 
 MRISplitIntegrator (const T &S_data)
 
void initialize (const T &S_data)
 Initialize integrator storage. More...
 
 ~MRISplitIntegrator ()=default
 
 MRISplitIntegrator (MRISplitIntegrator &&) noexcept=default
 
MRISplitIntegrator & operator= (MRISplitIntegrator &&other) noexcept=default
 
 MRISplitIntegrator (const MRISplitIntegrator &other)=delete
 
MRISplitIntegrator & operator= (const MRISplitIntegrator &other)=delete
 
void setNcompCons (int _ncomp_cons)
 Set the number of conservative components. More...
 
void setAnelastic (int _anelastic)
 Set whether to use the anelastic integrator. More...
 
void setAnelasticType (AnelasticType _anelastic_type=AnelasticType::RK2)
 Set which two-stage scheme the anelastic integrator uses. More...
 
void setNoSubstepping (int _no_substepping)
 Set whether acoustic substepping is disabled. More...
 
void setForceFirstStageSingleSubstep (int _force_stage1_single_substep)
 Force the first RK stage to perform only a single substep. More...
 
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. More...
 
void set_slow_rhs_post (std::function< void(T &, T &, T &, T &, const double, const double, const double, const int)> F)
 
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. More...
 
void set_slow_fast_timestep_ratio (const int timestep_ratio=1)
 Set the ratio of slow to fast timestep sizes. More...
 
int get_slow_fast_timestep_ratio ()
 Get the current slow-to-fast timestep ratio. More...
 
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. More...
 
std::function< void(T &, const T &, const double, const double)> get_rhs ()
 
double advance (T &S_old, T &S_new, double time, const double time_step)
 Advance the state from time to time + time_step. More...
 
void map_data (std::function< void(T &)> Map)
 Apply a mapping function to all internal stored data. More...
 

Private Member Functions

void initialize_data (const T &S_data)
 Allocate internal storage for integrator variables. More...
 

Private Attributes

std::function< void(T &, const T &, const double, const double)> rhs
 rhs is the right-hand-side function the integrator will use. More...
 
std::function< void(T &, T &, T &, const double, const double, const double, const int)> slow_rhs_pre
 
std::function< void(T &, T &, T &, T &, const double, const double, const double, const int)> slow_rhs_post
 
std::function< void(int, int, int, T &, const T &, T &, T &, const double, const double, const amrex::Real, const double, const double)> acoustic_substepping
 
double timestep = 0.0
 Integrator timestep size (Real) More...
 
int slow_fast_timestep_ratio = 0
 The ratio of slow timestep size / fast timestep size (int) More...
 
int no_substepping = -1
 Should we not do acoustic substepping (-1 until setNoSubstepping is called) More...
 
int anelastic = -1
 Should we use the anelastic integrator (-1 until setAnelastic is called) More...
 
AnelasticType anelastic_type = AnelasticType::RK2
 Which two-stage scheme the anelastic integrator uses. More...
 
int ncomp_cons = -1
 How many components in the cell-centered MultiFab (-1 until setNcompCons is called) More...
 
int force_stage1_single_substep = -1
 Do we follow the recommendation to only perform a single substep in the first RK stage (-1 until setForceFirstStageSingleSubstep is called) More...
 
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. More...
 
amrex::Vector< std::unique_ptr< T > > T_store
 
T * S_sum = nullptr
 
T * F_slow = nullptr
 

Detailed Description

template<class T>
class MRISplitIntegrator< T >

Split integrator for MRI simulations handling slow and fast timescales.

Template Parameters
TState type.

Constructor & Destructor Documentation

◆ MRISplitIntegrator() [1/4]

template<class T >
MRISplitIntegrator< T >::MRISplitIntegrator ( )
default

◆ MRISplitIntegrator() [2/4]

template<class T >
MRISplitIntegrator< T >::MRISplitIntegrator ( const T &  S_data)
inline
103  {
104  initialize_data(S_data);
105  }
void initialize_data(const T &S_data)
Allocate internal storage for integrator variables.
Definition: ERF_MRI.H:82
Here is the call graph for this function:

◆ ~MRISplitIntegrator()

template<class T >
MRISplitIntegrator< T >::~MRISplitIntegrator ( )
default

◆ MRISplitIntegrator() [3/4]

template<class T >
MRISplitIntegrator< T >::MRISplitIntegrator ( MRISplitIntegrator< T > &&  )
defaultnoexcept

◆ MRISplitIntegrator() [4/4]

template<class T >
MRISplitIntegrator< T >::MRISplitIntegrator ( const MRISplitIntegrator< T > &  other)
delete

Member Function Documentation

◆ advance()

template<class T >
double MRISplitIntegrator< T >::advance ( T &  S_old,
T &  S_new,
double  time,
const double  time_step 
)
inline

Advance the state from time to time + time_step.

Parameters
[in,out]S_oldCurrent state.
[in,out]S_newState to be updated.
[in]timeCurrent simulation time.
[in]time_stepTimestep size.
Returns
The actual timestep taken.
246  {
247  BL_PROFILE_REGION("MRI_advance");
248  using namespace amrex;
249 
250  // *******************************************************************************
251  // !no_substepping: we only update the fast variables every fast timestep, then update
252  // the slow variables after the acoustic sub-stepping. This has
253  // 2 calls to slow_rhs so that we can update the slow variables
254  // with the velocity field after the acoustic substepping using
255  // the time-averaged velocity from the substepping
256  // no_substepping: we don't do any acoustic subcycling so we only make one call per RK
257  // stage to slow_rhs
258  // *******************************************************************************
261  "MRISplitIntegrator::advance: setNoSubstepping, setAnelastic, "
262  "setForceFirstStageSingleSubstep and setNcompCons must be called before advance");
263  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(S_sum != nullptr && F_slow != nullptr,
264  "MRISplitIntegrator::advance: integrator storage must be initialized before advance");
265 
266  timestep = time_step;
267 
268  const int substep_ratio = get_slow_fast_timestep_ratio();
269 
270  if (!no_substepping) {
271  AMREX_ALWAYS_ASSERT(substep_ratio > 1 && substep_ratio % 2 == 0);
272  }
273 
274  // Assume before advance() that S_old is valid data at the current time ("time" argument)
275  // And that if data is a MultiFab, both S_old and S_new contain ghost cells for evaluating a stencil based RHS
276  // We need this from S_old. This is convenient for S_new to have so we can use it
277  // as scratch space for stage values without creating a new scratch MultiFab with ghost cells.
278 
279  // NOTE: In the following, we use S_new to hold S*, S**, and finally, S^(n+1) at the new time
280  // DEFINITIONS:
281  // S_old = S^n
282  // S_sum = S(t)
283  // F_slow = F(S_stage)
284 
285  int n_data = IntVars::NumTypes;
286 
287  /**********************************************/
288  /* RK3 Integration with Acoustic Sub-stepping */
289  /**********************************************/
290  Vector<int> num_vars = {ncomp_cons, 1, 1, 1};
291  for (int i(0); i<n_data; ++i)
292  {
293  // Copy old -> new
294  MultiFab::Copy(S_new[i],S_old[i],0,0,num_vars[i],S_old[i].nGrowVect());
295  }
296 
297  // Timestep taken by the fast integrator
298  double dtau;
299 
300  // How many timesteps taken by the fast integrator
301  int nsubsteps;
302 
303  // This is the final time of the full timestep (also the 3rd RK stage)
304  // Real new_time = time + timestep;
305 
306  double time_stage = time;
307  double old_time_stage;
308 
309  if (!anelastic) {
310  // RK3 for compressible integrator
311  for (int nrk = 0; nrk < 3; nrk++)
312  {
313  // Capture the time we got to in the previous RK step
314  old_time_stage = time_stage;
315 
316  if (nrk == 0) {
318  nsubsteps = 1;
319  dtau = timestep / three;
320  } else {
321  // Clamp to 1: substep_ratio is only required to be even, so a ratio of 2
322  // would otherwise give zero substeps and leave S_sum stale in this stage
323  nsubsteps = std::max(substep_ratio/3, 1);
324  dtau = (timestep / three) / static_cast<double>(nsubsteps);
325  }
326  time_stage = time + timestep / three;
327  }
328  if (nrk == 1) {
329  if (no_substepping) {
330  nsubsteps = 1;
331  dtau = myhalf * timestep;
332  } else {
333  nsubsteps = std::max(substep_ratio/2, 1);
334  dtau = (myhalf * timestep) / static_cast<double>(nsubsteps);
335  }
336  time_stage = time + timestep / two;
337  }
338  if (nrk == 2) {
339  if (no_substepping) {
340  nsubsteps = 1;
341  dtau = timestep;
342  } else {
343  nsubsteps = substep_ratio;
344  dtau = timestep / static_cast<double>(nsubsteps);
345  }
346  time_stage = time + timestep;
347  }
348 
349  // step 1 starts with S_stage = S^n and we always start substepping at the old time
350  // step 2 starts with S_stage = S^* and we always start substepping at the old time
351  // step 3 starts with S_stage = S^** and we always start substepping at the old time
352 
353  slow_rhs_pre(*F_slow, S_old, S_new, time, old_time_stage, time_stage, nrk);
354 
355  amrex::Real inv_fac = one / static_cast<amrex::Real>(nsubsteps);
356 
357  // ****************************************************
358  // Acoustic substepping
359  // ****************************************************
360  if (!no_substepping)
361  {
362  // *******************************************************************************
363  // Update the fast variables
364  // *******************************************************************************
365  for (int ks = 0; ks < nsubsteps; ++ks)
366  {
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);
369 
370  } // ks
371 
372  } else {
373  no_substep(*S_sum, S_old, *F_slow, time + nsubsteps*dtau, nsubsteps*dtau, nrk);
374  }
375 
376  // ****************************************************
377  // Evaluate F_slow(S_stage) only for the slow variables
378  // Note that we are using the current stage versions (in S_new) of the slow variables
379  // (because we didn't update the slow variables in the substepping)
380  // and the momenta slow_rhs_pre set from the same stage, plus the average of
381  // the acoustic substep updates when substepping, to advect them
382  // (the mass fluxes that advance rho over the stage)
383  // ****************************************************
384  slow_rhs_post(*F_slow, S_old, S_new, *S_sum, time, old_time_stage, time_stage, nrk);
385  } // nrk
386 
387  } else {
388  // Two-stage integrator for the anelastic equations.
389  //
390  // SSP-RK2 (Heun): both stages advance a full timestep from S^n, and the
391  // second stage averages the slow source with the one from the first,
392  // which erf_slow_rhs_{pre,post} do when (anelastic_type == RK2 && nrk == 1).
393  //
394  // MidPoint: the first stage advances only a half timestep,
395  // S^* = S^n + (dt/2) F(S^n)
396  // S^n+1 = S^n + dt F(S^*)
397  // and the second stage takes no average. The vertical diffusion
398  // is second order in time with a tridiagonal solve in the first
399  // stage only and none in the second.
400  const bool l_midpoint = (anelastic_type == AnelasticType::MidPoint);
401 
402  for (int nrk = 0; nrk < 2; nrk++)
403  {
404  // Capture the time we got to in the previous RK step
405  old_time_stage = time_stage;
406 
407  // Set the timestep for this stage -- both stages advance from the old time
408  nsubsteps = 1;
409  dtau = (l_midpoint && (nrk == 0)) ? myhalf * timestep : timestep;
410  time_stage = time + nsubsteps * dtau;
411 
412  slow_rhs_pre(*F_slow, S_old, S_new, time, old_time_stage, time_stage, nrk);
413 
414  no_substep(*S_sum, S_old, *F_slow, time + nsubsteps*dtau, nsubsteps*dtau, nrk);
415 
416  // ****************************************************
417  // Evaluate F_slow(S_stage) only for the slow variables
418  // Note that we are using the current stage versions (in S_new) of the slow variables
419  // and the momenta slow_rhs_pre took from the same stage to advect them;
420  // S_sum holds the projected state at the end of the stage
421  // ****************************************************
422  slow_rhs_post(*F_slow, S_old, S_new, *S_sum, time, old_time_stage, time_stage, nrk);
423  } // nrk
424  }
425 
426  // Return timestep
427  return timestep;
428  }
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)
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
T * F_slow
Definition: ERF_MRI.H:76
int anelastic
Should we use the anelastic integrator (-1 until setAnelastic is called)
Definition: ERF_MRI.H:50
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
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
std::function< void(T &, T &, T &, T &, const double, const double, const double, const int)> slow_rhs_post
Definition: ERF_MRI.H:27
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
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
Definition: ERF_ConsoleIO.cpp:17

Referenced by ERF::advance_dycore().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_rhs()

template<class T >
std::function<void(T&, const T&, const double, const double)> MRISplitIntegrator< T >::get_rhs ( )
inline
233  {
234  return rhs;
235  }
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

◆ get_slow_fast_timestep_ratio()

template<class T >
int MRISplitIntegrator< T >::get_slow_fast_timestep_ratio ( )
inline

Get the current slow-to-fast timestep ratio.

Returns
The slow/fast timestep ratio.
219  {
221  }
int slow_fast_timestep_ratio
The ratio of slow timestep size / fast timestep size (int)
Definition: ERF_MRI.H:40

Referenced by MRISplitIntegrator< T >::advance().

Here is the caller graph for this function:

◆ initialize()

template<class T >
void MRISplitIntegrator< T >::initialize ( const T &  S_data)
inline

Initialize integrator storage.

Parameters
[in]S_dataReference state used to determine storage size.
112  {
113  initialize_data(S_data);
114  }
Here is the call graph for this function:

◆ initialize_data()

template<class T >
void MRISplitIntegrator< T >::initialize_data ( const T &  S_data)
inlineprivate

Allocate internal storage for integrator variables.

Parameters
[in]S_dataReference state used to determine storage size.
83  {
84  // TODO: We can optimize memory by making the cell-centered part of S_sum
85  // have only 2 components, not ncomp_cons components
86  const bool include_ghost = true;
87  // CreateLike appends to T_store, so drop any storage from a previous
88  // initialization before S_sum and F_slow are taken from entries 0 and 1
89  T_store.clear();
90  amrex::IntegratorOps<T>::CreateLike(T_store, S_data, include_ghost);
91  S_sum = T_store[0].get();
92  amrex::IntegratorOps<T>::CreateLike(T_store, S_data, include_ghost);
93  F_slow = T_store[1].get();
94  // initializing to zero
95  for (long idx = 0; idx < S_sum->size(); idx++) { (*S_sum)[idx].setVal(0); }
96  for (long idx = 0; idx < F_slow->size(); idx++) { (*F_slow)[idx].setVal(0); }
97  }
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int idx(int i, int j, int k, int nx, int ny)
Definition: ERF_InitForEnsemble.cpp:404
amrex::Vector< std::unique_ptr< T > > T_store
Definition: ERF_MRI.H:74

Referenced by MRISplitIntegrator< T >::initialize(), and MRISplitIntegrator< T >::MRISplitIntegrator().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ map_data()

template<class T >
void MRISplitIntegrator< T >::map_data ( std::function< void(T &)>  Map)
inline

Apply a mapping function to all internal stored data.

Parameters
[in]MapMapping function to apply to each stored state object.
435  {
436  for (auto& F : T_store) {
437  Map(*F);
438  }
439  }

◆ operator=() [1/2]

template<class T >
MRISplitIntegrator& MRISplitIntegrator< T >::operator= ( const MRISplitIntegrator< T > &  other)
delete

◆ operator=() [2/2]

template<class T >
MRISplitIntegrator& MRISplitIntegrator< T >::operator= ( MRISplitIntegrator< T > &&  other)
defaultnoexcept

◆ set_acoustic_substepping()

template<class T >
void MRISplitIntegrator< T >::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)
inline

Set the acoustic substepping function.

Parameters
[in]FFunction to perform the acoustic substepping update.
201  {
203  }

Referenced by ERF::advance_dycore().

Here is the caller graph for this function:

◆ set_no_substep()

template<class T >
void MRISplitIntegrator< T >::set_no_substep ( std::function< void(T &, T &, T &, const double, const double, int)>  F)
inline

Set the function to be called when acoustic substepping is disabled.

Parameters
[in]FFunction to use in place of substepping.
228  {
229  no_substep = F;
230  }

Referenced by ERF::advance_dycore().

Here is the caller graph for this function:

◆ set_slow_fast_timestep_ratio()

template<class T >
void MRISplitIntegrator< T >::set_slow_fast_timestep_ratio ( const int  timestep_ratio = 1)
inline

Set the ratio of slow to fast timestep sizes.

Parameters
[in]timestep_ratioRatio of slow/fast timesteps.
210  {
211  slow_fast_timestep_ratio = timestep_ratio;
212  }

Referenced by ERF::advance_dycore().

Here is the caller graph for this function:

◆ set_slow_rhs_post()

template<class T >
void MRISplitIntegrator< T >::set_slow_rhs_post ( std::function< void(T &, T &, T &, T &, const double, const double, const double, const int)>  F)
inline
189  {
190  slow_rhs_post = F;
191  }

Referenced by ERF::advance_dycore().

Here is the caller graph for this function:

◆ set_slow_rhs_pre()

template<class T >
void MRISplitIntegrator< T >::set_slow_rhs_pre ( std::function< void(T &, T &, T &, const double, const double, const double, const int)>  F)
inline

Set the pre-substepping slow RHS function.

Parameters
[in]FFunction to compute the pre-substepping slow RHS.
185  {
186  slow_rhs_pre = F;
187  }

Referenced by ERF::advance_dycore().

Here is the caller graph for this function:

◆ setAnelastic()

template<class T >
void MRISplitIntegrator< T >::setAnelastic ( int  _anelastic)
inline

Set whether to use the anelastic integrator.

Parameters
[in]_anelasticInteger flag (1 for anelastic, 0 for compressible).
149  {
150  anelastic = _anelastic;
151  }

◆ setAnelasticType()

template<class T >
void MRISplitIntegrator< T >::setAnelasticType ( AnelasticType  _anelastic_type = AnelasticType::RK2)
inline

Set which two-stage scheme the anelastic integrator uses.

Parameters
[in]_anelastic_typeAnelasticType::RK2 or AnelasticType::MidPoint.
158  {
159  anelastic_type = _anelastic_type;
160  }

◆ setForceFirstStageSingleSubstep()

template<class T >
void MRISplitIntegrator< T >::setForceFirstStageSingleSubstep ( int  _force_stage1_single_substep)
inline

Force the first RK stage to perform only a single substep.

Parameters
[in]_force_stage1_single_substepInteger flag to enable this behavior.
176  {
177  force_stage1_single_substep = _force_stage1_single_substep;
178  }

◆ setNcompCons()

template<class T >
void MRISplitIntegrator< T >::setNcompCons ( int  _ncomp_cons)
inline

Set the number of conservative components.

Parameters
[in]_ncomp_consNumber of conservative components.
140  {
141  ncomp_cons = _ncomp_cons;
142  }

◆ setNoSubstepping()

template<class T >
void MRISplitIntegrator< T >::setNoSubstepping ( int  _no_substepping)
inline

Set whether acoustic substepping is disabled.

Parameters
[in]_no_substeppingInteger flag (1 to disable substepping).
167  {
168  no_substepping = _no_substepping;
169  }

Member Data Documentation

◆ acoustic_substepping

template<class T >
std::function<void(int, int, int, T&, const T&, T&, T&, const double, const double, const amrex::Real, const double, const double)> MRISplitIntegrator< T >::acoustic_substepping
private

◆ anelastic

template<class T >
int MRISplitIntegrator< T >::anelastic = -1
private

Should we use the anelastic integrator (-1 until setAnelastic is called)

Referenced by MRISplitIntegrator< T >::advance(), and MRISplitIntegrator< T >::setAnelastic().

◆ anelastic_type

template<class T >
AnelasticType MRISplitIntegrator< T >::anelastic_type = AnelasticType::RK2
private

Which two-stage scheme the anelastic integrator uses.

Referenced by MRISplitIntegrator< T >::advance(), and MRISplitIntegrator< T >::setAnelasticType().

◆ F_slow

template<class T >
T* MRISplitIntegrator< T >::F_slow = nullptr
private

◆ force_stage1_single_substep

template<class T >
int MRISplitIntegrator< T >::force_stage1_single_substep = -1
private

Do we follow the recommendation to only perform a single substep in the first RK stage (-1 until setForceFirstStageSingleSubstep is called)

Referenced by MRISplitIntegrator< T >::advance(), and MRISplitIntegrator< T >::setForceFirstStageSingleSubstep().

◆ ncomp_cons

template<class T >
int MRISplitIntegrator< T >::ncomp_cons = -1
private

How many components in the cell-centered MultiFab (-1 until setNcompCons is called)

Referenced by MRISplitIntegrator< T >::advance(), and MRISplitIntegrator< T >::setNcompCons().

◆ no_substep

template<class T >
std::function<void (T&, T&, T&, const double, const double, int)> MRISplitIntegrator< T >::no_substep
private

The no_substep function is called when we have no acoustic substepping.

Referenced by MRISplitIntegrator< T >::advance(), and MRISplitIntegrator< T >::set_no_substep().

◆ no_substepping

template<class T >
int MRISplitIntegrator< T >::no_substepping = -1
private

Should we not do acoustic substepping (-1 until setNoSubstepping is called)

Referenced by MRISplitIntegrator< T >::advance(), and MRISplitIntegrator< T >::setNoSubstepping().

◆ rhs

template<class T >
std::function<void(T&, const T&, const double, const double)> MRISplitIntegrator< T >::rhs
private

rhs is the right-hand-side function the integrator will use.

Referenced by MRISplitIntegrator< T >::get_rhs().

◆ S_sum

template<class T >
T* MRISplitIntegrator< T >::S_sum = nullptr
private

◆ slow_fast_timestep_ratio

template<class T >
int MRISplitIntegrator< T >::slow_fast_timestep_ratio = 0
private

The ratio of slow timestep size / fast timestep size (int)

Referenced by MRISplitIntegrator< T >::get_slow_fast_timestep_ratio(), and MRISplitIntegrator< T >::set_slow_fast_timestep_ratio().

◆ slow_rhs_post

template<class T >
std::function<void(T&, T&, T&, T&, const double, const double, const double, const int)> MRISplitIntegrator< T >::slow_rhs_post
private

◆ slow_rhs_pre

template<class T >
std::function<void(T&, T&, T&, const double, const double, const double, const int)> MRISplitIntegrator< T >::slow_rhs_pre
private

◆ T_store

template<class T >
amrex::Vector<std::unique_ptr<T> > MRISplitIntegrator< T >::T_store
private

◆ timestep

template<class T >
double MRISplitIntegrator< T >::timestep = 0.0
private

Integrator timestep size (Real)

Referenced by MRISplitIntegrator< T >::advance().


The documentation for this class was generated from the following file: