spack/var/spack/repos/builtin/packages/lammps/package.py
2023-04-07 09:28:28 -07:00

785 lines
29 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 datetime as dt
import archspec
from spack.package import *
class Lammps(CMakePackage, CudaPackage, ROCmPackage):
"""LAMMPS stands for Large-scale Atomic/Molecular Massively
Parallel Simulator.
"""
homepage = "https://www.lammps.org/"
url = "https://github.com/lammps/lammps/archive/patch_1Sep2017.tar.gz"
git = "https://github.com/lammps/lammps.git"
tags = ["ecp", "ecp-apps"]
maintainers("rbberger")
# rules for new versions and deprecation
# * new stable versions should be marked as preferred=True
# * a stable version that has updates and any of its outdated update releases should be
# marked deprecated=True
# * patch releases older than a stable release should be marked deprecated=True
version("develop", branch="develop")
version("20230208", sha256="60221242145da4479e5b207d9a0eed90af4168d7a297b4dc8c0e7f2b3215602e")
version("20221222", sha256="75372ee7ef982767fc4ed4dc95e20ddca8247419adeb0c1276c40e43d1eab955")
version("20221103", sha256="d28517b84b157d4e46a1a64ed787b4662d8f2f5ade3f5a04bb0caed068f32f7e")
version("20220915", sha256="392b8d35fc7919b0efaf8b389259a9b795a817e58e75e380467c63d03a0dab75")
version("20220803", sha256="f37cb0b35c1682ffceae5826aadce47278aa7003099a1655fcea43acd7d37926")
version(
"20220623.3",
sha256="8a276a01b50d37eecfe6eb36f420f354cde51936d20aca7944dea60d3c098c89",
preferred=True,
)
version(
"20220623.2",
sha256="8a560213e83919623525c4a7c4b5f0eda35cdf3b0c0e6548fd891379e04ca9e6",
preferred=True,
deprecated=True,
)
version(
"20220623.1",
sha256="58e3b2b984f8935bb0db5631e143be2826c45ffd48844f7c394f36624a3e17a2",
preferred=True,
deprecated=True,
)
version(
"20220623",
sha256="d27ede095c9f00cd13a26f967a723d07cf8f4df65c700ed73573577bc173d5ce",
preferred=True,
deprecated=True,
)
version(
"20220602",
sha256="3e8f54453e53b3b387a68317277f832b8cf64a981e64b21e98bb37ea36ac4a60",
deprecated=True,
)
version(
"20220504",
sha256="fe05bae8090fd0177b3c1b987cd32a9cb7cd05d790828ba954c764eb52e10b52",
deprecated=True,
)
version(
"20220324",
sha256="d791cc93eedfc345fdf87bfa5b6f7e17e461f86ba197f9e9c3d477ce8657a7ef",
deprecated=True,
)
version(
"20220217",
sha256="e5bd2bf325835fa98d1b95f0667c83076580916027df5b8109d5470d1b97da98",
deprecated=True,
)
version(
"20220107",
sha256="fbf6c6814968ae0d772d7b6783079ff4f249a8faeceb39992c344969e9f1edbb",
deprecated=True,
)
version(
"20211214",
sha256="9f7b1ee2394678c1a6baa2c158a62345680a952eee251783e3c246b3f12db4c9",
deprecated=True,
)
version(
"20211027",
sha256="c06f682fcf9d5921ca90c857a104e90fba0fe65decaac9732745e4da49281938",
deprecated=True,
)
version(
"20210929.3",
sha256="e4c274f0dc5fdedc43f2b365156653d1105197a116ff2bafe893523cdb22532e",
preferred=True,
)
version(
"20210929.2",
sha256="9318ca816cde16a9a4174bf22a1966f5f2155cb32c0ad5a6757633276411fb36",
preferred=True,
deprecated=True,
)
version(
"20210929.1",
sha256="5000b422c9c245b92df63507de5aa2ea4af345ea1f00180167aaa084b711c27c",
preferred=True,
deprecated=True,
)
version(
"20210929",
sha256="2dff656cb21fd9a6d46c818741c99d400cfb1b12102604844663b655fb2f893d",
preferred=True,
deprecated=True,
)
version(
"20210920",
sha256="e3eba96933c1dd3177143c7ac837cae69faceba196948fbad2970425db414d8c",
deprecated=True,
)
version(
"20210831",
sha256="532c42576a79d72682deaf43225ca773ed9f9e35deb484a82f91905b6cba23ec",
deprecated=True,
)
version(
"20210730",
sha256="c5e998c8282a835d2bcba4fceffe3cecdf9aed9bdf79fa9c945af573e632f6e7",
deprecated=True,
)
version(
"20210728",
sha256="6b844d2c3f7170a59d36fbf761483aa0c63d95eda254d00fe4d10542403abe36",
deprecated=True,
)
version(
"20210702",
sha256="4fdd8ca2dbde8809c0048716650b73ae1f840e22ebe24b25f6f7a499377fea57",
deprecated=True,
)
version(
"20210527",
sha256="f9f29970941f406d5c250de52a4cd07e5a4e44ae3b5ffed46edd019d998b8c33",
deprecated=True,
)
version(
"20210514",
sha256="74d9c4386f2181b15a024314c42b7a0b0aaefd3b4b947aeca00fe07e5b2f3317",
deprecated=True,
)
version(
"20210408",
sha256="1645147b7777de4f616b8232edf0b597868084f969c777fa0a757949c3f71f56",
deprecated=True,
)
version(
"20210310",
sha256="25708378dbeccf794bc5045aceb84380bf4a3ca03fc8e5d150a26ca88d371474",
deprecated=True,
)
version(
"20210210",
sha256="2c5ba2c7935ad559ca94ee826e8727e65b49ef4582eb856534fffba70e44101a",
deprecated=True,
)
version(
"20201029",
sha256="759705e16c1fedd6aa6e07d028cc0c78d73c76b76736668420946a74050c3726",
preferred=True,
)
version(
"20200721",
sha256="845bfeddb7b667799a1a5dbc166b397d714c3d2720316604a979d3465b4190a9",
deprecated=True,
)
version(
"20200630",
sha256="413cbfabcc1541a339c7a4ab5693fbeb768f46bb1250640ba94686c6e90922fc",
deprecated=True,
)
version(
"20200505",
sha256="c49d77fd602d28ebd8cf10f7359b9fc4d14668c72039028ed7792453d416de73",
deprecated=True,
)
version(
"20200303",
sha256="a1a2e3e763ef5baecea258732518d75775639db26e60af1634ab385ed89224d1",
preferred=True,
)
version(
"20200227",
sha256="1aabcf38bc72285797c710b648e906151a912c36b634a9c88ac383aacf85516e",
deprecated=True,
)
version(
"20200218",
sha256="73bcf146660804ced954f6a0a8dce937482677778d46018ca5a688127bf97211",
deprecated=True,
)
version(
"20200204",
sha256="3bf3de546ede34ffcd89f1fca5fd66aa78c662e7c8a76e30ce593e44a00d23ce",
deprecated=True,
)
version(
"20200124",
sha256="443829560d760690e1ae21ad54922f56f34f640a81e817f5cc65d2a4af3a6a5d",
deprecated=True,
)
version(
"20200109",
sha256="f2fd24f6c10837801f490913d73f672ec7c6becda08465d7e834a2bfbe3d7cd6",
deprecated=True,
)
version(
"20191120",
sha256="fd146bf517a6c2fb8a69ecb3749dc352eef94414739cd7855c668c690af85d27",
deprecated=True,
)
version(
"20191030",
sha256="5279567f731386ffdb87800b448903a63de2591064e13b4d5216acae25b7e541",
deprecated=True,
)
version(
"20190919",
sha256="0f693203afe86bc70c084c55f29330bdeea3e3ad6791f81c727f7a34a7f6caf3",
deprecated=True,
)
version(
"20190807",
sha256="895d71914057e070fdf0ae5ccf9d6552b932355056690bdb8e86d96549218cc0",
deprecated=True,
)
version(
"20190605",
sha256="c7b35090aef7b114d2b47a7298c1e8237dd811da87995c997bf7639cca743152",
deprecated=True,
)
version(
"20181212",
sha256="ccc5d2c21c4b62ce4afe7b3a0fe2f37b83e5a5e43819b7c2e2e255cce2ce0f24",
deprecated=True,
)
version(
"20181207",
sha256="d92104d008a7f1d0b6071011decc5c6dc8b936a3418b20bd34b055371302557f",
deprecated=True,
)
version(
"20181127",
sha256="c076b633eda5506f895de4c73103df8b995d9fec01be82c67c7608efcc345179",
deprecated=True,
)
version(
"20181115",
sha256="3bc9c166e465cac625c4a8e4060e597003f4619dadd57d3bc8d25bcd930f286e",
deprecated=True,
)
version(
"20181109",
sha256="dd30fe492fa147fb6f39bfcc79d8c786b9689f7fbe86d56de58cace53b6198c9",
deprecated=True,
)
version(
"20181024",
sha256="a171dff5aff7aaa2c9606ab2abc9260f2b685a5c7f6d650e7f2b59cf4aa149d6",
deprecated=True,
)
version(
"20181010",
sha256="bda762ee2d2dcefe0b4e36fb689c6b9f7ede49324444ccde6c59cba727b4b02d",
deprecated=True,
)
version(
"20180918",
sha256="02f143d518d8647b77137adc527faa9725c7afbc538d670253169e2a9b3fa0e6",
deprecated=True,
)
version(
"20180905",
sha256="ee0df649e33a9bf4fe62e062452978731548a56b7487e8e1ce9403676217958d",
deprecated=True,
)
version(
"20180831",
sha256="6c604b3ebd0cef1a5b18730d2c2eb1e659b2db65c5b1ae6240b8a0b150e4dff3",
deprecated=True,
)
version(
"20180822",
sha256="9f8942ca3f8e81377ae88ccfd075da4e27d0dd677526085e1a807777c8324074",
deprecated=True,
)
version(
"20180629",
sha256="1acf7d9b37b99f17563cd4c8bb00ec57bb2e29eb77c0603fd6871898de74763b",
deprecated=True,
)
version(
"20180316",
sha256="a81f88c93e417ecb87cd5f5464c9a2570384a48ff13764051c5e846c3d1258c1",
deprecated=True,
)
version(
"20180222",
sha256="374254d5131b7118b9ab0f0e27d20c3d13d96b03ed2b5224057f0c1065828694",
deprecated=True,
)
version(
"20170922",
sha256="f0bf6eb530d528f4d261d0a261e5616cbb6e990156808b721e73234e463849d3",
deprecated=True,
)
version(
"20170901",
sha256="5d88d4e92f4e0bb57c8ab30e0d20de556830af820223778b9967bec2184efd46",
deprecated=True,
)
def url_for_version(self, version):
split_ver = str(version).split(".")
vdate = dt.datetime.strptime(split_ver[0], "%Y%m%d")
if len(split_ver) < 2:
update = ""
else:
update = "_update{0}".format(split_ver[1])
is_stable = (
version in self.versions
and "preferred" in self.versions[version]
and self.versions[version]["preferred"]
)
return "https://github.com/lammps/lammps/archive/{0}_{1}{2}.tar.gz".format(
"stable" if is_stable else "patch", vdate.strftime("%d%b%Y").lstrip("0"), update
)
# List of supported optional packages
# Note: package `openmp` in this recipe is called `openmp-package`, to avoid clash
# with the pre-existing `openmp` variant
# version ranges generates using utility script:
# https://gist.github.com/rbberger/fdaa38ff08e5961c4741624a4719cdb6
supported_packages = {
"adios": {"when": "@20210702:"},
"amoeba": {"when": "@20220803:"},
"asphere": {},
"atc": {"when": "@20210702:"},
"awpmd": {"when": "@20210702:"},
"bocs": {"when": "@20210702:"},
"body": {},
"bpm": {"when": "@20220504:"},
"brownian": {"when": "@20210702:"},
"cg-dna": {"when": "@20210702:"},
"cg-sdk": {"when": "@20210702:20220623"},
"cg-spica": {"when": "@20220803:"},
"class2": {},
"colloid": {},
"colvars": {"when": "@20210702:"},
"compress": {},
"coreshell": {},
"dielectric": {"when": "@20210702:"},
"diffraction": {"when": "@20210702:"},
"dipole": {},
"dpd-basic": {"when": "@20210702:"},
"dpd-meso": {"when": "@20210702:"},
"dpd-react": {"when": "@20210702:"},
"dpd-smooth": {"when": "@20210702:"},
"drude": {"when": "@20210702:"},
"eff": {"when": "@20210702:"},
"electrode": {"when": "@20220504:"},
"extra-compute": {"when": "@20210728:"},
"extra-dump": {"when": "@20210728:"},
"extra-fix": {"when": "@20210728:"},
"extra-molecule": {"when": "@20210728:"},
"extra-pair": {"when": "@20210728:"},
"fep": {"when": "@20210702:"},
"granular": {},
"h5md": {"when": "@20210702:"},
"intel": {"when": "@20210702:"},
"interlayer": {"when": "@20210728:"},
"kim": {},
"kokkos": {},
"kspace": {"default": True},
"latboltz": {"when": "@20210702:"},
"latte": {"when": "@20170922:"},
"lepton": {"when": "@20230208:"},
"machdyn": {"when": "@20210702:"},
"manifold": {"when": "@20210702:"},
"manybody": {"default": True},
"mc": {},
"meam": {"when": "@:20181212,20210702:"},
"mesont": {"when": "@20210702:"},
"mgpt": {"when": "@20210702:"},
"misc": {},
"ml-hdnnp": {"when": "@20210702:"},
"ml-iap": {"when": "@20210702:"},
"ml-pod": {"when": "@20221222:"},
"ml-rann": {"when": "@20210702:"},
"ml-snap": {"when": "@20210702:"},
"mliap": {"when": "@20200630:20210527"},
"mofff": {"when": "@20210702:"},
"molecule": {"default": True},
"molfile": {"when": "@20210702:"},
"mpiio": {},
"netcdf": {"when": "@20210702:"},
"openmp-package": {},
"opt": {},
"orient": {"when": "@20210728:"},
"peri": {},
"phonon": {"when": "@20210702:"},
"plugin": {"when": "@20210408:"},
"plumed": {"when": "@20210702:"},
"poems": {},
"ptm": {"when": "@20210702:"},
"python": {},
"qeq": {},
"qtb": {"when": "@20210702:"},
"reaction": {"when": "@20210702:"},
"reax": {"when": "@:20181212"},
"reaxff": {"when": "@20210702:"},
"replica": {},
"rigid": {"default": True},
"shock": {},
"smtbq": {"when": "@20210702:"},
"snap": {"when": "@:20210527"},
"sph": {"when": "@20210702:"},
"spin": {"when": "@20180629:"},
"srd": {},
"tally": {"when": "@20210702:"},
"uef": {"when": "@20210702:"},
"user-adios": {"when": "@20190228:20210527"},
"user-atc": {"when": "@:20210527"},
"user-awpmd": {"when": "@:20210527"},
"user-bocs": {"when": "@20180511:20210527"},
"user-brownian": {"when": "@20210514:20210527"},
"user-cgsdk": {"when": "@20170504:20210527"},
"user-colvars": {"when": "@:20210527"},
"user-diffraction": {"when": "@:20210527"},
"user-dpd": {"when": "@:20210527"},
"user-drude": {"when": "@:20210527"},
"user-eff": {"when": "@:20210527"},
"user-fep": {"when": "@:20210527"},
"user-h5md": {"when": "@:20210527"},
"user-hdnnp": {"when": "@20210527"},
"user-intel": {"when": "@:20210527"},
"user-lb": {"when": "@:20210527"},
"user-manifold": {"when": "@:20210527"},
"user-meamc": {"when": "@20170706:20210527"},
"user-mesodpd": {"when": "@20200319:20210527"},
"user-mesont": {"when": "@20200615:20210527"},
"user-mgpt": {"when": "@:20210527"},
"user-misc": {"when": "@:20210702"},
"user-mofff": {"when": "@20180205:20210527"},
"user-molfile": {"when": "@:20210527"},
"user-netcdf": {"when": "@20170504:20210527"},
"user-omp": {"when": "@:20210527"},
"user-phonon": {"when": "@:20210527"},
"user-plumed": {"when": "@20181109:20210527"},
"user-ptm": {"when": "@20181010:20210527"},
"user-qtb": {"when": "@:20210527"},
"user-rann": {"when": "@20210527"},
"user-reaction": {"when": "@20200319:20210527"},
"user-reaxc": {"when": "@:20210527"},
"user-sdpd": {"when": "@20181109:20210527"},
"user-smd": {"when": "@:20210527"},
"user-smtbq": {"when": "@:20210527"},
"user-sph": {"when": "@:20210527"},
"user-tally": {"when": "@:20210527"},
"user-uef": {"when": "@20171023:20210527"},
"user-vtk": {"when": "@20210527"},
"user-yaff": {"when": "@20190201:20210527"},
"voronoi": {},
"vtk": {"when": "@20210702:"},
"yaff": {"when": "@20210702:"},
# "mdi": {"when": "@20210702:"}, no mdi package
# "ml-pace": {"when": "@20210702:"}, no pace package
# "ml-quip": {"when": "@20210702:"}, no quip package
# "scafacos": {"when": "@20210702:"}, no scafacos package
# "user-quip": {"when": "@20190201:20210527"}, no quip package
# "user-scafacos": {"when": "@20180905:20210527"}, no scafacos package
}
for pkg_name, pkg_options in supported_packages.items():
variant(
pkg_name,
default=pkg_options.get("default", False),
description="Activate the {} package".format(pkg_name.replace("-package", "")),
when=pkg_options.get("when", None),
)
variant("lib", default=True, description="Build the liblammps in addition to the executable")
variant("mpi", default=True, description="Build with mpi")
variant("jpeg", default=False, description="Build with jpeg support")
variant("png", default=False, description="Build with png support")
variant("ffmpeg", default=False, description="Build with ffmpeg support")
variant("openmp", default=True, description="Build with OpenMP")
variant("opencl", default=False, description="Build with OpenCL")
variant("exceptions", default=False, description="Build with lammps exceptions")
variant(
"cuda_mps",
default=False,
description="(CUDA only) Enable tweaks for running "
+ "with Nvidia CUDA Multi-process services daemon",
)
variant(
"lammps_sizes",
default="smallbig",
description="LAMMPS integer sizes (smallsmall: all 32-bit, smallbig:"
+ "64-bit #atoms #timesteps, bigbig: also 64-bit imageint, 64-bit atom ids)",
values=("smallbig", "bigbig", "smallsmall"),
multi=False,
)
variant(
"fftw_precision",
default="double",
when="+kspace",
description="Select FFTW precision (used by Kspace)",
values=("single", "double"),
multi=False,
)
variant(
"gpu_precision",
default="mixed",
when="~kokkos",
description="Select GPU precision (used by GPU package)",
values=("double", "mixed", "single"),
multi=False,
)
depends_on("mpi", when="+mpi")
depends_on("mpi", when="+mpiio")
depends_on("fftw-api@3", when="+kspace")
depends_on("hipfft", when="+kspace+kokkos+rocm")
depends_on("voropp+pic", when="+voronoi")
depends_on("netcdf-c+mpi", when="+user-netcdf")
depends_on("netcdf-c+mpi", when="+netcdf")
depends_on("blas", when="+user-atc")
depends_on("blas", when="+atc")
depends_on("lapack", when="+user-atc")
depends_on("lapack", when="+atc")
depends_on("opencl", when="+opencl")
depends_on("latte@1.0.1", when="@:20180222+latte")
depends_on("latte@1.1.1:", when="@20180316:20180628+latte")
depends_on("latte@1.2.1:", when="@20180629:20200505+latte")
depends_on("latte@1.2.2:", when="@20200602:+latte")
depends_on("blas", when="+latte")
depends_on("lapack", when="+latte")
depends_on("python", when="+python")
depends_on("mpi", when="+user-lb")
depends_on("mpi", when="+latboltz")
depends_on("mpi", when="+user-h5md")
depends_on("mpi", when="+h5md")
depends_on("hdf5", when="+user-h5md")
depends_on("hdf5", when="+h5md")
depends_on("jpeg", when="+jpeg")
depends_on("kim-api", when="+kim")
depends_on("curl", when="@20190329:+kim")
depends_on("libpng", when="+png")
depends_on("ffmpeg", when="+ffmpeg")
depends_on("kokkos+deprecated_code+shared@3.0.00", when="@20200303+kokkos")
depends_on("kokkos+shared@3.1:", when="@20200505:+kokkos")
depends_on("kokkos@3.7.01:", when="@20230208: +kokkos")
depends_on("adios2", when="+user-adios")
depends_on("adios2", when="+adios")
depends_on("plumed", when="+user-plumed")
depends_on("plumed", when="+plumed")
depends_on("eigen@3:", when="+user-smd")
depends_on("eigen@3:", when="+machdyn")
depends_on("py-cython", when="+mliap+python")
depends_on("py-cython", when="+ml-iap+python")
depends_on("py-numpy", when="+python")
depends_on("py-mpi4py", when="+python+mpi")
depends_on("py-setuptools", when="@20220217:+python", type="build")
depends_on("n2p2@2.1.4:", when="+user-hdnnp")
depends_on("n2p2@2.1.4:", when="+ml-hdnnp")
depends_on("n2p2+shared", when="+lib ^n2p2")
depends_on("vtk", when="+user-vtk")
depends_on("vtk", when="+vtk")
depends_on("hipcub", when="~kokkos +rocm")
depends_on("llvm-amdgpu +openmp", when="+rocm +openmp", type="build")
# propagate CUDA and ROCm architecture when +kokkos
for arch in CudaPackage.cuda_arch_values:
depends_on("kokkos+cuda cuda_arch=%s" % arch, when="+kokkos+cuda cuda_arch=%s" % arch)
for arch in ROCmPackage.amdgpu_targets:
depends_on(
"kokkos+rocm amdgpu_target=%s" % arch, when="+kokkos+rocm amdgpu_target=%s" % arch
)
depends_on("googletest", type="test")
depends_on("libyaml", type="test")
extends("python", when="+python")
conflicts("+cuda", when="+opencl")
conflicts("+rocm", when="+opencl")
conflicts("+body", when="+poems@:20180628")
conflicts("+latte", when="@:20170921")
conflicts("+python", when="~lib")
conflicts("+qeq", when="~manybody")
conflicts("+user-atc", when="~manybody")
conflicts("+atc", when="~manybody")
conflicts("+user-misc", when="~manybody")
conflicts("+user-phonon", when="~kspace")
conflicts("+phonon", when="~kspace")
conflicts("%gcc@9:", when="@:20200303+openmp")
conflicts("+kokkos", when="@:20200227")
conflicts("+dielectric", when="~kspace")
conflicts("+dielectric", when="@:20210702~user-misc")
conflicts("+dielectric", when="@20210728:~extra-pair")
conflicts("+electrode", when="~kspace")
conflicts("+mliap", when="~snap")
conflicts("+ml-iap", when="~ml-snap")
conflicts(
"+user-adios +mpi",
when="^adios2~mpi",
msg="With +user-adios, mpi setting for adios2 and lammps must be the same",
)
conflicts(
"+user-adios ~mpi",
when="^adios2+mpi",
msg="With +user-adios, mpi setting for adios2 and lammps must be the same",
)
conflicts(
"+adios +mpi",
when="^adios2~mpi",
msg="With +adios, mpi setting for adios2 and lammps must be the same",
)
conflicts(
"+adios ~mpi",
when="^adios2+mpi",
msg="With +adios, mpi setting for adios2 and lammps must be the same",
)
conflicts(
"~kokkos+rocm",
when="@:20220602",
msg="ROCm builds of the GPU package not maintained prior to version 20220623",
)
conflicts("+intel", when="%aocc@:3.2.9999", msg="+intel with AOCC requires version 4 or newer")
patch("lib.patch", when="@20170901")
patch("660.patch", when="@20170922")
patch("gtest_fix.patch", when="@:20210310 %aocc@3.2.0")
patch("intel-aocc.patch", when="@20220324:20221103 +intel %aocc")
patch(
"https://github.com/lammps/lammps/commit/562300996285fdec4ef74542383276898555af06.patch?full_index=1",
sha256="e6f1b62bbfdc79d632f4cea98019202d0dd25aa4ae61a70df1164cb4f290df79",
when="@20200721 +cuda",
)
patch("hip_cmake.patch", when="@20220623:20221222 ~kokkos+rocm")
root_cmakelists_dir = "cmake"
def cmake_args(self):
spec = self.spec
mpi_prefix = "ENABLE"
pkg_prefix = "ENABLE"
if spec.satisfies("@20180629:"):
mpi_prefix = "BUILD"
pkg_prefix = "PKG"
args = [
self.define_from_variant("BUILD_SHARED_LIBS", "lib"),
self.define_from_variant("LAMMPS_EXCEPTIONS", "exceptions"),
self.define_from_variant("{}_MPI".format(mpi_prefix), "mpi"),
self.define_from_variant("BUILD_OMP", "openmp"),
self.define("ENABLE_TESTING", self.run_tests),
]
if "~kokkos" in spec:
# LAMMPS can be build with the GPU package OR the KOKKOS package
# Using both in a single build is discouraged.
# +cuda only implies that one of the two is used
# by default it will use the GPU package if kokkos wasn't enabled
if "+cuda" in spec:
args.append(self.define("PKG_GPU", True))
args.append(self.define("GPU_API", "cuda"))
args.append(self.define_from_variant("GPU_PREC", "gpu_precision"))
cuda_arch = spec.variants["cuda_arch"].value
if cuda_arch != "none":
args.append(self.define("GPU_ARCH", "sm_{0}".format(cuda_arch[0])))
args.append(self.define_from_variant("CUDA_MPS_SUPPORT", "cuda_mps"))
elif "+opencl" in spec:
# LAMMPS downloads and bundles its own OpenCL ICD Loader by default
args.append(self.define("USE_STATIC_OPENCL_LOADER", False))
args.append(self.define("PKG_GPU", True))
args.append(self.define("GPU_API", "opencl"))
args.append(self.define_from_variant("GPU_PREC", "gpu_precision"))
elif "+rocm" in spec:
args.append(self.define("PKG_GPU", True))
args.append(self.define("GPU_API", "hip"))
args.append(self.define_from_variant("GPU_PREC", "gpu_precision"))
args.append(self.define_from_variant("HIP_ARCH", "amdgpu_target"))
else:
args.append(self.define("PKG_GPU", False))
if spec.satisfies("@20180629:+lib"):
args.append(self.define("BUILD_LIB", True))
if spec.satisfies("%aocc"):
if spec.satisfies("+intel"):
cxx_flags = (
"-Ofast -fno-math-errno -fno-unroll-loops "
"-fveclib=AMDLIBM -muse-unaligned-vector-move"
)
# add -fopenmp-simd if OpenMP not already turned on
if spec.satisfies("~openmp"):
cxx_flags += " -fopenmp-simd"
cxx_flags += " -DLMP_SIMD_COMPILER -DUSE_OMP_SIMD -DLMP_INTEL_USELRT"
else:
cxx_flags = "-Ofast -mfma -fvectorize -funroll-loops"
args.append(self.define("CMAKE_CXX_FLAGS_RELEASE", cxx_flags))
args.append(self.define("CMAKE_CXX_FLAGS_RELWITHDEBINFO", cxx_flags))
# Overwrite generic cpu tune option
cmake_tune_flags = archspec.cpu.TARGETS[spec.target.name].optimization_flags(
spec.compiler.name, spec.compiler.version
)
args.append(self.define("CMAKE_TUNE_FLAGS", cmake_tune_flags))
args.append(self.define_from_variant("LAMMPS_SIZES", "lammps_sizes"))
args.append(self.define_from_variant("WITH_JPEG", "jpeg"))
args.append(self.define_from_variant("WITH_PNG", "png"))
args.append(self.define_from_variant("WITH_FFMPEG", "ffmpeg"))
for pkg, params in self.supported_packages.items():
if "when" not in params or spec.satisfies(params["when"]):
opt = "{0}_{1}".format(pkg_prefix, pkg.replace("-package", "").upper())
args.append(self.define(opt, "+{0}".format(pkg) in spec))
if "+kspace" in spec:
# If FFTW3 is selected, then CMake will try to detect, if threaded
# FFTW libraries are available and enable them by default.
if "^fftw" in spec or "^cray-fftw" in spec or "^amdfftw" in spec:
args.append(self.define("FFT", "FFTW3"))
elif "^mkl" in spec:
args.append(self.define("FFT", "MKL"))
elif "^armpl-gcc" in spec:
args.append(self.define("FFT", "FFTW3"))
args.append(self.define("FFTW3_LIBRARY", self.spec["fftw-api"].libs[0]))
args.append(
self.define("FFTW3_INCLUDE_DIR", self.spec["fftw-api"].headers.directories[0])
)
# Using the -DFFT_SINGLE setting trades off a little accuracy
# for reduced memory use and parallel communication costs
# for transposing 3d FFT data.
args.append(self.define("FFT_SINGLE", spec.satisfies("fftw_precision=single")))
if "+kokkos" in spec:
args.append(self.define("EXTERNAL_KOKKOS", True))
if "+user-adios" in spec or "+adios" in spec:
args.append(self.define("ADIOS2_DIR", self.spec["adios2"].prefix))
if "+user-plumed" in spec or "+plumed" in spec:
args.append(self.define("DOWNLOAD_PLUMED", False))
if "+shared" in self.spec["plumed"]:
args.append(self.define("PLUMED_MODE", "shared"))
else:
args.append(self.define("PLUMED_MODE", "static"))
if "+user-smd" in spec or "+machdyn" in spec:
args.append(self.define("DOWNLOAD_EIGEN3", False))
args.append(self.define("EIGEN3_INCLUDE_DIR", self.spec["eigen"].prefix.include))
if "+user-hdnnp" in spec or "+ml-hdnnp" in spec:
args.append(self.define("DOWNLOAD_N2P2", False))
args.append(self.define("N2P2_DIR", self.spec["n2p2"].prefix))
if "+rocm" in spec:
args.append(self.define("CMAKE_CXX_COMPILER", spec["hip"].hipcc))
return args
def setup_build_environment(self, env):
if self.spec.satisfies("+intel %aocc"):
env.append_flags("LDFLAGS", "-lalm -lm")
def setup_run_environment(self, env):
env.set("LAMMPS_POTENTIALS", self.prefix.share.lammps.potentials)
if "+python" in self.spec:
env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib)
env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib64)