外观
PETSc 命令行选项完全指南
PETSc 最强大的特性之一是其灵活的命令行选项系统,允许在不修改代码的情况下调整求解器、预条件子、矩阵格式等各种参数。本文将详细介绍 PETSc 的命令行选项,帮助你充分发挥 PETSc 的性能。
命令行选项基础
基本语法
./program -option_name value
./program -option_name # 布尔选项,不需要值查看可用选项
# 查看所有选项
./program -help
# 查看特定类别的选项
./program -help | grep ksp
./program -help | grep pc
./program -help | grep mat
# 查看当前使用的选项
./program -options_left从文件读取选项
# 创建选项文件 petsc.opts
cat > petsc.opts << EOF
-ksp_type gmres
-pc_type hypre
-ksp_monitor
EOF
# 使用选项文件
./program -options_file petsc.opts选项优先级
- 命令行选项(最高优先级)
- 选项文件
- 环境变量
PETSC_OPTIONS - 代码中设置的默认值(最低优先级)
KSP 求解器选项
KSP(Krylov Subspace Methods)是 PETSc 的线性求解器模块。
求解器类型
# 共轭梯度法(适用于对称正定矩阵)
-ksp_type cg
# GMRES(适用于一般非对称矩阵)
-ksp_type gmres
-ksp_gmres_restart 30 # 重启步数
# BiCGStab(双共轭梯度稳定法)
-ksp_type bcgs
# FGMRES(灵活 GMRES,允许变化的预条件子)
-ksp_type fgmres
# Richardson 迭代
-ksp_type richardson
# Chebyshev 迭代
-ksp_type chebyshev
# 直接求解(使用预条件子作为直接求解器)
-ksp_type preonly
# 查看所有可用求解器
./program -help | grep "KSPType"收敛控制
# 相对容差
-ksp_rtol 1e-6
# 绝对容差
-ksp_atol 1e-12
# 散度容差
-ksp_divtol 1e4
# 最大迭代次数
-ksp_max_it 1000
# 初始猜测为零
-ksp_initial_guess_nonzero 0
# 使用上次解作为初始猜测
-ksp_initial_guess_nonzero 1监控和输出
# 监控残差
-ksp_monitor
# 监控真实残差
-ksp_monitor_true_residual
# 监控奇异值
-ksp_monitor_singular_value
# 详细输出
-ksp_monitor_short
# 绘制残差曲线(需要 X11)
-ksp_monitor_draw
# 输出到文件
-ksp_monitor ::ascii_info_detail:monitor.txt
# 查看求解器配置
-ksp_view
# 查看详细配置
-ksp_view ::ascii_info_detailGMRES 特定选项
# 重启步数(默认 30)
-ksp_gmres_restart 50
# 正交化方法
-ksp_gmres_modifiedgramschmidt # 修正 Gram-Schmidt
-ksp_gmres_classicalgramschmidt # 经典 Gram-Schmidt
# 预分配空间
-ksp_gmres_preallocateCG 特定选项
# CG 变体
-ksp_cg_type symmetric # 对称版本
-ksp_cg_type hermitian # Hermitian 版本
# 单次归约(减少通信)
-ksp_cg_single_reduction预条件子(PC)选项
预条件子用于加速迭代求解器的收敛。
预条件子类型
# Jacobi 预条件子(对角缩放)
-pc_type jacobi
# 块 Jacobi
-pc_type bjacobi
-sub_pc_type ilu # 子块使用 ILU
# ILU(k) 不完全 LU 分解
-pc_type ilu
-pc_factor_levels 3 # 填充级数
# ICC(k) 不完全 Cholesky 分解(对称正定)
-pc_type icc
-pc_factor_levels 3
# SOR/SSOR
-pc_type sor
-pc_sor_omega 1.5 # 松弛因子
-pc_sor_its 1 # 迭代次数
# Additive Schwarz Method (ASM)
-pc_type asm
-pc_asm_overlap 2 # 重叠大小
# 代数多重网格(HYPRE BoomerAMG)
-pc_type hypre
-pc_hypre_type boomeramg
# MUMPS 直接求解器
-pc_type lu
-pc_factor_mat_solver_type mumps
# SuperLU_DIST 直接求解器
-pc_type lu
-pc_factor_mat_solver_type superlu_dist
# 无预条件子
-pc_type noneILU/ICC 选项
# 填充级数
-pc_factor_levels 3
# 填充比例
-pc_factor_fill 2.0
# 主元阈值
-pc_factor_shift_type NONZERO
-pc_factor_shift_amount 1e-10
# 使用自然排序
-pc_factor_mat_ordering_type natural
# 使用 RCM 排序
-pc_factor_mat_ordering_type rcm
# 使用 ND 排序
-pc_factor_mat_ordering_type ndHYPRE BoomerAMG 选项
# 基本设置
-pc_type hypre
-pc_hypre_type boomeramg
# 强连接阈值(0.25-0.75)
-pc_hypre_boomeramg_strong_threshold 0.5
# 粗化策略
-pc_hypre_boomeramg_coarsen_type HMIS # HMIS
-pc_hypre_boomeramg_coarsen_type Falgout # Falgout
-pc_hypre_boomeramg_coarsen_type PMIS # PMIS
# 插值类型
-pc_hypre_boomeramg_interp_type ext+i # 扩展+i
-pc_hypre_boomeramg_interp_type classical # 经典
-pc_hypre_boomeramg_interp_type FF1 # FF1
# 最大层数
-pc_hypre_boomeramg_max_levels 25
# 粗层求解器
-pc_hypre_boomeramg_grid_sweeps_coarse 1
# 松弛类型
-pc_hypre_boomeramg_relax_type_all symmetric-SOR/Jacobi
-pc_hypre_boomeramg_relax_type_down symmetric-SOR/Jacobi
-pc_hypre_boomeramg_relax_type_up symmetric-SOR/Jacobi
# 截断因子
-pc_hypre_boomeramg_truncfactor 0.3
# 最大行和
-pc_hypre_boomeramg_max_row_sum 0.9
# 打印统计信息
-pc_hypre_boomeramg_print_statisticsMUMPS 选项
# 使用 MUMPS
-pc_type lu
-pc_factor_mat_solver_type mumps
# 内存增长因子
-mat_mumps_icntl_14 20
# 并行分析
-mat_mumps_icntl_28 2 # 并行分析
-mat_mumps_icntl_29 2 # 并行排序
# 输出级别
-mat_mumps_icntl_4 2 # 打印统计信息
# 主元策略
-mat_mumps_icntl_7 7 # 自动选择多重网格(MG)选项
# 使用几何多重网格
-pc_type mg
# 层数
-pc_mg_levels 4
# V-cycle 或 W-cycle
-pc_mg_type multiplicative # V-cycle
-pc_mg_type full # W-cycle
# 光滑子
-mg_levels_ksp_type richardson
-mg_levels_pc_type sor
# 粗层求解器
-mg_coarse_ksp_type preonly
-mg_coarse_pc_type lu矩阵选项
矩阵类型
# AIJ 格式(默认,压缩行存储)
-mat_type aij
# 块 AIJ 格式
-mat_type baij
-mat_block_size 3
# SBAIJ 格式(对称块)
-mat_type sbaij
# 稠密矩阵
-mat_type dense
# CUDA 矩阵(GPU)
-mat_type aijcusparse
# 查看矩阵信息
-mat_view
-mat_view ::ascii_info
-mat_view ::ascii_info_detail矩阵分区
# 使用 ParMETIS 分区
-mat_partitioning_type parmetis
# 使用 METIS 分区
-mat_partitioning_type average
# 使用 Chaco 分区
-mat_partitioning_type chaco
# 查看分区信息
-mat_partitioning_view矩阵排序
# 自然排序
-mat_ordering_type natural
# RCM(Reverse Cuthill-McKee)
-mat_ordering_type rcm
# ND(Nested Dissection)
-mat_ordering_type nd
# QMD(Quotient Minimum Degree)
-mat_ordering_type qmd
# 1WD(One-way Dissection)
-mat_ordering_type 1wd向量选项
# 标准向量
-vec_type seq # 串行
-vec_type mpi # 并行
# CUDA 向量(GPU)
-vec_type cuda
# 查看向量信息
-vec_view非线性求解器(SNES)选项
求解器类型
# Newton 方法
-snes_type newtonls
# Newton 信赖域方法
-snes_type newtontr
# 拟 Newton 方法
-snes_type qn
# 非线性 GMRES
-snes_type ngmres
# 非线性 CG
-snes_type ncg
# Anderson 加速
-snes_type anderson收敛控制
# 相对容差
-snes_rtol 1e-6
# 绝对容差
-snes_atol 1e-12
# 步长容差
-snes_stol 1e-8
# 最大迭代次数
-snes_max_it 50
# 最大函数评估次数
-snes_max_funcs 10000线搜索
# 线搜索类型
-snes_linesearch_type bt # 回溯
-snes_linesearch_type basic # 基本
-snes_linesearch_type l2 # L2 范数
-snes_linesearch_type cp # 临界点
# 最小步长
-snes_linesearch_minlambda 1e-12
# 最大步长
-snes_linesearch_maxstep 1e8
# 阻尼因子
-snes_linesearch_damping 0.9监控
# 监控残差
-snes_monitor
# 监控残差范数
-snes_monitor_short
# 监控解
-snes_monitor_solution
# 查看配置
-snes_view
# 测试 Jacobian
-snes_test_jacobian
-snes_test_jacobian_view时间步进(TS)选项
时间积分方法
# Euler 方法
-ts_type euler
# 向后 Euler
-ts_type beuler
# Crank-Nicolson
-ts_type cn
# Runge-Kutta 方法
-ts_type rk
-ts_rk_type 3bs # 3 阶 Bogacki-Shampine
-ts_rk_type 5dp # 5 阶 Dormand-Prince
# BDF(向后差分公式)
-ts_type bdf
# ARKIMEX(隐式-显式 RK)
-ts_type arkimex时间步长控制
# 初始时间步长
-ts_dt 0.01
# 最大时间步长
-ts_max_time 10.0
# 最大步数
-ts_max_steps 1000
# 自适应时间步长
-ts_adapt_type basic
-ts_adapt_dt_min 1e-6
-ts_adapt_dt_max 1.0监控
# 监控时间步
-ts_monitor
# 监控解
-ts_monitor_solution
# 查看配置
-ts_view性能分析选项
日志和性能分析
# 查看性能摘要
-log_view
# 详细性能分析
-log_view :logfile.txt:ascii_flamegraph
# 查看内存使用
-log_view_memory
# 查看 GPU 性能
-log_view_gpu_time
# 事件日志
-log_all
# MPE 日志(生成 Jumpshot 文件)
-log_mpe logfile.clog2性能监控
# 监控浮点运算
-log_view | grep "Flop"
# 监控通信
-log_view | grep "MPI"
# 监控内存
-log_view | grep "Memory"
# 监控时间
-log_view | grep "Time"调试选项
错误检查
# 启用所有错误检查
-on_error_attach_debugger
# 在错误时中止
-on_error_abort
# 检查内存泄漏
-malloc_debug
# 检查内存越界
-malloc_test
# 详细错误信息
-error_output_stderr调试输出
# 打印所有选项
-options_left
# 打印未使用的选项
-options_left
# 打印对象创建
-objects_dump
# 打印内存使用
-memory_view
# 打印矩阵/向量
-mat_view ::ascii_matlab
-vec_view ::ascii_matlab并行选项
MPI 相关
# 显示 MPI 信息
-log_view | grep "MPI"
# 负载平衡
-mat_partitioning_type parmetis
# 通信优化
-matmult_vecscatter_type alltoallGPU 加速
# 使用 CUDA
-mat_type aijcusparse
-vec_type cuda
# 使用 Kokkos
-mat_type aijkokkos
-vec_type kokkos
# 查看 GPU 使用
-log_view_gpu_time实用组合示例
1. 快速测试配置
./program \
-ksp_type gmres \
-pc_type jacobi \
-ksp_rtol 1e-6 \
-ksp_monitor2. 高性能配置(HYPRE AMG)
./program \
-ksp_type fgmres \
-ksp_gmres_restart 30 \
-pc_type hypre \
-pc_hypre_type boomeramg \
-pc_hypre_boomeramg_strong_threshold 0.5 \
-pc_hypre_boomeramg_coarsen_type HMIS \
-pc_hypre_boomeramg_interp_type ext+i \
-ksp_rtol 1e-8 \
-ksp_monitor3. 直接求解器配置(MUMPS)
./program \
-ksp_type preonly \
-pc_type lu \
-pc_factor_mat_solver_type mumps \
-mat_mumps_icntl_14 20 \
-mat_mumps_icntl_28 24. 对称正定问题(CG + ICC)
./program \
-ksp_type cg \
-pc_type icc \
-pc_factor_levels 3 \
-ksp_rtol 1e-8 \
-ksp_monitor5. 大规模并行配置
mpirun -np 128 ./program \
-ksp_type fgmres \
-pc_type hypre \
-pc_hypre_type boomeramg \
-mat_partitioning_type parmetis \
-ksp_rtol 1e-6 \
-log_view6. 非线性问题配置
./program \
-snes_type newtonls \
-snes_linesearch_type bt \
-snes_rtol 1e-6 \
-snes_max_it 50 \
-ksp_type gmres \
-pc_type hypre \
-snes_monitor \
-ksp_monitor7. 时间相关问题配置
./program \
-ts_type bdf \
-ts_dt 0.01 \
-ts_max_time 10.0 \
-ts_adapt_type basic \
-snes_type newtonls \
-ksp_type gmres \
-pc_type hypre \
-ts_monitor8. 调试配置
./program \
-ksp_type gmres \
-pc_type ilu \
-ksp_monitor_true_residual \
-ksp_view \
-mat_view ::ascii_info \
-options_left \
-log_view9. GPU 加速配置
./program \
-mat_type aijcusparse \
-vec_type cuda \
-ksp_type gmres \
-pc_type jacobi \
-ksp_monitor \
-log_view_gpu_time10. 性能分析配置
./program \
-ksp_type gmres \
-pc_type hypre \
-log_view :perf.txt \
-log_view_memory \
-log_all选项文件示例
基本配置文件
# petsc_basic.opts
-ksp_type gmres
-ksp_gmres_restart 30
-pc_type hypre
-pc_hypre_type boomeramg
-ksp_rtol 1e-8
-ksp_monitor高级配置文件
# petsc_advanced.opts
# KSP 设置
-ksp_type fgmres
-ksp_gmres_restart 50
-ksp_rtol 1e-8
-ksp_atol 1e-12
-ksp_max_it 1000
-ksp_monitor
# PC 设置
-pc_type hypre
-pc_hypre_type boomeramg
-pc_hypre_boomeramg_strong_threshold 0.5
-pc_hypre_boomeramg_coarsen_type HMIS
-pc_hypre_boomeramg_interp_type ext+i
-pc_hypre_boomeramg_max_levels 25
-pc_hypre_boomeramg_truncfactor 0.3
# 矩阵设置
-mat_partitioning_type parmetis
# 性能分析
-log_view多求解器配置
# petsc_multi.opts
# 外层求解器
-ksp_type fgmres
-ksp_rtol 1e-6
-ksp_monitor
# 预条件子(块 Jacobi)
-pc_type bjacobi
-pc_bjacobi_blocks 4
# 子块求解器
-sub_ksp_type gmres
-sub_ksp_rtol 1e-2
-sub_pc_type ilu
-sub_pc_factor_levels 2环境变量
# 设置默认选项
export PETSC_OPTIONS="-ksp_type gmres -pc_type hypre -ksp_monitor"
# 设置选项文件路径
export PETSC_OPTIONS_FILE="$HOME/petsc.opts"
# 禁用信号处理
export PETSC_OPTIONS="-no_signal_handler"最佳实践
1. 选择合适的求解器
- 对称正定:CG + ICC/Cholesky
- 非对称:GMRES/BiCGStab + ILU
- 大规模:FGMRES + HYPRE AMG
- 病态问题:直接求解器(MUMPS/SuperLU)
2. 预条件子调优
- 从简单预条件子开始(Jacobi)
- 逐步尝试更复杂的预条件子(ILU、HYPRE)
- 调整预条件子参数(填充级数、阈值)
3. 监控和分析
- 始终使用
-ksp_monitor观察收敛 - 使用
-log_view分析性能 - 使用
-ksp_view检查配置
4. 并行性能
- 使用 ParMETIS 进行负载平衡
- 选择可扩展的预条件子(HYPRE、ASM)
- 避免串行瓶颈(如 ILU)
5. 调试技巧
- 使用
-options_left检查拼写错误 - 使用
-ksp_monitor_true_residual检查真实残差 - 使用
-snes_test_jacobian验证 Jacobian
总结
PETSc 的命令行选项系统提供了极大的灵活性,允许你:
- 快速测试:无需重新编译即可尝试不同配置
- 性能调优:精细控制求解器和预条件子参数
- 调试分析:详细的监控和日志功能
- 可重现性:通过选项文件保存和分享配置
掌握这些命令行选项,可以显著提高使用 PETSc 的效率和求解性能。建议从简单配置开始,逐步探索更高级的选项。
参考资源
Happy Solving! 🚀
版权所有
版权归属:Guisong Wu