PHengLEI CFD软件ARM下编译过程
本次实践环境由鹏城实验室提供,感谢鹏城实验室及鹏城生态开发者云对国产ARM环境的大力扶持和培养!
编译过程
0. PHengLEI(风雷)简介
NNW-PHengLEI软件是中国空气动力研究与发展中心(CARDC)计算空气动力研究所(CAI)开发的,以“网格融合”为特色的国内第一款开源流体工程软件。
NNW-PHengLEI软件以面向对象的设计理念,采用C++语言编程,为了适应结构网格、非结构网格、混合网格、重叠网格等不同网格的计算,设计了具有良好通用性、可扩展性的体系结构和数据结构,实现了在同一个软件平台上,同时兼容结构求解器和非结构求解器。两种求解器可独立运行,也能耦合计算,即在流场中同时含有结构网格和非结构网格的情况下,在结构网格上调用结构求解器,在非结构网格上调用非结构求解器。
其特点有:结构/非结构网格融合 1.唯一同时兼容结构/非结构的开源平台 2.具备结构、非结构解算器,满足用户需求 3.支持结构解算器、非结构解算器混合求解
1. 实验环境构建
申请成为鹏城生态开发者(https://dw.pcl.ac.cn/cloud/landing)
申请成为鹏城生态开发者按照官网主要流程为三步:
- 注册开发者云账号
- 登录开放者云,按照提要填写项目信息,申请需要的计算资源
- 管理员审核申请,如果信息正确可用,管理员将通过申请并分配相关资源
本次我申请的实验环境为:
- 鲲鹏920, 2核
- 4 GB内存
- 80 GB存储空间
- CentOS 7.5 aarch64系统
安装的PHengLEI版本为2112最新版,流程参考最新版安装手册
2. 初始依赖安装
2.1 基础环境
yum install -y epel-release && yum makecache
yum install -y zlib-devel gcc gcc-g++ gcc-gfortran hwloc-devel libXt-devel
从CMake官网下载aarch64版本的二进制文件并解压到/usr/local
wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-aarch64.tar.gz
tar xf cmake-*.tar.gz -C /usr/local
2.2 MPI
风雷的CFD大规模并行是基于MPI的。MPI(消息传递接口,Message Passing Interface)是并行计算的基础设施环境之一。通信的基础建立在不同进程间发送和接收操作。一个进程可以通过指定另一个进程的秩以及一个独一无二的消息标签(tag)来发送消息给另一个进程。接受者可以发送一个接收特定标签标记的消息的请求(或者也可以完全不管标签,接收任何消息),然后依次处理接收到的数据。类似这样的涉及一个发送者以及一个接受者的通信被称作点对点(point-to-point)通信。
MPICH
由于centos自带的mpich rpm包中并未有libmpi.a静态库,风雷默认编译模式为静态库编译模式,需要.a
文件。
默认为ch3(基于tcp)的通信协议。如果用户有IB网络,为了最大化利用IB网络的优势,亦需要添加CH4:ofi的协议。其他通讯协议,例如ucx等,亦需要重新编译。
在此,以MPICH-3.4.3手动编译为例
wget https://www.mpich.org/static/downloads/3.4.3/mpich-3.4.3.tar.gz && tar xf mpich-3.4.3.tar.gz && cd mpich-3.4.3
./configure --prefix=/your/dir/ --enable-shared \
--enable-static --enable-fast=all,O3 \
--with-device=ch3:nemesis ## ch3 device
#--with-device=ch4:ofi ## ch4 ofi device
make -j$(nproc) install
编译安装完成后,建议利用environment module来管理不同的MPI环境 下面是一个MPICH modulefile示例:
#%Module1.0
conflict mpi
set OPENMPIROOT "~/MPICH" ## Your MPI HOME DIR
setenv MPI_ROOT "$OPENMPIROOT"
prepend-path PATH "$OPENMPIROOT/bin"
prepend-path LD_LIBRARY_PATH "$OPENMPIROOT/lib"
prepend-path LIBRARY_PATH "$OPENMPIROOT/lib"
prepend-path MANPATH "$OPENMPIROOT/share/man"
之后就可以通过module load XXXMPI
进行module环境载入。
OpenMPI
同样地,openmpi是MPI的另一种实现。需要注意的是,在编译过程中需要添加MPI-1版本的兼容性。在此另外以intel compiler作为基础编译器环境为例子。
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.2.tar.gz && tar xf openmpi-4.1.2.tar.gz && cd openmpi-4.1.2
./configure CC=icc CXX=icpc FC=ifort \
--prefix=/your/dir/ \
--enable-mpi1-compatibility \ #MPI-1兼容性
--enable-static --enable-shared
make -j$(nproc) install
下面是一个OpenMPI的 modulefile示例:
#%Module1.0
conflict mpi
set OPENMPIROOT "~/MPICH" ## Your MPI HOME DIR
setenv MPI_ROOT "$OPENMPIROOT"
setenv OMPI_MCA_pml cm
setenv OMPI_MCA_mtl psm2
use 'normal' compact core binding as a default
setenv OMPI_MCA_rmaps_base_mapping_policy core
setenv OMPI_MCA_hwloc_base_binding_policy core
prepend-path PATH "$OPENMPIROOT/bin"
prepend-path LD_LIBRARY_PATH "$OPENMPIROOT/lib"
prepend-path LIBRARY_PATH "$OPENMPIROOT/lib"
prepend-path MANPATH "$OPENMPIROOT/share/man"
3. PHengLei 3rd Party包静态库编译
风雷的基础第三方依赖环境有(未包含谱方法,该方法目前官方安装手册还未完善):
- HDF5
- CGNS
- metis & parmetis
- tecio
3.0 第三方静态库的基本文件夹
workdir=$PWD ##phenglei/PHengLEI/3rdparty
libdir=$workdir/Linux-$(arch) #第三方静态库的基本文件夹 Linux-aarch64
对于本次此时环境,$(arch)
为aarch64
,即第三方静态库的基本文件夹为Linux-aarch64
。
3.1 HDF5
hdf5=hdf5-1.8.8-p1
tar xf $hdf5.tar.gz && cd $hdf5
mkdir build && cd build && CC=mpicc;CXX=mpicxx;cmake .. -DCMAKE_INSTALL_PREFIX=../lib -DHDF5_ENABLE_PARALLEL=ON -DHDF5_ENABLE_LARGE_FILE=ON
make -j$(nproc) install && cp $workdir/$hdf5/lib/lib/libhdf5.a $libdir
3.2 CGNS
cgns=CGNS-3.3.0
cd $workdir testDir $cgns && tar xf $( echo $cgns | tr '[:upper:]' '[:lower:]') ; cd $cgns && mkdir build lib;
cd build
cmake .. -DCGNS_ENABLE_HDF5=ON -DCGNS_ENABLE_LEGACY=ON -DHDF5_DIR=$workdir/$hdf5/build -DCMAKE_INSTALL_PREFIX=../lib
cmake .. -DHDF5_NEED_MPI=ON -DCGNS_BUILD_SHARED=OFF
make -j$(nproc) install && cp $workdir/$cgns/lib/lib/*.a $libdir
3.3 metis & parmetis
#metis
metis=metis-5.0.1
cd $workdir
testDir $workdir/$metis && tar xf $metis.tar.gz && cd $metis
make config prefix=$workdir/$metis && make -j$(nproc) install && cp lib/*.a $libdir
#parmetis
metis=parmetis-4.0.3
cd $workdir
testDir $workdir/$metis && tar xf $metis.tar.gz && cd $metis
make config prefix=$workdir/$metis && make -j$(nproc) install && cp lib/*.a $libdir
3.4 tecio
风雷官方的tecio版本较老,其安装编译的可移植性较弱。在此,我使用来自于SU2开源代码的高版本tecio代码进行编译.
cd $workdir
tecio=tecio-2018
testDir $workdir/$tecio && tar xf $tecio.tar.gz && cd $tecio/teciosrc
cmake -DBoost_INCLUDE_DIR=$workdir/$tecio . && make -j$(nproc) && \
cp *.a $libdir
至此,风雷的基础第三方依赖环境处理完成。
4. PHengLei 本体静态库编译
如若上述3rd party包安装编译过程顺利无报错,PHengLei本体编译安装过程会非常简单。
但需要注意的是,centos 默认的gcc版本为4.8.5,不支持c++14版本,只支持不完整的c++11。因此需要修改CMakeLists.txt
文件。
add_compile_options(-std=c++11) #修改为c++11
cd phenglei/PHengLEI && mkdir build && cd build #创建build目录
cmake .. -DBUILD_MESH=on \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SpecDiffHybSolver=off \
-DUSE_Windows_X64=off
#-DUSE_OMP=on ##用于非结构网格
安装完成后,build目录下的PHengLEIv3d0/目录有 PHengLEIv3d0
文件即为风雷CFD软件本体。
5. 测试案例-二维低速平板转捩算例
测试案例的验证对象是SK(Schubauer & Klebanof,1956)平板试验数据。 网格如下:
| 马赫数 | 单位长度雷诺数 | 攻角 | 侧滑角 | 来流温度|壁面 | | —— | ————– | —- | —— | :——: | | 0. 1467 | 3.34e6 | 0 | 0 | 290.5 |绝热壁面 |
5.1 风雷网格格式(.fts)转换
涉及文件:key.hypara + grid_para.hypara
修改key.hypara
nsimutask= 1 # 任务号为1,进行网格转换
string parafilename ="./bin/grid_para.hypara"
5.2 并行计算预处理,网格分区
涉及文件:key.hypara + partition.hypara
nsimutask= 3 # 任务号为3,进行网格分区
string parafilename ="./bin/partition_para.hypara"
5.3 并行计算
涉及文件:key.hypara + cfd_para_ subsonic.hypara
nsimutask= 0 # 任务号为0,进行并行计算
string parafilename ="./bin/cfd_para_ subsonic.hypara"
mpirun -np 2 PHengLEIv3d0 #启动2核MPI进程进行计算
5.4 计算结果
2核计算的总时间为8678.428 s(墙钟时间)。
下图是表面摩擦系数cf的曲线图 下面是基于动量边界层厚度的雷诺数云图。