aboutsummaryrefslogtreecommitdiff
path: root/src/Counter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Counter.c')
-rw-r--r--src/Counter.c73
1 files changed, 72 insertions, 1 deletions
diff --git a/src/Counter.c b/src/Counter.c
index 44515de..0093f1f 100644
--- a/src/Counter.c
+++ b/src/Counter.c
@@ -69,7 +69,13 @@ void MoL_SetCounter(CCTK_ARGUMENTS)
*MoL_Intermediate_Step = MoL_Intermediate_Steps;
-
+ // Always indicate execution of slow steps.
+ // If multirate methods are used, they are set to zero
+ // for certain substeps.
+ // In any case, outside the MoL loop, these scalars are guaranteed to be 1
+ *MoL_SlowStep = 1;
+ *MoL_SlowPostStep = 1;
+
/* #ifdef HAVE_CARPET */
if ((*MoL_Intermediate_Step))
{
@@ -114,6 +120,71 @@ void MoL_DecrementCounter(CCTK_ARGUMENTS)
(*MoL_Intermediate_Step) --;
+
+ if (CCTK_EQUALS(ODE_Method, "RK2-MR-2:1"))
+ {
+ switch (MoL_Intermediate_Steps - *MoL_Intermediate_Step)
+ {
+ case 2:
+ case 4:
+ if (*MoL_SlowStep)
+ *MoL_SlowPostStep = 1;
+ else
+ *MoL_SlowPostStep = 0;
+ // don't do slow step
+ *MoL_SlowStep = 0;
+ break;
+ default:
+ if (!(*MoL_SlowStep))
+ *MoL_SlowPostStep = 0;
+ else
+ *MoL_SlowPostStep = 1;
+ // do a slow step!
+ *MoL_SlowStep = 1;
+ }
+ }
+
+ if (CCTK_EQUALS(ODE_Method, "RK4-MR-2:1"))
+ {
+ switch (MoL_Intermediate_Steps - *MoL_Intermediate_Step)
+ {
+ case 2:
+ case 4:
+ case 7:
+ case 9:
+ // don't do slow step
+ *MoL_SlowStep = 0;
+ break;
+ default:
+ // do a slow step!
+ *MoL_SlowStep = 1;
+ }
+ }
+
+ if (CCTK_EQUALS(ODE_Method, "RK4-RK2"))
+ {
+ switch (MoL_Intermediate_Steps - *MoL_Intermediate_Step)
+ {
+ case 0:
+ // do a slow step!
+ *MoL_SlowStep = 1;
+ // don't sync!
+ *MoL_SlowPostStep = 0;
+ break;
+ case 1:
+ case 2:
+ // don't do slow step
+ *MoL_SlowStep = 0;
+ *MoL_SlowPostStep = 0;
+ break;
+ case 3:
+ // do a slow step!
+ *MoL_SlowStep = 1;
+ // sync!
+ *MoL_SlowPostStep = 1;
+ }
+ }
+
/* #ifdef HAVE_CARPET */
if (! (*MoL_Intermediate_Step))
{