流体力学OpenFOAM部署文档

高性能计算实战——OpenFOAM

概述

OpenFOAM is free, open source software for CFD from the OpenFOAM Foundation.

OpenFOAM是一款免费、开源的软件,具有广泛的功能,可用于计算流体力学,解决湍流、热传递等复杂问题。需要详细了解可查看官方网站

安装步骤

首先在官网查看安装信息,找到对应不同操作系统的安装包

image-20220916180254255

集群操作系统为CenOS,对应Other Linux部分。官网有Docker和源码两种安装方式,本文将介绍从源码编译的安装。

检查编译环境

image-20220916180316028

逐个检查编译所需,以gcc为例,输入

gcc --version

查看gcc版本信息,检查无误后进入下一步依赖包的安装

安装依赖包

从官网查看所需依赖包如下

  • Scotch and PT-Scotch
  • CGAL Computational Geometry Algorithms Library
    • not essential

安装Scotch/PT-Scoth

首先安装Scotch/PT-Scotch,需要注意选择version 6以上的版本,便于libscoth libptscoth两个库链接。在教程中链接提供的包中有ThirdParty文件夹

image-20220916180909283

进入文件夹后执行

./Allwmake

配置环境变量

在安装环境下的openfoam-dev/etc文件夹中有对应的环境变量值,并有详细的注释,可以参照文件在.bashrc文件中进行环境变量的添加。

image-20220916180927007

编译OpenFOAM

安装好依赖包之后,进入OpenFOAM目录下,执行脚本

./Allwmake

实验步骤

创建工作目录,并将想要实验的样例拷贝至目录下

生成网格

首先可在目录下定义对网格的描述,位于constant/polyMesh目录下的blockMeshDict

image-20220916180946647

有关于顶点信息、块信息以及边界信息等的描述和定义。

运行命令生成网格

blockMesh

部分输出如下

image-20220916180954515

边界和初始条件

在初始场文件中有多个参数,例如压力p和速度U,这里直接仿照案例设置初始值

物理属性和配置

物理属性文件存储在后缀为Properties的文件中,例如transportProperties指定了运动粘度。

system文件下可以查看计算的配置文件

image-20220916181034275

在文件中指定开始时间、结束时间、模拟的时间步长,writeControl指定每个一段时间的输出结果

运行应用

将上述文件配置好后,使用对应的求解器,以simpleFoam为例

simpleFoam

在执行开始时首先会读取配置文件信息

image-20220916181051588

最终在818次迭代计算后结果收敛

image-20220916181056854

并行计算

OpenFOAM使用的并行计算方法是域分解,将待求场划分为若干域,并分发到多个处理器上求解,依赖openMPI库。

准备数据

可在文件中定义对网格的描述,位于constant/polyMesh目录下的blockMeshDict

blockMesh生成网格

image-20220916181111485

setFields

假设初始场中有两种不同的初始参数,例如水中\(\alpha_{water} = 1\),空气中\(\alpha_{water} = 0\),在system文件夹中的setFieldDict文件中可以进行如下配置

defaultFieldValues 
( 
    volScalarFieldValue alpha.water 0 
); 
 
regions 
( 
    boxToCell 
    { 
        box (0 0 -1) (0.1461 0.292 1); 
        fieldValues 
        ( 
            volScalarFieldValue alpha.water 1 
        ); 
    } 
); 

defaultFieldValues指定了默认的参数值,需要指定的区域用regions标注,内部用正方体的两个顶点标出区域范围,fieldValues指定参数的值

image-20220916181120267

执行时,先将所有场参数设为默认值,然后根据regions去覆盖原来的默认值。

域划分

关于该操作的细节,可以在system文件夹下的decomposeParDict中进行详细配置

这里配置划分为4个域,划分策略可以通过method参数来指定,总共有4种策略

  • simple,按照方向划分,例如x方向划分2块,y方向划分1块
  • hierarchical,在simple的基础上,指定划分间距、划分方向次序(例如xyz),按照次序轮流划分
  • scotch,可以指定不同域之间有不同的权重,可以用来在性能有差异的机器运行
  • manual,自定义划分策略

配置完后,即可执行decomposePar命令,该命令执行成功后会生成processor0~3,共4个文件夹,用于并行计算。

运行应用

system/controlDict中定义执行的应用类型为interFoam

编写slurm脚本,配置使用的核数为4,并执行脚本。

查看结果

文件开头有相关配置情况,例如这里nProcs为4,使用4个核

image-20220916181214231

结尾处有对应执行时间

image-20220916181221352

结果分析

采用不同的cpu数量进行实验,得到结果并制图如下。(均采用simple这一划分配置)

image-20220916181229897

  • 在cpu核数较小时的并行效果较好,有了一定的性能提升。
  • cpu核数较大时,可能由于每一块域中计算量较小,此时不同域之间的数据处理成为主要耗时,执行时间显著上升。

补充:新的数据导入计算(命令行方式)

项目基本结构:(图来自于官方手册

image-20220916181236480

  • constant:包括对网格mesh,和各个物理属性的描述(Properties结尾)
  • system:对系统的配置
  • time directories:某一时刻中各个物理量的值

对于一个给定好的数据集,constanttime directories已经给定,需要根据需要在system中进行配置

controlDict配置

主要控制的是数据的IO。这里介绍主要参数的含义,更细致的配置可以在官网查看

时间控制

  • startFrom:计算的开始时间
  • stopAt:计算的结束时间
  • deltaT:计算的时间间隔

图中所示即为从0时刻开始到1时刻,间隔0.001进行计算

写入控制

image-20220920131753696

  • writeControl、writeInterval:写入间隔
  • purgewrite:覆盖写的文件夹数量,例如指定为2,则第3个时刻的数据将会覆盖1时刻。0为不覆盖,每次新写文件
  • writeFormat:两种格式ascii和binary二进制格式
  • writeCompression:写完后是否打包为gzip
  • timeFormat、timePrecision:写入的时间格式、精度

fvScheme配置

配置数值计算的计划

image-20220920131816089

例如

  • gradSchemes:梯度
  • divSchemes:导数
  • laplacianSchemes:拉普拉斯运算

除此之外,如果需要有其他计算(例如散度divergence),同样可以在该文件中配置。

fvSolution配置

指定求解器、误差等

  • solver:指定求解器,不同的求解器可能需要进一步的配置
  • tolerance:误差
  • relTol:相对误差

除此之外,还可以指定最大迭代次数。当误差、相对误差超过指定数值,或者迭代次数超过限制,结束计算。

配置完需要的system文件,就可以进一步计算自定义的数据

案例分析

可以在安装目录的tutorials下找数据测试,具体地以$FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreak为例,先将数据拷贝至工作目录。

cp -r $FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreak/damBreak .

输出信息配置

根据需求修改controlDict的输出信息参数为

startFrom       startTime;
startTime       0;
stopAt          endTime;
endTime         1;
deltaT          0.001;

求解器使用默认求解器

域划分配置

decomposeParDict文件规定并行域的总数、划分方案

例如使用4核计算时

  • numberOfSubdomains,将并行域数量规定为4,该参数由具体划分方案确定
  • method,域划分策略为simple,即按照坐标轴划分
  • 详细配置为(2, 2, 1),x、y方向上各有2个域,z轴上一个,所以整体为4

完成配置后,即可按照计算的步骤进行导入数据的计算。

posted @ 2023-03-19 13:06  Jareth  阅读(202)  评论(0编辑  收藏  举报