Skip to content

Commit

Permalink
FindSCALAPACK: correct arith check
Browse files Browse the repository at this point in the history
  • Loading branch information
scivision committed Jul 8, 2022
1 parent af8325b commit e4d8006
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 65 deletions.
40 changes: 21 additions & 19 deletions cmake/Modules/FindLAPACK.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -304,12 +304,6 @@ if(MKL IN_LIST LAPACK_FIND_COMPONENTS)
# double-quotes are necessary per CMake to_cmake_path docs.
file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT)

if(BUILD_SHARED_LIBS)
set(_mkltype dynamic)
else()
set(_mkltype static)
endif()

if(MKL64 IN_LIST LAPACK_FIND_COMPONENTS)
set(_mkl_bitflag i)
else()
Expand Down Expand Up @@ -397,21 +391,29 @@ set(CMAKE_REQUIRED_LINK_OPTIONS)
set(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_LIBRARIES ${LAPACK_LIBRARY})

foreach(i s d)
check_source_compiles(Fortran
"program check_lapack
implicit none (type, external)
external :: ${i}isnan
end program" LAPACK_${i}_links)

if(LAPACK_${i}_links)
set(LAPACK_${i}_FOUND true PARENT_SCOPE)
set(LAPACK_links true)
endif()
check_source_compiles(Fortran
"program check_lapack
use, intrinsic :: iso_fortran_env, only : real32
implicit none (type, external)
real(real32), external :: snrm2
print *, snrm2(1, [0._real32], 1)
end program"
LAPACK_s_FOUND
)

endforeach()
check_source_compiles(Fortran
"program check_lapack
use, intrinsic :: iso_fortran_env, only : real64
implicit none (type, external)
real(real64), external :: dnrm2
print *, dnrm2(1, [0._real64], 1)
end program"
LAPACK_d_FOUND
)

set(LAPACK_links ${LAPACK_links} PARENT_SCOPE)
if(LAPACK_s_FOUND OR LAPACK_d_FOUND)
set(LAPACK_links true PARENT_SCOPE)
endif()

endfunction(lapack_check)

Expand Down
92 changes: 46 additions & 46 deletions cmake/Modules/FindSCALAPACK.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -66,56 +66,59 @@ endif()

set(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_LINK_OPTIONS)
set(CMAKE_REQUIRED_INCLUDES ${SCALAPACK_INCLUDE_DIR} ${LAPACK_INCLUDE_DIRS} ${MPI_Fortran_INCLUDE_DIRS} ${MPI_C_INCLUDE_DIRS})
set(CMAKE_REQUIRED_LIBRARIES ${SCALAPACK_LIBRARY} ${LAPACK_LIBRARIES} ${MPI_Fortran_LIBRARIES} ${MPI_C_LIBRARIES})
# MPI needed for ifort

foreach(i s d)
set(CMAKE_REQUIRED_INCLUDES ${SCALAPACK_INCLUDE_DIR})
set(CMAKE_REQUIRED_LIBRARIES ${SCALAPACK_LIBRARY})
if(BLACS_LIBRARY)
list(APPEND CMAKE_REQUIRED_LIBRARIES ${BLACS_LIBRARY})
endif()
list(APPEND CMAKE_REQUIRED_LIBRARIES LAPACK::LAPACK MPI::MPI_Fortran)

check_source_compiles(Fortran
"program test
implicit none (type, external)
external :: p${i}lamch
external :: blacs_pinfo, blacs_get, blacs_gridinit, blacs_gridexit, blacs_exit
end program"
SCALAPACK_${i}_links
)
# MPI needed for ifort

if(SCALAPACK_${i}_links)
set(SCALAPACK_${i}_FOUND true PARENT_SCOPE)
set(SCALAPACK_links true)
endif()
check_source_compiles(Fortran
"program test
use, intrinsic :: iso_fortran_env, only : real64
implicit none (type, external)
real(real64), external :: pdlamch
integer :: ictxt
print *, pdlamch(ictxt, 'E')
end program"
SCALAPACK_d_FOUND
)

endforeach()
check_source_compiles(Fortran
"program test
use, intrinsic :: iso_fortran_env, only : real32
implicit none (type, external)
real(real32), external :: pslamch
integer :: ictxt
print *, pslamch(ictxt, 'E')
end program"
SCALAPACK_s_FOUND
)

set(SCALAPACK_links ${SCALAPACK_links} PARENT_SCOPE)
if(SCALAPACK_s_FOUND OR SCALAPACK_d_FOUND)
set(SCALAPACK_links true PARENT_SCOPE)
endif()

endfunction(scalapack_check)


function(scalapack_mkl)

if(BUILD_SHARED_LIBS)
set(_mkltype dynamic)
else()
set(_mkltype static)
endif()

set(_mkl_libs ${ARGV})
function(scalapack_mkl scalapack_name blacs_name)

foreach(s ${_mkl_libs})
find_library(SCALAPACK_${s}_LIBRARY
NAMES ${s}
HINTS ${MKLROOT}
PATH_SUFFIXES lib lib/intel64
NO_DEFAULT_PATH
)
if(NOT SCALAPACK_${s}_LIBRARY)
return()
endif()
find_library(SCALAPACK_LIBRARY
NAMES ${scalapack_name}
HINTS ${MKLROOT}
PATH_SUFFIXES lib lib/intel64
NO_DEFAULT_PATH
)

list(APPEND SCALAPACK_LIBRARY ${SCALAPACK_${s}_LIBRARY})
endforeach()
find_library(BLACS_LIBRARY
NAMES ${blacs_name}
HINTS ${MKLROOT}
PATH_SUFFIXES lib lib/intel64
NO_DEFAULT_PATH
)

find_path(SCALAPACK_INCLUDE_DIR
NAMES mkl_scalapack.h
Expand All @@ -124,14 +127,11 @@ PATH_SUFFIXES include
NO_DEFAULT_PATH
)

if(NOT SCALAPACK_INCLUDE_DIR)
return()
endif()

# pc_mkl_INCLUDE_DIRS on Windows injects breaking garbage

set(SCALAPACK_MKL_FOUND true PARENT_SCOPE)
set(SCALAPACK_LIBRARY ${SCALAPACK_LIBRARY} PARENT_SCOPE)
if(SCALAPACK_LIBRARY AND BLACS_LIBRARY AND SCALAPACK_INCLUDE_DIR)
set(SCALAPACK_MKL_FOUND true PARENT_SCOPE)
endif()

endfunction(scalapack_mkl)

Expand Down

0 comments on commit e4d8006

Please sign in to comment.