aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschnetter <schnetter@c3c03602-0f4f-0410-b3fa-d2c81c8a7dc5>2007-03-01 00:00:43 +0000
committerschnetter <schnetter@c3c03602-0f4f-0410-b3fa-d2c81c8a7dc5>2007-03-01 00:00:43 +0000
commit81eb9a349bda102b65baf225ba5eb370d221509b (patch)
tree4b547014fb0e988479d8669a8f9160f9ca2fa408
parentae70df97263d09a219ac032119ee9052cf3b4596 (diff)
Introduce option RotatingSymmetry90::poison_boundaries, which can be
used to ensure that this symmetry condition does not omit grid points. git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/RotatingSymmetry90/trunk@42 c3c03602-0f4f-0410-b3fa-d2c81c8a7dc5
-rw-r--r--param.ccl11
-rw-r--r--src/rotatingsymmetry90.c98
2 files changed, 106 insertions, 3 deletions
diff --git a/param.ccl b/param.ccl
index a330da9..33137ca 100644
--- a/param.ccl
+++ b/param.ccl
@@ -4,3 +4,14 @@
BOOLEAN verbose "Produce screen output while applying boundary conditions"
{
} "no"
+
+
+
+BOOLEAN poison_boundaries "Fill the symmetry boundary with a poison value before the symmetry is applied, and check afterwards whether it has been overwritten"
+{
+} "no"
+
+CCTK_REAL poison_value "Poison value (must not occur naturally)"
+{
+ *:* :: ""
+} -424242.0
diff --git a/src/rotatingsymmetry90.c b/src/rotatingsymmetry90.c
index ba0a360..2590749 100644
--- a/src/rotatingsymmetry90.c
+++ b/src/rotatingsymmetry90.c
@@ -434,6 +434,50 @@ int BndRot90VI (cGH const * restrict const cctkGH,
}
}
+ if (poison_boundaries) {
+ /* poison destination grid points */
+ int have_bnd = 1;
+ for (q=0; q<ndirs; ++q) {
+ have_bnd = have_bnd && cctkGH->cctk_bbox[2*dir[q]];
+ }
+ if (have_bnd) {
+
+ int imin[3], imax[3];
+ int i, j, k;
+ for (d=0; d<3; ++d) {
+ imin[d] = 0;
+ imax[d] = cctk_lsh[d];
+ }
+ for (q=0; q<ndirs; ++q) {
+ imax[dir[q]] = cctk_nghostzones[dir[q]];
+ }
+
+ var = 0;
+
+ assert (group.dim == 3);
+ switch (group.vartype) {
+ case CCTK_VARIABLE_INT:
+ /* do nothing */
+ break;
+ case CCTK_VARIABLE_REAL:
+ for (k=imin[0]; k<imax[2]; ++k) {
+ for (j=imin[1]; j<imax[1]; ++j) {
+ for (i=imin[2]; i<imax[0]; ++i) {
+ const int ind = CCTK_GFINDEX3D(cctkGH, i, j, k);
+ ((CCTK_REAL * restrict) varptrs[var]) [ind] = poison_value;
+ }
+ }
+ }
+ break;
+ case CCTK_VARIABLE_COMPLEX:
+ /* do nothing */
+ break;
+ default:
+ assert (0);
+ } /* switch grouptype */
+ } /* if bbox */
+ } /* if poison_boundaries */
+
/* Allocate slab transfer description */
xferinfo = malloc(group.dim * sizeof *xferinfo);
assert (xferinfo);
@@ -506,6 +550,54 @@ int BndRot90VI (cGH const * restrict const cctkGH,
ierr = Util_TableDestroy (options);
assert (!ierr);
+ if (poison_boundaries) {
+ /* check destination grid points for poison */
+ int have_bnd = 1;
+ for (q=0; q<ndirs; ++q) {
+ have_bnd = have_bnd && cctkGH->cctk_bbox[2*dir[q]];
+ }
+ if (have_bnd) {
+
+ int imin[3], imax[3];
+ int i, j, k;
+ for (d=0; d<3; ++d) {
+ imin[d] = 0;
+ imax[d] = cctk_lsh[d];
+ }
+ for (q=0; q<ndirs; ++q) {
+ imax[dir[q]] = cctk_nghostzones[dir[q]];
+ }
+
+ var = 0;
+
+ assert (group.dim == 3);
+ switch (group.vartype) {
+ case CCTK_VARIABLE_INT:
+ /* do nothing */
+ break;
+ case CCTK_VARIABLE_REAL:
+ for (k=imin[0]; k<imax[2]; ++k) {
+ for (j=imin[1]; j<imax[1]; ++j) {
+ for (i=imin[2]; i<imax[0]; ++i) {
+ const int ind = CCTK_GFINDEX3D(cctkGH, i, j, k);
+ CCTK_REAL const val =
+ ((CCTK_REAL const * restrict) varptrs[var]) [ind];
+ if (val == poison_value) {
+ CCTK_WARN (CCTK_WARN_ABORT, "Poison found in symmetry regions -- there is an error in this thorn");
+ }
+ }
+ }
+ }
+ break;
+ case CCTK_VARIABLE_COMPLEX:
+ /* do nothing */
+ break;
+ default:
+ assert (0);
+ } /* switch grouptype */
+ } /* if bbox */
+ } /* if poison_boundaries */
+
/* take parity into account */
have_local_bbox = 1;
for (q=0; q<ndirs; ++q) {
@@ -532,7 +624,7 @@ int BndRot90VI (cGH const * restrict const cctkGH,
for (j=imin[1]; j<imax[1]; ++j) {
for (i=imin[0]; i<imax[0]; ++i) {
const int ind = CCTK_GFINDEX3D(cctkGH, i, j, k);
- ((CCTK_INT *) varptrs[var]) [ind] *= -1;
+ ((CCTK_INT * restrict) varptrs[var]) [ind] *= -1;
}
}
}
@@ -542,7 +634,7 @@ int BndRot90VI (cGH const * restrict const cctkGH,
for (j=imin[1]; j<imax[1]; ++j) {
for (i=imin[0]; i<imax[0]; ++i) {
const int ind = CCTK_GFINDEX3D(cctkGH, i, j, k);
- ((CCTK_REAL *) varptrs[var]) [ind] *= -1;
+ ((CCTK_REAL * restrict) varptrs[var]) [ind] *= -1;
}
}
}
@@ -555,7 +647,7 @@ int BndRot90VI (cGH const * restrict const cctkGH,
for (i=imin[0]; i<imax[0]; ++i) {
const int ind = CCTK_GFINDEX3D(cctkGH, i, j, k);
CCTK_COMPLEX * restrict const ptr =
- & ((CCTK_COMPLEX *) varptrs[var]) [ind];
+ & ((CCTK_COMPLEX * restrict) varptrs[var]) [ind];
* ptr = CCTK_CmplxSub (czero, * ptr);
}
}