summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/mumax/package.py
blob: 00d9bed849bf5484acd814514cf6d2f62e41847f (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
# 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)

import os
import shutil

from spack.package import *


class Mumax(MakefilePackage, CudaPackage):
    """GPU accelerated micromagnetic simulator."""

    homepage = "https://mumax.github.io"
    url = "https://github.com/mumax/3/archive/v3.10.tar.gz"

    license("CC-BY-3.0")

    version(
        "3.10",
        sha256="42c858661cec3896685ff4babea11e711f71fd6ea37d20c2bed7e4a918702caa",
        preferred=True,
    )
    version(
        "3.10beta",
        sha256="f20fbd90a4b531fe5a0d8acc3d4505a092a5e426f5f53218a22a87d445daf0e9",
        url="https://github.com/mumax/3/archive/3.10beta.tar.gz",
    )

    variant("cuda", default=True, description="Use CUDA; must be true")
    variant("gnuplot", default=False, description="Use gnuplot for graphs")

    depends_on("cuda")
    depends_on("go", type="build")
    depends_on("gnuplot", type="run", when="+gnuplot")

    conflicts("~cuda", msg="mumax requires cuda")

    patch(
        "https://github.com/mumax/3/commit/2cf5c9a6985c9eb16a124c6bd96aed75b4a30c24.patch?full_index=1",
        sha256="4bbb95aacdac7e2cbcb37ee8adcfb9464e69965f984c264ff094dc1cca10589b",
        when="@3.10beta",
    )

    @property
    def cuda_arch(self):
        cuda_arch = " ".join(self.spec.variants["cuda_arch"].value)
        if cuda_arch == "none":
            raise InstallError("Must select at least one value for cuda_arch")
        return cuda_arch

    @property
    def gopath(self):
        return self.stage.path

    @property
    def mumax_gopath_dir(self):
        return join_path(self.gopath, "src/github.com/mumax/3")

    def do_stage(self, mirror_only=False):
        super().do_stage(mirror_only)
        if not os.path.exists(self.mumax_gopath_dir):
            # Need to move source to $GOPATH and then symlink the original
            # stage directory
            shutil.move(self.stage.source_path, self.mumax_gopath_dir)
            force_symlink(self.mumax_gopath_dir, self.stage.source_path)

    # filter out targets that do not exist
    def edit(self, spec, prefix):
        filter_file(r"(^all: cudakernels) hooks$", r"\1", "Makefile")

    @when("@3.10beta")
    def edit(self, spec, prefix):
        filter_file(r"(^ln -sf .*)", r"#\1", "make.bash")
        filter_file(r"(^\(cd test)", r"#\1", "make.bash")
        filter_file(r"(for cc in ).*(; do)", r"\1{0}\2".format(self.cuda_arch), "cuda/make.bash")

    def setup_build_environment(self, env):
        env.prepend_path("GOPATH", self.gopath)
        env.set("CUDA_CC", self.cuda_arch)
        env.set("NVCC_CCBIN", spack_cc)

    def install(self, spec, prefix):
        go("mod init github.com/mumax/3")
        make()
        with working_dir(self.gopath):
            install_tree("bin", prefix.bin)