Skip to content

Commit

Permalink
Fortran API work. (#3941)
Browse files Browse the repository at this point in the history
* - 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.
  • Loading branch information
brtnfld authored Jan 23, 2024
1 parent 51f150a commit 54fb809
Show file tree
Hide file tree
Showing 12 changed files with 441 additions and 172 deletions.
92 changes: 0 additions & 92 deletions fortran/src/H5Ff.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
162 changes: 102 additions & 60 deletions fortran/src/H5Fff.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
!>
Expand All @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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()
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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()
Expand All @@ -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()
Expand All @@ -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()
!!
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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

Loading

0 comments on commit 54fb809

Please sign in to comment.