diff options
author | Nichols A. Romero <naromero77@users.noreply.github.com> | 2019-01-26 10:13:51 -0600 |
---|---|---|
committer | Adam J. Stewart <ajstewart426@gmail.com> | 2019-01-26 10:13:51 -0600 |
commit | 4ab89f4de11e067bc535656381168b93b7c1abac (patch) | |
tree | 51a821cd1f60e70c31595ee4cb1776910241a89b /var | |
parent | a307822fd94ba093c6457bb075aaaaff39286572 (diff) | |
download | spack-4ab89f4de11e067bc535656381168b93b7c1abac.tar.gz spack-4ab89f4de11e067bc535656381168b93b7c1abac.tar.bz2 spack-4ab89f4de11e067bc535656381168b93b7c1abac.tar.xz spack-4ab89f4de11e067bc535656381168b93b7c1abac.zip |
QMCPACK Update - Jan 2019 (#10252)
* Add warnings for existing conflicts. New versions of QMCPACK require a compiler with C++14 support.
* QMCPACK now requires a newer release of CMake.
* Switch QMCPACK to using FFTW-api provider.
* Relax dependencies on QMCPACK +da variant.
* Add QMCPACK 3.6.0 release.
* QMCPACK compiler-CUDA conflicts.
* QMCPACK fix typo in expressing conflict.
* Conditional needed since these variables are only used when FFTW is a dependency to QMCPACK.
* QMCPACK QE variant dependency was underspecified. Must include MPI as a hard dependency on QE.
* Update QMCPACK dependencies for HDF5, CMake and Boost.
* QMCPACK clean-up, more consistent use of spec vs. self.spec.
* Add support for collective I/O variant of QMCPACK.
* Update QMCPACK conflicts for QE and PHDF5 variants.
* Use built-in install method for QMCPACK starting with 3.6.0
* QMCPACK compiler C++14 conflicts were off by one version.
* QMCPACK package needs to setup_environment method.
* In support of PR#10252, get rid of slashes in string.
* Migrate these to the CUDA package and make a seperate PR.
* In support of PR#10252, get rid of join_path for nexus.
* In support of PR#10252, work around concretizer limitation.
* In support of PR#10252, convert to conditionals to if-else clauses for compactness.
* In support of PR#10252, get rid of extra space and new line in warning messages.
Diffstat (limited to 'var')
-rw-r--r-- | var/spack/repos/builtin/packages/qmcpack/package.py | 126 |
1 files changed, 98 insertions, 28 deletions
diff --git a/var/spack/repos/builtin/packages/qmcpack/package.py b/var/spack/repos/builtin/packages/qmcpack/package.py index 3d34344af3..b03db97727 100644 --- a/var/spack/repos/builtin/packages/qmcpack/package.py +++ b/var/spack/repos/builtin/packages/qmcpack/package.py @@ -22,6 +22,7 @@ class Qmcpack(CMakePackage): # can occasionally change. # NOTE: 12/19/2017 QMCPACK 3.0.0 does not build properly with Spack. version('develop') + version('3.6.0', tag='v3.6.0') version('3.5.0', tag='v3.5.0') version('3.4.0', tag='v3.4.0') version('3.3.0', tag='v3.3.0') @@ -32,6 +33,7 @@ class Qmcpack(CMakePackage): # These defaults match those in the QMCPACK manual variant('debug', default=False, description='Build debug version') variant('mpi', default=True, description='Build with MPI support') + variant('phdf5', default=True, description='Build with parallel collective I/O') variant('cuda', default=False, description='Enable CUDA and GPU acceleration') variant('complex', default=False, @@ -57,31 +59,70 @@ class Qmcpack(CMakePackage): # variant('+mixed', default=True, when='+cuda', description="...") # conflicts - conflicts('+soa', when='+cuda') - conflicts('^openblas+ilp64') - conflicts('^intel-mkl+ilp64') + conflicts( + '+phdf5', + when='~mpi', + msg='Parallel collective I/O requires MPI-enabled QMCPACK. ' \ + 'Please add "~phdf5" to the Spack install line for serial QMCPACK.' + ) + conflicts( + '+qe', + when='~mpi', + msg='QMCPACK QE variant requires MPI due to limitation in QE build ' \ + 'system. Please add "~qe" to the Spack install line for serial ' \ + 'QMCPACK.' + ) + conflicts( + '+soa', + when='+cuda', + msg='QMCPACK SOA variant does not exist for CUDA' + ) + conflicts( + '^openblas+ilp64', + msg='QMCPACK does not support OpenBLAS 64-bit integer variant' + ) + conflicts( + '^intel-mkl+ilp64', + msg='QMCPACK does not support MKL 64-bit integer variant' + ) + + # QMCPACK 3.6.0 or later requires support for C++14 + compiler_warning = 'QMCPACK 3.6.0 or later requires a ' \ + 'compiler with support for C++14' + conflicts('%gcc@:4', when='@3.6.0:', msg=compiler_warning) + conflicts('%intel@:17', when='@3.6.0:', msg=compiler_warning) + conflicts('%pgi@:17', when='@3.6.0:', msg=compiler_warning) + conflicts('%llvm@:3.4', when='@3.6.0:', msg=compiler_warning) # Dependencies match those in the QMCPACK manual. # FIXME: once concretizer can unite unconditional and conditional - # dependencies the some of the '~mpi' will not be necessary. - depends_on('cmake@3.4.3:', type='build') - depends_on('mpi', when='+mpi') - depends_on('libxml2') - depends_on('hdf5') - depends_on('hdf5+mpi', when='+mpi') - depends_on('hdf5~mpi', when='~mpi') + # dependencies, some of the '~mpi' variants below will not be necessary. + # Essential libraries + depends_on('cmake@3.4.3:', when='@:3.5.0', type='build') + depends_on('cmake@3.6.0:', when='@3.6.0:', type='build') depends_on('boost') + depends_on('boost@1.61.0:', when='@3.6.0:') + depends_on('libxml2') + depends_on('mpi', when='+mpi') + depends_on('cuda', when='+cuda') + # HDF5 + depends_on('hdf5+hl+fortran', when='+qe') + depends_on('hdf5+hl+fortran+mpi', when='+qe+mpi') + depends_on('hdf5+hl+fortran~mpi', when='+qe~mpi') + depends_on('hdf5~hl~fortran', when='~qe') + depends_on('hdf5~hl~fortran+mpi', when='~qe+mpi') + depends_on('hdf5~hl~fortran~mpi', when='~qe~mpi') + # Math libraries depends_on('blas') depends_on('lapack') - depends_on('fftw') - depends_on('fftw+mpi', when='+mpi') - depends_on('fftw~mpi', when='~mpi') - depends_on('cuda', when='+cuda') + depends_on('fftw-api@3') # qmcpack data analysis tools # basic command line tool based on Python and NumPy - # blas and lapack patching fails often and so are disabled at this time - depends_on('py-numpy~blas~lapack', when='+da', type='run') + # It may be necesseary to disable the blas and lapack + # when building the 'py-numpy' package, but it should not be a hard + # dependency on the 'py-numpy~blas~lapack' variant + depends_on('py-numpy', when='+da', type='run') # GUI is optional for data anlysis # py-matplotlib leads to a long complex DAG for dependencies @@ -93,7 +134,7 @@ class Qmcpack(CMakePackage): # Spack package patch_url = 'https://raw.githubusercontent.com/QMCPACK/qmcpack/develop/external_codes/quantum_espresso/add_pw2qmcpack_to_qe-6.3.diff' patch_checksum = '2ee346e24926479f5e96f8dc47812173a8847a58354bbc32cf2114af7a521c13' - depends_on('quantum-espresso@6.3~elpa+hdf5', + depends_on('quantum-espresso@6.3~elpa+mpi+hdf5', patches=patch(patch_url, sha256=patch_checksum, when='+qe'), when='+qe+mpi', type='run') @@ -141,10 +182,11 @@ class Qmcpack(CMakePackage): args.append('-DLibxml2_INCLUDE_DIRS={0}'.format(xml2_prefix.include)) args.append('-DLibxml2_LIBRARY_DIRS={0}'.format(xml2_prefix.lib)) - fftw_prefix = spec['fftw'].prefix - args.append('-DFFTW_HOME={0}'.format(fftw_prefix)) - args.append('-DFFTW_INCLUDE_DIRS={0}'.format(fftw_prefix.include)) - args.append('-DFFTW_LIBRARY_DIRS={0}'.format(fftw_prefix.lib)) + if '^fftw@3:' in spec: + fftw_prefix = spec['fftw'].prefix + args.append('-DFFTW_HOME={0}'.format(fftw_prefix)) + args.append('-DFFTW_INCLUDE_DIRS={0}'.format(fftw_prefix.include)) + args.append('-DFFTW_LIBRARY_DIRS={0}'.format(fftw_prefix.lib)) args.append('-DBOOST_ROOT={0}'.format(self.spec['boost'].prefix)) args.append('-DHDF5_ROOT={0}'.format(self.spec['hdf5'].prefix)) @@ -152,13 +194,19 @@ class Qmcpack(CMakePackage): # Default is MPI, serial version is convenient for cases, e.g. laptops if '+mpi' in spec: args.append('-DQMC_MPI=1') - elif '~mpi' in spec: + else: args.append('-DQMC_MPI=0') + # Default is parallel collective I/O enabled + if '+phdf5' in spec: + args.append('-DENABLE_PHDF5=1') + else: + args.append('-DENABLE_PHDF5=0') + # Default is real-valued single particle orbitals if '+complex' in spec: args.append('-DQMC_COMPLEX=1') - elif '~complex' in spec: + else: args.append('-DQMC_COMPLEX=0') # When '-DQMC_CUDA=1', CMake automatically sets: @@ -169,13 +217,13 @@ class Qmcpack(CMakePackage): if '+cuda' in spec: args.append('-DQMC_CUDA=1') - elif '~cuda' in spec: + else: args.append('-DQMC_CUDA=0') # Mixed-precision versues double-precision CPU and GPU code if '+mixed' in spec: args.append('-DQMC_MIXED_PRECISION=1') - elif '~mixed' in spec: + else: args.append('-DQMC_MIXED_PRECISION=0') # New Structure-of-Array (SOA) code, much faster than default @@ -183,13 +231,13 @@ class Qmcpack(CMakePackage): # No support for local atomic orbital basis. if '+soa' in spec: args.append('-DENABLE_SOA=1') - elif '~soa' in spec: + else: args.append('-DENABLE_SOA=0') # Manual Timers if '+timers' in spec: args.append('-DENABLE_TIMERS=1') - elif '~timers' in spec: + else: args.append('-DENABLE_TIMERS=0') # Proper detection of optimized BLAS and LAPACK. @@ -209,7 +257,7 @@ class Qmcpack(CMakePackage): # get properly detected. Intel MKL requires special case due to # differences in Darwin vs. Linux $MKLROOT naming schemes. This section # of code is intentionally redundant for backwards compatibility. - if 'intel-mkl' in self.spec: + if 'intel-mkl' in spec: lapack_dir = format(join_path(env['MKLROOT'], 'include')) # Next two lines were introduced in QMCPACK 3.5.0 and later. # Prior to v3.5.0, these lines should be benign. @@ -228,6 +276,11 @@ class Qmcpack(CMakePackage): return args + # QMCPACK 3.6.0 release and later has a functional 'make install', + # the Spack 'def install' is retained for backwards compatiblity. + # Note that the two install methods differ in their directory + # structure. + @when('@:3.5.0') def install(self, spec, prefix): """Make the install targets""" @@ -255,6 +308,23 @@ class Qmcpack(CMakePackage): # install binaries install_tree('bin', prefix.bin) + # QMCPACK 3.6.0 install directory structure changed, thus there + # thus are two version of the setup_environment method + @when('@:3.5.0') + def setup_environment(self, spack_env, run_env): + """Set-up runtime environment for QMCPACK. + Set PYTHONPATH for basic analysis scripts and for Nexus.""" + run_env.prepend_path('PYTHONPATH', self.prefix.nexus) + + @when('@3.6.0:') + def setup_environment(self, spack_env, run_env): + """Set-up runtime environment for QMCPACK. + Set PYTHONPATH for basic analysis scripts and for Nexus. Binaries + are in the 'prefix' directory instead of 'prefix.bin' which is + not set by the default module environment""" + run_env.prepend_path('PATH', self.prefix) + run_env.prepend_path('PYTHONPATH', self.prefix) + @run_after('build') @on_package_attributes(run_tests=True) def check(self): |