aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoreschnett <eschnett@1bf05452-ddb3-4880-bfa1-00436340132b>2010-12-23 00:26:45 +0000
committereschnett <eschnett@1bf05452-ddb3-4880-bfa1-00436340132b>2010-12-23 00:26:45 +0000
commite68518078f4e0dec380c1bc1f8f7a836d52da17f (patch)
tree54dc1826682f92fa84f5097775409f6ab062fb34 /src
parentebccb57eaaa59f032c85af75f7c1c76989e616fe (diff)
Allow direct calls to the low-level Periodic API. This can be used to
apply periodic conditions only on selected grid variables. This is implemented by moving the "logic" (handling of errors and parameters) into the function Periodic_ApplyBC to make BndPeriodicVI "thorn agnostic". [Patch by David Radice] git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/Periodic/trunk@23 1bf05452-ddb3-4880-bfa1-00436340132b
Diffstat (limited to 'src')
-rw-r--r--src/periodic.c105
-rw-r--r--src/periodic.h37
2 files changed, 71 insertions, 71 deletions
diff --git a/src/periodic.c b/src/periodic.c
index 1cfb274..b04f45a 100644
--- a/src/periodic.c
+++ b/src/periodic.c
@@ -6,7 +6,6 @@
#include "cctk.h"
#include "cctk_Parameters.h"
#include "Slab.h"
-#include "periodic.h"
static const char * restrict const rcsid = "$Header$";
CCTK_FILEVERSION(TAT_Periodic_periodic_c);
@@ -14,18 +13,18 @@ CCTK_FILEVERSION(TAT_Periodic_periodic_c);
int
-BndPeriodicVI (cGH const * restrict const cctkGH,
+BndPeriodicVI (CCTK_POINTER_TO_CONST _GH,
+ int size,
int const * restrict const stencil,
+ int const do_periodic[3],
int const vi)
{
- DECLARE_CCTK_PARAMETERS;
-
+ cGH const * restrict const cctkGH = _GH;
+
cGroup group;
cGroupDynamicData data;
- char * restrict fullname;
void * restrict varptr;
struct xferinfo * restrict xferinfo;
- int do_periodic[3];
int global_bbox[6];
int global_lbnd[3], global_ubnd[3];
int fake_bbox[6];
@@ -39,15 +38,6 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
assert (stencil);
assert (vi>=0 && vi<CCTK_NumVars());
- if (verbose) {
- fullname = CCTK_FullName(vi);
- assert (fullname);
- CCTK_VInfo (CCTK_THORNSTRING,
- "Applying periodicity boundary conditions to \"%s\"",
- fullname);
- free (fullname);
- }
-
/* Get and check group info */
gi = CCTK_GroupIndexFromVarI (vi);
assert (gi>=0 && gi<CCTK_NumGroups());
@@ -57,6 +47,12 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
assert (group.grouptype == CCTK_GF);
assert (group.disttype == CCTK_DISTRIB_DEFAULT);
assert (group.stagtype == 0);
+
+ if(group.dim != size) {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "The group \"%s\" has dimension %d, but the given stencil has "
+ "size %d.", CCTK_GroupNameFromVarI(vi), group.dim, size);
+ }
ierr = CCTK_GroupDynamicData (cctkGH, gi, &data);
assert (!ierr);
@@ -64,11 +60,6 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
varptr = CCTK_VarDataPtrI (cctkGH, 0, vi);
assert (varptr);
- /* Condition periodicity information */
- do_periodic[0] = periodic || periodic_x;
- do_periodic[1] = periodic || periodic_y;
- do_periodic[2] = periodic || periodic_z;
-
{
int min_handle, max_handle;
CCTK_REAL local[6], global[6];
@@ -108,13 +99,7 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
assert (stencil[dir] >= 0);
if (data.gsh[dir] < 2*stencil[dir]+1) {
- CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "The group \"%s\" has in the %c-direction 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 that direction.",
- CCTK_GroupNameFromVarI(vi), "xyz"[dir], data.gsh[dir],
- stencil[dir],
- 2*stencil[dir]+1);
+ return dir+1;
}
/* Loop over faces */
@@ -214,22 +199,30 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
int
-BndPeriodicVN (cGH const * restrict const cctkGH,
+BndPeriodicVN (CCTK_POINTER_TO_CONST _GH,
+ int size,
int const * restrict const stencil,
+ int const do_periodic[3],
char const * restrict const vn)
{
+ cGH const * restrict const cctkGH = _GH;
+
int const vi = CCTK_VarIndex (vn);
assert (vi>=0 && vi<CCTK_NumVars());
- return BndPeriodicVI (cctkGH, stencil, vi);
+ return BndPeriodicVI (_GH, size, stencil, do_periodic, vi);
}
int
-BndPeriodicGI (cGH const * restrict const cctkGH,
+BndPeriodicGI (CCTK_POINTER_TO_CONST _GH,
+ int size,
int const * restrict const stencil,
+ int const do_periodic[3],
int const gi)
{
+ cGH const * restrict const cctkGH = _GH;
+
int v1, nv;
int vi;
int ierr;
@@ -240,7 +233,7 @@ BndPeriodicGI (cGH const * restrict const cctkGH,
v1 = CCTK_FirstVarIndexI(gi);
assert (v1>=0 && v1<CCTK_NumVars());
for (vi=v1; vi<v1+nv; ++vi) {
- ierr = BndPeriodicVI (cctkGH, stencil, vi);
+ ierr = BndPeriodicVI (_GH, size, stencil, do_periodic, vi);
if (ierr) return ierr;
}
}
@@ -250,13 +243,15 @@ BndPeriodicGI (cGH const * restrict const cctkGH,
int
-BndPeriodicGN (cGH const * restrict const cctkGH,
+BndPeriodicGN (CCTK_POINTER_TO_CONST _GH,
+ int size,
int const * restrict const stencil,
+ int const do_periodic[3],
char const * restrict const gn)
{
int const gi = CCTK_GroupIndex (gn);
assert (gi>=0 && gi<CCTK_NumGroups());
- return BndPeriodicGI (cctkGH, stencil, gi);
+ return BndPeriodicGI (_GH, size, stencil, do_periodic, gi);
}
@@ -303,6 +298,15 @@ Periodic_RegisterBC (cGH * restrict const cctkGH)
void
Periodic_ApplyBC (cGH const * restrict const cctkGH)
{
+ DECLARE_CCTK_PARAMETERS;
+
+ int do_periodic[3];
+ do_periodic[0] = periodic || periodic_x;
+ do_periodic[1] = periodic || periodic_y;
+ do_periodic[2] = periodic || periodic_z;
+
+ char * fullname;
+
int nvars;
CCTK_INT * restrict indices;
CCTK_INT * restrict faces;
@@ -346,7 +350,40 @@ Periodic_ApplyBC (cGH const * restrict const cctkGH)
ierr = CCTK_GroupnghostzonesVI (cctkGH, dim, stencil, vi);
assert (!ierr);
- ierr = BndPeriodicVI (cctkGH, stencil, vi);
+ if (verbose) {
+ fullname = CCTK_FullName(vi);
+ assert (fullname);
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "Applying periodicity boundary conditions to \"%s\"",
+ fullname);
+ free (fullname);
+ }
+
+ ierr = BndPeriodicVI (cctkGH, dim, stencil, do_periodic, vi);
+
+ if(ierr > 0 && ierr < 4) {
+ int dir = ierr-1;
+
+ int gi;
+ cGroup group;
+ cGroupDynamicData data;
+
+ gi = CCTK_GroupIndexFromVarI (vi);
+ ierr = CCTK_GroupData (gi, &group);
+ assert (!ierr);
+
+ ierr = CCTK_GroupDynamicData (cctkGH, gi, &data);
+ assert (!ierr);
+
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "The group \"%s\" has in the %c-direction 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 that direction.",
+ CCTK_GroupNameFromVarI(vi), "xyz"[dir], data.gsh[dir],
+ stencil[dir],
+ 2*stencil[dir]+1);
+ }
+
assert (!ierr);
free (stencil);
diff --git a/src/periodic.h b/src/periodic.h
index 32a77e5..e69de29 100644
--- a/src/periodic.h
+++ b/src/periodic.h
@@ -1,37 +0,0 @@
-/* $Header$ */
-
-#ifndef PERIODIC_H
-#define PERIODIC_H
-
-#include "cctk.h"
-
-int
-BndPeriodicVI (cGH const * restrict const cctkGH,
- int const * restrict const stencil,
- int const vi);
-
-int
-BndPeriodicVN (cGH const * restrict const cctkGH,
- int const * restrict const stencil,
- char const * restrict const vn);
-
-int
-BndPeriodicGI (cGH const * restrict const cctkGH,
- int const * restrict const stencil,
- int const gi);
-
-int
-BndPeriodicGN (cGH const * restrict const cctkGH,
- int const * restrict const stencil,
- char const * restrict const gn);
-
-
-
-void
-Periodic_RegisterBC (cGH * restrict const cctkGH);
-
-void
-Periodic_ApplyBC (cGH const * restrict const cctkGH);
-
-#endif /* defined PERIODIC_H */
-