Skip to content

Commit 0e67ce6

Browse files
committed
Remove dependence of HDF5 IO on MPL, replace with MPI, minimize overall dependence on FIAT
1 parent de57fd7 commit 0e67ce6

10 files changed

+94
-77
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,5 +227,5 @@ jobs:
227227
dependency_branch: develop
228228
dependency_cmake_options: |
229229
ecmwf-ifs/fiat: "-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DENABLE_TESTS=OFF
230-
cmake_options: "-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} ${{ matrix.cmake_options }} -DENABLE_ACC=OFF -DENABLE_IO=ON -DENABLE_IO_MPI=ON -DENABLE_GET_VIEW_ABORT=${{ matrix.get_view_abort }} -DENABLE_DELAYED=${{ matrix.delayed }}"
230+
cmake_options: "-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} ${{ matrix.cmake_options }} -DENABLE_ACC=OFF -DENABLE_MPI=ON -DENABLE_IO_PARALLEL=ON -DENABLE_GET_VIEW_ABORT=${{ matrix.get_view_abort }} -DENABLE_DELAYED=${{ matrix.delayed }}"
231231
ctest_options: "${{ matrix.ctest_options }}"

CMakeLists.txt

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ ecbuild_add_option( FEATURE SINGLE_PRECISION
4545
ecbuild_add_option( FEATURE DOUBLE_PRECISION
4646
DESCRIPTION "Compile field_api in double precision" DEFAULT ON)
4747

48-
set(DEFAULT_PRECISION sp)
4948
if(HAVE_SINGLE_PRECISION)
49+
set(DEFAULT_PRECISION sp)
5050
list(APPEND fiat_components single)
5151
list(APPEND precisions sp)
5252
endif()
@@ -56,33 +56,29 @@ if(HAVE_DOUBLE_PRECISION)
5656
list(APPEND fiat_components double)
5757
endif()
5858

59+
ecbuild_add_option( FEATURE MPI
60+
DEFAULT OFF
61+
DESCRIPTION "Support for MPI distributed parallelism"
62+
REQUIRED_PACKAGES "MPI COMPONENTS Fortran" )
63+
5964
## IO using HDF5
60-
ecbuild_add_option( FEATURE IO
61-
DESCRIPTION "Use external libs, e.g. HDF5 to read and write FieldAPI variables"
62-
REQUIRED_PACKAGES "HDF5 COMPONENTS Fortran"
63-
DEFAULT OFF
64-
)
6565
ecbuild_add_option( FEATURE IO_SERIAL
6666
DESCRIPTION "Use serial HDF5 to read and write FieldAPI variables"
6767
REQUIRED_PACKAGES "HDF5 COMPONENTS Fortran"
6868
DEFAULT OFF
6969
)
70-
ecbuild_add_option( FEATURE IO_MPI
71-
DESCRIPTION "Use HDF5 (rank defined by MPI) to read and write FieldAPI variables"
72-
REQUIRED_PACKAGES "HDF5 COMPONENTS Fortran"
73-
REQUIRED_PACKAGES "MPI COMPONENTS Fortran"
74-
DEFAULT OFF
75-
)
7670

77-
ecbuild_add_option( FEATURE IO_MPL
78-
DESCRIPTION "Use HDF5 (rank defined by MPL) to read and write FieldAPI variables"
71+
ecbuild_add_option( FEATURE IO_PARALLEL
72+
DESCRIPTION "Use HDF5 (rank defined by MPI) to read and write FieldAPI variables"
7973
REQUIRED_PACKAGES "HDF5 COMPONENTS Fortran"
80-
REQUIRED_PACKAGES "FIAT"
74+
CONDITION HAVE_MPI
8175
DEFAULT OFF
8276
)
8377

84-
if( HAVE_IO_MPL )
85-
list(APPEND fiat_components MPI)
78+
if(HAVE_IO_SERIAL OR HAVE_IO_PARALLEL)
79+
option( HAVE_IO "HAVE_IO" TRUE)
80+
else()
81+
option( HAVE_IO "HAVE_IO" FALSE)
8682
endif()
8783

8884
## find fiat
@@ -139,6 +135,11 @@ list(APPEND prec_srcs
139135
${CMAKE_CURRENT_BINARY_DIR}/src/io/field_hdf5_module.F90)
140136
endif()
141137

138+
if( HAVE_MPI )
139+
list(APPEND prec_srcs
140+
${CMAKE_CURRENT_BINARY_DIR}/src/io/field_hdf5_module.F90)
141+
endif()
142+
142143
list(APPEND obj_libs
143144
field_api_core
144145
field_api_debug
@@ -167,9 +168,8 @@ foreach(prec ${precisions})
167168
$<${fiat_FOUND}:fiat>
168169
$<${fiat_FOUND}:parkind_${prec}>
169170
OpenMP::OpenMP_Fortran
170-
$<${HAVE_IO}:HDF5::HDF5>
171-
$<${HAVE_IO_MPI}:MPI::MPI_Fortran>
172-
$<${HAVE_IO_MPL}:fiat>
171+
$<$<BOOL:${HAVE_IO}>:HDF5::HDF5>
172+
$<${HAVE_IO_PARALLEL}:MPI::MPI_Fortran>
173173
)
174174

175175
set_property(TARGET ${LIBNAME}_${prec} PROPERTY C_STANDARD 99)
@@ -209,7 +209,6 @@ ecbuild_add_option(
209209
FEATURE TESTS
210210
DEFAULT ON
211211
DESCRIPTION "Enable field_api testing"
212-
CONDITION fiat_FOUND
213212
)
214213

215214
if( HAVE_TESTS )

cmake/field_api_add_object_library.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ macro(field_api_add_object_library)
6060
$<${HAVE_ACC}:OpenACC::OpenACC_Fortran>
6161
$<${fiat_FOUND}:fiat>
6262
$<${fiat_FOUND}:parkind_${DEFAULT_PRECISION}>
63+
$<${HAVE_MPI}:MPI::MPI_Fortran>
6364
OpenMP::OpenMP_Fortran
64-
$<${HAVE_IO}:HDF5::HDF5>
65+
$<$<BOOL:${HAVE_IO}>:HDF5::HDF5>
6566
)
6667

6768
target_include_directories( ${_PAR_LIBNAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}

cmake/field_api_find_fiat_modules.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ macro( field_api_find_fiat_modules )
2424
ecbuild_find_package(NAME fiat COMPONENTS ${fiat_components})
2525
if( NOT fiat_FOUND )
2626
if(NOT UTIL_MODULE_PATH)
27-
ecbuild_critical("If not building with fiat, then the path for utility modules must be specified")
27+
ecbuild_critical("If not building with fiat, then the path for utility modules must be specified in UTIL_MODULE_PATH")
2828
endif()
2929

3030
ecbuild_info( "Checking for FIAT components in ${UTIL_MODULE_PATH}" )

src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ if( HAVE_FIELD_GANG )
1515
endif()
1616
add_subdirectory( util )
1717
add_subdirectory( shuffle )
18-
if( HAVE_IO )
18+
if ( HAVE_IO_SERIAL OR HAVE_IO_PARALLEL )
1919
add_subdirectory( io )
2020
endif()

src/io/CMakeLists.txt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,11 @@ field_api_add_object_library(
3333
SRCS ${srcs}
3434
LIBRARIES field_api_core field_api_debug
3535
)
36+
3637
if(HAVE_IO_SERIAL)
3738
target_compile_definitions( field_api_io PRIVATE HAVE_IO_SERIAL )
38-
elseif(HAVE_IO_MPI)
39-
ecbuild_enable_mpi( COMPONENTS FORTRAN REQUIRED)
40-
target_compile_definitions( field_api_io PRIVATE HAVE_IO_MPI )
41-
42-
elseif(HAVE_IO_MPL)
43-
target_compile_definitions( field_api_io PRIVATE HAVE_IO_MPL )
39+
elseif(HAVE_IO_PARALLEL)
40+
target_compile_definitions( field_api_io PRIVATE HAVE_IO_PARALLEL )
4441
endif()
4542

4643
## don't build precision dependent sourcefile

src/io/hdf5_common_module.F90

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,7 @@ END SUBROUTINE FINALIZE_HDF5_STORAGE
6363
SUBROUTINE NAME_HDF5_STORAGE(FILENAME,FNAME_WITH_RANK)
6464

6565
USE FIELD_ABORT_MODULE, ONLY: FIELD_ABORT
66-
#ifdef HAVE_IO_MPL
67-
USE MPL_MODULE, ONLY: MPL_NUMPROC, MPL_RANK
68-
#elif HAVE_IO_MPI
66+
#if HAVE_IO_PARALLEL
6967
USE MPI, ONLY: MPI_COMM_WORLD, MPI_COMM_SIZE, MPI_COMM_RANK
7068
#endif
7169

@@ -74,18 +72,15 @@ SUBROUTINE NAME_HDF5_STORAGE(FILENAME,FNAME_WITH_RANK)
7472
CHARACTER(LEN=:), ALLOCATABLE :: RANK_STR
7573
INTEGER :: NUMB_RANKS, MY_RANK, IERR, NAME_LEN, RANK_LEN
7674

77-
#ifdef HAVE_IO_MPL
78-
NUMB_RANKS=MPL_NUMPROC
79-
MY_RANK=MPL_RANK
80-
#elif HAVE_IO_MPI
75+
#if HAVE_IO_PARALLEL
8176
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NUMB_RANKS,IERR)
8277
CALL MPI_COMM_RANK(MPI_COMM_WORLD,MY_RANK,IERR)
8378
MY_RANK=MY_RANK+1
8479
#elif HAVE_IO_SERIAL
8580
NUMB_RANKS=1
8681
MY_RANK=0
8782
#else
88-
CALL FIELD_ABORT("Name of HDF5 file cannot be specified without specifying FIELD_API_IO mode: _SERIAL, _MPI or _MPL")
83+
CALL FIELD_ABORT("Name of HDF5 file cannot be specified without specifying FIELD_API_IO mode: _SERIAL _PARALLEL")
8984
#endif
9085
RANK_LEN = CEILING(LOG10(REAL(ABS(MY_RANK)+1)))
9186
ALLOCATE(CHARACTER(RANK_LEN) :: RANK_STR)

tests/CMakeLists.txt

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ ecbuild_add_test(
1818
SOURCES main.F90
1919
LIBS
2020
${LIBNAME_PREC}
21-
parkind_${DEFAULT_PRECISION}
22-
fiat
21+
$<${fiat_FOUND}:parkind_${DEFAULT_PRECISION}>
22+
$<${fiat_FOUND}:fiat>
2323
OpenMP::OpenMP_Fortran
2424
$<${HAVE_ACC}:OpenACC::OpenACC_Fortran>
25-
$<${HAVE_IO}:HDF5::HDF5>
25+
$<$<BOOL:${HAVE_IO}>:HDF5::HDF5>
2626
LINKER_LANGUAGE Fortran
2727
ENVIRONMENT "DEV_ALLOC_SIZE=${dev_alloc_size}"
2828
)
@@ -97,7 +97,6 @@ list(APPEND TEST_FILES
9797
test_0_sized_transfer_wrap.F90
9898
test_async.F90
9999
test_bc.F90
100-
test_crc64.F90
101100
test_field1d.F90
102101
test_field_array.F90
103102
test_field_array_0_size.F90
@@ -121,6 +120,10 @@ list(APPEND TEST_FILES
121120
test_wrappernosynconfinal.F90
122121
wrapper_modify_gpu.F90
123122
)
123+
if(fiat_FOUND)
124+
list(APPEND TEST_FILES
125+
test_crc64.F90 )
126+
endif()
124127

125128
#Place-holder for failing tests
126129
set(FAILING_TEST_FILES
@@ -138,7 +141,7 @@ if(HAVE_ACC)
138141
)
139142
endif()
140143

141-
if(HAVE_IO)
144+
if(HAVE_IO_SERIAL OR HAVE_IO_PARALLEL)
142145
list(APPEND HDF5_TEST_FILES
143146
test_hdf5_wr_parallel_field2d.F90
144147
test_hdf5_rw_parallel_general.F90)
@@ -190,19 +193,21 @@ endif()
190193
#Set OMP_NUM_THREADS for tests
191194
set(omp_num_threads 8)
192195

193-
if(HAVE_IO AND fiat_HAVE_MPI)
196+
197+
if(HAVE_IO_PARALLEL)
194198
foreach(TEST_FILE ${HDF5_TEST_FILES})
195199
get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE)
196200
ecbuild_add_test(
197201
TARGET ${TEST_NAME}.x
198202
SOURCES ${TEST_FILE}
199203
LIBS
200204
${LIBNAME_PREC}
201-
parkind_${DEFAULT_PRECISION}
202-
fiat
205+
$<${fiat_FOUND}:parkind_${DEFAULT_PRECISION}>
206+
$<${fiat_FOUND}:fiat>
203207
OpenMP::OpenMP_Fortran
208+
MPI::MPI_Fortran
204209
$<${HAVE_ACC}:OpenACC::OpenACC_Fortran>
205-
$<${HAVE_IO}:HDF5::HDF5>
210+
$<$<BOOL:${HAVE_IO}>:HDF5::HDF5>
206211
DEFINITIONS
207212
$<${HAVE_FIELD_GANG}:HAVE_FIELD_GANG>
208213
LINKER_LANGUAGE Fortran
@@ -224,6 +229,7 @@ foreach(TEST_FILE ${HDF5_TEST_FILES})
224229
endif()
225230
target_compile_definitions( ${TEST_NAME}.x PRIVATE
226231
$<${HAVE_OMP_OFFLOAD}:OMPGPU>
232+
$<${HAVE_MPI}:HAVE_MPI>
227233
$<${HAVE_CUDA}:_CUDA> )
228234

229235
if( DEFAULT_PRECISION MATCHES sp )
@@ -239,11 +245,11 @@ foreach(TEST_FILE ${TEST_FILES})
239245
SOURCES ${TEST_FILE}
240246
LIBS
241247
${LIBNAME_PREC}
242-
parkind_${DEFAULT_PRECISION}
243-
fiat
248+
$<${fiat_FOUND}:parkind_${DEFAULT_PRECISION}>
249+
$<${fiat_FOUND}:fiat>
244250
OpenMP::OpenMP_Fortran
245251
$<${HAVE_ACC}:OpenACC::OpenACC_Fortran>
246-
$<${HAVE_IO}:HDF5::HDF5>
252+
$<$<BOOL:${HAVE_IO}>:HDF5::HDF5>
247253
DEFINITIONS
248254
$<${HAVE_FIELD_GANG}:HAVE_FIELD_GANG>
249255
LINKER_LANGUAGE Fortran
@@ -263,7 +269,7 @@ foreach(TEST_FILE ${TEST_FILES})
263269
endif()
264270
endif()
265271
target_compile_definitions( ${TEST_NAME}.x PRIVATE
266-
$<${HAVE_IO}:HDF5::HDF5>
272+
$<$<BOOL:${HAVE_IO}>:HDF5::HDF5>
267273
$<${HAVE_OMP_OFFLOAD}:OMPGPU>
268274
$<${HAVE_CUDA}:_CUDA> )
269275

@@ -275,10 +281,10 @@ endforeach()
275281
foreach(FAILING_TEST_FILE ${FAILING_TEST_FILES})
276282
get_filename_component(FAILING_TEST_NAME ${FAILING_TEST_FILE} NAME_WE)
277283
add_executable(${FAILING_TEST_NAME}.x ${FAILING_TEST_FILE})
278-
target_link_libraries(${FAILING_TEST_NAME}.x PRIVATE ${LIBNAME_PREC} parkind_${DEFAULT_PRECISION} fiat)
284+
target_link_libraries(${FAILING_TEST_NAME}.x PRIVATE ${LIBNAME_PREC} $<${fiat_FOUND}:parkind_${DEFAULT_PRECISION} fiat>)
279285
target_link_libraries(${FAILING_TEST_NAME}.x PRIVATE OpenMP::OpenMP_Fortran)
280286
target_link_libraries(${FAILING_TEST_NAME}.x PRIVATE $<${HAVE_ACC}:OpenACC::OpenACC_Fortran>)
281-
target_link_libraries(${FAILING_TEST_NAME}.x PRIVATE $<${HAVE_IO}:HDF5::HDF5>)
287+
target_link_libraries(${FAILING_TEST_NAME}.x PRIVATE $<$<BOOL:${HAVE_IO}>:HDF5::HDF5>)
282288
set_target_properties(${FAILING_TEST_NAME}.x PROPERTIES LINKER_LANGUAGE Fortran)
283289
add_test(NAME ${FAILING_TEST_NAME} COMMAND ${FAILING_TEST_NAME}.x)
284290
set_property(TEST ${FAILING_TEST_NAME} PROPERTY WILL_FAIL TRUE)
@@ -296,10 +302,10 @@ endforeach()
296302
foreach(ABOR1_TEST_FILE ${ABOR1_TEST_FILES})
297303
get_filename_component(ABOR1_TEST_NAME ${ABOR1_TEST_FILE} NAME_WE)
298304
add_executable(${ABOR1_TEST_NAME}.x ${ABOR1_TEST_FILE})
299-
target_link_libraries(${ABOR1_TEST_NAME}.x PRIVATE ${LIBNAME_PREC} parkind_${DEFAULT_PRECISION} fiat)
305+
target_link_libraries(${ABOR1_TEST_NAME}.x PRIVATE ${LIBNAME_PREC} $<${fiat_FOUND}:parkind_${DEFAULT_PRECISION} fiat>)
300306
target_link_libraries(${ABOR1_TEST_NAME}.x PRIVATE OpenMP::OpenMP_Fortran)
301307
target_link_libraries(${ABOR1_TEST_NAME}.x PRIVATE $<${HAVE_ACC}:OpenACC::OpenACC_Fortran>)
302-
target_link_libraries(${ABOR1_TEST_NAME}.x PRIVATE $<${HAVE_IO}:HDF5::HDF5>)
308+
target_link_libraries(${ABOR1_TEST_NAME}.x PRIVATE $<$<BOOL:${HAVE_IO}>:HDF5::HDF5>)
303309
set_target_properties(${ABOR1_TEST_NAME}.x PROPERTIES LINKER_LANGUAGE Fortran)
304310
add_test(NAME ${ABOR1_TEST_NAME} COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/abor1catcher.sh "./${ABOR1_TEST_NAME}.x")
305311
set_property(TEST ${ABOR1_TEST_NAME} PROPERTY ENVIRONMENT "OMP_NUM_THREADS=${omp_num_threads};DEV_ALLOC_SIZE=${dev_alloc_size}")
@@ -313,20 +319,22 @@ foreach(ABOR1_TEST_FILE ${ABOR1_TEST_FILES})
313319
target_compile_definitions( ${ABOR1_TEST_NAME}.x PRIVATE $<${HAVE_CUDA}:_CUDA> )
314320
endforeach()
315321

322+
if(fiat_FOUND)
316323
## Mixed precision unit-test
317-
ecbuild_add_test(
318-
TARGET init_wrapper_mixed_precision.x
319-
SOURCES init_wrapper_mixed_precision.F90
320-
LIBS
321-
${LIBNAME}_sp
322-
fiat
323-
parkind_sp
324-
OpenMP::OpenMP_Fortran
325-
$<${HAVE_ACC}:OpenACC::OpenACC_Fortran>
326-
$<${HAVE_IO}:HDF5::HDF5>
327-
LINKER_LANGUAGE Fortran
328-
CONDITION ${HAVE_SINGLE_PRECISION}
329-
)
324+
ecbuild_add_test(
325+
TARGET init_wrapper_mixed_precision.x
326+
SOURCES init_wrapper_mixed_precision.F90
327+
LIBS
328+
${LIBNAME}_sp
329+
$<${fiat_FOUND}:parkind_sp>
330+
$<${fiat_FOUND}:fiat>
331+
OpenMP::OpenMP_Fortran
332+
$<${HAVE_ACC}:OpenACC::OpenACC_Fortran>
333+
$<$<BOOL:${HAVE_IO}>:HDF5::HDF5>
334+
LINKER_LANGUAGE Fortran
335+
CONDITION ${HAVE_SINGLE_PRECISION}
336+
)
337+
endif()
330338

331339
## Test presence of GPUs
332340
add_executable(check_gpu_num.x check_gpu_num.F90)

tests/test_hdf5_rw_parallel_general.F90

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ PROGRAM TEST_HDF5_PARALLEL_OUTPUT
1919
USE FIELD_ABORT_MODULE, ONLY: FIELD_ABORT
2020
USE HDF5, ONLY: HSIZE_T, HID_T
2121
USE ISO_C_BINDING, ONLY : C_PTR, C_LOC
22-
USE MPL_MODULE, ONLY: MPL_INIT, MPL_END, MPL_RANK
22+
#if(HAVE_MPI)
23+
USE MPI, ONLY: MPI_INIT, MPI_FINALIZE
24+
#endif
25+
2326
IMPLICIT NONE
2427

2528
CLASS(FIELD_1RB), POINTER :: FIELD_DATA_1RB => NULL()
@@ -119,16 +122,18 @@ PROGRAM TEST_HDF5_PARALLEL_OUTPUT
119122
TYPE(C_PTR) :: DI_CPUPTR
120123
TYPE(C_PTR) :: DL_CPUPTR
121124
INTEGER :: I, J
125+
INTEGER :: mpierr
122126

123127
! HDF5 variables
124128
INTEGER(HID_T) :: file_id, space_id, kind_id
125129
INTEGER(HID_T) :: dset_id, dsetm_id, dsetd_id,dseti_id,dsetl_id
126130
INTEGER(HSIZE_T), DIMENSION(2) :: dims
127131
INTEGER :: hdferr
128132
INTEGER(JPIM) :: k,l,m
129-
INTEGER(JPIM) :: NPROCS
130133
CHARACTER(LEN=100) :: h5filename
131-
CALL MPL_INIT(KPROCS=NPROCS,LDINFO=.FALSE.,LDENV=.TRUE.)
134+
#if(HAVE_MPI)
135+
CALL MPI_INIT(mpierr)
136+
#endif
132137
WRITE(h5filename, '(A,I0)') "field_general"
133138
h5filename = TRIM(h5filename)
134139

@@ -484,7 +489,9 @@ PROGRAM TEST_HDF5_PARALLEL_OUTPUT
484489
CALL FIELD_ABORT("Wrong HDF5 write/read of 5D data")
485490
ENDIF
486491

487-
CALL MPL_END(LDMEMINFO=.FALSE.)
492+
#if(HAVE_MPI)
493+
CALL MPI_FINALIZE(mpierr)
494+
#endif
488495

489496
CALL FIELD_DELETE(FIELD_DATA_1RB)
490497
CALL FIELD_DELETE(FIELD_DATA_1RM)

0 commit comments

Comments
 (0)