summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/nlcglib/package.py
blob: 93cbed4b2e8cd11dda8795f712ef97e909f69fb3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# Copyright 2013-2023 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 Nlcglib(CMakePackage, CudaPackage, ROCmPackage):
    """Nonlinear CG methods for wave-function optimization in DFT."""

    homepage = "https://github.com/simonpintarelli/nlcglib"
    git = "https://github.com/simonpintarelli/nlcglib.git"
    url = "https://github.com/simonpintarelli/nlcglib/archive/v0.9.tar.gz"

    maintainers = ["simonpintarelli"]

    license("BSD-3-Clause")

    version("develop", branch="develop")
    version("master", branch="master")

    version("1.0b", sha256="086c46f06a117f267cbdf1df4ad42a8512689a9610885763f463469fb15e82dc")
    version("0.9", sha256="8d5bc6b85ee714fb3d6480f767e7f43e5e7d569116cf60e48f533a7f50a37a08")

    variant("openmp", default=True, description="Use OpenMP")
    variant("tests", default=False, description="Build tests")
    variant(
        "build_type",
        default="Release",
        description="CMake build type",
        values=("Debug", "Release", "RelWithDebInfo"),
    )

    depends_on("cmake@3.21:", type="build")
    depends_on("mpi")
    depends_on("lapack")
    depends_on("kokkos~cuda~rocm", when="~cuda~rocm")
    depends_on("kokkos+openmp", when="+openmp")
    depends_on("googletest", type="build", when="+tests")
    depends_on("nlohmann-json")

    with when("@:0.9"):
        conflicts("+rocm")
        conflicts("^kokkos@4:")

    with when("+rocm"):
        variant("magma", default=True, description="Use magma eigenvalue solver (AMDGPU)")
        depends_on("magma+rocm", when="+magma")
        depends_on("kokkos+rocm")
        depends_on("rocblas")
        depends_on("rocsolver")

    for arch in CudaPackage.cuda_arch_values:
        depends_on(
            f"kokkos+cuda+cuda_lambda+wrapper cuda_arch={arch}",
            when=f"%gcc +cuda cuda_arch={arch}",
        )
        depends_on(f"kokkos+cuda cuda_arch={arch}", when=f"+cuda cuda_arch={arch}")

    def cmake_args(self):
        options = [
            self.define_from_variant("USE_OPENMP", "openmp"),
            self.define_from_variant("BUILD_TESTS", "tests"),
            self.define_from_variant("USE_ROCM", "rocm"),
            self.define_from_variant("USE_MAGMA", "magma"),
            self.define_from_variant("USE_CUDA", "cuda"),
        ]

        if self.spec["blas"].name in ["intel-mkl", "intel-parallel-studio"]:
            options += [self.define("LAPACK_VENDOR", "MKL")]
        elif self.spec["blas"].name in ["intel-oneapi-mkl"]:
            options += [self.define("LAPACK_VENDOR", "MKLONEAPI")]
        elif self.spec["blas"].name in ["openblas"]:
            options += [self.define("LAPACK_VENDOR", "OpenBLAS")]
        else:
            raise Exception("blas/lapack must be either openblas or mkl.")

        if "+cuda%gcc" in self.spec:
            options += [
                self.define(
                    "CMAKE_CXX_COMPILER", "{0}".format(self.spec["kokkos-nvcc-wrapper"].kokkos_cxx)
                )
            ]

        if "+cuda" in self.spec:
            cuda_archs = self.spec.variants["cuda_arch"].value
            if "@:0.9" in self.spec:
                cuda_flags = " ".join(
                    ["-gencode arch=compute_{0},code=sm_{0}".format(x) for x in cuda_archs]
                )
                options += [self.define("CMAKE_CUDA_FLAGS", cuda_flags)]
            else:
                options += [self.define("CMAKE_CUDA_ARCHITECTURES", cuda_archs)]

        if "^cuda+allow-unsupported-compilers" in self.spec:
            options += [self.define("CMAKE_CUDA_FLAGS", "--allow-unsupported-compiler")]

        if "+rocm" in self.spec:
            options.append(self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc))
            archs = ",".join(self.spec.variants["amdgpu_target"].value)
            options.append("-DHIP_HCC_FLAGS=--amdgpu-target={0}".format(archs))
            options.append(
                "-DCMAKE_CXX_FLAGS=--amdgpu-target={0} --offload-arch={0}".format(archs)
            )

        return options