diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2009-07-21 19:28:34 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2009-07-21 19:28:34 (GMT) |
commit | f383c2a622990b3164c45ac09dc9e8f2f64fe7dd (patch) | |
tree | 97852c46af801e5f0f3d97b119bbb4791413b67e /src | |
parent | e117aee161db792d2dd9ee9f235f95803feb9178 (diff) | |
download | hdf5-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.c | 27 | ||||
-rw-r--r-- | src/H5Olayout.c | 5 | ||||
-rw-r--r-- | src/H5V.c | 69 | ||||
-rw-r--r-- | src/H5Vprivate.h | 2 |
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 */ @@ -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, |