aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcott <schnetter@cct.lsu.edu>2006-04-17 14:17:00 +0000
committercott <schnetter@cct.lsu.edu>2006-04-17 14:17:00 +0000
commit731fa9add174636763abcd71e9ef5aade690adee (patch)
treee816309ee131ee4928598fdf26d512197ba4e9f5
parentd9d028a2700ff0082c32a471dc4e450de711dd56 (diff)
Introducing group/bin PreRegrid.
Changes to: Carpet/Carpet/schedule.ccl Carpet/Carpet/src/Evolve.cc Carpet/Carpet/src/Initialise.cc It is now possible to schedule routines in the schedule group PreRegrid (defined in Carpet's schedule.ccl). Routines scheduled in PreRegrid are called by Carpet before regridding. This is necessary for consistency when doing AMR and, e.g., checkpointing. - Christian darcs-hash:20060417141735-34d71-d96a74cdd306dace1ffe69d66d5e7aac385c6b19.gz
-rw-r--r--Carpet/Carpet/schedule.ccl4
-rw-r--r--Carpet/Carpet/src/Evolve.cc57
-rw-r--r--Carpet/Carpet/src/Initialise.cc40
3 files changed, 88 insertions, 13 deletions
diff --git a/Carpet/Carpet/schedule.ccl b/Carpet/Carpet/schedule.ccl
index 60fd793b3..1e9d9a1fc 100644
--- a/Carpet/Carpet/schedule.ccl
+++ b/Carpet/Carpet/schedule.ccl
@@ -9,3 +9,7 @@ schedule CarpetStartup at STARTUP as Driver_Startup
{
LANG: C
} "Startup routine"
+
+schedule group PreRegrid in DUMMY
+{
+} "Perform Pre-Regrid actions"
diff --git a/Carpet/Carpet/src/Evolve.cc b/Carpet/Carpet/src/Evolve.cc
index 85c35c37b..af292ea38 100644
--- a/Carpet/Carpet/src/Evolve.cc
+++ b/Carpet/Carpet/src/Evolve.cc
@@ -120,6 +120,7 @@ namespace Carpet {
static void AdvanceTime( cGH* cgh, CCTK_REAL initial_time );
static bool Regrid( cGH* cgh );
+ static void PreRegrid( cGH* cgh );
static void PostRegrid( cGH* cgh );
static void EvolutionI( cGH* cgh );
static void Evolution_Restrict( cGH* cgh );
@@ -145,6 +146,8 @@ namespace Carpet {
cgh->cctk_iteration, (double)cgh->cctk_time);
}
+ PreRegrid( cgh );
+
if( Regrid( cgh ) )
PostRegrid( cgh );
@@ -186,6 +189,33 @@ namespace Carpet {
}
}
+ void PreRegrid( cGH* cgh )
+ {
+ for (int rl=0; rl<reflevels; ++rl) {
+ for (int ml=mglevels-1; ml>=0; --ml) {
+ const int do_every = maxtimereflevelfact / timereffacts.at(rl);
+ if ((cgh->cctk_iteration-1) % do_every == 0) {
+ enter_global_mode (cgh, ml);
+ enter_level_mode (cgh, rl);
+
+ do_global_mode = reflevel==0;
+ do_meta_mode = do_global_mode and mglevel==mglevels-1;
+
+ Waypoint ("Preregrid at iteration %d time %g%s%s",
+ cgh->cctk_iteration, (double)cgh->cctk_time,
+ (do_global_mode ? " (global)" : ""),
+ (do_meta_mode ? " (meta)" : ""));
+
+ Checkpoint ("Scheduling PREREGRID");
+ CCTK_ScheduleTraverse ("PreRegrid", cgh, CallFunction);
+
+ leave_level_mode (cgh);
+ leave_global_mode (cgh);
+ }
+ }
+ }
+ }
+
bool Regrid( cGH* cgh )
{
bool did_regrid = false;
@@ -211,22 +241,25 @@ namespace Carpet {
{
for (int rl=0; rl<reflevels; ++rl) {
for (int ml=mglevels-1; ml>=0; --ml) {
- enter_global_mode (cgh, ml);
- enter_level_mode (cgh, rl);
+ const int do_every = maxtimereflevelfact / timereffacts.at(rl);
+ if ((cgh->cctk_iteration-1) % do_every == 0) {
+ enter_global_mode (cgh, ml);
+ enter_level_mode (cgh, rl);
- do_global_mode = reflevel==0;
- do_meta_mode = do_global_mode and mglevel==mglevels-1;
+ do_global_mode = reflevel==0;
+ do_meta_mode = do_global_mode and mglevel==mglevels-1;
- Waypoint ("Postregrid at iteration %d time %g%s%s",
- cgh->cctk_iteration, (double)cgh->cctk_time,
- (do_global_mode ? " (global)" : ""),
- (do_meta_mode ? " (meta)" : ""));
+ Waypoint ("Postregrid at iteration %d time %g%s%s",
+ cgh->cctk_iteration, (double)cgh->cctk_time,
+ (do_global_mode ? " (global)" : ""),
+ (do_meta_mode ? " (meta)" : ""));
- Checkpoint ("Scheduling POSTREGRID");
- CCTK_ScheduleTraverse ("CCTK_POSTREGRID", cgh, CallFunction);
+ Checkpoint ("Scheduling POSTREGRID");
+ CCTK_ScheduleTraverse ("CCTK_POSTREGRID", cgh, CallFunction);
- leave_level_mode (cgh);
- leave_global_mode (cgh);
+ leave_level_mode (cgh);
+ leave_global_mode (cgh);
+ }
}
}
}
diff --git a/Carpet/Carpet/src/Initialise.cc b/Carpet/Carpet/src/Initialise.cc
index d892ac7b2..f535f0a2c 100644
--- a/Carpet/Carpet/src/Initialise.cc
+++ b/Carpet/Carpet/src/Initialise.cc
@@ -186,6 +186,24 @@ namespace Carpet {
void recover_Regrid (cGH * const cgh, int const rl)
{
+ BEGIN_MGLEVEL_LOOP(cgh) {
+ enter_level_mode (cgh, rl);
+ do_global_mode = true;
+ do_meta_mode = do_global_mode and mglevel==mglevels-1;
+
+ Waypoint ("Preregrid at iteration %d time %g%s%s",
+ cgh->cctk_iteration, (double)cgh->cctk_time,
+ (do_global_mode ? " (global)" : ""),
+ (do_meta_mode ? " (meta)" : ""));
+
+ // Preregrid
+ Checkpoint ("Scheduling PREREGRID");
+ CCTK_ScheduleTraverse ("PreRegrid", cgh, CallFunction);
+
+ leave_level_mode (cgh);
+ } END_MGLEVEL_LOOP;
+
+
bool did_regrid = false;
{
const int ml=0;
@@ -321,7 +339,27 @@ namespace Carpet {
void initialise_Regrid (cGH * const cgh, int const rl)
{
DECLARE_CCTK_PARAMETERS;
-
+
+
+ // Preregrid
+ BEGIN_MGLEVEL_LOOP(cgh) {
+ enter_level_mode (cgh, rl);
+ do_global_mode = true;
+ do_meta_mode = do_global_mode and mglevel==mglevels-1;
+
+ Waypoint ("Preregrid at iteration %d time %g%s%s",
+ cgh->cctk_iteration, (double)cgh->cctk_time,
+ (do_global_mode ? " (global)" : ""),
+ (do_meta_mode ? " (meta)" : ""));
+
+ // Preregrid
+ Checkpoint ("Scheduling PREREGRID");
+ CCTK_ScheduleTraverse ("PreRegrid", cgh, CallFunction);
+
+ leave_level_mode (cgh);
+ } END_MGLEVEL_LOOP;
+
+
bool did_regrid = false;
{
const int ml=0;