diff --git a/.github/workflows/ase_plugin_test.yml b/.github/workflows/ase_plugin_test.yml index be902b7f59..2784e4fa36 100644 --- a/.github/workflows/ase_plugin_test.yml +++ b/.github/workflows/ase_plugin_test.yml @@ -39,7 +39,7 @@ jobs: - name: Install external tools from toolchain run: | - sudo apt update && sudo apt install -y xz-utils ninja-build + sudo apt update && sudo apt install -y xz-utils ninja-build pkg-config cd toolchain ./install_abacus_toolchain_new.sh --with-dftd4=install --dry-run -j8 ./scripts/stage4/install_stage4.sh diff --git a/.github/workflows/build_test_cmake.yml b/.github/workflows/build_test_cmake.yml index 56e324993d..262c36ef79 100644 --- a/.github/workflows/build_test_cmake.yml +++ b/.github/workflows/build_test_cmake.yml @@ -61,7 +61,7 @@ jobs: - name: Install external tools from toolchain run: | - sudo apt update && sudo apt install -y gfortran ninja-build xz-utils + sudo apt update && sudo apt install -y gfortran ninja-build pkg-config xz-utils cd toolchain ./install_abacus_toolchain_new.sh --with-dftd4=install --dry-run ${{matrix.external_toolchain_args}} ./scripts/stage4/install_stage4.sh diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 006c0e9d9c..a437a8b19e 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -31,6 +31,7 @@ jobs: python3-pip \ xz-utils \ ninja-build \ + pkg-config \ lcov \ perl-modules \ libcapture-tiny-perl \ diff --git a/.github/workflows/cuda.yml b/.github/workflows/cuda.yml index f5c113c892..6f3733b038 100644 --- a/.github/workflows/cuda.yml +++ b/.github/workflows/cuda.yml @@ -29,10 +29,10 @@ jobs: with: submodules: recursive - - name: Install Ccache + - name: Install CI tools run: | sudo apt-get update - sudo apt-get install -y ccache xz-utils ninja-build + sudo apt-get install -y ccache xz-utils ninja-build pkg-config - name: Install external tools from toolchain run: | diff --git a/.github/workflows/dynamic.yml b/.github/workflows/dynamic.yml index f00a0e9e6e..a9235d1cfd 100644 --- a/.github/workflows/dynamic.yml +++ b/.github/workflows/dynamic.yml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v7 - name: Install external tools from toolchain run: | - sudo apt update && sudo apt install -y xz-utils ninja-build + sudo apt update && sudo apt install -y xz-utils ninja-build pkg-config cd toolchain ./install_abacus_toolchain_new.sh --with-dftd4=install --dry-run -j8 ./scripts/stage4/install_stage4.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ee633a76ca..18b0b1a7a8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,6 +40,7 @@ jobs: gfortran \ ccache \ ca-certificates \ + pkg-config \ python-is-python3 \ python3-pip \ ninja-build \ diff --git a/cmake/CollectBuildInfoVars.cmake b/cmake/CollectBuildInfoVars.cmake index 61246e3a61..9d036b7ad0 100644 --- a/cmake/CollectBuildInfoVars.cmake +++ b/cmake/CollectBuildInfoVars.cmake @@ -146,21 +146,7 @@ endif() # Core Math Libraries if(ENABLE_LCAO AND ENABLE_ELPA) - set(ABACUS_ELPA_VERSION "yes (version unknown)") - if(ELPA_VERSION) set(ABACUS_ELPA_VERSION "yes (v${ELPA_VERSION})") - else() - find_program(ELPA_VERSION_EXE elpa2_print_version PATHS ${ELPA_DIR}/bin NO_DEFAULT_PATH) - if(ELPA_VERSION_EXE) - execute_process(COMMAND ${ELPA_VERSION_EXE} OUTPUT_VARIABLE ELPA_VER_RAW OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - if(ELPA_VER_RAW) - set(ABACUS_ELPA_VERSION "yes (${ELPA_VER_RAW})") -endif() - endif() - endif() - if(ABACUS_ELPA_VERSION STREQUAL "yes (version unknown)" AND ELPA_DIR) - set(ABACUS_ELPA_VERSION "yes (path: ${ELPA_DIR})") - endif() else() set(ABACUS_ELPA_VERSION "no") endif() diff --git a/cmake/modules/FindELPA.cmake b/cmake/modules/FindELPA.cmake index 672543877d..ce548b34c7 100644 --- a/cmake/modules/FindELPA.cmake +++ b/cmake/modules/FindELPA.cmake @@ -1,15 +1,16 @@ ############################################################################### # - Find ELPA -# Find the native ELPA headers and libraries. -# -# ELPA_FOUND - True if libelpa is found. -# ELPA_LIBRARIES - List of libraries when using libyaml -# ELPA_INCLUDE_DIR - Where to find ELPA headers. +# Find the native ELPA headers and libraries through pkg-config. # -find_package(PkgConfig) +# ======================================================================== +# Deprecated (TODO: Remove this part) +# ======================================================================== # Compatible layer towards old manual routines +if(DEFINED ELPA_DIR) + message(WARNING "ELPA_DIR is deprecated and will be removed in the future release.") +endif() if(DEFINED ELPA_INCLUDE_DIR) set(ELPA_INCLUDE_DIRS ${ELPA_INCLUDE_DIR}) endif() @@ -31,34 +32,35 @@ if(ELPA_INCLUDE_DIRS MATCHES "^/usr/include/elpa/.*") endif() endif() if(ENABLE_OPENMP) - find_library(ELPA_LINK_LIBRARIES + find_library(ELPA_LINK_LIBRARIES NAMES elpa_openmp elpa HINTS ${ELPA_DIR} PATH_SUFFIXES "lib" - ) + ) else() - find_library(ELPA_LINK_LIBRARIES + find_library(ELPA_LINK_LIBRARIES NAMES elpa HINTS ${ELPA_DIR} PATH_SUFFIXES "lib" - ) + ) endif() -# Incompatible with ELPA earlier than 2021.11.001 -# Before ELPA 2021.11.001, its pkg-config file -# is named like "elpa-2021.05.002.pc". -if(NOT ELPA_INCLUDE_DIRS AND PKG_CONFIG_FOUND) - if(DEFINED ELPA_DIR) - string(APPEND CMAKE_PREFIX_PATH ";${ELPA_DIR}") +# ======================================================================== + +if(NOT ELPA_INCLUDE_DIRS) + find_package(PkgConfig) + if(NOT PKG_CONFIG_FOUND) + message(FATAL_ERROR "Pkg-config is needed to get all information about the ELPA library") endif() + # Find preferred library corresponding with ABACUS configuration first if(ENABLE_OPENMP) - pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa_openmp) + pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa_openmp elpa) else() pkg_search_module(ELPA REQUIRED IMPORTED_TARGET GLOBAL elpa) endif() -elseif(NOT PKG_CONFIG_FOUND) - message(STATUS - "ELPA : We need pkg-config to get all information about the elpa library") + if(${ELPA_VERSION} VERSION_LESS "2021.05.001") + message(FATAL_ERROR "ELPA version >= 2021.05.001 is required.") + endif() endif() # Handle the QUIET and REQUIRED arguments and @@ -68,20 +70,21 @@ find_package_handle_standard_args(ELPA DEFAULT_MSG ELPA_LINK_LIBRARIES ELPA_INCL # Copy the results to the output variables and target. if(ELPA_FOUND) - list(GET ELPA_LINK_LIBRARIES 0 ELPA_LIBRARY) - set(ELPA_INCLUDE_DIR ${ELPA_INCLUDE_DIRS}) - - if(NOT TARGET ELPA::ELPA) - add_library(ELPA::ELPA UNKNOWN IMPORTED) - set_target_properties(ELPA::ELPA PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${ELPA_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${ELPA_INCLUDE_DIR}") - endif() + list(GET ELPA_LINK_LIBRARIES 0 ELPA_LIBRARY) + set(ELPA_INCLUDE_DIR ${ELPA_INCLUDE_DIRS}) + if(NOT TARGET ELPA::ELPA) + add_library(ELPA::ELPA UNKNOWN IMPORTED) + set_target_properties(ELPA::ELPA PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "C" + IMPORTED_LOCATION "${ELPA_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${ELPA_INCLUDE_DIR}") + endif() endif() set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${ELPA_INCLUDE_DIR}) +# Compability workaround for ELPA_DIR +# TODO: Remove this check include(CheckCXXSourceCompiles) check_cxx_source_compiles(" #include @@ -93,7 +96,7 @@ int main(){} ELPA_VERSION_SATISFIES ) if(NOT ELPA_VERSION_SATISFIES) - message(FATAL_ERROR "ELPA version is too old. We support version 2021 or higher.") + message(FATAL_ERROR "ELPA version is too old. We support version 2021 or higher.") endif() mark_as_advanced(ELPA_INCLUDE_DIR ELPA_LIBRARY) diff --git a/docs/quick_start/easy_install.md b/docs/quick_start/easy_install.md index 9f2aa166ee..b8e62ec22e 100644 --- a/docs/quick_start/easy_install.md +++ b/docs/quick_start/easy_install.md @@ -158,9 +158,6 @@ Here, 'build' is the path for building ABACUS; and '-D' is used for setting up s - `MKLROOT`: If environment variable `MKLROOT` exists, `cmake` will take MKL as a preference, i.e. not using `LAPACK`, `ScaLAPACK` and `FFTW`. To disable MKL, unset environment variable `MKLROOT`, or pass `-DMKLROOT=OFF` to `cmake`. - `LAPACK_DIR`: Path to OpenBLAS library `libopenblas.so`(including BLAS and LAPACK) - `SCALAPACK_DIR`: Path to ScaLAPACK library `libscalapack.so` - - `ELPA_DIR`: Path to ELPA install directory; should be the folder containing 'include' and 'lib'. - > Note: In ABACUS v3.5.1 or earlier, if you install ELPA from source , please add a symlink to avoid the additional include file folder with version name: `ln -s elpa/include/elpa-2021.05.002/elpa elpa/include/elpa` to help the build system find ELPA headers. - - `FFTW3_DIR`: Path to FFTW3. - `LIBRI_DIR`: (Optional) Path to LibRI. - `LIBCOMM_DIR`: (Optional) Path to LibComm when `ENABLE_LIBRI=ON`. @@ -184,7 +181,12 @@ For some dependencies built with CMake, such as Libxc, dftd4, cereal, and RapidJ Here is an example: ```bash -CXX=mpiicpx cmake -B build -DCMAKE_INSTALL_PREFIX=~/abacus -DELPA_DIR=~/elpa-2025.01.001/build +CXX=mpiicpx cmake -B build \ + -DCMAKE_INSTALL_PREFIX=~/abacus \ + -DENABLE_MPI=ON \ + -DENABLE_LCAO=ON \ + -DENABLE_ELPA=ON \ + -DENABLE_LIBXC=ON ``` ### Build and Install diff --git a/toolchain/build_abacus_aocc-aocl.sh b/toolchain/build_abacus_aocc-aocl.sh index bec57f4742..c78b86b137 100755 --- a/toolchain/build_abacus_aocc-aocl.sh +++ b/toolchain/build_abacus_aocc-aocl.sh @@ -22,7 +22,6 @@ BUILD_DIR=build_abacus_aocc_aocl rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR -ELPA=${ELPA_ROOT} CEREAL=${CEREAL_ROOT}/include LAPACK=$AOCLhome/lib SCALAPACK=$AOCLhome/lib @@ -67,7 +66,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DLAPACK_DIR=$LAPACK \ -DSCALAPACK_DIR=$SCALAPACK \ -DFFTW3_DIR=$FFTW3 \ - -DELPA_DIR=$ELPA \ -DCEREAL_INCLUDE_DIR=$CEREAL \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ diff --git a/toolchain/build_abacus_gcc-aocl.sh b/toolchain/build_abacus_gcc-aocl.sh index ed707ca354..f2f96b1509 100755 --- a/toolchain/build_abacus_gcc-aocl.sh +++ b/toolchain/build_abacus_gcc-aocl.sh @@ -22,7 +22,6 @@ BUILD_DIR=build_abacus_gcc_aocl rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR -ELPA=${ELPA_ROOT} LAPACK=$AOCLhome/lib SCALAPACK=$AOCLhome/lib FFTW3=$AOCLhome @@ -64,7 +63,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DLAPACK_DIR=$LAPACK \ -DSCALAPACK_DIR=$SCALAPACK \ -DFFTW3_DIR=$FFTW3 \ - -DELPA_DIR=$ELPA \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ -DENABLE_OPENMP=ON \ diff --git a/toolchain/build_abacus_gcc-mkl.sh b/toolchain/build_abacus_gcc-mkl.sh index 9246c62906..db1a30e463 100755 --- a/toolchain/build_abacus_gcc-mkl.sh +++ b/toolchain/build_abacus_gcc-mkl.sh @@ -22,7 +22,6 @@ BUILD_DIR=build_abacus_gcc_mkl rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR -ELPA=${ELPA_ROOT} LIBRI=${LIBRI_ROOT} LIBCOMM=${LIBCOMM_ROOT} USE_CUDA=OFF # set ON to enable gpu-abacus @@ -60,7 +59,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DMPI_CXX_COMPILER=mpicxx \ -DMKLROOT=$MKLROOT \ -DENABLE_FLOAT_FFTW=ON \ - -DELPA_DIR=$ELPA \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ -DENABLE_OPENMP=ON \ diff --git a/toolchain/build_abacus_gnu.sh b/toolchain/build_abacus_gnu.sh index 79104c22f2..2a26780f3c 100755 --- a/toolchain/build_abacus_gnu.sh +++ b/toolchain/build_abacus_gnu.sh @@ -22,7 +22,6 @@ rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR LAPACK=${OPENBLAS_ROOT}/lib SCALAPACK=${SCALAPACK_ROOT}/lib -ELPA=${ELPA_ROOT} FFTW3=${FFTW_ROOT} LIBRI=${LIBRI_ROOT} LIBCOMM=${LIBCOMM_ROOT} @@ -61,7 +60,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DMPI_CXX_COMPILER=mpicxx \ -DLAPACK_DIR=$LAPACK \ -DSCALAPACK_DIR=$SCALAPACK \ - -DELPA_DIR=$ELPA \ -DFFTW3_DIR=$FFTW3 \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ diff --git a/toolchain/build_abacus_intel.sh b/toolchain/build_abacus_intel.sh index 43da9e32e3..da043fdc80 100755 --- a/toolchain/build_abacus_intel.sh +++ b/toolchain/build_abacus_intel.sh @@ -22,7 +22,6 @@ BUILD_DIR=build_abacus_intel rm -rf $BUILD_DIR PREFIX=$ABACUS_DIR -ELPA=${ELPA_ROOT} LIBRI=${LIBRI_ROOT} LIBCOMM=${LIBCOMM_ROOT} USE_CUDA=OFF # set ON to enable gpu-abacus @@ -61,7 +60,6 @@ cmake -B $BUILD_DIR -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DMPI_CXX_COMPILER=mpiicpx \ -DMKLROOT=$MKLROOT \ -DENABLE_FLOAT_FFTW=ON \ - -DELPA_DIR=$ELPA \ -DENABLE_LCAO=ON \ -DENABLE_LIBXC=ON \ -DENABLE_OPENMP=ON \