summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2009-07-21 19:28:34 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2009-07-21 19:28:34 (GMT)
commitf383c2a622990b3164c45ac09dc9e8f2f64fe7dd (patch)
tree97852c46af801e5f0f3d97b119bbb4791413b67e /src
parente117aee161db792d2dd9ee9f235f95803feb9178 (diff)
downloadhdf5-f383c2a622990b3164c45ac09dc9e8f2f64fe7dd.zip
hdf5-f383c2a622990b3164c45ac09dc9e8f2f64fe7dd.tar.gz
hdf5-f383c2a622990b3164c45ac09dc9e8f2f64fe7dd.tar.bz2
[svn-r17209] Description:
Intermediate checkin for getting extensible array code working with 2+ dimension datasets that have only 1 unlimited dimension. This code is working with n-dimension cases, but only when the slowest changing dimension is unlimited. Generalization to n-dimension with any [single] dimension being unlimited is forthcoming. Tested on: FreeBSD/32 6.3 (duty) in debug mode FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode Linux/32 2.6 (jam) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe, in debug mode Linux/64-amd64 2.6 (smirom) w/Intel compilers w/default API=1.6.x, w/C++ & FORTRAN, in production mode Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN, w/szip filter, in production mode Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN, in production mode Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in debug mode Linux/64-amd64 2.6 (abe) w/parallel, w/FORTRAN, in production mode Mac OS X/32 10.5.7 (amazon) in debug mode Mac OS X/32 10.5.7 (amazon) w/C++ & FORTRAN, w/threadsafe, in production mode
Diffstat (limited to 'src')
-rw-r--r--src/H5Dearray.c27
-rw-r--r--src/H5Olayout.c5
-rw-r--r--src/H5V.c69
-rw-r--r--src/H5Vprivate.h2
4 files changed, 72 insertions, 31 deletions
diff --git a/src/H5Dearray.c b/src/H5Dearray.c
index a03f624..9379a87 100644
--- a/src/H5Dearray.c
+++ b/src/H5Dearray.c
@@ -931,7 +931,6 @@ H5D_earray_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
HDassert(idx_info->f);
HDassert(idx_info->pline);
HDassert(idx_info->layout);
- HDassert(idx_info->layout->u.chunk.ndims == 2); /* (for now) */
HDassert(H5F_addr_defined(idx_info->layout->u.chunk.u.earray.addr));
HDassert(udata);
@@ -945,8 +944,9 @@ H5D_earray_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
/* Set convenience pointer to extensible array structure */
ea = idx_info->layout->u.chunk.u.earray.ea;
- /* Compute array index for chunk offset */
- idx = udata->common.offset[0] / idx_info->layout->u.chunk.dim[0];
+ /* Calculate the index of this chunk */
+ if(H5V_chunk_index((idx_info->layout->u.chunk.ndims - 1), udata->common.offset, idx_info->layout->u.chunk.dim, idx_info->layout->u.chunk.down_chunks, &idx) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
/* Check for filters on chunks */
if(idx_info->pline->nused > 0) {
@@ -1076,7 +1076,6 @@ H5D_earray_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udat
HDassert(idx_info->f);
HDassert(idx_info->pline);
HDassert(idx_info->layout);
- HDassert(idx_info->layout->u.chunk.ndims == 2); /* (for now) */
HDassert(H5F_addr_defined(idx_info->layout->u.chunk.u.earray.addr));
HDassert(udata);
@@ -1090,8 +1089,9 @@ H5D_earray_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udat
/* Set convenience pointer to extensible array structure */
ea = idx_info->layout->u.chunk.u.earray.ea;
- /* Compute array index for chunk offset */
- idx = udata->common.offset[0] / idx_info->layout->u.chunk.dim[0];
+ /* Calculate the index of this chunk */
+ if(H5V_chunk_index((idx_info->layout->u.chunk.ndims - 1), udata->common.offset, idx_info->layout->u.chunk.dim, idx_info->layout->u.chunk.down_chunks, &idx) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
/* Check for filters on chunks */
if(idx_info->pline->nused > 0) {
@@ -1273,8 +1273,9 @@ H5D_earray_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t
/* Set convenience pointer to extensible array structure */
ea = idx_info->layout->u.chunk.u.earray.ea;
- /* Compute array index for chunk offset */
- idx = udata->offset[0] / idx_info->layout->u.chunk.dim[0];
+ /* Calculate the index of this chunk */
+ if(H5V_chunk_index((idx_info->layout->u.chunk.ndims - 1), udata->offset, idx_info->layout->u.chunk.dim, idx_info->layout->u.chunk.down_chunks, &idx) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
/* Check for filters on chunks */
if(idx_info->pline->nused > 0) {
@@ -1636,8 +1637,9 @@ H5D_earray_idx_support(const H5D_chk_idx_info_t *idx_info,
/* Set convenience pointer to extensible array structure */
ea = idx_info->layout->u.chunk.u.earray.ea;
- /* Compute array index for chunk offset */
- idx = udata->offset[0] / idx_info->layout->u.chunk.dim[0];
+ /* Calculate the index of this chunk */
+ if(H5V_chunk_index((idx_info->layout->u.chunk.ndims - 1), udata->offset, idx_info->layout->u.chunk.dim, idx_info->layout->u.chunk.down_chunks, &idx) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
/* Create flush dependency between the child_entry and the piece of metadata
* in the extensible array that contains the entry for this chunk.
@@ -1688,8 +1690,9 @@ H5D_earray_idx_unsupport(const H5D_chk_idx_info_t *idx_info,
/* Set convenience pointer to extensible array structure */
ea = idx_info->layout->u.chunk.u.earray.ea;
- /* Compute array index for chunk offset */
- idx = udata->offset[0] / idx_info->layout->u.chunk.dim[0];
+ /* Calculate the index of this chunk */
+ if(H5V_chunk_index((idx_info->layout->u.chunk.ndims - 1), udata->offset, idx_info->layout->u.chunk.dim, idx_info->layout->u.chunk.down_chunks, &idx) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
/* Remove flush dependency between the child_entry and the piece of metadata
* in the extensible array that contains the entry for this chunk.
diff --git a/src/H5Olayout.c b/src/H5Olayout.c
index 83b8469..9807488 100644
--- a/src/H5Olayout.c
+++ b/src/H5Olayout.c
@@ -1048,8 +1048,9 @@ H5O_layout_set_latest_version(H5O_layout_t *layout, const H5S_t *space)
/* If we have only 1 unlimited dimension, we can use extensible array index */
if(1 == unlim_count) {
- /* Check for rank == 1 (>1 unsupported currently) */
- if(1 == ndims) {
+ /* Check for slowest changing dimension being unlimited */
+ /* (non-slowest-changing dim. not supported yet) */
+ if(max_dims[0] == H5S_UNLIMITED) {
/* Set the chunk index type */
layout->u.chunk.idx_type = H5D_CHUNK_IDX_EARRAY;
} /* end if */
diff --git a/src/H5V.c b/src/H5V.c
index 34cf714..48fa9ab 100644
--- a/src/H5V.c
+++ b/src/H5V.c
@@ -1132,6 +1132,47 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5V_array_calc_pre
+ *
+ * Purpose: Given a linear offset in an array, the dimensions of that
+ * array and the pre-computed 'down' (accumulator) sizes, this
+ * function computes the coordinates of that offset in the array.
+ *
+ * The dimensionality of the whole array, and the coordinates is N.
+ * The array dimensions are TOTAL_SIZE and the coordinates
+ * are returned in COORD. The linear offset is in OFFSET.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, July 16, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5V_array_calc_pre(hsize_t offset, unsigned n, const hsize_t *total_size,
+ const hsize_t *down, hsize_t *coords)
+{
+ unsigned u; /* Local index variable */
+
+ FUNC_ENTER_NOAPI_NOFUNC(H5V_array_calc_pre)
+
+ /* Sanity check */
+ HDassert(n <= H5V_HYPER_NDIMS);
+ HDassert(total_size);
+ HDassert(coords);
+
+ /* Compute the coordinates from the offset */
+ for(u = 0; u < n; u++) {
+ coords[u] = offset / down[u];
+ offset %= down[u];
+ } /* end for */
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5V_array_calc_pre() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5V_array_calc
*
* Purpose: Given a linear offset in an array and the dimensions of that
@@ -1155,31 +1196,25 @@ herr_t
H5V_array_calc(hsize_t offset, unsigned n, const hsize_t *total_size, hsize_t *coords)
{
hsize_t idx[H5V_HYPER_NDIMS]; /* Size of each dimension in bytes */
- hsize_t acc; /* Size accumulator */
- unsigned u; /* Local index variable */
- int i; /* Local index variable */
+ herr_t ret_value = SUCCEED; /* Return value */
- FUNC_ENTER_NOAPI_NOFUNC(H5V_array_calc)
+ FUNC_ENTER_NOAPI(H5V_array_calc, FAIL)
/* Sanity check */
- assert(n <= H5V_HYPER_NDIMS);
- assert(total_size);
- assert(coords);
+ HDassert(n <= H5V_HYPER_NDIMS);
+ HDassert(total_size);
+ HDassert(coords);
/* Build the sizes of each dimension in the array */
- /* (From fastest to slowest) */
- for(i=(int)(n-1),acc=1; i>=0; i--) {
- idx[i]=acc;
- acc *= total_size[i];
- } /* end for */
+ if(H5V_array_down(n, total_size, idx) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "can't compute down sizes")
/* Compute the coordinates from the offset */
- for(u=0; u<n; u++) {
- coords[u]=offset/idx[u];
- offset %= idx[u];
- } /* end for */
+ if(H5V_array_calc_pre(offset, n, total_size, idx, coords) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "can't compute coordinates")
- FUNC_LEAVE_NOAPI(SUCCEED)
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
} /* end H5V_array_calc() */
diff --git a/src/H5Vprivate.h b/src/H5Vprivate.h
index 1dec0c0..e351f86 100644
--- a/src/H5Vprivate.h
+++ b/src/H5Vprivate.h
@@ -83,6 +83,8 @@ H5_DLL hsize_t H5V_array_offset_pre(unsigned n,
const hsize_t *acc, const hsize_t *offset);
H5_DLL hsize_t H5V_array_offset(unsigned n, const hsize_t *total_size,
const hsize_t *offset);
+H5_DLL herr_t H5V_array_calc_pre(hsize_t offset, unsigned n, const hsize_t *total_size,
+ const hsize_t *down, hsize_t *coords);
H5_DLL herr_t H5V_array_calc(hsize_t offset, unsigned n,
const hsize_t *total_size, hsize_t *coords);
H5_DLL herr_t H5V_chunk_index(unsigned ndims, const hsize_t *coord,