diff --git a/CMakeLists.txt b/CMakeLists.txt index ecba3000c7fafc93b3927d9d19135ce5268bb6b9..5a771b490d74dbcb44b33cc751d48686e2bd3384 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -328,9 +328,10 @@ if (MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/ # SYMBOL_NAMESPACE "PM_" # SYMBOLS init testPPM:init) message(STATUS "CMAKE_CXX_COMPILER_ID STREQUAL ${CMAKE_CXX_COMPILER_ID}") - - option( SCALFMM_USE_MKL_AS_BLAS "Set to ON to use MKL CBLAS" OFF ) - + + option( SCALFMM_USE_MKL_AS_BLAS "Set to ON to use MKL BLAS/LAPACK" OFF ) + option( SCALFMM_USE_ESSL_AS_BLAS "Set to ON to use ESSL BLAS/LAPACK" OFF ) + if( SCALFMM_USE_MKL_AS_BLAS ) set(BLA_VENDOR "Intel10_64lp_seq") find_package(BLASEXT QUIET) # not REQUIRED @@ -338,6 +339,16 @@ if (MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/ if (BLAS_LIBRARIES) set(BLASLAPACK_LIBRARIES ${BLAS_LIBRARIES}) endif() + elseif(SCALFMM_USE_ESSL_AS_BLAS) + set(BLA_VENDOR "IBMESSL") + find_package(BLASEXT QUIET) # not REQUIRED + find_package(LAPACKEXT QUIET) # not REQUIRED + if (LAPACK_LIBRARIES) + set(BLASLAPACK_LIBRARIES "${LAPACK_LIBRARIES}") + endif() + if (BLAS_LIBRARIES) + list(APPEND BLASLAPACK_LIBRARIES ${BLAS_LIBRARIES}) + endif() elseif(SCALFMM_USE_EXTERNAL_BLAS) message(STATUS "BLAS SET BY EXTERNAL PROGRAM = ${BLAS_LIBRARIES}") list(APPEND BLASLAPACK_LIBRARIES "${BLAS_LIBRARIES}") @@ -352,7 +363,7 @@ if (MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/ list(APPEND BLASLAPACK_LIBRARIES "${BLAS_LIBRARIES}") endif() endif() - + if(BLAS_FOUND) set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${BLASLAPACK_LIBRARIES}") if(BLAS_LIBRARY_DIRS) @@ -363,6 +374,7 @@ if (MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/ # the RPATH to be used when installing list(APPEND CMAKE_INSTALL_RPATH "${LAPACK_LIBRARY_DIRS}") endif() + message (STATUS "check BLAS Fortran mangling") # check blas and lapack symbols naming set(CMAKE_REQUIRED_LIBRARIES "${BLAS_LIBRARIES}") check_function_exists(dgemv_ DGEMV_ADD_) @@ -374,19 +386,19 @@ if (MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/ message (STATUS "BLAS dgemv_ symbol found, SCALFMM_BLAS_ADD_ is ON") else (DGEMV_ADD_) set (SCALFMM_BLAS_ADD_ OFF) - check_function_exists(DGEMV DGEMV_UPCASE) - if (DGEMV_UPCASE) - set (SCALFMM_BLAS_UPCASE ON) - message (STATUS "BLAS DGEMV symbol found, SCALFMM_BLAS_UPCASE is ON") - else (DGEMV_UPCASE) - # set (SCALFMM_BLAS_UPCASE OFF) + check_function_exists(DGEMV DGEMV_UPCASE) + if (DGEMV_UPCASE) + set (SCALFMM_BLAS_UPCASE ON) + message (STATUS "BLAS DGEMV symbol found, SCALFMM_BLAS_UPCASE is ON") + else (DGEMV_UPCASE) + # set (SCALFMM_BLAS_UPCASE OFF) check_function_exists(dgemv DGEMV_NOCHANGE) if (DGEMV_NOCHANGE) set (SCALFMM_BLAS_NOCHANGE ON) message (STATUS "BLAS dgemv symbol found, SCALFMM_BLAS_NOCHANGE is ON") - # else (DGEMV_NOCHANGE) - # set (SCALFMM_BLAS_NOCHANGE OFF) - endif (DGEMV_NOCHANGE) + # else (DGEMV_NOCHANGE) + # set (SCALFMM_BLAS_NOCHANGE OFF) + endif (DGEMV_NOCHANGE) endif (DGEMV_UPCASE) endif (DGEMV_ADD_) if ( (NOT DGEMV_ADD_) AND (NOT DGEMV_UPCASE) AND (NOT DGEMV_NOCHANGE) ) @@ -403,88 +415,59 @@ if (MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/ # # FFT option # - CMAKE_DEPENDENT_OPTION(SCALFMM_USE_MKL_AS_FFTW "Set to ON to use MKL FFTW" ON "SCALFMM_USE_FFT;SCALFMM_USE_MKL_AS_BLAS" OFF ) + CMAKE_DEPENDENT_OPTION(SCALFMM_USE_MKL_AS_FFTW "Set to ON to use MKL FFTW" ON "SCALFMM_USE_FFT;SCALFMM_USE_MKL_AS_BLAS" OFF ) + CMAKE_DEPENDENT_OPTION(SCALFMM_USE_ESSL_AS_FFTW "Set to ON to use ESSL FFTW" ON "SCALFMM_USE_FFT;SCALFMM_USE_ESSL_AS_BLAS" OFF ) if( SCALFMM_USE_FFT ) message(STATUS "SCALFMM USE FFT Configure:") + # The package find_package(FFTW) can be used with the following COMPONENTS: + # MKL, ESSL, THREADS|OMP and/or SIMPLE|LONG|QUAD + # Default will find the real double precision fftw library version without THREADS|OMP if( SCALFMM_USE_MKL_AS_FFTW ) + message(STATUS " SCALFMM USE FFT from MKL") + find_package(FFTW COMPONENTS MKL) + elseif (SCALFMM_USE_ESSL_AS_FFTW) + message(STATUS " SCALFMM USE FFT from ESSL ") + find_package(FFTW COMPONENTS ESSL) + add_definitions(-DSCALFMM_USE_ESSL_AS_FFTW) + else() + message(STATUS " SCALFMM USE FFTW") + find_package(FFTW COMPONENTS SIMPLE) + endif() - message(STATUS " SCALFMM USE MKL ") - - if( SCALFMM_USE_MKL_AS_BLAS ) - - unset(FFT_LIBRARIES CACHE) - message(STATUS " SCALFMM USE MKL already defined") - set(FFT_INCLUDES "$ENV{MKLROOT}/include/fftw" CACHE STRING "Set your MKL flags") - if (BLAS_FOUND) - set(FFTW_FOUND ON) - endif() - - else(SCALFMM_USE_MKL_AS_BLAS) - - # The package can be used with the following COMPONENTS: - # MKL, THREADS|OMP and/or SIMPLE|DOUBLE|LONG|QUAD - # Default is DOUBLE and without THREADS|OMP - find_package(FFTW COMPONENTS MKL) # not REQUIRED - if (FFTW_LIBRARY_DIRS_DEP) - set(FFT_LIBRARIES "-L${FFTW_LIBRARY_DIRS_DEP};" CACHE STRING "Set your MKL flags") - endif() - if (FFTW_LIBRARIES_DEP) - foreach (fft_lib ${FFTW_LIBRARIES_DEP}) - set(FFT_LIBRARIES "${FFT_LIBRARIES};${fft_lib};") - endforeach() - endif() - set(FFT_INCLUDES "${FFTW_INCLUDE_DIRS_DEP}" ) - if (FFT_LIBRARIES) - set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${FFT_LIBRARIES}") - endif() - - endif(SCALFMM_USE_MKL_AS_BLAS) - - else(SCALFMM_USE_MKL_AS_FFTW) - - message(STATUS " SCALFMM USE FFTW ") - # The package can be used with the following COMPONENTS: - # MKL, THREADS|OMP and/or SIMPLE|DOUBLE|LONG|QUAD - # Default is DOUBLE and without THREADS|OMP - find_package(FFTW COMPONENTS SIMPLE) # not REQUIRED - if (FFTW_LIBRARY_DIRS_DEP) - set(FFT_LIBRARIES "-L${FFTW_LIBRARY_DIRS_DEP};" CACHE STRING "Set your FFTW path") - endif() - if (FFTW_LIBRARIES_DEP) - foreach (fft_lib ${FFTW_LIBRARIES_DEP}) - set(FFT_LIBRARIES "${FFT_LIBRARIES};${fft_lib};") - endforeach() - endif() - set(FFT_INCLUDES "${FFTW_INCLUDE_DIRS_DEP}" ) - if (FFT_LIBRARIES) - set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${FFT_LIBRARIES}") - endif() - if(FFTW_LIBRARY_DIRS) - # the RPATH to be used when installing - list(APPEND CMAKE_INSTALL_RPATH "${FFTW_LIBRARY_DIRS}") - endif() + if (FFTW_LIBRARY_DIRS_DEP) + set(FFT_LIBRARIES "-L${FFTW_LIBRARY_DIRS_DEP};" CACHE STRING "Set your MKL flags") + endif() + if (FFTW_LIBRARIES_DEP) + foreach (fft_lib ${FFTW_LIBRARIES_DEP}) + set(FFT_LIBRARIES "${FFT_LIBRARIES};${fft_lib};") + endforeach() + endif() - endif(SCALFMM_USE_MKL_AS_FFTW) + set(FFT_INCLUDES "${FFTW_INCLUDE_DIRS_DEP}" ) + if (FFT_LIBRARIES) + set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${FFT_LIBRARIES}") + endif() + if(FFTW_LIBRARY_DIRS) + # the RPATH to be used when installing + list(APPEND CMAKE_INSTALL_RPATH "${FFTW_LIBRARY_DIRS}") + endif() if (FFT_INCLUDES) set(SCALFMM_INCLUDES "${SCALFMM_INCLUDES}; ${FFT_INCLUDES}") endif() - if(FFTW_FOUND) - message(STATUS " SCALFMM_LIBRARIES = ${SCALFMM_LIBRARIES}") - message(STATUS " SCALFMM_INCLUDES = ${SCALFMM_INCLUDES}") - else() + if(NOT FFTW_FOUND) message(WARNING "FFTW has not been found, SCALFMM will continue to compile but some applications will be disabled.") message(WARNING "If you have FFTW set FFTW_LIBDIR, FFTW_INCDIR or FFTW_DIR (CMake variables using -D or environment variables).") set(SCALFMM_USE_FFT OFF) endif() + endif(SCALFMM_USE_FFT) list(APPEND FUSE_LIST "FFT") - message(STATUS " SCALFMM_LIBRARIES = ${SCALFMM_LIBRARIES}") - message(STATUS " SCALFMM_INCLUDES = ${SCALFMM_INCLUDES}") - message(STATUS "SCALFMM_USE_FFT = ${SCALFMM_USE_FFT}") + list(REMOVE_DUPLICATES SCALFMM_INCLUDES) + list(REMOVE_DUPLICATES SCALFMM_LIBRARIES) # # C++ 2011 @@ -788,7 +771,7 @@ if (MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/ set(SCALFMM_COMPILE_LIBS "") foreach(lib_var ${SCALFMM_LIBRARIES}) string(STRIP ${lib_var} lib_var) - LIST(APPEND SCALFMM_COMPILE_LIBS ${lib_var}) + LIST(APPEND SCALFMM_COMPILE_LIBS ${lib_var}) endforeach() configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Src/ScalFmmConfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/Src/ScalFmmConfig.h ) diff --git a/Src/ScalFmmConfig.h.cmake b/Src/ScalFmmConfig.h.cmake index 0c4c2960f17f539e9ae77a78ae489ed6e066c355..00b2066e4443163df8f302dad781d0a978606dbf 100644 --- a/Src/ScalFmmConfig.h.cmake +++ b/Src/ScalFmmConfig.h.cmake @@ -38,6 +38,7 @@ #cmakedefine SCALFMM_USE_FFT #cmakedefine SCALFMM_USE_MKL_AS_FFTW +#cmakedefine SCALFMM_USE_ESSL_AS_FFTW ////////////////////////////////////////////////////// // MPI diff --git a/Src/Utils/FDft.hpp b/Src/Utils/FDft.hpp index a18301b45473889ce2acea77ca6b175043fc889a..e6659db03510a455f259485ee676c8711321a82d 100644 --- a/Src/Utils/FDft.hpp +++ b/Src/Utils/FDft.hpp @@ -26,10 +26,11 @@ #include <iostream> #include <stdlib.h> -// include fftw3 (specify path in cmake) -// if MKL: path/to/mkl/include/fftw/fftw3.h -// elseif libfftw_dev: usr/include/fftw3.h +#ifdef SCALFMM_USE_ESSL_AS_FFTW +#include <fftw3_essl.h> +#else #include <fftw3.h> +#endif // for @class FDft only #include "FBlas.hpp" diff --git a/Tests/Utils/testFFT.cpp b/Tests/Utils/testFFT.cpp index 9706a9fe665165c9fed61a76ea2ec49f83c8a477..1795f9fbc640378d566aeb83d6bd22d38b902d26 100644 --- a/Tests/Utils/testFFT.cpp +++ b/Tests/Utils/testFFT.cpp @@ -21,7 +21,11 @@ #include <iostream> #include <stdlib.h> +#ifdef SCALFMM_USE_ESSL_AS_FFTW +#include <fftw3_essl.h> +#else #include <fftw3.h> +#endif #include "Utils/FGlobal.hpp" #include "Utils/FComplex.hpp"