summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/cloverleaf/package.py
blob: 45324afc99ec44593812a4fd1744d986ff48afe6 (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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# 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 Cloverleaf(MakefilePackage):
    """Proxy Application. CloverLeaf is a miniapp that solves the
    compressible Euler equations on a Cartesian grid,
    using an explicit, second-order accurate method.
    """

    homepage = "https://uk-mac.github.io/CloverLeaf"
    url = "https://downloads.mantevo.org/releaseTarballs/miniapps/CloverLeaf/CloverLeaf-1.1.tar.gz"
    git = "https://github.com/UK-MAC/CloverLeaf.git"

    tags = ["proxy-app"]

    license("LGPL-3.0-or-later")

    version("master", branch="master", submodules=True)
    version("1.1", sha256="de87f7ee6b917e6b3d243ccbbe620370c62df890e3ef7bdbab46569b57be132f")

    variant(
        "build",
        default="ref",
        description="Type of Parallelism Build",
        values=("cuda", "mpi_only", "openacc_cray", "openmp_only", "ref", "serial"),
    )
    variant("ieee", default=False, description="Build with IEEE standards")
    variant("debug", default=False, description="Build with DEBUG flags")

    depends_on("mpi", when="build=cuda")
    depends_on("mpi", when="build=mpi_only")
    depends_on("mpi", when="build=openacc_cray")
    depends_on("mpi", when="build=ref")
    depends_on("cuda", when="build=cuda")

    conflicts("build=cuda", when="%aocc", msg="Currently AOCC supports only ref variant")
    conflicts("build=openacc_cray", when="%aocc", msg="Currently AOCC supports only ref variant")
    conflicts("build=serial", when="%aocc", msg="Currently AOCC supports only ref variant")
    conflicts("@1.1", when="%aocc", msg="AOCC support is provided from version v.1.3 and above")

    @run_before("build")
    def patch_for_reference_module(self):
        if self.spec.satisfies("@master %aocc"):
            fp = join_path(self.package_dir, "aocc_support.patch")
            which("patch")("-s", "-p0", "-i", "{0}".format(fp), "-d", ".")

    @property
    def type_of_build(self):
        build = "ref"

        if "build=cuda" in self.spec:
            build = "CUDA"
        elif "build=mpi_only" in self.spec:
            build = "MPI"
        elif "build=openacc_cray" in self.spec:
            build = "OpenACC_CRAY"
        elif "build=openmp_only" in self.spec:
            build = "OpenMP"
        elif "build=serial" in self.spec:
            build = "Serial"

        return build

    @property
    def build_targets(self):
        targets = ["--directory=CloverLeaf_{0}".format(self.type_of_build)]

        if "mpi" in self.spec:
            targets.append("MPI_COMPILER={0}".format(self.spec["mpi"].mpifc))
            targets.append("C_MPI_COMPILER={0}".format(self.spec["mpi"].mpicc))
        else:
            targets.append("MPI_COMPILER=f90")
            targets.append("C_MPI_COMPILER=cc")

        if "%gcc" in self.spec:
            targets.append("COMPILER=GNU")
            targets.append("FLAGS_GNU=")
            targets.append("CFLAGS_GNU=")
        elif "%cce" in self.spec:
            targets.append("COMPILER=CRAY")
            targets.append("FLAGS_CRAY=")
            targets.append("CFLAGS_CRAY=")
        elif "%intel" in self.spec:
            targets.append("COMPILER=INTEL")
            targets.append("FLAGS_INTEL=")
            targets.append("CFLAGS_INTEL=")
        elif "%aocc" in self.spec:
            targets.append("COMPILER=AOCC")
        elif "%pgi" in self.spec:
            targets.append("COMPILER=PGI")
            targets.append("FLAGS_PGI=")
            targets.append("CFLAGS_PGI=")
        elif "%xl" in self.spec:
            targets.append("COMPILER=XLF")
            targets.append("FLAGS_XLF=")
            targets.append("CFLAGS_XLF=")

        # Explicit mention of else clause is not working as expected
        # So, not mentioning them
        if "+debug" in self.spec:
            targets.append("DEBUG=1")

        if "+ieee" in self.spec:
            targets.append("IEEE=1")

        return targets

    def install(self, spec, prefix):
        # Manual Installation
        mkdirp(prefix.bin)
        mkdirp(prefix.doc.tests)

        install("README.md", prefix.doc)
        install("documentation.txt", prefix.doc)

        install("CloverLeaf_{0}/clover_leaf".format(self.type_of_build), prefix.bin)
        install("CloverLeaf_{0}/clover.in".format(self.type_of_build), prefix.bin)
        install("CloverLeaf_{0}/*.in".format(self.type_of_build), prefix.doc.tests)