From 1e2dd83542892774225f877793e6cee1511d9e64 Mon Sep 17 00:00:00 2001 From: Scot Breitenfeld Date: Tue, 23 Jan 2024 09:59:10 -0600 Subject: [PATCH] Fortran API work. (#3941) * - Added Fortran APIs: H5FGET_INTENT_F, H5SSELECT_ITER_CREATE_F, H5SSEL_ITER_GET_SEQ_LIST_F, H5SSELECT_ITER_CLOSE_F, H5S_mp_H5SSELECT_ITER_RESET_F - Added Fortran Parameters: H5S_SEL_ITER_GET_SEQ_LIST_SORTED_F, H5S_SEL_ITER_SHARE_WITH_DATASPACE_F - Added tests for new APIs - Removed H5F C wrapper stubs - Documentation misc. cleanup. --- fortran/src/H5Ff.c | 92 ---------------- fortran/src/H5Fff.F90 | 162 ++++++++++++++++++----------- fortran/src/H5Sff.F90 | 144 +++++++++++++++++++++++++ fortran/src/H5_f.c | 3 + fortran/src/H5_ff.F90 | 4 +- fortran/src/H5f90global.F90 | 5 + fortran/src/hdf5_fortrandll.def.in | 5 + fortran/test/fortranlib_test.F90 | 8 +- fortran/test/tH5F.F90 | 13 ++- fortran/test/tH5Sselect.F90 | 149 +++++++++++++++++++++++++- release_docs/RELEASE.txt | 7 ++ src/H5Spublic.h | 21 ++-- 12 files changed, 441 insertions(+), 172 deletions(-) diff --git a/fortran/src/H5Ff.c b/fortran/src/H5Ff.c index 9703486577b..4b56ccaae9f 100644 --- a/fortran/src/H5Ff.c +++ b/fortran/src/H5Ff.c @@ -189,98 +189,6 @@ h5funmount_c(hid_t_f *loc_id, _fcd dsetname, int_f *namelen) return ret_value; } -/****if* H5Ff/h5fget_create_plist_c - * NAME - * h5fget_create_plist_c - * PURPOSE - * Call H5Fget_create_plist to get the file creation property list - * INPUTS - * file_id - file identifier - * OUTPUTS - * prop_id - creation property list identifier - * RETURNS - * 0 on success, -1 on failure - * SOURCE - */ -int_f -h5fget_create_plist_c(hid_t_f *file_id, hid_t_f *prop_id) -/******/ -{ - int ret_value = -1; - hid_t c_file_id, c_prop_id; - - c_file_id = (hid_t)*file_id; - c_prop_id = H5Fget_create_plist(c_file_id); - - if (c_prop_id < 0) - return ret_value; - *prop_id = (hid_t_f)c_prop_id; - - ret_value = 0; - return ret_value; -} - -/****if* H5Ff/h5fget_access_plist_c - * NAME - * h5fget_access_plist_c - * PURPOSE - * Call H5Fget_access_plist to get the file access property list - * INPUTS - * file_id - file identifier - * OUTPUTS - * access_id - access property list identifier - * RETURNS - * 0 on success, -1 on failure - * SOURCE - */ -int_f -h5fget_access_plist_c(hid_t_f *file_id, hid_t_f *access_id) -/******/ -{ - int ret_value = -1; - hid_t c_file_id, c_access_id; - - c_file_id = (hid_t)*file_id; - c_access_id = H5Fget_access_plist(c_file_id); - - if (c_access_id < 0) - return ret_value; - *access_id = (hid_t_f)c_access_id; - - ret_value = 0; - return ret_value; -} - -/****if* H5Ff/h5fget_obj_count_c - * NAME - * h5fget_obj_count_c - * PURPOSE - * Call H5Fget_obj_count to get number of open objects within a file - * INPUTS - * file_id - identifier of the file to be closed - * obj_type - type of the object - * RETURNS - * obj_count - number of objects - * 0 on success, -1 on failure - * SOURCE - */ - -int_f -h5fget_obj_count_c(hid_t_f *file_id, int_f *obj_type, size_t_f *obj_count) -/******/ -{ - int ret_value = 0; - hid_t c_file_id; - unsigned c_obj_type; - ssize_t c_obj_count; - - c_file_id = (hid_t)*file_id; - c_obj_type = (unsigned)*obj_type; - if ((c_obj_count = H5Fget_obj_count(c_file_id, c_obj_type)) < 0) - ret_value = -1; - *obj_count = (size_t_f)c_obj_count; - return ret_value; -} /****if* H5Ff/h5fget_obj_ids_c * NAME * h5fget_obj_ids_c diff --git a/fortran/src/H5Fff.F90 b/fortran/src/H5Fff.F90 index 79aa5a7a34b..fcfde86a20e 100644 --- a/fortran/src/H5Fff.F90 +++ b/fortran/src/H5Fff.F90 @@ -639,19 +639,21 @@ END SUBROUTINE h5freopen_async_f !! SUBROUTINE h5fget_create_plist_f(file_id, prop_id, hdferr) IMPLICIT NONE - INTEGER(HID_T), INTENT(IN) :: file_id + INTEGER(HID_T), INTENT(IN) :: file_id INTEGER(HID_T), INTENT(OUT) :: prop_id - INTEGER, INTENT(OUT) :: hdferr + INTEGER , INTENT(OUT) :: hdferr INTERFACE - INTEGER FUNCTION h5fget_create_plist_c(file_id, prop_id) BIND(C,NAME='h5fget_create_plist_c') + INTEGER(HID_T) FUNCTION H5Fget_create_plist(file_id) BIND(C,NAME='H5Fget_create_plist') IMPORT :: HID_T IMPLICIT NONE - INTEGER(HID_T), INTENT(IN) :: file_id - INTEGER(HID_T), INTENT(OUT) :: prop_id - END FUNCTION h5fget_create_plist_c + INTEGER(HID_T), VALUE :: file_id + END FUNCTION H5Fget_create_plist END INTERFACE - hdferr = h5fget_create_plist_c(file_id, prop_id) + prop_id = H5Fget_create_plist(file_id) + + hdferr = 0 + IF(prop_id.LT.0) hdferr = -1 END SUBROUTINE h5fget_create_plist_f !> @@ -667,19 +669,21 @@ END SUBROUTINE h5fget_create_plist_f !! SUBROUTINE h5fget_access_plist_f(file_id, access_id, hdferr) IMPLICIT NONE - INTEGER(HID_T), INTENT(IN) :: file_id + INTEGER(HID_T), INTENT(IN) :: file_id INTEGER(HID_T), INTENT(OUT) :: access_id INTEGER, INTENT(OUT) :: hdferr INTERFACE - INTEGER FUNCTION h5fget_access_plist_c(file_id, access_id) BIND(C,NAME='h5fget_access_plist_c') + INTEGER(HID_T) FUNCTION H5Fget_access_plist(file_id) BIND(C,NAME='H5Fget_access_plist') IMPORT :: HID_T IMPLICIT NONE - INTEGER(HID_T), INTENT(IN) :: file_id - INTEGER(HID_T), INTENT(OUT) :: access_id - END FUNCTION h5fget_access_plist_c + INTEGER(HID_T), VALUE :: file_id + END FUNCTION H5Fget_access_plist END INTERFACE - hdferr = h5fget_access_plist_c(file_id, access_id) + access_id = H5Fget_access_plist(file_id) + + hdferr = 0 + IF(access_id.LT.0) hdferr = -1 END SUBROUTINE h5fget_access_plist_f @@ -835,37 +839,41 @@ END SUBROUTINE h5fclose_async_f !> !! \ingroup FH5F !! -!! \brief Gets number of the objects open within a file +!! \brief Gets number of the objects open within a file. !! -!! \param file_id File identifier. +!! \param file_id File identifier !! \param obj_type Type of the object; possible values are: !! \li H5F_OBJ_FILE_F !! \li H5F_OBJ_DATASET_F !! \li H5F_OBJ_GROUP_F !! \li H5F_OBJ_DATATYPE_F !! \li H5F_OBJ_ALL_F -!! \param obj_count Number of open objects. +!! \param obj_count Number of open objects !! \param hdferr \fortran_error !! !! See C API: @ref H5Fget_obj_count() !! SUBROUTINE h5fget_obj_count_f(file_id, obj_type, obj_count, hdferr) IMPLICIT NONE - INTEGER(HID_T), INTENT(IN) :: file_id - INTEGER, INTENT(IN) :: obj_type + INTEGER(HID_T) , INTENT(IN) :: file_id + INTEGER , INTENT(IN) :: obj_type INTEGER(SIZE_T), INTENT(OUT) :: obj_count - INTEGER, INTENT(OUT) :: hdferr + INTEGER , INTENT(OUT) :: hdferr + INTERFACE - INTEGER FUNCTION h5fget_obj_count_c(file_id, obj_type, obj_count) BIND(C,NAME='h5fget_obj_count_c') + INTEGER(SIZE_T) FUNCTION H5Fget_obj_count(file_id, obj_type) BIND(C,NAME='H5Fget_obj_count') + IMPORT :: C_INT IMPORT :: HID_T, SIZE_T IMPLICIT NONE - INTEGER(HID_T), INTENT(IN) :: file_id - INTEGER, INTENT(IN) :: obj_type - INTEGER(SIZE_T), INTENT(OUT) :: obj_count - END FUNCTION h5fget_obj_count_c + INTEGER(HID_T), VALUE :: file_id + INTEGER(C_INT), VALUE :: obj_type + END FUNCTION H5Fget_obj_count END INTERFACE - hdferr = h5fget_obj_count_c(file_id, obj_type, obj_count) + obj_count = H5Fget_obj_count(file_id, INT(obj_type, C_INT)) + + hdferr = 0 + IF(obj_count.LT.0) hdferr = -1 ! Don't include objects created by H5open in the H5F_OBJ_ALL_F count IF(file_id.EQ.INT(H5F_OBJ_ALL_F,HID_T))THEN @@ -877,47 +885,51 @@ END SUBROUTINE h5fget_obj_count_f !> !! \ingroup FH5F !! -!! \brief Get list of open objects identifiers within a file +!! \brief Get list of open objects identifiers within a file. !! -!! \param file_id File identifier. +!! \param file_id File identifier !! \param obj_type Type of the object; possible values are: !! \li H5F_OBJ_FILE_F !! \li H5F_OBJ_DATASET_F !! \li H5F_OBJ_GROUP_F !! \li H5F_OBJ_DATATYPE_F !! \li H5F_OBJ_ALL_F -!! \param max_objs Maximum # of objects to retrieve. -!! \param obj_ids Array of open object identifiers. +!! \param max_objs Maximum # of objects to retrieve +!! \param obj_ids Array of open object identifiers !! \param hdferr \fortran_error -!! \param num_objs Number of open objects. +!! \param num_objs Number of open objects !! !! See C API: @ref H5Fget_obj_ids() !! SUBROUTINE h5fget_obj_ids_f(file_id, obj_type, max_objs, obj_ids, hdferr, num_objs) IMPLICIT NONE - INTEGER(HID_T), INTENT(IN) :: file_id - INTEGER, INTENT(IN) :: obj_type + INTEGER(HID_T) , INTENT(IN) :: file_id + INTEGER , INTENT(IN) :: obj_type INTEGER(SIZE_T), INTENT(IN) :: max_objs - INTEGER(HID_T), DIMENSION(*), INTENT(INOUT) :: obj_ids - INTEGER, INTENT(OUT) :: hdferr + INTEGER(HID_T) , DIMENSION(*), INTENT(INOUT) :: obj_ids + INTEGER , INTENT(OUT) :: hdferr INTEGER(SIZE_T), INTENT(OUT), OPTIONAL :: num_objs INTEGER(SIZE_T) :: c_num_objs ! Number of open objects of the specified type INTERFACE - INTEGER FUNCTION h5fget_obj_ids_c(file_id, obj_type, max_objs, obj_ids, c_num_objs) & - BIND(C,NAME='h5fget_obj_ids_c') + INTEGER(SIZE_T) FUNCTION H5Fget_obj_ids(file_id, obj_type, max_objs, obj_ids) & + BIND(C,NAME='H5Fget_obj_ids') + IMPORT :: C_INT IMPORT :: HID_T, SIZE_T IMPLICIT NONE - INTEGER(HID_T), INTENT(IN) :: file_id - INTEGER, INTENT(IN) :: obj_type - INTEGER(SIZE_T), INTENT(IN) :: max_objs - INTEGER(HID_T), DIMENSION(*), INTENT(INOUT) :: obj_ids - INTEGER(SIZE_T), INTENT(OUT) :: c_num_objs - END FUNCTION h5fget_obj_ids_c + INTEGER(HID_T) , VALUE :: file_id + INTEGER(C_INT) , VALUE :: obj_type + INTEGER(SIZE_T), VALUE :: max_objs + INTEGER(HID_T) , DIMENSION(*) :: obj_ids + END FUNCTION H5Fget_obj_ids END INTERFACE - hdferr = h5fget_obj_ids_c(file_id, obj_type, max_objs, obj_ids, c_num_objs) + c_num_objs = H5Fget_obj_ids(file_id, INT(obj_type, C_INT), max_objs, obj_ids) + + hdferr = 0 + IF(c_num_objs.LT.0) hdferr = -1 + IF (PRESENT(num_objs)) num_objs= c_num_objs END SUBROUTINE h5fget_obj_ids_f @@ -926,8 +938,8 @@ END SUBROUTINE h5fget_obj_ids_f !! !! \brief Get amount of free space within a file. !! -!! \param file_id File identifier. -!! \param free_space Amount of free space in file. +!! \param file_id File identifier +!! \param free_space Amount of free space in file !! \param hdferr \fortran_error !! !! See C API: @ref H5Fget_freespace() @@ -955,9 +967,9 @@ END SUBROUTINE h5fget_freespace_f !! !! \brief Gets the name of the file from the object identifier. !! -!! \param obj_id Object identifier. -!! \param buf Buffer to store the read name. -!! \param size Actual size of the name. +!! \param obj_id Object identifier +!! \param buf Buffer to store the read name +!! \param size Actual size of the name !! \param hdferr \fortran_error !! !! See C API: @ref H5Fget_name() @@ -990,8 +1002,8 @@ END SUBROUTINE h5fget_name_f !! !! \brief Retrieves the file size of the HDF5 file. !! -!! \param file_id File identifier. -!! \param size File size. +!! \param file_id File identifier +!! \param size File size !! \param hdferr \fortran_error !! !! See C API: @ref H5Fget_filesize() @@ -1018,8 +1030,8 @@ END SUBROUTINE h5fget_filesize_f !! !! \brief Retrieves the file number of the HDF5 file. !! -!! \param file_id File identifier. -!! \param fileno File number. +!! \param file_id File identifier +!! \param fileno File number !! \param hdferr \fortran_error !! !! See C API: @ref H5Fget_fileno() @@ -1046,11 +1058,11 @@ END SUBROUTINE h5fget_fileno_f !! !! \brief Retrieves a copy of the image of an existing, open file. !! -!! \param file_id Target file identifier. -!! \param buf_ptr Pointer to the buffer into which the image of the HDF5 file is to be copied. -!! \param buf_len Size of the supplied buffer. +!! \param file_id Target file identifier +!! \param buf_ptr Pointer to the buffer into which the image of the HDF5 file is to be copied +!! \param buf_len Size of the supplied buffer !! \param hdferr \fortran_error -!! \param buf_size Returns the size in bytes of the buffer required to store the file image, no data will be copied. +!! \param buf_size Returns the size in bytes of the buffer required to store the file image, no data will be copied !! !! See C API: @ref H5Fget_file_image() !! @@ -1094,8 +1106,8 @@ END SUBROUTINE h5fget_file_image_f !! \brief Gets the value of the "minimize dataset headers" value which creates !! smaller dataset object headers when its set and no attributes are present. !! -!! \param file_id Target file identifier. -!! \param minimize Value of the setting. +!! \param file_id Target file identifier +!! \param minimize Value of the setting !! \param hdferr \fortran_error !! !! See C API: @ref H5Fget_dset_no_attrs_hint() @@ -1129,8 +1141,8 @@ END SUBROUTINE h5fget_dset_no_attrs_hint_f !! \brief Sets the value of the "minimize dataset headers" value which creates !! smaller dataset object headers when its set and no attributes are present. !! -!! \param file_id Target file identifier. -!! \param minimize Value of the setting. +!! \param file_id Target file identifier +!! \param minimize Value of the setting !! \param hdferr \fortran_error !! !! See C API: @ref H5Fset_dset_no_attrs_hint() @@ -1192,5 +1204,35 @@ END FUNCTION H5Fget_info END SUBROUTINE H5Fget_info_f +!> +!! \ingroup FH5F +!! +!! \brief Determines the read/write or read-only status of a file. +!! +!! \param file_id File identifier +!! \param intent Access mode flag as originally passed with H5Fopen_f() +!! \param hdferr \fortran_error +!! +!! See C API: @ref H5Fget_intent() +!! + SUBROUTINE h5fget_intent_f(file_id, intent, hdferr) + IMPLICIT NONE + INTEGER(HID_T), INTENT(IN) :: file_id + INTEGER, INTENT(OUT) :: intent + INTEGER, INTENT(OUT) :: hdferr + INTERFACE + INTEGER(C_INT) FUNCTION H5Fget_intent(file_id, intent) BIND(C,NAME='H5Fget_intent') + IMPORT :: C_INT + IMPORT :: HID_T + IMPLICIT NONE + INTEGER(HID_T), VALUE :: file_id + INTEGER(C_INT) :: intent + END FUNCTION H5Fget_intent + END INTERFACE + + hdferr = INT(H5Fget_intent(file_id, intent)) + + END SUBROUTINE h5fget_intent_f + END MODULE H5F diff --git a/fortran/src/H5Sff.F90 b/fortran/src/H5Sff.F90 index e734c03d1f9..25b665798c0 100644 --- a/fortran/src/H5Sff.F90 +++ b/fortran/src/H5Sff.F90 @@ -1445,4 +1445,148 @@ END FUNCTION H5Sis_regular_hyperslab END SUBROUTINE H5Sis_regular_hyperslab_f +!> +!! \ingroup FH5S +!! +!! \brief Closes a dataspace selection iterator. +!! +!! \param sel_iter_id Dataspace selection iterator identifier +!! \param hdferr \fortran_error +!! +!! See C API: @ref H5Ssel_iter_close() +!! + SUBROUTINE h5ssel_iter_close_f(sel_iter_id, hdferr) + IMPLICIT NONE + INTEGER(HID_T), INTENT(IN) :: sel_iter_id + INTEGER, INTENT(OUT) :: hdferr + INTERFACE + INTEGER(C_INT) FUNCTION H5Ssel_iter_close(sel_iter_id) & + BIND(C,NAME='H5Ssel_iter_close') + IMPORT :: HID_T, C_INT + IMPLICIT NONE + INTEGER(HID_T), VALUE :: sel_iter_id + END FUNCTION H5Ssel_iter_close + END INTERFACE + + hdferr = INT(h5ssel_iter_close(sel_iter_id), C_INT) + + END SUBROUTINE h5ssel_iter_close_f + +!> +!! \ingroup FH5S +!! +!! \brief Creates a dataspace selection iterator for a dataspace's selection. +!! +!! \param space_id Dataspace identifier +!! \param elmt_size Size of element in the selection +!! \param flags Selection iterator flag, valid values are: +!! \li H5S_SEL_ITER_GET_SEQ_LIST_SORTED_F, ref. @ref H5S_SEL_ITER_GET_SEQ_LIST_SORTED +!! \li H5S_SEL_ITER_SHARE_WITH_DATASPACE_F, ref. @ref H5S_SEL_ITER_SHARE_WITH_DATASPACE +!! \param ds_iter_id Dataspace selection iterator identifier +!! \param hdferr \fortran_error +!! +!! See C API: @ref H5Ssel_iter_create() +!! + SUBROUTINE h5ssel_iter_create_f(space_id, elmt_size, flags, ds_iter_id, hdferr) + IMPLICIT NONE + INTEGER(HID_T) , INTENT(IN) :: space_id + INTEGER(SIZE_T), INTENT(IN) :: elmt_size + INTEGER , INTENT(IN) :: flags + INTEGER(HID_T) , INTENT(OUT) :: ds_iter_id + INTEGER , INTENT(OUT) :: hdferr + INTERFACE + INTEGER(HID_T) FUNCTION H5Ssel_iter_create(space_id, elmt_size, flags) & + BIND(C,NAME='H5Ssel_iter_create') + IMPORT :: HID_T, C_INT, SIZE_T + IMPLICIT NONE + INTEGER(HID_T) , VALUE :: space_id + INTEGER(SIZE_T), VALUE :: elmt_size + INTEGER(C_INT) , VALUE :: flags + END FUNCTION H5Ssel_iter_create + END INTERFACE + + ds_iter_id = H5Ssel_iter_create(space_id, elmt_size, INT(flags, C_INT)) + + hdferr = 0 + IF(ds_iter_id.LT.0) hdferr = -1 + + END SUBROUTINE h5ssel_iter_create_f + +!> +!! \ingroup FH5S +!! +!! \brief Retrieves a list of offset / length sequences for the elements in an iterator. +!! +!! \param sel_iter_id Dataspace selection iterator identifier +!! \param maxseq Maximum number of sequences to retrieve +!! \param maxbytes Maximum number of bytes to retrieve in sequences +!! \param nseq Number of sequences retrieved +!! \param nbytes Number of bytes retrieved, in all sequences +!! \param off Array of sequence offsets +!! \param len Array of sequence lengths +!! \param hdferr \fortran_error +!! +!! See C API: @ref H5Ssel_iter_get_seq_list() +!! + SUBROUTINE h5ssel_iter_get_seq_list_f(sel_iter_id, maxseq, maxbytes, nseq, nbytes, off, len, hdferr) + IMPLICIT NONE + INTEGER(HID_T) , INTENT(IN) :: sel_iter_id + INTEGER(SIZE_T), INTENT(IN) :: maxseq + INTEGER(SIZE_T), INTENT(IN) :: maxbytes + INTEGER(SIZE_T), INTENT(OUT), TARGET :: nseq + INTEGER(SIZE_T), INTENT(OUT), TARGET :: nbytes + INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: off + INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: len + INTEGER, INTENT(OUT) :: hdferr + + INTERFACE + INTEGER(C_INT) FUNCTION H5Ssel_iter_get_seq_list(sel_iter_id, maxseq, maxbytes, nseq, nbytes, off, len) & + BIND(C,NAME='H5Ssel_iter_get_seq_list') + IMPORT :: HID_T, C_INT, SIZE_T, HSIZE_T + IMPLICIT NONE + INTEGER(HID_T) , VALUE :: sel_iter_id + INTEGER(SIZE_T), VALUE :: maxseq + INTEGER(SIZE_T), VALUE :: maxbytes + INTEGER(SIZE_T) :: nseq + INTEGER(SIZE_T) :: nbytes + INTEGER(HSIZE_T), DIMENSION(*) :: off + INTEGER(HSIZE_T), DIMENSION(*) :: len + END FUNCTION H5Ssel_iter_get_seq_list + END INTERFACE + + hdferr = INT(H5Ssel_iter_get_seq_list(sel_iter_id, maxseq, maxbytes, nseq, nbytes, off, len), C_INT) + + END SUBROUTINE h5ssel_iter_get_seq_list_f + +!> +!! \ingroup FH5S +!! +!! \brief Resets a dataspace selection iterator back to an initial state. +!! +!! \param sel_iter_id Identifier of the dataspace selection iterator to reset +!! \param space_id Identifier of the dataspace with selection to iterate over +!! \param hdferr \fortran_error +!! +!! See C API: @ref H5Ssel_iter_reset() +!! + SUBROUTINE h5ssel_iter_reset_f(sel_iter_id, space_id, hdferr) + IMPLICIT NONE + INTEGER(HID_T), INTENT(IN) :: sel_iter_id + INTEGER(HID_T), INTENT(IN) :: space_id + INTEGER, INTENT(OUT) :: hdferr + INTERFACE + INTEGER(C_INT) FUNCTION H5Ssel_iter_reset(sel_iter_id, space_id) & + BIND(C,NAME='H5Ssel_iter_close') + IMPORT :: HID_T, C_INT + IMPLICIT NONE + INTEGER(HID_T), VALUE :: sel_iter_id + INTEGER(HID_T), VALUE :: space_id + END FUNCTION H5Ssel_iter_reset + END INTERFACE + + hdferr = INT(h5ssel_iter_reset(sel_iter_id, space_id), C_INT) + + END SUBROUTINE h5ssel_iter_reset_f + + END MODULE H5S diff --git a/fortran/src/H5_f.c b/fortran/src/H5_f.c index b1dc7dba5ea..e6f7b6d01a4 100644 --- a/fortran/src/H5_f.c +++ b/fortran/src/H5_f.c @@ -798,6 +798,9 @@ h5init_flags_c(int_f *h5d_flags, size_t_f *h5d_size_flags, int_f *h5e_flags, hid h5s_flags[16] = (int_f)H5S_SEL_HYPERSLABS; h5s_flags[17] = (int_f)H5S_SEL_ALL; + h5s_flags[18] = (int_f)H5S_SEL_ITER_GET_SEQ_LIST_SORTED; + h5s_flags[19] = (int_f)H5S_SEL_ITER_SHARE_WITH_DATASPACE; + /* * H5T flags */ diff --git a/fortran/src/H5_ff.F90 b/fortran/src/H5_ff.F90 index fe6337ad747..e83768a1dfd 100644 --- a/fortran/src/H5_ff.F90 +++ b/fortran/src/H5_ff.F90 @@ -135,7 +135,7 @@ MODULE H5LIB ! ! H5S flags declaration ! - INTEGER, PARAMETER :: H5S_FLAGS_LEN = 18 + INTEGER, PARAMETER :: H5S_FLAGS_LEN = 20 INTEGER, DIMENSION(1:H5S_FLAGS_LEN) :: H5S_flags INTEGER, PARAMETER :: H5S_HSIZE_FLAGS_LEN = 1 INTEGER(HSIZE_T), DIMENSION(1:H5S_HSIZE_FLAGS_LEN) :: H5S_hsize_flags @@ -656,6 +656,8 @@ END FUNCTION h5init1_flags_c H5S_SEL_POINTS_F = H5S_flags(16) H5S_SEL_HYPERSLABS_F = H5S_flags(17) H5S_SEL_ALL_F = H5S_flags(18) + H5S_SEL_ITER_GET_SEQ_LIST_SORTED_F = H5S_flags(19) + H5S_SEL_ITER_SHARE_WITH_DATASPACE_F = H5S_flags(20) ! ! H5T flags declaration ! diff --git a/fortran/src/H5f90global.F90 b/fortran/src/H5f90global.F90 index fb25f7efcc2..5b4fc648587 100644 --- a/fortran/src/H5f90global.F90 +++ b/fortran/src/H5f90global.F90 @@ -793,6 +793,8 @@ MODULE H5GLOBAL !DEC$ATTRIBUTES DLLEXPORT :: H5S_SEL_POINTS_F !DEC$ATTRIBUTES DLLEXPORT :: H5S_SEL_HYPERSLABS_F !DEC$ATTRIBUTES DLLEXPORT :: H5S_SEL_ALL_F + !DEC$ATTRIBUTES DLLEXPORT :: H5S_SEL_ITER_GET_SEQ_LIST_SORTED_F + !DEC$ATTRIBUTES DLLEXPORT :: H5S_SEL_ITER_SHARE_WITH_DATASPACE_F !DEC$endif !> \addtogroup FH5S !> @{ @@ -822,6 +824,9 @@ MODULE H5GLOBAL INTEGER :: H5S_SEL_POINTS_F !< H5S_SEL_POINTS INTEGER :: H5S_SEL_HYPERSLABS_F !< H5S_SEL_HYPERSLABS INTEGER :: H5S_SEL_ALL_F !< H5S_SEL_ALL + + INTEGER :: H5S_SEL_ITER_GET_SEQ_LIST_SORTED_F !< H5S_SEL_ITER_GET_SEQ_LIST_SORTED + INTEGER :: H5S_SEL_ITER_SHARE_WITH_DATASPACE_F !< H5S_SEL_ITER_SHARE_WITH_DATASPACE !> @} ! ! H5T flags declaration diff --git a/fortran/src/hdf5_fortrandll.def.in b/fortran/src/hdf5_fortrandll.def.in index 119e140e399..ccb770ae362 100644 --- a/fortran/src/hdf5_fortrandll.def.in +++ b/fortran/src/hdf5_fortrandll.def.in @@ -147,6 +147,7 @@ H5F_mp_H5FGET_FILE_IMAGE_F H5F_mp_H5FGET_DSET_NO_ATTRS_HINT_F H5F_mp_H5FSET_DSET_NO_ATTRS_HINT_F H5F_mp_H5FGET_INFO_F +H5F_mp_H5FGET_INTENT_F ; H5G H5G_mp_H5GOPEN_F H5G_mp_H5GOPEN_ASYNC_F @@ -483,6 +484,10 @@ H5S_mp_H5SENCODE_F H5S_mp_H5SEXTENT_EQUAL_F H5S_mp_H5SGET_REGULAR_HYPERSLAB_F H5S_mp_H5SIS_REGULAR_HYPERSLAB_F +H5S_mp_H5SSEL_ITER_CREATE_F +H5S_mp_H5SSEL_ITER_GET_SEQ_LIST_F +H5S_mp_H5SSEL_ITER_CLOSE_F +H5S_mp_H5SSEL_ITER_RESET_F ; H5T H5T_mp_H5TOPEN_F H5T_mp_H5TCOMMIT_F diff --git a/fortran/test/fortranlib_test.F90 b/fortran/test/fortranlib_test.F90 index e0a837a211b..05ae593bfd6 100644 --- a/fortran/test/fortranlib_test.F90 +++ b/fortran/test/fortranlib_test.F90 @@ -158,9 +158,8 @@ PROGRAM fortranlibtest CALL test_basic_select(cleanup, ret_total_error) CALL write_test_status(ret_total_error, ' Basic selection test', total_error) - ret_total_error = 0 - CALL test_select_hyperslab( cleanup, ret_total_error) + CALL test_select_hyperslab(cleanup, ret_total_error) CALL write_test_status(ret_total_error, ' Hyperslab selection test', total_error) ret_total_error = 0 @@ -179,6 +178,11 @@ PROGRAM fortranlibtest CALL test_select_bounds(ret_total_error) CALL write_test_status(ret_total_error, ' Selection bounds test ', total_error) + ret_total_error = 0 + CALL test_select_iter(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Dataspace selection iterators test', total_error) + + ! ! '=========================================' ! 'Testing DATATYPE interface ' diff --git a/fortran/test/tH5F.F90 b/fortran/test/tH5F.F90 index 7f9490b7d20..569d4598c92 100644 --- a/fortran/test/tH5F.F90 +++ b/fortran/test/tH5F.F90 @@ -197,6 +197,7 @@ SUBROUTINE mountingtest(cleanup, total_error) !flag to check operation success ! INTEGER :: error + INTEGER :: fintent ! !general purpose integer @@ -215,8 +216,8 @@ SUBROUTINE mountingtest(cleanup, total_error) !data buffers ! INTEGER, DIMENSION(NX,NY) :: data_in, data_out - INTEGER(HSIZE_T), DIMENSION(2) :: data_dims + filename1 = "mount1" filename2 = "mount2" @@ -377,6 +378,13 @@ SUBROUTINE mountingtest(cleanup, total_error) CALL h5fopen_f (fix_filename1, H5F_ACC_RDWR_F, file1_id, error) CALL check("hfopen_f",error,total_error) + CALL h5fget_intent_f(file1_id, fintent, error) + CALL check("h5fget_intent_f",error,total_error) + + IF(fintent.NE.H5F_ACC_RDWR_F)THEN + total_error = total_error + 1 + ENDIF + CALL h5fget_obj_count_f(INT(H5F_OBJ_ALL_F,HID_T), H5F_OBJ_ALL_F, obj_count, error) CALL check(" h5fget_obj_count_f",error,total_error) @@ -389,7 +397,6 @@ SUBROUTINE mountingtest(cleanup, total_error) CALL h5fget_obj_count_f(INT(H5F_OBJ_ALL_F,HID_T), H5F_OBJ_ALL_F, obj_count, error) CALL check(" h5fget_obj_count_f",error,total_error) - IF(obj_count.NE.2)THEN total_error = total_error + 1 ENDIF @@ -1038,7 +1045,7 @@ SUBROUTINE file_close(cleanup, total_error) total_error = total_error + 1 write(*,*) " Open with H5F_CLOSE_STRONG should fail " endif - + CALL h5fget_obj_count_f(fid1, H5F_OBJ_ALL_F, obj_count, error) CALL check("h5fget_obj_count_f",error,total_error) if(error .eq.0 .and. obj_count .ne. 3) then diff --git a/fortran/test/tH5Sselect.F90 b/fortran/test/tH5Sselect.F90 index b6d28d32e07..7b3a0664b71 100644 --- a/fortran/test/tH5Sselect.F90 +++ b/fortran/test/tH5Sselect.F90 @@ -314,7 +314,151 @@ SUBROUTINE test_select_hyperslab(cleanup, total_error) END SUBROUTINE test_select_hyperslab ! - !Subroutine to test element selection + ! Subroutine to test selection iterations + ! + + SUBROUTINE test_select_iter(cleanup, total_error) + + IMPLICIT NONE + LOGICAL, INTENT(IN) :: cleanup + INTEGER, INTENT(INOUT) :: total_error + + INTEGER, PARAMETER :: POINT1_NPOINTS = 10 + INTEGER(SIZE_T), PARAMETER :: SEL_ITER_MAX_SEQ = 256 ! Information for testing selection iterators + INTEGER, PARAMETER :: rank = 2 + INTEGER(SIZE_T), PARAMETER :: NUMP = 4 + + INTEGER(hsize_t), DIMENSION(2) :: dims1 = (/12, 6/) ! 2-D Dataspace dimensions + INTEGER(HID_T) :: sid ! Dataspace ID + INTEGER(HID_T) :: iter_id ! Dataspace selection iterator ID + INTEGER(HSIZE_T), DIMENSION(rank, POINT1_NPOINTS) :: coord1 ! Coordinates for point selection + INTEGER(HSIZE_T), DIMENSION(2) :: start ! Hyperslab start + INTEGER(HSIZE_T), DIMENSION(2) :: stride ! Hyperslab stride + INTEGER(HSIZE_T), DIMENSION(2) :: count ! Hyperslab block count + INTEGER(HSIZE_T), DIMENSION(2) :: BLOCK ! Hyperslab block size + INTEGER(SIZE_T) :: nseq ! # of sequences retrieved + INTEGER(SIZE_T) :: nbytes ! # of bytes retrieved + INTEGER(HSIZE_T), DIMENSION(SEL_ITER_MAX_SEQ) :: off ! Offsets for retrieved sequences + INTEGER(SIZE_T), DIMENSION(SEL_ITER_MAX_SEQ) :: ilen ! Lengths for retrieved sequences + INTEGER :: sel_type ! Selection type + INTEGER :: error ! Error return value + integer(size_t) :: i + + ! Create dataspace + CALL H5Screate_simple_f(2, dims1, sid, error) + CALL check("H5Screate_simple_f", error, total_error) + + ! Test iterators on various basic selection types + DO sel_type = H5S_SEL_NONE_F, H5S_SEL_ALL_F + IF(sel_type .EQ. H5S_SEL_NONE_F)THEN ! "None" selection + CALL H5Sselect_none_f(sid, error) + CALL check("H5Sselect_none_f", error, total_error) + ELSE IF(sel_type.EQ.H5S_SEL_POINTS_F)THEN ! Point selection + ! Select sequence of four points + coord1(1, 1) = 1 + coord1(2, 1) = 2 + coord1(1, 2) = 3 + coord1(2, 2) = 4 + coord1(1, 3) = 5 + coord1(2, 3) = 6 + coord1(1, 4) = 7 + coord1(2, 4) = 8 + CALL H5Sselect_elements_f(sid, H5S_SELECT_SET_F, rank, NUMP, coord1, error) + CALL check("H5Sselect_elements_f", error, total_error) + ELSE IF(sel_type.EQ.H5S_SEL_HYPERSLABS_F)THEN ! Hyperslab selection + ! Select regular hyperslab + start(1) = 0 + start(2) = 0 + stride(1) = 1 + stride(2) = 1 + COUNT(1) = 4 + COUNT(2) = 4 + BLOCK(1) = 1 + BLOCK(2) = 1 + CALL H5Sselect_hyperslab_f(sid, H5S_SELECT_SET_F, start, count, error, stride=stride, BLOCK=BLOCK) + CALL check("H5Sselect_hyperslab_f", error, total_error) + ELSE IF(sel_type.EQ.H5S_SEL_ALL_F)THEN ! "All" selection + CALL H5Sselect_all_f(sid, error) + CALL check("H5Sselect_all_f", error, total_error) + ELSE + CALL check("Incorrect selection option", error, total_error) + ENDIF + + ! Create selection iterator object + CALL H5Ssel_iter_create_f(sid, 1_size_t, H5S_SEL_ITER_SHARE_WITH_DATASPACE_F, iter_id, error) + CALL check("H5Ssel_iter_create_f", error, total_error) + + ! Try retrieving all sequence + off = -99 + ilen = -99 + CALL H5Ssel_iter_get_seq_list_f(iter_id, SEL_ITER_MAX_SEQ, 1024_size_t * 1024_size_t, nseq, nbytes, off, ilen, error) + CALL check("H5Ssel_iter_get_seq_list_f", error, total_error) + + ! Check results from retrieving sequence list + + IF (sel_type .EQ. H5S_SEL_NONE_F)THEN ! "None" selection + CALL VERIFY("H5Ssel_iter_get_seq_list_f", nseq, INT(0,SIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", nbytes, INT(0,SIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", off(1), INT(-99,HSIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", ilen(1), INT(-99,SIZE_T), total_error) + ELSE IF (sel_type .EQ. H5S_SEL_POINTS_F)THEN ! Point selection + CALL VERIFY("H5Ssel_iter_get_seq_list_f", nseq, 4_SIZE_T, total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", nbytes, 4_SIZE_T, total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", off(NUMP+1), INT(-99,HSIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", ilen(NUMP+1), INT(-99,HSIZE_T), total_error) + DO i = 1, NUMP + CALL VERIFY("H5Ssel_iter_get_seq_list_f", off(i), INT((i-1)*26+12,HSIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", ilen(i), INT(1,SIZE_T), total_error) + ENDDO + ELSE IF (sel_type .eq. H5S_SEL_HYPERSLABS_F)THEN ! Hyperslab selection + CALL VERIFY("H5Ssel_iter_get_seq_list_f", nseq, 4_SIZE_T, total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", nbytes, 16_SIZE_T, total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", off(NUMP+1), INT(-99,HSIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", ilen(NUMP+1), INT(-99,HSIZE_T), total_error) + DO i = 1, NUMP + CALL VERIFY("H5Ssel_iter_get_seq_list_f", off(i), INT((i-1)*12,HSIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", ilen(i), INT(4,SIZE_T), total_error) + ENDDO + ELSE IF (sel_type.EQ.H5S_SEL_ALL_F)THEN ! "All" selection + CALL VERIFY("H5Ssel_iter_get_seq_list_f", nseq, 1_SIZE_T, total_error ) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", nbytes, 72_SIZE_T, total_error ) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", off(1), INT(0,HSIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", ilen(1), INT(72,HSIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", off(2), INT(-99,HSIZE_T), total_error) + CALL VERIFY("H5Ssel_iter_get_seq_list_f", ilen(2), INT(-99,HSIZE_T), total_error) + ELSE + CALL check("Incorrect selection option", error, total_error) + ENDIF + + ! Reset iterator + !CALL H5Ssel_iter_reset_f(iter_id, sid, error) + !CALL check("H5Ssel_iter_reset_f", error, total_error) + + !off = -99 + !ilen = -99 + !CALL H5Ssel_iter_get_seq_list_f(iter_id, SEL_ITER_MAX_SEQ, 1024_size_t * 1024_size_t, nseq, nbytes, off, ilen, error) + !CALL check("H5Ssel_iter_get_seq_list_f", error, total_error) + + ! Close selection iterator + CALL H5Ssel_iter_close_f(iter_id, error) + CALL check("H5Ssel_iter_close_f", error, total_error) + END DO + + ! Create selection iterator object + CALL H5Ssel_iter_create_f(sid, 1_size_t, H5S_SEL_ITER_GET_SEQ_LIST_SORTED_F, iter_id, error) + CALL check("H5Ssel_iter_create_f", error, total_error) + + ! Reset iterator + CALL H5Ssel_iter_reset_f(iter_id, sid, error) + CALL check("H5Ssel_iter_reset_f", error, total_error) + + CALL h5sclose_f(sid, error) + CALL check("h5sclose_f", error, total_error) + + END SUBROUTINE test_select_iter + + ! + ! Subroutine to test element selection ! SUBROUTINE test_select_element(cleanup, total_error) @@ -1043,9 +1187,6 @@ SUBROUTINE test_basic_select(cleanup, total_error) ! DEALLOCATE(pointlist) - - - ! !Close the dataspace for the dataset. ! diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index c1188aedb6e..408ef6d554d 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -102,6 +102,13 @@ New Features Fortran Library: ---------------- + - Added Fortran APIs: + H5FGET_INTENT_F, H5SSEL_ITER_CREATE_F, H5SSEL_ITER_GET_SEQ_LIST_F, + H5SSEL_ITER_CLOSE_F, H5S_mp_H5SSEL_ITER_RESET_F + + - Added Fortran Parameters: + H5S_SEL_ITER_GET_SEQ_LIST_SORTED_F, H5S_SEL_ITER_SHARE_WITH_DATASPACE_F + - Added Fortran Parameters: H5S_BLOCK_F and H5S_PLIST_F diff --git a/src/H5Spublic.h b/src/H5Spublic.h index 2b6384f3db1..5422d96bcbf 100644 --- a/src/H5Spublic.h +++ b/src/H5Spublic.h @@ -848,7 +848,7 @@ H5_DLL herr_t H5Soffset_simple(hid_t space_id, const hssize_t *offset); * * \brief Closes a dataspace selection iterator * - * \space_id{sel_iter_id} + * \param[in] sel_iter_id Identifier of the dataspace selection iterator * * \return \herr_t * @@ -865,8 +865,9 @@ H5_DLL herr_t H5Ssel_iter_close(hid_t sel_iter_id); * * \space_id{spaceid} * \param[in] elmt_size Size of element in the selection - * \param[in] flags Selection iterator flag - * + * \param[in] flags Selection iterator flag, valid values are: + * \li @ref H5S_SEL_ITER_GET_SEQ_LIST_SORTED + * \li @ref H5S_SEL_ITER_SHARE_WITH_DATASPACE * \return \hid_t{valid dataspace selection iterator} * * \details H5Ssel_iter_create() creates a selection iterator and initializes @@ -882,13 +883,13 @@ H5_DLL hid_t H5Ssel_iter_create(hid_t spaceid, size_t elmt_size, unsigned flags) * \brief Retrieves a list of offset / length sequences for the elements in * an iterator * - * \space_id{sel_iter_id} - * \param[in] maxseq Maximum number of sequences to retrieve - * \param[in] maxelmts Maximum number of elements to retrieve in sequences - * \param[out] nseq Number of sequences retrieved - * \param[out] nelmts Number of elements retrieved, in all sequences - * \param[out] off Array of sequence offsets - * \param[out] len Array of sequence lengths + * \param[in] sel_iter_id Identifier of the dataspace selection iterator + * \param[in] maxseq Maximum number of sequences to retrieve + * \param[in] maxelmts Maximum number of elements to retrieve in sequences + * \param[out] nseq Number of sequences retrieved + * \param[out] nelmts Number of elements retrieved, in all sequences + * \param[out] off Array of sequence offsets + * \param[out] len Array of sequence lengths * * \return \herr_t *