diff options
Diffstat (limited to 'src/periodic.c')
-rw-r--r-- | src/periodic.c | 163 |
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); +} |