PETSc: HPDDM方法
HPDDM(High-performance PDDM)是基于 PDDM(Parallel Domain Decomposition Methods)发展而来的开源 C++ 库,由 Pierre Jolivet 等人开发。高效的并行域分解方法自适应粗空间构造(如 GenEO)与 PETSc、SLEPc 深度集成支持 MPI + OpenMP 混合并行支持复数、块矩阵、非对称问题在 PETSc 中,
文章目录
在 PETSc 中,HPDDM 是一个高性能分布式多层子域分解求解器库,被集成进 PETSc 作为其 KSP(Krylov 子空间求解器)和 PC(预条件器)的一部分。HPDDM 支持多种先进的并行求解技术,如 GenEO(广义特征值重叠)、DDM(域分解方法)、BDDC(平衡域分解 by 约束)等,特别适合求解大规模稀疏线性系统,尤其是在并行计算环境中。
一、HPDDM 简介
HPDDM(High-performance PDDM)是基于 PDDM(Parallel Domain Decomposition Methods)发展而来的开源 C++ 库,由 Pierre Jolivet 等人开发。它专注于:
- 高效的并行域分解方法
- 自适应粗空间构造(如 GenEO)
- 与 PETSc、SLEPc 深度集成
- 支持 MPI + OpenMP 混合并行
- 支持复数、块矩阵、非对称问题
在 PETSc 中,HPDDM 被封装为预条件器 PCHPDDM
和 Krylov 方法 KSPHPDDM
,允许用户通过 PETSc 的标准接口调用 HPDDM 的高级功能。
二、启用 HPDDM 支持
HPDDM 并非 PETSc 默认编译选项,需在编译 PETSc 时显式启用:
./configure --download-hpddm \
--download-mumps \
--download-scalapack \
--download-metis \
--download-parmetis \
--with-mpi=1 \
--with-cxx-dialect=C++11 \
COPTFLAGS="-O2" CXXOPTFLAGS="-O2"
✅ 推荐同时下载 MUMPS、ScaLAPACK、METIS/ParMETIS,因为 HPDDM 的某些功能(如 BDDC、GenEO)依赖它们进行子域求解或图划分。
编译完成后,可通过以下命令检查是否启用:
make check
./configure --help | grep -i hpddm
或在程序中调用:
PetscBool flg;
PetscOptionsHasName(NULL,NULL,"-help",&flg);
if (flg) { /* 打印帮助时会显示 HPDDM 相关选项 */ }
三、HPDDM 在 PETSc 中的使用方式
1. 作为预条件器:PCHPDDM
这是最常用的场景。HPDDM 提供了强大的子结构预条件器,如:
PC_HPDDM_TYPE_BDDC
:平衡域分解PC_HPDDM_TYPE_GDSW
:广义 Dryja-Smith-WidlundPC_HPDDM_TYPE_RGDSW
:受限 GDSWPC_HPDDM_TYPE_SUBDOMAIN
:仅子域求解(无粗空间)PC_HPDDM_TYPE_COARSE
:仅粗空间
示例代码:
#include <petscksp.h>
int main(int argc, char **argv)
{
Mat A;
Vec x, b;
KSP ksp;
PC pc;
PetscErrorCode ierr;
PetscInitialize(&argc, &argv, NULL, NULL);
// 创建矩阵和向量(此处省略具体构建过程)
// 假设 A 已经组装完毕
KSPCreate(PETSC_COMM_WORLD, &ksp);
KSPSetOperators(ksp, A, A);
KSPGetPC(ksp, &pc);
// 设置 HPDDM 预条件器
PCSetType(pc, PCHPDDM);
// 可选:设置子类型(如 BDDC)
PetscOptionsSetValue(NULL, "-pc_hpddm_levels_1_pc_type", "bddc");
// 设置 KSP 类型(推荐使用可重启动的 GMRES)
KSPSetType(ksp, KSPGMRES);
// 设置选项(也可从命令行传入)
KSPSetFromOptions(ksp);
// 创建 RHS 和解向量
MatCreateVecs(A, &x, &b);
VecSet(b, 1.0); // 示例 RHS
// 求解
KSPSolve(ksp, b, x);
// 清理
KSPDestroy(&ksp);
VecDestroy(&x);
VecDestroy(&b);
MatDestroy(&A);
PetscFinalize();
return 0;
}
2. 作为 Krylov 求解器:KSPHPDDM
HPDDM 也提供自己的 Krylov 方法,支持块 Krylov、自定义正交化、多向量重启动等高级功能。
KSPSetType(ksp, KSPHPDDM);
PetscOptionsSetValue(NULL, "-ksp_hpddm_type", "bgcrodr"); // 块 GCRODR
PetscOptionsSetValue(NULL, "-ksp_hpddm_recycle", "10"); // 重用 10 个向量
支持的 KSP 类型包括:
gcrodr
:GCRO-DR(用于单右端项)bgcrodr
:块 GCRO-DR(用于多右端项)bfbcg
:块灵活 BiCGbcg
:块共轭梯度
四、常用命令行选项
HPDDM 提供了丰富的运行时选项,推荐通过命令行控制:
./your_program \
-ksp_type gmres \
-pc_type hpddm \
-pc_hpddm_levels_1_pc_type bddc \
-pc_hpddm_levels_1_sub_pc_type lu \
-pc_hpddm_levels_1_sub_pc_factor_mat_solver_type mumps \
-pc_hpddm_coarse_p 2 \
-pc_hpddm_coarse_pc_type lu \
-pc_hpddm_coarse_pc_factor_mat_solver_type mumps \
-ksp_monitor \
-ksp_converged_reason
关键选项说明:
选项 | 含义 |
---|---|
-pc_hpddm_levels_1_pc_type bddc |
第一层使用 BDDC |
-pc_hpddm_levels_1_sub_pc_type lu |
子域求解器用 LU |
-pc_hpddm_levels_1_sub_pc_factor_mat_solver_type mumps |
子域 LU 使用 MUMPS |
-pc_hpddm_coarse_p 2 |
粗空间使用 2 个进程(其他进程用于子域) |
-pc_hpddm_coarse_pc_type lu |
粗空间求解器类型 |
-ksp_hpddm_type bgcrodr |
使用块 GCRO-DR Krylov 方法 |
-ksp_hpddm_recycle 20 |
重用 20 个 Krylov 向量加速收敛 |
五、高级功能:GenEO(广义特征值重叠)
GenEO 是 HPDDM 最强大的功能之一,通过求解局部广义特征值问题构造自适应粗空间,极大提升对高异质、各向异性问题的收敛性。
启用 GenEO:
-pc_hpddm_levels_1_pc_type geneo \
-pc_hpddm_levels_1_eps_nev 10 \ # 每个子域提取 10 个特征向量
-pc_hpddm_coarse_p 4 \ # 粗空间使用 4 个进程
-pc_hpddm_has_neumann 1 # 若系统是 Neumann 问题(无约束),需设为 1
⚠️ GenEO 依赖 SLEPc 求解局部特征值问题。确保编译 PETSc 时启用了
--download-slepc
。
六、性能调优建议
-
子域求解器选择:
- 小子域 →
lu + mumps
- 大子域 →
ilu
或gamg
- 小子域 →
-
粗空间进程数:
- 通常设为总进程数的 1/4 ~ 1/2,避免粗空间成为瓶颈。
-
重用 Krylov 子空间:
- 对于多右端项或非线性迭代,使用
-ksp_hpddm_recycle
加速。
- 对于多右端项或非线性迭代,使用
-
混合并行:
- 启用 OpenMP:
export OMP_NUM_THREADS=4
+ 编译时加-fopenmp
- 启用 OpenMP:
-
监控收敛:
-ksp_monitor_true_residual \ -ksp_converged_reason \ -log_view
七、示例:完整命令行运行
mpiexec -n 16 ./ex1 \
-ksp_type hpddm \
-ksp_hpddm_type bgcrodr \
-ksp_hpddm_recycle 15 \
-pc_type hpddm \
-pc_hpddm_levels_1_pc_type geneo \
-pc_hpddm_levels_1_eps_nev 8 \
-pc_hpddm_coarse_p 4 \
-pc_hpddm_coarse_pc_type lu \
-pc_hpddm_coarse_pc_factor_mat_solver_type mumps \
-pc_hpddm_levels_1_sub_pc_type lu \
-pc_hpddm_levels_1_sub_pc_factor_mat_solver_type mumps \
-ksp_monitor \
-ksp_converged_reason
八、参考资源
- ✅ HPDDM 官网:https://github.com/hpddm/hpddm
- ✅ PETSc 手册:https://petsc.org/release/docs/manualpages/PC/PCHPDDM.html
- ✅ Jolivet, P., et al. “Scalable domain decomposition preconditioners for heterogeneous elliptic problems.” SC13.
- ✅ GenEO 原始论文:Spillane, N., et al. “Abstract robust coarse spaces for systems of PDEs via generalized eigenproblems in the overlaps.” Numerische Mathematik, 2014.
九、常见问题
Q1: 编译时报错 “HPDDM not found”
→ 确保 configure 时加了 --download-hpddm
,并检查是否满足依赖(C++11、BLAS/LAPACK、MPI)。
Q2: GenEO 不收敛或报错
→ 检查是否启用了 SLEPc;尝试增大 eps_nev
;确认矩阵是否正定或是否需要 -pc_hpddm_has_neumann 1
。
Q3: 粗空间求解慢
→ 减少 coarse_p
,或改用迭代法如 -pc_hpddm_coarse_pc_type gamg
。
总结
PETSc 中的 HPDDM 是一个功能强大、高度可配置的并行求解器框架,特别适合大规模科学计算中的困难线性系统。通过合理设置子域类型、粗空间策略和 Krylov 方法,可以显著提升求解效率和可扩展性。建议从 BDDC 或 GenEO 开始尝试,并结合命令行选项灵活调整。
如需深入定制(如自定义粗空间、多级 HPDDM),可参考 HPDDM 的 C++ 接口或 PETSc 源码中的 src/ksp/pc/impls/hpddm/
。
✅ 掌握 HPDDM,你将能轻松应对千万级自由度、数千核并行的大规模仿真问题!
更多推荐
所有评论(0)