git: b4d947a17c32 - main - science/hpddm: new port, framework for HP domain decomposition methods
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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