git: b4d947a17c32 - main - science/hpddm: new port, framework for HP domain decomposition methods

From: Thierry Thomas <thierry_at_FreeBSD.org>
Date: Thu, 01 Oct 2026 16:57:51 UTC
The branch main has been updated by thierry:

URL: https://cgit.FreeBSD.org/ports/commit/?id=b4d947a17c320abfd0ae368bc2561b34d09c1779

commit b4d947a17c320abfd0ae368bc2561b34d09c1779
Author:     Thierry Thomas <thierry@FreeBSD.org>
AuthorDate: 2026-10-01 16:54:36 +0000
Commit:     Thierry Thomas <thierry@FreeBSD.org>
CommitDate: 2026-10-01 16:56:18 +0000

    science/hpddm: new port, framework for HP domain decomposition methods
    
    To upgrade Code_Aster, PETSc must be compiled against HPDDM.
---
 science/Makefile                                   |  1 +
 science/hpddm/Makefile                             | 93 ++++++++++++++++++++++
 science/hpddm/distinfo                             |  3 +
 .../hpddm/files/patch-Make.inc_Makefile.FreeBSD    | 34 ++++++++
 science/hpddm/files/patch-Makefile                 | 49 ++++++++++++
 science/hpddm/pkg-descr                            | 10 +++
 science/hpddm/pkg-plist                            | 89 +++++++++++++++++++++
 7 files changed, 279 insertions(+)

diff --git a/science/Makefile b/science/Makefile
index a35ac631d9c9..f76ab3afb588 100644
--- a/science/Makefile
+++ b/science/Makefile
@@ -127,6 +127,7 @@
     SUBDIR += helfem
     SUBDIR += hepmc3
     SUBDIR += highfive
+    SUBDIR += hpddm
     SUBDIR += hypre
     SUBDIR += iboview
     SUBDIR += isaac-cfd
