Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}