From 4ba461a2d9daa4ee30fa438c0a73f20d67f963c9 Mon Sep 17 00:00:00 2001 From: schnetter Date: Wed, 9 Jul 2003 22:39:20 +0000 Subject: Handle prolongation boundaries correctly. git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/Periodic/trunk@9 1bf05452-ddb3-4880-bfa1-00436340132b --- src/periodic.c | 54 +++++++++++++++++++++++++++++++++--------------------- 1 file 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 -- cgit v1.2.3