spack/var/spack/repos/builtin/packages/openloops/package.py
Harmen Stoppels fce95e2efb
license year bump (#34921)
* license bump year
* fix black issues of modified files
* mypy
* fix 2021 -> 2023
2023-01-18 14:30:17 -08:00

315 lines
8.3 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 os
from spack.package import *
class Openloops(Package):
"""The OpenLoops 2 program is a fully automated implementation of the
Open Loops algorithm combined with on-the-fly reduction methods,
which allows for the fast and stable numerical evaluation of tree
and one-loop matrix elements for any Standard Model process
at NLO QCD and NLO EW."""
homepage = "https://openloops.hepforge.org/"
url = "https://openloops.hepforge.org/downloads?f=OpenLoops-2.1.1.tar.gz"
tags = ["hep"]
version("2.1.2", sha256="f52575cae3d70b6b51a5d423e9cd0e076ed5961afcc015eec00987e64529a6ae")
version("2.1.1", sha256="f1c47ece812227eab584e2c695fef74423d2f212873f762b8658f728685bcb91")
all_processes = [
"tbln",
"tbln_ew",
"tbqq",
"tbw",
"pptttt",
"pptttt_ew",
"pptt",
"pptt_ew",
"ppttbb",
"ppttj",
"ppttj_ew",
"ppttjj",
"pptaj",
"pptajj",
"pptllj",
"pptlljj",
"pptln",
"pptw",
"pptwj",
"pptzj",
"pptzjj",
"ppthj",
"ppthjj",
"pptj",
"pptjj",
"ppjj",
"ppjj_ew",
"ppjjj",
"ppjjj_ew",
"ppjjj_nf5",
"ppjjjj",
"pplllvvv_ew",
"ppatt",
"ppatt_ew",
"ppattj",
"pplltt",
"pplltt_ew",
"ppllttj",
"ppllttj_ew",
"pplntt",
"pplnttj",
"ppwtt",
"ppwtt_ew",
"ppwttj",
"ppwttj_ew",
"ppztt",
"ppztt_ew",
"ppzttj",
"ppaatt",
"ppwwtt",
"ppzatt",
"ppzztt",
"ppvvvv",
"ppaaaj2",
"ppllaa",
"ppllaaj",
"pplllla",
"ppvvv",
"ppvvv2",
"ppvvv_ew",
"ppvvvj",
"ppaajj",
"ppaajj2",
"ppaajjj",
"pplla",
"pplla2",
"pplla_ew",
"ppllaj",
"ppllaj2",
"ppllaj_ew",
"ppllaj_nf5",
"ppllajj",
"ppllll",
"ppllll2",
"ppllll2_nf5",
"ppllll2_onlyh",
"ppllll_ew",
"ppllllbb",
"ppllllj",
"ppllllj2",
"ppllllj2_nf5",
"ppllllj2_nf5_notridr",
"ppllllj2_nf5_sr",
"ppllllj2_onlyh",
"ppllnnjj_ew",
"ppllnnjj_vbs",
"pplnaj_ckm",
"pplnajj",
"pplnajj_ckm",
"ppvv",
"ppvv2",
"ppvv_ew",
"ppvvj",
"ppvvj2",
"ppvvj_ew",
"ppwajj",
"ppwwjj",
"ppzajj",
"ppzwj_ew",
"ppzwjj",
"ppzzjj",
"ppajj",
"ppajj2",
"ppajj_ew",
"ppajjj",
"ppllj",
"ppllj2",
"ppllj_ew",
"ppllj_nf5",
"pplljj",
"pplljj_ew",
"pplljjj",
"pplnj_ckm",
"pplnjj",
"pplnjj_ckm",
"pplnjj_ew",
"pplnjjj",
"ppnnjj_ew",
"ppnnjjj",
"ppvj",
"ppvj2",
"ppvj_ew",
"ppwj_ckm",
"ppwjj",
"ppwjj_ckm",
"ppwjj_ew",
"ppwjjj",
"ppzjj",
"ppzjj_ew",
"ppzjjj",
"pphtt",
"pphtt_ew",
"pphttj",
"pphlltt",
"pphll",
"pphll2",
"pphll_ew",
"pphllj",
"pphllj2",
"pphllj_ew",
"pphlljj",
"pphlljj_top",
"pphlnj_ckm",
"pphlnjj",
"pphv",
"pphv_ew",
"pphwjj",
"pphz2",
"pphzj2",
"pphzjj",
"pphhtt",
"pphhv",
"pphhh2",
"heftpphh",
"heftpphhj",
"heftpphhjj",
"pphh2",
"pphhj2",
"pphhjj2",
"pphhjj_vbf",
"bbhj",
"heftpphj",
"heftpphjj",
"heftpphjjj",
"pphbb",
"pphbbj",
"pphj2",
"pphjj2",
"pphjj_vbf",
"pphjj_vbf_ew",
"pphjjj2",
"eetttt",
"eettttj",
"eellllbb",
"eett",
"eett_ew",
"eettj",
"eettjj",
"eevtt",
"eevttj",
"eevttjj",
"eevvtt",
"eevvttj",
"eellll_ew",
"eevv_ew",
"eevvjj",
"eell_ew",
"eevjj",
"eehtt",
"eehttj",
"eehll_ew",
"eehvtt",
"eehhtt",
"heftppllj",
"heftpplljj",
"heftpplljjj",
]
variant("compile_extra", default=False, description="Compile real radiation tree amplitudes")
variant(
"processes",
description="Processes to install. See https://"
+ "openloops.hepforge.org/process_"
+ "library.php?repo=public for details",
values=disjoint_sets(
("all.coll",), ("lhc.coll",), ("lcg.coll",), all_processes
).with_default("lhc.coll"),
)
variant(
"num_jobs",
description="Number of parallel jobs to run. "
+ "Set to 1 if compiling a large number"
+ "of processes (e.g. lcg.coll)",
default=0,
)
depends_on("python", type=("build", "run"))
phases = ["configure", "build", "build_processes", "install"]
def configure(self, spec, prefix):
spack_env = (
"PATH LD_LIBRARY_PATH CPATH C_INCLUDE_PATH" + "CPLUS_INCLUDE_PATH INTEL_LICENSE_FILE"
).split()
for k in env.keys():
if k.startswith("SPACK_"):
spack_env.append(k)
spack_env = " ".join(spack_env)
is_intel = self.spec.satisfies("%intel")
njobs = self.spec.variants["num_jobs"].value
with open("openloops.cfg", "w") as f:
f.write("[OpenLoops]\n")
f.write("import_env={0}\n".format(spack_env))
f.write("num_jobs = {0}\n".format(njobs))
f.write("process_lib_dir = {0}\n".format(self.spec.prefix.proclib))
f.write("cc = {0}\n".format(env["SPACK_CC"]))
f.write("cxx = {0}\n".format(env["SPACK_CXX"]))
if not self.compiler.fc:
raise InstallError(f"{self.spec.compiler} has no Fortran compiler in spack!")
f.write("fortran_compiler = {0}\n".format(env["SPACK_FC"]))
if self.spec.satisfies("@1.3.1") and not is_intel:
f.write("gfortran_f_flags = -ffree-line-length-none\n")
if self.spec.satisfies("@2.1.1:") and not is_intel:
f.write("gfortran_f_flags = -ffree-line-length-none " + "-fdollar-ok ")
if self.spec.target.family == "aarch64":
f.write("-mcmodel=small\n")
else:
f.write("-mcmodel=medium\n")
if self.spec.satisfies("@:1 processes=lcg.coll"):
copy(join_path(os.path.dirname(__file__), "sft1.coll"), "lcg.coll")
elif self.spec.satisfies("@2:2.1.2 processes=lcg.coll"):
copy(join_path(os.path.dirname(__file__), "sft2.coll"), "lcg.coll")
elif self.spec.satisfies("@2.1.2:2 processes=lcg.coll"):
copy(join_path(os.path.dirname(__file__), "sft3.coll"), "lcg.coll")
def setup_build_environment(self, env):
# Make sure that calling openloops picks up the scons that is shipped
# instead of falling back to a potentially unsuitable system version
env.set("OLPYTHON", self.spec["python"].prefix.bin.python)
def setup_run_environment(self, env):
# Make sure that calling openloops picks up the scons that is shipped
# instead of falling back to a potentially unsuitable system version
env.set("OLPYTHON", self.spec["python"].prefix.bin.python)
def build(self, spec, prefix):
scons = Executable("./scons")
scons("generator=1", "compile=2")
def build_processes(self, spec, prefix):
ol = Executable("./openloops")
processes = self.spec.variants["processes"].value
if "+compile_extra" in self.spec:
ce = "compile_extra=1"
else:
ce = ""
ol("libinstall", ce, *processes)
def install(self, spec, prefix):
install_tree(
join_path(self.stage.path, "spack-src"),
self.prefix,
ignore=lambda x: x in ("process_obj", "process_src", "README"),
)