diff options
Diffstat (limited to 'src/CollectData2D.c')
-rw-r--r-- | src/CollectData2D.c | 115 |
1 files changed, 89 insertions, 26 deletions
diff --git a/src/CollectData2D.c b/src/CollectData2D.c index 4da603c..e2f1dad 100644 --- a/src/CollectData2D.c +++ b/src/CollectData2D.c @@ -1,4 +1,5 @@ + #include <stdio.h> #include <stdlib.h> #include <math.h> @@ -7,41 +8,103 @@ #include "cctk_Parameters.h" #include "cctk_Arguments.h" -/* MPI message tag */ -#define TAGBASE 1234 +#include "Hyperslab.h" +#include "CactusBase/IOUtil/src/ioGH.h" +#include "CactusPUGH/PUGH/src/include/pugh.h" -int CollectData2D(cGH *GH, int vindex, int vtype, int vtypesize,int vtimelvl, - int vdim, int *S_l, int *u1_l, int *u2_l, int *len_l, - int *dsize, void **dptr) -{ - int ierr; +#define MIN(a,b) ((a)<(b) ? (a) : (b)) +#define MAX(a,b) ((a)>(b) ? (a) : (b)) - ierr = CollectLocalData2D(GH, vindex, vtype, vtypesize, vtimelvl, - vdim, S_l, u1_l, u2_l, len_l, - &loc_dptr, &loc_dcount); - +#define MAX_DIM 3 + + +int CollectData2D(cGH *GH, int vindex, int vtimelvl, int vdim, + int *S_s, int *u_l1, int *u_l2, int *ds, + int len_l1, int len_l2, + void **dptr, int *dsize) +{ + return(0); } -int CollectLocalData2D(cGH *GH, int vindex, int vtype, int vtypesize, int vtimelvl, - int vdim, int *S_l, int *u1_l,int *u2_l, int *len_l, - void **loc_dptr, int *dsize) +int CollectLocalData2D(cGH *GH, int vindex, int vtimelvl, int vdim, + int *S_s, int *u_l1, int *u_l2, int *ds, + int len_l1, int len_l2, + void **loc_dptr, int *idx1_dptr, int *idx2_dptr, int *dsize) { + + int tstart[MAX_DIM], end_l1[MAX_DIM], end_l2[MAX_DIM]; + int gridpnt[MAX_DIM],tpnt[MAX_DIM]; + int l1,l2, lmbd_max, lsh_max; + int ierr; + + int locstart2[3],locend2[3],nlocpoints2; + + int gindex,vtype,vtypesize; + int idim,lincount, tmp; + + void *data = CCTK_VarDataPtrI (GH, vtimelvl, vindex); + + int *idx1, *idx2; + CCTK_REAL *real_dptr = (CCTK_REAL *) *loc_dptr; + + vtype = CCTK_VarTypeI(vindex); + vtypesize = CCTK_VarTypeSize(vtype); + + /* Test for orthogonality */ + tmp=0; + for (idim=0;idim<vdim;idim++) + tmp+=u_l1[idim]*u_l2[idim]; + if (tmp!=0) printf("Error: not orthogonal\n"); + + + /* Calculate maximal length of one arm */ + if (len_l1<0) lmbd_max = 10000; + else lmbd_max = len_l1; + + for (idim=0;idim<vdim;idim++) + if (ds[0]!=0) + lmbd_max = MIN(((GH->cctk_gsh[idim]-S_s[idim])/ds[0]),lmbd_max); + + /* Get a max. local size, + int gridpnt to zero, so we can loop up to maxdim */ + for (idim=0;idim<vdim;idim++) + { + lsh_max = MAX(GH->cctk_lsh[idim], lsh_max); + gridpnt[idim]=0; + } - int idim; - int t1,t2,t3; - int gridpnt[3]; + printf("MAX LAMDA: %d ",lmbd_max); + /* We do not know how many points along the l2 arm, take maximum lsh */ + *loc_dptr = malloc(lsh_max*lmbd_max * vtypesize); - ierr = GetLocalLine(GH, vdim, S_l, u1_l, len_l[0], locstart1, locend1, &nlocpoints1); - ierr = GetLocalLine(GH, vdim, S_l, u1_l, len_l[0], locstart2, locend2, &nlocpoints2); + idx1 = (int*)malloc(lsh_max*lmbd_max * vtypesize); + idx2 = (int*)malloc(lsh_max*lmbd_max * vtypesize); - for (l1=0;l1<nlocpoints1;l1++) - for (l2=0;l2<nlocpoints2;l2++) - { - for (idim=0;idim<vdim;idim++) - gridpnt[idim]=S_l[idim]+l1*u1_l[idim]+l2*u2_l[idim]; - real_ptr[l++] = ((CCTK_REAL*) data)[CCTK_GFINDEX3D(GH,gridpnt[0],gridpnt[1],gridpnt[2])]; - } + idx1_dptr = idx1; + /*$idx2 = idx2_dptr;$*/ + + for (l1=0;l1<lmbd_max;l1++) + { + for (idim=0;idim<vdim;idim++) + tpnt[idim] = S_s[idim]+l1*u_l1[idim]; + + GetLocalLine(GH, vdim, tpnt, u_l2, ds[1], len_l2, + locstart2, locend2, &nlocpoints2); + for (l2=0; l2<nlocpoints2; l2++) + { + for (idim=0;idim<vdim;idim++) + gridpnt[idim] = locstart2[idim]+ l2 * u_l2[idim]; + + /*$real_dptr[lincount] =((CCTK_REAL *) data) + [CCTK_GFINDEX3D(GH,gridpnt[0],gridpnt[1],gridpnt[2])];$*/ + idx1_dptr[lincount] = l1; + /*idx2_dptr[lincount] = l2;$*/ + lincount++; + } + } } + + |