diff options
-rw-r--r-- | hl/src/H5LR.c | 2184 | ||||
-rw-r--r-- | hl/src/H5LT.c | 945 |
2 files changed, 1533 insertions, 1596 deletions
diff --git a/hl/src/H5LR.c b/hl/src/H5LR.c index 915d906..7fb39ad 100644 --- a/hl/src/H5LR.c +++ b/hl/src/H5LR.c @@ -51,7 +51,7 @@ hid_t H5_MY_PKG_ERR; /********************/ /* Package Typedefs */ /********************/ -#define AT() printf (" at %s:%d in %s()...\n", \ +#define AT() printf(" at %s:%d in %s()...\n", \ __FILE__, __LINE__, __FUNCTION__); #define H5_FAILED() {puts("*FAILED*");fflush(stdout);} #define TEST_ERROR {H5_FAILED(); AT(); goto error;} @@ -59,9 +59,9 @@ hid_t H5_MY_PKG_ERR; /********************/ /* Local Prototypes */ /********************/ -static herr_t op_func_L (hid_t loc_id, const char *name, const H5L_info_t *info, void *operator_data); +static herr_t op_func_L(hid_t loc_id, const char *name, const H5L_info_t *info, void *operator_data); -static herr_t op_func (hid_t loc_id, const char *name, const H5O_info_t *info, void *operator_data); +static herr_t op_func(hid_t loc_id, const char *name, const H5O_info_t *info, void *operator_data); /*********************/ /* Package Variables */ @@ -79,10 +79,15 @@ hbool_t H5_H5LR_init_g = FALSE; /* Local Variables */ /*******************/ -/* USED BY HL API: H5LRcreate_regref_to_all */ -static size_t _regref_to_all_start; /* starting index counter for placing data into 1D array, used by H5LRcreate_regref_to_all */ -static hsize_t _regref_to_all_size; /* size of the 1D array needed to hold all the region references created by H5LRcreate_regref_to_all */ -static H5R_type_t _regref_type; /* type of data to create region references for */ +/* THE FOLLOWING ARE USED BY HL API: H5LRcreate_regref_to_all */ + +/* starting index counter for placing region references into 1D array, used by H5LRcreate_regref_to_all */ +static size_t _regref_to_all_start; +/* size of the 1D array needed to hold all the region references created by H5LRcreate_regref_to_all */ +static hsize_t _regref_to_all_size; +/* type of data to create region references for */ +static H5R_type_t _regref_type; + /*------------------------------------------------------------------------- * * Private functions @@ -93,85 +98,80 @@ static H5R_type_t _regref_type; /* type of data to create region reference /************************************************************ Operator function used by HL API H5LRcreate_regref_to_all: - (1) Sums the number of elements in each region reference + (1) Finds the size (_regref_to_all_size) of the array needed to hold the + region references by finding: the number of datasets + (for _regref_type == H5R_DATASET_REGION) or number of objects + (for _regref_type == H5R_OBJECT). This case (1) is run if operator_data is NULL. - (2) Reads the data from the region references into a - 1D array (operator_data) if operator_data is not NULL. + (2) Makes the array of region references pointing to either + datasets or objects (depending on _regref_type). This case (2) + is run if operator_data is NOT NULL. ************************************************************/ static herr_t -op_func (hid_t loc_id, const char *name, const H5O_info_t *info, void *operator_data) +op_func(hid_t loc_id, const char *name, const H5O_info_t *info, void *operator_data) { herr_t status; - hid_t dtype_id=-1, sid=-1; - hid_t obj_id=-1; + hid_t dtype_id = -1, space = -1; + hid_t obj_id = -1; size_t numel_size; const hdset_reg_ref_t *regref; hobj_ref_t regref_obj; -/* hdset_reg_ref_t *ref_out; */ - -/* if( (obj_id = H5Oopen(loc_id, name, H5P_DEFAULT)) < 0 ) */ -/* goto out; */ - - -/* /\* check to see if object is a dataset *\/ */ -/* if(H5Iget_type(dset) == H5I_DATASET) { */ if(_regref_type == H5R_DATASET_REGION) { - - if(info->type == H5O_TYPE_DATASET) { - - /* getting the size of the region reference buffer */ - if(operator_data==NULL) { - _regref_to_all_size += 1; - return 0; - } else { - /* Open the dataset for a given the path */ - if( ( dtype_id = H5Dopen2(loc_id, name, H5P_DEFAULT) ) < 0) goto out; + if(info->type == H5O_TYPE_DATASET) { + /* getting the size of the region reference buffer */ + if(operator_data == NULL) { + _regref_to_all_size += 1; + return 0; + } /* end if */ + else { + /* Open the dataset for a given the path */ + if((dtype_id = H5Dopen2(loc_id, name, H5P_DEFAULT) ) < 0) goto out; - /* Get the dataspace of the dataset */ - if( ( sid = H5Dget_space(dtype_id) ) < 0) goto out; + /* Get the dataspace of the dataset */ + if((space = H5Dget_space(dtype_id) ) < 0) goto out; - /* Select the entire extent of the dataspace */ - if( H5Sselect_all( sid ) < 0 ) goto out; + /* Select the entire extent of the dataspace */ + if(H5Sselect_all(space ) < 0 ) goto out; - /* Store dataset region */ - regref = ((const hdset_reg_ref_t *)operator_data) + _regref_to_all_start; - status = H5Rcreate(regref, loc_id, name, H5R_DATASET_REGION, sid); + /* Store dataset region */ + regref =((const hdset_reg_ref_t *)operator_data) + _regref_to_all_start; + status = H5Rcreate(regref, loc_id, name, H5R_DATASET_REGION, space); - _regref_to_all_start += 1; + _regref_to_all_start += 1; - if(H5Dclose(dtype_id) != 0) goto out; - dtype_id = -1; - if(H5Sclose(sid) != 0) goto out; - sid = -1; - } - } /* if dataset */ - } else if(_regref_type == H5R_OBJECT) { - - /* getting the size of the region reference buffer */ - if(operator_data==NULL) { - _regref_to_all_size += 1; - return 0; - } else { - - /* Store the object region reference */ - regref_obj = ((const hobj_ref_t *)operator_data) + _regref_to_all_start; - status = H5Rcreate(regref_obj, loc_id, name, H5R_OBJECT, -1); + if(H5Dclose(dtype_id) != 0) goto out; + dtype_id = -1; + if(H5Sclose(space) != 0) goto out; + space = -1; + } /* end else */ + } /* end if */ + } /* end if */ + else if(_regref_type == H5R_OBJECT) { + /* getting the size of the region reference buffer */ + if(operator_data == NULL) { + _regref_to_all_size += 1; + return 0; + } /* end if */ + else { + /* Store the object region reference */ + regref_obj = ((const hobj_ref_t *)operator_data) + _regref_to_all_start; + status = H5Rcreate(regref_obj, loc_id, name, H5R_OBJECT, -1); - _regref_to_all_start += 1; + _regref_to_all_start += 1; - } - } /* if dataset */ + } /* end else */ + } /* end else if */ return 0; out: if(dtype_id > 0) H5Dclose(dtype_id); - if(sid > 0) - H5Sclose(sid); + if(space > 0) + H5Sclose(space); return -2; } @@ -186,29 +186,20 @@ op_func (hid_t loc_id, const char *name, const H5O_info_t *info, void *operator_ ************************************************************/ static herr_t -op_func_L (hid_t loc_id, const char *name, const H5L_info_t *info, void *operator_data) +op_func_L(hid_t loc_id, const char *name, const H5L_info_t *info, void *operator_data) { - herr_t status; - H5O_info_t infobuf; - - /* - * Get type of the object and display its name and type. - * The name of the object is passed to this function by - * the Library. - */ - status = H5Oget_info_by_name (loc_id, name, &infobuf, H5P_DEFAULT); - if(status < 0) return -1; - -/* if(infobuf->type == H5O_TYPE_DATASET) { */ -/* if(operator_data==NULL) { */ -/* _regref_to_all_size += 1; */ -/* status = 0; */ -/* }else { */ -/* status = op_func (loc_id, name, &infobuf, operator_data); */ -/* } */ -/* } */ - - return op_func (loc_id, name, &infobuf, operator_data); + herr_t status; + H5O_info_t infobuf; + + /* + * Get type of the object and display its name and type. + * The name of the object is passed to this function by + * the Library. + */ + status = H5Oget_info_by_name(loc_id, name, &infobuf, H5P_DEFAULT); + if(status < 0) return -1; + + return op_func(loc_id, name, &infobuf, operator_data); } @@ -226,12 +217,10 @@ op_func_L (hid_t loc_id, const char *name, const H5L_info_t *info, void *operato * *------------------------------------------------------------------------- */ - BEGIN_FUNC(PKGINIT, ERR, herr_t, SUCCEED, FAIL, H5LR__pkg_init(void)) - END_FUNC(PKGINIT) /*------------------------------------------------------------------------- @@ -257,110 +246,102 @@ END_FUNC(PKGINIT) */ BEGIN_FUNC(PUB, ERR, herr_t, SUCCEED, FAIL, -H5LRget_region_info(hid_t obj_id, - const hdset_reg_ref_t *ref, - size_t *len, - char *path, - int *rank, - hid_t *dtype, - H5S_sel_type *sel_type, - size_t *numelem, - hsize_t *buf ) ) - - hid_t dset = -1, sid = -1; /* dataset and space id */ - - /* local variables needed in case user supplies NULL for the input quantity */ - H5S_sel_type sel_type_loc; - size_t numelem_loc = 0; - - herr_t status; /* state of the return value of api */ - hid_t current_stack_id = -1; /* current stack id */ - - /* Determine the rank of the space */ - sid = H5Rget_region(obj_id, H5R_DATASET_REGION, ref); - if(sid < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open region referenced") - - /* Try to open object */ - dset = H5Rdereference(obj_id, H5R_DATASET_REGION, ref); - if(dset < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open the dataset associated to region reference") - - /* Determine the type of the dataspace selection */ - sel_type_loc = H5Sget_select_type(sid); - if(sel_type) - *sel_type = sel_type_loc; - - /* get the number of elements */ - if(sel_type_loc==H5S_SEL_HYPERSLABS){ - numelem_loc = (size_t)H5Sget_select_hyper_nblocks(sid); - } else if(sel_type_loc==H5S_SEL_POINTS){ - numelem_loc = (size_t)H5Sget_select_npoints(sid); - } else - H5E_THROW(H5E_BADSELECT, "H5LR: Failed to find selection type") - - if(numelem) - *numelem = numelem_loc; - - if(numelem_loc == 0) - H5E_THROW(H5E_CANTCOUNT, "H5LR: Failed to count elements in dataspace") - - /* the dimensionality of the dataspace */ - if(rank) { - *rank = (int)H5Sget_simple_extent_ndims(sid); - if(*rank < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataset") - } - - /* get the data type */ - if(dtype) { - *dtype = (hid_t)H5Dget_type(dset); - if(*dtype < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the data type") - } - - /* Determine the size of the name buffer, with null character included */ - - if(!path) { - *len = (size_t)(1 + H5Iget_name (dset, NULL, (size_t)0)); - } - - if(path) { - /* Get the data set name the region reference points to */ - status = H5Iget_name (dset, path, *len); - if(status < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the name associated with the region reference") - } +H5LRget_region_info(hid_t obj_id, const hdset_reg_ref_t *ref, size_t *len, + char *path, int *rank, hid_t *dtype, H5S_sel_type *sel_type, + size_t *numelem,hsize_t *buf)) + + hid_t dset = -1; /* dataset id */ + hid_t space = -1; /* space id */ + + /* If user supplied NULL for sel_type or numelem we need to define local variables */ + H5S_sel_type sel_type_loc; /* Local copy of type of selection */ + size_t numelem_loc = 0; /* Number of coordinate blocks or selected elements */ + + herr_t status; /* State of the return value of api */ + hid_t current_stack_id = -1; /* Current stack id */ + + /* Set up a dataspace and selection as specified by a region reference */ + space = H5Rget_region(obj_id, H5R_DATASET_REGION, ref); + if(space < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open region referenced") - if(buf) { - /* get the corner coordinates of the hyperslab */ + /* Try to open object */ + dset = H5Rdereference(obj_id, H5R_DATASET_REGION, ref); + if(dset < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open the dataset associated to region reference") + + /* Determine the type of the dataspace selection */ + sel_type_loc = H5Sget_select_type(space); + if(sel_type) + *sel_type = sel_type_loc; + + /* get the number of elements */ if(sel_type_loc == H5S_SEL_HYPERSLABS) { - /* get the list of hyperslab blocks currently selected */ - status = H5Sget_select_hyper_blocklist(sid, (hsize_t)0, (hsize_t)1, buf); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") + numelem_loc = (size_t)H5Sget_select_hyper_nblocks(space); } else if(sel_type_loc == H5S_SEL_POINTS) { - /* get the list of elements currently selected */ - status = H5Sget_select_elem_pointlist(sid, (hsize_t)0, (hsize_t)1, buf); + numelem_loc = (size_t)H5Sget_select_npoints(space); + } else { + H5E_THROW(H5E_BADSELECT, "H5LR: Failed to find selection type") + } /* end if */ + + if(numelem) + *numelem = numelem_loc; + + if(numelem_loc == 0) + H5E_THROW(H5E_CANTCOUNT, "H5LR: Failed to count elements in dataspace") + + /* the dimensionality of the dataspace */ + if(rank) { + *rank = (int)H5Sget_simple_extent_ndims(space); + if(*rank < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataset") + } /* end if */ + + /* get the data type */ + if(dtype) { + *dtype = (hid_t)H5Dget_type(dset); + if(*dtype < 0) + H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the data type") + } /* end if */ + + /* Determine the size of the name buffer, with null character included */ + if(!path) + *len = (size_t)(1 + H5Iget_name(dset, NULL, (size_t)0)); + + if(path) { + /* Get the data set name the region reference points to */ + status = H5Iget_name(dset, path, *len); if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of selected elements") - } - } + H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the name associated with the region reference") + } /* end if */ + if(buf) { + /* get the corner coordinates of the hyperslab */ + if(sel_type_loc == H5S_SEL_HYPERSLABS) { + /* get the list of hyperslab blocks currently selected */ + status = H5Sget_select_hyper_blocklist(space, (hsize_t)0, (hsize_t)1, buf); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") + } /* end if */ + else if(sel_type_loc == H5S_SEL_POINTS) { + /* get the list of elements currently selected */ + status = H5Sget_select_elem_pointlist(space, (hsize_t)0, (hsize_t)1, buf); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of selected elements") + } /* end else if */ + } /* end if */ CATCH + current_stack_id = H5Eget_current_stack(); - current_stack_id = H5Eget_current_stack(); - - /* Close the dataspace */ - if(sid > 0) - status = H5Sclose(sid); + /* Close the dataspace */ + if(space > 0) + status = H5Sclose(space); - /* Close the dataset */ - if(dset > 0) - status = H5Dclose(dset); - - status = H5Eset_current_stack(current_stack_id); + /* Close the dataset */ + if(dset > 0) + status = H5Dclose(dset); + status = H5Eset_current_stack(current_stack_id); END_FUNC(PUB) /*------------------------------------------------------------------------- @@ -379,36 +360,34 @@ END_FUNC(PUB) */ BEGIN_FUNC(PUB, ERR, herr_t, SUCCEED, FAIL, -H5LRread_region(hid_t obj_id, - const hdset_reg_ref_t *ref, - hid_t mem_type, - size_t *numelem, - void *buf) ) +H5LRread_region(hid_t obj_id, const hdset_reg_ref_t *ref, hid_t mem_type, + size_t *numelem,void *buf)) - hid_t dset = -1, file_space = -1; /* Identifier of the dataset's dataspace in the file */ - hid_t mem_space = -1; /* Identifier of the memory dataspace */ - herr_t status; /* API return status */ - hid_t current_stack_id = -1; /* current error stack id */ + hid_t dset = -1; /* Identifier of the dataset's dataspace in the file */ + hid_t file_space = -1; /* Identifier of the dataset's dataspace in the file */ + hid_t mem_space = -1; /* Identifier of the memory dataspace */ + herr_t status; /* API return status */ + hid_t current_stack_id = -1; /* current error stack id */ /* Open the HDF5 object referenced */ dset = H5Rdereference(obj_id, H5R_DATASET_REGION, ref); if(dset < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") /* Retrieve the dataspace with the specified region selected */ file_space = H5Rget_region(dset, H5R_DATASET_REGION, ref); if(file_space < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") + H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") /* Check for anything to retrieve */ if(numelem || buf) { - hssize_t nelmts = 0; /* The number of elements in selected region */ + hssize_t nelmts = 0; /* The number of elements in selected region */ /* Determine the number of elements the dataspace selection */ if((nelmts = H5Sget_select_npoints(file_space)) < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Unable to retrieve number of elements in region") + H5E_THROW(H5E_CANTGET, "H5LR: Unable to retrieve number of elements in region") /* Set the number of elements in the region, if requested */ if(numelem) @@ -420,29 +399,29 @@ H5LRread_region(hid_t obj_id, /* Create a new simple dataspace in memory and open it for access */ if((mem_space = H5Screate_simple(1, dims1, NULL)) < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace for retrieving elements") + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace for retrieving elements") /* Read the region data from the file_space into the mem_space */ - if(H5Dread(dset, mem_type, mem_space, file_space, H5P_DEFAULT, buf) < 0) - H5E_THROW(H5E_READERROR, "H5LR: Unable to retrieve elements") + if(H5Dread(dset, mem_type, mem_space, file_space, H5P_DEFAULT, buf) < 0) + H5E_THROW(H5E_READERROR, "H5LR: Unable to retrieve elements") } /* end if */ } /* end if */ CATCH - current_stack_id = H5Eget_current_stack(); + current_stack_id = H5Eget_current_stack(); - /* Close appropriate items */ - if(mem_space > 0) - status =H5Sclose(mem_space); + /* Close appropriate items */ + if(mem_space > 0) + status =H5Sclose(mem_space); - if(file_space > 0) - status =H5Sclose(file_space); + if(file_space > 0) + status =H5Sclose(file_space); - if(dset > 0) - status =H5Dclose(dset); + if(dset > 0) + status =H5Dclose(dset); - status = H5Eset_current_stack(current_stack_id); + status = H5Eset_current_stack(current_stack_id); END_FUNC(PUB) @@ -464,108 +443,105 @@ END_FUNC(PUB) */ BEGIN_FUNC(PUB, ERR, herr_t, SUCCEED, FAIL, -H5LRcreate_region_references(hid_t file_id, - size_t num_elem, - const char **path, - const hsize_t *block_coord, - hdset_reg_ref_t *buf) ) - - hid_t sid = -1; /* identifier of the dataspace */ - hid_t dset_id = -1; /* destination: dataset */ - herr_t status; /* API return status */ - int nrank; /* the dimensionality of the source dataspace */ - int i, j, nstart; /* counters */ - hsize_t *start, *stride; /* offset of start of hyperslab, hyperslab stride */ - - hid_t current_stack_id = -1; /* current error stack id */ - /* flags marking state of allocation */ - hbool_t start_alloc = FALSE; - hbool_t stride_alloc = FALSE; - - nstart = 0; - for(i=0; i<(int)num_elem; i++) { - - /* Open the dataset for a given the path */ - dset_id = H5Dopen2(file_id, path[i], H5P_DEFAULT); - - if(dset_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataset for given path") - - /* Get the dataspace of the dataset */ - sid = H5Dget_space(dset_id); - - if(sid < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataspace for given path") - - /* Find the rank of the dataspace */ - nrank = H5Sget_simple_extent_ndims(sid); +H5LRcreate_region_references(hid_t file_id, size_t num_elem, const char **path, + const hsize_t *block_coord, hdset_reg_ref_t *buf)) + + hid_t space = -1; /* identifier of the dataspace */ + hid_t dset_id = -1; /* destination: dataset */ + herr_t status; /* API return status */ + int nrank; /* the dimensionality of the source dataspace */ + int i; /* counter */ + int j; /* counter */ + int nstart; /* counter for start of hyperslab*/ + hsize_t *start; /* offset of start of hyperslab*/ + hsize_t *stride; /* hyperslab stride */ + + hid_t current_stack_id = -1; /* current error stack id */ + /* flags marking state of allocation */ + hbool_t start_alloc = FALSE; + hbool_t stride_alloc = FALSE; + + nstart = 0; + for(i=0; i<(int)num_elem; i++) { + /* Open the dataset for a given the path */ + dset_id = H5Dopen2(file_id, path[i], H5P_DEFAULT); + + if(dset_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataset for given path") + + /* Get the dataspace of the dataset */ + space = H5Dget_space(dset_id); + + if(space < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataspace for given path") + + /* Find the rank of the dataspace */ + nrank = H5Sget_simple_extent_ndims(space); - if(nrank < 0) - H5E_THROW(H5E_BADSELECT, "H5LR: Failed to find the rank of the dataspace") - - /* Create references */ - - /* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for reference */ - /* 1 2 n 1 2 n */ - - start = (hsize_t *)malloc (sizeof (hsize_t) * nrank); - if(start == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - start_alloc = TRUE; - stride = (hsize_t *)malloc (sizeof (hsize_t) * nrank); - if(stride == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - stride_alloc = TRUE; - - for (j=0; j<nrank; j++) { - start[j] = block_coord[nstart + j]; - stride[j] = block_coord[nstart + j + nrank] - start[j] + 1; - } - nstart += 2*nrank; - - /* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for reading memory dataset */ - /* 1 2 n 1 2 n */ + if(nrank < 0) + H5E_THROW(H5E_BADSELECT, "H5LR: Failed to find the rank of the dataspace") + + /* Create references */ + + /* Select (x , x , ..., x) x (y , y , ..., y) hyperslab for reference */ + /* 1 2 n 1 2 n */ + + start = (hsize_t *)malloc(sizeof(hsize_t) * nrank); + if(start == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + start_alloc = TRUE; + stride = (hsize_t *)malloc(sizeof(hsize_t) * nrank); + if(stride == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + stride_alloc = TRUE; + + for(j=0; j<nrank; j++) { + start[j] = block_coord[nstart + j]; + stride[j] = block_coord[nstart + j + nrank] - start[j] + 1; + } + nstart += 2*nrank; + + /* Select (x , x , ..., x) x (y , y , ..., y) hyperslab for reading memory dataset */ + /* 1 2 n 1 2 n */ - status = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, NULL, stride, NULL); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") - - /* get the number of element points in the current selection */ - - status = (int)H5Sget_select_npoints(sid); - if(status < 0) - H5E_THROW(H5E_CANTCOUNT, "H5LR: Failed to retrieve number of points in hyperslab") - - /* Store dataset region */ - status = H5Rcreate(&buf[i], file_id, path[i], H5R_DATASET_REGION, sid); - if(status < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Failed to create region reference to dataset") - - /* Close the dataspace */ - if(sid > 0) { - status = H5Sclose(sid); - sid = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } + status = H5Sselect_hyperslab(space, H5S_SELECT_SET, start, NULL, stride, NULL); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") - /* Close the dataset */ - if(dset_id > 0) { - status = H5Dclose(dset_id); - dset_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } - free(start); - free(stride); + /* get the number of element points in the current selection */ - start_alloc = FALSE; - stride_alloc = FALSE; + status = (int)H5Sget_select_npoints(space); + if(status < 0) + H5E_THROW(H5E_CANTCOUNT, "H5LR: Failed to retrieve number of points in hyperslab") - } - CATCH + /* Store dataset region */ + status = H5Rcreate(&buf[i], file_id, path[i], H5R_DATASET_REGION, space); + if(status < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Failed to create region reference to dataset") + + /* Close the dataspace */ + if(space > 0) { + status = H5Sclose(space); + space = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } + + /* Close the dataset */ + if(dset_id > 0) { + status = H5Dclose(dset_id); + dset_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ + free(start); + free(stride); + + start_alloc = FALSE; + stride_alloc = FALSE; + + } /* end for */ +CATCH current_stack_id = H5Eget_current_stack(); @@ -573,8 +549,8 @@ H5LRcreate_region_references(hid_t file_id, if(stride_alloc) free(stride); /* Close the dataspace */ - if(sid > 0) - status = H5Sclose(sid); + if(space > 0) + status = H5Sclose(space); /* Close the dataset */ if(dset_id > 0) @@ -599,525 +575,507 @@ END_FUNC(PUB) *------------------------------------------------------------------------- */ BEGIN_FUNC(PUB, ERR, - herr_t, SUCCEED, FAIL, - H5LRmake_dataset(hid_t loc_id, const char *path, hid_t type_id, - const size_t buf_size, const hid_t *loc_id_ref, const hdset_reg_ref_t *ref) ) - - hid_t dset_ref = -1, sid_ref = -1; /* region reference dataset, dataspace */ - hid_t dset_id, memspace; /* dataset, dataspace */ - int nrank, rank_check=0; /* the dimensionality of the dataspace */ - size_t i; /* counter */ - int j, icnt; /* counters */ - hsize_t *dims; /* array of the size of the dataspace */ - void *buf; /* buffer to hold data */ - herr_t status; /* API return status */ - hid_t filespace; /* filespace */ - size_t numelem; /* number of elements in hyperslab */ - hsize_t *start; /* counter for offset of start of hyperslab */ - hsize_t *bounds_coor; /* hyperslab corners */ - hid_t current_stack_id = -1; /* current error stack id */ - - /* flags marking state of allocation */ - hbool_t dims_alloc = FALSE; - hbool_t bounds_coor_alloc = FALSE; - hbool_t buf_alloc = FALSE; - hbool_t start_alloc = FALSE; - - /* loop through the region references to get the overall size - * so we can specify the entire dataset and then write - * each region by hyperslab. - */ - - for (i=0; i<buf_size; i++) { - dset_ref = H5Rdereference(loc_id_ref[i], H5R_DATASET_REGION, ref[i]); - if(dset_ref < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") +herr_t, SUCCEED, FAIL, +H5LRmake_dataset(hid_t loc_id, const char *path, hid_t type_id, + const size_t buf_size, const hid_t *loc_id_ref, const hdset_reg_ref_t *ref)) + + hid_t dset_ref = -1; /* region reference dataset, dataspace */ + hid_t space_ref = -1; /* region reference dataset, dataspace */ + hid_t dset_id; /* dataset */ + hid_t memspace; /* memory dataspace */ + int nrank; /* the dimensionality of the dataspace */ + int rank_check=0; /* check for rank of the dataspace */ + size_t i; /* counter */ + int j; /* counters */ + int icnt; /* counters */ + hsize_t *dims; /* array of the size of the dataspace */ + void *buf; /* buffer to hold data */ + herr_t status; /* API return status */ + hid_t filespace; /* filespace */ + size_t numelem; /* number of elements in hyperslab */ + hsize_t *start; /* counter for offset of start of hyperslab */ + hsize_t *bounds_coor; /* hyperslab corners */ + hid_t current_stack_id = -1; /* current error stack id */ + + /* flags marking state of allocation */ + hbool_t dims_alloc = FALSE; + hbool_t bounds_coor_alloc = FALSE; + hbool_t buf_alloc = FALSE; + hbool_t start_alloc = FALSE; + + /* loop through the region references to get the overall size + * so we can specify the entire dataset and then write + * each region by hyperslab. + */ + + for(i=0; i<buf_size; i++) { + dset_ref = H5Rdereference(loc_id_ref[i], H5R_DATASET_REGION, ref[i]); + if(dset_ref < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") + + /* Retrieve the dataspace with the specified region selected */ + space_ref = H5Rget_region (dset_ref, H5R_DATASET_REGION, ref[i]); + if(space_ref < 0) + H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") + + /* get the rank of the region reference */ + nrank = H5Sget_simple_extent_ndims(space_ref); + if(nrank < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") + + /* Allocate space for the dimension array */ + if(i == 0) { + dims = (hsize_t *)malloc(sizeof(hsize_t) * nrank); + if(dims == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + dims_alloc = TRUE; + for(j=0; j<nrank; j++) + dims[j] = 0; + rank_check = nrank; + } /* end if */ + else { + /* check to make sure the ranks are all the same */ + if(nrank != rank_check) + H5E_THROW(H5E_BADSELECT, "H5LR: data associated with a list of region references must all have the same dataspace ranks") + } /* end else */ + + /* get extents of the referenced data */ + bounds_coor = (hsize_t *)malloc(sizeof(hsize_t) * nrank * 2); + if(bounds_coor == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + bounds_coor_alloc = TRUE; + /* a region reference is only allowed to reference one block */ + status = H5Sget_select_hyper_blocklist(space_ref, (hsize_t)0, (hsize_t)1, bounds_coor ); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") + + for(j=0; j<nrank; j++) { + if(j != nrank-1) { + dims[j] += bounds_coor[nrank +j] - bounds_coor[j] + 1; + } /* end if */ + else { + dims[j] = bounds_coor[nrank +j] - bounds_coor[j] + 1; + } /* end else */ + } /*end for */ + + /* closes */ + if(dset_ref > 0) { + status = H5Dclose(dset_ref); + dset_ref = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ + if(space_ref > 0) { + status = H5Sclose(space_ref); + space_ref = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + + free(bounds_coor); + bounds_coor_alloc = FALSE; + } /* end for */ + + /* Create the dataspace for the new dataset */ + filespace = H5Screate_simple(nrank, dims, NULL); + if(filespace < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace") - /* Retrieve the dataspace with the specified region selected */ - sid_ref = H5Rget_region (dset_ref, H5R_DATASET_REGION, ref[i]); - if(sid_ref < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") + free(dims); + dims_alloc = FALSE; + /* Create dataset */ + dset_id = H5Dcreate2(loc_id, path, type_id, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + if(dset_id < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataset") + + + start = (hsize_t *)malloc(sizeof(hsize_t) * nrank); + if(start == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + start_alloc = TRUE; + + /* loop over the region references to write data into new data set */ + icnt = 0; + for(i=0; i<buf_size; i++) { + dset_ref = H5Rdereference(loc_id_ref[i], H5R_DATASET_REGION, ref[i]); + if(dset_ref < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") + + /* Retrieve the dataspace with the specified region selected */ + space_ref = H5Rget_region(dset_ref, H5R_DATASET_REGION, ref[i]); + if(space_ref < 0) + H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") + + /* Allocate space for the dimension array */ + dims = (hsize_t *)malloc(sizeof(hsize_t) * nrank); + if(dims == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + dims_alloc = TRUE; + + /* get extents of the referenced data */ + bounds_coor = (hsize_t *)malloc(sizeof(hsize_t) * nrank * 2); + if(bounds_coor == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + bounds_coor_alloc = TRUE; + + /* a region reference is only allowed to reference one block */ + status = H5Sget_select_hyper_blocklist(space_ref, (hsize_t)0, (hsize_t)1, bounds_coor ); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") - /* get the rank of the region reference */ - nrank = H5Sget_simple_extent_ndims(sid_ref); - if(nrank < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") + for(j=0; j<nrank; j++) + dims[j] = bounds_coor[nrank+j] - bounds_coor[j] + 1; - /* Allocate space for the dimension array */ - if(i == 0) { - dims = (hsize_t *)malloc (sizeof (hsize_t) * nrank); - if(dims == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - dims_alloc = TRUE; - for (j=0; j<nrank; j++) dims[j]=0; - rank_check = nrank; - } else { - /* check to make sure the ranks are all the same */ - if(nrank != rank_check) - H5E_THROW(H5E_BADSELECT, "H5LR: data associated with a list of region references must all have the same dataspace ranks") - } + numelem = H5Sget_select_npoints(space_ref); + if(status < 0) + H5E_THROW(H5E_CANTCOUNT, "H5LR: Failed to retrieve number of points in hyperslab") - /* get extents of the referenced data */ - bounds_coor = (hsize_t *)malloc (sizeof (hsize_t) * nrank * 2); - if(bounds_coor == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - bounds_coor_alloc = TRUE; - /* a region reference is only allowed to reference one block */ - status = H5Sget_select_hyper_blocklist(sid_ref, (hsize_t)0, (hsize_t)1, bounds_coor ); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") - - for (j=0; j<nrank; j++) { - if(j != nrank - 1) { - dims[j] += bounds_coor[nrank +j] - bounds_coor[j] + 1; - } - else { - dims[j] = bounds_coor[nrank +j] - bounds_coor[j] + 1; - } - } + buf = malloc(sizeof(type_id) * numelem); + if(buf == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + buf_alloc = TRUE; - /* closes */ - if(dset_ref > 0) { - status = H5Dclose(dset_ref); - dset_ref = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } - if(sid_ref > 0) { - status = H5Sclose(sid_ref); - sid_ref = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } + /* read region reference data into buf */ + status= H5LRread_region(loc_id_ref[i],(const hdset_reg_ref_t*)&ref[i],type_id,&numelem,buf); + if(status < 0) + H5E_THROW(H5E_NONE_MINOR, "H5LR: Failed in internal H5LRread_region") - free(bounds_coor); - bounds_coor_alloc = FALSE; + start[0] = icnt; + for(j=1; j<nrank; j++) + start[j] = 0; /* start at the beginning for other dimensions */ - } + icnt += dims[0]; + memspace = H5Screate_simple(nrank, dims, NULL); + /* Select hyperslab in the file */ + status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, dims, NULL); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") -/* Create the dataspace for the new dataset */ - filespace = H5Screate_simple(nrank, dims, NULL); - if(filespace < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace") + /* write the hyperslab data set */ + status = H5Dwrite(dset_id, type_id, memspace, filespace, H5P_DEFAULT, buf); + if(status < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataset") + + /* closes */ + if(dset_ref > 0) { + status = H5Dclose(dset_ref); + dset_ref = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ + if(space_ref > 0) { + status = H5Sclose(space_ref); + space_ref = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + if(memspace > 0) { + status = H5Sclose(memspace); + memspace = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ - free(dims); - dims_alloc = FALSE; -/* Create dataset */ - dset_id = H5Dcreate2(loc_id, path, type_id, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); - if(dset_id < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataset") + /* deallocate arrays */ + free(dims); + free(bounds_coor); + free(buf); - start = (hsize_t *)malloc (sizeof (hsize_t) * nrank); - if(start == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - start_alloc = TRUE; + dims_alloc = FALSE; + bounds_coor_alloc = FALSE; + buf_alloc = FALSE; + } /* end for */ -/* loop over the region references to write data into new data set */ + if(dset_id > 0) { + status = H5Dclose(dset_id); + dset_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ - icnt = 0; - for (i=0; i<buf_size; i++) { - dset_ref = H5Rdereference(loc_id_ref[i], H5R_DATASET_REGION, ref[i]); - if(dset_ref < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") + if(filespace > 0) { + status = H5Sclose(filespace); + filespace = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ - /* Retrieve the dataspace with the specified region selected */ - sid_ref = H5Rget_region (dset_ref, H5R_DATASET_REGION, ref[i]); - if(sid_ref < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") + free(start); + start_alloc = FALSE; - /* Allocate space for the dimension array */ - dims = (hsize_t *)malloc (sizeof (hsize_t) * nrank); - if(dims == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - dims_alloc = TRUE; +CATCH - /* get extents of the referenced data */ - bounds_coor = (hsize_t *)malloc(sizeof (hsize_t) * nrank * 2); - if(bounds_coor == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - bounds_coor_alloc = TRUE; + current_stack_id = H5Eget_current_stack(); - /* a region reference is only allowed to reference one block */ - status = H5Sget_select_hyper_blocklist(sid_ref, (hsize_t)0, (hsize_t)1, bounds_coor ); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") + if(dims_alloc) + free(dims); + if(bounds_coor_alloc) + free(bounds_coor); + if(buf_alloc) + free(buf); + if(start_alloc) + free(start); - for(j=0; j<nrank; j++) - dims[j] = bounds_coor[nrank +j] - bounds_coor[j] + 1; + if(filespace > 0) + status = H5Sclose(filespace); - numelem = H5Sget_select_npoints(sid_ref); - if(status < 0) - H5E_THROW(H5E_CANTCOUNT, "H5LR: Failed to retrieve number of points in hyperslab") + if(memspace > 0) + status = H5Sclose(memspace); - buf = malloc(sizeof(type_id) * numelem); - if(buf == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - buf_alloc = TRUE; + if(dset_id > 0) + status = H5Dclose(dset_id); - /* read region reference data into buf */ - status= H5LRread_region(loc_id_ref[i], - (const hdset_reg_ref_t*)&ref[i], - type_id, - &numelem, - buf ); - if(status < 0) - H5E_THROW(H5E_NONE_MINOR, "H5LR: Failed in internal H5LRread_region") + if(dset_ref > 0) + status = H5Dclose(dset_ref); - start[0] = icnt; - for (j=1; j<nrank; j++) start[j] = 0; /* start at the beginning for other dimensions */ + if(space_ref > 0) + status = H5Sclose(space_ref); - icnt += dims[0]; - memspace = H5Screate_simple(nrank, dims, NULL); - /* Select hyperslab in the file */ - status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, dims, NULL); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") + status = H5Eset_current_stack(current_stack_id); - /* write the hyperslab data set */ - status = H5Dwrite(dset_id, type_id, memspace, filespace, H5P_DEFAULT, buf); - if(status < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataset") +END_FUNC(PUB) - /* closes */ +/*------------------------------------------------------------------------- + * Function: H5LRcopy_region + * + * Purpose: Copies data from a region specified by a reference to a region + * in a destination dataset. + * + * Return: Success: 0, Failure: -1 + * + * Programmer: M. Scot Breitenfeld + * + * Date: February 17, 2009 + * + *------------------------------------------------------------------------- + */ +BEGIN_FUNC(PUB, ERR, +herr_t, SUCCEED, FAIL, +H5LRcopy_region(hid_t obj_id, hdset_reg_ref_t *ref,const char *file, + const char *path, const hsize_t *block_coord)) + + herr_t status; /* API return status */ + hsize_t *dims; /* an array of the size of each dimension */ + hid_t file_space_id; /* identifier of the dataset's dataspace in the file */ + hid_t mem_space_id; /* identifier of the memory dataspace */ + hid_t dset_ref, space_ref; /* region reference dataset, dataspace id */ + hid_t file_id; /* file ids */ + hid_t dset_id; /* dataset ids */ + hid_t type_id; /* datatype ids */ + int ndim; /* the dimensionality of the dataspace */ + void *buf; /* buffer to store the dataset */ + size_t numelem; /* number of elements in dataspace */ + int nrank; /* the dimensionality of the dataspace */ + int i; /* counters */ + int j; /* counters */ + hsize_t *stride; /* hyperslab stride */ + hsize_t *bounds_coor; /* hyperslab corners */ + hid_t dtype; /* data type of source */ + hid_t current_stack_id = -1; /* current error stack id */ + /* flags marking state of allocation */ + hbool_t dims_alloc = FALSE; + hbool_t bounds_coor_alloc = FALSE; + hbool_t buf_alloc = FALSE; + hbool_t stride_alloc = FALSE; + + /* Region reference data */ + dset_ref = H5Rdereference(obj_id, H5R_DATASET_REGION, ref); + if(dset_ref < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") - if(dset_ref > 0) { - status = H5Dclose(dset_ref); - dset_ref = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } - if(sid_ref > 0) { - status = H5Sclose(sid_ref); - sid_ref = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - if(memspace > 0) { - status = H5Sclose(memspace); - memspace = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } + /* Region reference space */ + space_ref = H5Rget_region(dset_ref, H5R_DATASET_REGION, ref); - /* deallocate arrays */ + if(space_ref < 0) + H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") - free(dims); - free(bounds_coor); - free(buf); + /* Get the rank of the region reference */ + nrank = H5Sget_simple_extent_ndims(space_ref); + if(nrank < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") - dims_alloc = FALSE; - bounds_coor_alloc = FALSE; - buf_alloc = FALSE; + bounds_coor = (hsize_t *)malloc(sizeof(hsize_t) * nrank * 2); + if(bounds_coor == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + bounds_coor_alloc = TRUE; - } + /* get the list of hyperslab blocks currently selected */ + status = H5Sget_select_hyper_blocklist(space_ref, (hsize_t)0, (hsize_t)1, bounds_coor); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") - if(dset_id > 0) { - status = H5Dclose(dset_id); - dset_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } + numelem = 1; + for(j=0; j<nrank; j++) + numelem = (bounds_coor[nrank +j] - bounds_coor[j] + 1)*numelem; - if(filespace > 0) { - status = H5Sclose(filespace); - filespace = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } + dtype = H5Dget_type(dset_ref); + if(dtype < 0) + H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the data type") - free(start); - start_alloc = FALSE; + type_id = H5Tget_native_type(dtype , H5T_DIR_DEFAULT); + if(type_id < 0) + H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the native data type") -CATCH + buf = malloc(sizeof(type_id) * numelem); + if(buf == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - current_stack_id = H5Eget_current_stack(); + buf_alloc = TRUE; - if(dims_alloc) free(dims); - if(bounds_coor_alloc) free(bounds_coor); - if(buf_alloc) free(buf); - if(start_alloc) free(start); + /* read data associated with region reference */ + status= H5LRread_region(obj_id,(const hdset_reg_ref_t*)ref,type_id,&numelem,buf); - if(filespace > 0) - status = H5Sclose(filespace); + if(status < 0) + H5E_THROW(H5E_NONE_MINOR, "H5LR: Failed in internal H5LRread_region") - if(memspace > 0) - status = H5Sclose(memspace); + if(space_ref > 0) { + status = H5Sclose(space_ref); + space_ref = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + if(dset_ref > 0) { + status = H5Dclose(dset_ref); + dset_ref = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ - if(dset_id > 0) - status = H5Dclose(dset_id); + /* Open the file */ + file_id = H5Fopen(file, H5F_ACC_RDWR, H5P_DEFAULT); + if(file_id < 0) + H5E_THROW(H5E_CANTOPENFILE, "H5LR: Failed to open file") - if(dset_ref > 0) - status = H5Dclose(dset_ref); + /* Open the dataset for a given the path */ + dset_id = H5Dopen2(file_id, path, H5P_DEFAULT); + if(dset_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataset") - if(sid_ref > 0) - status = H5Sclose(sid_ref); + /* Get the dataspace of the dataset */ + file_space_id = H5Dget_space(dset_id); + if(file_space_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataspace for given path") - status = H5Eset_current_stack(current_stack_id); + /* Find the rank of the dataspace */ + ndim = H5Sget_simple_extent_ndims(file_space_id); + if(ndim < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") -END_FUNC(PUB) + /* Allocate space for the dimension array */ + dims = (hsize_t *)malloc(sizeof(hsize_t) * ndim); + if(dims == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + dims_alloc = TRUE; -/*------------------------------------------------------------------------- - * Function: H5LRcopy_region - * - * Purpose: Copies data from a region specified by a reference to a region - * in a destination dataset. - * - * Return: Success: 0, Failure: -1 - * - * Programmer: M. Scot Breitenfeld - * - * Date: February 17, 2009 - * - *------------------------------------------------------------------------- - */ -BEGIN_FUNC(PUB, ERR, -herr_t, SUCCEED, FAIL, -H5LRcopy_region(hid_t obj_id, - hdset_reg_ref_t *ref, - const char *file, - const char *path, - const hsize_t *block_coord)) - - herr_t status; /* API return status */ - hsize_t *dims; /* an array of the size of each dimension */ - hid_t file_space_id; /* identifier of the dataset's dataspace in the file */ - hid_t mem_space_id; /* identifier of the memory dataspace */ - hid_t dset_ref, sid_ref; /* region reference dataset, dataspace id */ - hid_t file_id, dset_id, type_id; /*file, dataset, datatype ids */ - int ndim; /* the dimensionality of the dataspace */ - void *buf; /* buffer to store the dataset */ - size_t numelem; /* number of elements in dataspace */ - int nrank; /* the dimensionality of the dataspace */ - int i, j; /* counters */ - hsize_t *stride; /* hyperslab stride */ - hsize_t *bounds_coor; /* hyperslab corners */ - hid_t dtype; /* data type of source */ - hid_t current_stack_id = -1; /* current error stack id */ - /* flags marking state of allocation */ - hbool_t dims_alloc = FALSE; - hbool_t bounds_coor_alloc = FALSE; - hbool_t buf_alloc = FALSE; - hbool_t stride_alloc = FALSE; - - /* Region reference data */ - dset_ref = H5Rdereference(obj_id, H5R_DATASET_REGION, ref); - if(dset_ref < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") - - /* Region reference space */ - sid_ref = H5Rget_region(dset_ref, H5R_DATASET_REGION, ref); - - if(sid_ref < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") - - /* Get the rank of the region reference */ - nrank = H5Sget_simple_extent_ndims(sid_ref); - if(nrank < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") - - bounds_coor = (hsize_t *)malloc (sizeof (hsize_t) * nrank * 2); - if(bounds_coor == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - bounds_coor_alloc = TRUE; - -/* get the list of hyperslab blocks currently selected */ - status = H5Sget_select_hyper_blocklist(sid_ref, (hsize_t)0, (hsize_t)1, bounds_coor); - if(status < 0) { - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") - } - - numelem = 1; - for (j=0; j<nrank; j++) { - numelem = (bounds_coor[nrank +j] - bounds_coor[j] + 1)*numelem; - } - - dtype = H5Dget_type(dset_ref); - if(dtype < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the data type") - - type_id = H5Tget_native_type(dtype , H5T_DIR_DEFAULT ); - if(type_id < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the native data type") - - buf = malloc(sizeof(type_id) * numelem); - if(buf == NULL){ - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - } - buf_alloc = TRUE; - - /* read data associated with region reference */ - status= H5LRread_region(obj_id, - (const hdset_reg_ref_t*)ref, - type_id, - &numelem, - buf); - - if(status < 0) - H5E_THROW(H5E_NONE_MINOR, "H5LR: Failed in internal H5LRread_region") - - if(sid_ref > 0) { - status = H5Sclose(sid_ref); - sid_ref = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - if(dset_ref > 0) { - status = H5Dclose(dset_ref); - dset_ref = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } - -/* Open the file */ - - file_id = H5Fopen(file, H5F_ACC_RDWR, H5P_DEFAULT); - if(file_id < 0) - H5E_THROW(H5E_CANTOPENFILE, "H5LR: Failed to open file") - -/* Open the dataset for a given the path */ - dset_id = H5Dopen2(file_id, path, H5P_DEFAULT); - if(dset_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataset") - -/* Get the dataspace of the dataset */ - file_space_id = H5Dget_space(dset_id); - if(file_space_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataspace for given path") - -/* Find the rank of the dataspace */ - ndim = H5Sget_simple_extent_ndims(file_space_id); - if(ndim < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") - - /* Allocate space for the dimension array */ - dims = (hsize_t *)malloc (sizeof (hsize_t) * ndim); - if(dims == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - dims_alloc = TRUE; - - /* find the dimensions of each data space from the block coordinates */ - for (i=0; i<ndim; i++) - dims[i] = block_coord[i+ndim] - block_coord[i] + 1; - - /* Create dataspace for writing the buffer */ - mem_space_id = H5Screate_simple(ndim, dims, NULL); - if(mem_space_id < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace for retrieving elements") - -/* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for writing memory dataset */ -/* 1 2 n 1 2 n */ - - stride = (hsize_t *)malloc (sizeof (hsize_t) * ndim); - if(stride == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - stride_alloc = TRUE; + /* find the dimensions of each data space from the block coordinates */ + for(i=0; i<ndim; i++) + dims[i] = block_coord[i+ndim] - block_coord[i] + 1; + + /* Create dataspace for writing the buffer */ + mem_space_id = H5Screate_simple(ndim, dims, NULL); + if(mem_space_id < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace for retrieving elements") + + /* Select (x , x , ..., x) x (y , y , ..., y) hyperslab for writing memory dataset */ + /* 1 2 n 1 2 n */ + + stride = (hsize_t *)malloc(sizeof(hsize_t) * ndim); + if(stride == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + stride_alloc = TRUE; - for (i=0; i<ndim; i++) { - stride[i] = block_coord[i + ndim] - block_coord[i] + 1; - } - - status = H5Sselect_hyperslab(file_space_id,H5S_SELECT_SET, block_coord,NULL,stride,NULL); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") - - status = H5Dwrite(dset_id, type_id, mem_space_id, file_space_id, H5P_DEFAULT, buf); - if(status < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataset") - - free(stride); - free(buf); - free(dims); - free(bounds_coor); - - stride_alloc = FALSE; - buf_alloc = FALSE; - dims_alloc = FALSE; - bounds_coor = FALSE; - -/* closes */ - if(file_space_id > 0) { - status = H5Sclose(file_space_id); - file_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - if(mem_space_id > 0) { - status = H5Sclose(mem_space_id); - mem_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - - if(dset_id > 0) { - status = H5Dclose(dset_id); - dset_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } - if(file_id > 0) { - status = H5Fclose(file_id); - file_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } + for(i=0; i<ndim; i++) + stride[i] = block_coord[i + ndim] - block_coord[i] + 1; + + status = H5Sselect_hyperslab(file_space_id,H5S_SELECT_SET, block_coord, NULL, stride, NULL); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") + + status = H5Dwrite(dset_id, type_id, mem_space_id, file_space_id, H5P_DEFAULT, buf); + if(status < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataset") + + free(stride); + stride_alloc = FALSE; + free(buf); + buf_alloc = FALSE; + free(dims); + dims_alloc = FALSE; + free(bounds_coor); + bounds_coor = FALSE; + + /* closes */ + if(file_space_id > 0) { + status = H5Sclose(file_space_id); + file_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + if(mem_space_id > 0) { + status = H5Sclose(mem_space_id); + mem_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + if(dset_id > 0) { + status = H5Dclose(dset_id); + dset_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ + if(file_id > 0) { + status = H5Fclose(file_id); + file_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ - if(dtype > 0) { - status = H5Tclose(dtype); - dtype = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close datatype") - } - } - if(type_id > 0) { - status = H5Tclose(type_id); - type_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close datatype") - } - } - CATCH + if(dtype > 0) { + status = H5Tclose(dtype); + dtype = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close datatype") + } /* end if */ + if(type_id > 0) { + status = H5Tclose(type_id); + type_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close datatype") + } /* end if */ +CATCH - current_stack_id = H5Eget_current_stack(); + current_stack_id = H5Eget_current_stack(); - if(dims_alloc) free(dims); - if(bounds_coor_alloc) free(bounds_coor); - if(buf_alloc) free(buf); - if(stride_alloc) free(stride); + if(dims_alloc) + free(dims); + if(bounds_coor_alloc) + free(bounds_coor); + if(buf_alloc) + free(buf); + if(stride_alloc) + free(stride); /* Close the dataspace */ - if(file_space_id > 0) + if(file_space_id > 0) status = H5Sclose(file_space_id); - if(mem_space_id > 0) + if(mem_space_id > 0) status = H5Sclose(mem_space_id); /* Close the dataset */ - if(dset_id > 0) + if(dset_id > 0) status = H5Dclose(dset_id); /* Close the file */ - if(file_id > 0) + if(file_id > 0) status = H5Fclose(file_id); /* Close the datatypes */ - if(dtype > 0) + if(dtype > 0) status = H5Tclose(dtype); - if(type_id > 0) + if(type_id > 0) status = H5Tclose(type_id); - status = H5Eset_current_stack(current_stack_id); + status = H5Eset_current_stack(current_stack_id); END_FUNC(PUB) @@ -1138,295 +1096,292 @@ END_FUNC(PUB) BEGIN_FUNC(PUB, ERR, herr_t, SUCCEED, FAIL, H5LRcopy_references(hid_t obj_id, hdset_reg_ref_t *ref, const char *file, - const char *path, const hsize_t *block_coord_dset, hdset_reg_ref_t *ref_new) ) - - herr_t status; /* API return status */ - hsize_t *dims, *dims_src; /* an array of the size of each dimension in source and destination */ - hid_t file_space_id; /* identifier of the dataset's dataspace in the file */ - hid_t mem_space_id; /* identifier of the memory dataspace */ - hid_t dset_id, type_id, file_id; /*dataset, datatype, file ids */ - hid_t did_src, sid_src; /* source dataset, dataspace */ - int ndim; /* the dimensionality of the dataspace */ - void *buf; /* buffer to store the dataset */ - hsize_t numelem_src; /* number of elements in source dataspace */ - hsize_t numelem_dset; /* number of elements in destination dataspace */ - int nrank_src; /* the dimensionality of the source dataspace */ - H5S_sel_type sel_type; /* selection type of hyperslab */ - int i, j; /* counters */ - hsize_t *stride; /* hyperslab stride */ - hsize_t *bounds_coor; /* hyperslab corners */ - hid_t dtype; /* data type of source */ - - hid_t current_stack_id = -1; /* current error stack id */ - /* flags marking state of allocation */ - hbool_t dims_src_alloc = FALSE; - hbool_t dims_alloc = FALSE; - hbool_t bounds_coor_alloc = FALSE; - hbool_t buf_alloc = FALSE; - hbool_t stride_alloc = FALSE; - - /* Region reference data */ - did_src = H5Rdereference(obj_id, H5R_DATASET_REGION, ref); - if(did_src < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") - - /* Region reference space */ - sid_src = H5Rget_region (did_src, H5R_DATASET_REGION, ref); - if(sid_src < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") - - /* Determine the type of the dataspace selection */ - sel_type = H5Sget_select_type(sid_src); - if(sel_type < 0) - H5E_THROW(H5E_BADSELECT, "H5LR: Failed to find selection type") - - /* Find the rank of the dataspace */ - nrank_src = H5Sget_simple_extent_ndims(sid_src); - if(nrank_src < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") - - /* Allocate space for the dimension array */ - dims_src = (hsize_t *)malloc (sizeof (hsize_t) * nrank_src); - if(dims_src == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - dims_src_alloc = TRUE; - - bounds_coor = (hsize_t *)malloc (sizeof (hsize_t) * nrank_src * 2); - if(bounds_coor == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - bounds_coor_alloc = TRUE; - - /* get the list of hyperslab blocks currently selected */ - status = H5Sget_select_hyper_blocklist(sid_src, (hsize_t)0, (hsize_t)1, bounds_coor); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") - - /* get the total number of elements in the source */ - numelem_src = 1; - for (j=0; j<nrank_src; j++) { - dims_src[j] = bounds_coor[nrank_src + j] - bounds_coor[j] + 1; - numelem_src = dims_src[j]*numelem_src; - } - - /* get the datatype */ - dtype = H5Dget_type(did_src); - if(dtype < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the data type") - type_id = H5Tget_native_type(dtype , H5T_DIR_DEFAULT ); - if(type_id < 0) - H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the native data type") - - buf = malloc(sizeof(type_id) * numelem_src); - if(buf == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - buf_alloc = TRUE; - - /* Create dataspace for reading buffer */ - mem_space_id = H5Screate_simple(nrank_src, dims_src, NULL); - if(mem_space_id < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace for retrieving elements") - - /* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for reading memory dataset */ - /* 1 2 n 1 2 n */ - - status = H5Sselect_hyperslab(sid_src,H5S_SELECT_SET,bounds_coor,NULL, dims_src, NULL); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") - - /* read dataset */ - status = H5Dread(did_src, type_id, mem_space_id, sid_src, H5P_DEFAULT, buf); - if(status < 0) - H5E_THROW(H5E_READERROR, "H5LR: Unable to retrieve elements") - - - /* close */ - if(did_src > 0) { - status = H5Dclose(did_src); - did_src = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } - if(sid_src > 0) { - status = H5Sclose(sid_src); - sid_src = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - if(mem_space_id > 0) { - status = H5Sclose(mem_space_id); - mem_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - - free(dims_src); - dims_src_alloc = FALSE; - -/* Open the file */ - file_id = H5Fopen(file, H5F_ACC_RDWR, H5P_DEFAULT); - if(file_id < 0) - H5E_THROW(H5E_CANTOPENFILE, "H5LR: Failed to open file") - -/* Open the dataset for a given the path */ - dset_id = H5Dopen2(file_id, path, H5P_DEFAULT); - if(dset_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataset") - -/* Get the dataspace of the dataset */ - file_space_id = H5Dget_space(dset_id); - if(file_space_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataspace for given path") - -/* Find the rank of the dataspace */ - ndim = H5Sget_simple_extent_ndims(file_space_id); - if(ndim < 0) - H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") - - /* Allocate space for the dimension array */ - dims = (hsize_t *)malloc (sizeof (hsize_t) * ndim); - if(dims == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - dims_alloc = TRUE; - - numelem_dset = 1; - /* find the dimensions of each data space from the block coordinates */ - for (i=0; i<ndim; i++) { - dims[i] = block_coord_dset[i+ndim] - block_coord_dset[i] + 1; - numelem_dset = numelem_dset*dims[i]; - } - - /* check the number of elements in the old and newly specified regions are the same */ - - if( numelem_dset != numelem_src) - H5E_THROW(H5E_BADSELECT, "H5LR: Different sized source and destination regions") + const char *path, const hsize_t *block_coord_dset, hdset_reg_ref_t *ref_new)) + + herr_t status; /* API return status */ + hsize_t *dims; /* an array of the size of each dimension for the destination */ + hsize_t *dims_src; /* an array of the size of each dimension for the source */ + hid_t file_space_id; /* identifier of the dataset's dataspace in the file */ + hid_t mem_space_id; /* identifier of the memory dataspace */ + hid_t file_id; /* file ids */ + hid_t dset_id; /* dataset ids */ + hid_t type_id; /* datatype ids */ + hid_t did_src; /* source dataset */ + hid_t space_src; /* source dataspace */ + int ndim; /* the dimensionality of the dataspace */ + void *buf; /* buffer to store the dataset */ + hsize_t numelem_src; /* number of elements in source dataspace */ + hsize_t numelem_dset; /* number of elements in destination dataspace */ + int nrank_src; /* the dimensionality of the source dataspace */ + H5S_sel_type sel_type; /* selection type of hyperslab */ + int i; /* counters */ + int j; /* counters */ + hsize_t *stride; /* hyperslab stride */ + hsize_t *bounds_coor; /* hyperslab corners */ + hid_t dtype; /* data type of source */ + hid_t current_stack_id = -1; /* current error stack id */ + /* flags marking state of allocation */ + hbool_t dims_src_alloc = FALSE; + hbool_t dims_alloc = FALSE; + hbool_t bounds_coor_alloc = FALSE; + hbool_t buf_alloc = FALSE; + hbool_t stride_alloc = FALSE; + + /* Region reference data */ + did_src = H5Rdereference(obj_id, H5R_DATASET_REGION, ref); + if(did_src < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to open object referenced") + + /* Region reference space */ + space_src = H5Rget_region (did_src, H5R_DATASET_REGION, ref); + if(space_src < 0) + H5E_THROW(H5E_CANTGET, "H5LR: Retrieving dataspace referenced failed") + + /* Determine the type of the dataspace selection */ + sel_type = H5Sget_select_type(space_src); + if(sel_type < 0) + H5E_THROW(H5E_BADSELECT, "H5LR: Failed to find selection type") + + /* Find the rank of the dataspace */ + nrank_src = H5Sget_simple_extent_ndims(space_src); + if(nrank_src < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") + + /* Allocate space for the dimension array */ + dims_src = (hsize_t *)malloc(sizeof(hsize_t) * nrank_src); + if(dims_src == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + dims_src_alloc = TRUE; + + bounds_coor = (hsize_t *)malloc(sizeof(hsize_t) * nrank_src * 2); + if(bounds_coor == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + bounds_coor_alloc = TRUE; + + /* get the list of hyperslab blocks currently selected */ + status = H5Sget_select_hyper_blocklist(space_src, (hsize_t)0, (hsize_t)1, bounds_coor); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to find list of hyperslab blocks") + + /* get the total number of elements in the source */ + numelem_src = 1; + for(j=0; j<nrank_src; j++) { + dims_src[j] = bounds_coor[nrank_src + j] - bounds_coor[j] + 1; + numelem_src = dims_src[j]*numelem_src; + } /* end for */ + + /* get the datatype */ + dtype = H5Dget_type(did_src); + if(dtype < 0) + H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the data type") + type_id = H5Tget_native_type(dtype , H5T_DIR_DEFAULT); + if(type_id < 0) + H5E_THROW(H5E_CANTGET, "H5LR: Failed to find the native data type") + + buf = malloc(sizeof(type_id) * numelem_src); + if(buf == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + buf_alloc = TRUE; + + /* Create dataspace for reading buffer */ + mem_space_id = H5Screate_simple(nrank_src, dims_src, NULL); + if(mem_space_id < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace for retrieving elements") + + /* Select (x , x , ..., x) x (y , y , ..., y) hyperslab for reading memory dataset */ + /* 1 2 n 1 2 n */ + + status = H5Sselect_hyperslab(space_src,H5S_SELECT_SET,bounds_coor,NULL, dims_src, NULL); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") + + /* read dataset */ + status = H5Dread(did_src, type_id, mem_space_id, space_src, H5P_DEFAULT, buf); + if(status < 0) + H5E_THROW(H5E_READERROR, "H5LR: Unable to retrieve elements") + + + /* close */ + if(did_src > 0) { + status = H5Dclose(did_src); + did_src = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ + if(space_src > 0) { + status = H5Sclose(space_src); + space_src = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + if(mem_space_id > 0) { + status = H5Sclose(mem_space_id); + mem_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } + + free(dims_src); + dims_src_alloc = FALSE; + + /* Open the file */ + file_id = H5Fopen(file, H5F_ACC_RDWR, H5P_DEFAULT); + if(file_id < 0) + H5E_THROW(H5E_CANTOPENFILE, "H5LR: Failed to open file") + + /* Open the dataset for a given the path */ + dset_id = H5Dopen2(file_id, path, H5P_DEFAULT); + if(dset_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataset") + + /* Get the dataspace of the dataset */ + file_space_id = H5Dget_space(dset_id); + if(file_space_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LR: Failed to open dataspace for given path") + + /* Find the rank of the dataspace */ + ndim = H5Sget_simple_extent_ndims(file_space_id); + if(ndim < 0) + H5E_THROW(H5E_NOTFOUND, "H5LR: Failed to find extents of dataspace") + + /* Allocate space for the dimension array */ + dims = (hsize_t *)malloc(sizeof(hsize_t) * ndim); + if(dims == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + dims_alloc = TRUE; + + numelem_dset = 1; + /* find the dimensions of each data space from the block coordinates */ + for(i=0; i<ndim; i++) { + dims[i] = block_coord_dset[i+ndim] - block_coord_dset[i] + 1; + numelem_dset = numelem_dset*dims[i]; + } /* end for */ + + /* check the number of elements in the old and newly specified regions are the same */ + if(numelem_dset != numelem_src) + H5E_THROW(H5E_BADSELECT, "H5LR: Different sized source and destination regions") - /* Create dataspace for writing the buffer */ - mem_space_id = H5Screate_simple(ndim, dims, NULL); - if(mem_space_id < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace for retrieving elements") + /* Create dataspace for writing the buffer */ + mem_space_id = H5Screate_simple(ndim, dims, NULL); + if(mem_space_id < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace for retrieving elements") -/* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for writing memory dataset */ -/* 1 2 n 1 2 n */ + /* Select (x , x , ..., x) x (y , y , ..., y) hyperslab for writing memory dataset */ + /* 1 2 n 1 2 n */ - stride = (hsize_t *)malloc (sizeof (hsize_t) * ndim); - if(stride == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - stride_alloc = TRUE; + stride = (hsize_t *)malloc(sizeof(hsize_t) * ndim); + if(stride == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + stride_alloc = TRUE; - for (i=0; i<ndim; i++) { - stride[i] = block_coord_dset[i + ndim] - block_coord_dset[i] + 1; - } + for(i=0; i<ndim; i++) + stride[i] = block_coord_dset[i + ndim] - block_coord_dset[i] + 1; - status = H5Sselect_hyperslab(file_space_id,H5S_SELECT_SET, block_coord_dset,NULL, stride, NULL); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") + status = H5Sselect_hyperslab(file_space_id,H5S_SELECT_SET, block_coord_dset,NULL, stride, NULL); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select hyperslab") - if( H5Sget_select_npoints(file_space_id) < 0) - H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select points") + if(H5Sget_select_npoints(file_space_id) < 0) + H5E_THROW(H5E_CANTSELECT, "H5LR: Failed to select points") - status = H5Dwrite(dset_id, type_id, mem_space_id, file_space_id, H5P_DEFAULT, buf); - if(status < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataset") + status = H5Dwrite(dset_id, type_id, mem_space_id, file_space_id, H5P_DEFAULT, buf); + if(status < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataset") - /* create reference */ - status = H5Rcreate(ref_new, file_id, path, H5R_DATASET_REGION, file_space_id); - if(status < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Failed to create region reference to dataset") + /* create reference */ + status = H5Rcreate(ref_new, file_id, path, H5R_DATASET_REGION, file_space_id); + if(status < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Failed to create region reference to dataset") - /* close the data */ + /* CLOSE THE DATA */ - /* Close the dataset */ - if(dset_id > 0) { - status = H5Dclose(dset_id); - dset_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } - /* Close the dataspace */ - if(file_space_id > 0) { - status = H5Sclose(file_space_id); - file_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - - /* Close the dataspace */ - if(mem_space_id > 0) { - status = H5Sclose(mem_space_id); - mem_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - /* Close the datatypes */ - if(type_id > 0) { - status = H5Tclose(type_id); - type_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close datatype") - } - } - if(dtype > 0) { - status = H5Tclose(dtype); - dtype = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close datatype") - } - } - /* close file */ - if(file_id > 0) { - status = H5Fclose(file_id); - file_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } - free(stride); - free(buf); - free(dims); - free(bounds_coor); + /* Close the dataset */ + if(dset_id > 0) { + status = H5Dclose(dset_id); + dset_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ + /* Close the dataspace */ + if(file_space_id > 0) { + status = H5Sclose(file_space_id); + file_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + /* Close the dataspace */ + if(mem_space_id > 0) { + status = H5Sclose(mem_space_id); + mem_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + /* Close the datatypes */ + if(type_id > 0) { + status = H5Tclose(type_id); + type_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close datatype") + } /* end if */ + if(dtype > 0) { + status = H5Tclose(dtype); + dtype = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close datatype") + } /* end if */ + /* close file */ + if(file_id > 0) { + status = H5Fclose(file_id); + file_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ + free(stride); + free(buf); + free(dims); + free(bounds_coor); - stride_alloc = FALSE; - buf_alloc = FALSE; - dims_alloc = FALSE; - bounds_coor = FALSE; + stride_alloc = FALSE; + buf_alloc = FALSE; + dims_alloc = FALSE; + bounds_coor = FALSE; CATCH - current_stack_id = H5Eget_current_stack(); + current_stack_id = H5Eget_current_stack(); - if(dims_alloc) free(dims); - if(bounds_coor_alloc) free(bounds_coor); - if(buf_alloc) free(buf); - if(stride_alloc) free(stride); - if(dims_src_alloc) free(dims_src); + if(dims_alloc) + free(dims); + if(bounds_coor_alloc) + free(bounds_coor); + if(buf_alloc) + free(buf); + if(stride_alloc) + free(stride); + if(dims_src_alloc) + free(dims_src); - /* Close the dataspace */ - if(file_space_id > 0) - status = H5Sclose(file_space_id); - if(mem_space_id > 0) - status = H5Sclose(mem_space_id); + /* Close the dataspace */ + if(file_space_id > 0) + status = H5Sclose(file_space_id); + if(mem_space_id > 0) + status = H5Sclose(mem_space_id); - /* Close the dataset */ - if(dset_id > 0) - status = H5Dclose(dset_id); - /* Close the file */ - if(file_id > 0) - status = H5Fclose(file_id); - /* Close the datatypes */ - if(dtype > 0) - status = H5Tclose(dtype); - if(type_id > 0) - status = H5Tclose(type_id); + /* Close the dataset */ + if(dset_id > 0) + status = H5Dclose(dset_id); + /* Close the file */ + if(file_id > 0) + status = H5Fclose(file_id); + /* Close the datatypes */ + if(dtype > 0) + status = H5Tclose(dtype); + if(type_id > 0) + status = H5Tclose(type_id); - status = H5Eset_current_stack(current_stack_id); + status = H5Eset_current_stack(current_stack_id); END_FUNC(PUB) @@ -1448,121 +1403,122 @@ END_FUNC(PUB) BEGIN_FUNC(PUB, ERR, herr_t, SUCCEED, FAIL, H5LRcreate_regref_to_all(hid_t loc_id, const char *group_path, - const char *ds_path, H5_index_t index_type, H5_iter_order_t order, H5R_type_t ref_type) ) + const char *ds_path, H5_index_t index_type, H5_iter_order_t order, H5R_type_t ref_type)) - herr_t status; /* API return status */ - hid_t filespace; - hid_t dset_id; - hsize_t dims[1]; - void *data; /* 1D array to hold data from region references */ - size_t size_ref; + herr_t status; /* API return status */ + hid_t filespace; + hid_t dset_id; + hsize_t dims[1]; + void *data; /* 1D array to hold data from region references */ + size_t size_ref; - hid_t current_stack_id = -1; /* current error stack id */ + hid_t current_stack_id = -1; /* current error stack id */ - /* flags marking state of allocation */ - hbool_t data_alloc = FALSE; + /* flags marking state of allocation */ + hbool_t data_alloc = FALSE; - _regref_to_all_size = 0; - _regref_type = ref_type; + _regref_to_all_size = 0; + _regref_type = ref_type; -/* First determine the number of datasets or objects*/ - status = H5Lvisit_by_name(loc_id, group_path, index_type, order, op_func_L, NULL, H5P_DEFAULT ); - - if((herr_t)*op_func_L < 0){ - if( (herr_t)*op_func_L == -1) { - H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in internal callback routine H5Oget_info_by_name ") - } else if( (herr_t)*op_func_L == -2) { - H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in internal callback loop over region references ") - } - } + /* First determine the number of datasets or objects*/ + status = H5Lvisit_by_name(loc_id, group_path, index_type, order, op_func_L, NULL, H5P_DEFAULT); + if((herr_t)*op_func_L < 0) { + if((herr_t)*op_func_L == -1) { + H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in internal callback routine H5Oget_info_by_name ") + } /* end if*/ + else if((herr_t)*op_func_L == -2) { + H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in internal callback loop over region references ") + } /* end else if */ + } /* end if */ - /* if there are no datasets or objects then return */ - if( _regref_to_all_size == 0 ) - goto catch_except; + /* if there are no datasets or objects then return */ + if(_regref_to_all_size == 0) + goto catch_except; -/* CREATE THE NEW DATASET REGION REFERENCES */ + /* CREATE THE NEW DATASET REGION REFERENCES */ -/* Create the dataspace for the new dataset */ + /* Create the dataspace for the new dataset */ - dims[0] = (size_t)_regref_to_all_size; + dims[0] = (size_t)_regref_to_all_size; - filespace = H5Screate_simple(1, dims, NULL); - if(filespace < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace") + filespace = H5Screate_simple(1, dims, NULL); + if(filespace < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create dataspace") -/* _regref_to_all_size size of the current dataset from region references */ - if(_regref_type == H5R_DATASET_REGION) { - data = (hdset_reg_ref_t*)malloc (sizeof (hdset_reg_ref_t) * dims[0]); - } else { - data = (hobj_ref_t*)malloc (sizeof (hobj_ref_t) * dims[0]); - } + /* _regref_to_all_size size of the current dataset from region references */ + if(_regref_type == H5R_DATASET_REGION) { + data = (hdset_reg_ref_t*)malloc(sizeof(hdset_reg_ref_t) * dims[0]); + } /* end if */ + else { + data = (hobj_ref_t*)malloc(sizeof(hobj_ref_t) * dims[0]); + } /* end else */ - if(data == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") + if(data == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LR: Failed to allocate enough memory") - data_alloc = TRUE; + data_alloc = TRUE; -/* create the region references */ - _regref_to_all_start = 0; - status = H5Lvisit_by_name( loc_id, group_path, index_type, order, op_func_L, data, H5P_DEFAULT ); + /* create the region references */ + _regref_to_all_start = 0; + status = H5Lvisit_by_name(loc_id, group_path, index_type, order, op_func_L, data, H5P_DEFAULT); - if(status <0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in reading or writing data region references to datasets") + if(status <0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in reading or writing data region references to datasets") - if( (herr_t)*op_func_L < 0){ - if( (herr_t)*op_func_L == -1) { - H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in internal callback routine H5Oget_info_by_name ") - } else if((herr_t)*op_func_L == -2) { - H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in internal callback loop over region references ") - } - } + if((herr_t)*op_func_L < 0) { + if((herr_t)*op_func_L == -1) { + H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in internal callback routine H5Oget_info_by_name ") + } /* end if */ + else if((herr_t)*op_func_L == -2) + H5E_THROW(H5E_CANTCREATE, "H5LR: Failure in internal callback loop over region references ") + } /* end if */ - if(_regref_type == H5R_DATASET_REGION) { - /* Create dataset */ - dset_id = H5Dcreate2(loc_id, ds_path, H5T_STD_REF_DSETREG, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); - if(dset_id < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create region references to datasets") + if(_regref_type == H5R_DATASET_REGION) { + /* Create dataset */ + dset_id = H5Dcreate2(loc_id, ds_path, H5T_STD_REF_DSETREG, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + if(dset_id < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create region references to datasets") -/* write the data */ - status = H5Dwrite(dset_id, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); - } else { - dset_id = H5Dcreate2(loc_id, ds_path, H5T_STD_REF_OBJ, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); - if(dset_id < 0) - H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create region references to objects") - status = H5Dwrite(dset_id, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); - } - status = H5Dclose(dset_id); - dset_id = -1; - status = H5Sclose(filespace); - filespace = -1; + /* write the data */ + status = H5Dwrite(dset_id, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + } /* end if */ + else { + dset_id = H5Dcreate2(loc_id, ds_path, H5T_STD_REF_OBJ, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + if(dset_id < 0) + H5E_THROW(H5E_CANTCREATE, "H5LR: Unable to create region references to objects") + status = H5Dwrite(dset_id, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + } /* end else */ + status = H5Dclose(dset_id); + dset_id = -1; + status = H5Sclose(filespace); + filespace = -1; -/* DEALLOCATE MEMORY */ - free(data); - data_alloc = FALSE; + /* deallocate memory */ + free(data); + data_alloc = FALSE; -/* CLOSE RESOURCES */ + /* close resources */ - if(status < 0) { + if(status < 0) H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close datatype") - } CATCH - current_stack_id = H5Eget_current_stack(); + current_stack_id = H5Eget_current_stack(); - if(data_alloc) free(data); + if(data_alloc) free(data); - /* Close the dataspace */ - if(filespace > 0) - status = H5Sclose(filespace); + /* Close the dataspace */ + if(filespace > 0) + status = H5Sclose(filespace); - /* Close the dataset */ - if(dset_id > 0) - status = H5Dclose(dset_id); + /* Close the dataset */ + if(dset_id > 0) + status = H5Dclose(dset_id); - status = H5Eset_current_stack(current_stack_id); + status = H5Eset_current_stack(current_stack_id); END_FUNC(PUB) diff --git a/hl/src/H5LT.c b/hl/src/H5LT.c index 74e960c..d5d50b0 100644 --- a/hl/src/H5LT.c +++ b/hl/src/H5LT.c @@ -707,56 +707,49 @@ out: * *------------------------------------------------------------------------- */ + BEGIN_FUNC(PUB, ERR, herr_t, SUCCEED, FAIL, -H5LTget_dataset_ndims( hid_t loc_id, - const char *dset_name, - int *rank ) ) +H5LTget_dataset_ndims(hid_t loc_id, const char *dset_name, int *rank)) - hid_t did = -1; - hid_t sid = -1; - herr_t status; - hid_t current_stack_id = -1; + hid_t did = -1; + hid_t sid = -1; + herr_t status; + hid_t current_stack_id = -1; /* Open the dataset. */ did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT); - - if(did < 0) { + if(did < 0) H5E_THROW(H5E_NOTFOUND, "H5LT: Failed to open the dataset") - } /* end if */ + /* Get the dataspace handle */ sid = H5Dget_space(did); - - if(sid < 0) { + if(sid < 0) H5E_THROW(H5E_BADSELECT, "H5LT: Failed to get dataspace handle") - } /* end if */ /* Get rank */ *rank = H5Sget_simple_extent_ndims(sid); - if(*rank < 0) { + if(*rank < 0) H5E_THROW(H5E_BADSELECT, "H5LT: Failed to get dataspace rank") - } /* end if */ CATCH -/* save the current error stack before closing */ -current_stack_id = H5Eget_current_stack(); - -/* Close appropriate items, if error occurs it will not be reported */ -if(sid > 0) - status = H5Sclose(sid); + /* save the current error stack before closing */ + current_stack_id = H5Eget_current_stack(); -if(did > 0) - status = H5Dclose(did); + /* Close appropriate items, if error occurs it will not be reported */ + if(did > 0) + status = H5Dclose(did); + if(sid > 0) + status = H5Sclose(sid); -/* retrieve the error stack */ -status = H5Eset_current_stack(current_stack_id); + /* retrieve the error stack */ + status = H5Eset_current_stack(current_stack_id); END_FUNC(PUB) - /*------------------------------------------------------------------------- * Function: H5LTget_dataset_info * @@ -2999,130 +2992,123 @@ out: */ BEGIN_FUNC(PUB, ERR, herr_t, SUCCEED, FAIL, -H5LTread_region(const char *file, - const char *path, - const hsize_t *block_coord, - hid_t mem_type, - void *buf ) ) - - herr_t status; /* API return status */ - hid_t file_id; /* file identifier for the open file */ - hid_t dset_id; /* dataset identifier */ - hid_t file_space_id; /* identifier of the dataset's dataspace in the file */ - hid_t mem_space_id; /* identifier of the memory dataspace */ - int ndim; /* the dimensionality of a dataspace */ - hsize_t *dims; /* an array of the size of each dimension */ - int i; /* counter */ - hid_t current_stack_id = -1; /* current error stack id */ - /* flags marking state of allocation */ - hbool_t dims_alloc = FALSE; - - /* Open the file */ - file_id = H5Fopen(file, H5F_ACC_RDONLY, H5P_DEFAULT); - if(file_id < 0) - H5E_THROW(H5E_CANTOPENFILE, "H5LT: Failed to open file") - - /* Open the dataset for a given the path */ - dset_id = H5Dopen2(file_id, path, H5P_DEFAULT); - if(dset_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataset") - - /* Get the dataspace of the dataset */ - file_space_id = H5Dget_space(dset_id); - if(file_space_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataspace") - - /* Find the rank of the dataspace */ - ndim = H5Sget_simple_extent_ndims(file_space_id); - if(ndim < 0) - H5E_THROW(H5E_NOTFOUND, "H5LT: Failed to find extents of dataspace") - - /* Allocate space for the dimension array */ - dims = (hsize_t *)malloc (sizeof (hsize_t) * ndim); - if(dims == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") - dims_alloc = TRUE; - - /* Find the dimensions of each data space from the block coordinates */ - for (i=0; i<ndim; i++) - dims[i] = block_coord[i+ndim] - block_coord[i] + 1; - - /* Create dataspace for reading buffer */ - mem_space_id = H5Screate_simple(ndim, dims, NULL); - if(mem_space_id < 0) - H5E_THROW(H5E_CANTCREATE, "H5LT: Failed to create dataspace for retrieving elements") - - /* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for reading memory dataset */ - /* 1 2 n 1 2 n */ - - status = H5Sselect_hyperslab(file_space_id,H5S_SELECT_SET, block_coord, NULL, dims,NULL); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LT: Failed to select hyperslab") - - /* Read data from dataset into the buffer */ - status = H5Dread(dset_id, mem_type, mem_space_id, file_space_id, H5P_DEFAULT, buf); - if(status < 0) - H5E_THROW(H5E_READERROR, "H5LT: Unable to retrieve elements") - - /* CLOSE THE DATA */ - - /* Close the dataset */ - if(dset_id > 0) { - status = H5Dclose(dset_id); - dset_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") - } - } - /* Close the file space */ - if(file_space_id > 0) { - status = H5Sclose(file_space_id); - file_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - /* Close the memory space */ - if(mem_space_id > 0) { - status = H5Sclose(mem_space_id); - mem_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") - } - } - /* Close the file */ - if(file_id > 0) { - status = H5Fclose(file_id); - file_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") - } - } - - /* deallocate arrays */ - free(dims); - dims_alloc = FALSE; +H5LTread_region(const char *file, const char *path, const hsize_t *block_coord, + hid_t mem_type, void *buf)) + + herr_t status; /* API return status */ + hid_t file_id; /* file identifier for the open file */ + hid_t dset_id; /* dataset identifier */ + hid_t file_space_id; /* identifier of the dataset's dataspace in the file */ + hid_t mem_space_id; /* identifier of the memory dataspace */ + int ndim; /* the dimensionality of a dataspace */ + hsize_t *dims; /* an array of the size of each dimension */ + int i; /* counter */ + hid_t current_stack_id = -1; /* current error stack id */ + /* flags marking state of allocation */ + hbool_t dims_alloc = FALSE; + + /* Open the file */ + file_id = H5Fopen(file, H5F_ACC_RDONLY, H5P_DEFAULT); + if(file_id < 0) + H5E_THROW(H5E_CANTOPENFILE, "H5LT: Failed to open file") + + /* Open the dataset for a given the path */ + dset_id = H5Dopen2(file_id, path, H5P_DEFAULT); + if(dset_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataset") + + /* Get the dataspace of the dataset */ + file_space_id = H5Dget_space(dset_id); + if(file_space_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataspace") + + /* Find the rank of the dataspace */ + ndim = H5Sget_simple_extent_ndims(file_space_id); + if(ndim < 0) + H5E_THROW(H5E_NOTFOUND, "H5LT: Failed to find extents of dataspace") + + /* Allocate space for the dimension array */ + dims = (hsize_t *)malloc (sizeof (hsize_t) * ndim); + if(dims == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") + dims_alloc = TRUE; + + /* Find the dimensions of each data space from the block coordinates */ + for(i=0; i<ndim; i++) + dims[i] = block_coord[i+ndim] - block_coord[i] + 1; + + /* Create dataspace for reading buffer */ + mem_space_id = H5Screate_simple(ndim, dims, NULL); + if(mem_space_id < 0) + H5E_THROW(H5E_CANTCREATE, "H5LT: Failed to create dataspace for retrieving elements") + + /* Select (x , x , ..., x) x (y , y , ..., y) hyperslab for reading memory dataset */ + /* 1 2 n 1 2 n */ + + status = H5Sselect_hyperslab(file_space_id,H5S_SELECT_SET, block_coord, NULL, dims,NULL); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LT: Failed to select hyperslab") + + /* Read data from dataset into the buffer */ + status = H5Dread(dset_id, mem_type, mem_space_id, file_space_id, H5P_DEFAULT, buf); + if(status < 0) + H5E_THROW(H5E_READERROR, "H5LT: Unable to retrieve elements") + + /* CLOSE THE DATA */ + + /* Close the dataset */ + if(dset_id > 0) { + status = H5Dclose(dset_id); + dset_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") + } /* end if */ + /* Close the file space */ + if(file_space_id > 0) { + status = H5Sclose(file_space_id); + file_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + /* Close the memory space */ + if(mem_space_id > 0) { + status = H5Sclose(mem_space_id); + mem_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataspace") + } /* end if */ + /* Close the file */ + if(file_id > 0) { + status = H5Fclose(file_id); + file_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LR: Failed to close dataset") + } /* end if */ + + /* deallocate arrays */ + free(dims); + dims_alloc = FALSE; CATCH - current_stack_id = H5Eget_current_stack(); + current_stack_id = H5Eget_current_stack(); - if(dims_alloc) free(dims); + if(dims_alloc) free(dims); - /* Close the dataspaces */ - if(file_space_id > 0) - status = H5Sclose(file_space_id); - if(mem_space_id > 0) - status = H5Sclose(mem_space_id); + /* Close the dataspaces */ + if(file_space_id > 0) + status = H5Sclose(file_space_id); + if(mem_space_id > 0) + status = H5Sclose(mem_space_id); - /* Close the dataset */ - if(dset_id > 0) - status = H5Dclose(dset_id); - /* Close the file */ - if(file_id > 0) - status = H5Fclose(file_id); + /* Close the dataset */ + if(dset_id > 0) + status = H5Dclose(dset_id); + /* Close the file */ + if(file_id > 0) + status = H5Fclose(file_id); - status = H5Eset_current_stack(current_stack_id); + status = H5Eset_current_stack(current_stack_id); END_FUNC(PUB) @@ -3147,269 +3133,260 @@ END_FUNC(PUB) BEGIN_FUNC(PUB, ERR, herr_t, SUCCEED, FAIL, -H5LTcopy_region(const char *file_src, - const char *path_src, - const hsize_t *block_coord_src, - const char *file_dest, - const char *path_dest, - const hsize_t *block_coord_dset) ) - - herr_t status; /* API return status */ - hsize_t *dims, *dims_src; /* array of the size of each destination, source dimension */ - hid_t file_space_id; /* identifier of the dataset's dataspace in the file */ - hid_t mem_space_id; /* identifier of the memory dataspace */ - hid_t dset_id, type_id, file_id; /* Destination: dataset, dataspace, file ids */ - hid_t did_src, sid_src, fid_src; /* Source: dataset, dataspace, file ids */ - int ndim; /* the dimensionality of a dataspace */ - void *buf; /* buffer to hold data */ - hsize_t numelem_src; /* total number of elements in hyperslab */ - int nrank_src; /* the dimensionality of the source dataspace */ - int i, j; /* counters */ - hsize_t *stride; /* hyperslab stride */ - hid_t dtype; /* data type of source */ - hid_t current_stack_id = -1; /* current error stack id */ -/* flags marking state of allocation */ - hbool_t dims_src_alloc = FALSE; - hbool_t dims_alloc = FALSE; - hbool_t buf_alloc = FALSE; - hbool_t stride_alloc = FALSE; - - /* Open the source file */ - fid_src = H5Fopen(file_src, H5F_ACC_RDONLY, H5P_DEFAULT); - if(fid_src < 0) - H5E_THROW(H5E_CANTOPENFILE, "H5LT: Failed to open file") - - /* Open the dataset for a given the source path */ - did_src = H5Dopen2(fid_src, path_src, H5P_DEFAULT); - if(did_src < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataset for the given path") - - /* Get the source dataspace of the dataset */ - sid_src = H5Dget_space(did_src); - if(sid_src < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataspace") - - /* Find the rank of the dataspace */ - nrank_src = H5Sget_simple_extent_ndims(sid_src); - if(nrank_src < 0) - H5E_THROW(H5E_NOTFOUND, "H5LT: Failed to find extents of dataspace") - - /* Allocate space for the dimension array */ - dims_src = (hsize_t *)malloc (sizeof (hsize_t) * nrank_src); - if(dims_src == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") - dims_src_alloc = TRUE; - - numelem_src = 1; - for (j=0; j<nrank_src; j++) { - dims_src[j] = block_coord_src[nrank_src + j] - block_coord_src[j] + 1; - numelem_src = dims_src[j]*numelem_src; - } - - /* datatype of source dataspace */ - dtype = H5Dget_type(did_src); - if(dtype < 0) - H5E_THROW(H5E_CANTGET, "H5LT: Failed to find the data type") - /* native datatype of source dataspace */ - type_id = H5Tget_native_type(dtype , H5T_DIR_DEFAULT ); - if(type_id < 0) - H5E_THROW(H5E_CANTGET, "H5LT: Failed to find the native data type") +H5LTcopy_region(const char *file_src, const char *path_src, const hsize_t *block_coord_src, + const char *file_dest, const char *path_dest, const hsize_t *block_coord_dset)) + + herr_t status; /* API return status */ + hsize_t *dims; /* array of the size of each for the destination dimension */ + hsize_t *dims_src; /* array of the size of each for the source dimension */ + hid_t file_space_id; /* identifier of the dataset's dataspace in the file */ + hid_t mem_space_id; /* identifier of the memory dataspace */ + hid_t file_id; /* Destination: file ids */ + hid_t dset_id; /* Destination: dataset ids */ + hid_t type_id; /* Destination: datatype ids */ + hid_t fid_src; /* Source: file ids */ + hid_t sid_src; /* Source: dataset ids */ + hid_t did_src; /* Source: datatype ids */ + int ndim; /* the dimensionality of a dataspace */ + void *buf; /* buffer to hold data */ + hsize_t numelem_src; /* total number of elements in hyperslab */ + int nrank_src; /* the dimensionality of the source dataspace */ + int i, j; /* counters */ + hsize_t *stride; /* hyperslab stride */ + hid_t dtype; /* data type of source */ + hid_t current_stack_id = -1; /* current error stack id */ + /* flags marking state of allocation */ + hbool_t dims_src_alloc = FALSE; + hbool_t dims_alloc = FALSE; + hbool_t buf_alloc = FALSE; + hbool_t stride_alloc = FALSE; + + /* Open the source file */ + fid_src = H5Fopen(file_src, H5F_ACC_RDONLY, H5P_DEFAULT); + if(fid_src < 0) + H5E_THROW(H5E_CANTOPENFILE, "H5LT: Failed to open file") + + /* Open the dataset for a given the source path */ + did_src = H5Dopen2(fid_src, path_src, H5P_DEFAULT); + if(did_src < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataset for the given path") + + /* Get the source dataspace of the dataset */ + sid_src = H5Dget_space(did_src); + if(sid_src < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataspace") + + /* Find the rank of the dataspace */ + nrank_src = H5Sget_simple_extent_ndims(sid_src); + if(nrank_src < 0) + H5E_THROW(H5E_NOTFOUND, "H5LT: Failed to find extents of dataspace") + + /* Allocate space for the dimension array */ + dims_src = (hsize_t *)malloc (sizeof (hsize_t) * nrank_src); + if(dims_src == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") + dims_src_alloc = TRUE; + + numelem_src = 1; + for(j=0; j<nrank_src; j++) { + dims_src[j] = block_coord_src[nrank_src + j] - block_coord_src[j] + 1; + numelem_src = dims_src[j]*numelem_src; + } /* end for */ + + /* datatype of source dataspace */ + dtype = H5Dget_type(did_src); + if(dtype < 0) + H5E_THROW(H5E_CANTGET, "H5LT: Failed to find the data type") + /* native datatype of source dataspace */ + type_id = H5Tget_native_type(dtype , H5T_DIR_DEFAULT); + if(type_id < 0) + H5E_THROW(H5E_CANTGET, "H5LT: Failed to find the native data type") - buf = malloc(sizeof(type_id) * numelem_src); - if(buf == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") - buf_alloc = TRUE; - - /* Create dataspace for reading buffer */ - mem_space_id = H5Screate_simple(nrank_src, dims_src, NULL); - if(mem_space_id < 0) - H5E_THROW(H5E_CANTCREATE, "H5LT: Unable to create dataspace for retrieving elements") - - /* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for reading memory dataset */ - /* 1 2 n 1 2 n */ - - status = H5Sselect_hyperslab(sid_src,H5S_SELECT_SET,block_coord_src,NULL,dims_src,NULL); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LT: Failed to select hyperslab") - - - /* Read data from dataset into the buffer */ - status = H5Dread(did_src, type_id, mem_space_id, sid_src, H5P_DEFAULT, buf); - if(status < 0) - H5E_THROW(H5E_READERROR, "H5LT: Unable to retrieve elements in hyperslab") - - /* Close the dataset */ - if(did_src > 0) { - status = H5Dclose(did_src); - did_src = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") - } - } - /* Close the dataspaces */ - if(sid_src > 0) { - status = H5Sclose(sid_src); - sid_src = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") - } - } - if(mem_space_id > 0) { - status = H5Sclose(mem_space_id); - mem_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") - } - } - /* Close the source file */ - if(fid_src > 0) { - status = H5Fclose(fid_src); - fid_src = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") - } - } - free(dims_src); - dims_src_alloc = FALSE; - -/* Open the destination file */ - file_id = H5Fopen(file_dest, H5F_ACC_RDWR, H5P_DEFAULT); - if(file_id < 0) - H5E_THROW(H5E_CANTOPENFILE, "H5LT: Failed to open file") - -/* Open the dataset for a given the path */ - dset_id = H5Dopen2(file_id, path_dest, H5P_DEFAULT); - if(dset_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataset") - -/* Get the dataspace of the dataset */ - file_space_id = H5Dget_space(dset_id); - if(file_space_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataspace for given path") - -/* Find the rank of the dataspace */ - ndim = H5Sget_simple_extent_ndims(file_space_id); - if(ndim < 0) - H5E_THROW(H5E_NOTFOUND, "H5LT: Failed to find extents of dataspace") - - /* Allocate space for the dimension array */ - dims = (hsize_t *)malloc (sizeof (hsize_t) * ndim); - if(dims == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") - dims_alloc = TRUE; - - /* find the dimensions of each data space from the block coordinates */ - for (i=0; i<ndim; i++) - dims[i] = block_coord_dset[i+ndim] - block_coord_dset[i] + 1; - - /* Create dataspace for writing the buffer */ - mem_space_id = H5Screate_simple(ndim, dims, NULL); - if(mem_space_id < 0) - H5E_THROW(H5E_CANTCREATE, "H5LT: Unable to create dataspace for retrieving elements") - -/* Select (x , x , ..., x ) x (y , y , ..., y ) hyperslab for writing memory dataset */ -/* 1 2 n 1 2 n */ - - stride = (hsize_t *)malloc (sizeof (hsize_t) * ndim); - if(stride == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") - stride_alloc = TRUE; - - for (i=0; i<ndim; i++) - stride[i] = block_coord_dset[i + ndim] - block_coord_dset[i] + 1; - - status = H5Sselect_hyperslab(file_space_id,H5S_SELECT_SET, block_coord_dset,NULL,stride,NULL); - if(status < 0) - H5E_THROW(H5E_CANTSELECT, "H5LT: Failed to select hyperslab") - - status = H5Dwrite(dset_id, type_id, mem_space_id, file_space_id, H5P_DEFAULT, buf); - if(status < 0) - H5E_THROW(H5E_CANTCREATE, "H5LT: Unable to create dataset") - - /* CLOSE THE DATA */ + buf = malloc(sizeof(type_id) * numelem_src); + if(buf == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") + buf_alloc = TRUE; + + /* Create dataspace for reading buffer */ + mem_space_id = H5Screate_simple(nrank_src, dims_src, NULL); + if(mem_space_id < 0) + H5E_THROW(H5E_CANTCREATE, "H5LT: Unable to create dataspace for retrieving elements") + + /* Select (x , x , ..., x) x (y , y , ..., y) hyperslab for reading memory dataset */ + /* 1 2 n 1 2 n */ + + status = H5Sselect_hyperslab(sid_src,H5S_SELECT_SET,block_coord_src,NULL,dims_src,NULL); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LT: Failed to select hyperslab") + + + /* Read data from dataset into the buffer */ + status = H5Dread(did_src, type_id, mem_space_id, sid_src, H5P_DEFAULT, buf); + if(status < 0) + H5E_THROW(H5E_READERROR, "H5LT: Unable to retrieve elements in hyperslab") + + /* Close the dataset */ + if(did_src > 0) { + status = H5Dclose(did_src); + did_src = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") + } + /* Close the dataspaces */ + if(sid_src > 0) { + status = H5Sclose(sid_src); + sid_src = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") + } + if(mem_space_id > 0) { + status = H5Sclose(mem_space_id); + mem_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") + } + /* Close the source file */ + if(fid_src > 0) { + status = H5Fclose(fid_src); + fid_src = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") + } + free(dims_src); + dims_src_alloc = FALSE; + + /* Open the destination file */ + file_id = H5Fopen(file_dest, H5F_ACC_RDWR, H5P_DEFAULT); + if(file_id < 0) + H5E_THROW(H5E_CANTOPENFILE, "H5LT: Failed to open file") + + /* Open the dataset for a given the path */ + dset_id = H5Dopen2(file_id, path_dest, H5P_DEFAULT); + if(dset_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataset") + + /* Get the dataspace of the dataset */ + file_space_id = H5Dget_space(dset_id); + if(file_space_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataspace for given path") + + /* Find the rank of the dataspace */ + ndim = H5Sget_simple_extent_ndims(file_space_id); + if(ndim < 0) + H5E_THROW(H5E_NOTFOUND, "H5LT: Failed to find extents of dataspace") + + /* Allocate space for the dimension array */ + dims = (hsize_t *)malloc (sizeof (hsize_t) * ndim); + if(dims == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") + dims_alloc = TRUE; + + /* find the dimensions of each data space from the block coordinates */ + for (i=0; i<ndim; i++) + dims[i] = block_coord_dset[i+ndim] - block_coord_dset[i] + 1; + + /* Create dataspace for writing the buffer */ + mem_space_id = H5Screate_simple(ndim, dims, NULL); + if(mem_space_id < 0) + H5E_THROW(H5E_CANTCREATE, "H5LT: Unable to create dataspace for retrieving elements") + + /* Select (x , x , ..., x) x (y , y , ..., y) hyperslab for writing memory dataset */ + /* 1 2 n 1 2 n */ + + stride = (hsize_t *)malloc (sizeof (hsize_t) * ndim); + if(stride == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") + stride_alloc = TRUE; + + for(i=0; i<ndim; i++) + stride[i] = block_coord_dset[i + ndim] - block_coord_dset[i] + 1; + + status = H5Sselect_hyperslab(file_space_id,H5S_SELECT_SET, block_coord_dset,NULL,stride,NULL); + if(status < 0) + H5E_THROW(H5E_CANTSELECT, "H5LT: Failed to select hyperslab") + + status = H5Dwrite(dset_id, type_id, mem_space_id, file_space_id, H5P_DEFAULT, buf); + if(status < 0) + H5E_THROW(H5E_CANTCREATE, "H5LT: Unable to create dataset") + + /* CLOSE THE DATA */ - /* Close the dataset */ - if(dset_id > 0) { - status = H5Dclose(dset_id); - dset_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") + /* Close the dataset */ + if(dset_id > 0) { + status = H5Dclose(dset_id); + dset_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") } - } - /* Close the dataspaces */ - if(file_space_id > 0) { - status = H5Sclose(file_space_id); - file_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") + /* Close the dataspaces */ + if(file_space_id > 0) { + status = H5Sclose(file_space_id); + file_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") } - } - if(mem_space_id > 0) { - status = H5Sclose(mem_space_id); - mem_space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") + if(mem_space_id > 0) { + status = H5Sclose(mem_space_id); + mem_space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") } - } - /* Close datatypes */ - if(type_id > 0) { - status = H5Tclose(type_id); - type_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close datatype") + /* Close datatypes */ + if(type_id > 0) { + status = H5Tclose(type_id); + type_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close datatype") } - } - if(dtype > 0) { - status = H5Tclose(dtype); - dtype = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close datatype") + if(dtype > 0) { + status = H5Tclose(dtype); + dtype = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close datatype") } - } - /* Close the file */ - if(file_id > 0) { - status = H5Fclose(file_id); - file_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") + /* Close the file */ + if(file_id > 0) { + status = H5Fclose(file_id); + file_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataset") } - } - free(stride); - free(buf); - free(dims); + free(stride); + free(buf); + free(dims); - stride_alloc = FALSE; - buf_alloc = FALSE; - dims_alloc = FALSE; + stride_alloc = FALSE; + buf_alloc = FALSE; + dims_alloc = FALSE; CATCH - current_stack_id = H5Eget_current_stack(); + current_stack_id = H5Eget_current_stack(); - if(dims_alloc) free(dims); - if(buf_alloc) free(buf); - if(stride_alloc) free(stride); - if(dims_src_alloc) free(dims_src); + if(dims_alloc) free(dims); + if(buf_alloc) free(buf); + if(stride_alloc) free(stride); + if(dims_src_alloc) free(dims_src); - /* Close the dataspace */ - if(file_space_id > 0) - status = H5Sclose(file_space_id); - if(mem_space_id > 0) - status = H5Sclose(mem_space_id); + /* Close the dataspace */ + if(file_space_id > 0) + status = H5Sclose(file_space_id); + if(mem_space_id > 0) + status = H5Sclose(mem_space_id); - /* Close the dataset */ - if(dset_id > 0) - status = H5Dclose(dset_id); - /* Close the file */ - if(file_id > 0) - status = H5Fclose(file_id); - /* Close the datatypes */ - if(dtype > 0) - status = H5Tclose(dtype); - if(type_id > 0) - status = H5Tclose(type_id); - - status = H5Eset_current_stack(current_stack_id); + /* Close the dataset */ + if(dset_id > 0) + status = H5Dclose(dset_id); + /* Close the file */ + if(file_id > 0) + status = H5Fclose(file_id); + /* Close the datatypes */ + if(dtype > 0) + status = H5Tclose(dtype); + if(type_id > 0) + status = H5Tclose(type_id); + + status = H5Eset_current_stack(current_stack_id); END_FUNC(PUB) @@ -3434,107 +3411,111 @@ END_FUNC(PUB) BEGIN_FUNC(PUB, ERR, herr_t, SUCCEED, FAIL, H5LTread_bitfield_value(hid_t dset_id, int num_values, const unsigned *offset, - const unsigned *lengths, hid_t *space, int *buf) ) - - herr_t status; /* API return status */ - H5S_sel_type sel_type; /* type selection */ - hid_t space_id = -1, mem_space = -1; /* dataspace ids */ - hsize_t dims[1]; /* array of the size of source dimension, reading into 1D array */ - int i, j, icnt; /* counters */ - unsigned char *buf_src; /* buffer to read data into from source */ - hid_t dtype; /* data type of source */ - hid_t current_stack_id = -1; /* current error stack id */ - hbool_t buf_src_alloc = FALSE; /* flag marking state of allocation */ - - /* Determine the type of the dataspace selection */ - space_id = H5Dget_space (dset_id); - if(space_id < 0) - H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataspace for given path") - - sel_type = H5Sget_select_type(space_id); + const unsigned *lengths, hid_t *space, int *buf)) + + herr_t status; /* API return status */ + H5S_sel_type sel_type; /* type selection */ + hid_t space_id = -1; /* dataspace id */ + hid_t mem_space = -1; /* memory dataspace id */ + hsize_t dims[1]; /* array of the size of source dimension, reading into 1D array */ + int i, j, icnt; /* counters */ + unsigned char *buf_src; /* buffer to read data into from source */ + hid_t dtype; /* data type of source */ + hid_t current_stack_id = -1; /* current error stack id */ + hbool_t buf_src_alloc = FALSE; /* flag marking state of allocation */ + + /* Determine the type of the dataspace selection */ + space_id = H5Dget_space (dset_id); + if(space_id < 0) + H5E_THROW(H5E_CANTOPENOBJ, "H5LT: Failed to open dataspace for given path") + + sel_type = H5Sget_select_type(space_id); - /* Get the number of elements */ - if(sel_type==H5S_SEL_HYPERSLABS){ - dims[0] = H5Sget_select_hyper_nblocks(space_id); - } else if(sel_type==H5S_SEL_POINTS){ - dims[0] = H5Sget_select_npoints(space_id); - } else if(sel_type==H5S_SEL_NONE){ - goto catch_except; - } else if(sel_type==H5S_SEL_ALL){ - dims[0] = H5Sget_select_npoints(space_id); - } else - H5E_THROW(H5E_BADSELECT, "H5LT: Failed to find selection type") - - /* Create a new simple dataspace in memory and open it for access */ - mem_space = H5Screate_simple (1, dims, NULL); - if(mem_space < 0) - H5E_THROW(H5E_CANTCREATE, "H5LT: Unable to create dataspace for retrieving elements") - - buf_src = malloc(sizeof(unsigned char) * dims[0]); - if(buf_src == NULL) - H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") - buf_src_alloc = TRUE; - - dtype = H5Dget_type(dset_id); - if(dtype < 0) - H5E_THROW(H5E_CANTGET, "H5LT: Unable to determine datatype of dataset") - - /* Read the region data from the file_space into the mem_space */ - status = H5Dread (dset_id, dtype, mem_space, space_id, H5P_DEFAULT, buf_src); - if(status < 0) - H5E_THROW(H5E_READERROR, "H5LT: Unable to read region data") + /* Get the number of elements */ + if(sel_type==H5S_SEL_HYPERSLABS) { + dims[0] = H5Sget_select_hyper_nblocks(space_id); + } /* end if */ + else if(sel_type==H5S_SEL_POINTS) { + dims[0] = H5Sget_select_npoints(space_id); + } /* end else if */ + else if(sel_type==H5S_SEL_NONE) { + goto catch_except; + } /* end else if */ + else if(sel_type==H5S_SEL_ALL) { + dims[0] = H5Sget_select_npoints(space_id); + } /* end else if */ + else + H5E_THROW(H5E_BADSELECT, "H5LT: Failed to find selection type") + + /* Create a new simple dataspace in memory and open it for access */ + mem_space = H5Screate_simple (1, dims, NULL); + if(mem_space < 0) + H5E_THROW(H5E_CANTCREATE, "H5LT: Unable to create dataspace for retrieving elements") + + buf_src = malloc(sizeof(unsigned char) * dims[0]); + if(buf_src == NULL) + H5E_THROW(H5E_CANTALLOC, "H5LT: Failed to allocate enough memory") + buf_src_alloc = TRUE; + + dtype = H5Dget_type(dset_id); + if(dtype < 0) + H5E_THROW(H5E_CANTGET, "H5LT: Unable to determine datatype of dataset") + + /* Read the region data from the file_space into the mem_space */ + status = H5Dread (dset_id, dtype, mem_space, space_id, H5P_DEFAULT, buf_src); + if(status < 0) + H5E_THROW(H5E_READERROR, "H5LT: Unable to read region data") - icnt = 0; - for (i = 0; i< (int)dims[0]; i++) - for (j = 0; j<num_values; j++){ - buf[icnt] = (int*)((buf_src[i] >> (offset[j]) ) & ((1 << lengths[j] ) - 1)); - icnt += 1; + icnt = 0; + for(i=0; i<(int)dims[0]; i++) { + for(j=0; j<num_values; j++) { + buf[icnt] = (int*)((buf_src[i] >> (offset[j])) & ((1 << lengths[j]) - 1)); + icnt += 1; + } + } + + /* Close the dataspace */ + if(space_id > 0) { + status = H5Sclose(space_id); + space_id = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") + } + + /* Close the datatype */ + if(dtype > 0) { + status = H5Tclose(dtype); + dtype = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close datatype") + } + /* Close the memory space */ + if(mem_space > 0) { + status = H5Sclose(mem_space); + mem_space = -1; + if(status < 0) + H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") } - /* Close the dataspace */ - if(space_id > 0) { - status = H5Sclose(space_id); - space_id = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") - } - } - - /* Close the datatype */ - if(dtype > 0) { - status = H5Tclose(dtype); - dtype = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close datatype") - } - } - /* Close the memory space */ - if(mem_space > 0) { - status = H5Sclose(mem_space); - mem_space = -1; - if(status < 0) { - H5E_THROW(H5E_CLOSEERROR, "H5LT: Failed to close dataspace") - } - } - - free(buf_src); - buf_src_alloc = FALSE; + free(buf_src); + buf_src_alloc = FALSE; CATCH - current_stack_id = H5Eget_current_stack(); + current_stack_id = H5Eget_current_stack(); - /* Close */ - if(mem_space > 0) - status = H5Sclose(mem_space); - if(space_id> 0) - status = H5Sclose(space_id); - if(dtype> 0) - status = H5Sclose(dtype); + /* Close */ + if(mem_space > 0) + status = H5Sclose(mem_space); + if(space_id> 0) + status = H5Sclose(space_id); + if(dtype> 0) + status = H5Sclose(dtype); - if(buf_src_alloc) free(buf_src); + if(buf_src_alloc) + free(buf_src); - status = H5Eset_current_stack(current_stack_id); + status = H5Eset_current_stack(current_stack_id); END_FUNC(PUB) |