aboutsummaryrefslogtreecommitdiff
path: root/src/CollectDataND.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/CollectDataND.c')
-rw-r--r--src/CollectDataND.c157
1 files changed, 66 insertions, 91 deletions
diff --git a/src/CollectDataND.c b/src/CollectDataND.c
index 0d98886..f70e8e3 100644
--- a/src/CollectDataND.c
+++ b/src/CollectDataND.c
@@ -13,19 +13,26 @@
#include "CactusBase/IOUtil/src/ioGH.h"
#include "CactusPUGH/PUGH/src/include/pugh.h"
-#define MIN(a,b) ((a)<(b) ? (a) : (b))
-#define MAX(a,b) ((a)>(b) ? (a) : (b))
+
+/* SMART returns the loop boundary:
+ 1 if dir>sdim (the hardcoded index coordinate is less than dimension of slab)
+ sz[idir] otherwise (size of the slab in direction <dir>.
+
+ This way we make sure that we enter the loop of that particular direction
+ at least one time, even though there is no size associated along that direction.
+*/
+#define SMART(sz,dir,sd) ((dir)>(sd) ? 1 : (sz)[(dir)])
int CollectDataND(cGH *GH, int vindex, int vtimelvl, int vdim, int sdim,
int *S_s, int *dir, int *ds, int *len,
void **dptr, int *dsize)
{
- return(0);
+ return(0);
}
/*@@
- @routine CollectLocalData2D
+ @routine CollectLocalDataND
@date Fri May 12 17:51:30 2000
@author Gerd Lanfermann
@desc
@@ -45,116 +52,84 @@ int CollectDataND(cGH *GH, int vindex, int vtimelvl, int vdim, int sdim,
int CollectLocalDataND(cGH *GH, int vindex, int vtimelvl, int vdim, int sdim,
int *S_s, int *linedir, int *ds, int *len,
- void **loc_dptr, int *idx1_dptr, int *idx2_dptr, int *dsize)
+ void **loc_dptr, int *dirsize, int *totsize)
{
-
-
- int tstart[MAX_DIM]; /* temp start points */
- int tlocstart[MAX_DIM];
- int tlocend[MAX_DIM];
-
- int *locstart, *locend; /* local start/end pnt in glob. index coord */
- int nlocpoints[2], totlocpoints; /* number of loc. points in each dir, tot. pnts */
-
- hs_vector *u_l;
+ int *locstart, *locend, nlocpoints;
+ int ipnt[MAX_DIM], gridpnt[MAX_DIM];
int vtype,vtypesize;
- int idim, idir;
- int ierr;
- int phasplane=1;
-
+ int idim, idir, lincount;
+ int ierr=0;
+
void *data = CCTK_VarDataPtrI (GH, vtimelvl, vindex);
- CCTK_REAL *real_dptr = (CCTK_REAL *) *loc_dptr;
+
+ if (vdim > MAX_DIM)
+ return (-1);
vtype = CCTK_VarTypeI(vindex);
vtypesize = CCTK_VarTypeSize(vtype);
locstart = (int*)malloc(vdim*sizeof(int));
locend = (int*)malloc(vdim*sizeof(int));
- u_l = (hs_vector*)malloc(sdim*sizeof(hs_vector));
+ dirsize = (int*)malloc(sdim*sizeof(int));
- /* Initialize the local start/end to BAD values and hope for the best... */
- for (idim=0; idim<vdim; idim++)
+ printf("Calling GetLocalSlab \n");
+
+ ierr = GetLocalSlab(GH, vdim, sdim,
+ S_s, linedir, ds, len,
+ locstart, locend, dirsize, &nlocpoints);
+ if (ierr<0)
{
- tstart[idim] = BAD;
- locstart[idim] = BAD;
- locend[idim] = BAD;
-
- /* line vectors are 000, 000 */
- u_l[0].vec[idim] = 0;
- u_l[1].vec[idim] = 0;
-
- /* make sure that all procs above and below the plane,
- know that they don't have a plane */
- if ((idim!=linedir[0]) && (idim!=linedir[1]))
- if((GH->cctk_lbnd[idim]<S_s[idim]) &&
- (GH->cctk_ubnd[idim]>S_s[idim]))
- {
- locstart[idim] = S_s[idim];
- locend[idim] = S_s[idim];
- phasplane = 1;
- }
- else phasplane = 0;
+ CCTK_WARN (1, "GetLocalSlab() failed");
+ return (ierr);
}
- /* construct line vectors that span the surface:
- e.g. linedir[0,1] = 1,2 means YZ surface: (000,000) -> (010,001) */
- u_l[0][linedir[0]]=1;
- u_l[1][linedir[1]]=1;
+ /* Transform from global to local index coordinate */
+ for(idim=0;idim<vdim;idim++)
+ {
+ locstart[idim]-=GH->cctk_lbnd[idim];
+ locend[idim] -=GH->cctk_lbnd[idim];
+ }
- /* init to 1 (neutral element for multiplication) */
- totlocpoints=1;
-
- for (idir=0;idir<2;idir++)
- {
+ *loc_dptr= malloc(nlocpoints * vtypesize);
+ lincount=0;
- if (S_s[linedir[idir]]<GH->cctk_ubnd[linedir[idir]])
- {
- /* Initialize startpoints */
- for (idim=0; idim<vdim; idim++)
- {
- tstart[idim] = GH->cctk_lbnd[idim]+GH->cctk_nghostzones[idim];
- }
- tstart[linedir[idir]]=S_s[linedir[idir]];
- ierr = GetLocalLine(GH, vdim, tstart, u_l[idir], ds[idir], len[idir],
- tlocstart, tlocend, &nlocpoints[idir]);
- locstart[linedir[idir]]= tlocstart[linedir[idir]];
- locend [linedir[idir]]= tlocend[linedir[idir]];
+ /* zero out index array so that unused dimensions are 0 */
+ memset (gridpnt, 0, sizeof (gridpnt));
+ memset (ipnt , 0, sizeof (ipnt));
- totlocpoints*=nlocpoints[idir];
+ /* CCTK_VARIABLE_INT */
+ gridpnt[0] = locstart[0];
+ gridpnt[1] = locstart[1];
+ gridpnt[2] = locstart[2];
- if (locstart[linedir[idir]]==BAD) phasplane &=0;
- }
- else
- {
- phasplane &=0;
- totlocpoints = 0;
- }
-
- }
-
- if (phasplane)
- printf("LOC START: %d %d %d %d %d %d -> %d\n",
- locstart[0],locstart[1],locstart[2],
- locend[0],locend[1],locend[2],
- totlocpoints);
- else
+ if (vtype == CCTK_VARIABLE_REAL)
{
- printf("proc has no plane\n");
- printf("LOC START: %d %d %d %d %d %d -> %d\n",
- locstart[0],locstart[1],locstart[2],
- locend[0],locend[1],locend[2],
- totlocpoints);
+ CCTK_REAL *real_dptr = (CCTK_REAL *) *loc_dptr;
+
+ for (ipnt[2]=0 ; ipnt[2]<SMART(dirsize, 2, sdim); ipnt[2]++)
+
+ gridpnt[linedir[0]] = locstart[linedir[0]] + ipnt[0] * ds[0];
+
+ for (ipnt[1]=0; ipnt[1]<SMART(dirsize, 1, sdim); ipnt[1]++) {
+
+ gridpnt[linedir[1]] = locstart[linedir[1]] + ipnt[1] * ds[1];
+
+ for (ipnt[0]=0; ipnt[0]<SMART(dirsize, 0, sdim); ipnt[0]++) {
+
+ {
+ gridpnt[linedir[2]] = locstart[linedir[2]] + ipnt[2] * ds[2];
+
+ real_dptr[lincount++]=((CCTK_REAL *) data)
+ [CCTK_GFINDEX3D(GH,gridpnt[0],gridpnt[1],gridpnt[2])];
+ }
+ }
+ }
+
}
}
-
- /*$printf("LB/UB [%d , %d, %d] - [%d, %d, %d] \n",
- GH->cctk_lbnd[0],GH->cctk_lbnd[1],GH->cctk_lbnd[2],
- GH->cctk_ubnd[0],GH->cctk_ubnd[1],GH->cctk_ubnd[2]);$*/
-
-