# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit cmake

DESCRIPTION="Lightweight, general, scalable C++ library for finite element methods"
HOMEPAGE="
	https://mfem.org/
	https://github.com/mfem/mfem/
"
SRC_URI="https://github.com/mfem/${PN}/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz"

KEYWORDS="~amd64"
LICENSE="BSD"
SLOT="0"
IUSE_AMDGPU="
	amdgpu_gfx701 amdgpu_gfx702 amdgpu_gfx704
	amdgpu_gfx802 amdgpu_gfx803 amdgpu_gfx805 amdgpu_gfx810
	amdgpu_gfx900 amdgpu_gfx904 amdgpu_gfx906 amdgpu_gfx908 amdgpu_gfx909 amdgpu_gfx90a amdgpu_gfx940
	amdgpu_gfx1010 amdgpu_gfx1011 amdgpu_gfx1012 amdgpu_gfx1030 amdgpu_gfx1031 amdgpu_gfx1032 amdgpu_gfx1034
	amdgpu_gfx1100 amdgpu_gfx1101 amdgpu_gfx1102
"
cpuflags="
	cpu_flags_x86_mmx cpu_flags_x86_mmxext cpu_flags_x86_sse cpu_flags_x86_sse2 cpu_flags_x86_sse3
	cpu_flags_x86_ssse3 cpu_flags_x86_sse4a cpu_flags_x86_sse4_1 cpu_flags_x86_sse4_2 cpu_flags_x86_avx
	cpu_flags_x86_avx2 cpu_flags_x86_avx512dq cpu_flags_x86_avx512f cpu_flags_x86_avx512vl
	cpu_flags_x86_3dnow cpu_flags_x86_3dnowext cpu_flags_ppc_vsx cpu_flags_ppc_vsx2 cpu_flags_ppc_vsx3
	cpu_flags_ppc_altivec cpu_flags_arm_neon cpu_flags_arm_iwmmxt cpu_flags_arm_iwmmxt2 cpu_flags_arm_neon
"
IUSE="
	${IUSE_AMDGPU}
	${cpuflags}
	benchmark codipack debug examples exceptions ginkgo hip lapack +metis mpfr mpi mumps netcdf openmp petsc slepc sparse ssl strumpack sundials superlu test threadsafe unwind zlib
"
# TODO: cuda mesquite gslib moonolith

RDEPEND="
	benchmark? ( dev-cpp/benchmark )
	codipack? ( sci-libs/CoDiPack )
	ginkgo? ( sci-libs/ginkgo )
	hip? (
		sci-libs/hipSPARSE
		dev-util/hip
	)
	lapack? (
		virtual/blas
		virtual/lapack
	)
	metis? ( sci-libs/metis )
	mpfr? ( dev-libs/mpfr )
	mpi? (
		sci-libs/hypre[mpi]
		virtual/mpi[cxx]
	)
	mumps? ( sci-libs/mumps[mpi] )
	netcdf? ( sci-libs/netcdf )
	petsc? ( sci-mathematics/petsc[mpi] )
	slepc? ( sci-mathematics/slepc[mpi] )
	sparse? (
		sci-libs/amd
		sci-libs/btf
		sci-libs/camd
		sci-libs/ccolamd
		sci-libs/cholmod
		sci-libs/colamd
		sci-libs/klu
		sci-libs/umfpack
	)
	ssl? ( net-libs/gnutls )
	strumpack? ( sci-libs/STRUMPACK )
	sundials? (
		sci-libs/sundials
		mpi? ( sci-libs/sundials[hypre,mpi] )
	)
	superlu? ( sci-libs/superlu_dist )
	unwind? ( || ( sys-libs/libunwind sys-libs/llvm-libunwind ) )
	zlib? ( sys-libs/zlib )
"
DEPEND="${RDEPEND}"
BDEPEND="app-doc/doxygen[dot]"

PATCHES=( "${FILESDIR}/${P}-bump-cmake-version.patch" )
RESTRICT="!test? ( test )"
DOCS=( README CHANGELOG CITATION.cff )
REQUIRED_USE="
	hip? ( || ( ${IUSE_AMDGPU/+/} ) )
	mpi? ( metis )
	mumps? ( mpi )
	petsc? ( mpi )
	slepc? ( petsc )
	strumpack? ( mpi )
	superlu? ( mpi )
