aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetSlab
diff options
context:
space:
mode:
authorschnetter <>2004-05-27 10:26:00 +0000
committerschnetter <>2004-05-27 10:26:00 +0000
commit8f54d2b725697b4aea34072c3454e8eb4407a996 (patch)
treeae06af249867cb81b7b5c7bb66529f56835f08f1 /Carpet/CarpetSlab
parentf75ac4f8e60c1d73d610d00c18078dbe6ea740c3 (diff)
Try to catch insanely large hyperslab specifications early
darcs-hash:20040527102633-07bb3-0a998692efd2d9d8f926653e4d6988a88753e95b.gz
Diffstat (limited to 'Carpet/CarpetSlab')
-rw-r--r--Carpet/CarpetSlab/src/slab.cc41
1 files changed, 30 insertions, 11 deletions
diff --git a/Carpet/CarpetSlab/src/slab.cc b/Carpet/CarpetSlab/src/slab.cc
index 8fda2a2f8..cc7b3924a 100644
--- a/Carpet/CarpetSlab/src/slab.cc
+++ b/Carpet/CarpetSlab/src/slab.cc
@@ -1,4 +1,4 @@
-// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetSlab/src/slab.cc,v 1.18 2004/04/16 14:02:26 schnetter Exp $
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetSlab/src/slab.cc,v 1.19 2004/05/27 12:26:33 schnetter Exp $
#include <assert.h>
#include <stdlib.h>
@@ -23,7 +23,7 @@
#include "slab.hh"
extern "C" {
- static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetSlab/src/slab.cc,v 1.18 2004/04/16 14:02:26 schnetter Exp $";
+ static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetSlab/src/slab.cc,v 1.19 2004/05/27 12:26:33 schnetter Exp $";
CCTK_FILEVERSION(Carpet_CarpetSlab_slab_cc);
}
@@ -84,6 +84,8 @@ namespace CarpetSlab {
const int length[/*hdim*/],
void* const hdata)
{
+ int ierr;
+
// Check Cactus grid hierarchy
assert (cgh);
@@ -103,7 +105,8 @@ namespace CarpetSlab {
// Get info about group
cGroup gp;
- CCTK_GroupData (group, &gp);
+ ierr = CCTK_GroupData (group, &gp);
+ assert (! ierr);
assert (gp.dim<=dim);
assert (CCTK_QueryGroupStorageI(cgh, group));
const int typesize = CCTK_VarTypeSize(gp.vartype);
@@ -117,21 +120,33 @@ namespace CarpetSlab {
if (gp.grouptype==CCTK_GF && Carpet::map==-1 && maps>1) {
CCTK_WARN (0, "It is not possible to use hyperslabbing for a grid function in level mode when there are multiple maps (use singlemap mode instead, or make sure that there is only one map)");
}
- // const int m = gp.grouptype==CCTK_GF ? Carpet::map : 0;
- const int m = 0;
+ const int m = gp.grouptype==CCTK_GF ? Carpet::map : 0;
+ const int oldmap = Carpet::map;
+ if (gp.grouptype==CCTK_GF && oldmap==-1) {
+ enter_singlemap_mode(const_cast<cGH*>(cgh), m);
+ }
// Check dimension
assert (hdim>=0 && hdim<=gp.dim);
+ // Get more info about group
+ cGroupDynamicData gd;
+ ierr = CCTK_GroupDynamicData (cgh, group, &gd);
+ assert (! ierr);
+ const vect<int,dim> sizes = vect<int,dim>::ref(gd.gsh);
+ for (int d=0; d<dim; ++d) {
+ assert (sizes[d] >= 0);
+ }
+
// Check timelevel
const int num_tl = gp.numtimelevels;
assert (ti>=0 && ti<num_tl);
const int tl = -ti;
// Check origin
-// for (int d=0; d<dim; ++d) {
-// assert (origin[d]>=0 && origin[d]<=sizes[d]);
-// }
+ for (int d=0; d<dim; ++d) {
+ assert (origin[d]>=0 && origin[d]<=sizes[d]);
+ }
// Check directions
for (int dd=0; dd<hdim; ++dd) {
@@ -149,9 +164,9 @@ namespace CarpetSlab {
}
// Check extent
-// for (int dd=0; dd<hdim; ++dd) {
-// assert (origin[dirs[dd]-1] + length[dd] <= sizes[dirs[dd]]);
-// }
+ for (int dd=0; dd<hdim; ++dd) {
+ assert (origin[dirs[dd]-1] + length[dd] <= sizes[dirs[dd]]);
+ }
// Get insider information about variable
const gh<dim>* myhh;
@@ -278,6 +293,10 @@ namespace CarpetSlab {
} // Copy result
+ if (gp.grouptype==CCTK_GF && oldmap==-1) {
+ leave_singlemap_mode(const_cast<cGH*>(cgh));
+ }
+
delete alldata;
}