diff --git a/make_cp2k.sh b/make_cp2k.sh index 0b9c0c3839..468293f998 100755 --- a/make_cp2k.sh +++ b/make_cp2k.sh @@ -234,7 +234,7 @@ while [[ $# -gt 0 ]]; do for package in libfci libint2 libxc libxsmm spglib vori tblite; do CMAKE_FEATURE_FLAGS+=" -DCP2K_USE_${package^^}=ON" done - for package in ace deepmd greenx hdf5 libtorch pexsi trexio; do + for package in ace deepmd gauxc greenx hdf5 libtorch pexsi trexio; do CMAKE_FEATURE_FLAGS+=" -DCP2K_USE_${package^^}=OFF" done ;; @@ -268,7 +268,7 @@ while [[ $# -gt 0 ]]; do # Enable or disable all features CMAKE_FEATURE_FLAG_ALL="-DCP2K_USE_EVERYTHING=${ON_OFF}" for package in adios2 cosma deepmdkit dla-future dla-future-fortran elpa \ - greenx hdf5 libfci libfabric libint libvdwxc libsmeagol libvori libxc \ + gauxc greenx hdf5 libfci libfabric libint libvdwxc libsmeagol libvori libxc \ libxsmm mimic-mcl openpmd-api pace pexsi plumed py-torch sirius spfft \ spglib spla tblite trexio; do SED_PATTERN_LIST+=" -e '/\s*-\s+\"${package}@/ ${SUBST}" @@ -278,7 +278,7 @@ while [[ $# -gt 0 ]]; do SED_PATTERN_LIST+=" -e '/\s*-\s+\"smm=libxsmm\"/ s/libxsmm/blas/'" fi ;; - ace | cosma | deepmd | dftd4 | dlaf | elpa | fftw3 | greenx | hdf5 | libfci | libint2 | \ + ace | cosma | deepmd | dftd4 | dlaf | elpa | fftw3 | gauxc | greenx | hdf5 | libfci | libint2 | \ libsmeagol | libtorch | libxc | libxsmm | mimic | openpmd | pexsi | plumed | spglib | \ tblite | trexio | vori) CMAKE_FEATURE_FLAGS+=" -DCP2K_USE_${2^^}=${ON_OFF}" @@ -312,15 +312,25 @@ while [[ $# -gt 0 ]]; do fftw3) SED_PATTERN_LIST+=" -e '/\s*-\s+\"fftw@/ ${SUBST}" ;; + gauxc) + SED_PATTERN_LIST+=" -e '/\s*-\s+\"${2,,}@/ ${SUBST}" + if [[ "${ON_OFF}" == "ON" ]]; then + # GauXC requires libtorch + CMAKE_FEATURE_FLAGS+=" -DCP2K_USE_LIBTORCH=${ON_OFF}" + SED_PATTERN_LIST+=" -e '/\s*-\s+\"py-torch@/ ${SUBST}" + fi + ;; libint2) SED_PATTERN_LIST+=" -e '/\s*-\s+\"libint@/ ${SUBST}" ;; libtorch) SED_PATTERN_LIST+=" -e '/\s*-\s+\"py-torch@/ ${SUBST}" if [[ "${ON_OFF}" == "OFF" ]]; then - # DeePMD-kit requires libtorch + # DeePMD-kit and GauXC require libtorch CMAKE_FEATURE_FLAGS+=" -DCP2K_USE_DEEPMD=${ON_OFF}" SED_PATTERN_LIST+=" -e '/\s*-\s+\"deepmdkit@/ ${SUBST}" + CMAKE_FEATURE_FLAGS+=" -DCP2K_USE_GAUXC=${ON_OFF}" + SED_PATTERN_LIST+=" -e '/\s*-\s+\"gauxc@/ ${SUBST}" fi ;; libxsmm) @@ -583,7 +593,7 @@ NUM_PROCS=$(awk '{print $1+0}' <<< "${NUM_PROCS}") [[ -f /.dockerenv || -f /run/.containerenv ]] && IN_CONTAINER="yes" || IN_CONTAINER="no" # Assemble CMake feature flag list -CMAKE_FEATURE_FLAGS="${CMAKE_FEATURE_FLAG_ALL} ${CMAKE_FEATURE_FLAG_MPI} ${CMAKE_FEATURE_FLAGS} -DCP2K_USE_GAUXC=OFF" +CMAKE_FEATURE_FLAGS="${CMAKE_FEATURE_FLAG_ALL} ${CMAKE_FEATURE_FLAG_MPI} ${CMAKE_FEATURE_FLAGS}" # Clean CMake feature flag list from repeated entries and keep only the last definition declare -A last=() @@ -667,9 +677,9 @@ if [[ "${HELP}" == "yes" ]]; then echo " (see also --build_deps flag)" echo " - The folder ${CP2K_ROOT}/install is updated after each successful run" echo "" - echo "Packages: all | ace | cosma | deepmd | dftd4 | dlaf | elpa | fftw3 | greenx | hdf5 | libfci | libint2 |" - echo " libsmeagol | libtorch | libvdwxc | libxsmm | mimic | openpmd | pexsi | plumed | sirius |" - echo " spfft | spglib | spla | tblite | trexio | vori " + echo "Packages: all | ace | cosma | deepmd | dftd4 | dlaf | elpa | fftw3 | gauxc | greenx | hdf5 | libfci |" + echo " libint | libsmeagol | libtorch | libvdwxc | libxsmm | mimic | openpmd | pexsi | plumed |" + echo " sirius | spfft | spglib | spla | tblite | trexio | vori " echo "" echo "Features: cray_pm_accel_energy | cusolver_mp | dbm_gpu | elpa_gpu | grid_gpu | pw_gpu |" echo " spla_gemm_offloading | unified_memory" @@ -1363,6 +1373,32 @@ if ((EXIT_CODE != 0)); then ${EXIT_CMD} "${EXIT_CODE}" fi +# Install Skala resource files if needed +export GAUXC_SKALA_MODEL="(not available)" +GAUXC_PATH="share/gauxc/onedft_models" +GAUXC_PREFIX="$(spack location -i gauxc)" +GAUXC_MODEL_SOURCE_PATH="${GAUXC_PREFIX%/}/${GAUXC_PATH}" +if [[ -d "${GAUXC_MODEL_SOURCE_PATH}" ]]; then + GAUXC_MODEL_TARGET_PATH="${INSTALL_PREFIX%/}/${GAUXC_PATH}" + mkdir -p "${GAUXC_MODEL_TARGET_PATH}" + if compgen -G "${GAUXC_MODEL_SOURCE_PATH}/*.fun" > /dev/null; then + cp "${GAUXC_MODEL_SOURCE_PATH}"/*.fun "${GAUXC_MODEL_TARGET_PATH}/" + else + echo -e "\nERROR: No GauXC model files found in source folder ${GAUXC_MODEL_SOURCE_PATH}" + ${EXIT_CMD} 1 + fi + shopt -s nullglob + MATCHES=("${GAUXC_MODEL_TARGET_PATH}"/skala*) + shopt -u nullglob + if ((${#MATCHES[@]} > 0)); then + export GAUXC_SKALA_MODEL="${MATCHES[${#MATCHES[@]} - 1]}" + else + echo -e "\nERROR: Failed to resolve GAUXC_SKALA_MODEL in target path ${GAUXC_MODEL_TARGET_PATH}" + ${EXIT_CMD} 1 + fi +fi +echo -e "\nGAUXC_SKALA_MODEL = ${GAUXC_SKALA_MODEL}" + # Collect and compress all log files when building within a container if [[ "${IN_CONTAINER}" == "yes" ]]; then if ! cat "${CMAKE_BUILD_PATH}"/cmake.log \ @@ -1474,6 +1510,7 @@ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH} export OMP_NUM_THREADS=\${OMP_NUM_THREADS:-2} export OMP_STACKSIZE=256M ${OMPI_VARS} +export GAUXC_SKALA_MODEL=${GAUXC_SKALA_MODEL} exec "\$@" *** chmod 750 "${LAUNCH_SCRIPT}" @@ -1486,6 +1523,7 @@ if [[ "${VERSION}" =~ ^(s|p)dbg$ ]]; then echo "LSAN_OPTIONS = \${LSAN_OPTIONS}" fi ldd -- ${INSTALL_PREFIX}/bin/cp2k.${VERSION} 2>&1 | grep -E 'not ' | sort | uniq +export GAUXC_SKALA_MODEL=${GAUXC_SKALA_MODEL} ${CP2K_ROOT}/tests/do_regtest.py ${TESTOPTS} \$* ${INSTALL_PREFIX}/bin ${VERSION} *** chmod 750 "${INSTALL_PREFIX}"/bin/run_tests diff --git a/tools/spack/cp2k_deps_p.yaml b/tools/spack/cp2k_deps_p.yaml index 23d41812eb..9fb004312f 100644 --- a/tools/spack/cp2k_deps_p.yaml +++ b/tools/spack/cp2k_deps_p.yaml @@ -26,6 +26,7 @@ spack: buildable: true prefer: - "~cuda" + - "+fortran" - "+mpi" - "+mpi_f08" - "+openmp" @@ -69,7 +70,6 @@ spack: openblas: require: - - "+fortran" - "threads=openmp" - "build_system=makefile" @@ -109,6 +109,13 @@ spack: require: - "+openmp" + gauxc: + require: + - "+c" + - "+fortran" + - "+openmp" + - "+skala" + hdf5: require: - "+fortran" @@ -190,6 +197,7 @@ spack: - "dla-future-fortran@0.5.0" - "elpa@2026.02.001" - "fftw@3.3.11" + - "gauxc@dev20260522" - "greenx@2.2" - "hdf5@2.1.0" - "libfabric@2.5.1" diff --git a/tools/spack/cp2k_deps_s.yaml b/tools/spack/cp2k_deps_s.yaml index 6030cbf16a..b5c636597b 100644 --- a/tools/spack/cp2k_deps_s.yaml +++ b/tools/spack/cp2k_deps_s.yaml @@ -26,6 +26,7 @@ spack: buildable: true prefer: - "~cuda" + - "+fortran" - "~mpi" - "~mpi_f08" - "+openmp" @@ -73,6 +74,13 @@ spack: require: - "+openmp" + gauxc: + require: + - "+c" + - "+fortran" + - "+openmp" + - "+skala" + hdf5: require: - "+fortran" @@ -115,6 +123,7 @@ spack: - "deepmdkit@3.1.3" # - "dftd4@4.0.2" - "fftw@3.3.11" + - "gauxc@dev20260522" - "greenx@2.2" - "hdf5@2.1.0" - "libfci@0.1.0" diff --git a/tools/spack/spack_repo/cp2k_dev/packages/exchcxx/package.py b/tools/spack/spack_repo/cp2k_dev/packages/exchcxx/package.py new file mode 100644 index 0000000000..383a2df116 --- /dev/null +++ b/tools/spack/spack_repo/cp2k_dev/packages/exchcxx/package.py @@ -0,0 +1,43 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + + +from spack_repo.builtin.build_systems.cmake import CMakePackage, generator +from spack_repo.builtin.build_systems.cuda import CudaPackage + +from spack.package import * + + +class Exchcxx(CMakePackage, CudaPackage): + """Exchange correlation (XC) library for density functional theory (DFT) + calculations in modern C++.""" + + homepage = "https://github.com/wavefunction91/ExchCXX" + git = "https://github.com/wavefunction91/ExchCXX.git" + url = "https://github.com/wavefunction91/ExchCXX/archive/refs/tags/v1.0.0.tar.gz" + + maintainers("awvwgk", "mkrack") + + license("BSD-3-Clause") + + version("master", branch="master") + version("1.0.0", sha256="0ea38aab563ea5d11a03d80dc1bf909821091d903eb852c5cb350484753a847a") + + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("cmake@3.20:", type="build") + depends_on("ninja@1.10:", type="build") + depends_on("libxc@7.0.0:") + depends_on("cuda", when="+cuda") + + generator("ninja") + + variant("cuda", default=False, description="Build with CUDA support") + variant("pic", default=True, description="Build position independent code") + + def cmake_args(self): + args = [self.define_from_variant("CMAKE_POSITION_INDEPENDENT_CODE", "pic")] + if "+cuda" in self.spec: + args.append(self.define("EXCHCXX_ENABLE_CUDA", True)) + return args diff --git a/tools/spack/spack_repo/cp2k_dev/packages/gau2grid/package.py b/tools/spack/spack_repo/cp2k_dev/packages/gau2grid/package.py new file mode 100644 index 0000000000..5f93b4ac5a --- /dev/null +++ b/tools/spack/spack_repo/cp2k_dev/packages/gau2grid/package.py @@ -0,0 +1,40 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + + +from spack_repo.builtin.build_systems.cmake import CMakePackage, generator + +from spack.package import * + + +class Gau2grid(CMakePackage): + """Gau2Grid is a library for efficient evaluation of Gaussian + basis functions on grids.""" + + homepage = "https://gau2grid.readthedocs.io" + git = "https://github.com/psi4/gau2grid.git" + url = "https://github.com/psi4/gau2grid/archive/refs/tags/v2.0.8.tar.gz" + + maintainers("awvwgk", "mkrack") + + license("BSD-3-Clause") + + version("master", branch="master") + version("2.0.9", sha256="7879bdddf3a52cd2a051086215977822bbe8d1af927fcf5b4fb0256a38b8a76c") + version("2.0.8", sha256="c5f445344a465c1d9afc6516544dc4a2fba588af7ba0f1ac1a6b538260f0cd96") + + depends_on("cmake@3.12:", type="build") + depends_on("ninja@1.10:", type="build") + depends_on("python@2.12:", type="build") + depends_on("py-numpy", type="build") + + generator("ninja") + + def cmake_args(self): + args = [ + self.define("MAX_AM", 8), + self.define("ENABLE_XHOST", False), + self.define("INSTALL_PYMOD", False), + ] + return args diff --git a/tools/spack/spack_repo/cp2k_dev/packages/gauxc/package.py b/tools/spack/spack_repo/cp2k_dev/packages/gauxc/package.py new file mode 100644 index 0000000000..1e65f7f523 --- /dev/null +++ b/tools/spack/spack_repo/cp2k_dev/packages/gauxc/package.py @@ -0,0 +1,98 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + + +from spack_repo.builtin.build_systems.cmake import CMakePackage, generator +from spack_repo.builtin.build_systems.cuda import CudaPackage + +from spack.package import * + + +class Gauxc(CMakePackage, CudaPackage): + """GauXC is a modern, modular C++ library for the evaluation of quantities related to + the exchange-correlation (XC) energy (e.g. potential, etc) in the Gaussian basis set + discretization of Kohn-Sham density function theory (KS-DFT) on heterogenous architectures.""" + + homepage = "https://github.com/wavefunction91/GauXC" + git = "https://github.com/wavefunction91/GauXC.git" + url = "https://github.com/wavefunction91/GauXC/archive/refs/tags/v1.1.tar.gz" + + maintainers("awvwgk", "mkrack") + + license("BSD-3-Clause") + + version("master", branch="master") + version("dev20260522", branch="skala", commit="69ee054054c642bce0d9b5e8c9c0c13afa97b774") + version( + "1.2.dev2", + sha256="6659d00522b443f2557a960a9ba0217449d2ee25df809634d6becca23eb0f1ff", + url="https://github.com/microsoft/skala/releases/download/v1.1.1/gauxc-skala-r2.tar.gz", + ) + version("1.1", sha256="17de077fb23e44d03b0ed14dcd8117c01e5b3431fbefa2352d751639ada7f91c") + + # Skala resource file + skala_version = "1.1" + skala_file = f"skala-{skala_version}.fun" + resource( + name="skala_fun", + url=f"https://huggingface.co/microsoft/skala-{skala_version}/resolve/main/{skala_file}", + sha256="0c8432ac3f03c8f1276372df9aca5b7ee7f8939d47a8789eb158976e89aa0606", + expand=False, + placement=skala_file, + when="+skala", + ) + + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("fortran", when="+fortran", type="build") + depends_on("cmake@3.20:", type="build") + depends_on("ninja@1.10:", type="build") + depends_on("exchcxx ~cuda", when="~cuda") + depends_on("exchcxx +cuda", when="+cuda") + depends_on("integratorxx") + depends_on("hdf5", when="+hdf5") + depends_on("mpi", when="+mpi") + depends_on("cuda", when="+cuda") + depends_on("highfive@:2.10.1", when="+hdf5") + depends_on("gau2grid") + depends_on("blas") + depends_on("nlohmann-json", when="+skala") + depends_on("py-torch@2:", when="+skala") + depends_on("py-torch@2: +cuda", when="+skala+cuda") + + generator("ninja") + + variant("openmp", default=True, description="Build with OpenMP support") + variant("mpi", default=False, description="Build with MPI support") + variant("cuda", default=False, description="Build with CUDA support") + variant("hdf5", default=False, description="Build with HDF5 support") + variant("c", default=False, description="Build with C support") + variant("fortran", default=False, description="Build with Fortran support") + variant("skala", default=False, description="Build with Skala support") + variant("host", default=True, description="Build with host integrators") + variant("tests", default=False, description="Build with testing framework (Catch2)") + variant("pic", default=True, description="Build position independent code") + + def cmake_args(self): + args = [ + self.define("GAUXC_ENABLE_OPENMP", self.spec.satisfies("+openmp")), + self.define("GAUXC_ENABLE_MPI", self.spec.satisfies("+mpi")), + self.define("GAUXC_ENABLE_CUDA", self.spec.satisfies("+cuda")), + self.define("GAUXC_ENABLE_HDF5", self.spec.satisfies("+hdf5")), + self.define("GAUXC_ENABLE_C", self.spec.satisfies("+c")), + self.define("GAUXC_ENABLE_FORTRAN", self.spec.satisfies("+fortran")), + self.define("GAUXC_ENABLE_ONEDFT", self.spec.satisfies("+skala")), + self.define("GAUXC_ENABLE_HOST", self.spec.satisfies("+host")), + self.define("GAUXC_ENABLE_TESTS", self.spec.satisfies("+tests")), + self.define_from_variant("CMAKE_POSITION_INDEPENDENT_CODE", "pic"), + ] + return args + + def install(self, spec, prefix): + super().install(spec, prefix) + if self.spec.satisfies("+skala"): + target_dir = self.prefix.share.gauxc.join("onedft_models") + mkdirp(target_dir) + print(target_dir) + install(join_path(self.skala_file, self.skala_file), target_dir) diff --git a/tools/spack/spack_repo/cp2k_dev/packages/integratorxx/package.py b/tools/spack/spack_repo/cp2k_dev/packages/integratorxx/package.py new file mode 100644 index 0000000000..4da701f2f7 --- /dev/null +++ b/tools/spack/spack_repo/cp2k_dev/packages/integratorxx/package.py @@ -0,0 +1,35 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + + +from spack_repo.builtin.build_systems.cmake import CMakePackage, generator + +from spack.package import * + + +class Integratorxx(CMakePackage): + """Reuseable density functional theory (DFT) grid library.""" + + homepage = "https://github.com/wavefunction91/IntegratorXX" + git = "https://github.com/wavefunction91/IntegratorXX.git" + url = "https://github.com/wavefunction91/IntegratorXX/archive/refs/tags/v1.0.0.tar.gz" + + maintainers("awvwgk", "mkrack") + + license("BSD-3-Clause") + + version("master", branch="master") + version("1.0.0", sha256="d2826439d14b3f716ffd57a07d1d407de029a80c0e0446998b8f1339d5085b9c") + + depends_on("cxx", type="build") + depends_on("cmake@3.20:", type="build") + depends_on("ninja@1.10:", type="build") + + generator("ninja") + + variant("pic", default=True, description="Build position independent code") + + def cmake_args(self): + args = [self.define_from_variant("CMAKE_POSITION_INDEPENDENT_CODE", "pic")] + return args