aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschnetter <schnetter@1bf05452-ddb3-4880-bfa1-00436340132b>2003-05-22 17:05:42 +0000
committerschnetter <schnetter@1bf05452-ddb3-4880-bfa1-00436340132b>2003-05-22 17:05:42 +0000
commit955f70279a978b2bbd0a0f89eb601e79becdee44 (patch)
tree94a781787a6b98c20b06928c9d56cb7b13e91bd6
parent7e3d910014154f123516600ba23b63eff2b6c0a7 (diff)
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
-rw-r--r--src/periodic.c86
1 files 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<group.dim; ++dir) {
if (dir<3 && do_periodic[dir]) {
+ assert (stencil[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; step<num_steps; ++step) {
+
+ if (cctkGH->cctk_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 */