Diagonalization: add opt-in direct generalized eigensolvers (#5108)

Co-authored-by: DCM-Uni-Paderborn <DCM-Uni-Paderborn@users.noreply.github.com>
Co-authored-by: Thomas D. Kuehne <tkuehne@cp2k.org>
This commit is contained in:
Dynamics of Condensed Matter 2026-05-05 16:26:45 +02:00 committed by GitHub
parent 4a77a3b84e
commit c7270bbdb5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
34 changed files with 1667 additions and 85 deletions

View file

@ -5,8 +5,9 @@
#! SPDX-License-Identifier: GPL-2.0-or-later !
#!-------------------------------------------------------------------------------------------------!
set(CP2K_C_COMPILER_LIST "GNU;Intel;IntelLLVM;NAG;Cray;PGI;Clang;AppleClang")
set(CP2K_Fortran_COMPILER_LIST "GNU;Intel;IntelLLVM;NAG;Cray;PGI")
set(CP2K_C_COMPILER_LIST
"GNU;Intel;IntelLLVM;NAG;Cray;PGI;NVHPC;Clang;AppleClang")
set(CP2K_Fortran_COMPILER_LIST "GNU;Intel;IntelLLVM;NAG;Cray;PGI;NVHPC")
if(NOT CMAKE_C_COMPILER_ID IN_LIST CP2K_C_COMPILER_LIST)
message(
@ -157,7 +158,7 @@ add_compile_options(
# Baseline
add_compile_options(
"$<$<COMPILE_LANG_AND_ID:Fortran,PGI>:-Mfreeform;-Mextend;-Mallocatable=03>"
"$<$<COMPILE_LANG_AND_ID:Fortran,PGI,NVHPC>:-Mfreeform;-Mextend;-Mallocatable=03>"
"$<$<COMPILE_LANG_AND_ID:Fortran,NAG>:-f2008;-free;-Warn=reallocation;-Warn=subnormal>"
"$<$<COMPILE_LANG_AND_ID:Fortran,Cray>:-f;free;-M3105;-ME7212;-hnoacc;-M1234>"
)
@ -166,11 +167,11 @@ add_compile_options(
# Release
add_compile_options(
"$<$<AND:$<CONFIG:RELEASE>,$<COMPILE_LANG_AND_ID:Fortran,PGI>>:-fast>"
"$<$<AND:$<CONFIG:RELEASE>,$<COMPILE_LANG_AND_ID:Fortran,PGI,NVHPC>>:-fast>"
"$<$<AND:$<CONFIG:RELEASE>,$<COMPILE_LANG_AND_ID:Fortran,Cray>>:-O2;-G2>"
"$<$<AND:$<CONFIG:RELEASE>,$<COMPILE_LANG_AND_ID:Fortran,NAG>>:-gline>")
add_compile_options(
"$<$<AND:$<CONFIG:RELEASE>,$<COMPILE_LANG_AND_ID:C,PGI>>:-fast>"
"$<$<AND:$<CONFIG:RELEASE>,$<COMPILE_LANG_AND_ID:C,PGI,NVHPC>>:-fast>"
"$<$<AND:$<CONFIG:RELEASE>,$<COMPILE_LANG_AND_ID:C,Intel>>:-O3;-g>"
"$<$<AND:$<CONFIG:RELEASE>,$<COMPILE_LANG_AND_ID:C,Cray>>:-O3>"
"$<$<AND:$<CONFIG:RELEASE>,$<COMPILE_LANG_AND_ID:C,NAG>>:-gline>"
@ -181,10 +182,10 @@ add_compile_options(
# Debug
add_compile_options(
"$<$<AND:$<CONFIG:DEBUG>,$<COMPILE_LANG_AND_ID:Fortran,PGI>>:-g>"
"$<$<AND:$<CONFIG:DEBUG>,$<COMPILE_LANG_AND_ID:Fortran,PGI,NVHPC>>:-g>"
"$<$<AND:$<CONFIG:DEBUG>,$<COMPILE_LANG_AND_ID:Fortran,Cray>>:-G2>")
add_compile_options(
"$<$<AND:$<CONFIG:DEBUG>,$<COMPILE_LANG_AND_ID:C,PGI>>:-fast>"
"$<$<AND:$<CONFIG:DEBUG>,$<COMPILE_LANG_AND_ID:C,PGI,NVHPC>>:-fast>"
"$<$<AND:$<CONFIG:DEBUG>,$<COMPILE_LANG_AND_ID:C,Intel>>:-O2;-g>"
"$<$<AND:$<CONFIG:DEBUG>,$<COMPILE_LANG_AND_ID:C,Cray>>:-G2>"
"$<$<AND:$<CONFIG:DEBUG>,$<COMPILE_LANG_AND_ID:C,NAG>>:-g;-C>"

View file

@ -30,6 +30,41 @@ if(NOT CP2K_CONFIG_PACKAGE)
CP2K_SCALAPACK_LINK_LIBRARIES cp2k::BLAS::SCI::scalapack_link
INTERFACE_LINK_LIBRARIES)
set(CP2K_SCALAPACK_FOUND yes)
elseif(CP2K_SCALAPACK_VENDOR MATCHES "NVPL")
if(CP2K_BLAS_INTERFACE MATCHES "64bits")
set(_nvpl_int_type "ilp64")
else()
set(_nvpl_int_type "lp64")
endif()
set(_nvpl_mpi_type "${CP2K_NVPL_SCALAPACK_MPI}")
if(_nvpl_mpi_type STREQUAL "auto")
if(MPI_Fortran_LIBRARY_VERSION_STRING MATCHES "Open MPI[^0-9]*([0-9]+)")
set(_nvpl_mpi_type "openmpi${CMAKE_MATCH_1}")
elseif(MPI_Fortran_LIBRARY_VERSION_STRING MATCHES "MPICH|HYDRA")
set(_nvpl_mpi_type "mpich")
else()
message(
FATAL_ERROR
"Could not determine the NVPL BLACS MPI interface. Set "
"CP2K_NVPL_SCALAPACK_MPI to mpich, openmpi3, openmpi4, or openmpi5."
)
endif()
endif()
find_package(nvpl REQUIRED COMPONENTS scalapack)
set(_nvpl_scalapack_target "nvpl::scalapack_${_nvpl_int_type}")
set(_nvpl_blacs_target "nvpl::blacs_${_nvpl_int_type}_${_nvpl_mpi_type}")
if(NOT TARGET "${_nvpl_scalapack_target}")
message(
FATAL_ERROR "NVPL ScaLAPACK target ${_nvpl_scalapack_target} not found")
endif()
if(NOT TARGET "${_nvpl_blacs_target}")
message(FATAL_ERROR "NVPL BLACS target ${_nvpl_blacs_target} not found")
endif()
set(CP2K_SCALAPACK_LINK_LIBRARIES
"${_nvpl_scalapack_target};${_nvpl_blacs_target}")
set(CP2K_SCALAPACK_FOUND yes)
else() # if(CP2K_SCALAPACK_VENDOR MATCHES "GENERIC|auto")
if(TARGET cp2k::BLAS::MKL::scalapack_link)
message(

View file

@ -11,6 +11,7 @@ include(FindPackageHandleStandardArgs)
include(cp2k_utils)
cp2k_set_default_paths(UCC "ucc")
cp2k_set_default_paths(UCX "ucx")
cp2k_find_libraries(UCC "ucc")
cp2k_find_libraries(UCX "ucs")

View file

@ -13,8 +13,12 @@ function(cp2k_set_default_paths _varname _package_name)
# find_library should work when ${PACKAGE_ROOT} is given to cmake
# (-DPACKAGE_ROOT=bla) but I use only one variable syntax CP2K_PACKAGE_PREFIX
set(CP2K_${_varname}_PREFIX_TMP "")
if(DEFINED ${_package_name}_ROOT)
set(CP2K_${_varname}_PREFIX_TMP "${${_varname}_ROOT}")
set(_cp2k_root_var "CP2K_${_varname}_ROOT")
set(_package_root_var "${_package_name}_ROOT")
if(DEFINED ${_cp2k_root_var})
set(CP2K_${_varname}_PREFIX_TMP "${${_cp2k_root_var}}")
elseif(DEFINED ${_package_root_var})
set(CP2K_${_varname}_PREFIX_TMP "${${_package_root_var}}")
endif()
# search common environment variables names