
Introduces a new virtual zlib-api, which replaces zlib in most packages. This allows users to switch to zlib-ng by default for better performance.
640 lines
28 KiB
Python
640 lines
28 KiB
Python
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
|
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
|
#
|
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
import spack.build_systems.cmake
|
|
import spack.build_systems.generic
|
|
from spack.package import *
|
|
|
|
|
|
class QuantumEspresso(CMakePackage, Package):
|
|
"""Quantum ESPRESSO is an integrated suite of Open-Source computer codes
|
|
for electronic-structure calculations and materials modeling at the
|
|
nanoscale. It is based on density-functional theory, plane waves, and
|
|
pseudopotentials.
|
|
"""
|
|
|
|
homepage = "http://quantum-espresso.org"
|
|
url = "https://gitlab.com/QEF/q-e/-/archive/qe-6.6/q-e-qe-6.6.tar.gz"
|
|
git = "https://gitlab.com/QEF/q-e.git"
|
|
|
|
maintainers("ye-luo", "bellenlau", "tgorni")
|
|
|
|
build_system(conditional("cmake", when="@6.8:"), "generic", default="cmake")
|
|
|
|
version("develop", branch="develop")
|
|
version("7.2", sha256="b348a4a7348b66a73545d9ca317a2645755c98d343c1cfe8def475ad030808c0")
|
|
version("7.1", sha256="d56dea096635808843bd5a9be2dee3d1f60407c01dbeeda03f8256a3bcfc4eb6")
|
|
version("7.0", sha256="85beceb1aaa1678a49e774c085866d4612d9d64108e0ac49b23152c8622880ee")
|
|
version("6.8", sha256="654855c69864de7ece5ef2f2c0dea2d32698fe51192a8646b1555b0c57e033b2")
|
|
version(
|
|
"6.7",
|
|
sha256="fe0ce74ff736b10d2a20c9d59025c01f88f86b00d229c123b1791f1edd7b4315",
|
|
url="https://gitlab.com/QEF/q-e/-/archive/qe-6.7MaX-Release/q-e-qe-6.7MaX-Release.tar.gz",
|
|
)
|
|
version("6.6", sha256="924656cb083f52e5d2fe71ade05881389dac64b45316f1bdd6dee1c6170a672c")
|
|
version("6.5", sha256="258b2a8a6280e86dad779e5c56356d8b35dc96d12ff33dabeee914bc03d6d602")
|
|
version("6.4.1", sha256="b0d7e9f617b848753ad923d8c6ca5490d5d82495f82b032b71a0ff2f2e9cfa08")
|
|
version("6.4", sha256="781366d03da75516fdcf9100a1caadb26ccdd1dedd942a6f8595ff0edca74bfe")
|
|
version("6.3", sha256="4067c8fffa957aabbd5cf2439e2fcb6cf3752325393c67a17d99fd09edf8689c")
|
|
version("6.2.1", sha256="11fe24b4a9d85834f8b6d429baebed8b360a685ecfae222887ed451e118a9156")
|
|
version("6.2.0", sha256="e204df367c8ea1a50c7534b44481841d835a542a23ae71c3e33ad712fc636c8b")
|
|
version("6.1.0", sha256="fd2c2eb346b3ca8f08138df5ef3f69b466c256d2119db40eea1b578b0a42c66e")
|
|
version("6.0.0", sha256="bc77d9553bf5a9253ae74058dffb1d6e5fb61093188e78d3b8d8564755136f19")
|
|
version("5.4", sha256="e3993fccae9cea04a5c6492e8b961a053a63727051cb5c4eb6008f62cda8f335")
|
|
version("5.3", sha256="3b26038efb9e3f8ac7a2b950c31d8c29169a3556c0b68c299eb88a4be8dc9048")
|
|
|
|
resource(
|
|
name="environ",
|
|
git="https://github.com/environ-developers/Environ.git",
|
|
tag="v1.1",
|
|
when="@6.3:6.4 +environ",
|
|
destination=".",
|
|
)
|
|
|
|
resource(
|
|
name="environ",
|
|
git="https://github.com/environ-developers/Environ.git",
|
|
tag="v1.0",
|
|
when="@6.2.1:6.2 +environ",
|
|
destination=".",
|
|
)
|
|
|
|
with when("build_system=cmake"):
|
|
depends_on("cmake@3.14.0:", type="build")
|
|
|
|
variant("libxc", default=False, description="Uses libxc")
|
|
depends_on("libxc@5.1.2:", when="+libxc")
|
|
|
|
variant("openmp", default=True, description="Enables OpenMP support")
|
|
# Need OpenMP threaded FFTW and BLAS libraries when configured
|
|
# with OpenMP support
|
|
with when("+openmp"):
|
|
depends_on("fftw+openmp", when="^fftw")
|
|
depends_on("amdfftw+openmp", when="^amdfftw")
|
|
depends_on("openblas threads=openmp", when="^openblas")
|
|
depends_on("amdblis threads=openmp", when="^amdblis")
|
|
depends_on("intel-mkl threads=openmp", when="^intel-mkl")
|
|
depends_on("armpl-gcc threads=openmp", when="^armpl-gcc")
|
|
depends_on("acfl threads=openmp", when="^acfl")
|
|
|
|
# Add Cuda Fortran support
|
|
# depends on NVHPC compiler, not directly on CUDA toolkit
|
|
with when("%nvhpc"):
|
|
variant("cuda", default=False, description="Build with CUDA Fortran")
|
|
with when("+cuda"):
|
|
# GPUs are enabled since v6.6
|
|
conflicts("@:6.5")
|
|
# cuda version >= 10.1
|
|
# conflicts("cuda@:10.0.130")
|
|
# bugs with following nvhpcsdk versions and +openmp
|
|
with when("+openmp"):
|
|
conflicts(
|
|
"%nvhpc@21.11:22.3",
|
|
msg="bugs with NVHPCSDK from v21.11 to v22.3, OpenMP and GPU",
|
|
)
|
|
# only cmake is supported
|
|
conflicts("build_system=generic", msg="Only CMake supported for GPU-enabled version")
|
|
|
|
# NVTX variant for profiling
|
|
# requires linking to CUDA runtime APIs , handled by CMake
|
|
variant("nvtx", default=False, description="Enables NVTX markers for profiling")
|
|
with when("+nvtx~cuda"):
|
|
depends_on("cuda")
|
|
|
|
# Apply upstream patches by default. Variant useful for 3rd party
|
|
# patches which are incompatible with upstream patches
|
|
desc = "Apply recommended upstream patches. May need to be set "
|
|
desc = desc + "to False for third party patches or plugins"
|
|
variant("patch", default=True, description=desc)
|
|
|
|
variant("mpi", default=True, description="Builds with mpi support")
|
|
with when("+mpi"):
|
|
depends_on("mpi")
|
|
variant("scalapack", default=True, description="Enables scalapack support")
|
|
with when("%nvhpc+cuda"):
|
|
# add mpi_gpu_aware variant, False by default
|
|
variant("mpigpu", default=False, description="Enables GPU-aware MPI operations")
|
|
|
|
with when("+scalapack"):
|
|
depends_on("scalapack")
|
|
variant("elpa", default=False, description="Uses elpa as an eigenvalue solver")
|
|
|
|
with when("+elpa"):
|
|
# CMake builds only support elpa without openmp
|
|
depends_on("elpa~openmp", when="build_system=cmake")
|
|
with when("build_system=generic"):
|
|
depends_on("elpa+openmp", when="+openmp")
|
|
depends_on("elpa~openmp", when="~openmp")
|
|
# 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("@:5.4.0", msg="+elpa requires QE >= 6.0")
|
|
|
|
# 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="none",
|
|
description="Orbital and density data I/O with HDF5",
|
|
values=("parallel", "serial", "none"),
|
|
multi=False,
|
|
)
|
|
|
|
# Versions of HDF5 prior to 1.8.16 lead to QE runtime errors
|
|
depends_on("hdf5@1.8.16:+fortran+hl+mpi", when="hdf5=parallel")
|
|
depends_on("hdf5@1.8.16:+fortran+hl~mpi", when="hdf5=serial")
|
|
|
|
# HDF5 support introduced in 6.1.0, but the configure had some limitations.
|
|
# In recent tests (Oct 2019), GCC and Intel work with the HDF5 Spack
|
|
# package for the default variant. This is only for hdf5=parallel variant.
|
|
# Support, for hdf5=serial was introduced in 6.4.1 but required a patch
|
|
# for the serial (no MPI) case. This patch was to work around an issue
|
|
# that only manifested itself inside the Spack environment.
|
|
conflicts(
|
|
"hdf5=parallel", when="@:6.0", msg="parallel HDF5 support only in QE 6.1.0 and later"
|
|
)
|
|
|
|
conflicts("hdf5=serial", when="@:6.4.0", msg="serial HDF5 support only in QE 6.4.1 and later")
|
|
|
|
conflicts("hdf5=parallel", when="~mpi", msg="parallel HDF5 requires MPI support")
|
|
|
|
# QMCPACK converter patch
|
|
# https://github.com/QMCPACK/qmcpack/tree/develop/external_codes/quantum_espresso
|
|
variant("qmcpack", default=False, description="Build QE-to-QMCPACK wave function converter")
|
|
|
|
with when("+qmcpack"):
|
|
# Some QMCPACK converters are incompatible with upstream patches.
|
|
# HDF5 is a hard requirement. Need to do two HDF5 cases explicitly
|
|
# since Spack lacks support for expressing NOT operation.
|
|
conflicts(
|
|
"@6.4+patch",
|
|
msg="QE-to-QMCPACK wave function converter requires "
|
|
"deactivatation of upstream patches",
|
|
)
|
|
conflicts(
|
|
"@6.3:6.4.0 hdf5=serial",
|
|
msg="QE-to-QMCPACK wave function converter only " "supported with parallel HDF5",
|
|
)
|
|
conflicts("@:7.0 hdf5=none", msg="QE-to-QMCPACK wave function converter requires HDF5")
|
|
# QE > 7.0, the converter for QMCPACK can be built without hdf5 enabled in QE.
|
|
# The converter for QMCPACK itself still needs hdf5 library
|
|
with when("@7.0.1:"):
|
|
# when QE doesn't use hdf5 library, the converter plugin still needs it
|
|
depends_on("hdf5@1.8.16:+hl~mpi", when="hdf5=none")
|
|
conflicts(
|
|
"build_system=generic", msg="QE-to-QMCPACK wave function converter requires cmake"
|
|
)
|
|
|
|
# Enables building Electron-phonon Wannier 'epw.x' executable
|
|
# http://epw.org.uk/Main/About
|
|
variant("epw", default=True, description="Builds Electron-phonon Wannier executable")
|
|
conflicts("~epw", when="build_system=cmake", msg="epw cannot be turned off when using CMake")
|
|
|
|
with when("+epw"):
|
|
# The first version of Q-E to feature integrated EPW is 6.0.0,
|
|
# as per http://epw.org.uk/Main/DownloadAndInstall .
|
|
# Complain if trying to install a version older than this.
|
|
conflicts("@:5", msg="EPW only available from version 6.0.0 and on")
|
|
|
|
# Below goes some constraints as shown in the link above.
|
|
# Constraints may be relaxed as successful reports
|
|
# of different compiler+mpi combinations arrive
|
|
|
|
# TODO: enable building EPW when ~mpi and build_system=generic
|
|
conflicts(
|
|
"~mpi", when="build_system=generic", msg="EPW needs MPI when build_system=generic"
|
|
)
|
|
|
|
# EPW doesn't gets along well with OpenMPI 2.x.x
|
|
conflicts("^openmpi@2.0.0:2", msg="OpenMPI version incompatible with EPW")
|
|
|
|
# EPW also doesn't gets along well with PGI 17.x + OpenMPI 1.10.7
|
|
conflicts(
|
|
"^openmpi@1.10.7%pgi@17.0:17.12", msg="PGI+OpenMPI version combo incompatible with EPW"
|
|
)
|
|
|
|
variant(
|
|
"environ",
|
|
default=False,
|
|
when="build_system=generic",
|
|
description="Enables support for introducing environment effects "
|
|
"into atomistic first-principles simulations."
|
|
"See http://quantum-environ.org/about.html",
|
|
)
|
|
|
|
variant(
|
|
"gipaw",
|
|
default=False,
|
|
when="build_system=generic",
|
|
description="Builds Gauge-Including Projector Augmented-Waves executable",
|
|
)
|
|
with when("+gipaw"):
|
|
conflicts(
|
|
"@:6.3", msg="gipaw standard support available for QE 6.3 or grater version only"
|
|
)
|
|
|
|
# Dependencies not affected by variants
|
|
depends_on("blas")
|
|
depends_on("lapack")
|
|
depends_on("fftw-api@3")
|
|
depends_on("git@2.13:", type="build")
|
|
depends_on("m4", type="build")
|
|
|
|
# CONFLICTS SECTION
|
|
# Omitted for now due to concretizer bug
|
|
# MKL with 64-bit integers not supported.
|
|
# conflicts(
|
|
# '^mkl+ilp64',
|
|
# msg='Quantum ESPRESSO does not support MKL 64-bit integer variant'
|
|
# )
|
|
|
|
# PATCHES SECTION
|
|
# THIRD-PARTY PATCHES
|
|
# NOTE: *SOME* third-party patches will require deactivation of
|
|
# upstream patches using `~patch` variant
|
|
|
|
# Only CMake will work for @6.8: %aocc
|
|
conflicts(
|
|
"build_system=generic", when="@6.8: %aocc", msg="Please use CMake to build with AOCC"
|
|
)
|
|
|
|
conflicts("~openmp", when="^amdlibflame", msg="amdlibflame requires OpenMP")
|
|
|
|
# QMCPACK converter patches for QE 6.8, 6.7, 6.4.1, 6.4, and 6.3
|
|
conflicts(
|
|
"@:6.2,6.5:6.6",
|
|
when="+qmcpack",
|
|
msg="QMCPACK converter NOT available for this version of QE",
|
|
)
|
|
|
|
# Internal compiler error gcc8 and a64fx, I check only 6.5 and 6.6
|
|
conflicts(
|
|
"@5.3:", when="%gcc@8 target=a64fx", msg="Internal compiler error with gcc8 and a64fx"
|
|
)
|
|
|
|
conflicts("@6.5:", when="+environ", msg="6.4.x is the latest QE series supported by Environ")
|
|
|
|
# QE 7.1 fix post-processing install part 1/2
|
|
# see: https://gitlab.com/QEF/q-e/-/merge_requests/2005
|
|
patch_url = "https://gitlab.com/QEF/q-e/-/commit/4ca3afd4c6f27afcf3f42415a85a353a7be1bd37.diff"
|
|
patch_checksum = "e54d33e36a2667bd1d7e358db9fa9d4d83085264cdd47e39ce88754452ae7700"
|
|
patch(patch_url, sha256=patch_checksum, when="@:7.1 build_system=cmake")
|
|
|
|
# QE 7.1 fix post-processing install part 2/2
|
|
# see: https://gitlab.com/QEF/q-e/-/merge_requests/2007
|
|
patch_url = "https://gitlab.com/QEF/q-e/-/commit/481a001293de2f9eec8481e02d64f679ffd83ede.diff"
|
|
patch_checksum = "5075f2df61ef5ff70f2ec3b52a113f5636fb07f5d3d4c0115931f9b95ed61c3e"
|
|
patch(patch_url, sha256=patch_checksum, when="@:7.1 build_system=cmake")
|
|
|
|
# No patch needed for QMCPACK converter beyond 7.0
|
|
# 7.0
|
|
patch_url = "https://raw.githubusercontent.com/QMCPACK/qmcpack/v3.13.0/external_codes/quantum_espresso/add_pw2qmcpack_to_qe-7.0.diff"
|
|
patch_checksum = "ef60641d8b953b4ba21d9c662b172611305bb63786996ad6e81e7609891677ff"
|
|
patch(patch_url, sha256=patch_checksum, when="@7.0+qmcpack")
|
|
|
|
# 6.8
|
|
patch_url = "https://raw.githubusercontent.com/QMCPACK/qmcpack/v3.13.0/external_codes/quantum_espresso/add_pw2qmcpack_to_qe-6.8.diff"
|
|
patch_checksum = "69f7fbd72aba810c35a0b034188e45bea8f9f11d3150c0715e1b3518d5c09248"
|
|
patch(patch_url, sha256=patch_checksum, when="@6.8+qmcpack")
|
|
|
|
# 6.7
|
|
patch_url = "https://raw.githubusercontent.com/QMCPACK/qmcpack/v3.13.0/external_codes/quantum_espresso/add_pw2qmcpack_to_qe-6.7.0.diff"
|
|
patch_checksum = "72564c168231dd4a1279a74e76919af701d47cee9a851db6e205753004fe9bb5"
|
|
patch(patch_url, sha256=patch_checksum, when="@6.7+qmcpack")
|
|
|
|
# 6.4.1
|
|
patch_url = "https://raw.githubusercontent.com/QMCPACK/qmcpack/v3.13.0/external_codes/quantum_espresso/add_pw2qmcpack_to_qe-6.4.1.diff"
|
|
patch_checksum = "57cb1b06ee2653a87c3acc0dd4f09032fcf6ce6b8cbb9677ae9ceeb6a78f85e2"
|
|
patch(patch_url, sha256=patch_checksum, when="@6.4.1+qmcpack")
|
|
# 6.4
|
|
patch_url = "https://raw.githubusercontent.com/QMCPACK/qmcpack/v3.13.0/external_codes/quantum_espresso/add_pw2qmcpack_to_qe-6.4.diff"
|
|
patch_checksum = "ef08f5089951be902f0854a4dbddaa7b01f08924cdb27decfade6bef0e2b8994"
|
|
patch(patch_url, sha256=patch_checksum, when="@=6.4+qmcpack")
|
|
# 6.3
|
|
patch_url = "https://raw.githubusercontent.com/QMCPACK/qmcpack/v3.13.0/external_codes/quantum_espresso/add_pw2qmcpack_to_qe-6.3.diff"
|
|
patch_checksum = "2ee346e24926479f5e96f8dc47812173a8847a58354bbc32cf2114af7a521c13"
|
|
patch(patch_url, sha256=patch_checksum, when="@6.3+qmcpack")
|
|
|
|
# ELPA
|
|
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")
|
|
|
|
# QE UPSTREAM PATCHES
|
|
# QE 6.6 fix conpile error when FFT_LIBS is specified.
|
|
patch(
|
|
"https://gitlab.com/QEF/q-e/-/commit/cf1fedefc20d39f5cd7551ded700ea4c77ad6e8f.diff",
|
|
sha256="8f179663a8d031aff9b1820a32449942281195b6e7b1ceaab1f729651b43fa58",
|
|
when="+patch@6.6",
|
|
)
|
|
# QE 6.5 INTENT(OUT) without settig value in tetra_weights_only(..., ef):
|
|
# For Fujitsu compiler
|
|
patch(
|
|
"https://gitlab.com/QEF/q-e/-/commit/8f096b53e75026701c681c508e2c24a9378c0950.diff",
|
|
sha256="f4f1cce4182b57ac797c8f6ec8460fe375ee96385fcd8f6a61e1460bc957eb67",
|
|
when="+patch@6.5",
|
|
)
|
|
# QE 6.5 Fix INTENT
|
|
# For Fujitsu compiler
|
|
patch(
|
|
"https://gitlab.com/QEF/q-e/-/commit/c2a86201ed72693ffa50cc99b22f5d3365ae2c2b.diff",
|
|
sha256="b2dadc0bc008a3ad4b74ae85cc380dd2b63f2ae43a634e6f9d8db8077efcea6c",
|
|
when="+patch@6.5",
|
|
)
|
|
# QE 6.3 requires multiple patches to fix MKL detection
|
|
# There may still be problems on Mac with MKL detection
|
|
patch(
|
|
"https://gitlab.com/QEF/q-e/commit/0796e1b7c55c9361ecb6515a0979280e78865e36.diff",
|
|
sha256="bc8c5b8523156cee002d97dab42a5976dffae20605da485a427b902a236d7e6b",
|
|
when="+patch@=6.3",
|
|
)
|
|
|
|
# QE 6.3 `make install` broken and a patch must be applied
|
|
patch(
|
|
"https://gitlab.com/QEF/q-e/commit/88e6558646dbbcfcafa5f3fa758217f6062ab91c.diff",
|
|
sha256="b776890d008e16cca28c31299c62f47de0ba606b900b17cbc27c041f45e564ca",
|
|
when="+patch@=6.3",
|
|
)
|
|
|
|
# QE 6.4.1 patch to work around configure issues that only appear in the
|
|
# Spack environment. We now are able to support:
|
|
# `spack install qe~mpi~scalapack hdf5=serial`
|
|
patch(
|
|
"https://gitlab.com/QEF/q-e/commit/5fb1195b0844e1052b7601f18ab5c700f9cbe648.diff",
|
|
sha256="b1aa3179ee1c069964fb9c21f3b832aebeae54947ce8d3cc1a74e7b154c3c10f",
|
|
when="+patch@6.4.1:6.5.0",
|
|
)
|
|
|
|
# QE 6.4.1 Fix intent for Fujitsu compiler
|
|
patch("fj-intent.6.4.1.patch", when="+patch@6.4.1")
|
|
# QE 6.4.1 Fix intent
|
|
patch(
|
|
"https://gitlab.com/QEF/q-e/-/commit/c2a86201ed72693ffa50cc99b22f5d3365ae2c2b.diff",
|
|
sha256="b2dadc0bc008a3ad4b74ae85cc380dd2b63f2ae43a634e6f9d8db8077efcea6c",
|
|
when="+patch@6.4.1",
|
|
)
|
|
|
|
# QE 6.4.1 Small fixes for XLF compilation
|
|
patch(
|
|
"https://gitlab.com/QEF/q-e/-/commit/cf088926d68792cbaea48960c222e336a3965df6.diff",
|
|
sha256="bbceba1fb08d01d548d4393bbcaeae966def13f75884268a0f84448457b8eaa3",
|
|
when="+patch@6.4.1:6.5.0",
|
|
)
|
|
|
|
# Patch automake configure for AOCC compilers
|
|
patch("configure_aocc.patch", when="@6.7 %aocc")
|
|
|
|
# Configure updated to work with NVIDIA compilers
|
|
patch("nvhpc.patch", when="@6.5 %nvhpc")
|
|
|
|
# Configure updated to work with Fujitsu compilers
|
|
patch("fj.6.5.patch", when="@6.5+patch %fj")
|
|
patch("fj.6.6.patch", when="@6.6:6.7+patch %fj")
|
|
|
|
# extlibs_makefile updated to work with fujitsu compilers
|
|
patch("fj-fox.patch", when="+patch %fj")
|
|
|
|
|
|
class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder):
|
|
def cmake_args(self):
|
|
spec = self.spec
|
|
|
|
cmake_args = [
|
|
self.define_from_variant("QE_ENABLE_MPI", "mpi"),
|
|
self.define_from_variant("QE_ENABLE_OPENMP", "openmp"),
|
|
self.define_from_variant("QE_ENABLE_SCALAPACK", "scalapack"),
|
|
self.define_from_variant("QE_ENABLE_ELPA", "elpa"),
|
|
self.define_from_variant("QE_ENABLE_LIBXC", "libxc"),
|
|
self.define_from_variant("QE_ENABLE_CUDA", "cuda"),
|
|
self.define_from_variant("QE_ENABLE_PROFILE_NVTX", "nvtx"),
|
|
self.define_from_variant("QE_ENABLE_MPI_GPU_AWARE", "mpigpu"),
|
|
]
|
|
|
|
if "+cuda" in self.spec:
|
|
cmake_args.append(self.define("QE_ENABLE_OPENACC", True))
|
|
|
|
# QE prefers taking MPI compiler wrappers as CMake compilers.
|
|
if "+mpi" in spec:
|
|
cmake_args.append(self.define("CMAKE_C_COMPILER", spec["mpi"].mpicc))
|
|
cmake_args.append(self.define("CMAKE_Fortran_COMPILER", spec["mpi"].mpifc))
|
|
|
|
if not spec.satisfies("hdf5=none"):
|
|
cmake_args.append(self.define("QE_ENABLE_HDF5", True))
|
|
|
|
if "+qmcpack" in spec:
|
|
cmake_args.append(self.define("QE_ENABLE_PW2QMCPACK", True))
|
|
|
|
if "^armpl-gcc" in spec or "^acfl" in spec:
|
|
cmake_args.append(self.define("BLAS_LIBRARIES", spec["blas"].libs.joined(";")))
|
|
cmake_args.append(self.define("LAPACK_LIBRARIES", spec["lapack"].libs.joined(";")))
|
|
# Up to q-e@7.1 set BLA_VENDOR to All to force detection of vanilla scalapack
|
|
if spec.satisfies("@:7.1"):
|
|
cmake_args.append(self.define("BLA_VENDOR", "All"))
|
|
|
|
return cmake_args
|
|
|
|
|
|
class GenericBuilder(spack.build_systems.generic.GenericBuilder):
|
|
def install(self, pkg, spec, prefix):
|
|
prefix_path = prefix.bin if "@:5.4.0" in spec else prefix
|
|
options = ["-prefix={0}".format(prefix_path)]
|
|
|
|
# This additional flag is needed anytime the target architecture
|
|
# does not match the host architecture, which results in a binary that
|
|
# configure cannot execute on the login node. This is how we detect
|
|
# cross compilation: If the platform is NOT either Linux or Darwin
|
|
# and the target=backend, that we are in the cross-compile scenario
|
|
# scenario. This should cover Cray, BG/Q, and other custom platforms.
|
|
# The other option is to list out all the platform where you would be
|
|
# cross compiling explicitly.
|
|
if not (spec.satisfies("platform=linux") or spec.satisfies("platform=darwin")):
|
|
if spec.satisfies("target=backend"):
|
|
options.append("--host")
|
|
|
|
# QE autoconf compiler variables has some limitations:
|
|
# 1. There is no explicit MPICC variable so we must re-purpose
|
|
# CC for the case of MPI.
|
|
# 2. F90 variable is set to be consistent with MPIF90 wrapper
|
|
# 3. If an absolute path for F90 is set, the build system breaks.
|
|
#
|
|
# Thus, due to 2. and 3. the F90 variable is not explictly set
|
|
# because it would be mostly pointless and could lead to erroneous
|
|
# behaviour.
|
|
if "+mpi" in spec:
|
|
mpi = spec["mpi"]
|
|
options.append("--enable-parallel=yes")
|
|
options.append("MPIF90={0}".format(mpi.mpifc))
|
|
options.append("CC={0}".format(mpi.mpicc))
|
|
else:
|
|
options.append("--enable-parallel=no")
|
|
options.append("CC={0}".format(env["SPACK_CC"]))
|
|
|
|
options.append("F77={0}".format(env["SPACK_F77"]))
|
|
options.append("F90={0}".format(env["SPACK_FC"]))
|
|
|
|
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 "^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))
|
|
if "+openmp" in spec:
|
|
fftw_ld_flags = spec["fftw:openmp"].libs.ld_flags
|
|
else:
|
|
fftw_ld_flags = spec["fftw"].libs.ld_flags
|
|
options.append("FFT_LIBS={0}".format(fftw_ld_flags))
|
|
|
|
if "^amdfftw" in spec:
|
|
fftw_prefix = spec["amdfftw"].prefix
|
|
options.append("FFTW_INCLUDE={0}".format(fftw_prefix.include))
|
|
if "+openmp" in spec:
|
|
fftw_ld_flags = spec["amdfftw:openmp"].libs.ld_flags
|
|
else:
|
|
fftw_ld_flags = spec["amdfftw"].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
|
|
|
|
# qe-6.5 fails to detect MKL for FFT if BLAS_LIBS is set due to
|
|
# an unfortunate upsteam change in their autoconf/configure:
|
|
# - qe-6.5/install/m4/x_ac_qe_blas.m4 only sets 'have_blas'
|
|
# but no 'have_mkl' if BLAS_LIBS is set (which seems to be o.k.)
|
|
# - however, qe-6.5/install/m4/x_ac_qe_fft.m4 in 6.5 unfortunately
|
|
# relies on x_ac_qe_blas.m4 to detect MKL and set 'have_mkl'
|
|
# - qe-5.4 up to 6.4.1 had a different logic and worked fine with
|
|
# BLAS_LIBS being set
|
|
# However, MKL is correctly picked up by qe-6.5 for BLAS and FFT if
|
|
# MKLROOT is set (which SPACK does automatically for ^mkl)
|
|
if spec.satisfies("@:6.4"): # set even if MKL is selected
|
|
options.append("BLAS_LIBS={0}".format(lapack_blas.ld_flags))
|
|
else: # behavior changed at 6.5 and later
|
|
if not spec.satisfies("^mkl"):
|
|
options.append("BLAS_LIBS={0}".format(lapack_blas.ld_flags))
|
|
|
|
if "+scalapack" in spec:
|
|
if "^mkl" in spec:
|
|
if "^openmpi" in spec:
|
|
scalapack_option = "yes"
|
|
else: # mpich, intel-mpi
|
|
scalapack_option = "intel"
|
|
else:
|
|
scalapack_option = "yes"
|
|
options.append("--with-scalapack={0}".format(scalapack_option))
|
|
scalapack_lib = spec["scalapack"].libs
|
|
options.append("SCALAPACK_LIBS={0}".format(scalapack_lib.ld_flags))
|
|
|
|
if "+libxc" in spec:
|
|
options.append("--with-libxc=yes")
|
|
options.append("--with-libxc-prefix={0}".format(spec["libxc"].prefix))
|
|
|
|
if "+elpa" in spec:
|
|
# Spec for elpa
|
|
elpa = spec["elpa"]
|
|
|
|
# Compute the include directory from there: versions
|
|
# of espresso prior to 6.1 requires -I in front of the directory
|
|
elpa_include = "" if "@6.1:" in spec else "-I"
|
|
elpa_include += join_path(elpa.headers.directories[0], "modules")
|
|
|
|
options.extend(
|
|
[
|
|
"--with-elpa-include={0}".format(elpa_include),
|
|
"--with-elpa-version={0}".format(elpa.version.version[0]),
|
|
]
|
|
)
|
|
|
|
elpa_suffix = "_openmp" if "+openmp" in elpa else ""
|
|
|
|
# Currently AOCC support only static libraries of ELPA
|
|
if "%aocc" in spec:
|
|
options.extend(
|
|
[
|
|
"--with-elpa-lib={0}".format(
|
|
join_path(
|
|
elpa.prefix.lib,
|
|
"libelpa{elpa_suffix}.a".format(elpa_suffix=elpa_suffix),
|
|
)
|
|
)
|
|
]
|
|
)
|
|
else:
|
|
options.extend(["--with-elpa-lib={0}".format(elpa.libs[0])])
|
|
|
|
if spec.variants["hdf5"].value != "none":
|
|
options.append("--with-hdf5={0}".format(spec["hdf5"].prefix))
|
|
if spec.satisfies("@6.4.1,6.5"):
|
|
options.extend(
|
|
[
|
|
"--with-hdf5-include={0}".format(spec["hdf5"].headers.directories[0]),
|
|
"--with-hdf5-libs={0}".format(spec["hdf5:hl,fortran"].libs.ld_flags),
|
|
]
|
|
)
|
|
|
|
configure(*options)
|
|
|
|
# Filter file must be applied after configure executes
|
|
# QE 6.1.0 to QE 6.4 have `-L` missing in front of zlib library
|
|
# This issue is backported through an internal patch in 6.4.1, but
|
|
# can't be applied to the '+qmcpack' variant
|
|
if spec.variants["hdf5"].value != "none":
|
|
if spec.satisfies("@6.1.0:6.4.0") or (spec.satisfies("@6.4.1") and "+qmcpack" in spec):
|
|
make_inc = join_path(self.pkg.stage.source_path, "make.inc")
|
|
zlib_libs = spec["zlib-api"].prefix.lib + " -lz"
|
|
filter_file(zlib_libs, format(spec["zlib-api"].libs.ld_flags), make_inc)
|
|
|
|
# QE 6.8 and later has parallel builds fixed
|
|
if spec.satisfies("@:6.7"):
|
|
parallel_build_on = False
|
|
else:
|
|
parallel_build_on = True
|
|
|
|
if "+epw" in spec:
|
|
make("all", "epw", parallel=parallel_build_on)
|
|
else:
|
|
make("all", parallel=parallel_build_on)
|
|
|
|
if "+gipaw" in spec:
|
|
make("gipaw", parallel=False)
|
|
|
|
if "+environ" in spec:
|
|
addsonpatch = Executable("./install/addsonpatch.sh")
|
|
environpatch = Executable("./Environ/patches/environpatch.sh")
|
|
makedeps = Executable("./install/makedeps.sh")
|
|
|
|
addsonpatch("Environ", "Environ/src", "Modules", "-patch")
|
|
|
|
environpatch("-patch")
|
|
|
|
makedeps()
|
|
|
|
make("pw", parallel=parallel_build_on)
|
|
|
|
if "platform=darwin" in spec:
|
|
mkdirp(prefix.bin)
|
|
install("bin/*.x", prefix.bin)
|
|
else:
|
|
make("install")
|