From eb784ecd693a54c2153d8b9eb6ddbec88613b802 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 14 Jul 1998 22:47:39 -0500 Subject: [svn-r495] Finished debugging element selections. H5Sselect_elements call now working correctly (as opposed to not at all... :-) --- src/H5Spoint.c | 163 ++++++++++++++++++++++++++++++++++++++++++------------- src/H5Sprivate.h | 2 +- src/H5Spublic.h | 2 +- src/H5Sselect.c | 4 +- src/H5Ssimp.c | 2 +- src/H5public.h | 2 +- test/tselect.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 277 insertions(+), 43 deletions(-) diff --git a/src/H5Spoint.c b/src/H5Spoint.c index 304ee00..e3fccd8 100644 --- a/src/H5Spoint.c +++ b/src/H5Spoint.c @@ -43,6 +43,9 @@ H5S_point_init (const struct H5O_layout_t __unused__ *layout, assert (space && H5S_SEL_POINTS==space->select.type); assert (sel_iter); +#ifdef QAK +printf("%s: check 1.0\n",FUNC); +#endif /* QAK */ /* Initialize the number of points to iterate over */ sel_iter->pnt.elmt_left=space->select.num_elem; @@ -71,9 +74,10 @@ H5S_point_init (const struct H5O_layout_t __unused__ *layout, EXAMPLES REVISION LOG --------------------------------------------------------------------------*/ -herr_t H5S_point_add (H5S_t *space, size_t num_elem, const hssize_t *coord[]) +herr_t H5S_point_add (H5S_t *space, size_t num_elem, const hssize_t **_coord) { H5S_pnt_node_t *top, *curr, *new; /* Point selection nodes */ + const hssize_t *coord=(const hssize_t *)_coord; /* Pointer to the actual coordinates */ uintn i; /* Counter */ herr_t ret_value=FAIL; /* return value */ @@ -83,18 +87,39 @@ herr_t H5S_point_add (H5S_t *space, size_t num_elem, const hssize_t *coord[]) assert(num_elem>0); assert(coord); +#ifdef QAK +printf("%s: check 1.0\n",FUNC); +#endif /* QAK */ top=curr=NULL; for(i=0; iextent.u.simple.rank); +#endif /* QAK */ if((new->pnt = H5MM_malloc(space->extent.u.simple.rank*sizeof(hssize_t)))==NULL) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate coordinate information"); +#ifdef QAK +printf("%s: check 1.2\n",FUNC); +#endif /* QAK */ /* Copy over the coordinates */ - HDmemcpy(new->pnt,coord[i],(space->extent.u.simple.rank*sizeof(hssize_t))); + HDmemcpy(new->pnt,coord+(i*space->extent.u.simple.rank),(space->extent.u.simple.rank*sizeof(hssize_t))); +#ifdef QAK +printf("%s: check 1.3\n",FUNC); + { + intn j; + + for(j=0; jextent.u.simple.rank; j++) { + printf("%s: pnt[%d]=%d\n",FUNC,(int)j,(int)new->pnt[j]); + printf("%s: coord[%d][%d]=%d\n",FUNC,(int)i,(int)j,(int)*(coord+(i*space->extent.u.simple.rank)+j)); + } + } +#endif /* QAK */ /* Link into list */ new->next=NULL; @@ -104,6 +129,9 @@ herr_t H5S_point_add (H5S_t *space, size_t num_elem, const hssize_t *coord[]) curr->next=new; curr=new; } /* end for */ +#ifdef QAK +printf("%s: check 2.0\n",FUNC); +#endif /* QAK */ /* Append current list, if there is one */ if(space->select.sel_info.pnt_lst->head!=NULL) @@ -112,7 +140,13 @@ herr_t H5S_point_add (H5S_t *space, size_t num_elem, const hssize_t *coord[]) /* Put new list in point selection */ space->select.sel_info.pnt_lst->head=top; + /* Add the number of elements in the new selection */ + space->select.num_elem+=num_elem; + ret_value=SUCCEED; +#ifdef QAK +printf("%s: check 3.0\n",FUNC); +#endif /* QAK */ done: FUNC_LEAVE (ret_value); @@ -141,6 +175,9 @@ H5S_point_favail (const H5S_t __unused__ *space, const H5S_sel_iter_t *sel_iter, assert (space && H5S_SEL_POINTS==space->select.type); assert (sel_iter); +#ifdef QAK +printf("%s: check 1.0, ret=%d\n",FUNC,(int)MIN(sel_iter->pnt.elmt_left,max)); +#endif /* QAK */ FUNC_LEAVE (MIN(sel_iter->pnt.elmt_left,max)); } /* H5S_point_favail() */ @@ -196,6 +233,9 @@ H5S_point_fgath (H5F_t *f, const struct H5O_layout_t *layout, assert (nelmts>0); assert (buf); +#ifdef QAK +printf("%s: check 1.0\n",FUNC); +#endif /* QAK */ /* initialize hyperslab size and offset in memory buffer */ for(i=0; indims; i++) { hsize[i]=1; /* hyperslab size is 1, except for last element */ @@ -208,7 +248,7 @@ H5S_point_fgath (H5F_t *f, const struct H5O_layout_t *layout, while(num_readpnt.elmt_left>0) { /* Copy the location of the point to get */ - HDmemcpy(file_offset,file_iter->pnt.curr->pnt,layout->ndims); + HDmemcpy(file_offset,file_iter->pnt.curr->pnt,layout->ndims*sizeof(hssize_t)); file_offset[layout->ndims] = 0; /* Go read the point */ @@ -217,6 +257,16 @@ H5S_point_fgath (H5F_t *f, const struct H5O_layout_t *layout, HRETURN_ERROR (H5E_DATASPACE, H5E_READERROR, 0, "read error"); } +#ifdef QAK +printf("%s: check 3.0\n",FUNC); + { + for(i=0; indims; i++) { + printf("%s: %d - pnt=%d\n",FUNC,(int)i,(int)file_iter->pnt.curr->pnt[i]); + printf("%s: %d - file_offset=%d\n",FUNC,(int)i,(int)file_offset[i]); + } +printf("%s: *buf=%u\n",FUNC,(unsigned)*buf); + } +#endif /* QAK */ /* Increment the offset of the buffer */ buf+=elmt_size; @@ -279,6 +329,9 @@ H5S_point_fscat (H5F_t *f, const struct H5O_layout_t *layout, assert (nelmts>0); assert (buf); +#ifdef QAK +printf("%s: check 1.0, layout->ndims=%d\n",FUNC,(int)layout->ndims); +#endif /* QAK */ /* initialize hyperslab size and offset in memory buffer */ for(i=0; indims; i++) { hsize[i]=1; /* hyperslab size is 1, except for last element */ @@ -288,30 +341,47 @@ H5S_point_fscat (H5F_t *f, const struct H5O_layout_t *layout, /* Walk though and request each element we need and put it into the buffer */ num_written=0; - while(num_writtenpnt.elmt_left>0) { - /* Copy the location of the point to get */ - HDmemcpy(file_offset,file_iter->pnt.curr->pnt,layout->ndims); - file_offset[layout->ndims] = 0; - - /* Go read the point */ - if (H5F_arr_write (f, layout, comp, efl, hsize, hsize, zero, file_offset, - xfer_mode, buf)<0) { - HRETURN_ERROR (H5E_DATASPACE, H5E_READERROR, 0, "read error"); - } - - /* Increment the offset of the buffer */ - buf+=elmt_size; - - /* Increment the count read */ - num_written++; - - /* Advance the point iterator */ - file_iter->pnt.elmt_left--; - file_iter->pnt.curr=file_iter->pnt.curr->next; - } else { - break; /* out of elements in the selection */ - } /* end else */ + while(num_writtenpnt.elmt_left>0) { +#ifdef QAK +printf("%s: check 2.0\n",FUNC); + { + for(i=0; indims; i++) { + printf("%s: %d - pnt=%d\n",FUNC,(int)i,(int)file_iter->pnt.curr->pnt[i]); + } + } +#endif /* QAK */ + /* Copy the location of the point to get */ + HDmemcpy(file_offset,file_iter->pnt.curr->pnt,layout->ndims*sizeof(hssize_t)); + file_offset[layout->ndims] = 0; + +#ifdef QAK +printf("%s: check 3.0\n",FUNC); + { + for(i=0; indims; i++) { + printf("%s: %d - pnt=%d\n",FUNC,(int)i,(int)file_iter->pnt.curr->pnt[i]); + printf("%s: %d - file_offset=%d\n",FUNC,(int)i,(int)file_offset[i]); + } +printf("%s: *buf=%u\n",FUNC,(unsigned)*buf); + } +#endif /* QAK */ + /* Go write the point */ + if (H5F_arr_write (f, layout, comp, efl, hsize, hsize, zero, file_offset, + xfer_mode, buf)<0) { + HRETURN_ERROR (H5E_DATASPACE, H5E_WRITEERROR, 0, "write error"); + } + + /* Increment the offset of the buffer */ + buf+=elmt_size; + + /* Increment the count read */ + num_written++; + + /* Advance the point iterator */ + file_iter->pnt.elmt_left--; + file_iter->pnt.curr=file_iter->pnt.curr->next; +#ifdef QAK +printf("%s: check 5.0, file_iter->pnt.curr=%p\n",FUNC,file_iter->pnt.curr); +#endif } /* end while */ FUNC_LEAVE (num_written); @@ -345,7 +415,8 @@ H5S_point_mgath (const void *_buf, size_t elmt_size, hsize_t mem_size[H5O_LAYOUT_NDIMS]; /*total size of app buf */ const uint8 *buf=(const uint8 *)_buf; /* Get local copies for address arithmetic */ uint8 *tconv_buf=(uint8 *)_tconv_buf; - hsize_t acc; /*accumulator */ + hsize_t acc; /* coordinate accumulator */ + hsize_t off; /* coordinate offset */ intn space_ndims; /*dimensionality of space*/ intn i; /*counters */ size_t num_gath; /* number of elements gathered */ @@ -359,6 +430,9 @@ H5S_point_mgath (const void *_buf, size_t elmt_size, assert (nelmts>0); assert (tconv_buf); +#ifdef QAK +printf("%s: check 1.0\n",FUNC); +#endif /* QAK */ if ((space_ndims=H5S_extent_dims (mem_space, mem_size, NULL))<0) { HRETURN_ERROR (H5E_DATASPACE, H5E_CANTINIT, 0, "unable to retrieve data space dimensions"); @@ -367,11 +441,16 @@ H5S_point_mgath (const void *_buf, size_t elmt_size, for(num_gath=0; num_gathpnt.elmt_left>0) { /* Compute the location of the point to get */ - for(i=0,acc=0; ipnt.curr->pnt[i]; - + for(i=space_ndims-1,acc=1,off=0; i>=0; i--) { + off+=mem_iter->pnt.curr->pnt[i]*acc; + acc*=mem_size[i]; + } /* end for */ + +#ifdef QAK +printf("%s: check 2.0, acc=%d, off=%d\n",FUNC,(int)acc,(int)off); +#endif /* QAK */ /* Copy the elements into the type conversion buffer */ - *tconv_buf=*(buf+acc); + HDmemcpy(tconv_buf,buf+off,elmt_size); /* Increment the offset of the buffers */ tconv_buf+=elmt_size; @@ -414,8 +493,9 @@ H5S_point_mscat (const void *_tconv_buf, size_t elmt_size, hsize_t mem_size[H5O_LAYOUT_NDIMS]; /*total size of app buf */ uint8 *buf=(uint8 *)_buf; /* Get local copies for address arithmetic */ const uint8 *tconv_buf=(const uint8 *)_tconv_buf; - hsize_t acc; /*accumulator */ - intn space_ndims; /*dimensionality of space*/ + hsize_t acc; /* coordinate accumulator */ + hsize_t off; /* coordinate offset */ + intn space_ndims; /*dimensionality of space*/ intn i; /*counters */ size_t num_scat; /* Number of elements scattered */ @@ -428,6 +508,9 @@ H5S_point_mscat (const void *_tconv_buf, size_t elmt_size, assert (nelmts>0); assert (buf); +#ifdef QAK +printf("%s: check 1.0\n",FUNC); +#endif /* QAK */ /* * Retrieve hyperslab information to determine what elements are being * selected (there might be other selection methods in the future). We @@ -442,11 +525,13 @@ H5S_point_mscat (const void *_tconv_buf, size_t elmt_size, for(num_scat=0; num_scatpnt.elmt_left>0) { /* Compute the location of the point to get */ - for(i=0,acc=0; ipnt.curr->pnt[i]; + for(i=space_ndims-1,acc=1,off=0; i>=0; i--) { + off+=mem_iter->pnt.curr->pnt[i]*acc; + acc*=mem_size[i]; + } /* end for */ /* Copy the elements into the type conversion buffer */ - *(buf+acc)=*tconv_buf; + HDmemcpy(buf+off,tconv_buf,elmt_size); /* Increment the offset of the buffers */ tconv_buf+=elmt_size; @@ -497,6 +582,9 @@ H5S_point_release (H5S_t *space) curr=next; } /* end while */ + /* Reset the number of elements in the selection */ + space->select.num_elem=0; + FUNC_LEAVE (SUCCEED); } /* H5S_point_release() */ @@ -527,3 +615,4 @@ H5S_hyper_npoints (const H5S_t *space) FUNC_LEAVE (space->select.num_elem); } /* H5S_hyper_npoints() */ + diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h index dcae464..2c0dfa2 100644 --- a/src/H5Sprivate.h +++ b/src/H5Sprivate.h @@ -281,7 +281,7 @@ size_t H5S_point_mgath (const void *_buf, size_t elmt_size, herr_t H5S_point_mscat (const void *_tconv_buf, size_t elmt_size, const H5S_t *mem_space, H5S_sel_iter_t *mem_iter, size_t nelmts, void *_buf/*out*/); -herr_t H5S_point_add (H5S_t *space, size_t num_elemn, const hssize_t *coord[]); +herr_t H5S_point_add (H5S_t *space, size_t num_elemn, const hssize_t **coord); herr_t H5S_point_release (H5S_t *space); hsize_t H5S_point_npoints (const H5S_t *space); diff --git a/src/H5Spublic.h b/src/H5Spublic.h index e0cc272..022f108 100644 --- a/src/H5Spublic.h +++ b/src/H5Spublic.h @@ -58,7 +58,7 @@ herr_t H5Sselect_hyperslab (hid_t spaceid, H5S_seloper_t op, const hssize_t *start, const hsize_t *_stride, const hsize_t *count, const hsize_t *_block); herr_t H5Sselect_elements (hid_t spaceid, H5S_seloper_t op, size_t num_elemn, - const hssize_t *coord[]); + const hssize_t **coord); #ifdef __cplusplus } diff --git a/src/H5Sselect.c b/src/H5Sselect.c index 83e6b38..28197a8 100644 --- a/src/H5Sselect.c +++ b/src/H5Sselect.c @@ -319,7 +319,7 @@ done: hid_t dsid; IN: Dataspace ID of selection to modify H5S_seloper_t op; IN: Operation to perform on current selection size_t num_elem; IN: Number of elements in COORD array. - const hssize_t *coord[]; IN: The location of each element selected + const hssize_t **coord; IN: The location of each element selected RETURNS SUCCEED/FAIL DESCRIPTION @@ -340,7 +340,7 @@ done: REVISION LOG --------------------------------------------------------------------------*/ herr_t H5Sselect_elements (hid_t spaceid, H5S_seloper_t op, size_t num_elem, - const hssize_t *coord[]) + const hssize_t **coord) { H5S_t *space = NULL; /* Dataspace to modify selection of */ herr_t ret_value=FAIL; /* return value */ diff --git a/src/H5Ssimp.c b/src/H5Ssimp.c index fda83e1..8f1844c 100644 --- a/src/H5Ssimp.c +++ b/src/H5Ssimp.c @@ -251,7 +251,7 @@ H5S_simp_mscat (const void *tconv_buf, size_t elmt_size, "hyperslab sampling is not implemented yet"); } } - if (H5S_get_dims (mem_space, mem_size, NULL)<0) { + if (H5S_extent_dims (mem_space, mem_size, NULL)<0) { HRETURN_ERROR (H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to retrieve data space dimensions"); } diff --git a/src/H5public.h b/src/H5public.h index 3cd58df..c5a6661 100644 --- a/src/H5public.h +++ b/src/H5public.h @@ -27,7 +27,7 @@ /* Version numbers */ #define H5_VERS_MAJOR 1 /* For major interface changes */ #define H5_VERS_MINOR 0 /* For minor interface changes */ -#define H5_VERS_RELEASE 17 /* For interface tweaks & bug-fixes */ +#define H5_VERS_RELEASE 19 /* For interface tweaks & bug-fixes */ #define H5_VERS_PATCH 0 /* For small groups of bug fixes */ #define H5check() H5vers_check(H5_VERS_MAJOR,H5_VERS_MINOR,\ diff --git a/test/tselect.c b/test/tselect.c index 3edd9b5..ce2c936 100644 --- a/test/tselect.c +++ b/test/tselect.c @@ -49,6 +49,9 @@ static char RcsId[] = "$Revision$"; #define SPACE3_DIM1 15 #define SPACE3_DIM2 26 +/* Element selection information */ +#define POINT1_NPOINTS 10 + /**************************************************************** ** ** test_select_hyper(): Test basic H5S (dataspace) selection code. @@ -176,6 +179,147 @@ test_select_hyper(void) /**************************************************************** ** +** test_select_point(): Test basic H5S (dataspace) selection code. +** Tests element selections between dataspaces of various sizes +** and dimensionalities. +** +****************************************************************/ +static void +test_select_point(void) +{ + hid_t fid1; /* HDF5 File IDs */ + hid_t dataset; /* Dataset ID */ + hid_t sid1,sid2; /* Dataspace ID */ + hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; + hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; + hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; + hssize_t coord1[POINT1_NPOINTS][SPACE1_RANK]; /* Coordinates for point selection */ + hssize_t coord2[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */ + hssize_t coord3[POINT1_NPOINTS][SPACE3_RANK]; /* Coordinates for point selection */ + uint8 *wbuf, /* buffer to write to disk */ + *rbuf, /* buffer read from disk */ + *tbuf, /* temporary buffer pointer */ + *tbuf2; /* temporary buffer pointer */ + intn i,j; /* Counters */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Element Selection Functions\n")); + + /* Allocate write & read buffers */ + wbuf=malloc(sizeof(uint8)*SPACE2_DIM1*SPACE2_DIM2); + rbuf=calloc(sizeof(uint8),SPACE3_DIM1*SPACE3_DIM2); + + /* Initialize write buffer */ + for(i=0, tbuf=wbuf; i