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