summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScot Breitenfeld <brtnfld@hdfgroup.org>2024-01-23 15:59:10 (GMT)
committerGitHub <noreply@github.com>2024-01-23 15:59:10 (GMT)
commit54fb80938256f565210d4c22b3021d6b96d0f56a (patch)
tree5505902a82af9699b5adbd54ff9870e95b2ff207
parent51f150a94590f3b495d32c44f6d507eb5a7565a0 (diff)
downloadhdf5-54fb80938256f565210d4c22b3021d6b96d0f56a.zip
hdf5-54fb80938256f565210d4c22b3021d6b96d0f56a.tar.gz
hdf5-54fb80938256f565210d4c22b3021d6b96d0f56a.tar.bz2
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.
-rw-r--r--fortran/src/H5Ff.c92
-rw-r--r--fortran/src/H5Fff.F90162
-rw-r--r--fortran/src/H5Sff.F90144
-rw-r--r--fortran/src/H5_f.c3
-rw-r--r--fortran/src/H5_ff.F904
-rw-r--r--fortran/src/H5f90global.F905
-rw-r--r--fortran/src/hdf5_fortrandll.def.in5
-rw-r--r--fortran/test/fortranlib_test.F908
-rw-r--r--fortran/test/tH5F.F9013
-rw-r--r--fortran/test/tH5Sselect.F90149
-rw-r--r--release_docs/RELEASE.txt7
-rw-r--r--src/H5Spublic.h21
12 files changed, 441 insertions, 172 deletions
diff --git a/fortran/src/H5Ff.c b/fortran/src/H5Ff.c
index 9703486..4b56cca 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 79aa5a7..fcfde86 100644
--- a/fortran/src/H5Fff.F90
+++ b/fortran/src/H5Fff.F90
@@ -639,19 +639,21 @@ CONTAINS
!!
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 @@ CONTAINS
!!
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 @@ CONTAINS
!>
!! \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 @@ CONTAINS
!>
!! \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 @@ CONTAINS
!!
!! \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 @@ CONTAINS
!!
!! \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 @@ CONTAINS
!!
!! \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 @@ CONTAINS
!!
!! \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 @@ CONTAINS
!!
!! \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 @@ CONTAINS
!! \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 @@ CONTAINS
!! \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 @@ CONTAINS
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 e734c03..25b6657 100644
--- a/fortran/src/H5Sff.F90
+++ b/fortran/src/H5Sff.F90
@@ -1445,4 +1445,148 @@ CONTAINS
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 b1dc7db..e6f7b6d 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 fe6337a..e83768a 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 @@ CONTAINS
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 fb25f7e..5b4fc64 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 119e140..ccb770a 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 e0a837a..05ae593 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 7f9490b..569d459 100644
--- a/fortran/test/tH5F.F90
+++ b/fortran/test/tH5F.F90
@@ -197,6 +197,7 @@ CONTAINS
!flag to check operation success
!
INTEGER :: error
+ INTEGER :: fintent
!
!general purpose integer
@@ -215,8 +216,8 @@ CONTAINS
!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 @@ CONTAINS
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 @@ CONTAINS
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 @@ CONTAINS
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 b6d28d3..7b3a066 100644
--- a/fortran/test/tH5Sselect.F90
+++ b/fortran/test/tH5Sselect.F90
@@ -314,7 +314,151 @@ CONTAINS
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 @@ CONTAINS
!
DEALLOCATE(pointlist)
-
-
-
!
!Close the dataspace for the dataset.
!
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index de5caa8..031e919 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -388,6 +388,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 2b6384f..5422d96 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
*