diff options
Diffstat (limited to 'src/CollectDataND.c')
-rw-r--r-- | src/CollectDataND.c | 157 |
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]);$*/ - - |