外观
PETSc 科学计算库安装与配置指南
PETSc(Portable, Extensible Toolkit for Scientific Computation)是一个用于科学计算的强大并行数值库,广泛应用于偏微分方程求解、线性代数计算和优化问题。本文将详细介绍如何在 Linux 系统上编译安装 PETSc 及其依赖库。
PETSc 简介
PETSc 提供了丰富的数值算法和数据结构:
- 线性求解器:KSP(Krylov Subspace Methods)
- 非线性求解器:SNES(Scalable Nonlinear Equations Solvers)
- 时间积分器:TS(Time Stepping)
- 优化工具:TAO(Toolkit for Advanced Optimization)
- 并行支持:基于 MPI 的并行计算
- 多种外部库集成:HYPRE、MUMPS、SuperLU 等
系统环境
我的安装环境:
- 操作系统:Ubuntu 24.04 LTS
- 内核版本:Linux 6.14.0-37-generic
- Python 版本:3.12.3
- 编译器:GCC 13.3.0
- 安装位置:
/opt/petsc
安装前准备
1. 安装基础依赖
sudo apt update
sudo apt install -y build-essential gfortran cmake
sudo apt install -y libopenmpi-dev openmpi-bin
sudo apt install -y python3 python3-dev
sudo apt install -y git wget2. 安装 OpenBLAS
PETSc 需要 BLAS/LAPACK 库,我选择使用 OpenBLAS:
# 下载 OpenBLAS
cd ~/software
wget https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.27/OpenBLAS-0.3.27.tar.gz
tar -xzf OpenBLAS-0.3.27.tar.gz
cd OpenBLAS-0.3.27
# 编译安装
make -j$(nproc)
sudo make PREFIX=/opt/OpenBLAS install
# 添加到库路径
echo '/opt/OpenBLAS/lib' | sudo tee /etc/ld.so.conf.d/openblas.conf
sudo ldconfig3. 下载 PETSc
cd ~/software
git clone -b release https://gitlab.com/petsc/petsc.git petsc
cd petsc或者下载特定版本:
wget https://web.cels.anl.gov/projects/petsc/download/release-snapshots/petsc-3.21.0.tar.gz
tar -xzf petsc-3.21.0.tar.gz
cd petsc-3.21.0配置 PETSc
我的配置选项
./configure \
--prefix=/opt/petsc \
--with-blaslapack-dir=/opt/OpenBLAS \
--download-superlu_dist \
--download-mumps \
--download-hypre \
--download-metis \
--download-parmetis \
--download-scalapack \
--download-hdf5 \
--with-gmsh=1配置选项详解
基本选项
--prefix=/opt/petsc:安装到/opt/petsc目录--with-blaslapack-dir=/opt/OpenBLAS:使用 OpenBLAS 作为 BLAS/LAPACK 库
直接求解器
SuperLU_DIST:
--download-superlu_dist:并行稀疏直接求解器- 适用于大规模稀疏线性系统
- 支持 LU 分解
MUMPS:
--download-mumps:多前沿并行直接求解器- 支持对称和非对称矩阵
- 内存效率高
预条件子和迭代求解器
HYPRE:
--download-hypre:高性能预条件子库- 包含代数多重网格(AMG)方法
- 特别适合结构化和非结构化网格问题
网格分区
METIS/ParMETIS:
--download-metis:串行图分区库--download-parmetis:并行图分区库- 用于网格分区和负载平衡
并行线性代数
ScaLAPACK:
--download-scalapack:并行稠密线性代数库- 基于 PBLAS 和 BLACS
- 用于稠密矩阵运算
数据 I/O
HDF5:
--download-hdf5:层次化数据格式库- 支持大规模数据存储和并行 I/O
- 用于保存和读取 PETSc 对象
网格支持
Gmsh:
--with-gmsh=1:启用 Gmsh 网格格式支持- 可以直接读取
.msh文件
其他常用配置选项
调试版本
./configure \
--prefix=/opt/petsc-debug \
--with-debugging=1 \
--with-blaslapack-dir=/opt/OpenBLAS \
--download-hypre \
--download-metis \
--download-parmetis优化版本
./configure \
--prefix=/opt/petsc-opt \
--with-debugging=0 \
COPTFLAGS='-O3 -march=native' \
CXXOPTFLAGS='-O3 -march=native' \
FOPTFLAGS='-O3 -march=native' \
--with-blaslapack-dir=/opt/OpenBLAS \
--download-hypre \
--download-metis \
--download-parmetis使用系统 MPI
./configure \
--prefix=/opt/petsc \
--with-mpi-dir=/usr \
--with-blaslapack-dir=/opt/OpenBLAS \
--download-hypre启用 CUDA 支持
./configure \
--prefix=/opt/petsc-cuda \
--with-cuda=1 \
--with-cudac=nvcc \
--with-blaslapack-dir=/opt/OpenBLAS \
--download-hypre编译和安装
1. 运行配置
cd ~/software/petsc
./configure [配置选项]配置过程会:
- 检测系统环境
- 下载指定的外部库
- 生成 Makefile
配置成功后会显示:
Configure stage complete. Now build PETSc libraries with:
make PETSC_DIR=/home/wugs/software/petsc PETSC_ARCH=arch-linux-c-debug all2. 编译
make PETSC_DIR=/home/wugs/software/petsc PETSC_ARCH=arch-linux-c-debug all编译时间取决于:
- CPU 核心数
- 下载的外部库数量
- 网络速度(下载外部库)
通常需要 20-60 分钟。
3. 测试
make PETSC_DIR=/home/wugs/software/petsc PETSC_ARCH=arch-linux-c-debug check运行测试套件,确保编译正确。
4. 安装
sudo make PETSC_DIR=/home/wugs/software/petsc PETSC_ARCH=arch-linux-c-debug install将 PETSc 安装到 --prefix 指定的目录。
5. 测试安装
make PETSC_DIR=/opt/petsc test环境配置
设置环境变量
在 ~/.bashrc 中添加:
export PETSC_DIR=/opt/petsc
export PETSC_ARCH=""
export PATH=$PETSC_DIR/bin:$PATH
export LD_LIBRARY_PATH=$PETSC_DIR/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=$PETSC_DIR/lib/pkgconfig:$PKG_CONFIG_PATH重新加载配置:
source ~/.bashrc验证安装
# 查看 PETSc 版本
ls $PETSC_DIR/lib/petsc/conf/petscvariables
# 查看配置信息
cat $PETSC_DIR/lib/petsc/conf/petscvariables | grep "PETSC_VERSION"使用 PETSc
编译 PETSc 程序
使用 Makefile
include ${PETSC_DIR}/lib/petsc/conf/variables
include ${PETSC_DIR}/lib/petsc/conf/rules
CFLAGS =
FFLAGS =
CPPFLAGS =
FPPFLAGS =
ex1: ex1.o
-${CLINKER} -o ex1 ex1.o ${PETSC_LIB}
clean::
${RM} ex1 ex1.o编译:
make ex1使用 pkg-config
gcc -o ex1 ex1.c $(pkg-config --cflags --libs PETSc)手动指定
gcc -o ex1 ex1.c \
-I$PETSC_DIR/include \
-L$PETSC_DIR/lib \
-lpetsc \
-lm运行 PETSc 程序
串行运行
./ex1并行运行
mpirun -np 4 ./ex1使用命令行选项
# 查看可用选项
./ex1 -help
# 设置求解器
mpirun -np 4 ./ex1 -ksp_type gmres -pc_type hypre
# 查看求解过程
mpirun -np 4 ./ex1 -ksp_monitor -ksp_view
# 输出到文件
mpirun -np 4 ./ex1 -log_view :log.txt示例程序
求解 Poisson 方程
#include <petsc.h>
int main(int argc, char **argv) {
Mat A;
Vec x, b;
KSP ksp;
PC pc;
PetscInt n = 100, i;
PetscScalar v;
PetscReal norm;
PetscInitialize(&argc, &argv, NULL, NULL);
// 创建矩阵和向量
MatCreate(PETSC_COMM_WORLD, &A);
MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, n, n);
MatSetFromOptions(A);
MatSetUp(A);
VecCreate(PETSC_COMM_WORLD, &b);
VecSetSizes(b, PETSC_DECIDE, n);
VecSetFromOptions(b);
VecDuplicate(b, &x);
// 组装矩阵(三对角矩阵)
for (i = 0; i < n; i++) {
v = 2.0;
MatSetValues(A, 1, &i, 1, &i, &v, INSERT_VALUES);
if (i > 0) {
v = -1.0;
MatSetValues(A, 1, &i, 1, &(PetscInt){i-1}, &v, INSERT_VALUES);
}
if (i < n-1) {
v = -1.0;
MatSetValues(A, 1, &i, 1, &(PetscInt){i+1}, &v, INSERT_VALUES);
}
}
MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);
MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);
// 设置右端项
VecSet(b, 1.0);
// 创建求解器
KSPCreate(PETSC_COMM_WORLD, &ksp);
KSPSetOperators(ksp, A, A);
KSPSetFromOptions(ksp);
// 求解
KSPSolve(ksp, b, x);
// 检查收敛性
KSPGetResidualNorm(ksp, &norm);
PetscPrintf(PETSC_COMM_WORLD, "Residual norm: %e\n", (double)norm);
// 清理
VecDestroy(&x);
VecDestroy(&b);
MatDestroy(&A);
KSPDestroy(&ksp);
PetscFinalize();
return 0;
}编译运行:
make poisson
mpirun -np 4 ./poisson -ksp_type cg -pc_type hypre -ksp_monitor常见问题
1. 配置失败
问题:找不到 MPI
# 安装 MPI
sudo apt install libopenmpi-dev openmpi-bin
# 或指定 MPI 路径
./configure --with-mpi-dir=/usr问题:找不到 Python
# 安装 Python
sudo apt install python3 python3-dev
# 或指定 Python 路径
./configure --with-python=/usr/bin/python32. 编译错误
问题:内存不足
# 减少并行编译数
make -j2 all问题:外部库下载失败
# 手动下载并指定路径
./configure --with-hypre-dir=/path/to/hypre3. 运行时错误
问题:找不到共享库
# 添加库路径
export LD_LIBRARY_PATH=$PETSC_DIR/lib:$LD_LIBRARY_PATH
# 或使用 rpath
gcc -Wl,-rpath,$PETSC_DIR/lib ...性能优化建议
1. 选择合适的求解器
# 对称正定矩阵
-ksp_type cg -pc_type hypre
# 非对称矩阵
-ksp_type gmres -pc_type ilu
# 大规模问题
-ksp_type fgmres -pc_type hypre -pc_hypre_type boomeramg2. 调整预条件子
# HYPRE AMG 参数
-pc_hypre_boomeramg_strong_threshold 0.5
-pc_hypre_boomeramg_coarsen_type HMIS
-pc_hypre_boomeramg_interp_type ext+i
# ILU 参数
-pc_factor_levels 3
-pc_factor_fill 2.03. 并行性能
# 查看负载平衡
-log_view
# 使用更好的分区
-mat_partitioning_type parmetis卸载 PETSc
# 删除安装目录
sudo rm -rf /opt/petsc
# 删除环境变量(从 .bashrc 中移除相关行)
vim ~/.bashrc
source ~/.bashrc
# 删除源码目录
rm -rf ~/software/petsc总结
PETSc 是一个功能强大的科学计算库,通过合理的配置可以获得:
- 丰富的求解器:KSP、SNES、TS、TAO
- 高性能预条件子:HYPRE、MUMPS、SuperLU
- 并行计算支持:基于 MPI 的可扩展性
- 灵活的配置:支持多种外部库和硬件加速
我的配置包含了常用的直接求解器(MUMPS、SuperLU)、预条件子(HYPRE)、网格分区工具(METIS/ParMETIS)和数据 I/O(HDF5),适合大多数科学计算应用。
建议根据具体需求选择合适的外部库,避免安装不必要的组件以节省编译时间和磁盘空间。
参考资源
Happy Computing! 🚀
版权所有
版权归属:Guisong Wu