Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/cmake/Modules/testMPIcapabilities.cmake
3206 views

# Some implementations of MPI don't support all features with all compilers
# on all platforms (e.g., 'MPI_IN_PLACE' with MSMPI and GFortran on Windows).
# Check for those features using some tests.

if(CMAKE_CROSSCOMPILING)
  # assume it is working
  message(STATUS "Checking whether MPI_IN_PLACE is supported with ${MPI_Fortran_COMPILER} -- assuming yes")
  set(CHECK_MPI_IN_PLACE_RUN_ERROR OFF)
  set(CHECK_MPI_IN_PLACE_COMPILE ON)
else()

  message(STATUS "Checking whether MPI_IN_PLACE is supported with ${MPI_Fortran_COMPILER}")

  file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testMPI_IN_PLACE.f90
    "
    PROGRAM TEST_MPI_IN_PLACE
      IMPLICIT NONE
      INTEGER :: ierr
      REAL(8) :: test1(3), test2(3)

      INCLUDE \"mpif.h\"

      test1(:) = 1
      test2 = test1
      PRINT *, \"test1 =\", test1

      CALL MPI_Init(ierr)
      CALL MPI_Allreduce(MPI_IN_PLACE, test1, 3, MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr)
      CALL MPI_Finalize(ierr)
      PRINT *, \"test1 =\", test1

      IF (.NOT.ALL(test1 == test2)) THEN
        STOP 1
      END IF

    END PROGRAM TEST_MPI_IN_PLACE
    ")
  try_run(CHECK_MPI_IN_PLACE_RUN_ERROR CHECK_MPI_IN_PLACE_COMPILE ${CMAKE_BINARY_DIR}
    SOURCES ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testMPI_IN_PLACE.f90
    LINK_LIBRARIES MPI::MPI_Fortran)
endif()

if(CHECK_MPI_IN_PLACE_RUN_ERROR OR NOT CHECK_MPI_IN_PLACE_COMPILE)
  message(STATUS "Checking whether MPI_IN_PLACE is supported with ${MPI_Fortran_COMPILER} -- no")
  set(ELMER_BROKEN_MPI_IN_PLACE ON CACHE INTERNAL "")
else()
  message(STATUS "Checking whether MPI_IN_PLACE is supported with ${MPI_Fortran_COMPILER} -- yes")
  set(ELMER_BROKEN_MPI_IN_PLACE OFF CACHE INTERNAL "")
endif()