pexsi: add v1.2 and v2.0 (#36049)

This commit is contained in:
Rocco Meli 2023-03-14 16:02:11 +01:00 committed by GitHub
parent 2437a1d554
commit 16f70ca78d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,14 +3,15 @@
# #
# SPDX-License-Identifier: (Apache-2.0 OR MIT) # SPDX-License-Identifier: (Apache-2.0 OR MIT)
import inspect import inspect
import os.path import os.path
import spack.build_systems.cmake
import spack.build_systems.makefile
from spack.package import * from spack.package import *
class Pexsi(MakefilePackage): class Pexsi(MakefilePackage, CMakePackage):
"""The PEXSI library is written in C++, and uses message passing interface """The PEXSI library is written in C++, and uses message passing interface
(MPI) to parallelize the computation on distributed memory computing (MPI) to parallelize the computation on distributed memory computing
systems and achieve scalability on more than 10,000 processors. systems and achieve scalability on more than 10,000 processors.
@ -25,71 +26,98 @@ class Pexsi(MakefilePackage):
""" """
homepage = "https://math.berkeley.edu/~linlin/pexsi/index.html" homepage = "https://math.berkeley.edu/~linlin/pexsi/index.html"
url = "https://math.berkeley.edu/~linlin/pexsi/download/pexsi_v0.9.0.tar.gz"
# version('1.0', sha256='1574c66fd69ff2a37c6250d65c4df43b57c79822b49bd65662582a0cd5d82f54') build_system(
conditional("cmake", when="@1:"), conditional("makefile", when="@0"), default="cmake"
)
version("2.0.0", sha256="c5c83c2931b2bd0c68a462a49eeec983e78b5aaa1f17dd0454de4e27b91ca11f")
version("1.2.0", sha256="8bfad6ec6866c6a29e1cc87fb1c17a39809795e79ede98373c8ba9a3aaf820dd")
version("0.10.2", sha256="8714c71b76542e096211b537a9cb1ffb2c28f53eea4f5a92f94cc1ca1e7b499f") version("0.10.2", sha256="8714c71b76542e096211b537a9cb1ffb2c28f53eea4f5a92f94cc1ca1e7b499f")
version("0.9.0", sha256="e5efe0c129013392cdac3234e37f1f4fea641c139b1fbea47618b4b839d05029") version("0.9.0", sha256="e5efe0c129013392cdac3234e37f1f4fea641c139b1fbea47618b4b839d05029")
depends_on("parmetis") depends_on("parmetis")
depends_on("superlu-dist@5.1.2:5.3", when="@0.10.2:") depends_on("superlu-dist@5.1.2:5.3", when="@0.10.2:0")
depends_on("superlu-dist@:6.1.0", when="@1") # Upper limit from CP2K toolchain
depends_on("superlu-dist@7", when="@2")
with when("build_system=cmake"):
depends_on("cmake@3.10:", type="build")
depends_on("cmake@3.17:", type="build", when="@2:")
variant("openmp", default=False, description="Build with OpenMP support", when="@1.2")
variant("fortran", default=False, description="Builds the Fortran interface") variant("fortran", default=False, description="Builds the Fortran interface")
def url_for_version(self, version):
if version == Version("0"):
return f"https://math.berkeley.edu/~linlin/pexsi/download/pexsi_v{version}.tar.gz"
return f"https://bitbucket.org/berkeleylab/pexsi/downloads/pexsi_v{version}.tar.gz"
class MakefileBuilder(spack.build_systems.makefile.MakefileBuilder):
parallel = False parallel = False
def edit(self, spec, prefix): def edit(self, pkg, spec, prefix):
substitutions = [ substitutions = [
("@MPICC", self.spec["mpi"].mpicc), ("@MPICC", spec["mpi"].mpicc),
("@MPICXX_LIB", self.spec["mpi:cxx"].libs.joined()), ("@MPICXX_LIB", spec["mpi:cxx"].libs.joined()),
("@MPICXX", self.spec["mpi"].mpicxx), ("@MPICXX", spec["mpi"].mpicxx),
("@MPIFC", self.spec["mpi"].mpifc), ("@MPIFC", spec["mpi"].mpifc),
("@RANLIB", "ranlib"), ("@RANLIB", "ranlib"),
("@PEXSI_STAGE", self.stage.source_path), ("@PEXSI_STAGE", pkg.stage.source_path),
("@SUPERLU_PREFIX", self.spec["superlu-dist"].prefix), ("@SUPERLU_PREFIX", spec["superlu-dist"].prefix),
("@METIS_PREFIX", self.spec["metis"].prefix), ("@METIS_PREFIX", spec["metis"].prefix),
("@PARMETIS_PREFIX", self.spec["parmetis"].prefix), ("@PARMETIS_PREFIX", spec["parmetis"].prefix),
("@LAPACK_PREFIX", self.spec["lapack"].prefix), ("@LAPACK_PREFIX", spec["lapack"].prefix),
("@BLAS_PREFIX", self.spec["blas"].prefix), ("@BLAS_PREFIX", spec["blas"].prefix),
("@LAPACK_LIBS", self.spec["lapack"].libs.joined()), ("@LAPACK_LIBS", spec["lapack"].libs.joined()),
("@BLAS_LIBS", self.spec["blas"].libs.joined()), ("@BLAS_LIBS", spec["blas"].libs.joined()),
# FIXME : what to do with compiler provided libraries ? # FIXME : what to do with compiler provided libraries ?
("@STDCXX_LIB", " ".join(self.compiler.stdcxx_libs)), ("@STDCXX_LIB", " ".join(pkg.compiler.stdcxx_libs)),
] ]
fldflags = "" fldflags = ""
if "@0.9.2" in self.spec: if "@0.9.2" in spec:
fldflags += " -Wl,--allow-multiple-definition" fldflags += " -Wl,--allow-multiple-definition"
if "^superlu +openmp" in self.spec or "^openblas threads=openmp" in self.spec: if "^superlu +openmp" in spec or "^openblas threads=openmp" in spec:
fldflags += " " + self.compiler.openmp_flag fldflags += " " + pkg.compiler.openmp_flag
substitutions.append(("@FLDFLAGS", fldflags.lstrip())) substitutions.append(("@FLDFLAGS", fldflags.lstrip()))
template = join_path(os.path.dirname(inspect.getmodule(self).__file__), "make.inc") template = join_path(os.path.dirname(inspect.getmodule(self).__file__), "make.inc")
makefile = join_path(self.stage.source_path, "make.inc") makefile = join_path(pkg.stage.source_path, "make.inc")
copy(template, makefile) copy(template, makefile)
for key, value in substitutions: for key, value in substitutions:
filter_file(key, value, makefile) filter_file(key, value, makefile)
def build(self, spec, prefix): def build(self, pkg, spec, prefix):
super(Pexsi, self).build(spec, prefix) super().build(pkg, spec, prefix)
if "+fortran" in self.spec: if "+fortran" in spec:
make("-C", "fortran") make("-C", "fortran")
def install(self, spec, prefix): def install(self, pkg, spec, prefix):
# 'make install' does not exist, despite what documentation says # 'make install' does not exist, despite what documentation says
mkdirp(self.prefix.lib) mkdirp(pkg.prefix.lib)
install( install(
join_path(self.stage.source_path, "src", "libpexsi_linux.a"), join_path(pkg.stage.source_path, "src", "libpexsi_linux.a"),
join_path(self.prefix.lib, "libpexsi.a"), join_path(pkg.prefix.lib, "libpexsi.a"),
) )
install_tree(join_path(self.stage.source_path, "include"), self.prefix.include) install_tree(join_path(pkg.stage.source_path, "include"), pkg.prefix.include)
# fortran "interface" # fortran "interface"
if "+fortran" in self.spec: if "+fortran" in spec:
install_tree( install_tree(
join_path(self.stage.source_path, "fortran"), join_path(self.prefix, "fortran") join_path(pkg.stage.source_path, "fortran"), join_path(pkg.prefix, "fortran")
) )
class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder):
def cmake_args(self):
args = [
self.define_from_variant("PEXSI_ENABLE_FORTRAN", "fortran"),
self.define_from_variant("PEXSI_ENABLE_OPENMP ", "openmp"),
]
return args