diff options
author | Erik Schnetter <schnetter@cct.lsu.edu> | 2008-05-14 13:34:43 -0500 |
---|---|---|
committer | Erik Schnetter <schnetter@cct.lsu.edu> | 2008-05-14 13:34:43 -0500 |
commit | bd5ed7a1103113f0d82b3694948ef9b6413154e5 (patch) | |
tree | c1c0876565013fde724ae3221c54501ceb030e0d /Carpet/Carpet/src/Evolve.cc | |
parent | 0f8df591c1bd1c7db3683c19e61163d211192253 (diff) |
Carpet: Compare simulation times with relative accuracy
Diffstat (limited to 'Carpet/Carpet/src/Evolve.cc')
-rw-r--r-- | Carpet/Carpet/src/Evolve.cc | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/Carpet/Carpet/src/Evolve.cc b/Carpet/Carpet/src/Evolve.cc index 1cf712c8b..19eb748f7 100644 --- a/Carpet/Carpet/src/Evolve.cc +++ b/Carpet/Carpet/src/Evolve.cc @@ -2,6 +2,7 @@ #include <cassert> #include <cstdio> #include <cstdlib> +#include <iostream> #include <map> #include <string> #include <sstream> @@ -90,6 +91,24 @@ namespace Carpet { } } + // Ensure that all levels have consistent times + { + // This is dangerouse because it compares floating point + // numbers for equality + assert (cctkGH->cctk_time == global_time); + for (int ml=0; ml<mglevels; ++ml) { + 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) { + // This is dangerouse because it compares floating point + // numbers for equality + assert (leveltimes.at(ml).at(rl) == global_time); + } + } + } + } + } // end main loop timer.stop(); @@ -366,13 +385,23 @@ namespace Carpet { CCTK_REAL const carpet_time = cctkGH->cctk_time / delta_time; for (int m=0; m<maps; ++m) { vtt.at(m)->advance_time (reflevel, mglevel); - CCTK_REAL const eps = 1.0e-12; - static_assert (abs(0.1) > 0, - "Function CarpetLib::abs has wrong signature"); - CCTK_REAL const level_time = - vtt.at(m)->get_time (reflevel, mglevel); - assert (abs (level_time - carpet_time) < eps); - vtt.at(m)->set_time (reflevel, mglevel, carpet_time); + if (not adaptive_stepsize) { + CCTK_REAL const eps = 1.0e-12; + static_assert (abs(0.1) > 0, + "Function CarpetLib::abs has wrong signature"); + CCTK_REAL const level_time = + vtt.at(m)->get_time (reflevel, mglevel); + if (not (abs (level_time - carpet_time) < eps)) { + cerr << "ml: " << ml << endl + << "rl: " << rl << endl + << "m: " << m << endl + << "level_time: " << level_time << endl + << "carpet_time: " << carpet_time << endl; + } + assert (abs (level_time - carpet_time) < + eps * max (carpet_time, 1.0)); + vtt.at(m)->set_time (reflevel, mglevel, carpet_time); + } } CycleTimeLevels (cctkGH); |