aboutsummaryrefslogtreecommitdiff
path: root/src/periodic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/periodic.c')
-rw-r--r--src/periodic.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/src/periodic.c b/src/periodic.c
new file mode 100644
index 0000000..feb6aec
--- /dev/null
+++ b/src/periodic.c
@@ -0,0 +1,163 @@
+/* $Header$ */
+
+#include <assert.h>
+#include <stdlib.h>
+#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);
+
+
+
+int
+BndPeriodicVI (cGH const * restrict const cctkGH,
+ int const * restrict const stencil,
+ int const vi)
+{
+ cGroup group;
+ cGroupDynamicData data;
+ void * restrict varptr;
+ struct xferinfo * restrict xferinfo;
+ int do_periodic[3];
+ int gi;
+ int dir;
+ int d, f;
+ int ierr;
+
+ /* Check arguments */
+ assert (cctkGH);
+ assert (stencil);
+ assert (vi>=0 && vi<CCTK_NumVars());
+
+ /* Get and check group info */
+ gi = CCTK_GroupIndexFromVarI (vi);
+ assert (gi>=0 && gi<CCTK_NumGroups());
+
+ ierr = CCTK_GroupData (gi, &group);
+ assert (!ierr);
+ assert (group.grouptype == CCTK_GF);
+ assert (group.disttype == CCTK_DISTRIB_DEFAULT);
+ assert (group.stagtype == 0);
+
+ ierr = CCTK_GroupDynamicData (cctkGH, gi, &data);
+ assert (!ierr);
+
+ 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;
+
+ /* Allocate slab transfer description */
+ xferinfo = malloc(group.dim * sizeof *xferinfo);
+ assert (xferinfo);
+
+ for (dir=0; dir<group.dim; ++dir) {
+ if (dir<3 && do_periodic[dir]) {
+
+ /* Loop over faces */
+ for (f=0; f<2; ++f) {
+
+ /* Fill in slab transfer description */
+ for (d=0; d<group.dim; ++d) {
+ 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.nghostzones = data.nghostzones[d];
+ xferinfo[d].src.off = 0;
+ xferinfo[d].src.str = 1;
+ xferinfo[d].src.len = data.lsh [d];
+
+ 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.nghostzones = data.nghostzones[d];
+ xferinfo[d].dst.off = 0;
+ xferinfo[d].dst.str = 1;
+ xferinfo[d].dst.len = data.lsh [d];
+
+ xferinfo[d].xpose = d;
+ xferinfo[d].flip = 0;
+ }
+
+ if (f==0) {
+ /* Fill in lower face */
+ xferinfo[dir].src.off = data.lsh[d] - data.nghostzones[d];
+ xferinfo[dir].src.len = data.nghostzones[d];
+ xferinfo[dir].dst.len = data.nghostzones[d];
+ } else {
+ /* Fill in upper face */
+ xferinfo[dir].src.len = data.nghostzones[d];
+ xferinfo[dir].dst.off = data.lsh[d] - data.nghostzones[d];
+ xferinfo[dir].dst.len = data.nghostzones[d];
+ }
+
+ ierr = Slab_Transfer (cctkGH, group.dim, xferinfo, -1,
+ group.vartype, varptr, group.vartype, varptr);
+ assert (ierr);
+
+ } /* for f */
+
+ } /* if dir */
+ } /* for dir */
+
+ free (xferinfo);
+
+ return 0;
+}
+
+
+
+int
+BndPeriodicVN (cGH const * restrict const cctkGH,
+ int const * restrict const stencil,
+ char const * restrict const vn)
+{
+ int const vi = CCTK_VarIndex (vn);
+ assert (vi>=0 && vi<CCTK_NumVars());
+ return BndPeriodicVI (cctkGH, stencil, vi);
+}
+
+
+
+int
+BndPeriodicGI (cGH const * restrict const cctkGH,
+ int const * restrict const stencil,
+ int const gi)
+{
+ int vi1, vi2;
+ int vi;
+ int ierr;
+ assert (gi>=0 && gi<CCTK_NumGroups());
+ vi1 = CCTK_FirstVarIndexI(gi);
+ assert (vi1>=0 && vi1<CCTK_NumVars());
+ vi2 = vi1 + CCTK_NumVarsInGroupI(gi);
+ assert (vi2>=vi1 && vi2<CCTK_NumVars());
+ assert (vi>=0 && vi<CCTK_NumVars());
+ for (vi=vi1; vi<vi2; ++vi) {
+ ierr = BndPeriodicVI (cctkGH, stencil, vi);
+ if (ierr) return ierr;
+ }
+ return 0;
+}
+
+
+
+int
+BndPeriodicGN (cGH const * restrict const cctkGH,
+ int const * restrict const stencil,
+ char const * restrict const gn)
+{
+ int const gi = CCTK_GroupIndex (gn);
+ assert (gi>=0 && gi<CCTK_NumGroups());
+ return BndPeriodicGI (cctkGH, stencil, gi);
+}