# Copyright 2013-2022 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 Selalib(CMakePackage):
"""SeLaLib is a modular library for the kinetic and gyrokinetic simulation
of tokamak plasmas by the semi-lagrangian or particle-in-cell methods"""
homepage = "https://selalib.github.io/selalib"
url = "https://github.com/selalib/selalib"
git = "https://github.com/selalib/selalib"
maintainers("pnavaro", "freifrauvonbleifrei")
version("main", branch="main")
variant("fmempool", default=False, description="Use memory pool")
variant("mpi", default=True, description="Build with MPI support")
variant("openmp", default=True, description="Build with OpenMP support")
variant("compression", default=False, description="Add compression by ZFP")
requires(
"%gcc@9.0.0:",
"%clang@16.0.0:",
"%intel@18.0:",
"%oneapi@18.0:",
policy="one_of",
msg="SeLaLib requires new-enough Fortran compiler",
)
depends_on("cmake@3.6.0:", type=("build"))
depends_on("blas")
depends_on("fftw")
depends_on("fftw+openmp", when="+openmp")
depends_on("fgsl")
depends_on("git", type=("build", "run", "test"))
depends_on("hdf5+fortran+cxx")
depends_on("lapack", when="~mpi")
with when("+mpi"):
depends_on("mpi")
depends_on("fftw+mpi")
depends_on("hdf5+mpi")
depends_on("scalapack")
depends_on("python@3.0.0:", type=("build"))
# beware: compiling w/ zfp may throw type mismatch errors
depends_on("zfp+fortran", when="+compression")
def cmake_args(self):
args = [
self.define_from_variant("OPENMP_ENABLED", "openmp"),
self.define_from_variant("HDF5_PARALLEL_ENABLED", "mpi"),
self.define_from_variant("USE_FMEMPOOL", "fmempool"),
self.define("FFTW_ENABLED", "ON"),
]
return args
def setup_build_environment(self, env):
env.set("FFTW_INCLUDE", self.spec["fftw"].prefix.include)
env.set("FFTW_ROOT", self.spec["fftw"].prefix)
@run_after("build")
@on_package_attributes(run_tests=True)
def quick_serial_ctest(self):
"""quickly run a serial subset of tests for sanity check"""
ctest = which("ctest")
with working_dir(self.build_directory):
ctest("--output-on-failure", "-R", "test_mud2")
ctest("--output-on-failure", "-R", "sparse_grid_4d")
ctest("--output-on-failure", "-R", "scalar_field_2d")
ctest("--output-on-failure", "-R", "maxwell_3d_fem_fft")