diff options
author | Erik Schnetter <schnetter@aei.mpg.de> | 2004-10-08 21:43:00 +0000 |
---|---|---|
committer | Erik Schnetter <schnetter@aei.mpg.de> | 2004-10-08 21:43:00 +0000 |
commit | 36c82405616852cba4e5418d3bd402ab7f6c591e (patch) | |
tree | 5d87190eb06743cf4335bf2f2b3fa867cb94af2c /Carpet/CarpetReduce/src/reduce.cc | |
parent | 4118cac2e438a87fd5e8b5446e11d14f67e1a157 (diff) |
CarpetRegrid: clean up time interpolation
darcs-hash:20041008214326-891bb-92f62ca9e16ba5acb5d4b79b1865057fb345711d.gz
Diffstat (limited to 'Carpet/CarpetReduce/src/reduce.cc')
-rw-r--r-- | Carpet/CarpetReduce/src/reduce.cc | 64 |
1 files changed, 49 insertions, 15 deletions
diff --git a/Carpet/CarpetReduce/src/reduce.cc b/Carpet/CarpetReduce/src/reduce.cc index a189cc4cf..8bd4b12c0 100644 --- a/Carpet/CarpetReduce/src/reduce.cc +++ b/Carpet/CarpetReduce/src/reduce.cc @@ -15,6 +15,9 @@ #include "cctk.h" +#include "util_ErrorCodes.h" +#include "util_Table.h" + #include "dist.hh" #include "vect.hh" @@ -947,32 +950,63 @@ namespace CarpetReduce { > 1e-12 * fabs(cgh->cctk_delta_time))); assert (! (! want_global_mode && need_time_interp)); assert (! (reduce_arrays && need_time_interp)); - int num_tl = need_time_interp ? prolongation_order_time + 1 : 1; + int num_tl; if (need_time_interp) { + int const gi = CCTK_GroupIndexFromVarI (vi); + assert (gi>=0); + int const table = CCTK_GroupTagsTableI (gi); + assert (table>=0); + CCTK_INT interp_num_time_levels; + int const ilen = Util_TableGetInt + (table, &interp_num_time_levels, "InterpNumTimelevels"); + if (ilen == UTIL_ERROR_TABLE_NO_SUCH_KEY) { + num_tl = prolongation_order_time + 1; + } else if (ilen >= 0) { + assert (interp_num_time_levels>0); + num_tl = min (prolongation_order_time + 1, interp_num_time_levels); + } else { + assert (0); + } + // Are there enough time levels? - if (CCTK_ActiveTimeLevelsVI(cgh, vi) < num_tl) { - static vector<bool> have_warned; - if (have_warned.empty()) { - have_warned.resize (CCTK_NumVars(), false); - } - if (! have_warned.at(vi)) { + int const max_tl = CCTK_MaxTimeLevelsVI(vi); + int const active_tl = CCTK_ActiveTimeLevelsVI(cgh, vi); + if (active_tl < num_tl) { + if (max_tl == 1) { + num_tl = 1; + need_time_interp = false; + static vector<bool> have_warned; + if (have_warned.empty()) { + have_warned.resize (CCTK_NumVars(), false); + } + if (! have_warned.at(vi)) { + char * const fullname = CCTK_FullName(vi); + CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, + "Grid function \"%s\" has only %d time levels; this is not enough for time interpolation", + fullname, max_tl); + free (fullname); + have_warned.at(vi) = true; + } + } else { char * const fullname = CCTK_FullName(vi); - CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, - "Grid function \"%s\" has only %d active time levels on refinement level %d; this is not enough for time interpolation. Using the current time level instead", - fullname, CCTK_ActiveTimeLevelsVI(cgh, vi), reflevel); + CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, + "Grid function \"%s\" has only %d active time levels on refinement level %d; this is not enough for time interpolation", + fullname, active_tl, reflevel); free (fullname); - have_warned.at(vi) = true; } - - // fall back - need_time_interp = false; - num_tl = 1; } + } else { + + // no time interpolation + num_tl = 1; + } + assert (! need_time_interp || num_tl > 1); + vector<CCTK_REAL> tfacs(num_tl); // Interpolate in time, if necessary |