summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/cray-fftw/package.py
blob: 13526ecc61803b3e471991cf06997a59ab3dd7ba (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
# 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)

from spack.package import *


class CrayFftw(Package):
    """FFTW is a C subroutine library for computing the discrete Fourier
    transform (DFT) in one or more dimensions, of arbitrary input
    size, and of both real and complex data (as well as of even/odd
    data, i.e. the discrete cosine/sine transforms or DCT/DST).
    This package is a wrapper for Cray's version of FFTW.

    To install this package, list it as an external package in packages.yaml,
    and make sure to load the correct cray-fftw module. In some cases you
    need to load cray-mpich before cray-fftw.
    """

    homepage = "https://support.hpe.com/"
    has_code = False  # Skip attempts to fetch source that is not available

    maintainers("haampie", "lukebroskop")

    version("3.3.8.12")
    version("3.3.8.8")
    version("3.3.8.7")

    provides("fftw-api@3")

    variant(
        "precision",
        values=any_combination_of("float", "double")
        .prohibit_empty_set()
        .with_default("float,double"),
        description="Build the selected floating-point precision libraries",
    )

    variant("openmp", default=False, description="Enable OpenMP support.")
    variant("mpi", default=True, description="Activate MPI support")
    depends_on("mpi", when="+mpi")

    def install(self, spec, prefix):
        raise InstallError(
            self.spec.format(
                "{name} is not installable, you need to specify "
                "it as an external package in packages.yaml"
            )
        )

    @property
    def libs(self):
        # Reduce repetitions of entries
        query_parameters = list(llnl.util.lang.dedupe(self.spec.last_query.extra_parameters))

        # List of all the suffixes associated with float precisions
        precisions = [("float", "f"), ("double", "")]

        # Retrieve the correct suffixes, or use double as a default
        suffixes = [v for k, v in precisions if k in query_parameters] or [""]

        # Construct the list of libraries that needs to be found
        libraries = []
        for sfx in suffixes:
            if "mpi" in query_parameters and "+mpi" in self.spec:
                libraries.append("libfftw3" + sfx + "_mpi")

            if "openmp" in query_parameters and "+openmp" in self.spec:
                libraries.append("libfftw3" + sfx + "_omp")

            libraries.append("libfftw3" + sfx)

        return find_libraries(libraries, root=self.prefix, recursive=True)