aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschnetter <schnetter@1bf05452-ddb3-4880-bfa1-00436340132b>2003-07-09 22:39:20 +0000
committerschnetter <schnetter@1bf05452-ddb3-4880-bfa1-00436340132b>2003-07-09 22:39:20 +0000
commit4ba461a2d9daa4ee30fa438c0a73f20d67f963c9 (patch)
tree2cdff11a20cffa7a46ce3771f563b13cd36591e9
parent91212f4635d0bd3e95edce0b873b0a714f105943 (diff)
Handle prolongation boundaries correctly.
git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/Periodic/trunk@9 1bf05452-ddb3-4880-bfa1-00436340132b
-rw-r--r--src/periodic.c54
1 files changed, 33 insertions, 21 deletions
diff --git a/src/periodic.c b/src/periodic.c
index 38ed889..b47aeb7 100644
--- a/src/periodic.c
+++ b/src/periodic.c
@@ -27,6 +27,8 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
struct xferinfo * restrict xferinfo;
int do_periodic[3];
int global_bbox[6];
+ int global_lbnd[3], global_ubnd[3];
+ int fake_bbox[6];
int gi;
int dir;
int d, f;
@@ -68,14 +70,32 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
do_periodic[2] = periodic || periodic_z;
{
- int max_handle;
+ int min_handle, max_handle;
CCTK_REAL local[6], global[6];
+ min_handle = CCTK_ReductionArrayHandle ("minimum");
+ if (min_handle<0) CCTK_WARN (0, "Could not obtain reduction handle");
max_handle = CCTK_ReductionArrayHandle ("maximum");
if (max_handle<0) CCTK_WARN (0, "Could not obtain reduction handle");
+
for (d=0; d<6; ++d) local[d] = cctkGH->cctk_bbox[d];
ierr = CCTK_ReduceLocArrayToArray1D
(cctkGH, -1, max_handle, local, global, 6, CCTK_VARIABLE_REAL);
for (d=0; d<6; ++d) global_bbox[d] = (int)global[d];
+
+ for (d=0; d<3; ++d) local[d] = cctkGH->cctk_lbnd[d];
+ ierr = CCTK_ReduceLocArrayToArray1D
+ (cctkGH, -1, min_handle, local, global, 3, CCTK_VARIABLE_REAL);
+ for (d=0; d<3; ++d) global_lbnd[d] = (int)global[d];
+
+ for (d=0; d<3; ++d) local[d] = cctkGH->cctk_ubnd[d];
+ ierr = CCTK_ReduceLocArrayToArray1D
+ (cctkGH, -1, max_handle, local, global, 3, CCTK_VARIABLE_REAL);
+ for (d=0; d<3; ++d) global_ubnd[d] = (int)global[d];
+
+ for (d=0; d<3; ++d) {
+ fake_bbox[2*d ] = data.lbnd[d] == global_lbnd[d];
+ fake_bbox[2*d+1] = data.ubnd[d] == global_ubnd[d];
+ }
}
/* Allocate slab transfer description */
@@ -107,8 +127,8 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
xferinfo[d].src.gsh = data.gsh [d];
xferinfo[d].src.lbnd = data.lbnd [d];
xferinfo[d].src.lsh = data.lsh [d];
- xferinfo[d].src.lbbox = data.bbox [2*d ];
- xferinfo[d].src.ubbox = data.bbox [2*d+1];
+ xferinfo[d].src.lbbox = fake_bbox [2*d ];
+ xferinfo[d].src.ubbox = fake_bbox [2*d+1];
xferinfo[d].src.nghostzones = data.nghostzones[d];
xferinfo[d].src.off = 0;
xferinfo[d].src.str = 1;
@@ -117,8 +137,8 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
xferinfo[d].dst.gsh = data.gsh [d];
xferinfo[d].dst.lbnd = data.lbnd [d];
xferinfo[d].dst.lsh = data.lsh [d];
- xferinfo[d].dst.lbbox = data.bbox [2*d ];
- xferinfo[d].dst.ubbox = data.bbox [2*d+1];
+ xferinfo[d].dst.lbbox = fake_bbox [2*d ];
+ xferinfo[d].dst.ubbox = fake_bbox [2*d+1];
xferinfo[d].dst.nghostzones = data.nghostzones[d];
xferinfo[d].dst.off = 0;
xferinfo[d].dst.str = 1;
@@ -148,35 +168,27 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
if (f==0) {
/* Fill in lower face */
-#if 0
- xferinfo[dir].src.off = data.gsh[dir] - 2*stencil[dir];
- xferinfo[dir].src.len = stencil[dir];
- xferinfo[dir].dst.len = stencil[dir];
-#else
source = data.gsh[dir] - 2*stencil[dir] + step*step_size;
- while (source < stencil[dir]) source += domain_size;
+ while (source < stencil[dir]) {
+ source += domain_size;
+ }
assert (source+step_size <= data.gsh[dir]-stencil[dir]);
xferinfo[dir].src.off = source;
xferinfo[dir].src.len = step_size;
xferinfo[dir].dst.off = step*step_size;
xferinfo[dir].dst.len = step_size;
-#endif
} else {
/* Fill in upper face */
-#if 0
- xferinfo[dir].src.off = stencil[dir];
- xferinfo[dir].src.len = stencil[dir];
- xferinfo[dir].dst.off = data.gsh[dir] - stencil[dir];
- xferinfo[dir].dst.len = stencil[dir];
-#else
source = stencil[dir] + step*step_size;
- while (source + step_size > data.gsh[dir] - stencil[dir]) source -= domain_size;
+ while (source + step_size > data.gsh[dir] - stencil[dir]) {
+ source -= domain_size;
+ }
assert (source >= stencil[dir]);
xferinfo[dir].src.off = source;
xferinfo[dir].src.len = step_size;
- xferinfo[dir].dst.off = data.gsh[dir] - stencil[dir] + step*step_size;
+ xferinfo[dir].dst.off
+ = data.gsh[dir] - stencil[dir] + step*step_size;
xferinfo[dir].dst.len = step_size;
-#endif
}
ierr = Slab_Transfer