11# SPDX-License-Identifier: AGPL-3.0-or-later
22cmake_minimum_required (VERSION 3.18.0 )
3+
34set (CMAKE_CXX_STANDARD 23)
45set (CMAKE_C_STANDARD 17)
6+
57include (FindPkgConfig REQUIRED )
68include (CheckCXXSymbolExists REQUIRED )
9+ include (CheckSourceCompiles REQUIRED )
710
811if (DEFINED ENV{PETSC_DIR})
912 message ("PETSC_DIR:\n $ENV{PETSC_DIR} \n " )
@@ -15,7 +18,7 @@ endif()
1518project (Prerequisites LANGUAGES )
1619set (ENV{PKG_CONFIG_PATH} "$ENV{PETSC_DIR} /$ENV{PETSC_ARCH} /lib/pkgconfig:$ENV{PKG_CONFIG_PATH} " )
1720set (PETSC_VERSION_MINOR_MIN "19" )
18- set (PETSC_VERSION_MINOR_MAX "24 " )
21+ set (PETSC_VERSION_MINOR_MAX "25 " )
1922
2023pkg_check_modules (PETSC_MIN REQUIRED PETSc>=3.${PETSC_VERSION_MINOR_MIN}.0 QUIET ) #CMake does not support version range
2124pkg_check_modules (PETSC REQUIRED PETSc<=3.${PETSC_VERSION_MINOR_MAX}.99 )
@@ -171,8 +174,8 @@ file(STRINGS "$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/lib/petsc/conf/petscvariables" PE
171174string (REPLACE "PETSC_FC_INCLUDES = " "" PETSC_INCLUDES "${PETSC_INCLUDES} " )
172175message ("PETSC_INCLUDES:\n ${PETSC_INCLUDES} \n " )
173176
174- set (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${BUILDCMD_PRE} ${OPENMP_FLAGS} ${STANDARD_CHECK} ${OPTIMIZATION_FLAGS} ${COMPILE_FLAGS} " )
175- set (CMAKE_Fortran_LINK_EXECUTABLE "${BUILDCMD_PRE} ${CMAKE_Fortran_COMPILER} ${OPENMP_FLAGS} ${OPTIMIZATION_FLAGS} ${LINKER_FLAGS} " )
177+ set (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${BUILDCMD_PRE} ${OPENMP_FLAGS} ${STANDARD_CHECK} ${OPTIMIZATION_FLAGS} " )
178+ set (CMAKE_Fortran_LINK_EXECUTABLE "${BUILDCMD_PRE} ${CMAKE_Fortran_COMPILER} ${OPENMP_FLAGS} ${OPTIMIZATION_FLAGS} " )
176179
177180set (CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE} "${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE} } ${PETSC_INCLUDES} " ) # zlib installed via PETSc
178181
@@ -206,6 +209,86 @@ message("C Compiler Flags:\n${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}\n")
206209message ("C++ Compiler Flags:\n ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE} }\n " )
207210message ("Fortran Linker Command:\n ${CMAKE_Fortran_LINK_EXECUTABLE} \n " )
208211
212+ # check MPI features
213+ block ()
214+ string (REPLACE " " ";" CMAKE_REQUIRED_INCLUDES "${PETSC_INCLUDES} " )
215+ string (REPLACE "-I" "" CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES} " )
216+ message ("${CMAKE_REQUIRED_INCLUDES} " )
217+
218+ set (CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY" )
219+
220+ check_source_compiles (Fortran
221+ "#include <petsc/finclude/petscsys.h>
222+ module m
223+ use PETScSys
224+ implicit none
225+ contains
226+ subroutine s()
227+ integer :: i
228+ i = PETSC_COMM_WORLD%MPI_val
229+ end subroutine s
230+ end module m"
231+ PETSC_USES_MPIF08 )
232+
233+ check_source_compiles (Fortran
234+ "#include <petsc/finclude/petscsys.h>
235+ module m
236+ use PETScSys
237+ implicit none
238+ contains
239+ subroutine s()
240+ integer :: i
241+ i = MPI_COMM_WORLD%MPI_val
242+ end subroutine s
243+ end module m"
244+ PETSC_EXPOSES_MPIF08 )
245+
246+ check_source_compiles (Fortran
247+ "#include <petsc/finclude/petscsys.h>
248+ module m
249+ use PETScSys
250+ implicit none
251+ contains
252+ subroutine s()
253+ integer :: i
254+ i = MPI_COMM_WORLD
255+ end subroutine s
256+ end module m"
257+ PETSC_EXPOSES_MPIF90 )
258+
259+ check_source_compiles (Fortran
260+ "module m
261+ use HDF5
262+ use MPI_f08
263+ implicit none
264+ contains
265+ subroutine s()
266+ integer :: hdferr
267+ integer(HID_T) :: plist_access_id
268+ call H5Pset_fapl_mpio_f(plist_access_id, MPI_COMM_WORLD, MPI_INFO_NULL, hdferr)
269+ end subroutine s
270+ end module m"
271+ HDF5_SUPPORTS_MPIF08 )
272+ endblock ()
273+
274+ if (PETSC_USES_MPIF08)
275+ add_compile_definitions ($<$<COMPILE_LANGUAGE :Fortran >:PETSC_USES_MPIF08 >)
276+ endif ()
277+
278+ if (PETSC_EXPOSES_MPIF08)
279+ add_compile_definitions ($<$<COMPILE_LANGUAGE :Fortran >:PETSC_EXPOSES_MPI >)
280+ add_compile_definitions ($<$<COMPILE_LANGUAGE :Fortran >:PETSC_EXPOSES_MPIF08 >)
281+ endif ()
282+
283+ if (PETSC_EXPOSES_MPIF90)
284+ add_compile_definitions ($<$<COMPILE_LANGUAGE :Fortran >:PETSC_EXPOSES_MPI >)
285+ add_compile_definitions ($<$<COMPILE_LANGUAGE :Fortran >:PETSC_EXPOSES_MPIF90 >)
286+ endif ()
287+
288+ if (HDF5_SUPPORTS_MPIF08)
289+ add_compile_definitions ($<$<COMPILE_LANGUAGE :Fortran >:HDF5_SUPPORTS_MPIF08 >)
290+ endif ()
291+
209292# location of code
210293add_subdirectory (src )
211294
0 commit comments