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(可选后端)
  • 支持复数、实数、单/双精度
  • 模块化设计:易于扩展和嵌入到现有代码中。

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_DIRPETSC_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 方程等),可进一步提供问题背景,我可以给出针对性配置和代码示例。

Logo

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

更多推荐