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
|
# 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 Picsar(MakefilePackage):
"""PICSAR is a high performance library of optimized versions of the key
functionalities of the PIC loop.
"""
homepage = "https://picsar.net"
git = "https://bitbucket.org/berkeleylab/picsar.git"
license("BSD-3-Clause-LBNL")
version("develop", branch="master")
variant("prod", default=True, description="Production mode (without FFTW)")
variant(
"prod_spectral", default=False, description="Production mode with spectral solver and FFTW"
)
variant("debug", default=False, description="Debug mode")
variant("vtune", default=False, description="Vtune profiling")
variant("sde", default=False, description="sde profiling")
variant("map", default=False, description="Allinea Map profiling")
variant("library", default=False, description="Create static and dynamic library")
depends_on("mpi")
depends_on("fftw@3.0: +mpi", when="+prod_spectral")
parallel = False
def patch(self):
if "%arm" in self.spec:
filter_file(r"!\$OMP SIMD SAFELEN\(LVEC2\)", "", "src/diags/diags.F90")
@property
def build_targets(self):
targets = []
targets.append("FC={0}".format(self.spec["mpi"].mpifc))
targets.append("CC={0}".format(self.spec["mpi"].mpicc))
comp = "user"
vendors = {"%gcc": "gnu", "%intel": "intel"}
for key, value in vendors.items():
if self.spec.satisfies(key):
comp = value
targets.append("COMP={0}".format(comp))
if comp == "user":
targets.append("FARGS={0}{1}".format("-g -O3 ", self.compiler.openmp_flag))
if "+prod" in self.spec:
mode = "prod"
elif "+prod_spectral" in self.spec:
mode = "prod_spectral"
elif "+debug" in self.spec:
mode = "debug"
elif "+vtune" in self.spec:
mode = "vtune"
elif "+sde" in self.spec:
mode = "sde"
elif "+map" in self.spec:
mode = "map"
elif "+library" in self.spec:
mode = "library"
targets.append("MODE = {0}".format(mode))
targets.append("SYS = default")
if "%gcc" in self.spec:
targets.append(
"FARGS=-g -fbounds-check -O3 -fopenmp " "-JModules -fallow-argument-mismatch"
)
return targets
def install(self, spec, prefix):
mkdirp(prefix.docs)
install("README.md", prefix.docs)
mkdirp(prefix.bin)
install("fortran_bin/picsar", prefix.bin)
|