diff --git a/packages/opal-x/package.py b/packages/opal-x/package.py new file mode 100644 index 0000000..4a793ec --- /dev/null +++ b/packages/opal-x/package.py @@ -0,0 +1,107 @@ +# 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) + +# ---------------------------------------------------------------------------- +# If you submit this package back to Spack as a pull request, +# please first remove this boilerplate and all FIXME comments. +# +# This is a template package file for Spack. We've put "FIXME" +# next to all the things you'll want to change. Once you've handled +# them, you can save this file and test your package like this: +# +# spack install opal-x +# +# You can edit this file again by typing: +# +# spack edit opal-x +# +# See the Spack documentation for more information on packaging. +# ---------------------------------------------------------------------------- + +from spack.package import * + + +class OpalX(CMakePackage, CudaPackage): + """OPAL (Object Oriented Parallel Accelerator Library) is a parallel open source tool for charged-particle optics in linear accelerators and rings, + including 3D space charge. Using the MAD language with extensions, OPAL can run on a laptop as well as on the largest high performance computing systems. + OPAL is built from the ground up as a parallel application exemplifying the fact that high performance computing is the third leg of science, + complementing theory and experiment.""" + + homepage = "https://amas.web.psi.ch/opal/Documentation/master/OPAL_Manual.html" + git = "https://gitlab.psi.ch/OPAL/opal-x/src.git" + + maintainers("germanne", "gsell") + + license("GPLv3") + + version('master', branch="master") + + variant( + "build_type", + default="Release", + description="CMake build type", + values=("Debug", "Release", "RelWithDebInfo", "MinSizeRel"), + ) + variant("mpi", default=True, description="Enable MPI support") + variant("solvers", default=True, description="Enable solvers") + variant("fft", default=True, description="Enable full-wave solver") + variant("tests", default=False, description="Enable tests") + variant("alternative_variant", default=True, description="Use alternative variant") + variant("alpine", default=True, description="Enable Alpine") + + depends_on("blas") + depends_on("boost@1.82.0+mpi+chrono+filesystem+iostreams+regex+serialization+system+timer+python+shared") + depends_on("cmake@3.25.2:", type="build") + depends_on("fftw@3.3.10", when="+fft") + depends_on("gsl@2.7+shared") + depends_on("gnutls@3.5.19:") + depends_on("kokkos@4.2.00:+openmp") + depends_on("heffte@develop") + + depends_on("h5hut+mpi", when="+mpi") + + depends_on("googletest@1.13.0: +shared", when="+tests") + # @master + depends_on("h5hut@2.0.0rc6:", when="@master") + + # @2022.1%gcc@10.4.0 + depends_on("h5hut@2.0.0rc6", when="@2022.1") + + conflicts("~mpi", msg="OPAL can not run without mpi!") + conflicts("cuda_arch=none", when="+cuda", + msg="CUDA architecture is required") + conflicts("%gcc@:8.5.0", msg="gcc bigger than 8.5.0 is required") + + @run_before("cmake") + def cmake_configure(self): + spec = self.spec + cmake_configure = Executable("./gen_OPALrevision") + cmake_configure() + + def cmake_args(self): + args = [ + "-DCMAKE_CXX_STANDARD=20", + self.define_from_variant("ENABLE_FFT", "fft"), + self.define_from_variant("ENABLE_SOLVERS", "solvers"), + self.define_from_variant("ENABLE_TESTS", "tests"), + self.define_from_variant("USE_ALTERNATIVE_VARIANT", "alternative_variant"), + #self.define_from_variant("ENABLE_ALPINE", "alpine"), + ] + + if '+cuda' in self.variants: + args.append("-DIPPL_PLATFORMS=cuda") + else: + args.append("-DIPPL_PLATFORMS=openmp") + + if 'cuda_arch=90' in self.variants: + args.append("-DKokkos_ARCH_HOPPER90=ON") + elif 'cuda_arch=80' in self.variants: + args.append("-DKokkos_ARCH_AMPERE80=ON") + elif 'cuda_arch=60' in self.variants: + args.append("-DKokkos_ARCH_PASCAL61=ON") + + + return args +