From 11c4d98017cbb86d08e15fd1b549180184b58a26 Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Thu, 3 Sep 2009 16:19:15 -0500 Subject: Import Carpet Ignore-this: 309b4dd613f4af2b84aa5d6743fdb6b3 --- Carpet/Carpet/src/Evolve.cc | 120 ++++++++++++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 42 deletions(-) (limited to 'Carpet/Carpet/src/Evolve.cc') diff --git a/Carpet/Carpet/src/Evolve.cc b/Carpet/Carpet/src/Evolve.cc index 5b9d8ff96..103221088 100644 --- a/Carpet/Carpet/src/Evolve.cc +++ b/Carpet/Carpet/src/Evolve.cc @@ -16,8 +16,8 @@ #include #include -#include "carpet.hh" -#include "Timers.hh" +#include +#include @@ -53,27 +53,21 @@ namespace Carpet { int const convlev = 0; cGH* cctkGH = fc->GH[convlev]; - // Tapered grids - do_taper = use_tapered_grids; - // Main loop - BeginTiming (cctkGH); + BeginTimingEvolution (cctkGH); static Timer timer ("Evolve"); timer.start(); while (not do_terminate (cctkGH)) { AdvanceTime (cctkGH); { - int const do_every = maxtimereflevelfact / timereffacts.at(reflevels-1); + int const do_every = maxtimereflevelfact / timereffacts.AT(reflevels-1); if ((cctkGH->cctk_iteration - 1) % do_every == 0) { - bool const old_do_taper = do_taper; - do_taper = false; ENTER_GLOBAL_MODE (cctkGH, 0) { BEGIN_REFLEVEL_LOOP (cctkGH) { CallRegrid (cctkGH); } END_REFLEVEL_LOOP; } LEAVE_GLOBAL_MODE; - do_taper = old_do_taper; } } CallEvol (cctkGH); @@ -83,7 +77,7 @@ namespace Carpet { // Print timer values { - int const do_every = maxtimereflevelfact / timereffacts.at(reflevels-1); + int const do_every = maxtimereflevelfact / timereffacts.AT(reflevels-1); if (output_timers_every > 0 and cctkGH->cctk_iteration % output_timers_every == 0 and cctkGH->cctk_iteration % do_every == 0) @@ -99,9 +93,9 @@ namespace Carpet { for (int ml=0; mlcctk_iteration % do_every == 0) { - assert (abs (leveltimes.at(ml).at(rl) - global_time) <= + assert (abs (leveltimes.AT(ml).AT(rl) - global_time) <= eps * global_time); } } @@ -111,8 +105,6 @@ namespace Carpet { } // end main loop timer.stop(); - do_taper = false; - Waypoint ("Done with evolution loop"); return 0; @@ -132,7 +124,7 @@ namespace Carpet { // Do not test on non-active reflevels to save the call to // MPI_Allreduce below - int const do_every = maxtimereflevelfact / timereffacts.at(reflevels-1); + int const do_every = maxtimereflevelfact / timereffacts.AT(reflevels-1); if (cctkGH->cctk_iteration % do_every != 0) { @@ -228,7 +220,7 @@ namespace Carpet { } if ((cctkGH->cctk_iteration-1) - % (maxtimereflevelfact / timereffacts.at(reflevels-1)) == 0) { + % (maxtimereflevelfact / timereffacts.AT(reflevels-1)) == 0) { Waypoint ("Evolving iteration %d at t=%g", cctkGH->cctk_iteration, (double)cctkGH->cctk_time); } @@ -273,25 +265,31 @@ namespace Carpet { // Regrid Checkpoint ("Regrid"); int const oldreflevels = reflevels; - bool const did_regrid = Regrid (cctkGH, false); + bool const did_regrid = Regrid (cctkGH, false, true); bool const did_remove_level = reflevels < oldreflevels; assert (not did_remove_level or did_regrid); if (did_regrid) { + bool did_any_recompose = false; BEGIN_META_MODE (cctkGH) { for (int rl=0; rlset_delta + vtt.AT(m)->set_delta (reflevel, mglevel, - - vtt.at(m)->get_delta (reflevel, mglevel)); + - vtt.AT(m)->get_delta (reflevel, mglevel)); FlipTimeLevels (cctkGH); for (int tl=0; tladvance_time (reflevel, mglevel); + vtt.AT(m)->advance_time (reflevel, mglevel); CycleTimeLevels (cctkGH); } - vtt.at(m)->set_delta + vtt.AT(m)->set_delta (reflevel, mglevel, - - vtt.at(m)->get_delta (reflevel, mglevel)); + - vtt.AT(m)->get_delta (reflevel, mglevel)); FlipTimeLevels (cctkGH); } // for m CCTK_REAL const old_cctk_time = cctkGH->cctk_time; @@ -330,7 +328,7 @@ namespace Carpet { // Advance times for (int m=0; madvance_time (reflevel, mglevel); + vtt.AT(m)->advance_time (reflevel, mglevel); } CycleTimeLevels (cctkGH); cctkGH->cctk_time += @@ -352,6 +350,8 @@ namespace Carpet { } END_META_MODE; } // if did_regrid + RegridFree (cctkGH, true); + do_global_mode = old_do_global_mode; do_early_global_mode = old_do_early_global_mode; do_late_global_mode = old_do_late_global_mode; @@ -380,7 +380,7 @@ namespace Carpet { for (int rl=0; rlcctk_iteration-1) % do_every == 0) { ENTER_GLOBAL_MODE (cctkGH, ml) { ENTER_LEVEL_MODE (cctkGH, rl) { @@ -395,6 +395,15 @@ namespace Carpet { have_done_global_mode |= do_global_mode; have_done_anything = true; + if (use_tapered_grids and reflevel > 0) { + int const parent_do_every = + ipow(mgfact, mglevel) * + (maxtimereflevelfact / timereffacts.AT(reflevel-1)); + bool const parent_is_active = + (cctkGH->cctk_iteration-1) % parent_do_every == 0; + do_taper = not parent_is_active; + } + // Advance times cctkGH->cctk_time = (global_time @@ -402,7 +411,7 @@ namespace Carpet { + delta_time * mglevelfact / timereflevelfact); CCTK_REAL const carpet_time = cctkGH->cctk_time / delta_time; for (int m=0; madvance_time (reflevel, mglevel); + vtt.AT(m)->advance_time (reflevel, mglevel); if (not adaptive_stepsize) { #if 0 // We must not perform this check, since the @@ -413,7 +422,7 @@ namespace Carpet { static_assert (abs(0.1) > 0, "Function CarpetLib::abs has wrong signature"); CCTK_REAL const level_time = - vtt.at(m)->get_time (reflevel, mglevel); + vtt.AT(m)->get_time (reflevel, mglevel); if (not (abs (level_time - carpet_time) <= eps * max (carpet_time, 1.0))) { int const oldprecision = cerr.precision(); @@ -429,15 +438,16 @@ namespace Carpet { assert (abs (level_time - carpet_time) <= eps * max (carpet_time, 1.0)); #endif - vtt.at(m)->set_time (reflevel, mglevel, carpet_time); + vtt.AT(m)->set_time (reflevel, mglevel, carpet_time); } } CycleTimeLevels (cctkGH); - Waypoint ("Evolution I at iteration %d time %g%s%s", + Waypoint ("Evolution I at iteration %d time %g%s%s%s", cctkGH->cctk_iteration, (double)cctkGH->cctk_time, (do_global_mode ? " (global)" : ""), - (do_meta_mode ? " (meta)" : "")); + (do_meta_mode ? " (meta)" : ""), + (do_taper ? " (tapering)" : "")); // Checking CalculateChecksums (cctkGH, allbutcurrenttime); @@ -451,7 +461,9 @@ namespace Carpet { PoisonCheck (cctkGH, currenttime); // Timing statistics - StepTiming (cctkGH); + StepTimingEvolution (cctkGH); + + do_taper = false; } LEAVE_LEVEL_MODE; } LEAVE_GLOBAL_MODE; @@ -476,7 +488,7 @@ namespace Carpet { for (int ml=mglevels-1; ml>=0; --ml) { for (int rl=reflevels-1; rl>=0; --rl) { int const do_every - = ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.at(rl)); + = ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.AT(rl)); if (cctkGH->cctk_iteration % do_every == 0) { ENTER_GLOBAL_MODE (cctkGH, ml) { ENTER_LEVEL_MODE (cctkGH, rl) { @@ -513,7 +525,7 @@ namespace Carpet { for (int rl=0; rlcctk_iteration % do_every == 0) { ENTER_GLOBAL_MODE (cctkGH, ml) { ENTER_LEVEL_MODE (cctkGH, rl) { @@ -528,10 +540,20 @@ namespace Carpet { have_done_global_mode |= do_global_mode; have_done_anything = true; - Waypoint ("Evolution II at iteration %d time %g%s%s", + if (use_tapered_grids and reflevel > 0) { + int const parent_do_every = + ipow(mgfact, mglevel) * + (maxtimereflevelfact / timereffacts.AT(reflevel-1)); + bool const parent_is_active = + (cctkGH->cctk_iteration-1) % parent_do_every == 0; + do_taper = not parent_is_active; + } + + Waypoint ("Evolution II at iteration %d time %g%s%s%s", cctkGH->cctk_iteration, (double)cctkGH->cctk_time, (do_global_mode ? " (global)" : ""), - (do_meta_mode ? " (meta)" : "")); + (do_meta_mode ? " (meta)" : ""), + (do_taper ? " (tapering)" : "")); if (reflevel < reflevels-1) { ScheduleTraverse (where, "CCTK_POSTRESTRICT", cctkGH); @@ -566,6 +588,8 @@ namespace Carpet { PrintTimingStats (cctkGH); } + do_taper = false; + } LEAVE_LEVEL_MODE; } LEAVE_GLOBAL_MODE; } // if do_every @@ -607,15 +631,27 @@ namespace Carpet { void ScheduleTraverse (char const * const where, char const * const name, cGH * const cctkGH) { + // Obtain the set of timers, creating it explicitly if it does not + // yet exist + typedef std::map timers_t; + // static timers_t timers; + static timers_t * timersp = NULL; + if (not timersp) timersp = new timers_t; + timers_t & timers = * timersp; + + // Obtain timer, creating a new one if it does not yet exist ostringstream timernamebuf; timernamebuf << where << "::" << name; string const timername = timernamebuf.str(); - static std::map timers; - Timer * & mapped = timers[timername]; - if (not mapped) { - mapped = new Timer (timername.c_str()); + timers_t::iterator ti = timers.find (timername); + if (ti == timers.end()) { + pair const + newtimer (timername, new Timer (timername.c_str())); + ti = timers.insert(newtimer).first; + // It is possible to find and insert with the same function + // call, but this makes the code significantly more complicated } - Timer & timer = * mapped; + Timer & timer = * ti->second; timer.start(); ostringstream infobuf; -- cgit v1.2.3