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:
parent
dcb27c008a
commit
298da8e2c4
@ -17,36 +17,49 @@ class QuantumEspresso(Package):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
homepage = 'http://quantum-espresso.org'
|
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.2.0', '972176a58d16ae8cf0c9a308479e2b97')
|
||||||
version('6.1.0', '3fe861dcb5f6ec3d15f802319d5d801b')
|
version('6.1.0', '3fe861dcb5f6ec3d15f802319d5d801b')
|
||||||
|
version('6.0.0', 'd915f2faf69d0e499f8e1681c42cbfc9')
|
||||||
version('5.4', '085f7e4de0952e266957bbc79563c54e')
|
version('5.4', '085f7e4de0952e266957bbc79563c54e')
|
||||||
version('5.3', 'be3f8778e302cffb89258a5f936a7592')
|
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('mpi', default=True, description='Builds with mpi support')
|
||||||
variant('openmp', default=False, description='Enables openMP support')
|
variant('openmp', default=False, description='Enables openMP support')
|
||||||
variant('scalapack', default=True, description='Enables scalapack 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
|
# Support for HDF5 has been added starting in version 6.1.0 and is
|
||||||
# still experimental, therefore we default to False for the variant
|
# still experimental, therefore we default to False for the variant
|
||||||
variant('hdf5', default=False, description='Builds with HDF5 support')
|
variant('hdf5', default=False, description='Builds with HDF5 support')
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
depends_on('blas')
|
depends_on('blas')
|
||||||
depends_on('lapack')
|
depends_on('lapack')
|
||||||
|
depends_on('fftw-api@3')
|
||||||
depends_on('mpi', when='+mpi')
|
depends_on('mpi', when='+mpi')
|
||||||
depends_on('scalapack', when='+scalapack+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('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.004')
|
||||||
patch('dspev_drv_elpa.patch', when='@6.1.0:+elpa ^elpa@2016.05.003')
|
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
|
# We can't ask for scalapack or elpa if we don't want MPI
|
||||||
conflicts(
|
conflicts(
|
||||||
'+scalapack',
|
'+scalapack',
|
||||||
@ -60,30 +73,86 @@ class QuantumEspresso(Package):
|
|||||||
msg='elpa is a parallel library and needs MPI support'
|
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
|
# Elpa is formally supported by @:5.4.0, but QE configure searches
|
||||||
# for it in the wrong folders (or tries to download it within
|
# for it in the wrong folders (or tries to download it within
|
||||||
# the build directory). Instead of patching Elpa to provide the
|
# the build directory). Instead of patching Elpa to provide the
|
||||||
# folder QE expects as a link, we issue a conflict here.
|
# folder QE expects as a link, we issue a conflict here.
|
||||||
conflicts('+elpa', when='@:5.4.0')
|
conflicts('+elpa', when='@:5.4.0')
|
||||||
conflicts('+hdf5', when='@:5.4.0')
|
|
||||||
|
|
||||||
# Spurious problems running in parallel the Makefile
|
# Spurious problems running in parallel the Makefile
|
||||||
# generated by the configure
|
# generated by the configure
|
||||||
parallel = False
|
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):
|
def install(self, spec, prefix):
|
||||||
|
|
||||||
prefix_path = prefix.bin if '@:5.4.0' in spec else prefix
|
prefix_path = prefix.bin if '@:5.4.0' in spec else prefix
|
||||||
options = ['-prefix={0}'.format(prefix_path)]
|
options = ['-prefix={0}'.format(prefix_path)]
|
||||||
|
|
||||||
if '+mpi' in spec:
|
if '+mpi' in spec:
|
||||||
|
mpi = spec['mpi']
|
||||||
options.append('--enable-parallel=yes')
|
options.append('--enable-parallel=yes')
|
||||||
|
options.append('MPIF90={0}'.format(mpi.mpifc))
|
||||||
else:
|
else:
|
||||||
options.append('--enable-parallel=no')
|
options.append('--enable-parallel=no')
|
||||||
|
|
||||||
if '+openmp' in spec:
|
if '+openmp' in spec:
|
||||||
options.append('--enable-openmp')
|
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:
|
if '+scalapack' in spec:
|
||||||
scalapack_option = 'intel' if '^intel-mkl' in spec else 'yes'
|
scalapack_option = 'intel' if '^intel-mkl' in spec else 'yes'
|
||||||
options.append('--with-scalapack={0}'.format(scalapack_option))
|
options.append('--with-scalapack={0}'.format(scalapack_option))
|
||||||
@ -109,18 +178,8 @@ def install(self, spec, prefix):
|
|||||||
if '+hdf5' in spec:
|
if '+hdf5' in spec:
|
||||||
options.append('--with-hdf5={0}'.format(spec['hdf5'].prefix))
|
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([
|
options.extend([
|
||||||
'LIBDIRS={0}'.format(search_list),
|
'F77={0}'.format(env['SPACK_F77']),
|
||||||
'F90={0}'.format(env['SPACK_FC']),
|
'F90={0}'.format(env['SPACK_FC']),
|
||||||
'CC={0}'.format(env['SPACK_CC'])
|
'CC={0}'.format(env['SPACK_CC'])
|
||||||
])
|
])
|
||||||
@ -139,11 +198,9 @@ def install(self, spec, prefix):
|
|||||||
if '+hdf5' in spec:
|
if '+hdf5' in spec:
|
||||||
make_inc = join_path(self.stage.source_path, 'make.inc')
|
make_inc = join_path(self.stage.source_path, 'make.inc')
|
||||||
hdf5_libs = ' '.join(spec['hdf5:hl,fortran'].libs)
|
hdf5_libs = ' '.join(spec['hdf5:hl,fortran'].libs)
|
||||||
filter_file(
|
filter_file(r'HDF5_LIB([\s]*)=([\s\w\-\/.,]*)',
|
||||||
'HDF5_LIB([\s]*)=([\s\w\-\/.,]*)',
|
'HDF5_LIB = {0}'.format(hdf5_libs),
|
||||||
'HDF5_LIB = {0}'.format(hdf5_libs),
|
make_inc)
|
||||||
make_inc
|
|
||||||
)
|
|
||||||
|
|
||||||
make('all')
|
make('all')
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user