# 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 *
from spack.pkg.builtin.boost import Boost
class Amp(CMakePackage):
"""The Advanced Multi-Physics (AMP) package.
The Advanced Multi-Physics (AMP) package is an open source parallel
object-oriented computational framework that is designed with single
and multi-domain multi-physics applications in mind.
"""
homepage = "https://bitbucket.org/AdvancedMultiPhysics/amp"
hg = homepage
version("develop")
variant("boost", default=True, description="Build with support for Boost")
variant("hdf5", default=True, description="Build with support for HDF5")
variant("hypre", default=True, description="Build with support for hypre")
variant("libmesh", default=True, description="Build with libmesh support")
variant("mpi", default=True, description="Build with MPI support")
variant("netcdf", default=True, description="Build with NetCDF support")
variant("petsc", default=True, description="Build with Petsc support")
variant("shared", default=True, description="Build shared libraries")
variant("silo", default=True, description="Build with support for Silo")
variant("sundials", default=True, description="Build with support for Sundials")
variant("trilinos", default=True, description="Build with support for Trilinos")
variant("zlib", default=True, description="Build with support for zlib")
# Everything should be compiled position independent (-fpic)
depends_on("blas")
depends_on("lapack")
# TODO: replace this with an explicit list of components of Boost,
# for instance depends_on('boost +filesystem')
# See https://github.com/spack/spack/pull/22303 for reference
depends_on(Boost.with_default_variants, when="+boost")
depends_on("hdf5", when="+hdf5")
depends_on("hypre", when="+hypre")
depends_on("libmesh", when="+libmesh")
depends_on("netcdf-c", when="+netcdf")
depends_on("petsc", when="+petsc")
depends_on("silo", when="+silo")
depends_on("sundials", when="+sundials")
depends_on("trilinos", when="+trilinos")
depends_on("zlib-api", when="+zlib")
# MPI related dependencies
depends_on("mpi", when="+mpi")
def cmake_args(self):
spec = self.spec
options = [
self.define("TPL_URL", "https://bitbucket.org/AdvancedMultiPhysics/tpl-builder"),
self.define(
"AMP_DATA_URL",
"https://bitbucket.org/AdvancedMultiPhysics/amp/downloads/AMP-Data.tar.gz",
),
self.define("AMP_ENABLE_TESTS", "OFF"),
self.define("AMP_ENABLE_EXAMPLES", "OFF"),
self.define("AMP_ENABLE_CXX11", "ON"),
self.define("CXX_STD", "11"),
self.define_from_variant("BUILD_SHARED_LIBS", "shared"),
self.define("USE_MPI", "0"),
]
if "+mpi" in spec:
options.extend(
[
self.define("CMAKE_C_COMPILER", spec["mpi"].mpicc),
self.define("CMAKE_CXX_COMPILER", spec["mpi"].mpicxx),
self.define("CMAKE_Fortran_COMPILER", spec["mpi"].mpifc),
self.define("MPI_COMPILER", "1"),
self.define("MPIEXEC", spec["mpi"].prefix.bin),
]
)
else:
options.extend(
[
self.define("CMAKE_C_COMPILER", self.compiler.cc),
self.define("CMAKE_CXX_COMPILER", self.compiler.cxx),
self.define("CMAKE_Fortran_COMPILER", self.compiler.fc),
]
)
tpl_list = ["LAPACK"]
blas, lapack = spec["blas"].libs, spec["lapack"].libs
options.extend(
[
self.define("TPL_LAPACK_INSTALL_DIR", spec["lapack"].prefix),
self.define("TPL_BLAS_LIBRARY_NAMES", ";".join(blas.names)),
self.define("TPL_BLAS_LIBRARY_DIRS", ";".join(blas.directories)),
self.define("TPL_LAPACK_LIBRARY_NAMES", ";".join(lapack.names)),
self.define("TPL_LAPACK_LIBRARY_DIRS", ";".join(lapack.directories)),
]
)
if "+zlib" in spec:
tpl_list.append("ZLIB")
options.append(self.define("TPL_ZLIB_INSTALL_DIR", spec["zlib-api"].prefix))
for vname in (
"boost",
"hdf5",
"hypre",
"libmesh",
"petsc",
"silo",
"sundials",
"trilinos",
):
if "+" + vname in spec:
tpl_list.append(vname.upper())
options.append(
self.define("TPL_{0}_INSTALL_DIR".format(vname.upper()), spec[vname].prefix)
)
if "+netcdf" in spec:
tpl_list.append("NETCDF")
options.append(self.define("TPL_NETCDF_INSTALL_DIR", spec["netcdf-c"].prefix))
options.append(self.define("TPL_LIST", ";".join(tpl_list)))
return options