From 8dff43b8ea41886e5983f283f178763cbb23eb45 Mon Sep 17 00:00:00 2001 From: permeakra Date: Tue, 10 Aug 2021 17:51:45 +0300 Subject: 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 --- var/spack/repos/builtin/packages/elk/package.py | 153 +++++++++++++++++------- 1 file changed, 107 insertions(+), 46 deletions(-) diff --git a/var/spack/repos/builtin/packages/elk/package.py b/var/spack/repos/builtin/packages/elk/package.py index 3d2aa767fd..8bcfbb5316 100644 --- a/var/spack/repos/builtin/packages/elk/package.py +++ b/var/spack/repos/builtin/packages/elk/package.py @@ -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') - - # 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') - - # Elk does not provide these libraries, but allows you to use them - variant('mpi', default=True, + 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) + + # 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. + + 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 @@ class Elk(MakefilePackage): config['F90_OPTS'] = flags config['F77_OPTS'] = flags + if '+mpi' in spec: + config['F90'] = spec['mpi'].mpifc + config['F77'] = spec['mpi'].mpif77 + config['SRC_MPI'] = ' ' + + # 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: BLAS/LAPACK must be compiled with OpenMP support + # Note: openblas must be compiled with OpenMP support # if the +openmp variant is chosen - blas = 'blas.a' - lapack = 'lapack.a' - if '+blas' in spec: + if 'linalg=generic' 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]) - - # FFT support - if '+fft' in spec: - config['LIB_FFT'] = join_path(spec['fftw'].prefix.lib, - 'libfftw3.so') + 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 @@ class Elk(MakefilePackage): 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 @@ class Elk(MakefilePackage): 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: -- cgit v1.2.3-60-g2f50