summaryrefslogtreecommitdiff
path: root/var
diff options
context:
space:
mode:
Diffstat (limited to 'var')
-rw-r--r--var/spack/repos/builtin/packages/quantum-espresso/package.py103
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')