Elk update (#24432)

* elk package updated to handle 3 latest versions support for older
versions is dropped

* fixed typos

* openmp dependency handling added

* and for blis too

* Retain support for elk 3, deprecate

Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com>
This commit is contained in:
permeakra 2021-08-10 17:51:45 +03:00 committed by GitHub
parent d3f67a4855
commit 8dff43b8ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -10,44 +10,96 @@ class Elk(MakefilePackage):
"""An all-electron full-potential linearised augmented-plane wave
(FP-LAPW) code with many advanced features."""
homepage = 'http://elk.sourceforge.net/'
homepage = 'https://elk.sourceforge.io/'
url = 'https://sourceforge.net/projects/elk/files/elk-3.3.17.tgz'
version('3.3.17', sha256='c9b87ae4ef367ed43afc2d43eb961745668e40670995e8e24c13db41b7e85d73')
version('7.2.42', sha256='73f03776dbf9b2147bfcc5b7c062af5befa0944608f6fc4b6a1e590615400fc6')
version('7.1.14', sha256='7c2ff30f4b1d72d5dc116de9d70761f2c206700c69d85dd82a17a5a6374453d2')
version('7.0.12', sha256='9995387c681d0e5a9bd52cb274530b23c0370468b6be86f6c90a6ec445cb8a01')
version('3.3.17', sha256='c9b87ae4ef367ed43afc2d43eb961745668e40670995e8e24c13db41b7e85d73', deprecated=True)
# Elk provides these libraries, but allows you to specify your own
variant('blas', default=True,
description='Build with custom BLAS library')
variant('lapack', default=True,
description='Build with custom LAPACK library')
variant('fft', default=True,
description='Build with custom FFT library')
# what linear algebra packages to use? the choices are
# internal - use internal libraries
# generic - use spack-provided blas and lapack
# openblas - use openblas specifically, with special support for multithreading.
# mkl - use mkl specifically, with special support for multithreading
# should be used with fft=mkl
# blis - use internal lapack and blas implementation from blis
variant('linalg', default='internal', multi=False,
description='Build with custom BLAS library',
values=('internal', 'generic', 'openblas', 'mkl', 'blis'))
# what FFT package to use? The choices are
# internal - use internal library
# fftw - fftw3 with special code
# mkl - use mklr with fft code
# should be used with linalg=mkls
variant('fft', default='internal', multi=False,
description='Build with custom FFT library',
values=('internal', 'fftw', 'mkl'))
# check that if fft=mkl then linalg=mkl and vice versa.
# Elk does not provide these libraries, but allows you to use them
variant('mpi', default=True,
conflicts('linalg=mkl', when='fft=fftw')
conflicts('linalg=mkl', when='fft=internal')
conflicts('linalg=blis', when='@:3')
conflicts('fft=mkl', when='linalg=internal')
conflicts('fft=mkl', when='linalg=generic')
conflicts('fft=mkl', when='linalg=openblas')
conflicts('fft=mkl', when='linalg=blis')
variant('mpi', default=True,
description='Enable MPI parallelism')
variant('openmp', default=True,
description='Enable OpenMP support')
variant('libxc', default=True,
description='Link to Libxc functional library')
variant('w90', default=False,
description='wannier90 support, requires wannier90 library')
depends_on('blas', when='linalg=generic')
depends_on('lapack', when='linalg=generic')
depends_on('mkl', when='linalg=mkl')
depends_on('mkl threads=openmp', when='linalg=mkl +openmp')
depends_on('openblas', when='linalg=openblas')
depends_on('openblas threads=openmp', when='linalg=openblas +openmp')
depends_on('blis', when='linalg=blis')
depends_on('blis threads=openmp', when='linalg=blis +openmp')
depends_on('fftw', when='fft=fftw')
depends_on('fftw +openmp', when='fft=fftw +openmp')
depends_on('mkl', when='fft=mkl')
depends_on('blas', when='+blas')
depends_on('lapack', when='+lapack')
depends_on('fftw', when='+fft')
depends_on('mpi@2:', when='+mpi')
depends_on('libxc', when='+libxc')
depends_on('libxc@5:', when='@7:+libxc')
depends_on('libxc@:3', when='@:3+libxc')
depends_on('wannier90', when='+w90')
# Cannot be built in parallel
parallel = False
def edit(self, spec, prefix):
# Dictionary of configuration options
# Dictionary of configuration options with default values assigned
config = {
'MAKE': 'make',
'AR': 'ar'
}
'MAKE': 'make',
'AR': 'ar',
'LIB_LPK': 'lapack.a blas.a',
'LIB_FFT': 'fftlib.a',
'SRC_MPI': 'mpi_stub.f90',
'SRC_MKL': 'mkl_stub.f90',
'SRC_OBLAS': 'oblas_stub.f90',
'SRC_OMP': 'omp_stub.f90',
'SRC_BLIS': 'blis_stub.f90',
'SRC_libxc': 'libxcifc_stub.f90',
'SRC_FFT': 'zfftifc.f90',
'SRC_W90S': 'w90_stub.f90',
'F90': spack_fc,
'F77': spack_f77
}
# Compiler-specific flags
flags = ''
if self.compiler.name == 'intel':
flags = '-O3 -ip -unroll -no-prec-div'
@ -64,26 +116,40 @@ def edit(self, spec, prefix):
config['F90_OPTS'] = flags
config['F77_OPTS'] = flags
# BLAS/LAPACK support
# Note: BLAS/LAPACK must be compiled with OpenMP support
# if the +openmp variant is chosen
blas = 'blas.a'
lapack = 'lapack.a'
if '+blas' in spec:
blas = spec['blas'].libs.joined()
if '+lapack' in spec:
lapack = spec['lapack'].libs.joined()
# lapack must come before blas
config['LIB_LPK'] = ' '.join([lapack, blas])
if '+mpi' in spec:
config['F90'] = spec['mpi'].mpifc
config['F77'] = spec['mpi'].mpif77
config['SRC_MPI'] = ' '
# FFT support
if '+fft' in spec:
config['LIB_FFT'] = join_path(spec['fftw'].prefix.lib,
'libfftw3.so')
# OpenMP support
if '+openmp' in spec:
config['F90_OPTS'] += ' ' + self.compiler.openmp_flag
config['F77_OPTS'] += ' ' + self.compiler.openmp_flag
config['SRC_OMP'] = ' '
# BLAS/LAPACK support
# Note: openblas must be compiled with OpenMP support
# if the +openmp variant is chosen
if 'linalg=generic' in spec:
blas = spec['blas'].libs.joined()
lapack = spec['lapack'].libs.joined()
config['LIB_LPK'] = ' '.join([lapack, blas])
if 'linalg=openblas' in spec:
config['LIB_LPK'] = spec['openblas'].libs.ld_flags
config['SRC_OBLAS'] = ' '
if 'linalg=mkl' in spec:
config['LIB_LPK'] = spec['mkl'].libs.ld_flags
config['SRC_MKL'] = ' '
if 'linalg=blis' in spec:
config['LIB_LPK'] = ' '.join(['lapack.a ', spec['blis'].libs.ld_flags])
config['SRC_BLIS'] = ' '
# FFT
if 'fft=fftw' in spec:
config['LIB_FFT'] = spec['fftw'].libs.ld_flags
config['SRC_FFT'] = 'zfftifc_fftw.f90'
else:
config['LIB_FFT'] = 'fftlib.a'
config['SRC_FFT'] = 'zfftifc.f90'
if 'fftw=mkl' in spec:
config['LIB_FFT'] = spec['mkl'].libs.ld_flags
config['SRC_FFT'] = ' '
# MPI support
if '+mpi' in spec:
@ -93,13 +159,11 @@ def edit(self, spec, prefix):
config['F90'] = spack_fc
config['F77'] = spack_f77
config['SRC_MPI'] = 'mpi_stub.f90'
# OpenMP support
if '+openmp' in spec:
config['F90_OPTS'] += ' ' + self.compiler.openmp_flag
config['F77_OPTS'] += ' ' + self.compiler.openmp_flag
else:
config['SRC_OMP'] = 'omp_stub.f90'
config['SRC_OMP'] = ' '
# Libxc support
if '+libxc' in spec:
@ -107,13 +171,10 @@ def edit(self, spec, prefix):
join_path(spec['libxc'].prefix.lib, 'libxcf90.so'),
join_path(spec['libxc'].prefix.lib, 'libxc.so')
])
config['SRC_libxc'] = ' '.join([
'libxc_funcs.f90',
'libxc.f90',
'libxcifc.f90'
])
else:
config['SRC_libxc'] = 'libxcifc_stub.f90'
if self.spec.satisfies('@7:'):
config['SRC_libxc'] = 'libxcf90.f90 libxcifc.f90'
else:
config['SRC_libxc'] = 'libxc_funcs.f90 libxc.f90 libxcifc.f90'
# Write configuration options to include file
with open('make.inc', 'w') as inc: