summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRocco Meli <r.meli@bluemail.ch>2024-07-03 08:56:30 +0200
committerGitHub <noreply@github.com>2024-07-03 08:56:30 +0200
commitc0f80e9117648b10e9fc476ec94b2d0bbda7d833 (patch)
tree0a75ffac2e7ce095fac6af59556e3bb29da6ec1d
parentdcf13af459f39ae1002f830e1790b8748156db7e (diff)
downloadspack-c0f80e9117648b10e9fc476ec94b2d0bbda7d833.tar.gz
spack-c0f80e9117648b10e9fc476ec94b2d0bbda7d833.tar.bz2
spack-c0f80e9117648b10e9fc476ec94b2d0bbda7d833.tar.xz
spack-c0f80e9117648b10e9fc476ec94b2d0bbda7d833.zip
elsi: improve package and add external libOMM (#44865)
Add MatrixSwitch package Add libOMM package Use libOMM as external in ELSI Add include paths for all libraries Fortran modules need one directory up (can't use libs.directories since they are just the include/ directories)
-rw-r--r--var/spack/repos/builtin/packages/elsi/package.py75
-rw-r--r--var/spack/repos/builtin/packages/matrix-switch/package.py53
-rw-r--r--var/spack/repos/builtin/packages/omm/package.py58
3 files changed, 174 insertions, 12 deletions
diff --git a/var/spack/repos/builtin/packages/elsi/package.py b/var/spack/repos/builtin/packages/elsi/package.py
index 52174b9829..9ba1210b07 100644
--- a/var/spack/repos/builtin/packages/elsi/package.py
+++ b/var/spack/repos/builtin/packages/elsi/package.py
@@ -4,6 +4,7 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os.path
+from spack.error import NoHeadersError
from spack.package import *
@@ -18,10 +19,19 @@ class Elsi(CMakePackage, CudaPackage):
license("BSD-3-Clause")
version("2.10.1", sha256="b3c7526d46a9139a26680787172a3df15bc648715a35bdf384053231e94ab829")
- version("2.2.1", sha256="5b4b2e8fa4b3b68131fe02cc1803a884039b89a1b1138af474af66453bec0b4d")
+ version(
+ "2.2.1",
+ sha256="5b4b2e8fa4b3b68131fe02cc1803a884039b89a1b1138af474af66453bec0b4d",
+ deprecated=True,
+ )
version("master", branch="master")
- variant("add_underscore", default=True, description="Suffix C functions with an underscore")
+ variant(
+ "add_underscore",
+ default=True,
+ description="Suffix C functions with an underscore",
+ when="@2.2.1",
+ )
variant(
"elpa2_kernel",
default="none",
@@ -33,9 +43,21 @@ class Elsi(CMakePackage, CudaPackage):
variant("enable_sips", default=False, description="Enable SLEPc-SIPs support")
variant("use_external_elpa", default=True, description="Build ELPA using SPACK")
variant("use_external_ntpoly", default=True, description="Build NTPoly using SPACK")
- variant("use_external_superlu", default=True, description="Use external SuperLU DIST")
variant(
- "use_mpi_iallgather", default=True, description="Use non-blocking collective MPI functions"
+ "use_external_superlu", default=True, description="Use external SuperLU DIST", when="@:2.2"
+ )
+ variant(
+ "use_external_pexsi",
+ default=True,
+ description="Use external PEXSI",
+ when="@2.3: +enable_pexsi",
+ )
+ variant("use_external_omm", default=True, description="Use external libOMM")
+ variant(
+ "use_mpi_iallgather",
+ default=True,
+ description="Use non-blocking collective MPI functions",
+ when="@:2.5",
)
variant(
"internal_elpa_version",
@@ -52,10 +74,10 @@ class Elsi(CMakePackage, CudaPackage):
depends_on("mpi")
# Library dependencies
+ depends_on("ntpoly", when="+use_external_ntpoly")
with when("+use_external_elpa"):
depends_on("elpa+cuda", when="+cuda")
depends_on("elpa~cuda", when="~cuda")
- depends_on("ntpoly", when="+use_external_ntpoly")
with when("+enable_sips"):
depends_on("slepc+cuda", when="+cuda")
depends_on("slepc~cuda", when="~cuda")
@@ -64,6 +86,13 @@ class Elsi(CMakePackage, CudaPackage):
with when("+use_external_superlu"):
depends_on("superlu-dist+cuda", when="+cuda")
depends_on("superlu-dist~cuda", when="~cuda")
+ with when("+enable_pexsi +use_external_pexsi"):
+ depends_on("pexsi+fortran")
+ depends_on("superlu-dist+cuda", when="+cuda")
+ depends_on("superlu-dist~cuda", when="~cuda")
+ with when("+use_external_omm"):
+ depends_on("omm")
+ depends_on("matrix-switch") # Direct dependency
def cmake_args(self):
libs_names = ["scalapack", "lapack", "blas"]
@@ -75,12 +104,30 @@ class Elsi(CMakePackage, CudaPackage):
libs_names.append("ntpoly")
if self.spec.satisfies("+use_external_superlu"):
libs_names.append("superlu-dist")
+ if self.spec.satisfies("+use_external_pexsi"):
+ libs_names.append("superlu-dist")
+ libs_names.append("pexsi")
+ if self.spec.satisfies("+use_external_omm"):
+ libs_names.append("omm")
+ libs_names.append("matrix-switch")
- lib_paths, libs = [], []
+ lib_paths, inc_paths, libs = [], [], []
for lib in libs_names:
lib_paths.extend(self.spec[lib].libs.directories)
libs.extend(self.spec[lib].libs.names)
+ try:
+ inc_paths.extend(self.spec[lib].headers.directories)
+
+ # Deal with Fortran modules
+ for path in self.spec[lib].headers:
+ # Add path to .mod files
+ # headers.directories only add path up to include/
+ if path.endswith(".mod"):
+ inc_paths.append(os.path.dirname(path))
+ except NoHeadersError:
+ pass
+
args = [
# Compiler Information (ELSI wants these explicitly set)
self.define("CMAKE_Fortran_COMPILER", self.spec["mpi"].mpifc),
@@ -91,22 +138,26 @@ class Elsi(CMakePackage, CudaPackage):
self.define_from_variant("ENABLE_SIPS", "enable_sips"),
self.define_from_variant("USE_EXTERNAL_ELPA", "use_external_elpa"),
self.define_from_variant("USE_EXTERNAL_NTPOLY", "use_external_ntpoly"),
+ self.define_from_variant("USE_EXTERNAL_OMM", "use_external_omm"),
self.define_from_variant("USE_EXTERNAL_SUPERLU", "use_external_superlu"),
+ self.define_from_variant("USE_EXTERNAL_PEXSI", "use_external_pexsi"),
self.define_from_variant("USE_MPI_IALLGATHER", "use_mpi_iallgather"),
self.define("ENABLE_TESTS", self.run_tests),
self.define("ENABLE_C_TESTS", self.run_tests),
self.define_from_variant("USE_GPU_CUDA", "cuda"),
- self.define("LIB_PATHS", ";".join(lib_paths)),
- self.define("LIBS", ";".join(libs)),
- self.define(f"USE_ELPA_{self.spec.variants['internal_elpa_version'].value}", True),
+ self.define("LIB_PATHS", ";".join(set(lib_paths))),
+ self.define("LIBS", ";".join(set(libs))),
]
+ if not self.spec.satisfies("+use_external_elpa"):
+ args.append(
+ self.define(f"USE_ELPA_{self.spec.variants['internal_elpa_version'].value}", True)
+ )
+
if self.spec.variants["elpa2_kernel"].value != "none":
args.append(self.define_from_variant("ELPA2_KERNEL", "elpa2_kernel"))
- if self.spec.satisfies("+use_external_elpa"):
- elpa_module = find(self.spec["elpa"].prefix, "elpa.mod")
- args.append(self.define("INC_PATHS", os.path.dirname(elpa_module[0])))
+ args.append(self.define("INC_PATHS", ";".join(set(inc_paths))))
# Only when using fujitsu compiler
if self.spec.satisfies("%fj"):
diff --git a/var/spack/repos/builtin/packages/matrix-switch/package.py b/var/spack/repos/builtin/packages/matrix-switch/package.py
new file mode 100644
index 0000000000..ee1a10a8ee
--- /dev/null
+++ b/var/spack/repos/builtin/packages/matrix-switch/package.py
@@ -0,0 +1,53 @@
+# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack.package import *
+
+
+class MatrixSwitch(CMakePackage):
+ """Intermediary interface between high-level routines for
+ physics-related algorithms and low-level routines dealing
+ with matrix storage and manipulation."""
+
+ homepage = "https://gitlab.com/ElectronicStructureLibrary/omm/matrixswitch"
+ url = "https://gitlab.com/ElectronicStructureLibrary/omm/matrixswitch/-/archive/1.2.1/matrixswitch-1.2.1.tar.gz"
+ git = "https://gitlab.com/ElectronicStructureLibrary/omm/matrixswitch.git"
+
+ maintainers("RMeli")
+
+ license("BSD-2-Clause", checked_by="RMeli")
+
+ version("1.2.1", sha256="a3c2bac20435a8217cd1a1abefa8b7f8c52b1c6f55a75b2861565ade5ecfe37f")
+ version("master", branch="master")
+
+ variant("lapack", default=True, description="Build with LAPACK interface.")
+ variant("mpi", default=True, description="Build with MPI support.")
+ variant("scalapack", default=True, when="+mpi", description="Build with ScaLAPACK interface.")
+ variant("dbcsr", default=False, when="+mpi", description="Build with DBCSR interface.")
+
+ depends_on("cmake@3.22:", type="build")
+ generator("ninja")
+
+ depends_on("lapack", when="+lapack")
+ depends_on("mpi", when="+mpi")
+ depends_on("scalapack", when="+scalapack")
+ depends_on("dbcsr~shared", when="+dbcsr") # Expects static library (FindCustomDbcsr)
+
+ def cmake_args(self):
+ args = [
+ self.define_from_variant("WITH_LAPACK", "lapack"),
+ self.define_from_variant("WITH_MPI", "mpi"),
+ self.define_from_variant("WITH_SCALAPACK", "scalapack"),
+ self.define_from_variant("WITH_DBCSR", "dbcsr"),
+ ]
+
+ if self.spec.satisfies("+dbcsr"):
+ args.append(self.define("DBCSR_ROOT", self.spec["dbcsr"].prefix))
+
+ return args
+
+ @property
+ def libs(self):
+ return find_libraries("libmatrixswitch", root=self.home, recursive=True, shared=False)
diff --git a/var/spack/repos/builtin/packages/omm/package.py b/var/spack/repos/builtin/packages/omm/package.py
new file mode 100644
index 0000000000..3b8ead80db
--- /dev/null
+++ b/var/spack/repos/builtin/packages/omm/package.py
@@ -0,0 +1,58 @@
+# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack.package import *
+
+
+class Omm(CMakePackage):
+ """Solution of Kohn-Sham equations using the Orbital Minimization Method (OMM)."""
+
+ homepage = "https://gitlab.com/ElectronicStructureLibrary/omm/libomm"
+ url = "https://gitlab.com/ElectronicStructureLibrary/omm/libomm/-/archive/1.2.1/libomm-1.2.1.tar.gz"
+ git = "https://gitlab.com/ElectronicStructureLibrary/omm/libomm.git"
+
+ maintainers("RMeli")
+
+ license("BSD-2-Clause", checked_by="RMeli")
+
+ version("1.2.1", sha256="4876990056efabdd83b0caad52ed56632d9926b61d73fe3efbd04d0f8d242ede")
+ version("master", branch="master")
+
+ variant("lapack", default=True, description="Build libOMM with LAPACK interface.")
+ variant("mpi", default=True, description="Build libOMM with MPI support.")
+ variant(
+ "scalapack",
+ default=True,
+ when="+mpi",
+ description="Build libOMM with ScaLAPACK interface.",
+ )
+ variant("dbcsr", default=False, when="+mpi", description="Build libOMM with DBCSR interface.")
+
+ depends_on("cmake@3.22:", type="build")
+ generator("ninja")
+
+ depends_on("lapack", when="+lapack")
+ depends_on("mpi", when="+mpi")
+ depends_on("scalapack", when="+scalapack")
+ depends_on("dbcsr~shared", when="+dbcsr") # Expects static library (FindCustomDbcsr)
+
+ depends_on("matrix-switch")
+ depends_on("matrix-switch+lapack", when="+lapack")
+ depends_on("matrix-switch+mpi", when="+mpi")
+ depends_on("matrix-switch+scalapack", when="+scalapack")
+ depends_on("matrix-switch+dbcsr", when="+dbcsr")
+
+ def cmake_args(self):
+ args = [
+ self.define_from_variant("WITH_LAPACK", "lapack"),
+ self.define_from_variant("WITH_MPI", "mpi"),
+ self.define_from_variant("WITH_SCALAPACK", "scalapack"),
+ self.define_from_variant("WITH_DBCSR", "dbcsr"),
+ ]
+
+ if self.spec.satisfies("+dbcsr"):
+ args.append(self.define("DBCSR_ROOT", self.spec["dbcsr"].prefix))
+
+ return args