Quantum ESPRESSO update - Nov 2018 (#9853)

* Add mising QE releases.

* Update QE dependencies and conflicts.

* QE 6.3 install method requires a patch to work properly.

* include QE git develop branch

* QE HDF5 needs Fortran support. HDF5 versions prior to 1.8.16 leads to QE runtime errors.

* Number of MKL related conflicts for QE.

* Flake8 fixes for QE for hdf5 lines.

* Pass in all compilers properly to QE configure

* Fixed external BLAS/LAPACK linkage in QE.

* Library search was problematic in QE.

* Add section headings to QE package.

* External FFTW compatible libraries properly detected in QE.

* Flake8 fixes for QE

* QE configure defaults to False for ELPA, thus Spack package should as well.

* QE depends on FFTW3 provider instead of FFTW explictly.

* Primary QE repo is gitlab.com, not github.com. Github mirror lags behind gitlab site.

* Support both 6.3-backports branch and develop branch in QE.

* QE patch needed for proper MKL detection. MKL_ROOT is detected and preferred, still falls back to finding first MKL installation in /opt/intel.

* Use FFTW-API provider versioned interface for specify QE FFT dependency.

* QE FFTW conflicts no longer need thanks to FFTW-API provider versioned interface.

* Flake8 3.6.0 fix in support of https://github.com/spack/spack/pull/9853

* Fix QE conflict with ilp64 variant in support of https://github.com/spack/spack/pull/9853

* Remove custom url_for_version for QE package and use builtin url instead. In support of https://github.com/spack/spack/pull/9853

* Use FFTW builtin flags for QE instead of custom Python code. In support of https://github.com/spack/spack/pull/9853

* Fix typo in QE package comments. In support of https://github.com/spack/spack/pull/9853

* Future proof QE package patches in anticipation of QE >= 6.3.1. In support of https://github.com/spack/spack/pull/9853
This commit is contained in:
Nichols A. Romero 2018-12-06 03:57:52 -06:00 committed by Massimiliano Culpo
parent dcb27c008a
commit 298da8e2c4

View File

@ -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 @@ def install(self, spec, prefix):
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 @@ def install(self, spec, prefix):
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')