From a36a5ab6242c0fa9676ae36c0d0987e263a47133 Mon Sep 17 00:00:00 2001 From: Daniele Cesarini Date: Tue, 12 Oct 2021 02:31:23 +0200 Subject: fleur: new package (#26631) --- var/spack/repos/builtin/packages/fleur/package.py | 182 ++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 var/spack/repos/builtin/packages/fleur/package.py diff --git a/var/spack/repos/builtin/packages/fleur/package.py b/var/spack/repos/builtin/packages/fleur/package.py new file mode 100644 index 0000000000..804c7e0628 --- /dev/null +++ b/var/spack/repos/builtin/packages/fleur/package.py @@ -0,0 +1,182 @@ +# Copyright 2013-2021 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 import * + + +class Fleur(Package): + """FLEUR (Full-potential Linearised augmented plane wave in EURope) + is a code family for calculating groundstate as well as excited-state properties + of solids within the context of density functional theory (DFT).""" + + homepage = "https://www.flapw.de/MaX-5.1" + git = "https://iffgit.fz-juelich.de/fleur/fleur.git" + + version('develop', branch='develop') + version('5.1', tag='MaX-R5.1') + version('5.0', tag='MaX-R5') + version('4.0', tag='MaX-R4') + version('3.1', tag='MaX-R3.1') + + variant('mpi', default=True, description='Enable MPI support') + variant('hdf5', default=False, description='Enable HDF5 support') + variant('scalapack', default=False, description='Enable SCALAPACK') + variant('fft', default='internal', values=('internal', 'mkl', 'fftw'), + description="Enable the use of Intel MKL FFT/FFTW provider") + variant('elpa', default=False, description="Enable ELPA support") + variant('magma', default=False, description='Enable Magma support') + variant('external_libxc', default=False, description='Enable external libxc support') + variant('spfft', default=False, description='Enable spfft support') + variant('wannier90', default=False, description='Enable wannier90 support') + variant('openmp', default=False, description="Enable OpenMP support.") + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo')) + + depends_on('cmake', type='build') + depends_on('python@3:', type='build') + depends_on('blas') + depends_on('lapack') + depends_on('libxml2') + depends_on('mpi', when='+mpi') + depends_on('intel-mkl', when="fft=mkl") + depends_on('fftw-api', when='fft=fftw') + depends_on('scalapack', when='+scalapack') + depends_on('libxc', when='+external_libxc') + depends_on('hdf5+hl+fortran', when='+hdf5') + depends_on('magma+fortran', when='+magma') + depends_on('wannier90', when='+wannier90') + depends_on('spfft+fortran~openmp', when='+spfft~openmp') + depends_on('spfft+fortran+openmp', when='+spfft+openmp') + depends_on('elpa~openmp', when='+elpa~openmp') + depends_on('elpa+openmp', when='+elpa+openmp') + + phases = ['configure', 'build', 'install'] + + conflicts('%intel@:16.0.4', + msg='ifort version <16.0 will most probably not work correctly') + conflicts('%gcc@:6.3.0', + msg='gfortran is known to work with versions newer than v6.3') + conflicts('%pgi@:18.4.0', + msg='You need at least PGI version 18.4 \ + but might still run into some problems.') + conflicts('~scalapack', when='+elpa', + msg='ELPA requires scalapack support') + conflicts('@:5.0', when='fft=fftw', + msg='FFTW interface is supported from Fleur v5.0') + conflicts('@:5.0', when='+wannier90', + msg='wannier90 is supported from Fleur v5.0') + conflicts('@:4.0', when='+spfft', + msg='SpFFT is supported from Fleur v4.0') + conflicts('@:4.0', when='+external_libxc', + msg='External libxc is supported from Fleur v4.0') + + def setup_build_environment(self, env): + spec = self.spec + + if '+mpi' in spec: + env.set('CC', spec['mpi'].mpicc, force=True) + env.set('FC', spec['mpi'].mpifc, force=True) + env.set('CXX', spec['mpi'].mpicxx, force=True) + + def configure(self, spec, prefix): + spec = self.spec + sh = which('bash') + + options = { + "-link": [], + "-libdir": [], + "-includedir": [], + # "-flags": [] + } + + options["-link"].append(spec['blas'].libs.link_flags) + options["-libdir"].append(spec['blas'].prefix.lib) + options["-includedir"].append(spec['blas'].prefix.include) + + options["-link"].append(spec['lapack'].libs.link_flags) + options["-libdir"].append(spec['lapack'].prefix.lib) + options["-includedir"].append(spec['lapack'].prefix.include) + + options["-link"].append(spec['libxml2'].libs.link_flags) + options["-libdir"].append(spec['libxml2'].prefix.lib) + options["-includedir"].append(spec['libxml2'].prefix.include) + options["-includedir"].append( + join_path(spec['libxml2'].prefix.include, "libxml2") + ) + + if 'fft=mkl' in spec: + options["-link"].append(spec['intel-mkl'].libs.link_flags) + options["-libdir"].append(spec['intel-mkl'].prefix.lib) + options["-includedir"].append(spec['intel-mkl'].prefix.include) + if 'fft=fftw' in spec: + options["-link"].append(spec['fftw-api'].libs.link_flags) + options["-libdir"].append(spec['fftw-api'].prefix.lib) + options["-includedir"].append(spec['fftw-api'].prefix.include) + if '+scalapack' in spec: + options["-link"].append(spec['scalapack'].libs.link_flags) + options["-libdir"].append(spec['scalapack'].prefix.lib) + if '+external_libxc' in spec: + # Workaround: The fortran library is called libxcf90.a/so + # but spec['wannier90'].libs.link_flags return -lxc + options["-link"].append('-lxcf90') + options["-libdir"].append(spec['libxc'].prefix.lib) + options["-includedir"].append(spec['libxc'].prefix.include) + if '+hdf5' in spec: + options["-link"].append(spec['hdf5'].libs.link_flags) + options["-libdir"].append(spec['hdf5'].prefix.lib) + options["-includedir"].append(spec['hdf5'].prefix.include) + if '+magma' in spec: + options["-link"].append(spec['magma'].libs.link_flags) + options["-libdir"].append(spec['magma'].prefix.lib) + options["-includedir"].append(spec['magma'].prefix.include) + if '+wannier90' in spec: + # Workaround: The library is not called wannier90.a/so + # for this reason spec['wannier90'].libs.link_flags fails! + options["-link"].append('-lwannier') + options["-libdir"].append(spec['wannier90'].prefix.lib) + if '+spfft' in spec: + options["-link"].append(spec['spfft'].libs.link_flags) + # Workaround: The library is installed in /lib64 not /lib + options["-libdir"].append(spec['spfft'].prefix.lib + "64") + # Workaround: The library needs spfft.mod in include/spfft path + options["-includedir"].append( + join_path(spec['spfft'].prefix.include, "spfft") + ) + if '+elpa' in spec: + options["-link"].append(spec['elpa'].libs.link_flags) + options["-libdir"].append(spec['elpa'].prefix.lib) + # Workaround: The library needs elpa.mod in include/elpa_%VERS/modules + options["-includedir"].append(spec['elpa'].prefix.include) + options["-includedir"].append(spec['elpa'].headers.include_flags[2:]) + options["-includedir"].append( + join_path(spec['elpa'].headers.include_flags[2:], "modules") + ) + + args = [] + args.append("-link") + args.append(" ".join(options["-link"])) + args.append("-libdir") + args.append(" ".join(options["-libdir"])) + args.append("-includedir") + args.append(" ".join(options["-includedir"])) + # args.append("-flags") + # args.append(" ".join(options["-flags"])) + + sh('configure.sh', *args) + + def build(self, spec, prefix): + with working_dir('build'): + make() + + def install(self, spec, prefix): + with working_dir('build'): + # copy bin + mkdirp(prefix.bin) + if '+mpi' in spec: + install('fleur_MPI', prefix.bin) + else: + install('fleur', prefix.bin) + install('inpgen', prefix.bin) -- cgit v1.2.3-70-g09d2