escdf_errno_t utils_hdf5_check_attr(hid_t loc_id, const char *name, hsize_t *dims, unsigned int ndims, hid_t *attr_pt) { hid_t attr_id, dtspace_id; if ((attr_id = H5Aopen(loc_id, name, H5P_DEFAULT)) < 0) RETURN_WITH_ERROR(attr_id); /* Check space dimensions. */ if ((dtspace_id = H5Aget_space(attr_id)) < 0) { DEFER_FUNC_ERROR(dtspace_id); goto cleanup_attr; } if (utils_hdf5_check_shape(dtspace_id, dims, ndims) != ESCDF_SUCCESS) { goto cleanup_dtspace; } H5Sclose(dtspace_id); if (attr_pt) *attr_pt = attr_id; else H5Aclose(attr_id); return ESCDF_SUCCESS; cleanup_dtspace: H5Sclose(dtspace_id); cleanup_attr: H5Aclose(attr_id); return ESCDF_ERROR; }
escdf_errno_t utils_hdf5_create_attr(hid_t loc_id, const char *name, hid_t type_id, hsize_t *dims, unsigned int ndims, hid_t *attr_pt) { hid_t attr_id, dtspace_id; /* Create space dimensions. */ if ((dtspace_id = H5Screate_simple(ndims, dims, NULL)) < 0) { RETURN_WITH_ERROR(dtspace_id); } if ((attr_id = H5Acreate(loc_id, name, type_id, dtspace_id, H5P_DEFAULT, H5P_DEFAULT)) < 0) { DEFER_FUNC_ERROR(attr_id); goto cleanup_dtspace; } H5Sclose(dtspace_id); if (attr_pt) *attr_pt = attr_id; else H5Aclose(attr_id); return ESCDF_SUCCESS; cleanup_dtspace: H5Sclose(attr_id); return ESCDF_ERROR; }
escdf_errno_t utils_hdf5_read_dbl_array(hid_t loc_id, const char *name, double **array, hsize_t *dims, unsigned int ndims, double range[2]) { escdf_errno_t err; unsigned int i; hsize_t len; len = 1; for (i = 0; i < ndims; i++) { len *= dims[i]; } *array = malloc(sizeof(double) * len); if ((err = utils_hdf5_read_attr(loc_id, name, H5T_NATIVE_DOUBLE, dims, ndims, (void*)*array)) != ESCDF_SUCCESS) { free(*array); return err; } for (i = 0; i < len; i++) { if ((*array)[i] < range[0] || (*array)[i] > range[1]) { free(*array); RETURN_WITH_ERROR(ESCDF_ERANGE); } } return ESCDF_SUCCESS; }
escdf_errno_t utils_hdf5_check_shape(hid_t dtspace_id, hsize_t *dims, unsigned int ndims) { htri_t bool_id; int ndims_id; hsize_t *dims_v, *maxdims_v; unsigned int i; if ((bool_id = H5Sis_simple(dtspace_id)) < 0) { RETURN_WITH_ERROR(bool_id); } if (!bool_id) { RETURN_WITH_ERROR(ESCDF_ERROR_DIM); } if ((ndims_id = H5Sget_simple_extent_ndims(dtspace_id)) < 0) { RETURN_WITH_ERROR(ndims_id); } if ((unsigned int)ndims_id != ndims) { RETURN_WITH_ERROR(ESCDF_ERROR_DIM); } dims_v = malloc(sizeof(hsize_t) * ndims); maxdims_v = malloc(sizeof(hsize_t) * ndims); if ((ndims_id = H5Sget_simple_extent_dims(dtspace_id, dims_v, maxdims_v)) < 0) { DEFER_FUNC_ERROR(ndims_id); goto cleanup_dims; } for (i = 0; i < ndims; i++) { if (dims_v[i] != dims[i] || maxdims_v[i] != dims[i]) { DEFER_FUNC_ERROR(ESCDF_ERROR_DIM); goto cleanup_dims; } } free(dims_v); free(maxdims_v); return ESCDF_SUCCESS; cleanup_dims: free(dims_v); free(maxdims_v); return ESCDF_ERROR; }
escdf_errno_t utils_hdf5_read_uint(hid_t loc_id, const char *name, _uint_set_t *scalar, unsigned int range[2]) { escdf_errno_t err; int value; hsize_t dims[1] = {1}; if ((err = utils_hdf5_read_attr(loc_id, name, H5T_NATIVE_INT, dims, 1, &value)) != ESCDF_SUCCESS) { return err; } if ((unsigned int)value < range[0] || (unsigned int)value > range[1]) { RETURN_WITH_ERROR(ESCDF_ERANGE); } *scalar = _uint_set((unsigned int)value); return ESCDF_SUCCESS; }
escdf_errno_t utils_hdf5_read_dataset(hid_t dtset_id, void *buf, hid_t mem_type_id, const hsize_t *start, const hsize_t *count, const hsize_t *stride) { hid_t memspace_id, diskspace_id, plist; herr_t err_id; hssize_t len; /* disk use the start, count and stride. */ if ((diskspace_id = H5Dget_space(dtset_id)) < 0) { RETURN_WITH_ERROR(diskspace_id); } if (start && count) { if ((err_id = H5Sselect_hyperslab(diskspace_id, H5S_SELECT_SET, start, stride, count, NULL)) < 0) { H5Sclose(diskspace_id); RETURN_WITH_ERROR(err_id); } } else { if ((err_id = H5Sselect_all(diskspace_id)) < 0) { H5Sclose(diskspace_id); RETURN_WITH_ERROR(err_id); } } if ((len = H5Sget_select_npoints(diskspace_id)) < 0) { H5Sclose(diskspace_id); RETURN_WITH_ERROR(len); } if (!len) { if ((err_id = H5Sselect_none(diskspace_id)) < 0) { H5Sclose(diskspace_id); RETURN_WITH_ERROR(err_id); } } /* create dataspace for memory and disk. */ /* memory is a flat array with the size on the slice. */ if ((memspace_id = H5Screate_simple(1, &len, NULL)) < 0) { H5Sclose(diskspace_id); RETURN_WITH_ERROR(memspace_id); } /* Read */ plist = H5Pcreate(H5P_DATASET_XFER); /* H5Pset_dxpl_mpio(plist, H5FD_MPIO_COLLECTIVE); */ if ((err_id = H5Dread(dtset_id, mem_type_id, memspace_id, diskspace_id, plist, buf)) < 0) { H5Pclose(plist); H5Sclose(diskspace_id); H5Sclose(memspace_id); RETURN_WITH_ERROR(err_id); } H5Pclose(plist); H5Sclose(diskspace_id); H5Sclose(memspace_id); return ESCDF_SUCCESS; }