通量重构(FR)格式是一种高精度紧致型流体数值格式。PyFR 是一个开源 CFD 包,采用非常精确的FR格式来处理世界上最具挑战性的一些流体流动问题。尤其是涉及不平稳湍流的问题。相关的博客可见Nvidia博客。PyFR的官网上提供了下载和手册。本文是基于以上内容的一篇入门指南,操作平台为Ubuntu 19.10。
安装
- 安装基本的依赖,命令为
sudo pip3 install xxx
其中xxx
包括:
appdirs >= 1.4.0
gimmik >= 2.0
h5py >= 2.6
mako >= 1.0.0
mpi4py >= 2.0
numpy >= 1.8
pytools >= 2016.2.1
- 检查gcc版本:
gcc --version
,应当不小于4.9。 - 安装其余的依赖:
sudo apt install python3 python3-pip libopenmpi-dev openmpi-bin
sudo apt install metis libmetis-dev libblas3
pip3 install virtualenv
- 安装paraview:
sudo apt install paraview
- 设置虚拟环境:
python3 -m virtualenv ENV3
source ENV3/bin/activate
并在虚拟环境中安装PyFR:pip install pyfr
运行命令
PyFR 使用三种文件格式:
.ini
——参数文件.pyfrm
——网格文件.pyfrs
——解文件
PyFR 提供若干命令:
pyfr import
——导入.msh或.pyfrm格式文件,内含网格信息。例如:pyfr import mesh.msh mesh.pyfrm
pyfr partition
——切分已有网格及其相关的解文件。例如:pyfr partition 2 mesh.pyfrm solution.pyfrs .
pyfr run
——运行一个仿真。例如:pyfr run mesh.pyfrm configuration.ini
pyfr restart
——根据已有的解文件重启一个仿真。例如:pyfr restart mesh.pyfrm solution.pyfrs
pyfr export
——将.pyfrs
文件转换为非结构VTK.vtu
或pvtu
文件。
要以并行方式运行PyFR,在pyfr
命令前使用前缀mpiexec -n <cores/devices>
。注意,网格应当提前切分好,cores或devices的数量必须等于分区数。然后在pyfr run
后面加上并行参数:-b cuda
——Cuda并行,-b openmp
——OpenMP并行,-b opencl
——OpenCL并行。如果之前的操作无误,此时应当可以直接用OpenMP。而Cuda和OpenCL则需要自行安装。
示例:二维欧拉涡
以OpenMP为例。从PyFR网站上下载源代码,把其中的examples
文件夹拷到一个合适的工作目录。在euler_vortex_2d
文件夹里打开终端。
- 首先,启动python虚拟环境:
source ~/ENV3/bin/activate
- 转换网格文件:
pyfr import euler_vortex_2d.msh euler_vortex_2d.pyfrm
- 切分网格为两个分区:
pyfr partition 2 euler_vortex_2d.pyfrm .
- 运行:
mpiexec -n 2 pyfr run -b openmp -p euler_vortex_2d.pyfrm euler_vortex_2d.ini
(注意:这里并行参数是-b openmp
,手册原文是-b cuda
。-n 2
对应于第3步的两个分区。) - 把最后一帧数据转换为
.vtu
格式文件。命令为:pyfr export euler_vortex_2d.pyfrm euler_vortex_2d-100.0.pyfrs euler_vortex_2d-100.0.vtu -d 4
这个命令里有两点要说明:一是要带上.pyfrm文件,二是最后使用参数-d 4
,其含义是把单元细分为4个线性子单元以提高显示精度。 - 用Paraview打开
.vtu
文件。速度场如下:
后记
特别要指出,从以上的算例来看,用OpenMP并行的线程数n
恰好等于电脑物理核心数时速度最快,否则会急剧减慢。例如在我的笔记本上,-n 2
运行时间仅为19秒,而-n 4
或单线程却耗费几小时。说实话没看懂为什么差别这么大。