aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Carpet/Carpet/param.ccl4
-rw-r--r--Carpet/Carpet/src/carpet.cc546
-rw-r--r--Carpet/Carpet/src/carpet.hh16
-rw-r--r--CarpetExtra/WaveToyF77/par/wavetoyf77_periodic_coarse_rl2.par3
4 files changed, 372 insertions, 197 deletions
diff --git a/Carpet/Carpet/param.ccl b/Carpet/Carpet/param.ccl
index 4f17ae400..142e17700 100644
--- a/Carpet/Carpet/param.ccl
+++ b/Carpet/Carpet/param.ccl
@@ -1,5 +1,5 @@
# Parameter definitions for thorn Carpet
-# $Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/param.ccl,v 1.7 2001/03/29 18:21:25 eschnett Exp $
+# $Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/param.ccl,v 1.8 2001/03/30 00:21:20 eschnett Exp $
shares: Cactus
@@ -111,7 +111,7 @@ BOOLEAN verbose "Display info on the screen"
{
} "no"
-BOOLEAN vverbose "Display a lot of info on the screen"
+BOOLEAN veryverbose "Display a lot of info on the screen"
{
} "no"
diff --git a/Carpet/Carpet/src/carpet.cc b/Carpet/Carpet/src/carpet.cc
index 5f2e86c4b..e17b24c80 100644
--- a/Carpet/Carpet/src/carpet.cc
+++ b/Carpet/Carpet/src/carpet.cc
@@ -35,7 +35,7 @@
#include "carpet.hh"
-static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Attic/carpet.cc,v 1.20 2001/03/29 18:21:29 eschnett Exp $";
+static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Attic/carpet.cc,v 1.21 2001/03/30 00:21:24 eschnett Exp $";
@@ -47,12 +47,22 @@ namespace Carpet {
static void CycleTimeLevels (cGH* cgh);
static void Restrict (cGH* cgh);
- static void Poison (cGH* cgh);
- static void PoisonCheck (cGH* cgh);
+ // where=0: all time levels but next time level
+ // where=1: only next time level
+ // but never if there is only one time level
+
+ static void Poison (cGH* cgh, int where);
+ static void PoisonCheck (cGH* cgh, int where);
+
+ static void CalculateChecksums (cGH* cgh, int where);
+ static void CheckChecksums (cGH* cgh, int where);
// Debugging output
static void Checkpoint (const char* fmt, ...);
+ // Error output
+ static void UnsupportedVarType (int vindex);
+
// Handle from CCTK_RegisterGHExtension
@@ -84,7 +94,7 @@ namespace Carpet {
// Data for scalars
- vector<vector<vector<void*> > > scdata; // [group][var][ti]
+ vector<scdesc> scdata; // [group]
// Data for arrays
// TODO: have replicated arrays
@@ -99,6 +109,9 @@ namespace Carpet {
// Data for grid functions
vector<gfdesc> gfdata; // [group]
+ // Checksums
+ vector<vector<vector<vector<int> > > > checksums; // [var][rl][tl][c]
+
int CarpetStartup()
@@ -205,12 +218,15 @@ namespace Carpet {
switch (CCTK_GroupTypeI(group)) {
case CCTK_SCALAR: {
- scdata[group].resize(CCTK_NumVarsInGroupI(group));
- for (int var=0; var<(int)scdata[group].size(); ++var) {
+ scdata[group].data.resize(CCTK_NumVarsInGroupI(group));
+ for (int var=0; var<(int)scdata[group].data.size(); ++var) {
const int n = (CCTK_FirstVarIndexI(group) + var);
- scdata[group][var].resize(CCTK_NumTimeLevelsFromVarI(n));
- for (int ti=0; ti<(int)scdata[group][var].size(); ++ti) {
- scdata[group][var][ti] = 0;
+ scdata[group].data[var].resize(maxreflevels);
+ for (int rl=0; rl<maxreflevels; ++rl) {
+ scdata[group].data[var][rl].resize(CCTK_NumTimeLevelsFromVarI(n));
+ for (int ti=0; ti<(int)scdata[group].data[var].size(); ++ti) {
+ scdata[group].data[var][rl][ti] = 0;
+ }
}
}
break;
@@ -253,7 +269,7 @@ namespace Carpet {
}
arrdata[group].data.resize(CCTK_NumVarsInGroupI(group));
- for (int var=0; var<(int)scdata[group].size(); ++var) {
+ for (int var=0; var<(int)scdata[group].data.size(); ++var) {
arrdata[group].data[var] = 0;
}
break;
@@ -261,7 +277,7 @@ namespace Carpet {
case CCTK_GF: {
gfdata[group].data.resize(CCTK_NumVarsInGroupI(group));
- for (int var=0; var<(int)scdata[group].size(); ++var) {
+ for (int var=0; var<(int)scdata[group].data.size(); ++var) {
gfdata[group].data[var] = 0;
}
break;
@@ -337,6 +353,8 @@ namespace Carpet {
BEGIN_REFLEVEL_LOOP(cgh) {
+ Poison (cgh, 0);
+
// Set up the grid
CCTK_ScheduleTraverse ("CCTK_BASEGRID", cgh, CallFunction);
if (reflevel==0) {
@@ -370,6 +388,9 @@ namespace Carpet {
// Poststep
CCTK_ScheduleTraverse ("CCTK_POSTSTEP", cgh, CallFunction);
+ PoisonCheck (cgh, 0);
+ CalculateChecksums (cgh, 0);
+
// Analysis
CCTK_ScheduleTraverse ("CCTK_ANALYSIS", cgh, CallFunction);
@@ -430,10 +451,12 @@ namespace Carpet {
BEGIN_REVERSE_REFLEVEL_LOOP(cgh) {
if (cgh->cctk_iteration % (maxreflevelfact/reflevelfact) == 0) {
+ CheckChecksums (cgh, 0);
+
// Cycle time levels
- PoisonCheck (cgh);
+ PoisonCheck (cgh, 1);
CycleTimeLevels (cgh);
- Poison (cgh);
+ Poison (cgh, 1);
// Advance level times
tt->advance_time (reflevel, mglevel);
@@ -454,6 +477,8 @@ namespace Carpet {
// Restrict
Restrict (cgh);
+ CalculateChecksums (cgh, 0);
+
}
} END_REVERSE_REFLEVEL_LOOP(cgh);
@@ -660,27 +685,26 @@ namespace Carpet {
switch (CCTK_GroupTypeI(group)) {
case CCTK_SCALAR:
- if (scdata[group].size()==0 || scdata[group][0].size()==0
- || scdata[group][0][0] != 0) {
+ if (scdata[group].data.size()==0 || scdata[group].data[0].size()==0
+ || scdata[group].data[0][0].size()==0
+ || scdata[group].data[0][0][0] != 0) {
// group already has storage
break;
}
- for (int var=0; var<(int)scdata[group].size(); ++var) {
- for (int ti=0; ti<(int)scdata[group][var].size(); ++ti) {
- const int n = n0 + var;
- switch (CCTK_VarTypeI(n)) {
-#define TYPECASE(N,T) \
- case N: \
- scdata[group][var][ti] = new T; \
- break;
+ for (int var=0; var<(int)scdata[group].data.size(); ++var) {
+ for (int rl=0; rl<(int)scdata[group].data[var].size(); ++rl) {
+ for (int ti=0; ti<(int)scdata[group].data[var][rl].size(); ++ti) {
+ const int n = n0 + var;
+ switch (CCTK_VarTypeI(n)) {
+#define TYPECASE(N,T) \
+ case N: \
+ scdata[group].data[var][rl][ti] = new T; \
+ break;
#include "typecase"
#undef TYPECASE
- default:
- CCTK_VWarn
- (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Carpet does not support the type of the variable \"%s\".\n"
- "Either enable support for this type, "
- "or change the type of this variable.", CCTK_FullName(n));
+ default:
+ UnsupportedVarType(n);
+ }
}
}
}
@@ -704,11 +728,7 @@ namespace Carpet {
#include "typecase"
#undef TYPECASE
default:
- CCTK_VWarn
- (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Carpet does not support the type of the variable \"%s\".\n"
- "Either enable support for this type, "
- "or change the type of this variable.", CCTK_FullName(n));
+ UnsupportedVarType(n);
}
}
break;
@@ -730,11 +750,7 @@ namespace Carpet {
#include "typecase"
#undef TYPECASE
default:
- CCTK_VWarn
- (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Carpet does not support the type of the variable \"%s\".\n"
- "Either enable support for this type, "
- "or change the type of this variable.", CCTK_FullName(n));
+ UnsupportedVarType(n);
}
}
break;
@@ -762,29 +778,28 @@ namespace Carpet {
switch (CCTK_GroupTypeI(group)) {
case CCTK_SCALAR:
- if (scdata[group].size()==0 || scdata[group][0].size()==0
- || scdata[group][0][0] == 0) {
+ if (scdata[group].data.size()==0 || scdata[group].data[0].size()==0
+ || scdata[group].data[0][0].size()==0
+ || scdata[group].data[0][0][0] == 0) {
// group already has no storage
break;
}
- for (int var=0; var<(int)scdata[group].size(); ++var) {
+ for (int var=0; var<(int)scdata[group].data.size(); ++var) {
const int n = CCTK_FirstVarIndexI(group) + var;
- for (int ti=0; ti<(int)scdata[group][var].size(); ++ti) {
- switch (CCTK_VarTypeI(n)) {
-#define TYPECASE(N,T) \
- case N: \
- delete (T*)scdata[group][var][ti]; \
- break;
+ for (int rl=0; rl<(int)scdata[group].data[var].size(); ++rl) {
+ for (int ti=0; ti<(int)scdata[group].data[var][rl].size(); ++ti) {
+ switch (CCTK_VarTypeI(n)) {
+#define TYPECASE(N,T) \
+ case N: \
+ delete (T*)scdata[group].data[var][rl][ti]; \
+ break;
#include "typecase"
#undef TYPECASE
- default:
- CCTK_VWarn
- (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Carpet does not support the type of the variable \"%s\".\n"
- "Either enable support for this type, "
- "or change the type of this variable.", CCTK_FullName(n));
+ default:
+ UnsupportedVarType(n);
+ }
+ scdata[group].data[var][rl][ti] = 0;
}
- scdata[group][var][ti] = 0;
}
}
break;
@@ -804,11 +819,7 @@ namespace Carpet {
#include "typecase"
#undef TYPECASE
default:
- CCTK_VWarn
- (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Carpet does not support the type of the variable \"%s\".\n"
- "Either enable support for this type, "
- "or change the type of this variable.", CCTK_FullName(n));
+ UnsupportedVarType(n);
}
arrdata[group].data[var] = 0;
}
@@ -830,11 +841,7 @@ namespace Carpet {
#include "typecase"
#undef TYPECASE
default:
- CCTK_VWarn
- (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Carpet does not support the type of the variable \"%s\".\n"
- "Either enable support for this type, "
- "or change the type of this variable.", CCTK_FullName(n));
+ UnsupportedVarType(n);
}
gfdata[group].data[var] = 0;
}
@@ -945,14 +952,14 @@ namespace Carpet {
switch (CCTK_GroupTypeFromVarI(n)) {
case CCTK_SCALAR: {
assert (group<(int)scdata.size());
- assert (var<(int)scdata[group].size());
+ assert (var<(int)scdata[group].data.size());
const int num_tl = CCTK_NumTimeLevelsFromVarI(n);
- void* tmpdata = scdata[group][var][0];
+ void* tmpdata = scdata[group].data[var][reflevel][0];
for (int ti=0; ti<num_tl-1; ++ti) {
- // TODO: Which refinement level to use?
- scdata[group][var][ti] = scdata[group][var][ti+1];
+ scdata[group].data[var][reflevel][ti]
+ = scdata[group].data[var][reflevel][ti+1];
}
- scdata[group][var][num_tl-1] = tmpdata;
+ scdata[group].data[var][reflevel][num_tl-1] = tmpdata;
tmpdata = 0;
break;
}
@@ -1141,10 +1148,11 @@ namespace Carpet {
case CCTK_SCALAR: {
assert (group<(int)scdata.size());
- assert (var<(int)scdata[group].size());
+ assert (var<(int)scdata[group].data.size());
+ assert (reflevel<(int)scdata[group].data[var].size());
const int ti=0;
- assert (ti<(int)scdata[group][var].size());
- return scdata[group][var][ti] != 0;
+ assert (ti<(int)scdata[group].data[var][reflevel].size());
+ return scdata[group].data[var][reflevel][ti] != 0;
}
case CCTK_ARRAY: {
@@ -1166,7 +1174,7 @@ namespace Carpet {
- void Poison (cGH* cgh)
+ void Poison (cGH* cgh, const int where)
{
DECLARE_CCTK_PARAMETERS;
@@ -1174,61 +1182,53 @@ namespace Carpet {
Checkpoint ("%*sPoison", 2*reflevel, "");
- BEGIN_COMPONENT_LOOP(cgh) {
- if (hh->is_local(reflevel,component)) {
-
- for (int group=0; group<CCTK_NumGroups(); ++group) {
- if (CCTK_QueryGroupStorageI(cgh, group)) {
- for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
-
- const int n = CCTK_FirstVarIndexI(group) + var;
- const int num_tl = CCTK_NumTimeLevelsFromVarI(n);
- const int sz = CCTK_VarTypeSize(CCTK_VarTypeI(n));
- assert (sz>0);
-
- if (num_tl>1) {
-
- switch (CCTK_GroupTypeFromVarI(n)) {
- case CCTK_SCALAR: {
- assert (group<(int)scdata.size());
- assert (var<(int)scdata[group].size());
- memset (cgh->data[n][num_tl-1], poison_value, sz);
- break;
- }
- case CCTK_ARRAY: {
- assert (group<(int)arrdata.size());
- assert (var<(int)arrdata[group].data.size());
- assert (arrdata[group].hh->is_local(reflevel,component));
- int np = 1;
- for (int d=0; d<dim; ++d) np *= arrdata[group].size[d];
- memset (cgh->data[n][num_tl-1], poison_value, np*sz);
- break;
- }
- case CCTK_GF: {
- assert (group<(int)gfdata.size());
- assert (var<(int)gfdata[group].data.size());
+ for (int group=0; group<CCTK_NumGroups(); ++group) {
+ if (CCTK_QueryGroupStorageI(cgh, group)) {
+ for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
+
+ const int n = CCTK_FirstVarIndexI(group) + var;
+ const int sz = CCTK_VarTypeSize(CCTK_VarTypeI(n));
+ assert (sz>0);
+
+ const int num_tl = CCTK_NumTimeLevelsFromVarI(n);
+ const int min_tl = where ? max(num_tl-1,1) : 0;
+ const int max_tl = where ? num_tl-1 : num_tl-2;
+ for (int tl=min_tl; tl<=max_tl; ++tl) {
+
+ switch (CCTK_GroupTypeFromVarI(n)) {
+ case CCTK_SCALAR: {
+ assert (group<(int)scdata.size());
+ assert (var<(int)scdata[group].data.size());
+ memset (cgh->data[n][tl], poison_value, sz);
+ break;
+ }
+ case CCTK_ARRAY:
+ case CCTK_GF: {
+ BEGIN_COMPONENT_LOOP(cgh) {
+ if (hh->is_local(reflevel,component)) {
int np = 1;
- for (int d=0; d<dim; ++d) np *= gfsize[d];
- memset (cgh->data[n][num_tl-1], poison_value, np*sz);
- break;
- }
- default:
- abort();
+ for (int d=0; d<dim; ++d) {
+ np *= *CCTK_ArrayGroupSizeI(cgh, d, group);
+ }
+ memset (cgh->data[n][tl], poison_value, np*sz);
}
-
- } // if more than one timelevel
-
- } // for var
- } // if has storage
- } // for group
-
- }
- } END_COMPONENT_LOOP(cgh);
+ } END_COMPONENT_LOOP(cgh);
+ break;
+ }
+ default:
+ abort();
+ }
+
+ } // for tl
+
+ } // for var
+ } // if has storage
+ } // for group
}
- void PoisonCheck (cGH* cgh)
+ void PoisonCheck (cGH* cgh, const int where)
{
DECLARE_CCTK_PARAMETERS;
@@ -1236,55 +1236,54 @@ namespace Carpet {
Checkpoint ("%*sPoisonCheck", 2*reflevel, "");
- BEGIN_COMPONENT_LOOP(cgh) {
- if (hh->is_local(reflevel,component)) {
-
- for (int group=0; group<CCTK_NumGroups(); ++group) {
- if (CCTK_QueryGroupStorageI(cgh, group)) {
- for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
-
- const int n = CCTK_FirstVarIndexI(group) + var;
- const int num_tl = CCTK_NumTimeLevelsFromVarI(n);
+ for (int group=0; group<CCTK_NumGroups(); ++group) {
+ if (CCTK_QueryGroupStorageI(cgh, group)) {
+ for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
+
+ const int n = CCTK_FirstVarIndexI(group) + var;
+
+ const int num_tl = CCTK_NumTimeLevelsFromVarI(n);
+ const int min_tl = where ? max(num_tl-1,1) : 0;
+ const int max_tl = where ? num_tl-1 : num_tl-2;
+ for (int tl=min_tl; tl<=max_tl; ++tl) {
+
+ switch (CCTK_GroupTypeFromVarI(n)) {
- if (num_tl>1) {
-
- switch (CCTK_GroupTypeFromVarI(n)) {
-
- case CCTK_SCALAR: {
- bool poisoned=false;
- switch (CCTK_VarTypeI(n)) {
-#define TYPECASE(N,T) \
- case N: { \
- T worm; \
- memset (&worm, poison_value, sizeof(worm)); \
- poisoned = *(const T*)cgh->data[n][num_tl-1] == worm; \
- break; \
- }
+ case CCTK_SCALAR: {
+ bool poisoned=false;
+ switch (CCTK_VarTypeI(n)) {
+#define TYPECASE(N,T) \
+ case N: { \
+ T worm; \
+ memset (&worm, poison_value, sizeof(worm)); \
+ poisoned = *(const T*)cgh->data[n][tl] == worm; \
+ break; \
+ }
#include "typecase"
#undef TYPECASE
- default:
- CCTK_VWarn
- (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Carpet does not support the type of the variable \"%s\".\n"
- "Either enable support for this type, "
- "or change the type of this variable.", CCTK_FullName(n));
- }
- if (poisoned) {
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
- "The variable \"%s\" contains poison",
- CCTK_VarName(n));
- }
- break;
- }
-
- case CCTK_ARRAY:
- case CCTK_GF: {
+ default:
+ UnsupportedVarType(n);
+ }
+ if (poisoned) {
+ char* fullname = CCTK_FullName(n);
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "The variable \"%s\" contains poison",
+ fullname);
+ free (fullname);
+ }
+ break;
+ }
+
+ case CCTK_ARRAY:
+ case CCTK_GF: {
+ BEGIN_COMPONENT_LOOP(cgh) {
+ if (hh->is_local(reflevel,component)) {
int size[dim];
for (int d=0; d<dim; ++d) {
size[d] = *CCTK_ArrayGroupSizeI(cgh, d, group);
}
const int tp = CCTK_VarTypeI(n);
- const void* const data = cgh->data[n][num_tl-1];
+ const void* const data = cgh->data[n][tl];
int numpoison=0;
for (int k=0; k<size[2]; ++k) {
for (int j=0; j<size[1]; ++j) {
@@ -1302,43 +1301,198 @@ namespace Carpet {
#include "typecase"
#undef TYPECASE
default:
- CCTK_VWarn
- (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Carpet does not support the type of the variable \"%s\".\n"
- "Either enable support for this type, "
- "or change the type of this variable.", CCTK_FullName(n));
+ UnsupportedVarType(n);
}
if (poisoned) {
++numpoison;
if (numpoison<=10) {
+ char* fullname = CCTK_FullName(n);
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"The variable \"%s\" contains poison at [%d,%d,%d]",
- CCTK_VarName(n), i,j,k);
+ fullname, i,j,k);
+ free (fullname);
}
} // if poisoned
} // for i
} // for j
} // for k
if (numpoison>10) {
+ char* fullname = CCTK_FullName(n);
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"The variable \"%s\" contains poison at alltogether %d locations",
- CCTK_VarName(n), numpoison);
+ fullname, numpoison);
+ free (fullname);
+ }
+ } // if is local
+ } END_COMPONENT_LOOP(cgh);
+ break;
+ }
+
+ default:
+ abort();
+ }
+
+ } // for tl
+
+ } // for var
+ } // if has storage
+ } // for group
+ }
+
+
+
+ void CalculateChecksums (cGH* cgh, int where)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (! checksum_timelevels) return;
+
+ Checkpoint ("%*sCalculateChecksums", 2*reflevel, "");
+
+ checksums.resize(CCTK_NumVars());
+ for (int group=0; group<CCTK_NumGroups(); ++group) {
+ if (CCTK_QueryGroupStorageI(cgh, group)) {
+ for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
+
+ const int n = CCTK_FirstVarIndexI(group) + var;
+ const int sz = CCTK_VarTypeSize(CCTK_VarTypeI(n));
+ assert (sz>0);
+ const int num_tl = CCTK_NumTimeLevelsFromVarI(n);
+ const int min_tl = where ? max(num_tl-1,1) : 0;
+ const int max_tl = where ? num_tl-1 : num_tl-2;
+ checksums[n].resize(maxreflevels);
+ checksums[n][reflevel].resize(num_tl);
+ for (int tl=min_tl; tl<=max_tl; ++tl) {
+ switch (CCTK_GroupTypeFromVarI(n)) {
+
+ case CCTK_SCALAR: {
+ checksums[n][reflevel][tl].resize(1);
+ const int c=0;
+ int chk = 0;
+ const void* data = cgh->data[n][tl];
+ for (int i=0; i<sz/(int)sizeof(chk); ++i) {
+ chk += ((const int*)data)[i];
+ }
+ checksums[n][reflevel][tl][c] = chk;
+ break;
+ }
+
+ case CCTK_ARRAY:
+ case CCTK_GF: {
+ checksums[n][reflevel][tl].resize(hh->components(reflevel));
+ BEGIN_COMPONENT_LOOP(cgh) {
+ if (hh->is_local(reflevel,component)) {
+ int np = 1;
+ for (int d=0; d<dim; ++d) {
+ np *= *CCTK_ArrayGroupSizeI(cgh, d, group);
+ }
+ const void* data = cgh->data[n][tl];
+ int chk = 0;
+ for (int i=0; i<np*sz/(int)sizeof(chk); ++i) {
+ chk += ((const int*)data)[i];
}
- break;
+ checksums[n][reflevel][tl][component] = chk;
}
-
- default:
- abort();
+ } END_COMPONENT_LOOP(cgh);
+ break;
+ }
+
+ default:
+ abort();
+ }
+
+ } // for tl
+ } // for var
+ } // if has storage
+ } // for group
+ }
+
+
+
+ void CheckChecksums (cGH* cgh, int where)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (! checksum_timelevels) return;
+
+ Checkpoint ("%*sCheckChecksums", 2*reflevel, "");
+
+ assert ((int)checksums.size()==CCTK_NumVars());
+ for (int group=0; group<CCTK_NumGroups(); ++group) {
+ if (CCTK_QueryGroupStorageI(cgh, group)) {
+ for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
+
+ const int n = CCTK_FirstVarIndexI(group) + var;
+ const int sz = CCTK_VarTypeSize(CCTK_VarTypeI(n));
+ assert (sz>0);
+ const int num_tl = CCTK_NumTimeLevelsFromVarI(n);
+ const int min_tl = where ? max(num_tl-1,1) : 0;
+ const int max_tl = where ? num_tl-1 : num_tl-2;
+
+ assert ((int)checksums[n].size()==maxreflevels);
+ assert ((int)checksums[n][reflevel].size()==num_tl);
+
+ bool unexpected_change = false;
+
+ for (int tl=min_tl; tl<=max_tl; ++tl) {
+ switch (CCTK_GroupTypeFromVarI(n)) {
+
+ case CCTK_SCALAR: {
+ assert ((int)checksums[n][reflevel][tl].size()==1);
+ const int c=0;
+ int chk = 0;
+ const void* data = cgh->data[n][tl];
+ for (int i=0; i<sz/(int)sizeof(chk); ++i) {
+ chk += ((const int*)data)[i];
+ }
+ unexpected_change = (unexpected_change
+ || chk != checksums[n][reflevel][tl][c]);
+ break;
+ }
+
+ case CCTK_ARRAY:
+ case CCTK_GF: {
+ assert ((int)checksums[n][reflevel][tl].size()
+ ==hh->components(reflevel));
+ BEGIN_COMPONENT_LOOP(cgh) {
+ if (hh->is_local(reflevel,component)) {
+ int np = 1;
+ for (int d=0; d<dim; ++d) {
+ np *= *CCTK_ArrayGroupSizeI(cgh, d, group);
+ }
+ const void* data = cgh->data[n][tl];
+ int chk = 0;
+ for (int i=0; i<np*sz/(int)sizeof(chk); ++i) {
+ chk += ((const int*)data)[i];
+ }
+ unexpected_change
+ = (unexpected_change
+ || chk != checksums[n][reflevel][tl][component]);
+ if (chk != checksums[n][reflevel][tl][component]) {
+ cout << "n tl rl c " << n << " " << tl << " " << reflevel << " " << component << endl;
+ }
}
-
- } // if more than one timelevel
+ } END_COMPONENT_LOOP(cgh);
+ break;
+ }
- } // for var
- } // if has storage
- } // for group
-
- } // if is local
- } END_COMPONENT_LOOP(cgh);
+ default:
+ abort();
+ }
+
+ } // for tl
+
+ if (unexpected_change) {
+ char* fullname = CCTK_FullName(n);
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Old timelevels of the variable \"%s\" have changed unexpectedly.",
+ fullname);
+ free (fullname);
+ }
+
+ } // for var
+ } // if has storage
+ } // for group
}
@@ -1361,6 +1515,18 @@ namespace Carpet {
+ void UnsupportedVarType (const int vindex)
+ {
+ assert (vindex>=0 && vindex<CCTK_NumVars());
+ CCTK_VWarn
+ (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Carpet does not support the type of the variable \"%s\".\n"
+ "Either enable support for this type, "
+ "or change the type of this variable.", CCTK_FullName(vindex));
+ }
+
+
+
void set_reflevel (cGH* cgh, const int rl)
{
// Check
@@ -1450,9 +1616,10 @@ namespace Carpet {
case CCTK_SCALAR:
// Scalar variables can be accessed
assert (group<(int)scdata.size());
- assert (var<(int)scdata[group].size());
- assert (ti<(int)scdata[group][var].size());
- cgh->data[n][ti] = scdata[group][var][ti];
+ assert (var<(int)scdata[group].data.size());
+ assert (reflevel<(int)scdata[group].data[var].size());
+ assert (ti<(int)scdata[group].data[var][reflevel].size());
+ cgh->data[n][ti] = scdata[group].data[var][reflevel][ti];
break;
case CCTK_ARRAY:
@@ -1552,9 +1719,10 @@ namespace Carpet {
case CCTK_SCALAR:
assert (group<(int)scdata.size());
- assert (var<(int)scdata[group].size());
- assert (ti<(int)scdata[group][var].size());
- cgh->data[n][ti] = scdata[group][var][ti];
+ assert (var<(int)scdata[group].data.size());
+ assert (reflevel<(int)scdata[group].data[var].size());
+ assert (ti<(int)scdata[group].data[var][reflevel].size());
+ cgh->data[n][ti] = scdata[group].data[var][reflevel][ti];
break;
case CCTK_ARRAY:
diff --git a/Carpet/Carpet/src/carpet.hh b/Carpet/Carpet/src/carpet.hh
index c2afaa994..4ca400828 100644
--- a/Carpet/Carpet/src/carpet.hh
+++ b/Carpet/Carpet/src/carpet.hh
@@ -1,4 +1,4 @@
-// $Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/carpet.hh,v 1.5 2001/03/16 21:32:17 eschnett Exp $
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/carpet.hh,v 1.6 2001/03/30 00:21:24 eschnett Exp $
#include <vector>
@@ -47,7 +47,10 @@ namespace Carpet {
// Data for scalars
- extern vector<vector<vector<void*> > > scdata; // [group][var][tl]
+ struct scdesc {
+ vector<vector<vector<void*> > > data; // [var][rl][tl]
+ };
+ extern vector<scdesc> scdata; // group
// Data for arrays
struct arrdesc {
@@ -72,6 +75,9 @@ namespace Carpet {
};
extern vector<gfdesc> gfdata; // [group]
+ // Checksums
+ extern vector<vector<vector<vector<int> > > > checksums; // [n][rl][tl][c]
+
// Scheduled functions
@@ -104,9 +110,9 @@ namespace Carpet {
// Helper functions
- void set_reflevel (cGH* cgh, const int rl);
- void set_mglevel (cGH* cgh, const int ml);
- void set_component (cGH* cgh, const int c);
+ void set_reflevel (cGH* cgh, int rl);
+ void set_mglevel (cGH* cgh, int ml);
+ void set_component (cGH* cgh, int c);
diff --git a/CarpetExtra/WaveToyF77/par/wavetoyf77_periodic_coarse_rl2.par b/CarpetExtra/WaveToyF77/par/wavetoyf77_periodic_coarse_rl2.par
index 52915a06c..8edd00d12 100644
--- a/CarpetExtra/WaveToyF77/par/wavetoyf77_periodic_coarse_rl2.par
+++ b/CarpetExtra/WaveToyF77/par/wavetoyf77_periodic_coarse_rl2.par
@@ -7,7 +7,7 @@
# @enddesc
# @@*/
#
-# $Header: /home/eschnett/C/carpet/Carpet/CarpetExtra/WaveToyF77/par/wavetoyf77_periodic_coarse_rl2.par,v 1.7 2001/03/29 18:21:29 eschnett Exp $
+# $Header: /home/eschnett/C/carpet/Carpet/CarpetExtra/WaveToyF77/par/wavetoyf77_periodic_coarse_rl2.par,v 1.8 2001/03/30 00:21:24 eschnett Exp $
ActiveThorns = "Boundary IOBasic IOUtil Time Cart3d Carpet CarpetIOASCII CarpetIOFlexIO CarpetLib CarpetSlab IDScalarWave WaveToyF77"
@@ -27,6 +27,7 @@ Carpet::prolongation_order_time = 2
Carpet::poison_new_timelevels = yes
Carpet::check_for_poison = yes
+Carpet::checksum_timelevels = yes
grid::type = byrange
grid::xmin = -5.4