diff options
author | schnetter <schnetter@c3c03602-0f4f-0410-b3fa-d2c81c8a7dc5> | 2007-03-01 00:00:43 +0000 |
---|---|---|
committer | schnetter <schnetter@c3c03602-0f4f-0410-b3fa-d2c81c8a7dc5> | 2007-03-01 00:00:43 +0000 |
commit | 81eb9a349bda102b65baf225ba5eb370d221509b (patch) | |
tree | 4b547014fb0e988479d8669a8f9160f9ca2fa408 | |
parent | ae70df97263d09a219ac032119ee9052cf3b4596 (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.ccl | 11 | ||||
-rw-r--r-- | src/rotatingsymmetry90.c | 98 |
2 files changed, 106 insertions, 3 deletions
@@ -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); } } |