From 23f16041cdff676166e3820ab84a9af1bd4912ef Mon Sep 17 00:00:00 2001
From: Jeff Hammond <jeff.science@gmail.com>
Date: Fri, 3 May 2024 21:13:54 +0300
Subject: NWChem ARMCI-MPI variant and optional TCE builds (#43883)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* WIP NWChem with ARMCI-MPI and TCE optional
* rename armci-mpi to armcimpi
* add version for git
* add ARMCI-MPI support to NWChem package
   EXTERNAL_ARMCI_PATH needs to be set to the ARMCI-MPI package install prefix.
   I could not get it from spec["armcimpi"] but it worked to use the dependent build environment method to export a    generic environmental variable to use instead.
* i suppose i can maintain NWChem as well
* check rejects option that dozens of packages use
   i do not have time to fight with this nonsense
   Run . share/spack/setup-env.sh
   ==> Error: armcimpi version 'master' has extra arguments: 'branch'
   Valid arguments for a url fetcher are:
       'url', 'sha256', 'md5', 'sha1', 'sha224', 'sha384', 'sha512', and 'checksum'
   Error: Process completed with exit code 1.
* style
* ARMCI-MPI needs depends_on; the rest seems fixed
* fix ARMCI selection per review feedback from @zzzoom
   https://github.com/spack/spack/pull/43883#discussion_r1585014147
* address reviewer feedback from @yizeyi18
   https://github.com/spack/spack/pull/43883#discussion_r1587228084
   elaborate on what +extratce does, in terms of the NWChem build environment variables,
   some of which are documented on https://nwchemgit.github.io/TCE.html.
* style
* Update var/spack/repos/builtin/packages/nwchem/package.py

---------

Signed-off-by: Jeff Hammond <jeff.science@gmail.com>
Co-authored-by: Carlos Bederián <4043375+zzzoom@users.noreply.github.com>
---
 .../repos/builtin/packages/armci-mpi/package.py    | 43 -------------------
 .../repos/builtin/packages/armcimpi/package.py     | 48 ++++++++++++++++++++++
 var/spack/repos/builtin/packages/nwchem/package.py | 44 +++++++++++++++++---
 3 files changed, 86 insertions(+), 49 deletions(-)
 delete mode 100644 var/spack/repos/builtin/packages/armci-mpi/package.py
 create mode 100644 var/spack/repos/builtin/packages/armcimpi/package.py

(limited to 'var')

diff --git a/var/spack/repos/builtin/packages/armci-mpi/package.py b/var/spack/repos/builtin/packages/armci-mpi/package.py
deleted file mode 100644
index 461487c8eb..0000000000
--- a/var/spack/repos/builtin/packages/armci-mpi/package.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2013-2024 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)
-
-from spack.package import *
-
-
-class ArmciMpi(AutotoolsPackage):
-    """ARMCI-MPI is an implementation of the ARMCI library used by Global Arrays.
-    MPI-3 one-sided communication is used to implement ARMCI.
-    """
-
-    homepage = "https://github.com/pmodels/armci-mpi"
-    url = "https://github.com/pmodels/armci-mpi/archive/refs/tags/v0.4.tar.gz"
-
-    maintainers("jeffhammond")
-
-    license("BSD-3-Clause", checked_by="jeffhammond")
-
-    version("0.4", sha256="bcc3bb189b23bf653dcc69bc469eb86eae5ebc5ad94ab5f83e52ddbdbbebf1b1")
-    version(
-        "0.3.1-beta", sha256="f3eaa8f365fb55123ecd9ced401086b0732e37e4df592b27916d71a67ab34fe9"
-    )
-
-    variant("shared", default=True, description="Builds a shared version of the library")
-    variant("progress", default=False, description="Enable asynchronous progress")
-
-    depends_on("autoconf", type="build")
-    depends_on("automake", type="build")
-    depends_on("libtool", type="build")
-    depends_on("m4", type="build")
-
-    depends_on("mpi")
-
-    def autoreconf(self, spec, prefix):
-        autoreconf("--install", "--verbose", "--force")
-
-    def configure_args(self):
-        args = ["--enable-g"]
-        args.extend(self.enable_or_disable("shared"))
-        args.extend(self.with_or_without("progress"))
-        return args
diff --git a/var/spack/repos/builtin/packages/armcimpi/package.py b/var/spack/repos/builtin/packages/armcimpi/package.py
new file mode 100644
index 0000000000..e2126f5de2
--- /dev/null
+++ b/var/spack/repos/builtin/packages/armcimpi/package.py
@@ -0,0 +1,48 @@
+# Copyright 2013-2024 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)
+
+from spack.package import *
+
+
+class Armcimpi(AutotoolsPackage):
+    """ARMCI-MPI is an implementation of the ARMCI library used by Global Arrays.
+    MPI-3 one-sided communication is used to implement ARMCI.
+    """
+
+    homepage = "https://github.com/pmodels/armci-mpi"
+    url = "https://github.com/pmodels/armci-mpi/archive/refs/tags/v0.4.tar.gz"
+
+    maintainers("jeffhammond")
+
+    license("BSD-3-Clause", checked_by="jeffhammond")
+
+    version("0.4", sha256="bcc3bb189b23bf653dcc69bc469eb86eae5ebc5ad94ab5f83e52ddbdbbebf1b1")
+    version(
+        "0.3.1-beta", sha256="f3eaa8f365fb55123ecd9ced401086b0732e37e4df592b27916d71a67ab34fe9"
+    )
+
+    variant("shared", default=True, description="Builds a shared version of the library")
+    variant("progress", default=False, description="Enable asynchronous progress")
+
+    provides("armci")
+
+    depends_on("autoconf", type="build")
+    depends_on("automake", type="build")
+    depends_on("libtool", type="build")
+    depends_on("m4", type="build")
+
+    depends_on("mpi")
+
+    def autoreconf(self, spec, prefix):
+        autoreconf("--install", "--verbose", "--force")
+
+    def configure_args(self):
+        args = ["--enable-g"]
+        args.extend(self.enable_or_disable("shared"))
+        args.extend(self.with_or_without("progress"))
+        return args
+
+    def setup_dependent_build_environment(self, env, dependent_spec):
+        env.set("ARMCIMPI_DIR", self.prefix)
diff --git a/var/spack/repos/builtin/packages/nwchem/package.py b/var/spack/repos/builtin/packages/nwchem/package.py
index 3e557c75a2..72465aa52d 100644
--- a/var/spack/repos/builtin/packages/nwchem/package.py
+++ b/var/spack/repos/builtin/packages/nwchem/package.py
@@ -17,6 +17,8 @@ class Nwchem(Package):
 
     tags = ["ecp", "ecp-apps"]
 
