summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/openmx/package.py
blob: 66b70d6ff058f5acb761b3d492108afe855c3468 (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
# Copyright 2013-2022 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 Openmx(MakefilePackage):
    """OpenMX (Open source package for Material eXplorer) is a software
    package for nano-scale material simulations based on density functional
    theories (DFT), norm-conserving pseudopotentials, and pseudo-atomic
    localized basis functions.
    """

    homepage = "http://www.openmx-square.org/index.html"
    url = "https://t-ozaki.issp.u-tokyo.ac.jp/openmx3.8.tar.gz"

    version('3.9', sha256='27bb56bd4d1582d33ad32108fb239b546bdd1bdffd6f5b739b4423da1ab93ae2')
    version('3.8', sha256='36ee10d8b1587b25a2ca1d57f110111be65c4fb4dc820e6d93e1ed2b562634a1')

    resource(name='patch',
             url='http://www.openmx-square.org/bugfixed/18June12/patch3.8.5.tar.gz',
             sha256='d0fea2ce956d796a87a4bc9e9d580fb115ff2a22764650fffa78bb79a1b30468',
             placement='patch',
             when='@3.8')

    resource(name='patch',
             url='http://www.openmx-square.org/bugfixed/21Oct17/patch3.9.9.tar.gz',
             sha256='20cccc4e3412a814a53568f400260e90f79f0bfb7e2bed84447fe071b26edd38',
             placement='patch',
             when='@3.9')

    depends_on('mpi')
    depends_on('fftw-api@3')
    depends_on('scalapack')
    depends_on('sse2neon', when='target=aarch64:')

    patch('for_aarch64.patch', when='@3.8 target=aarch64:')

    parallel = False

    build_directory = 'source'

    def edit(self, spec, prefix):
        # Move contents to source/
        # http://www.openmx-square.org/bugfixed/18June12/README.txt
        copy_tree('patch', 'source')
        # Move extra file for 3.9 patch
        # http://www.openmx-square.org/bugfixed/21Oct17/README.txt
        if spec.satisfies('@3.9'):
            copy(join_path('source', 'kpoint.in'), 'work')
        makefile = FileFilter('./source/makefile')
        makefile.filter('^DESTDIR.*$', 'DESTDIR = {0}/bin'.format(prefix))
        mkdirp(prefix.bin)

    @property
    def common_arguments(self):
        spec, common_option = self.spec, []
        lapack_blas_libs = (
            spec['lapack'].libs +
            spec['blas'].libs +
            spec['scalapack'].libs
        )
        cc_option = [
            spec['mpi'].mpicc,
            self.compiler.openmp_flag,
            spec['fftw-api'].headers.include_flags
        ]
        fc_option = [spec['mpi'].mpifc]
        lib_option = [
            spec['fftw-api'].libs.ld_flags,
            lapack_blas_libs.ld_flags,
            '-lmpi_mpifh'
        ]
        if spec.satisfies('@3.8'):
            cc_option.append('-I$(LIBERIDIR)')
        if spec.satisfies('@3.9'):
            lib_option.extend(['-lmpi_usempif08'])
            lib_option.extend(['-lmpi_usempi_ignore_tkr'])

        if '%fj' in spec:
            common_option.append('-Dkcomp  -Kfast')
            cc_option.append('-Dnosse -Nclang')
            fc_option.append(self.compiler.openmp_flag)
        else:
            common_option.append('-O3')
            if '%gcc' in spec:
                lib_option.append('-lgfortran')
                if spec.satisfies('%gcc@10:'):
                    fc_option.append('-fallow-argument-mismatch')
                    cc_option.append('-fcommon')

        return [
            'CC={0} -Dscalapack {1} '.format(
                ' '.join(cc_option), ' '.join(common_option)
            ),
            'FC={0} {1}'.format(' '.join(fc_option), ' '.join(common_option)),
            'LIB={0}'.format(' '.join(lib_option))
        ]

    @property
    def build_targets(self):
        return ['all'] + self.common_arguments

    @property
    def install_targets(self):
        return ['all'] + self.common_arguments