diff options
-rw-r--r-- | var/spack/repos/builtin/packages/quantum-espresso/package.py | 103 |
1 files changed, 80 insertions, 23 deletions
diff --git a/var/spack/repos/builtin/packages/quantum-espresso/package.py b/var/spack/repos/builtin/packages/quantum-espresso/package.py index 7c1310ec31..05ae5c4c38 100644 --- a/var/spack/repos/builtin/packages/quantum-espresso/package.py +++ b/var/spack/repos/builtin/packages/quantum-espresso/package.py @@ -17,36 +17,49 @@ class QuantumEspresso(Package): """ homepage = 'http://quantum-espresso.org' - url = 'https://github.com/QEF/q-e/archive/qe-6.2.0.tar.gz' + url = 'https://gitlab.com/QEF/q-e/-/archive/qe-6.3/q-e-qe-6.3.tar.gz' + git = 'https://gitlab.com/QEF/q-e.git' + version('6.3', '1b67687d90d1d16781d566d44d14634c') + version('6.2.1', '769cc973382156bffd35254c3dbaf453') version('6.2.0', '972176a58d16ae8cf0c9a308479e2b97') version('6.1.0', '3fe861dcb5f6ec3d15f802319d5d801b') + version('6.0.0', 'd915f2faf69d0e499f8e1681c42cbfc9') version('5.4', '085f7e4de0952e266957bbc79563c54e') version('5.3', 'be3f8778e302cffb89258a5f936a7592') + version('develop', branch='develop') + version('latest-backports', branch='qe-6.3-backports') variant('mpi', default=True, description='Builds with mpi support') variant('openmp', default=False, description='Enables openMP support') variant('scalapack', default=True, description='Enables scalapack support') - variant('elpa', default=True, description='Uses elpa as an eigenvalue solver') + variant('elpa', default=False, description='Uses elpa as an eigenvalue solver') # Support for HDF5 has been added starting in version 6.1.0 and is # still experimental, therefore we default to False for the variant variant('hdf5', default=False, description='Builds with HDF5 support') + # Dependencies depends_on('blas') depends_on('lapack') + depends_on('fftw-api@3') depends_on('mpi', when='+mpi') depends_on('scalapack', when='+scalapack+mpi') - - depends_on('fftw+mpi', when='+mpi') - depends_on('fftw~mpi', when='~mpi') depends_on('elpa+openmp', when='+elpa+openmp') depends_on('elpa~openmp', when='+elpa~openmp') - depends_on('hdf5', when='+hdf5') + # Versions of HDF5 prior to 1.8.16 lead to QE runtime errors + depends_on('hdf5@1.8.16:+fortran', when='+hdf5') patch('dspev_drv_elpa.patch', when='@6.1.0:+elpa ^elpa@2016.05.004') patch('dspev_drv_elpa.patch', when='@6.1.0:+elpa ^elpa@2016.05.003') + # Conflicts + # MKL with 64-bit integers not supported. + conflicts( + '^intel-mkl+ilp64', + msg='Quantum ESPRESSO does not support MKL 64-bit integer variant' + ) + # We can't ask for scalapack or elpa if we don't want MPI conflicts( '+scalapack', @@ -60,30 +73,86 @@ class QuantumEspresso(Package): msg='elpa is a parallel library and needs MPI support' ) + # HDF5 support introduced in 6.1 but requires MPI, develop + # branch and future releases will support serial HDF5 + conflicts('+hdf5', when='@:6.0.0') + conflicts( + '+hdf5', + when='~mpi@6.1.0:6.3', + msg='HDF5 support only available with MPI for QE 6.1:6.3' + ) + # Elpa is formally supported by @:5.4.0, but QE configure searches # for it in the wrong folders (or tries to download it within # the build directory). Instead of patching Elpa to provide the # folder QE expects as a link, we issue a conflict here. conflicts('+elpa', when='@:5.4.0') - conflicts('+hdf5', when='@:5.4.0') # Spurious problems running in parallel the Makefile # generated by the configure parallel = False + # QE upstream patches + # QE 6.3 requires multiple patches to fix MKL detection + # There may still be problems on Mac with MKL detection + patch_url = 'https://gitlab.com/QEF/q-e/commit/0796e1b7c55c9361ecb6515a0979280e78865e36.diff' + patch_checksum = 'bc8c5b8523156cee002d97dab42a5976dffae20605da485a427b902a236d7e6b' + patch(patch_url, sha256=patch_checksum, when='@6.3:6.3.0') + + # QE 6.3 `make install` broken and a patch must be applied + patch_url = 'https://gitlab.com/QEF/q-e/commit/88e6558646dbbcfcafa5f3fa758217f6062ab91c.diff' + patch_checksum = 'b776890d008e16cca28c31299c62f47de0ba606b900b17cbc27c041f45e564ca' + patch(patch_url, sha256=patch_checksum, when='@6.3:6.3.0') + def install(self, spec, prefix): prefix_path = prefix.bin if '@:5.4.0' in spec else prefix options = ['-prefix={0}'.format(prefix_path)] if '+mpi' in spec: + mpi = spec['mpi'] options.append('--enable-parallel=yes') + options.append('MPIF90={0}'.format(mpi.mpifc)) else: options.append('--enable-parallel=no') if '+openmp' in spec: options.append('--enable-openmp') + # QE external BLAS, FFT, SCALAPACK detection is a bit tricky. + # More predictable to pass in the correct link line to QE. + # If external detection of BLAS, LAPACK and FFT fails, QE + # is supposed to revert to internal versions of these libraries + # instead -- but more likely it will pickup versions of these + # libraries found in its the system path, e.g. Red Hat or + # Ubuntu's FFTW3 package. + + # FFT + # FFT detection gets derailed if you pass into the CPPFLAGS, instead + # you need to pass it in the FFTW_INCLUDE and FFT_LIBS directory. + # QE supports an internal FFTW2, but only an external FFTW3 interface. + + if '^intel-mkl' in spec: + # A seperate FFT library is not needed when linking against MKL + options.append( + 'FFTW_INCLUDE={0}'.format(join_path(env['MKLROOT'], + 'include/fftw'))) + if '^fftw@3:' in spec: + fftw_prefix = spec['fftw'].prefix + options.append('FFTW_INCLUDE={0}'.format(fftw_prefix.include)) + fftw_ld_flags = spec['fftw'].libs.ld_flags + options.append('FFT_LIBS={0}'.format(fftw_ld_flags)) + + # External BLAS and LAPACK requires the correct link line into + # BLAS_LIBS, do no use LAPACK_LIBS as the autoconf scripts indicate + # that this variable is largely ignored/obsolete. + + # For many Spack packages, lapack.libs = blas.libs, hence it will + # appear twice in in link line but this is harmless + lapack_blas = spec['lapack'].libs + spec['blas'].libs + + options.append('BLAS_LIBS={0}'.format(lapack_blas.ld_flags)) + if '+scalapack' in spec: scalapack_option = 'intel' if '^intel-mkl' in spec else 'yes' options.append('--with-scalapack={0}'.format(scalapack_option)) @@ -109,18 +178,8 @@ class QuantumEspresso(Package): if '+hdf5' in spec: options.append('--with-hdf5={0}'.format(spec['hdf5'].prefix)) - # Add a list of directories to search - search_list = [] - for dependency_spec in spec.dependencies(): - search_list.extend([ - dependency_spec.prefix.lib, - dependency_spec.prefix.lib64 - ]) - - search_list = " ".join(search_list) - options.extend([ - 'LIBDIRS={0}'.format(search_list), + 'F77={0}'.format(env['SPACK_F77']), 'F90={0}'.format(env['SPACK_FC']), 'CC={0}'.format(env['SPACK_CC']) ]) @@ -139,11 +198,9 @@ class QuantumEspresso(Package): if '+hdf5' in spec: make_inc = join_path(self.stage.source_path, 'make.inc') hdf5_libs = ' '.join(spec['hdf5:hl,fortran'].libs) - filter_file( - 'HDF5_LIB([\s]*)=([\s\w\-\/.,]*)', - 'HDF5_LIB = {0}'.format(hdf5_libs), - make_inc - ) + filter_file(r'HDF5_LIB([\s]*)=([\s\w\-\/.,]*)', + 'HDF5_LIB = {0}'.format(hdf5_libs), + make_inc) make('all') |