HPDDM(High-Performance Domain Decomposition Methods)求解器库介绍和使用
✅高性能并行计算:支持 MPI + OpenMP 混合并行,适配大规模 HPC 系统。✅多种预条件子重叠型(如 Additive Schwarz, Restricted Additive Schwarz)非重叠型(如 BDDC, FETI-DP)多重网格(Multilevel)✅灵活的求解器接口:支持 Krylov 子空间方法(CG, GMRES, BiCGStab 等)。✅与外部库集成PETSc
HPDDM(High-Performance Domain Decomposition Methods)是一个开源、高性能、模块化的 C++ 库,专为求解大规模稀疏线性系统而设计,尤其适用于并行计算环境。它实现了多种先进的区域分解方法(Domain Decomposition Methods, DDM),常用于科学计算、有限元分析、结构力学、流体力学等领域。
一、HPDDM 简介
1.1 核心特性
- ✅ 高性能并行计算:支持 MPI + OpenMP 混合并行,适配大规模 HPC 系统。
- ✅ 多种预条件子:
- 重叠型(如 Additive Schwarz, Restricted Additive Schwarz)
- 非重叠型(如 BDDC, FETI-DP)
- 多重网格(Multilevel)
- ✅ 灵活的求解器接口:支持 Krylov 子空间方法(CG, GMRES, BiCGStab 等)。
- ✅ 与外部库集成:
- PETSc(通过
PCHPDDM
接口) - SLEPc(用于特征值问题)
- Eigen(可选后端)
- PETSc(通过
- ✅ 支持复数、实数、单/双精度。
- ✅ 模块化设计:易于扩展和嵌入到现有代码中。
1.2 适用场景
- 大规模偏微分方程数值求解(FEM/FVM)
- 结构力学、电磁场、流体动力学模拟
- 并行预条件子开发与研究
- 需要高可扩展性的科学计算应用
二、安装与依赖
2.1 依赖项
- C++11 编译器(GCC、Clang、Intel 等)
- MPI 库(如 OpenMPI、MPICH)
- BLAS/LAPACK(推荐 OpenBLAS、Intel MKL、ATLAS)
- (可选)PETSc、SLEPc、Eigen、MUMPS、METIS
2.2 编译安装
git clone https://github.com/hpddm/hpddm.git
cd hpddm
mkdir build && cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=/your/install/path \
-DHPDDM_PETSC=ON \ # 启用 PETSc 接口
-DHPDDM_SLEPC=ON \ # 启用 SLEPc 接口
-DBLAS_LIBRARIES="-lopenblas" \
-DLAPACK_LIBRARIES="-lopenblas"
make -j4
make install
⚠️ 注意:若使用 PETSc,建议先编译 PETSc 并设置
PETSC_DIR
和PETSC_ARCH
。
三、基本使用方法
3.1 独立使用 HPDDM(不依赖 PETSc)
示例:求解 Ax = b
#include <HPDDM.hpp>
int main(int argc, char** argv) {
// 初始化 MPI
MPI_Init(&argc, &argv);
// 定义矩阵类型(CSR 格式)
using Matrix = HPDDM::MatrixCSR<double>;
using Solver = HPDDM::IterativeSolver<Matrix>;
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// 假设你已构造矩阵 A 和向量 b(此处略去具体构造过程)
// Matrix* A = ...;
// double* b = ...;
// int n = ...; // 本地向量长度
// 创建求解器
Solver solver;
solver.setMatrix(A); // 设置矩阵
// 设置选项(从文件或命令行)
HPDDM::Option& opt = *HPDDM::Option::get();
opt.parse(argc, argv); // 解析命令行参数,如 -hpddm_max_it 1000
// 分配解向量 x
double* x = new double[n]();
// 求解
int iterations = solver.solve(b, x);
if (rank == 0)
std::cout << "Converged in " << iterations << " iterations." << std::endl;
delete[] x;
// delete A; // 注意释放矩阵
MPI_Finalize();
return 0;
}
命令行设置参数示例:
mpirun -n 4 ./your_program \
-hpddm_krylov_method gcrotmk \
-hpddm_max_it 1000 \
-hpddm_tol 1e-8 \
-hpddm_define_subdomain \
-hpddm_level_1_st 1 \
-hpddm_level_1_eps 0.1
3.2 与 PETSc 集成使用(推荐方式)
HPDDM 最常用的方式是作为 PETSc 的预条件子 PCHPDDM
。
示例代码(PETSc + HPDDM)
#include <petscksp.h>
int main(int argc, char **argv) {
PetscInitialize(&argc, &argv, NULL, NULL);
Mat A;
Vec b, x;
KSP ksp;
PC pc;
// 创建矩阵和向量(此处省略具体装配过程)
// 假设你已创建好 Mat A, Vec b
KSPCreate(PETSC_COMM_WORLD, &ksp);
KSPSetOperators(ksp, A, A);
KSPGetPC(ksp, &pc);
// 设置 HPDDM 预条件子
PCSetType(pc, PCHPDDM);
KSPSetType(ksp, KSPGMRES);
// 可选:设置 HPDDM 子选项
PetscOptionsSetValue(NULL, "-pc_hpddm_levels_1_st_pc_type", "lu");
PetscOptionsSetValue(NULL, "-pc_hpddm_levels_1_eps_nev", "20");
PetscOptionsSetValue(NULL, "-pc_hpddm_coarse_p", "1");
KSPSetFromOptions(ksp); // 从命令行读取参数
KSPSolve(ksp, b, x);
// 输出信息
KSPConvergedReason reason;
KSPGetConvergedReason(ksp, &reason);
if (reason > 0) {
PetscPrintf(PETSC_COMM_WORLD, "Converged!\n");
}
KSPDestroy(&ksp);
VecDestroy(&x);
VecDestroy(&b);
MatDestroy(&A);
PetscFinalize();
return 0;
}
编译命令(需链接 PETSc 和 HPDDM):
mpicxx -o main main.cpp $(pkg-config --cflags --libs PETSc)
运行命令示例:
mpirun -n 4 ./main \
-ksp_type gmres \
-pc_type hpddm \
-pc_hpddm_levels_1_st_pc_type lu \
-pc_hpddm_coarse_p 1 \
-ksp_monitor \
-ksp_rtol 1e-8
四、常用选项说明(PETSc 接口)
选项 | 说明 |
---|---|
-pc_type hpddm |
启用 HPDDM 预条件子 |
-pc_hpddm_define_subdomains |
自动划分子域(需 METIS) |
-pc_hpddm_has_subdomain_def |
用户提供子域划分 |
-pc_hpddm_coarse_p <p> |
粗网格进程数(0 = 所有进程参与) |
-pc_hpddm_levels_1_st_pc_type lu |
子域求解器用直接法(也可用 ilu , jacobi ) |
-pc_hpddm_levels_1_eps_nev <n> |
子域谱修正的特征值个数 |
-pc_hpddm_block_splitting |
按物理场分块(用于多物理场问题) |
五、高级功能
5.1 多重网格(Multilevel)
HPDDM 支持多层区域分解,例如三层 BDDC:
-pc_hpddm_levels_1_st_pc_type lu \
-pc_hpddm_levels_2_st_pc_type lu \
-pc_hpddm_coarse_p 1 \
-pc_hpddm_coarse_pc_type lu
5.2 特征值修正(Spectral Coarse Space)
用于改善收敛性,尤其在系数跳跃大的问题中:
-pc_hpddm_levels_1_eps_nev 10 \
-pc_hpddm_levels_1_eps_threshold 0.1
5.3 与 SLEPc 集成(特征值问题)
#include <slepceps.h>
...
EPSSetOperators(eps, A, B);
EPSSetWhichEigenpairs(eps, EPS_SMALLEST_REAL);
EPSSetFromOptions(eps);
EPSSolve(eps);
并设置:
-st_pc_type hpddm
-st_ksp_type preonly
-st_pc_hpddm_coarse_p 1
六、调试与性能优化
- 使用
-log_view
查看 PETSc 日志 - 使用
-pc_hpddm_view
查看 HPDDM 内部结构 - 使用
-ksp_monitor_true_residual
监控真实残差 - 启用
-hpddm_verbosity 2
输出 HPDDM 调试信息 - 性能调优:选择合适的子域求解器、特征值数量、粗网格大小
七、参考资料
- 📘 官方 GitHub:https://github.com/hpddm/hpddm
- 📘 官方文档:https://github.com/hpddm/hpddm/tree/master/doc
- 📘 PETSc 手册中 PCHPDDM 章节:https://petsc.org/release/docs/manualpages/PC/PCHPDDM.html
- 📘 论文:Pierre Jolivet et al., “Scalable Domain Decomposition Preconditioners for Heterogeneous Elliptic Problems”, SC13, SC14, etc.
八、小结
✅ HPDDM 是一个现代、高性能、灵活的区域分解求解器库,特别适合在并行环境下求解大规模稀疏线性系统。
✅ 推荐与 PETSc 集成使用,通过 PCHPDDM
接口可快速构建高性能预条件子。
✅ 支持多层、谱修正、复数、块结构等高级功能,适用于科研与工业级应用。
如需具体案例(如弹性力学、Stokes 方程、Maxwell 方程等),可进一步提供问题背景,我可以给出针对性配置和代码示例。
更多推荐
所有评论(0)