From 955f70279a978b2bbd0a0f89eb601e79becdee44 Mon Sep 17 00:00:00 2001 From: schnetter Date: Thu, 22 May 2003 17:05:42 +0000 Subject: Make TAT/Periodic work when the domain is smaller than the ghost zone. git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/Periodic/trunk@6 1bf05452-ddb3-4880-bfa1-00436340132b --- src/periodic.c | 86 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 19 deletions(-) diff --git a/src/periodic.c b/src/periodic.c index d63e065..0f65ff0 100644 --- a/src/periodic.c +++ b/src/periodic.c @@ -73,6 +73,18 @@ BndPeriodicVI (cGH const * restrict const cctkGH, for (dir=0; dir= 0); + + if (data.gsh[dir] < 2*stencil[dir]+1) { + CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, + "The group %s has in direction %d only %d grid points. " + "This is not large enough for a periodic boundary that is %d grid points wide. " + "The group needs to have at least %d grid points in direction %d.", + CCTK_GroupNameFromVarI(vi), dir, data.gsh[dir], + stencil[dir], + 2*stencil[dir]+1, dir); + } + /* Loop over faces */ for (f=0; f<2; ++f) { @@ -102,28 +114,64 @@ BndPeriodicVI (cGH const * restrict const cctkGH, xferinfo[d].flip = 0; } - if (cctkGH->cctk_bbox[2*dir+f]) { - if (f==0) { - /* Fill in lower face */ - xferinfo[dir].src.off = data.gsh[dir] - 2 * stencil[dir]; - xferinfo[dir].src.len = stencil[dir]; - xferinfo[dir].dst.len = stencil[dir]; - } else { - /* Fill in upper face */ - 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]; + { + int const domain_size = data.gsh[dir] - 2*stencil[dir]; + int step_size = stencil[dir]; + int num_steps = 1; + int step; + int source; + + assert (domain_size > 0); + if (f==0 && domain_size < step_size) { + /* TODO: this could be made more efficient by taking + larger steps */ + step_size = 1; + num_steps = stencil[dir]; } - } else { - xferinfo[dir].src.len = 0; - xferinfo[dir].dst.len = 0; + + for (step=0; stepcctk_bbox[2*dir+f]) { + 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]; +#endif + source = data.gsh[dir] - 2 * stencil[dir] + step; + while (source < stencil[dir]) { + source += domain_size; + } + while (source >= data.gsh[dir]-stencil[dir]) { + source -= domain_size; + } + assert (source >= stencil[dir]); + assert (source < data.gsh[dir]-stencil[dir]); + xferinfo[dir].src.off = source; + xferinfo[dir].src.len = step_size; + xferinfo[dir].dst.off = step; + xferinfo[dir].dst.len = step_size; + } else { + /* Fill in upper face */ + 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 { + xferinfo[dir].src.len = 0; + xferinfo[dir].dst.len = 0; + } + + ierr = Slab_Transfer + (cctkGH, group.dim, xferinfo, -1, + group.vartype, varptr, group.vartype, varptr); + assert (!ierr); + + } /* for step */ } - ierr = Slab_Transfer (cctkGH, group.dim, xferinfo, -1, - group.vartype, varptr, group.vartype, varptr); - assert (!ierr); - } /* for f */ } /* if dir */ -- cgit v1.2.3