+    maintainers("jeffhammond")
+
     version(
         "7.2.2",
         sha256="6b68e9c12eec38c09d92472bdd1ff130b93c1b5e1f65e4702aa7ee36c80e4af7",
@@ -34,7 +36,17 @@ class Nwchem(Package):
     )
 
     variant("openmp", default=False, description="Enables OpenMP support")
-    variant("mpipr", default=False, description="Enables ARMCI with progress rank")
+    variant(
+        "armci",
+        values=("mpi-ts", "mpi-pr", "armcimpi", "mpi3", "openib", "ofi"),
+        default="mpi-ts",
+        description="ARMCI runtime",
+    )
+    variant(
+        "extratce",
+        default=False,
+        description="Enables rarely-used TCE features (CCSDTQ, CCSDTLR, EACCSD, IPCCSD, MRCC)",
+    )
     variant("fftw3", default=False, description="Link against the FFTW library")
     variant("libxc", default=False, description="Support additional functionals via libxc")
     variant(
@@ -60,6 +72,9 @@ class Nwchem(Package):
     depends_on("blas")
     depends_on("lapack")
     depends_on("mpi")
+    depends_on("armcimpi", when="armci=armcimpi")
+    depends_on("libfabric", when="armci=ofi")
+    depends_on("rdma-core", when="armci=openib")
     depends_on("scalapack")
     depends_on("fftw-api@3", when="+fftw3")
     depends_on("libxc", when="+libxc")
@@ -88,10 +103,6 @@ class Nwchem(Package):
                 f"LAPACK_LIB={lapack.ld_flags}",
                 f"SCALAPACK_LIB={scalapack.ld_flags}",
                 "USE_NOIO=Y",  # skip I/O algorithms
-                "MRCC_METHODS=y",  # TCE extra module
-                "IPCCSD=y",  # TCE extra module
-                "EACCSD=y",  # TCE extra module
-                "CCSDTQ=y",  # TCE extra module
                 "V=1",  # verbose build
             ]
         )
@@ -121,11 +132,32 @@ class Nwchem(Package):
 
         args.extend([f"NWCHEM_TARGET={target}"])
 
+        # These optional components of TCE are rarely used and in some cases
+        # increase the compilation time significantly (CCSDTLR and CCSDTQ).
+        if spec.satisfies("+extratce"):
+            args.extend(["MRCC_METHODS=y"])
+            args.extend(["IPCCSD=y"])
+            args.extend(["EACCSD=y"])
+            args.extend(["CCSDTLR=y"])
+            args.extend(["CCSDTQ=y"])
+
         if spec.satisfies("+openmp"):
             args.extend(["USE_OPENMP=y"])
 
-        if spec.satisfies("+mpipr"):
+        if self.spec.variants["armci"].value == "armcimpi":
+            armcimpi = spec["armci"]
+            args.extend(["ARMCI_NETWORK=ARMCI"])
+            args.extend([f"EXTERNAL_ARMCI_PATH={armcimpi.prefix}"])
+        elif self.spec.variants["armci"].value == "mpi-pr":
             args.extend(["ARMCI_NETWORK=MPI-PR"])
+        elif self.spec.variants["armci"].value == "mpi-ts":
+            args.extend(["ARMCI_NETWORK=MPI-TS"])
+        elif self.spec.variants["armci"].value == "mpi3":
+            args.extend(["ARMCI_NETWORK=MPI3"])
+        elif self.spec.variants["armci"].value == "openib":
+            args.extend(["ARMCI_NETWORK=OPENIB"])
+        elif self.spec.variants["armci"].value == "ofi":
+            args.extend(["ARMCI_NETWORK=OFI"])
 
         if spec.satisfies("+fftw3"):
             args.extend(["USE_FFTW3=y"])
-- 
cgit v1.2.3-70-g09d2