# 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 Athena(AutotoolsPackage):
"""Athena is a grid-based code for astrophysical magnetohydrodynamics
(MHD). It was developed primarily for studies of the interstellar medium,
star formation, and accretion flows."""
homepage = "https://princetonuniversity.github.io/Athena-Cversion/"
url = "https://github.com/PrincetonUniversity/Athena-Cversion/archive/version-4.2.tar.gz"
git = "https://github.com/PrincetonUniversity/Athena-Cversion.git"
version("master", branch="master")
version("4.2", sha256="6334848d7f1325aa44859418feac8ce223b56793ae8907103000af5b27f50e7e")
# PHYSICS "packages":
variant(
"problem",
default="linear_wave",
description="Problem generator",
values=[
"blast",
"carbuncle",
"collapse3d",
"cpaw",
"cshock1d",
"current_sheet",
"cyladvect",
"cylblast",
"cylbphi",
"cylbr",
"cylcvmri",
"cyldiff",
"cylfieldloop",
"cylnewtmri",
"cylrayleigh",
"cylspiral",
"cylwind",
"cylwindrot",
"cylwindrotb",
"dmr",
"fft_test",
"field_loop",
"firehose",
"hall_drift",
"hb3",
"hgb",
"hkdisk",
"jeans",
"jet",
"kh",
"linear_wave",
"lw_implode",
"msa",
"noh",
"orszag-tang",
"par_collision",
"par_epicycle",
"par_strat2d",
"par_strat3d",
"pgflow",
"rotor",
"rt",
"shk_cloud",
"shkset1d",
"shkset2d",
"shkset3d",
"shu-osher",
"strat",
"streaming2d_multi",
"streaming2d_single",
"streaming3d_multi",
"streaming3d_single",
"twoibw",
],
)
variant("gas", default="mhd", description="Gas properties", values=["mhd", "hydro"])
variant(
"eos",
default="adiabatic",
description="Equation of state",
values=["adiabatic", "isothermal"],
)
variant("nscalars", default=0, description="Number of advected scalars")
variant(
"gravity",
default="none",
description="Algorithm for self gravity",
values=["fft", "fft_disk", "fft_obc", "multigrid", "none"],
)
variant(
"particles",
default="none",
description="Dust particle integration algorithm",
values=["feedback", "passive", "none"],
)
variant(
"coord",
default="cartesian",
description="Coordinate System",
values=["cartesian", "cylindrical"],
)
# PHYSICS "features":
variant("conduction", default=False, description="Enable thermal conduction")
variant("resistivity", default=False, description="Enable resistivity")
variant(
"special_relativity", default=False, description="Enable special relativistic hydro or MHD"
)
variant("viscosity", default=False, description="Enable viscosity")
# ALGORITHM "packages":
variant(
"order",
default="2",
description="Order and type of spatial reconstruction",
values=["1", "2", "3", "2p", "3p"],
)
variant(
"flux",
default="roe",
description="Flux function",
values=["roe", "hllc", "hlld", "hlle", "force", "exact", "two-shock"],
)
variant(
"integrator",
default="ctu",
description="Unsplit integration algorithm",
values=["ctu", "vl"],
)
variant(
"cflags", default="opt", description="Compiler flags", values=["opt", "debug", "profile"]
)
# ALGORITHM "features":
variant("fargo", default=False, description="Enable FARGO algorithm")
variant("fft", default=False, description="Use FFTW block decomposition")
variant("fofc", default=False, description="Enable first-order flux correction")
variant("ghost", default=False, description="Write ghost zones")
variant("h_correction", default=False, description="Turn on H-correction")
variant("mpi", default=True, description="Enable MPI parallelization")
variant("shearing_box", default=False, description="Turn on shearing-box")
variant(
"single", default=False, description="Use single-precision instead of double-precision"
)
variant("sts", default=False, description="Turn on super timestepping")
variant("smr", default=False, description="Use static mesh refinement")
variant("rotating_frame", default=False, description="Turn on rotating_frame")
variant("l1_inflow", default=False, description="Enable inflow from L1 point")
depends_on("autoconf", type="build")
depends_on("automake", type="build")
depends_on("libtool", type="build")
depends_on("m4", type="build")
depends_on("mpi", when="+mpi")
depends_on("fftw", when="+fft")
conflicts("flux=hllc", when="gas=mhd")
conflicts("flux=exact", when="gas=mhd")
conflicts("flux=two-shock", when="gas=mhd")
conflicts("+h_correction", when="flux=hllc")
conflicts("+h_correction", when="flux=hlld")
conflicts("+h_correction", when="flux=hlle")
conflicts("+h_correction", when="flux=force")
conflicts("+h_correction", when="flux=exact")
conflicts("+h_correction", when="flux=two-shock")
conflicts("coord=cylindrical", when="gravity=none")
conflicts("coord=cylindrical", when="particles=none")
conflicts("integrator=vl", when="order=3")
conflicts("integrator=vl", when="order=2")
build_targets = ["all"]
patch("missing-separator.patch")
def setup_build_environment(self, env):
spec = self.spec
env.set("OPT", "-O3")
if "+mpi" in spec:
env.set("CC", spec["mpi"].mpicc)
env.set("LDR", spec["mpi"].mpicc)
env.set("MPILIB", spec["mpi"].libs.ld_flags)
env.set("MPIINC", spec["mpi"].headers.include_flags)
else:
env.set("CC", spack_cc)
env.set("LDR", spack_cc)
if "+fft" in spec:
env.set("FFTWLIB", spec["fftw"].libs.ld_flags)
env.set("FFTWINC", spec["fftw"].headers.include_flags)
def configure_args(self):
spec = self.spec
args = []
if "+conduction" in spec:
args.append("--enable-conduction")
else:
args.append("--disable-conduction")
if "+resistivity" in spec:
args.append("--enable-resistivity")
else:
args.append("--disable-resistivity")
if "+special_relativity" in spec:
args.append("--enable-special-relativity")
else:
args.append("--disable-special-relativity")
if "+viscosity" in spec:
args.append("--enable-viscosity")
else:
args.append("--disable-viscosity")
if "+single" in spec:
args.append("--enable-single")
else:
args.append("--disable-single")
if "+ghost" in spec:
args.append("--enable-ghost")
else:
args.append("--disable-ghost")
if "+mpi" in spec:
args.append("--enable-mpi")
else:
args.append("--disable-mpi")
if "+h_correction" in spec:
args.append("--enable-h-correction")
else:
args.append("--disable-h-correction")
if "+fft" in spec:
args.append("--enable-fft")
else:
args.append("--disable-fft")
if "+shearing_box" in spec:
args.append("--enable-shearing-box")
else:
args.append("--disable-shearing-box")
if "+fargo" in spec:
args.append("--enable-fargo")
else:
args.append("--disable-fargo")
if "+sts" in spec:
args.append("--enable-sts")
else:
args.append("--disable-sts")
if "+smr" in spec:
args.append("--enable-smr")
else:
args.append("--disable-smr")
if "+fofc" in spec:
args.append("--enable-fofc")
else:
args.append("--disable-fofc")
if "+rotating_frame" in spec:
args.append("--enable-rotating_frame")
else:
args.append("--disable-rotating_frame")
if "+l1_inflow" in spec:
args.append("--enable-l1_inflow")
else:
args.append("--disable-l1_inflow")
args.extend(
[
"--with-problem=" + spec.variants["problem"].value,
"--with-gas=" + spec.variants["gas"].value,
"--with-eos=" + spec.variants["eos"].value,
"--with-nscalars=" + spec.variants["nscalars"].value,
"--with-gravity=" + spec.variants["gravity"].value,
"--with-particles=" + spec.variants["particles"].value,
"--with-coord=" + spec.variants["coord"].value,
"--with-order=" + spec.variants["order"].value,
"--with-flux=" + spec.variants["flux"].value,
"--with-integrator=" + spec.variants["integrator"].value,
"--with-cflags=" + spec.variants["cflags"].value,
]
)
return args
def install(self, spec, prefix):
mkdir(prefix.bin)
install("bin/athena", prefix.bin)