summaryrefslogtreecommitdiffstats
path: root/fortran
diff options
context:
space:
mode:
Diffstat (limited to 'fortran')
-rw-r--r--fortran/src/H5Df.c67
-rw-r--r--fortran/src/H5f90proto.h19
-rw-r--r--fortran/src/hdf5_fortrandll.def.in2
-rw-r--r--fortran/testpar/CMakeLists.txt20
-rw-r--r--fortran/testpar/mdset.f9029
-rw-r--r--fortran/testpar/multidsetrw_F03.f90206
-rw-r--r--fortran/testpar/ptest_F03.f9091
7 files changed, 419 insertions, 15 deletions
diff --git a/fortran/src/H5Df.c b/fortran/src/H5Df.c
index 57b4d4d..0477fa2 100644
--- a/fortran/src/H5Df.c
+++ b/fortran/src/H5Df.c
@@ -1317,3 +1317,70 @@ h5dvlen_reclaim_c(hid_t_f *type_id, hid_t_f *space_id, hid_t_f *plist_id, void *
ret_value = 0;
return ret_value;
}
+
+/****if* H5FDmpio/h5dread_multi_c
+ * NAME
+ * h5dread_multi_c
+ * PURPOSE
+ * Calls H5Dread_multi
+ *
+ * INPUTS
+ * dxpl_id - dataset transfer property.
+ * count - the number of accessing datasets.
+ * OUTPUTS
+ * info - the array of dataset information and read buffer.
+ *
+ * RETURNS
+ * 0 on success, -1 on failure
+ * AUTHOR
+ * M. Scot Breitenfeld
+ * March 25, 2014
+ * SOURCE
+*/
+int_f
+nh5dread_multi_c(hid_t_f *dxpl_id, size_t_f *count, H5D_rw_multi_t_f *info)
+/******/
+{
+ int ret_value = -1;
+ /*
+ * Call H5Dread_multi function.
+ */
+ if( (H5Dread_multi((hid_t)*dxpl_id, (size_t)*count, info )) <0 )
+ return ret_value; /* error occurred */
+
+ ret_value = 0;
+ return ret_value;
+}
+
+/****if* H5FDmpio/h5dwrite_multi_c
+ * NAME
+ * h5dwrite_multi_c
+ * PURPOSE
+ * Calls H5Dwrite_multi
+ *
+ * INPUTS
+ * count - the number of accessing datasets.
+ * dxpl_id - dataset transfer property.
+ * Info - the array of dataset information and write buffer.
+ *
+ * RETURNS
+ * 0 on success, -1 on failure
+ * AUTHOR
+ * M. Scot Breitenfeld
+ * March 25, 2014
+ * SOURCE
+*/
+int_f
+nh5dwrite_multi_c(hid_t_f *dxpl_id, size_t_f *count, H5D_rw_multi_t_f *info)
+/******/
+{
+ int ret_value = -1;
+ /*
+ * Call H5Dwrite_multi function.
+ */
+ if( (H5Dwrite_multi((hid_t)*dxpl_id, (size_t)*count, info )) <0 )
+ return ret_value; /* error occurred */
+
+ ret_value = 0;
+ return ret_value;
+}
diff --git a/fortran/src/H5f90proto.h b/fortran/src/H5f90proto.h
index f8b4564..1c68601 100644
--- a/fortran/src/H5f90proto.h
+++ b/fortran/src/H5f90proto.h
@@ -25,6 +25,21 @@ H5_FCDLL void HD5packFstring(char *src, char *dest, size_t len);
/*
+ * Storage struct used by H5Dread_multi and H5Dwrite_multi,
+ * interoperable with Fortran.
+ */
+typedef struct H5D_rw_multi_t_f {
+ hid_t dset_id; /* dstaset ID */
+ hid_t dset_space_id; /* dataset selection dataspace ID */
+ hid_t mem_type_id; /* memory datatype ID */
+ hid_t mem_space_id; /* memory selection dataspace ID */
+ union {
+ void *rbuf; /* pointer to read buffer */
+ const void *wbuf; /* pointer to write buffer */
+ } u;
+} H5D_rw_multi_t_f;
+
+/*
* Storage info struct used by H5O_info_t and H5F_info_t
* interoperable with Fortran.
*/
@@ -133,6 +148,8 @@ H5_FCDLL int_f h5sextent_equal_c( hid_t_f * space1_id, hid_t_f *space2_id, hid_t
/*
* Functions from H5Df.c
*/
+#define nh5dread_multi_c H5_FC_FUNC_(h5dread_multi_c, H5DREAD_MULTI_C)
+#define nh5dwrite_multi_c H5_FC_FUNC_(h5dwrite_multi_c, H5DWRITE_MULTI_C)
H5_FCDLL int_f h5dcreate_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *space_id,
hid_t_f *lcpl_id, hid_t_f *dcpl_id, hid_t_f *dapl_id, hid_t_f *dset_id);
@@ -164,6 +181,8 @@ H5_FCDLL int_f h5dread_f_c( hid_t_f *dset_id , hid_t_f *mem_type_id, hid_t_f *m
hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf);
H5_FCDLL int_f h5dvlen_reclaim_c(hid_t_f *type_id , hid_t_f *space_id, hid_t_f *plist_id, void *buf);
+H5_FCDLL int_f nh5dread_multi_c(hid_t_f *dxpl_id, size_t_f *count, H5D_rw_multi_t_f *info);
+H5_FCDLL int_f nh5dwrite_multi_c(hid_t_f *dxpl_id, size_t_f *count, H5D_rw_multi_t_f *info);
/*
* Functions from H5Gf.c
*/
diff --git a/fortran/src/hdf5_fortrandll.def.in b/fortran/src/hdf5_fortrandll.def.in
index 3a5a91f..08daacf 100644
--- a/fortran/src/hdf5_fortrandll.def.in
+++ b/fortran/src/hdf5_fortrandll.def.in
@@ -75,6 +75,8 @@ H5D_mp_H5DGET_ACCESS_PLIST_F
H5D_mp_H5DWRITE_PTR
H5D_mp_H5DREAD_PTR
H5D_mp_H5DVLEN_RECLAIM_F
+@H5_NOF03EXP@H5D_PROVISIONAL_mp_H5DREAD_MULTI_F
+@H5_NOF03EXP@H5D_PROVISIONAL_mp_H5DWRITE_MULTI_F
; H5E
H5E_mp_H5ECLEAR_F
H5E_mp_H5EPRINT_F
diff --git a/fortran/testpar/CMakeLists.txt b/fortran/testpar/CMakeLists.txt
index 4f21419..0a90149 100644
--- a/fortran/testpar/CMakeLists.txt
+++ b/fortran/testpar/CMakeLists.txt
@@ -31,4 +31,24 @@ target_include_directories (parallel_test PRIVATE ${CMAKE_Fortran_MODULE_DIRECTO
set_target_properties (parallel_test PROPERTIES LINKER_LANGUAGE Fortran)
set_target_properties (parallel_test PROPERTIES FOLDER test/fortran)
+#-- Adding test for parallel_test_F03
+if (HDF5_ENABLE_F2003)
+ add_executable (parallel_test_F03
+ ptest_F03.f90
+ multidsetrw_F03.f90
+ )
+ TARGET_NAMING (parallel_test_F03 ${LIB_TYPE})
+ TARGET_FORTRAN_PROPERTIES (parallel_test_F03 " " " ")
+ target_link_libraries (parallel_test_F03
+ ${HDF5_F90_TEST_LIB_TARGET}
+ ${HDF5_F90_LIB_TARGET}
+ ${HDF5_LIB_TARGET}
+ )
+ if (WIN32 AND MSVC)
+ target_link_libraries (parallel_test_F03 "ws2_32.lib")
+ endif (WIN32 AND MSVC)
+ set_target_properties (parallel_test_F03 PROPERTIES LINKER_LANGUAGE Fortran)
+ set_target_properties (parallel_test_F03 PROPERTIES FOLDER test/fortran)
+endif (HDF5_ENABLE_F2003)
+
include (CMakeTests.cmake)
diff --git a/fortran/testpar/mdset.f90 b/fortran/testpar/mdset.f90
index 7fe431b..80a969d 100644
--- a/fortran/testpar/mdset.f90
+++ b/fortran/testpar/mdset.f90
@@ -219,30 +219,30 @@ SUBROUTINE multiple_dset_write(length, do_collective, do_chunk, mpi_size, mpi_ra
CALL check("h5pcreate_f", hdferror, nerrors)
CALL h5pset_fapl_mpio_f(fapl_id, MPI_COMM_WORLD, MPI_INFO_NULL, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5pset_fapl_mpio_f", hdferror, nerrors)
CALL h5fopen_f(filename, H5F_ACC_RDWR_F, file_id, hdferror, access_prp = fapl_id)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5fopen_f", hdferror, nerrors)
CALL h5screate_simple_f(1, dims, fspace_id, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5screate_simple_f", hdferror, nerrors)
CALL h5screate_simple_f(1, dims, mspace_id, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5screate_simple_f", hdferror, nerrors)
!//////////////////////////////////////////////////////////
! select hyperslab in memory
!//////////////////////////////////////////////////////////
CALL h5sselect_hyperslab_f(mspace_id, H5S_SELECT_SET_F, start, counti, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5sselect_hyperslab_f", hdferror, nerrors)
!//////////////////////////////////////////////////////////
! select hyperslab in the file
!//////////////////////////////////////////////////////////
CALL h5sselect_hyperslab_f(fspace_id, H5S_SELECT_SET_F, start, counti, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5sselect_hyperslab_f", hdferror, nerrors)
!//////////////////////////////////////////////////////////
! create a property list for collective dataset read
@@ -253,7 +253,7 @@ SUBROUTINE multiple_dset_write(length, do_collective, do_chunk, mpi_size, mpi_ra
IF (do_collective) THEN
CALL h5pset_dxpl_mpio_f(dxpl_id, H5FD_MPIO_COLLECTIVE_F, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5pset_dxpl_mpio_f", hdferror, nerrors)
ENDIF
!//////////////////////////////////////////////////////////
@@ -267,11 +267,11 @@ SUBROUTINE multiple_dset_write(length, do_collective, do_chunk, mpi_size, mpi_ra
! create this dataset
CALL h5dopen_f(file_id, dsetname, dset_id, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5dopen_f", hdferror, nerrors)
! read this dataset
CALL h5dread_f(dset_id,H5T_NATIVE_INTEGER,rbuf,dims,hdferror,file_space_id=fspace_id,mem_space_id=mspace_id,xfer_prp=dxpl_id)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5dread_f", hdferror, nerrors)
! close this dataset
CALL h5dclose_f(dset_id, hdferror)
@@ -297,20 +297,19 @@ SUBROUTINE multiple_dset_write(length, do_collective, do_chunk, mpi_size, mpi_ra
!//////////////////////////////////////////////////////////
CALL h5pclose_f(fapl_id, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5pclose_f", hdferror, nerrors)
CALL h5pclose_f(dxpl_id, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5pclose_f", hdferror, nerrors)
CALL h5sclose_f(fspace_id, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5sclose_f", hdferror, nerrors)
CALL h5sclose_f(mspace_id, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
+ CALL check("h5sclose_f", hdferror, nerrors)
CALL h5fclose_f(file_id, hdferror)
- CALL check("h5pcreate_f", hdferror, nerrors)
-
+ CALL check("h5fclose_f", hdferror, nerrors)
DEALLOCATE(wbuf)
DEALLOCATE(rbuf)
diff --git a/fortran/testpar/multidsetrw_F03.f90 b/fortran/testpar/multidsetrw_F03.f90
new file mode 100644
index 0000000..177f94e
--- /dev/null
+++ b/fortran/testpar/multidsetrw_F03.f90
@@ -0,0 +1,206 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+! Copyright by The HDF Group. *
+! Copyright by the Board of Trustees of the University of Illinois. *
+! All rights reserved. *
+! *
+! This file is part of HDF5. The full HDF5 copyright notice, including *
+! terms governing use, modification, and redistribution, is contained in *
+! the files COPYING and Copyright.html. COPYING can be found at the root *
+! of the source code distribution tree; Copyright.html can be found at the *
+! root level of an installed copy of the electronic HDF5 document set and *
+! is linked from the top-level documents page. It can also be found at *
+! http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+! access to either file, you may request a copy from help@hdfgroup.org. *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+!
+! writes/reads dataset by hyperslabs using multi-dataset routines, h5dread_multi and
+! h5dwrite_multi
+!
+
+SUBROUTINE pmultiple_dset_hyper_rw(do_collective, do_chunk, mpi_size, mpi_rank, nerrors)
+
+ USE iso_c_binding
+ USE TH5_MISC
+ USE hdf5
+ USE mpi
+ IMPLICIT NONE
+
+ LOGICAL, INTENT(in) :: do_collective ! use collective IO
+ LOGICAL, INTENT(in) :: do_chunk ! use chunking
+ INTEGER, INTENT(in) :: mpi_size ! number of processes in the group of communicator
+ INTEGER, INTENT(in) :: mpi_rank ! rank of the calling process in the communicator
+ INTEGER, INTENT(inout) :: nerrors ! number of errors
+ CHARACTER(LEN=80):: dsetname ! Dataset name
+ TYPE(H5D_rw_multi_t), ALLOCATABLE, DIMENSION(:) :: info_md
+ INTEGER(hsize_t), DIMENSION(1:2) :: cdims ! chunk dimensions
+
+ INTEGER(SIZE_T):: ndsets
+ INTEGER(HID_T) :: file_id ! File identifier
+ INTEGER(HID_T) :: filespace ! Dataspace identifier in file
+ INTEGER(HID_T) :: memspace ! Dataspace identifier in memory
+ INTEGER(HID_T) :: plist_id ! Property list identifier
+ INTEGER(HID_T) :: dcpl_id ! Dataset creation property list
+ INTEGER(HSIZE_T), DIMENSION(1:2) :: dimsf ! Dataset dimensions.
+ INTEGER(HSIZE_T), DIMENSION(1:2) :: dimsfi = (/5,8/)
+
+ INTEGER(HSIZE_T), DIMENSION(1:2) :: count
+ INTEGER(HSSIZE_T), DIMENSION(1:2) :: offset
+ INTEGER, ALLOCATABLE, DIMENSION(:,:,:), TARGET :: DATA ! Data to write
+ INTEGER, ALLOCATABLE, DIMENSION(:,:,:), TARGET :: rDATA ! Data to write
+ INTEGER, PARAMETER :: rank = 2 ! Dataset rank
+ INTEGER :: i, j, k, istart
+ INTEGER :: error ! Error flags
+
+ dimsf = (/5_hsize_t,INT(mpi_size, hsize_t)*8_hsize_t/)
+ ndsets = 5;
+
+ !
+ ! Setup file access property list with parallel I/O access.
+ !
+ CALL h5pcreate_f(H5P_FILE_ACCESS_F, plist_id, error)
+ CALL check("h5pcreate_f", error, nerrors)
+ CALL h5pset_fapl_mpio_f(plist_id, MPI_COMM_WORLD, MPI_INFO_NULL, error)
+ CALL check("h5pset_fapl_mpio_f", error, nerrors)
+ !
+ ! Create the file collectively.
+ !
+ CALL h5fcreate_f("parf2.h5", H5F_ACC_TRUNC_F, file_id, error, access_prp = plist_id)
+ CALL check("h5fcreate_f", error, nerrors)
+ CALL h5pclose_f(plist_id, error)
+ CALL check("h5pclose_f", error, nerrors)
+ !
+ ! Create the data space for the dataset.
+ !
+ CALL h5screate_simple_f(rank, dimsf, filespace, error)
+ CALL check("h5screate_simple_f", error, nerrors)
+ !
+ ! Each process defines dataset in memory and writes it to the hyperslab
+ ! in the file.
+ !
+ count(1) = dimsf(1)
+ count(2) = dimsf(2)/mpi_size
+ offset(1) = 0
+ offset(2) = mpi_rank * count(2)
+ CALL h5screate_simple_f(rank, count, memspace, error)
+ CALL check("h5screate_simple_f", error, nerrors)
+
+ !
+ ! Modify dataset creation properties to enable chunking
+ !
+
+ CALL h5pcreate_f(H5P_DATASET_CREATE_F, dcpl_id, error)
+ CALL check("h5pcreate_f", error, nerrors)
+
+ IF (do_chunk) THEN
+ cdims(1) = dimsf(1)
+ cdims(2) = dimsf(2)/mpi_size/2
+ CALL h5pset_chunk_f(dcpl_id, 2, cdims, error)
+ CALL check("h5pset_chunk_f", error, nerrors)
+ ENDIF
+ !
+ ! Select hyperslab in the file.
+ !
+ CALL h5sselect_hyperslab_f(filespace, H5S_SELECT_SET_F, offset, count, error)
+ CALL check("h5sselect_hyperslab_f", error, nerrors)
+ !
+ ! Initialize data buffer
+ !
+ ALLOCATE ( DATA(COUNT(1),COUNT(2), ndsets))
+ ALLOCATE ( rdata(COUNT(1),COUNT(2), ndsets))
+
+ ALLOCATE(info_md(1:ndsets))
+
+ !
+ ! Create property list for collective dataset write
+ !
+ CALL h5pcreate_f(H5P_DATASET_XFER_F, plist_id, error)
+ CALL check("h5pcreate_f", error, nerrors)
+ IF(do_collective)THEN
+ CALL h5pset_dxpl_mpio_f(plist_id, H5FD_MPIO_COLLECTIVE_F, error)
+ CALL check("h5pset_dxpl_mpio_f", error, nerrors)
+ ELSE
+ CALL h5pset_dxpl_mpio_f(plist_id, H5FD_MPIO_INDEPENDENT_F, error)
+ CALL check("h5pset_dxpl_mpio_f", error, nerrors)
+ ENDIF
+
+ !
+ ! Create the dataset with default properties.
+ !
+ info_md(1:ndsets)%mem_type_id = H5T_NATIVE_INTEGER
+ info_md(1:ndsets)%mem_space_id = memspace
+ info_md(1:ndsets)%dset_space_id = filespace
+
+ DO i = 1, ndsets
+ ! Create the data
+ DO k = 1, COUNT(1)
+ DO j = 1, COUNT(2)
+ istart = (k-1)*dimsf(2) + mpi_rank*COUNT(2)
+ DATA(k,j,i) = (istart + j)*10**(i-1)
+ ENDDO
+ ENDDO
+ ! Point to te data
+ info_md(i)%buf = C_LOC(DATA(1,1,i))
+
+ ! direct the output of the write statement to unit "dsetname"
+ WRITE(dsetname,'("dataset ",I0)') i
+ ! create the dataset
+ CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, filespace, info_md(i)%dset_id, error, dcpl_id)
+ CALL check("h5dcreate_f", error, nerrors)
+ ENDDO
+ !
+ ! Write the dataset collectively.
+ !
+ CALL h5dwrite_multi_f(plist_id, ndsets, info_md, error)
+ CALL check("h5dwrite_multi_f", error, nerrors)
+
+ DO i = 1, ndsets
+ ! Point to the read buffer
+ info_md(i)%buf = C_LOC(rdata(1,1,i))
+ ENDDO
+
+ CALL H5Dread_multi_f(plist_id, ndsets, info_md, error)
+ CALL check("h5dread_multi_f", error, nerrors)
+
+ DO i = 1, ndsets
+ ! Close all the datasets
+ CALL h5dclose_f(info_md(i)%dset_id, error)
+ CALL check("h5dclose_f", error, nerrors)
+ ENDDO
+
+ ! check the data read and write buffers
+ DO i = 1, ndsets
+ ! Create the data
+ DO k = 1, COUNT(1)
+ DO j = 1, COUNT(2)
+ IF(rDATA(k,j,i).NE.DATA(k,j,i))THEN
+ nerrors = nerrors + 1
+ ENDIF
+ ENDDO
+ ENDDO
+ ENDDO
+ !
+ ! Deallocate data buffer.
+ !
+ DEALLOCATE(data, rdata)
+
+ !
+ ! Close dataspaces.
+ !
+ CALL h5sclose_f(filespace, error)
+ CALL check("h5sclose_f", error, nerrors)
+ CALL h5sclose_f(memspace, error)
+ CALL check("h5sclose_f", error, nerrors)
+ !
+ ! Close the dataset and property list.
+ !
+ CALL h5pclose_f(plist_id, error)
+ CALL check("h5pclose_f", error, nerrors)
+
+ !
+ ! Close the file.
+ !
+ CALL h5fclose_f(file_id, error)
+ CALL check("h5fclose_f", error, nerrors)
+
+END SUBROUTINE pmultiple_dset_hyper_rw
diff --git a/fortran/testpar/ptest_F03.f90 b/fortran/testpar/ptest_F03.f90
new file mode 100644
index 0000000..23bab8a
--- /dev/null
+++ b/fortran/testpar/ptest_F03.f90
@@ -0,0 +1,91 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+! Copyright by The HDF Group. *
+! Copyright by the Board of Trustees of the University of Illinois. *
+! All rights reserved. *
+! *
+! This file is part of HDF5. The full HDF5 copyright notice, including *
+! terms governing use, modification, and redistribution, is contained in *
+! the files COPYING and Copyright.html. COPYING can be found at the root *
+! of the source code distribution tree; Copyright.html can be found at the *
+! root level of an installed copy of the electronic HDF5 document set and *
+! is linked from the top-level documents page. It can also be found at *
+! http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+! access to either file, you may request a copy from help@hdfgroup.org. *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+!
+! MAIN PROGRAM FOR PARALLEL HDF5 FORTRAN 2003 TESTS
+!
+
+PROGRAM parallel_test_F03
+ USE hdf5
+ USE TH5_MISC
+ USE mpi
+ IMPLICIT NONE
+
+ INTEGER :: mpierror ! MPI hdferror flag
+ INTEGER :: hdferror ! HDF hdferror flag
+ LOGICAL :: do_collective ! use collective MPI IO
+ LOGICAL :: do_chunk ! use chunking
+ INTEGER :: nerrors = 0 ! number of errors
+ INTEGER :: mpi_size ! number of processes in the group of communicator
+ INTEGER :: mpi_rank ! rank of the calling process in the communicator
+ !
+ ! initialize MPI
+ !
+ CALL mpi_init(mpierror)
+ IF (mpierror .NE. MPI_SUCCESS) WRITE(*,*) "MPI_INIT *FAILED*"
+ CALL mpi_comm_rank( MPI_COMM_WORLD, mpi_rank, mpierror )
+ IF (mpierror .NE. MPI_SUCCESS) WRITE(*,*) "MPI_COMM_RANK *FAILED* Process = ", mpi_rank
+ CALL mpi_comm_size( MPI_COMM_WORLD, mpi_size, mpierror )
+ IF (mpierror .NE. MPI_SUCCESS) WRITE(*,*) "MPI_COMM_SIZE *FAILED* Process = ", mpi_rank
+
+ !
+ ! initialize the HDF5 fortran interface
+ !
+ CALL h5open_f(hdferror)
+ !
+ ! test write/read several hyperslab datasets
+ !
+ do_collective = .TRUE.
+ do_chunk = .FALSE.
+ IF (mpi_rank == 0) WRITE(*,*) 'Writing/Reading several hyperslab datasets (contiguous layout, collective MPI IO)'
+ CALL pmultiple_dset_hyper_rw(do_collective, do_chunk, mpi_size, mpi_rank, nerrors)
+
+ do_collective = .FALSE.
+ do_chunk = .FALSE.
+ IF (mpi_rank == 0) WRITE(*,*) 'Writing/Reading several hyperslab datasets (contiguous layout, independent MPI IO)'
+ CALL pmultiple_dset_hyper_rw(do_collective, do_chunk, mpi_size, mpi_rank, nerrors)
+
+ do_collective = .TRUE.
+ do_chunk = .TRUE.
+ IF (mpi_rank == 0) WRITE(*,*) 'Writing/Reading several hyperslab datasets (chunked, collective MPI IO)'
+ CALL pmultiple_dset_hyper_rw(do_collective, do_chunk, mpi_size, mpi_rank, nerrors)
+
+ do_collective = .FALSE.
+ do_chunk = .TRUE.
+ IF (mpi_rank == 0) WRITE(*,*) 'Writing/Reading several hyperslab datasets (chunked, independent MPI IO)'
+ CALL pmultiple_dset_hyper_rw(do_collective, do_chunk, mpi_size, mpi_rank, nerrors)
+
+ !
+ ! close HDF5 interface
+ !
+ CALL h5close_f(hdferror)
+ !
+ ! close MPI
+ !
+ IF (nerrors == 0) THEN
+ CALL mpi_finalize(mpierror)
+ IF (mpierror .NE. MPI_SUCCESS) THEN
+ WRITE(*,*) "MPI_FINALIZE *FAILED* Process = ", mpi_rank
+ ENDIF
+ ELSE
+ WRITE(*,*) 'Errors detected in process ', mpi_rank
+ CALL mpi_abort(MPI_COMM_WORLD, 1, mpierror)
+ IF (mpierror .NE. MPI_SUCCESS) THEN
+ WRITE(*,*) "MPI_ABORT *FAILED* Process = ", mpi_rank
+ ENDIF
+ ENDIF
+
+END PROGRAM parallel_test_F03
+
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\G-wXN}[N]O^O_O`O`O`O`OaOaOaOaOaOaOaOaO`O_O^O\N \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\aMLyYN_OaPbPcPcPdPdPdPdPdPdPdPdPdPePePePePePdPcP_OpUM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\wXN_OdPfPgQhQhQiQiQiQiQiQjQjQjQjQjQjQjQjQjQjQiQfP`O\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\NCJiQLbPhQkQmRnRoRoRoRoRoRoRoRoRpRpSqSqSrSrSrSqSoRjQ]O\KK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\fOLrUMcPlRqStSuTwTxTxTyTyTzTzUzUzUzUzUyTxTwTtSmRaOhPL\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\a0 cNLqUM\OfQpSwVzV|V}VVVǀVɂW̅[ՏewꪅĈgqTfQ{ZNYIK9\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\O1{G#JkRMqUMtVNiSv\dbzZvUuTsSqSnRjQeP^OrUMHh>!T4\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\G-V5wE"~I#M%U+e7l:g2b*a(`(^(])^-]1S,qC$`9 R3G-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\@)J/i>!pA"tD"wF$yH&xH&tE$wE#yG%}M+T4S5mE*Z7!K/B*;'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\aOoR{UǀVυX<(F-a: e<!h>!j@#k@$h>"d<!c=$hD-fF2[<)K0@);'5$˂VǀV|U_LKYIK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_OxTɂW֒k|X>f-^(Z'W&T&N>)F-J/b; g>#nD(jB&c<!b=%jH2_A/I0!<(8&5$JYS%8&;'?)E,<:HA=HE?IJAISFJYIKXIK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\nR}UܘqʊevUe,V&VC @ |> y< u: r9 o7 l6 j5 h4 g3 5$D,K/b; h>"wM1tK.e="a<#cA,U8&E-<(9&.!a0 b1 c1      +3#@)46G<:HMCIXHK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\U*vT~X{Yk+W&N$|> u: p8 k5 f3 a0 _/ ]. [- I\*_(LkRMmSMmSMnSMnSMD,R3W5mA"|O0|P1j?"c<!a=%Y7"N1F,;'NCJNCJNDJODJODJODJh>!a: X/K%