diff options
author | Erik Schnetter <schnetter@cct.lsu.edu> | 2011-08-02 20:46:02 -0400 |
---|---|---|
committer | Barry Wardell <barry.wardell@gmail.com> | 2011-12-14 19:54:47 +0000 |
commit | 830f8c95542e8ab3f1badfe51539568f8f94032c (patch) | |
tree | 2552c1f6c1f17a837abe1fe0a9fa4edab8d1c973 /Carpet/Carpet/src | |
parent | 1b32987adea5b35431aaeb30a466b3a185cc00f6 (diff) |
Carpet: Correct schedule traversal for poststep and post_recover_variables
Traverse postrestrict bin in correct order (i.e. coarsest to finest),
so that prolongation boundaries are applied consistently.
Traverse post_recover_variables in only for current timelevel (not for
all timelevels). Variables on past timelevels cannot have their
boundary conditions applied consistently, because time interpolation
for these may requires even older timelevels that are not available.
Diffstat (limited to 'Carpet/Carpet/src')
-rw-r--r-- | Carpet/Carpet/src/Evolve.cc | 80 | ||||
-rw-r--r-- | Carpet/Carpet/src/Initialise.cc | 11 |
2 files changed, 65 insertions, 26 deletions
diff --git a/Carpet/Carpet/src/Evolve.cc b/Carpet/Carpet/src/Evolve.cc index a9034f774..21647a4e3 100644 --- a/Carpet/Carpet/src/Evolve.cc +++ b/Carpet/Carpet/src/Evolve.cc @@ -449,41 +449,22 @@ namespace Carpet { for (int ml=mglevels-1; ml>=0; --ml) { - bool have_done_global_mode = false; - bool have_done_early_global_mode = false; - bool have_done_late_global_mode = false; - bool have_done_anything = false; + bool did_restrict = false; for (int rl=reflevels-2; rl>=0; --rl) { - int const do_every - = ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.AT(rl)); + int const do_every = + ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.AT(rl)); if (cctkGH->cctk_iteration % do_every == 0) { ENTER_GLOBAL_MODE (cctkGH, ml) { ENTER_LEVEL_MODE (cctkGH, rl) { BeginTimingLevel (cctkGH); - do_early_global_mode = reflevel==reflevels-2; - do_late_global_mode = not have_done_late_global_mode; - do_early_meta_mode = do_early_global_mode and mglevel==mglevels-1; - do_late_meta_mode = do_late_global_mode and mglevel==0; - do_global_mode = do_late_global_mode; - do_meta_mode = do_global_mode and do_late_meta_mode; - assert (not (have_done_global_mode and do_global_mode)); - assert (not (have_done_early_global_mode and - do_early_global_mode)); - assert (not (have_done_late_global_mode and - do_late_global_mode)); - have_done_global_mode |= do_global_mode; - have_done_early_global_mode |= do_early_global_mode; - have_done_late_global_mode |= do_late_global_mode; - have_done_anything = true; - Waypoint ("Evolution/Restrict at iteration %d time %g", cctkGH->cctk_iteration, (double)cctkGH->cctk_time); Restrict (cctkGH); - ScheduleTraverse (where, "CCTK_POSTRESTRICT", cctkGH); + did_restrict = true; EndTimingLevel (cctkGH); } LEAVE_LEVEL_MODE; @@ -491,9 +472,56 @@ namespace Carpet { } // if do_every } // for rl - if (have_done_anything) assert (have_done_global_mode); - if (have_done_anything) assert (have_done_early_global_mode); - if (have_done_anything) assert (have_done_late_global_mode); + if (did_restrict) { + + bool have_done_global_mode = false; + bool have_done_early_global_mode = false; + bool have_done_late_global_mode = false; + bool have_done_anything = false; + + for (int rl=0; rl<reflevels; ++rl) { + int const do_every = + ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.AT(rl)); + if (cctkGH->cctk_iteration % do_every == 0) { + ENTER_GLOBAL_MODE (cctkGH, ml) { + ENTER_LEVEL_MODE (cctkGH, rl) { + BeginTimingLevel (cctkGH); + + // do_early_global_mode = reflevel==reflevels-2; + // do_late_global_mode = not have_done_late_global_mode; + do_early_global_mode = not have_done_early_global_mode; + do_late_global_mode = reflevel==reflevels-1; + do_early_meta_mode = + do_early_global_mode and mglevel==mglevels-1; + do_late_meta_mode = do_late_global_mode and mglevel==0; + do_global_mode = do_late_global_mode; + do_meta_mode = do_global_mode and do_late_meta_mode; + assert (not (have_done_global_mode and do_global_mode)); + assert (not (have_done_early_global_mode and + do_early_global_mode)); + assert (not (have_done_late_global_mode and + do_late_global_mode)); + have_done_global_mode |= do_global_mode; + have_done_early_global_mode |= do_early_global_mode; + have_done_late_global_mode |= do_late_global_mode; + have_done_anything = true; + + Waypoint ("Evolution/PostRestrict at iteration %d time %g", + cctkGH->cctk_iteration, (double)cctkGH->cctk_time); + + ScheduleTraverse (where, "CCTK_POSTRESTRICT", cctkGH); + + EndTimingLevel (cctkGH); + } LEAVE_LEVEL_MODE; + } LEAVE_GLOBAL_MODE; + } // if do_every + } // for rl + + if (have_done_anything) assert (have_done_global_mode); + if (have_done_anything) assert (have_done_early_global_mode); + if (have_done_anything) assert (have_done_late_global_mode); + + } // if did_restrict } // for ml diff --git a/Carpet/Carpet/src/Initialise.cc b/Carpet/Carpet/src/Initialise.cc index 35fe88a6b..c9ab6cef3 100644 --- a/Carpet/Carpet/src/Initialise.cc +++ b/Carpet/Carpet/src/Initialise.cc @@ -282,6 +282,7 @@ namespace Carpet { do_global_mode = do_early_global_mode; // on first iteration, coarsest grid do_meta_mode = do_early_meta_mode; // on first iteration, coarsest grid +#if 0 BEGIN_TIMELEVEL_LOOP(cctkGH) { Waypoint ("Recovering II at iteration %d time %g timelevel %d%s%s", @@ -295,6 +296,16 @@ namespace Carpet { ScheduleTraverse (where, "CCTK_POST_RECOVER_VARIABLES", cctkGH); } END_TIMELEVEL_LOOP; +#else + Waypoint ("Recovering II at iteration %d time %g%s%s", + cctkGH->cctk_iteration, + (double)cctkGH->cctk_time, + (do_global_mode ? " (global)" : ""), + (do_meta_mode ? " (meta)" : "")); + + // Post recover variables + ScheduleTraverse (where, "CCTK_POST_RECOVER_VARIABLES", cctkGH); +#endif // Checking PoisonCheck (cctkGH, currenttime); |