"
#pumi? ( mpi )
#?? ( cuda hip )

src_configure() {
	if use hip ; then
		HIP_ARCH=""
		for u in ${IUSE_AMDGPU} ; do
			if use ${u} ; then
				HIP_ARCH="${HIP_ARCH};${u/amdgpu_/}"
			fi
		done
		# remove first character (;)
		HIP_ARCH="${HIP_ARCH:1}"
		export HIP_ARCH
	fi
	local mycmakeargs=(
		-DBUILD_SHARED_LIBS=ON
		-DMFEM_ENABLE_MINIAPPS=ON
		-DMFEM_USE_ADIOS2=NO
		-DMFEM_USE_AMGX=NO
		-DMFEM_USE_CALIPER=NO
		-DMFEM_USE_CEED=NO
		-DMFEM_USE_CONDUIT=NO
		-DMFEM_USE_CUDA=NO
		-DMFEM_USE_FMS=NO
		-DMFEM_USE_GSLIB=NO
		-DMFEM_USE_HIOP=NO
		-DMFEM_USE_MKL_CPARDISO=NO
		-DMFEM_USE_OCCA=NO
		-DMFEM_USE_PARELAG=NO
		-DMFEM_USE_PUMI=NO
		-DMFEM_USE_RAJA=NO
		-DMFEM_USE_SIDRE=NO
		-DMFEM_USE_UMPIRE=NO

		-DMFEM_DEBUG=$(usex debug)
		-DMFEM_ENABLE_EXAMPLES=$(usex examples)
		-DMFEM_ENABLE_TESTING=$(usex test)
		-DMFEM_THREAD_SAFE=$(usex threadsafe)
		-DMFEM_USE_BENCHMARK=$(usex benchmark)
		-DMFEM_USE_CODIPACK=$(usex codipack)
		-DMFEM_USE_EXCEPTIONS=$(usex exceptions)
		-DMFEM_USE_GINKGO=$(usex ginkgo)
		-DMFEM_USE_GNUTLS=$(usex ssl)
		-DMFEM_USE_HIP=$(usex hip)
		-DMFEM_USE_LAPACK=$(usex lapack)
		-DMFEM_USE_LIBUNWIND=$(usex unwind)
		-DMFEM_USE_METIS=$(usex metis)
		-DMFEM_USE_MPFR=$(usex mpfr)
		-DMFEM_USE_MPI=$(usex mpi)
		-DMFEM_USE_MUMPS=$(usex mumps)
		-DMFEM_USE_NETCDF=$(usex netcdf)
		-DMFEM_USE_OPENMP=$(usex openmp)
		-DMFEM_USE_PETSC=$(usex petsc)
		-DMFEM_USE_SLEPC=$(usex slepc)
		-DMFEM_USE_STRUMPACK=$(usex strumpack)
		-DMFEM_USE_SUITESPARSE=$(usex sparse)
		-DMFEM_USE_SUPERLU=$(usex superlu)
		-DMFEM_USE_ZLIB=$(usex zlib)
	)
	if use codipack; then
		mycmakeargs+=( "-DCODIPACK_INCLUDE_DIR=${EPREFIX}/usr/include/codi" )
	fi
#	if use moonolith; then
#		mycmakeargs+=( "-DMFEM_USE_MOONOLITH=ON" )
#	fi
	if use mpi; then
		mycmakeargs+=( "-DHYPRE_INCLUDE_DIR=${EPREFIX}/usr/include/hypre" )
	fi
	if use petsc; then
		mycmakeargs+=( "-DPETSC_DIR=${EPREFIX}/usr/$(get_libdir)/petsc" )
		mycmakeargs+=( "-DPETSC_ARCH=" )
	fi
	local simd=OFF
	for f in ${cpuflags} ; do
		if use ${f} ; then
			simd=ON
			break
		fi
	done
	mycmakeargs+=( "-DMFEM_USE_SIMD=${simd}" )
	cmake_src_configure
}

src_install() {
	cmake_src_install
	einstalldocs
	# https://github.com/mfem/mfem/issues/3019
	mv "${ED}/usr/lib" _lib || die
	mv _lib "${ED}/usr/$(get_libdir)" || die
}