aboutsummaryrefslogtreecommitdiff
path: root/src/CollectData2D.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/CollectData2D.c')
-rw-r--r--src/CollectData2D.c115
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++;
+ }
+ }
}
+
+