diff options
Diffstat (limited to 'src/Counter.c')
-rw-r--r-- | src/Counter.c | 73 |
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)) { |