在 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-Widlund
  • PC_HPDDM_TYPE_RGDSW:受限 GDSW
  • PC_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:块灵活 BiCG
  • bcg:块共轭梯度

四、常用命令行选项

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


六、性能调优建议

  1. 子域求解器选择

    • 小子域 → lu + mumps
    • 大子域 → ilugamg
  2. 粗空间进程数

    • 通常设为总进程数的 1/4 ~ 1/2,避免粗空间成为瓶颈。
  3. 重用 Krylov 子空间

    • 对于多右端项或非线性迭代,使用 -ksp_hpddm_recycle 加速。
  4. 混合并行

    • 启用 OpenMP:export OMP_NUM_THREADS=4 + 编译时加 -fopenmp
  5. 监控收敛

    -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,你将能轻松应对千万级自由度、数千核并行的大规模仿真问题!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