# 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)
from spack.package import *
class Beatnik(CMakePackage, CudaPackage, ROCmPackage):
"""Fluid interface model solver based on Pandya and Shkoller's Z-Model formulation."""
homepage = "https://github.com/CUP-ECS/beatnik"
git = "https://github.com/CUP-ECS/beatnik.git"
maintainers("patrickb314", "JStewart28")
license("BSD-3-Clause")
version("1.0", commit="ae31ef9cb44678d5ace77994b45b0778defa3d2f")
version("develop", branch="develop")
version("main", branch="main")
# Variants are primarily backends to build on GPU systems and pass the right
# informtion to the packages we depend on
variant("cuda", default=False, description="Use CUDA support from subpackages")
variant("openmp", default=False, description="Use OpenMP support from subpackages")
# Dependencies for all Beatnik versions
depends_on("mpi")
with when("+cuda"):
depends_on("mpich +cuda", when="^[virtuals=mpi] mpich")
depends_on("mvapich +cuda", when="^[virtuals=mpi] mvapich")
depends_on("mvapich2 +cuda", when="^[virtuals=mpi] mvapich2")
depends_on("mvapich2-gdr +cuda", when="^[virtuals=mpi] mvapich2-gdr")
depends_on("openmpi +cuda", when="^[virtuals=mpi] openmpi")
with when("+rocm"):
depends_on("mpich +rocm", when="^[virtuals=mpi] mpich")
depends_on("mvapich2-gdr +rocm", when="^[virtuals=mpi] mvapich2-gdr")
# Kokkos dependencies
depends_on("kokkos @4:")
depends_on("kokkos +cuda +cuda_lambda +cuda_constexpr", when="+cuda")
depends_on("kokkos +rocm", when="+rocm")
depends_on("kokkos +wrapper", when="%gcc+cuda")
# Cabana dependencies
depends_on("cabana @0.6.0 +grid +heffte +silo +hdf5 +mpi")
depends_on("cabana +cuda", when="+cuda")
depends_on("cabana +rocm", when="+rocm")
# Silo dependencies
depends_on("silo @4.11:")
depends_on("silo @4.11.1:", when="%cce") # Eariler silo versions have trouble cce
# Heffte dependencies - We always require FFTW so that there's a host
# backend even when we're compiling for GPUs
depends_on("heffte +fftw")
depends_on("heffte +cuda", when="+cuda")
depends_on("heffte +rocm", when="+rocm")
# If we're using CUDA or ROCM, require MPIs be GPU-aware
conflicts("mpich ~cuda", when="+cuda")
conflicts("mpich ~rocm", when="+rocm")
conflicts("openmpi ~cuda", when="+cuda")
conflicts("^intel-mpi") # Heffte won't build with intel MPI because of needed C++ MPI support
conflicts("^spectrum-mpi", when="^cuda@11.3:") # cuda-aware spectrum is broken with cuda 11.3:
# Propagate CUDA and AMD GPU targets to cabana
for cuda_arch in CudaPackage.cuda_arch_values:
depends_on("cabana cuda_arch=%s" % cuda_arch, when="+cuda cuda_arch=%s" % cuda_arch)
for amdgpu_value in ROCmPackage.amdgpu_targets:
depends_on(
"cabana +rocm amdgpu_target=%s" % amdgpu_value,
when="+rocm amdgpu_target=%s" % amdgpu_value,
)
# CMake specific build functions
def cmake_args(self):
args = []
# Use hipcc as the c compiler if we are compiling for rocm. Doing it this way
# keeps the wrapper insted of changeing CMAKE_CXX_COMPILER keeps the spack wrapper
# and the rpaths it sets for us from the underlying spec.
if "+rocm" in self.spec:
env["SPACK_CXX"] = self.spec["hip"].hipcc
# If we're building with cray mpich, we need to make sure we get the GTL library for
# gpu-aware MPI, since cabana and beatnik require it
if self.spec.satisfies("+rocm ^cray-mpich"):
gtl_dir = join_path(self.spec["cray-mpich"].prefix, "..", "..", "..", "gtl", "lib")
args.append(
"-DCMAKE_EXE_LINKER_FLAGS=-Wl,-rpath={0} -L{0} -lmpi_gtl_hsa".format(gtl_dir)
)
elif self.spec.satisfies("+cuda ^cray-mpich"):
gtl_dir = join_path(self.spec["cray-mpich"].prefix, "..", "..", "..", "gtl", "lib")
args.append(
"-DCMAKE_EXE_LINKER_FLAGS=-Wl,-rpath={0} -L{0} -lmpi_gtl_cuda".format(gtl_dir)
)
return args