diff --git a/science/hpddm/Makefile b/science/hpddm/Makefile
new file mode 100644
index 000000000000..1ff9c46c6dca
--- /dev/null
+++ b/science/hpddm/Makefile
@@ -0,0 +1,93 @@
+PORTNAME=	HPDDM
+DISTVERSIONPREFIX=	v
+DISTVERSION=	2.4.0
+CATEGORIES=	science
+
+MAINTAINER=	thierry@FreeBSD.org
+COMMENT=	Framework for high-performance domain decomposition methods
+WWW=		https://github.com/hpddm/hpddm
+
+LICENSE=	LGPL3
+
+BUILD_DEPENDS=	${PY_DEPENDS}
+LIB_DEPENDS=	libarpack.so:math/arpack-ng	\
+		libscalapack.so:math/scalapack
+RUN_DEPENDS=	bash:shells/bash	\
+		${PY_DEPENDS}
+PY_DEPENDS=	${MPI4PY}	\
+		${PYTHON_PKGNAMEPREFIX}numpy>=2:math/py-numpy@${PY_FLAVOR}	\
+		${PYTHON_PKGNAMEPREFIX}sympy>0:math/py-sympy@${PY_FLAVOR}
+
+USES=		blaslapack:openblas fortran gmake mpi:openmpi python shebangfix
+SHEBANG_FILES=	examples/payload.sh
+SHEBANG_GLOB=	*.py
+
+USE_GITHUB=	yes
+GH_ACCOUNT=	${PORTNAME:tl}
+GH_PROJECT=	${GH_ACCOUNT}
+
+CXXFLAGS+=	-std=c++11 -fPIC
+CFLAGS+=	-std=c99
+USE_LDCONFIG=	yes
+
+# Remark: set OMPI_FC for OpenMPI or MPICH_F90 for MPICH
+MAKE_ENV=	PYTHON_INCLUDEDIR=${PYTHON_INCLUDEDIR}	\
+		PYTHON_LIBDIR=${PYTHON_LIBDIR}	\
+		PYTHON_VER=${PYTHON_VER}	\
+		BLASLIB=${BLASLIB}	\
+		EIGENSOLVER=ARPACK	\
+		MPICXX=${MPICXX}	\
+		MPICC=${MPICC}		\
+		MPIF90=${MPIF90}	\
+		MPIRUN="${MPIRUN} -np"	\
+		MPI_LIBS="${MPI_LIBS}"	\
+		OMPI_FC=${FC}
+
+OPTIONS_DEFINE=	DOCS EXAMPLES
+OPTIONS_RADIO=	SOLVER
+OPTIONS_RADIO_SOLVER=	MUMPS SUITESPARSE
+OPTIONS_DEFAULT=	MUMPS
+
+MUMPS_DESC=	Use MUMPS as the direct solver
+MUMPS_LIB_DEPENDS=	libcmumps.so:math/mumps
+MUMPS_MAKE_ENV=	SOLVER=MUMPS SUBSOLVER=MUMPS
+
+SUITESPARSE_DESC=	Prefer MFPACK of SuiteSparse
+SUITESPARSE_LIB_DEPENDS=libumfpack.so:math/suitesparse-umfpack
+SUITESPARSE_MAKE_ENV=	SOLVER=SUITESPARSE SUBSOLVER=SUITESPARSE
+
+post-extract:
+	${CP} -p ${WRKSRC}/Make.inc/Makefile.Linux	\
+		${WRKSRC}/Make.inc/Makefile.${OPSYS}
+
+do-install:
+	${MKDIR} ${STAGEDIR}${DATADIR}/benchmark	\
+		${STAGEDIR}${DATADIR}/interface		\
+		${STAGEDIR}${PREFIX}/include/HPDDM
+	${INSTALL_DATA} ${WRKSRC}/benchmark/*.cpp ${STAGEDIR}${DATADIR}/benchmark/
+	${INSTALL_SCRIPT} ${WRKSRC}/benchmark/local_solver.py	\
+		${STAGEDIR}${DATADIR}/benchmark
+.for b in custom_operator_fortran schwarz_c schwarz_cpp
+	${INSTALL_PROGRAM} ${WRKSRC}/bin/${b} ${STAGEDIR}${PREFIX}/bin
+.endfor
+	${INSTALL_DATA} ${WRKSRC}/bin/*.mod ${STAGEDIR}${PREFIX}/include
+	${INSTALL_DATA} ${WRKSRC}/include/* ${STAGEDIR}${PREFIX}/include/HPDDM/
+	(cd ${WRKSRC}/interface &&	\
+		${COPYTREE_SHARE} . ${STAGEDIR}${DATADIR}/interface)
+.for l in libhpddm_c libhpddm_fortran libhpddm_python
+	${INSTALL_LIB} ${WRKSRC}/lib/${l}.so ${STAGEDIR}${PREFIX}/lib/${l}.so.0
+	(cd ${STAGEDIR}${PREFIX}/lib &&	\
+		${LN} -sf ${l}.so.0 ${STAGEDIR}${PREFIX}/lib/${l}.so)
+.endfor
+
+do-install-DOCS-on:
+	${MKDIR} ${STAGEDIR}${DOCSDIR}
+	${INSTALL_DATA} ${WRKSRC}/doc/* ${STAGEDIR}${DOCSDIR}/
+	${INSTALL_DATA} ${WRKSRC}/README.md ${STAGEDIR}${DOCSDIR}/
+
+do-install-EXAMPLES-on:
+	${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
+	${REINPLACE_CMD} -e 's|make|${GMAKE}|' ${WRKSRC}/examples/payload.sh
+	(cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})
+
+.include <bsd.port.mk>
diff --git a/science/hpddm/distinfo b/science/hpddm/distinfo
new file mode 100644
index 000000000000..dbb9402f1a20
--- /dev/null
+++ b/science/hpddm/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1790260949
+SHA256 (hpddm-hpddm-v2.4.0_GH0.tar.gz) = d4a309200cfb4fc8b9178336fcd4a70e9ea14e9aa731971e7f9709a36929aba1
+SIZE (hpddm-hpddm-v2.4.0_GH0.tar.gz) = 334692
diff --git a/science/hpddm/files/patch-Make.inc_Makefile.FreeBSD b/science/hpddm/files/patch-Make.inc_Makefile.FreeBSD
new file mode 100644
index 000000000000..08b88ebf1c08
--- /dev/null
+++ b/science/hpddm/files/patch-Make.inc_Makefile.FreeBSD
@@ -0,0 +1,34 @@
+--- Make.inc/Makefile.FreeBSD.orig	2026-03-23 19:41:10 UTC
++++ Make.inc/Makefile.FreeBSD
+@@ -6,20 +6,19 @@ MPIRUN ?= mpirun -np
+ MPIF90 ?= mpif90
+ MPIRUN ?= mpirun -np
+ 
+-override CXXFLAGS += -std=c++11 -O3 -fPIC
+-override CFLAGS += -std=c99 -O3
+-
+ HPDDMFLAGS ?= -DHPDDM_NUMBERING=\'C\'
+ 
+ INCS = 
+-LIBS = 
++LIBS = ${MPI_LIBS}
+ 
+-MUMPS_INCS = -I/usr/include
+-PYTHON_INCS = -I/usr/include/python2.7/
++MUMPS_INCS = -I${LOCALBASE}/include
++PYTHON_INCS = -I${PYTHON_INCLUDEDIR}
+ 
+-BLAS_LIBS = -L/usr/lib -lblas -llapack
+-ARPACK_LIBS = -L/usr/lib -larpack
+-SCALAPACK_LIBS = -L/usr/lib -lscalapack-openmpi
+-MUMPS_LIBS = -L/usr/lib -lsmumps -ldmumps -lcmumps -lzmumps -lmumps_common -lpord -lmpi_f77
+-HYPRE_LIBS = -L/usr/lib -lHYPRE_IJ_mv -lHYPRE_krylov -lHYPRE_parcsr_ls
+-PYTHON_LIBS = -L/usr/lib -lpython2.7
++BLAS_LIBS = -L${LOCALBASE}/lib ${BLASLIB}
++ARPACK_LIBS = -L${LOCALBASE}/lib -larpack
++SCALAPACK_LIBS = -L${LOCALBASE}/lib -lscalapack
++MUMPS_LIBS = -L${LOCALBASE}/lib -lsmumps -ldmumps -lcmumps -lzmumps -lmumps_common -lpord
++SUITESPARSE_INCS = -I${LOCALBASE}/include/suitesparse
++SUITESPARSE_LIBS = -L${LOCALBASE}/lib -lcholmod -lumfpack -lamd -lcolamd -lsuitesparseconfig
++HYPRE_LIBS = -L${LOCALBASE}/lib -lHYPRE
++PYTHON_LIBS = -L${PYTHON_LIBDIR} -lpython${PYTHON_VER}
diff --git a/science/hpddm/files/patch-Makefile b/science/hpddm/files/patch-Makefile
new file mode 100644
index 000000000000..ce7b6d0dffa8
--- /dev/null
+++ b/science/hpddm/files/patch-Makefile
@@ -0,0 +1,49 @@
+--- Makefile.orig	2026-03-23 19:41:10 UTC
++++ Makefile
+@@ -141,6 +141,11 @@ else
+         EXTENSION_LIB = so
+         override LDFLAGS += -Wl,-rpath,${TOP_DIR}/${LIB_DIR}
+     endif
++    ifeq (${UNAME_S}, FreeBSD)
++        MAKE_OS = FreeBSD
++        EXTENSION_LIB = so
++        override LDFLAGS += -Wl,-rpath,${TOP_DIR}/${LIB_DIR}
++    endif
+     ifeq (${UNAME_S}, Darwin)
+         MAKE_OS = macOS
+         EXTENSION_LIB = dylib
+@@ -238,15 +243,15 @@ ${TOP_DIR}/${BIN_DIR}/custom_operator_fortran.o: examp
+ 	${MPICXX} $^ -o $@ ${LIBS}
+ 
+ ${TOP_DIR}/${BIN_DIR}/custom_operator_fortran.o: examples/custom_operator.f90
+-	${MPIF90} -c interface/HPDDM.f90 -o ${TOP_DIR}/${BIN_DIR}/HPDDM.o ${F90MOD} ${TOP_DIR}/${BIN_DIR}
+-	${MPIF90} -I${TOP_DIR}/${BIN_DIR} -c $< -o $@ ${F90MOD} ${TOP_DIR}/${BIN_DIR}
++	${MPIF90} ${FFLAGS} -c interface/HPDDM.f90 -o ${TOP_DIR}/${BIN_DIR}/HPDDM.o ${F90MOD} ${TOP_DIR}/${BIN_DIR}
++	${MPIF90} ${FFLAGS} -I${TOP_DIR}/${BIN_DIR} -c $< -o $@ ${F90MOD} ${TOP_DIR}/${BIN_DIR}
+ 
+ ${TOP_DIR}/${BIN_DIR}/custom_operator_c.o: examples/custom_operator.c
+ 	${MPICC} ${INCS} -c $< -o $@
+ 
+ ${TOP_DIR}/${BIN_DIR}/custom_operator_%: ${TOP_DIR}/${BIN_DIR}/custom_operator_%.o ${TOP_DIR}/${LIB_DIR}/libhpddm_%.${EXTENSION_LIB}
+ 	@if test $(findstring fortran,$@); then \
+-		CMD="${MPIF90} -I${TOP_DIR}/${BIN_DIR} -o $@ ${F90MOD} ${TOP_DIR}/${BIN_DIR} $@.o ${TOP_DIR}/${BIN_DIR}/HPDDM.o ${LDFLAGS} -L${TOP_DIR}/${LIB_DIR} -lhpddm_fortran ${LIBS}"; \
++		CMD="${MPIF90} ${FFLAGS} -I${TOP_DIR}/${BIN_DIR} -o $@ ${F90MOD} ${TOP_DIR}/${BIN_DIR} $@.o ${TOP_DIR}/${BIN_DIR}/HPDDM.o ${LDFLAGS} -L${TOP_DIR}/${LIB_DIR} -lhpddm_fortran ${LIBS}"; \
+ 	else \
+ 		CMD="${MPICC} -o $@ $@.o ${LDFLAGS} -L${TOP_DIR}/${LIB_DIR} -lhpddm_c ${LIBS}"; \
+ 	fi; \
+@@ -266,11 +271,11 @@ ${TOP_DIR}/${LIB_DIR}/lib%.${EXTENSION_LIB}: interface
+ 
+ ${TOP_DIR}/${LIB_DIR}/lib%.${EXTENSION_LIB}: interface/%.cpp ${TOP_DIR}/${TRASH_DIR}/lib%.d ${TOP_DIR}/${TRASH_DIR}/compiler_flags_cpp
+ 	@if [ "$<" = "interface/hpddm_python.cpp" ]; then \
+-		echo ${MPICXX} ${DEPFLAGS} ${CXXFLAGS} ${HPDDMFLAGS} ${INCS} ${PYTHON_INCS} -shared $< -o $@ ${LIBS} ${PYTHON_LIBS}; \
+-		${MPICXX} ${DEPFLAGS} ${CXXFLAGS} ${HPDDMFLAGS} ${INCS} ${PYTHON_INCS} -shared $< -o $@ ${LIBS} ${PYTHON_LIBS}; \
++		echo ${MPICXX} ${DEPFLAGS} ${CXXFLAGS} ${HPDDMFLAGS} ${INCS} ${PYTHON_INCS} -shared $< -o $@ -Wl,-soname,$@ ${LIBS} ${PYTHON_LIBS}; \
++		${MPICXX} ${DEPFLAGS} ${CXXFLAGS} ${HPDDMFLAGS} ${INCS} ${PYTHON_INCS} -shared $< -o $@ -Wl,-soname,$@ ${LIBS} ${PYTHON_LIBS}; \
+ 	else \
+-		echo ${MPICXX} ${DEPFLAGS} ${CXXFLAGS} ${HPDDMFLAGS} ${INCS} -shared $< -o $@ ${LIBS}; \
+-		${MPICXX} ${DEPFLAGS} ${CXXFLAGS} ${HPDDMFLAGS} ${INCS} -shared $< -o $@ ${LIBS}; \
++		echo ${MPICXX} ${DEPFLAGS} ${CXXFLAGS} ${HPDDMFLAGS} ${INCS} -shared $< -o $@  -Wl,-soname,$@ ${LIBS}; \
++		${MPICXX} ${DEPFLAGS} ${CXXFLAGS} ${HPDDMFLAGS} ${INCS} -shared $< -o $@  -Wl,-soname,$@ ${LIBS}; \
+ 	fi
+ 	${POSTCOMPILE}
+ 
diff --git a/science/hpddm/pkg-descr b/science/hpddm/pkg-descr
new file mode 100644
index 000000000000..c574de71e10a
--- /dev/null
+++ b/science/hpddm/pkg-descr
@@ -0,0 +1,10 @@
+HPDDM is an efficient implementation of various domain decomposition methods
+(DDM) such as one- and two-level Restricted Additive Schwarz (RAS) methods, the
+Finite Element Tearing and Interconnecting (FETI) method, and the Balancing
+Domain Decomposition (BDD) method. These methods can be enhanced with deflation
+vectors computed automatically by the framework using:
+
+- Generalized Eigenvalue problems on the Overlap (GenEO), an approach first
+  introduced in a paper by Spillane et al., or
+- local Dirichlet-to-Neumann operators, an approach first introduced in a paper
+  by Nataf et al. and revisited by Conen et al.
diff --git a/science/hpddm/pkg-plist b/science/hpddm/pkg-plist
new file mode 100644
index 000000000000..9102bf901f2a
--- /dev/null
+++ b/science/hpddm/pkg-plist
@@ -0,0 +1,89 @@
+bin/custom_operator_fortran
+bin/schwarz_c
+bin/schwarz_cpp
+include/HPDDM/HPDDM.hpp
+include/HPDDM/HPDDM_ARPACK.hpp
+include/HPDDM/HPDDM_BDD.hpp
+include/HPDDM/HPDDM_BLAS.hpp
+include/HPDDM/HPDDM_CG.hpp
+include/HPDDM/HPDDM_Dissection.hpp
+include/HPDDM/HPDDM_Elemental.hpp
+include/HPDDM/HPDDM_FETI.hpp
+include/HPDDM/HPDDM_GCRODR.hpp
+include/HPDDM/HPDDM_GMRES.hpp
+include/HPDDM/HPDDM_LAPACK.hpp
+include/HPDDM/HPDDM_MKL_PARDISO.hpp
+include/HPDDM/HPDDM_MUMPS.hpp
+include/HPDDM/HPDDM_PETSc.hpp
+include/HPDDM/HPDDM_PaStiX.hpp
+include/HPDDM/HPDDM_SLEPc.hpp
+include/HPDDM/HPDDM_SuiteSparse.hpp
+include/HPDDM/HPDDM_coarse_operator.hpp
+include/HPDDM/HPDDM_coarse_operator_impl.hpp
+include/HPDDM/HPDDM_define.hpp
+include/HPDDM/HPDDM_dense.hpp
+include/HPDDM/HPDDM_dmatrix.hpp
+include/HPDDM/HPDDM_eigensolver.hpp
+include/HPDDM/HPDDM_enum.hpp
+include/HPDDM/HPDDM_hypre.hpp
+include/HPDDM/HPDDM_inexact_coarse_operator.hpp
+include/HPDDM/HPDDM_iterative.hpp
+include/HPDDM/HPDDM_matrix.hpp
+include/HPDDM/HPDDM_operator.hpp
+include/HPDDM/HPDDM_option.hpp
+include/HPDDM/HPDDM_option_impl.hpp
+include/HPDDM/HPDDM_preconditioner.hpp
+include/HPDDM/HPDDM_preprocessor_check.hpp
+include/HPDDM/HPDDM_schur.hpp
+include/HPDDM/HPDDM_schwarz.hpp
+include/HPDDM/HPDDM_singleton.hpp
+include/HPDDM/HPDDM_specifications.hpp
+include/HPDDM/HPDDM_subdomain.hpp
+include/HPDDM/HPDDM_wrapper.hpp
+include/hpddm.mod
+include/my_operator.mod
+lib/libhpddm_c.so
+lib/libhpddm_c.so.0
+lib/libhpddm_fortran.so
+lib/libhpddm_fortran.so.0
+lib/libhpddm_python.so
+lib/libhpddm_python.so.0
+%%DATADIR%%/benchmark/local_eigensolver.cpp
+%%DATADIR%%/benchmark/local_solver.cpp
+%%DATADIR%%/benchmark/local_solver.py
+%%DATADIR%%/interface/HPDDM.f90
+%%DATADIR%%/interface/HPDDM.h
+%%DATADIR%%/interface/hpddm.py
+%%DATADIR%%/interface/hpddm_c.cpp
+%%DATADIR%%/interface/hpddm_fortran.cpp
+%%DATADIR%%/interface/hpddm_petsc.cpp
+%%DATADIR%%/interface/hpddm_python.cpp
+%%DATADIR%%/interface/petsc/README.md
+%%DATADIR%%/interface/petsc/ksp/cuda/hpddm.cu
+%%DATADIR%%/interface/petsc/ksp/hpddm.cxx
+%%DATADIR%%/interface/petsc/pc/pchpddm.cxx
+%%PORTDOCS%%%%DOCSDIR%%/Languages.txt
+%%PORTDOCS%%%%DOCSDIR%%/Menu.txt
+%%PORTDOCS%%%%DOCSDIR%%/README.md
+%%PORTDOCS%%%%DOCSDIR%%/Topics.txt
+%%PORTDOCS%%%%DOCSDIR%%/cheatsheet.bib
+%%PORTDOCS%%%%DOCSDIR%%/cheatsheet.pdf
+%%PORTDOCS%%%%DOCSDIR%%/cheatsheet.tex
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/custom_operator.c
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/custom_operator.f90
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/driver.cpp
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/generate.c
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/generate.cpp
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/generate.py
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/generateFromFile.cpp
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/hpddm_f90.cfg
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/iterative.py
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/payload.sh
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/payload.sh.bak
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/schwarz.c
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/schwarz.cpp
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/schwarz.h
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/schwarz.hpp
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/schwarz.py
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/schwarzFromFile.cpp
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/solver.py