summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/tselect.c196
1 files changed, 195 insertions, 1 deletions
diff --git a/test/tselect.c b/test/tselect.c
index 748bf33..ac98e3f 100644
--- a/test/tselect.c
+++ b/test/tselect.c
@@ -56,6 +56,26 @@ static char RcsId[] = "$Revision$";
#define SPACE4_DIM2 13
#define SPACE4_DIM3 17
+/* Number of random hyperslabs to test */
+#define NHYPERSLABS 10
+
+/* Number of random hyperslab tests performed */
+#define NRAND_HYPER 100
+
+/* 5-D dataset with fixed dimensions */
+#define SPACE5_NAME "Space5"
+#define SPACE5_RANK 5
+#define SPACE5_DIM1 10
+#define SPACE5_DIM2 10
+#define SPACE5_DIM3 10
+#define SPACE5_DIM4 10
+#define SPACE5_DIM5 10
+
+/* 1-D dataset with same size as 5-D dataset */
+#define SPACE6_NAME "Space6"
+#define SPACE6_RANK 1
+#define SPACE6_DIM1 (SPACE5_DIM1*SPACE5_DIM2*SPACE5_DIM3*SPACE5_DIM4*SPACE5_DIM5)
+
/* Element selection information */
#define POINT1_NPOINTS 10
@@ -66,6 +86,7 @@ herr_t test_select_hyper_iter1(void *elem,hid_t type_id, hsize_t ndim, hssize_t
herr_t test_select_point_iter1(void *elem,hid_t type_id, hsize_t ndim, hssize_t *point, void *operator_data);
herr_t test_select_all_iter1(void *elem,hid_t type_id, hsize_t ndim, hssize_t *point, void *operator_data);
herr_t test_select_none_iter1(void *elem,hid_t type_id, hsize_t ndim, hssize_t *point, void *operator_data);
+herr_t test_select_hyper_iter2(void *_elem, hid_t UNUSED type_id, hsize_t ndim, hssize_t *point, void *_operator_data);
/****************************************************************
**
@@ -2168,7 +2189,6 @@ test_select_hyper_union_stagger(void)
{3,4}};
int dsetrank=2; /* File Dataset rank */
int memrank=2; /* Memory Dataset rank */
- int rank;
int i,j; /* Local counting variables */
herr_t error;
hsize_t stride[2]={1,1};
@@ -2456,6 +2476,179 @@ test_select_hyper_union_3d(void)
/****************************************************************
**
+** test_select_hyper_iter2(): Iterator for checking hyperslab iteration
+**
+****************************************************************/
+herr_t
+test_select_hyper_iter2(void *_elem, hid_t UNUSED type_id, hsize_t ndim, hssize_t *point, void *_operator_data)
+{
+ int *tbuf=(int *)_elem, /* temporary buffer pointer */
+ **tbuf2=(int **)_operator_data; /* temporary buffer handle */
+ unsigned u; /* Local counting variable */
+
+ if(*tbuf!=**tbuf2) {
+ num_errs++;
+ printf("Error in hyperslab iteration!\n");
+ printf("location: { ");
+ for(u=0; u<(unsigned)ndim; u++) {
+ printf("%2d",(int)point[u]);
+ if(u<(unsigned)(ndim-1))
+ printf(", ");
+ } /* end for */
+ printf("}\n");
+ printf("*tbuf=%d, **tbuf2==%d\n",*tbuf,**tbuf2);
+ return(-1);
+ } /* end if */
+ else {
+ (*tbuf2)++;
+ return(0);
+ }
+} /* end test_select_hyper_iter1() */
+
+/****************************************************************
+**
+** test_select_hyper_union_random_5d(): Test basic H5S (dataspace) selection code.
+** Tests random unions of 5-D hyperslabs
+**
+****************************************************************/
+static void
+test_select_hyper_union_random_5d(void)
+{
+ hid_t fid1; /* HDF5 File IDs */
+ hid_t dataset; /* Dataset ID */
+ hid_t sid1,sid2; /* Dataspace ID */
+ hsize_t dims1[] = {SPACE5_DIM1, SPACE5_DIM2, SPACE5_DIM3, SPACE5_DIM4, SPACE5_DIM5};
+ hsize_t dims2[] = {SPACE6_DIM1};
+ hssize_t start[SPACE5_RANK]; /* Starting location of hyperslab */
+ hsize_t count[SPACE5_RANK]; /* Element count of hyperslab */
+ int *wbuf, /* buffer to write to disk */
+ *rbuf, /* buffer read from disk */
+ *tbuf; /* temporary buffer pointer */
+ intn i,j,k,l,m; /* Counters */
+ herr_t ret; /* Generic return value */
+ hssize_t npoints, /* Number of elements in file selection */
+ npoints2; /* Number of elements in memory selection */
+ unsigned seed; /* Random number seed for each test */
+ unsigned test_num; /* Count of tests being executed */
+
+ /* Output message about test being performed */
+ MESSAGE(5, ("Testing Hyperslab Selection Functions with random unions of 5-D hyperslabs\n"));
+
+ /* Allocate write & read buffers */
+ wbuf=malloc(sizeof(int)*SPACE5_DIM1*SPACE5_DIM2*SPACE5_DIM3*SPACE5_DIM4*SPACE5_DIM5);
+ rbuf=calloc(sizeof(int),SPACE5_DIM1*SPACE5_DIM2*SPACE5_DIM3*SPACE5_DIM4*SPACE5_DIM5);
+
+ /* Initialize write buffer */
+ for(i=0, tbuf=wbuf; i<SPACE5_DIM1; i++)
+ for(j=0; j<SPACE5_DIM2; j++)
+ for(k=0; k<SPACE5_DIM3; k++)
+ for(l=0; l<SPACE5_DIM4; l++)
+ for(m=0; m<SPACE5_DIM4; m++)
+ *tbuf++=(int)(((((((i*SPACE4_DIM2)+j)*SPACE4_DIM3)+k)*SPACE5_DIM4)+l)*SPACE5_DIM5)+m;
+
+ /* Create file */
+ fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ CHECK(fid1, FAIL, "H5Fcreate");
+
+ /* Create dataspace for dataset on disk */
+ sid1 = H5Screate_simple(SPACE5_RANK, dims1, NULL);
+ CHECK(sid1, FAIL, "H5Screate_simple");
+
+ /* Create a dataset */
+ dataset=H5Dcreate(fid1,"Dataset1",H5T_NATIVE_INT,sid1,H5P_DEFAULT);
+ CHECK(dataset, FAIL, "H5Dcreate");
+
+ /* Write entire dataset to disk */
+ ret=H5Dwrite(dataset,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf);
+ CHECK(ret, FAIL, "H5Dwrite");
+
+ /* Create dataspace for reading buffer */
+ sid2 = H5Screate_simple(SPACE6_RANK, dims2, NULL);
+ CHECK(sid2, FAIL, "H5Screate_simple");
+
+ /* Get initial random # seed */
+ seed=(unsigned)time(NULL)+(unsigned)clock();
+
+ /* Crunch through a bunch of random hyperslab reads from the file dataset */
+ for(test_num=0; test_num<NRAND_HYPER; test_num++) {
+ /* Save random # seed for later use */
+ /* (Used in case of errors, to regenerate the hyperslab sequence) */
+ seed+=(unsigned)clock();
+ srand(seed);
+
+#ifdef QAK
+printf("test_num=%d, seed=%u\n",test_num,seed);
+#endif /* QAK */
+ for(i=0; i<NHYPERSLABS; i++) {
+#ifdef QAK
+printf("hyperslab=%d\n",i);
+#endif /* QAK */
+ /* Select random hyperslab location & size for selection */
+ for(j=0; j<SPACE5_RANK; j++) {
+ start[j]=rand()%dims1[j];
+ count[j]=(rand()%(dims1[j]-start[j]))+1;
+#ifdef QAK
+printf("start[%d]=%d, count[%d]=%d\n",j,(int)start[j],j,(int)count[j]);
+#endif /* QAK */
+ } /* end for */
+
+ /* Select hyperslab */
+ ret = H5Sselect_hyperslab(sid1,(i==0 ? H5S_SELECT_SET : H5S_SELECT_OR),start,NULL,count,NULL);
+ CHECK(ret, FAIL, "H5Sselect_hyperslab");
+ } /* end for */
+
+ /* Get the number of elements selected */
+ npoints=H5Sget_select_npoints(sid1);
+ CHECK(npoints, 0, "H5Sget_select_npoints");
+
+ /* Select linear 1-D hyperslab for memory dataset */
+ start[0]=0;
+ count[0]=npoints;
+ ret = H5Sselect_hyperslab(sid2,H5S_SELECT_SET,start,NULL,count,NULL);
+ CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+ npoints2 = H5Sget_select_npoints(sid2);
+ VERIFY(npoints, npoints2, "H5Sget_select_npoints");
+
+ /* Read selection from disk */
+ ret=H5Dread(dataset,H5T_NATIVE_INT,sid2,sid1,H5P_DEFAULT,rbuf);
+ CHECK(ret, FAIL, "H5Dread");
+
+ /* Compare data read with data written out */
+ tbuf=rbuf;
+ ret = H5Diterate(wbuf,H5T_NATIVE_INT,sid1,test_select_hyper_iter2,&tbuf);
+ if(ret<0) {
+ num_errs++;
+ printf("Random hyperslabs for seed %u failed!\n",seed);
+ }
+
+ /* Set the read buffer back to all zeroes */
+ memset(rbuf,0,SPACE6_DIM1);
+ } /* end for */
+
+ /* Close memory dataspace */
+ ret = H5Sclose(sid2);
+ CHECK(ret, FAIL, "H5Sclose");
+
+ /* Close disk dataspace */
+ ret = H5Sclose(sid1);
+ CHECK(ret, FAIL, "H5Sclose");
+
+ /* Close Dataset */
+ ret = H5Dclose(dataset);
+ CHECK(ret, FAIL, "H5Dclose");
+
+ /* Close file */
+ ret = H5Fclose(fid1);
+ CHECK(ret, FAIL, "H5Fclose");
+
+ /* Free memory buffers */
+ free(wbuf);
+ free(rbuf);
+} /* test_select_hyper_union_random_5d() */
+
+/****************************************************************
+**
** test_select(): Main H5S selection testing routine.
**
****************************************************************/
@@ -2478,6 +2671,7 @@ test_select(void)
test_select_hyper_union(); /* Test hyperslab union code */
test_select_hyper_union_stagger(); /* Test hyperslab union code for staggered slabs */
test_select_hyper_union_3d(); /* Test hyperslab union code for 3-D dataset */
+ test_select_hyper_union_random_5d(); /* Test hyperslab union code for random 5-D hyperslabs */
} /* test_select() */