From 7ebabfcf0ec31ba2a0470d0405bf7ae84a446c00 Mon Sep 17 00:00:00 2001 From: Rocco Meli Date: Fri, 31 Jan 2025 12:11:13 +0100 Subject: [PATCH] libsmeagol (#48776) * libsmeagol * add support for intel and add conflicts * cp2k --- .../repos/builtin/packages/cp2k/package.py | 10 +++ .../builtin/packages/libsmeagol/package.py | 66 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 var/spack/repos/builtin/packages/libsmeagol/package.py diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index 0a0e336578c..441650b85c1 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -116,6 +116,7 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage): variant("pytorch", default=False, description="Enable libtorch support") variant("quip", default=False, description="Enable quip support") variant("mpi_f08", default=False, description="Use MPI F08 module") + variant("smeagol", default=False, description="Enable libsmeagol support", when="@2025.2:") variant( "enable_regtests", @@ -260,6 +261,8 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage): depends_on("plumed+mpi", when="+mpi") depends_on("plumed~mpi", when="~mpi") + depends_on("libsmeagol", when="+smeagol") + # while we link statically against PEXSI, its own deps may be linked in # dynamically, therefore can't set this as pure build-type dependency. depends_on("pexsi+fortran@0.10.0:", when="+pexsi") @@ -621,6 +624,12 @@ def edit(self, pkg, spec, prefix): ldflags += [spglib.search_flags] libs.append(spglib.ld_flags) + if spec.satisfies("+smeagol"): + cppflags += ["-D__SMEAGOL"] + smeagol = spec["libsmeagol"].libs + ldflags += [smeagol.search_flags] + libs.append(smeagol.ld_flags) + cc = spack_cc if "~mpi" in spec else spec["mpi"].mpicc cxx = spack_cxx if "~mpi" in spec else spec["mpi"].mpicxx fc = spack_fc if "~mpi" in spec else spec["mpi"].mpifc @@ -995,6 +1004,7 @@ def cmake_args(self): self.define_from_variant("CP2K_USE_SPLA", "spla"), self.define_from_variant("CP2K_USE_QUIP", "quip"), self.define_from_variant("CP2K_USE_MPI_F08", "mpi_f08"), + self.define_from_variant("CP2K_USE_LIBSMEAGOL", "smeagol"), ] # we force the use elpa openmp threading support. might need to be revisited though diff --git a/var/spack/repos/builtin/packages/libsmeagol/package.py b/var/spack/repos/builtin/packages/libsmeagol/package.py new file mode 100644 index 00000000000..09fc1ffc258 --- /dev/null +++ b/var/spack/repos/builtin/packages/libsmeagol/package.py @@ -0,0 +1,66 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Libsmeagol(MakefilePackage): + """Non-equilibrium Green's function (NEGS) code.""" + + homepage = "https://github.com/StefanoSanvitoGroup/libsmeagol" + git = "https://github.com/StefanoSanvitoGroup/libsmeagol.git" + + maintainers("RMeli") + + license("GPL-2.0-or-later", checked_by="RMeli") + + version("main", branch="main") + version("1.2", commit="fefed1bb4fceca584c3014debb169e8ed4ce1289") + + depends_on("mpi") + depends_on("blas") + + unsupported_compilers = ( + "aocc", + "apple_clang", + "cce", + "clang", + "fj", + "msvc", + "nag", + "nvhpc", + "oneapi", + ) + for uc in unsupported_compilers: + conflicts(f"%{uc}") + + @property + def build_targets(self): + spec = self.spec + + if spec.satisfies("%gcc"): + fcflags = ( + "-DMPI -fopenmp -march=native -O3 -g -std=gnu -fallow-argument-mismatch " + "-fexternal-blas -fblas-matmul-limit=0 -fno-omit-frame-pointer -funroll-loops" + ) + fixedform = "-ffixed-form" + freeform = "-ffree-form -ffree-line-length-none" + elif spec.satisfies("%intel"): + fcflags = "-DMPI -qopenmp -xHost -O2 -g -fno-moit-frame-pointer" + fixedform = "-fixed" + freeform = "-free" + else: + raise InstallError("Unsupported compiler.") + + return [ + f"FC={spec['mpi'].mpifc}", + f"FCFLAGS={fcflags} -fPIC", + f"FCFLAGS_FIXEDFORM={fixedform}", + f"FCFLAGS_FREEFORM={freeform}", + ] + + def install(self, spec, prefix): + mkdir(prefix.bin) + install_tree("lib", prefix.lib) + install_tree("obj", prefix.include)