summaryrefslogtreecommitdiffstats
path: root/fortran/src
diff options
context:
space:
mode:
authorScot Breitenfeld <brtnfld@hdfgroup.org>2024-01-29 19:13:33 (GMT)
committerLarry Knox <lrknox@hdfgroup.org>2024-02-14 21:32:01 (GMT)
commit30b0f89f869c947cce41dbdb983533400f607604 (patch)
tree50e930c644f08585e074693bc8b6429a603c682b /fortran/src
parent56d9be146fb27456e4c517e49ccf920396824d71 (diff)
downloadhdf5-30b0f89f869c947cce41dbdb983533400f607604.zip
hdf5-30b0f89f869c947cce41dbdb983533400f607604.tar.gz
hdf5-30b0f89f869c947cce41dbdb983533400f607604.tar.bz2
Add API support for Fortran MPI_F08 module definitions. (#3959)
* revert to using c-stub for _F08 MPI APIs * use mpi compiler wrappers for cmake and nvhpc
Diffstat (limited to 'fortran/src')
-rw-r--r--fortran/src/CMakeLists.txt7
-rw-r--r--fortran/src/H5Pff.F90266
-rw-r--r--fortran/src/H5config_f.inc.cmake8
-rw-r--r--fortran/src/H5config_f.inc.in3
-rw-r--r--fortran/src/hdf5_fortrandll.def.in12
5 files changed, 275 insertions, 21 deletions
diff --git a/fortran/src/CMakeLists.txt b/fortran/src/CMakeLists.txt
index 60c0c3a..4c28046 100644
--- a/fortran/src/CMakeLists.txt
+++ b/fortran/src/CMakeLists.txt
@@ -24,6 +24,13 @@ if (WIN32)
endif ()
endif ()
+if (H5_HAVE_MPI_F08) # MPI-3 module mpi_f08 supported
+ set (CMAKE_H5_HAVE_MPI_F08 1)
+else ()
+ set (H5_NOMPI_F08 ";")
+ set (CMAKE_H5_HAVE_MPI_F08 0)
+endif ()
+
# configure for Fortran preprocessor
# Define Parallel variable for passing to H5config_f.inc.cmake
diff --git a/fortran/src/H5Pff.F90 b/fortran/src/H5Pff.F90
index afd17f3..90a74f7 100644
--- a/fortran/src/H5Pff.F90
+++ b/fortran/src/H5Pff.F90
@@ -49,6 +49,12 @@ MODULE H5P
PRIVATE h5pget_integer, h5pget_char, h5pget_ptr
PRIVATE h5pregister_integer, h5pregister_ptr
PRIVATE h5pinsert_integer, h5pinsert_char, h5pinsert_ptr
+#ifdef H5_HAVE_PARALLEL
+ PRIVATE h5pset_fapl_mpio_f90, h5pget_fapl_mpio_f90
+#ifdef H5_HAVE_MPI_F08
+ PRIVATE h5pset_fapl_mpio_f08, h5pget_fapl_mpio_f08
+#endif
+#endif
#ifndef H5_DOXYGEN
@@ -101,7 +107,6 @@ MODULE H5P
MODULE PROCEDURE h5pinsert_ptr
END INTERFACE
-
INTERFACE
INTEGER(C_INT) FUNCTION H5Pset_fill_value(prp_id, type_id, fillvalue) &
BIND(C, NAME='H5Pset_fill_value')
@@ -182,6 +187,35 @@ MODULE H5P
#endif
#ifdef H5_HAVE_PARALLEL
+
+ INTERFACE h5pset_fapl_mpio_f
+ MODULE PROCEDURE h5pset_fapl_mpio_f90
+#ifdef H5_HAVE_MPI_F08
+ MODULE PROCEDURE h5pset_fapl_mpio_f08
+#endif
+ END INTERFACE
+
+ INTERFACE h5pget_fapl_mpio_f
+ MODULE PROCEDURE h5pget_fapl_mpio_f90
+#ifdef H5_HAVE_MPI_F08
+ MODULE PROCEDURE h5pget_fapl_mpio_f08
+#endif
+ END INTERFACE
+
+ INTERFACE H5Pset_mpi_params_f
+ MODULE PROCEDURE H5Pset_mpi_params_f90
+#ifdef H5_HAVE_MPI_F08
+ MODULE PROCEDURE H5Pset_mpi_params_f08
+#endif
+ END INTERFACE
+
+ INTERFACE H5Pget_mpi_params_f
+ MODULE PROCEDURE H5Pget_mpi_params_f90
+#ifdef H5_HAVE_MPI_F08
+ MODULE PROCEDURE H5Pget_mpi_params_f08
+#endif
+ END INTERFACE
+
#ifdef H5_HAVE_SUBFILING_VFD
!> \addtogroup FH5P
!> @{
@@ -5125,6 +5159,8 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
! *********************************************************************
#ifdef H5_HAVE_PARALLEL
+
+#ifdef H5_DOXYGEN
!>
!! \ingroup FH5P
!!
@@ -5143,21 +5179,69 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
INTEGER, INTENT(IN) :: comm
INTEGER, INTENT(IN) :: info
INTEGER, INTENT(OUT) :: hdferr
+ END SUBROUTINE h5pset_fapl_mpio_f
+!>
+!! \ingroup FH5P
+!!
+!! \brief Stores MPI IO communicator information to the file access property list.
+!!
+!! \note Supports MPI Fortran module mpi_f08
+!!
+!! \param prp_id File access property list identifier.
+!! \param comm MPI-3 communicator.
+!! \param info MPI-3 info object.
+!! \param hdferr \fortran_error
+!!
+!! See C API: @ref H5Pset_fapl_mpio()
+!!
+ SUBROUTINE h5pset_fapl_mpio_f(prp_id, comm, info, hdferr)
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ TYPE(MPI_COMM), INTENT(IN) :: comm
+ TYPE(MPI_INFO), INTENT(IN) :: info
+ INTEGER, INTENT(OUT) :: hdferr
+ END SUBROUTINE h5pset_fapl_mpio_f
+
+#else
+
+ SUBROUTINE h5pset_fapl_mpio_f90(prp_id, comm, info, hdferr)
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ INTEGER, INTENT(IN) :: comm
+ INTEGER, INTENT(IN) :: info
+ INTEGER, INTENT(OUT) :: hdferr
INTERFACE
INTEGER FUNCTION h5pset_fapl_mpio_c(prp_id, comm, info) &
BIND(C,NAME='h5pset_fapl_mpio_c')
IMPORT :: HID_T
IMPLICIT NONE
- INTEGER(HID_T), INTENT(IN) :: prp_id
- INTEGER , INTENT(IN) :: comm
- INTEGER , INTENT(IN) :: info
+ INTEGER(HID_T) :: prp_id
+ INTEGER :: comm
+ INTEGER :: info
END FUNCTION h5pset_fapl_mpio_c
END INTERFACE
hdferr = h5pset_fapl_mpio_c(prp_id, comm, info)
- END SUBROUTINE h5pset_fapl_mpio_f
+ END SUBROUTINE h5pset_fapl_mpio_f90
+#ifdef H5_HAVE_MPI_F08
+ SUBROUTINE h5pset_fapl_mpio_f08(prp_id, comm, info, hdferr)
+ USE mpi_f08
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ TYPE(MPI_COMM), INTENT(IN) :: comm
+ TYPE(MPI_INFO), INTENT(IN) :: info
+ INTEGER, INTENT(OUT) :: hdferr
+
+ CALL h5pset_fapl_mpio_f90(prp_id, comm%mpi_val, info%mpi_val, hdferr)
+
+ END SUBROUTINE h5pset_fapl_mpio_f08
+#endif
+
+#endif
+
+#ifdef H5_DOXYGEN
!>
!! \ingroup FH5P
!!
@@ -5168,9 +5252,44 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
!! \param info MPI-2 info object.
!! \param hdferr \fortran_error
!!
+!! \attention It is the responsibility of the application to free the MPI objects.
+!!
!! See C API: @ref H5Pget_fapl_mpio()
!!
- SUBROUTINE h5pget_fapl_mpio_f(prp_id, comm, info, hdferr)
+SUBROUTINE h5pget_fapl_mpio_f(prp_id, comm, info, hdferr)
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ INTEGER, INTENT(OUT) :: comm
+ INTEGER, INTENT(OUT) :: info
+ INTEGER, INTENT(OUT) :: hdferr
+END SUBROUTINE h5pget_fapl_mpio_f
+!>
+!! \ingroup FH5P
+!!
+!! \brief Returns MPI communicator information.
+!!
+!! \note Supports MPI Fortran module mpi_f08
+!!
+!! \param prp_id File access property list identifier.
+!! \param comm MPI-3 communicator.
+!! \param info MPI-3 info object.
+!! \param hdferr \fortran_error
+!!
+!! \attention It is the responsibility of the application to free the MPI objects.
+!!
+!! See C API: @ref H5Pget_fapl_mpio()
+!!
+SUBROUTINE h5pget_fapl_mpio_f(prp_id, comm, info, hdferr)
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ TYPE(MPI_COMM), INTENT(OUT) :: comm
+ TYPE(MPI_INFO), INTENT(OUT) :: info
+ INTEGER , INTENT(OUT) :: hdferr
+END SUBROUTINE h5pget_fapl_mpio_f
+
+#else
+
+ SUBROUTINE h5pget_fapl_mpio_f90(prp_id, comm, info, hdferr)
IMPLICIT NONE
INTEGER(HID_T), INTENT(IN) :: prp_id
INTEGER, INTENT(OUT) :: comm
@@ -5181,15 +5300,30 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
BIND(C,NAME='h5pget_fapl_mpio_c')
IMPORT :: HID_T
IMPLICIT NONE
- INTEGER(HID_T), INTENT(IN) :: prp_id
- INTEGER , INTENT(OUT) :: comm
- INTEGER , INTENT(OUT) :: info
+ INTEGER(HID_T) :: prp_id
+ INTEGER :: comm
+ INTEGER :: info
END FUNCTION h5pget_fapl_mpio_c
END INTERFACE
hdferr = h5pget_fapl_mpio_c(prp_id, comm, info)
- END SUBROUTINE h5pget_fapl_mpio_f
+ END SUBROUTINE h5pget_fapl_mpio_f90
+
+#ifdef H5_HAVE_MPI_F08
+ SUBROUTINE h5pget_fapl_mpio_f08(prp_id, comm, info, hdferr)
+ USE mpi_f08
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ TYPE(MPI_COMM), INTENT(OUT) :: comm
+ TYPE(MPI_INFO), INTENT(OUT) :: info
+ INTEGER, INTENT(OUT) :: hdferr
+
+ CALL h5pget_fapl_mpio_f90(prp_id, comm%mpi_val, info%mpi_val, hdferr)
+
+ END SUBROUTINE h5pget_fapl_mpio_f08
+#endif
+#endif
#ifdef H5_HAVE_SUBFILING_VFD
!>
@@ -5376,14 +5510,15 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
END SUBROUTINE h5pget_mpio_no_collective_cause_f
+#ifdef H5_DOXYGEN
!>
!! \ingroup FH5P
!!
-!! \brief Set the MPI communicator and info.
+!! \brief Set the MPI communicator and information.
!!
!! \param prp_id File access property list identifier.
-!! \param comm The MPI communicator.
-!! \param info The MPI info object.
+!! \param comm MPI-2 communicator.
+!! \param info MPI-2 info object.
!! \param hdferr \fortran_error
!!
!! See C API: @ref H5Pset_mpi_params()
@@ -5394,6 +5529,37 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
INTEGER , INTENT(IN) :: comm
INTEGER , INTENT(IN) :: info
INTEGER , INTENT(OUT) :: hdferr
+ END SUBROUTINE H5Pset_mpi_params_f
+!>
+!! \ingroup FH5P
+!!
+!! \brief Set the MPI communicator and information.
+!!
+!! \note Supports MPI Fortran module mpi_f08
+!!
+!! \param prp_id File access property list identifier.
+!! \param comm MPI-3 communicator.
+!! \param info MPI-3 info object.
+!! \param hdferr \fortran_error
+!!
+!! See C API: @ref H5Pset_mpi_params()
+!!
+ SUBROUTINE H5Pset_mpi_params_f(prp_id, comm, info, hdferr)
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ TYPE(MPI_COMM), INTENT(IN) :: comm
+ TYPE(MPI_INFO), INTENT(IN) :: info
+ INTEGER , INTENT(OUT) :: hdferr
+ END SUBROUTINE H5Pset_mpi_params_f
+
+#else
+
+ SUBROUTINE H5Pset_mpi_params_f90(prp_id, comm, info, hdferr)
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ INTEGER , INTENT(IN) :: comm
+ INTEGER , INTENT(IN) :: info
+ INTEGER , INTENT(OUT) :: hdferr
INTERFACE
INTEGER FUNCTION h5pset_mpi_params_c(prp_id, comm, info) &
@@ -5408,16 +5574,33 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
hdferr = H5Pset_mpi_params_c(prp_id, comm, info)
- END SUBROUTINE H5Pset_mpi_params_f
+ END SUBROUTINE H5Pset_mpi_params_f90
+
+#ifdef H5_HAVE_MPI_F08
+ SUBROUTINE H5Pset_mpi_params_f08(prp_id, comm, info, hdferr)
+ USE mpi_f08
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ TYPE(MPI_COMM), INTENT(IN) :: comm
+ TYPE(MPI_INFO), INTENT(IN) :: info
+ INTEGER , INTENT(OUT) :: hdferr
+
+ CALL H5Pset_mpi_params_f90(prp_id, comm%mpi_val, info%mpi_val, hdferr)
+
+ END SUBROUTINE H5Pset_mpi_params_f08
+#endif
+
+#endif
+#ifdef H5_DOXYGEN
!>
!! \ingroup FH5P
!!
!! \brief Get the MPI communicator and info.
!!
!! \param prp_id File access property list identifier.
-!! \param comm The MPI communicator.
-!! \param info The MPI info object.
+!! \param comm MPI-2 communicator.
+!! \param info MPI-2 info object.
!! \param hdferr \fortran_error
!!
!! See C API: @ref H5Pget_mpi_params()
@@ -5428,6 +5611,39 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
INTEGER , INTENT(OUT) :: comm
INTEGER , INTENT(OUT) :: info
INTEGER , INTENT(OUT) :: hdferr
+ END SUBROUTINE H5Pget_mpi_params_f
+!>
+!! \ingroup FH5P
+!!
+!! \brief Get the MPI communicator and information.
+!!
+!! \note Supports MPI Fortran module mpi_f08
+!!
+!! \param prp_id File access property list identifier.
+!! \param comm MPI-3 communicator.
+!! \param info MPI-3 info object.
+!! \param hdferr \fortran_error
+!!
+!! \attention It is the responsibility of the application to free the MPI objects.
+!!
+!! See C API: @ref H5Pget_mpi_params()
+!!
+ SUBROUTINE H5Pget_mpi_params_f(prp_id, comm, info, hdferr)
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ TYPE(MPI_COMM), INTENT(OUT) :: comm
+ TYPE(MPI_INFO), INTENT(OUT) :: info
+ INTEGER , INTENT(OUT) :: hdferr
+ END SUBROUTINE H5Pget_mpi_params_f
+
+#else
+
+ SUBROUTINE H5Pget_mpi_params_f90(prp_id, comm, info, hdferr)
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ INTEGER , INTENT(OUT) :: comm
+ INTEGER , INTENT(OUT) :: info
+ INTEGER , INTENT(OUT) :: hdferr
INTERFACE
INTEGER FUNCTION h5pget_mpi_params_c(prp_id, comm, info) &
@@ -5442,7 +5658,23 @@ SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
hdferr = H5Pget_mpi_params_c(prp_id, comm, info)
- END SUBROUTINE H5Pget_mpi_params_f
+ END SUBROUTINE H5Pget_mpi_params_f90
+
+#ifdef H5_HAVE_MPI_F08
+ SUBROUTINE H5Pget_mpi_params_f08(prp_id, comm, info, hdferr)
+ USE mpi_f08
+ IMPLICIT NONE
+ INTEGER(HID_T), INTENT(IN) :: prp_id
+ TYPE(MPI_COMM), INTENT(OUT) :: comm
+ TYPE(MPI_INFO), INTENT(OUT) :: info
+ INTEGER , INTENT(OUT) :: hdferr
+
+ CALL H5Pget_mpi_params_f90(prp_id, comm%mpi_val, info%mpi_val, hdferr)
+
+ END SUBROUTINE H5Pget_mpi_params_f08
+#endif
+
+#endif
!>
!! \ingroup FH5P
diff --git a/fortran/src/H5config_f.inc.cmake b/fortran/src/H5config_f.inc.cmake
index 77ff707..e6fa7b9 100644
--- a/fortran/src/H5config_f.inc.cmake
+++ b/fortran/src/H5config_f.inc.cmake
@@ -19,6 +19,14 @@
#define H5_HAVE_PARALLEL
#endif
+! Define if MPI supports mpi_f08 module
+#cmakedefine01 CMAKE_H5_HAVE_MPI_F08
+#if CMAKE_H5_HAVE_MPI_F08 == 0
+#undef H5_HAVE_MPI_F08
+#else
+#define H5_HAVE_MPI_F08
+#endif
+
! Define if there is subfiling support
#cmakedefine01 CMAKE_H5_HAVE_SUBFILING_VFD
#if CMAKE_H5_HAVE_SUBFILING_VFD == 0
diff --git a/fortran/src/H5config_f.inc.in b/fortran/src/H5config_f.inc.in
index afcfa6e..7f52255 100644
--- a/fortran/src/H5config_f.inc.in
+++ b/fortran/src/H5config_f.inc.in
@@ -17,6 +17,9 @@
! Define if we have parallel support
#undef HAVE_PARALLEL
+! Define if MPI supports mpi_f08 module
+#undef HAVE_MPI_F08
+
! Define if we have subfiling support
#undef HAVE_SUBFILING_VFD
diff --git a/fortran/src/hdf5_fortrandll.def.in b/fortran/src/hdf5_fortrandll.def.in
index ccb770a..e29488f 100644
--- a/fortran/src/hdf5_fortrandll.def.in
+++ b/fortran/src/hdf5_fortrandll.def.in
@@ -421,14 +421,18 @@ H5P_mp_H5PSET_FILE_SPACE_PAGE_SIZE_F
H5P_mp_H5PGET_FILE_SPACE_PAGE_SIZE_F
H5P_mp_H5PGET_ACTUAL_SELECTION_IO_MODE_F
; Parallel
-@H5_NOPAREXP@H5P_mp_H5PSET_FAPL_MPIO_F
-@H5_NOPAREXP@H5P_mp_H5PGET_FAPL_MPIO_F
+@H5_NOPAREXP@H5P_mp_H5PSET_FAPL_MPIO_F90
+@H5_NOPAREXP@@H5_NOMPI_F08@H5P_mp_H5PSET_FAPL_MPIO_F08
+@H5_NOPAREXP@H5P_mp_H5PGET_FAPL_MPIO_F90
+@H5_NOPAREXP@@H5_NOMPI_F08@H5P_mp_H5PGET_FAPL_MPIO_F08
@H5_NOPAREXP@@H5_NOSUBFILING@H5P_mp_H5PSET_FAPL_SUBFILING_F
@H5_NOPAREXP@@H5_NOSUBFILING@H5P_mp_H5PGET_FAPL_SUBFILING_F
@H5_NOPAREXP@@H5_NOSUBFILING@H5P_mp_H5PSET_FAPL_IOC_F
@H5_NOPAREXP@@H5_NOSUBFILING@H5P_mp_H5PGET_FAPL_IOC_F
-@H5_NOPAREXP@H5P_mp_H5PSET_MPI_PARAMS_F
-@H5_NOPAREXP@H5P_mp_H5PGET_MPI_PARAMS_F
+@H5_NOPAREXP@H5P_mp_H5PSET_MPI_PARAMS_F90
+@H5_NOPAREXP@@H5_NOMPI_F08@H5P_mp_H5PSET_MPI_PARAMS_F08
+@H5_NOPAREXP@H5P_mp_H5PGET_MPI_PARAMS_F90
+@H5_NOPAREXP@@H5_NOMPI_F08@H5P_mp_H5PGET_MPI_PARAMS_F08
@H5_NOPAREXP@H5P_mp_H5PSET_DXPL_MPIO_F
@H5_NOPAREXP@H5P_mp_H5PGET_DXPL_MPIO_F
@H5_NOPAREXP@H5P_mp_H5PGET_MPIO_ACTUAL_IO_MODE_F