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 Conquest(MakefilePackage):
"""CONQUEST is a DFT code designed for large-scale calculations,
with excellent parallelisation."""
homepage = "http://www.order-n.org/"
url = "https://github.com/OrderN/CONQUEST-release/releases/download/v1.2/CONQUEST-release-1.2.tar.gz"
git = "https://github.com/OrderN/CONQUEST-release/"
# notify when the package is updated.
maintainers("davidbowler", "tkoskela", "ilectra")
license("MIT")
version("1.2", sha256="74d974f20ec15ff31d97cd42aae6dbe95288eedfa785896d5872b9ff44ee7ae2")
version("1.1", sha256="772e058f073cccfee45521aa62bb13192ab07cb2979b6076ddbf21ba22f9ba5d")
version("master", branch="master")
version("develop", branch="develop")
depends_on("blas")
depends_on("lapack")
depends_on("scalapack")
depends_on("fftw-api")
depends_on("libxc@:5")
depends_on("mpi")
variant("openmp", default=False, description="Build with OpenMP support")
variant(
"mult_kern",
default="default",
values=[
"default",
"gemm",
"ompDoii",
"ompDoik",
"ompDoji",
"ompDojk",
"ompGemm",
"ompGemm_m",
"ompTsk",
],
description="Matrix multiplication kernel type",
)
build_directory = "src"
# The SYSTEM variable is required above version 1.2.
# Versions 1.2 and older should ignore it.
@property
def build_targets(self):
if self.version > Version("1.2"):
return ["SYSTEM = example", "Conquest"]
else:
return ["Conquest"]
def edit(self, spec, prefix):
fflags = "-O3 -fallow-argument-mismatch"
ldflags = ""
if "+openmp" in self.spec:
fflags += " " + self.compiler.openmp_flag
ldflags += " " + self.compiler.openmp_flag
libxc = self.spec["libxc:fortran"]
fflags += " " + libxc.headers.include_flags
ldflags += " " + self.spec["scalapack"].libs.ld_flags
lapack_ld = self.spec["lapack"].libs.ld_flags
blas_ld = self.spec["blas"].libs.ld_flags
fftw_ld = self.spec["fftw"].libs.ld_flags
libxc_ld = self.spec["libxc"].libs.ld_flags
# Starting from 1.3 there's automated logic in the Makefile that picks
# from a list of possible files for system/compiler-specific definitions.
# This is useful for manual builds, but since the spack will do its own
# automation of compiler-specific flags, we will override it.
if self.version > Version("1.2"):
defs_file = FileFilter("./src/system/system.example.make")
else:
defs_file = FileFilter("./src/system.make")
defs_file.filter(".*COMPFLAGS=.*", f"COMPFLAGS= {fflags}")
defs_file.filter(".*LINKFLAGS=.*", f"LINKFLAGS= {ldflags}")
defs_file.filter(".*BLAS=.*", f"BLAS= {lapack_ld} {blas_ld}")
defs_file.filter(".*FFT_LIB=.*", f"FFT_LIB={fftw_ld}")
defs_file.filter(".*XC_LIB=.*", f"XC_LIB={libxc_ld} -lxcf90 -lxc")
if "+openmp" in self.spec:
defs_file.filter("OMP_DUMMY = DUMMY", "OMP_DUMMY = ")
if self.spec.variants["mult_kern"].value != "default":
defs_file.filter(
"MULT_KERN =.*", f"MULT_KERN = {self.spec.variants['mult_kern'].value}"
)
def install(self, spec, prefix):
mkdirp(prefix.bin)
install("./bin/Conquest", prefix.bin)
if self.version > Version("1.2"):
install_tree("./benchmarks/", join_path(prefix, "benchmarks"))
|