diff options
Diffstat (limited to 'var/spack/repos/builtin/packages/qmcpack/package.py')
-rw-r--r-- | var/spack/repos/builtin/packages/qmcpack/package.py | 200 |
1 files changed, 122 insertions, 78 deletions
diff --git a/var/spack/repos/builtin/packages/qmcpack/package.py b/var/spack/repos/builtin/packages/qmcpack/package.py index 360ae0a51d..0e9169a481 100644 --- a/var/spack/repos/builtin/packages/qmcpack/package.py +++ b/var/spack/repos/builtin/packages/qmcpack/package.py @@ -1,28 +1,10 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. +# Copyright 2013-2018 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. # -# This file is part of Spack. -# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. -# LLNL-CODE-647188 -# -# For details, see https://github.com/spack/spack -# Please also see the LICENSE file for our notice and the LGPL. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, February 1999. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and -# conditions of the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -############################################################################## +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + from spack import * +import llnl.util.tty as tty class Qmcpack(CMakePackage): @@ -31,16 +13,21 @@ class Qmcpack(CMakePackage): # Package information homepage = "http://www.qmcpack.org/" - url = "https://github.com/QMCPACK/qmcpack.git" - - # This download method is untrusted, and is not recommended - # by the Spack manual. However, it is easier to maintain - # because github hashes can occasionally change - version('3.2.0', git=url, tag='v3.2.0') - version('3.1.1', git=url, tag='v3.1.1') - version('3.1.0', git=url, tag='v3.1.0') - version('3.0.0', git=url, tag='v3.0.0') - version('develop', git=url) + git = "https://github.com/QMCPACK/qmcpack.git" + + tags = ['ecp', 'ecp-apps'] + + # This download method is untrusted, and is not recommended by the + # Spack manual. However, it is easier to maintain because github hashes + # can occasionally change. + # NOTE: 12/19/2017 QMCPACK 3.0.0 does not build properly with Spack. + version('develop') + version('3.5.0', tag='v3.5.0') + version('3.4.0', tag='v3.4.0') + version('3.3.0', tag='v3.3.0') + version('3.2.0', tag='v3.2.0') + version('3.1.1', tag='v3.1.1') + version('3.1.0', tag='v3.1.0') # These defaults match those in the QMCPACK manual variant('debug', default=False, description='Build debug version') @@ -57,11 +44,13 @@ class Qmcpack(CMakePackage): 'Array-of-Structure code. Only for CPU code' 'and only in mixed precision') variant('timers', default=False, - description='Build with support for timers') + description='Build with support for timers') variant('da', default=False, description='Install with support for basic data analysis tools') variant('gui', default=False, description='Install with Matplotlib (long installation time)') + variant('qe', default=True, + description='Install with patched Quantum Espresso 6.3.0') # cuda variant implies mixed precision variant by default, but there is # no way to express this in variant syntax, need something like @@ -72,7 +61,9 @@ class Qmcpack(CMakePackage): conflicts('^openblas+ilp64') conflicts('^intel-mkl+ilp64') - # Dependencies match those in the QMCPACK manual + # 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') @@ -90,23 +81,41 @@ class Qmcpack(CMakePackage): # 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', type='run', when='+da') + depends_on('py-numpy~blas~lapack', when='+da', type='run') - # GUI is optional fpr data anlysis + # GUI is optional for data anlysis # py-matplotlib leads to a long complex DAG for dependencies - depends_on('py-matplotlib', type='run', when='+gui') + depends_on('py-matplotlib', when='+gui', type='run') # B-spline basis calculation require a patched version of - # Quantum Espresso 5.3.0 (see QMCPACK manual) - patch_url = 'https://raw.githubusercontent.com/QMCPACK/qmcpack/develop/external_codes/quantum_espresso/add_pw2qmcpack_to_espresso-5.3.0.diff' - patch_checksum = '0d8d7ba805313ddd4c02ee32c96d2f12e7091e9e82e22671d3ad5a24247860c4' - depends_on('espresso@5.3.0~elpa', - patches=patch(patch_url, sha256=patch_checksum), - when='+mpi') - - depends_on('espresso@5.3.0~elpa~scalapack~mpi', - patches=patch(patch_url, sha256=patch_checksum), - when='~mpi') + # Quantum Espresso 6.3 (see QMCPACK manual) + # Building explicitly without ELPA due to issues in Quantum Espresso + # 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', + patches=patch(patch_url, sha256=patch_checksum, when='+qe'), + when='+qe+mpi', type='run') + + depends_on('quantum-espresso@6.3~elpa~scalapack~mpi+hdf5', + patches=patch(patch_url, sha256=patch_checksum, when='+qe'), + when='+qe~mpi', type='run') + + # Backport several patches from recent versions of QMCPACK + # The test_numerics unit test is broken prior to QMCPACK 3.3.0 + patch_url = 'https://patch-diff.githubusercontent.com/raw/QMCPACK/qmcpack/pull/621.patch' + patch_checksum = 'e2ff7a6f0f006856085d4aab6d31f32f16353e41f760a33a7ef75f3ecce6a5d6' + patch(patch_url, sha256=patch_checksum, when='@3.1.0:3.3.0') + + # FindMKL.cmake has an issues prior to QMCPACK 3.3.0 + patch_url = 'https://patch-diff.githubusercontent.com/raw/QMCPACK/qmcpack/pull/623.patch' + patch_checksum = '3eb9dec05fd1a544318ff84cd8b5926cfc6b46b375c7f3b012ccf0b50cf617b7' + patch(patch_url, sha256=patch_checksum, when='@3.1.0:3.3.0') + + # git-rev files for not git builds issues prior to QMCPACK 3.3.0 + patch_url = 'https://patch-diff.githubusercontent.com/raw/QMCPACK/qmcpack/pull/643.patch' + patch_checksum = 'c066c79901a612cf8848135e0d544efb114534cca70b90bfccc8ed989d3d9dde' + patch(patch_url, sha256=patch_checksum, when='@3.1.0:3.3.0') def patch(self): # FindLibxml2QMC.cmake doesn't check the environment by default @@ -116,22 +125,23 @@ class Qmcpack(CMakePackage): 'CMake/FindLibxml2QMC.cmake') def cmake_args(self): + spec = self.spec args = [] - if '+mpi' in self.spec: - mpi = self.spec['mpi'] + if '+mpi' in spec: + mpi = spec['mpi'] args.append('-DCMAKE_C_COMPILER={0}'.format(mpi.mpicc)) args.append('-DCMAKE_CXX_COMPILER={0}'.format(mpi.mpicxx)) args.append('-DMPI_BASE_DIR:PATH={0}'.format(mpi.prefix)) # Currently FFTW_HOME and LIBXML2_HOME are used by CMake. # Any CMake warnings about other variables are benign. - xml2_prefix = self.spec['libxml2'].prefix + xml2_prefix = spec['libxml2'].prefix args.append('-DLIBXML2_HOME={0}'.format(xml2_prefix)) args.append('-DLibxml2_INCLUDE_DIRS={0}'.format(xml2_prefix.include)) args.append('-DLibxml2_LIBRARY_DIRS={0}'.format(xml2_prefix.lib)) - fftw_prefix = self.spec['fftw'].prefix + 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)) @@ -140,15 +150,15 @@ class Qmcpack(CMakePackage): args.append('-DHDF5_ROOT={0}'.format(self.spec['hdf5'].prefix)) # Default is MPI, serial version is convenient for cases, e.g. laptops - if '+mpi' in self.spec: + if '+mpi' in spec: args.append('-DQMC_MPI=1') - elif '~mpi' in self.spec: + elif '~mpi' in spec: args.append('-DQMC_MPI=0') # Default is real-valued single particle orbitals - if '+complex' in self.spec: + if '+complex' in spec: args.append('-DQMC_COMPLEX=1') - elif '~complex' in self.spec: + elif '~complex' in spec: args.append('-DQMC_COMPLEX=0') # When '-DQMC_CUDA=1', CMake automatically sets: @@ -157,44 +167,66 @@ class Qmcpack(CMakePackage): # There is a double-precision CUDA path, but it is not as well # tested. - if '+cuda' in self.spec: + if '+cuda' in spec: args.append('-DQMC_CUDA=1') - elif '~cuda' in self.spec: + elif '~cuda' in spec: args.append('-DQMC_CUDA=0') # Mixed-precision versues double-precision CPU and GPU code - if '+mixed' in self.spec: + if '+mixed' in spec: args.append('-DQMC_MIXED_PRECISION=1') - elif '~mixed' in self.spec: + elif '~mixed' in spec: args.append('-DQMC_MIXED_PRECISION=0') # New Structure-of-Array (SOA) code, much faster than default # Array-of-Structure (AOS) code. # No support for local atomic orbital basis. - if '+soa' in self.spec: + if '+soa' in spec: args.append('-DENABLE_SOA=1') - elif '~soa' in self.spec: + elif '~soa' in spec: args.append('-DENABLE_SOA=0') # Manual Timers - if '+timers' in self.spec: + if '+timers' in spec: args.append('-DENABLE_TIMERS=1') - elif '~timers' in self.spec: + elif '~timers' in spec: args.append('-DENABLE_TIMERS=0') - # # Proper MKL detection not working. - # # Include MKL flags - # if 'intel-mkl' in self.spec: - # args.append('-DBLA_VENDOR=Intel10_64lp_seq') - # args.append('-DQMC_INCLUDE={0}'.format(join_path(env['MKLROOT'],'include'))) - return args + # Proper detection of optimized BLAS and LAPACK. + # Based on the code from the deal II Spack package: + # https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/dealii/package.py + # + # Basically, we override CMake's auto-detection mechanism + # and use the Spack's interface instead + lapack_blas = spec['lapack'].libs + spec['blas'].libs + args.extend([ + '-DLAPACK_FOUND=true', + '-DLAPACK_LIBRARIES=%s' % lapack_blas.joined(';') + ]) + + # Additionally, we need to pass the BLAS+LAPACK include directory for + # header files. This is to insure vectorized math and FFT libraries + # 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: + 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. + args.append('-DENABLE_MKL=1') + args.append('-DMKL_ROOT=%s' % env['MKLROOT']) + else: + lapack_dir = ':'.join(( + spec['lapack'].prefix.include, + spec['blas'].prefix.include + )) + + args.extend([ + '-DCMAKE_CXX_FLAGS=-I%s' % lapack_dir, + '-DCMAKE_C_FLAGS=-I%s' % lapack_dir + ]) - # def setup_environment(self, spack_env, run_env): - # # Add MKLROOT/lib to the CMAKE_PREFIX_PATH to enable CMake to find - # # MKL libraries. MKLROOT environment variable must be defined for - # # this to work properly. - # if 'intel-mkl' in self.spec: - # spack_env.append_path('CMAKE_PREFIX_PATH',format(join_path(env['MKLROOT'],'lib'))) + return args def install(self, spec, prefix): """Make the install targets""" @@ -228,7 +260,19 @@ class Qmcpack(CMakePackage): def check(self): """Run ctest after building binary. It can take over 24 hours to run all the regression tests, here we - only run the unit tests and short tests.""" + only run the unit tests and short tests. If the unit tests fail, + the QMCPACK installation aborts. On the other hand, the short tests + are too strict and often fail, but are still useful to run. In the + future, the short tests will be more reasonable in terms of quality + assurance (i.e. they will not be so strict), but will be sufficient to + validate QMCPACK in production.""" + with working_dir(self.build_directory): ctest('-L', 'unit') - ctest('-R', 'short') + try: + ctest('-R', 'short') + except ProcessError: + warn = 'Unit tests passed, but short tests have failed.\n' + warn += 'Please review failed tests before proceeding\n' + warn += 'with production calculations.\n' + tty.msg(warn) |