aboutsummaryrefslogtreecommitdiff
path: root/src/periodic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/periodic.c')
-rw-r--r--src/periodic.c91
1 files changed, 83 insertions, 8 deletions
diff --git a/src/periodic.c b/src/periodic.c
index feb6aec..7339d9e 100644
--- a/src/periodic.c
+++ b/src/periodic.c
@@ -2,10 +2,11 @@
#include <assert.h>
#include <stdlib.h>
+#include <stdio.h>
#include "cctk.h"
#include "cctk_Parameters.h"
#include "Slab.h"
-#include "Periodic.h"
+#include "periodic.h"
static const char * restrict const rcsid = "$Header$";
CCTK_FILEVERSION(TAT_Periodic_periodic_c);
@@ -17,6 +18,8 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
int const * restrict const stencil,
int const vi)
{
+ DECLARE_CCTK_PARAMETERS;
+
cGroup group;
cGroupDynamicData data;
void * restrict varptr;
@@ -53,6 +56,11 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
do_periodic[1] = periodic || periodic_y;
do_periodic[2] = periodic || periodic_z;
+ printf ("BndPeriodicVI var=%s\n", CCTK_FullName(vi));
+ for (d=0; d<3; ++d) {
+ printf (" d=%d per=%d ste=%d\n", d, do_periodic[d], stencil[d]);
+ }
+
/* Allocate slab transfer description */
xferinfo = malloc(group.dim * sizeof *xferinfo);
assert (xferinfo);
@@ -91,19 +99,20 @@ BndPeriodicVI (cGH const * restrict const cctkGH,
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];
+ 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.len = data.nghostzones[d];
- xferinfo[dir].dst.off = data.lsh[d] - data.nghostzones[d];
- xferinfo[dir].dst.len = data.nghostzones[d];
+ 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];
}
ierr = Slab_Transfer (cctkGH, group.dim, xferinfo, -1,
group.vartype, varptr, group.vartype, varptr);
- assert (ierr);
+ assert (!ierr);
} /* for f */
@@ -161,3 +170,69 @@ BndPeriodicGN (cGH const * restrict const cctkGH,
assert (gi>=0 && gi<CCTK_NumGroups());
return BndPeriodicGI (cctkGH, stencil, gi);
}
+
+
+
+void
+Periodic_ApplyBC (cGH const * restrict const cctkGH)
+{
+ int nvars;
+ CCTK_INT * restrict indices;
+ CCTK_INT * restrict faces;
+ CCTK_INT * restrict widths;
+ CCTK_INT * restrict tables;
+ int vi;
+ int dim;
+ int * restrict stencil;
+ int i;
+ int d;
+ int ierr;
+
+ assert (cctkGH);
+
+ nvars = Boundary_SelectedGVs (cctkGH, 0, 0, 0, 0, 0, 0);
+ assert (nvars>=0);
+
+ indices = malloc (nvars * sizeof *indices);
+ assert (indices);
+ faces = malloc (nvars * sizeof *faces);
+ assert (faces);
+ widths = malloc (nvars * sizeof *widths);
+ assert (widths);
+ tables = malloc (nvars * sizeof *tables);
+ assert (tables);
+
+ ierr = Boundary_SelectedGVs
+ (cctkGH, nvars, indices, faces, widths, tables, 0);
+ assert (ierr == nvars);
+
+ for (i=0; i<nvars; ++i) {
+ vi = indices[i];
+ assert (vi>=0 && vi<CCTK_NumVars());
+
+ assert (widths[i] >= 0);
+
+ dim = CCTK_GroupDimFromVarI (vi);
+ assert (dim>=0);
+
+ stencil = malloc (dim * sizeof *stencil);
+ assert (stencil);
+#if 0
+ for (d=0; d<dim; ++d) {
+ stencil[d] = widths[i];
+ }
+#endif
+ ierr = CCTK_GroupnghostzonesVI (cctkGH, dim, stencil, vi);
+ assert (!ierr);
+
+ ierr = BndPeriodicVI (cctkGH, stencil, vi);
+ assert (!ierr);
+
+ free (stencil);
+ }
+
+ free (indices);
+ free (faces);
+ free (widths);
+ free (tables);
+}