目录
一、应用程序和工具
OpenFOAM不是一个单一的可执行程序,整个软件库包含多款应用程序和工具。用户可以根据自己的需求使用不同的应用程序,如果想了解OpenFOAM发行版中的所有求解器、应用程序和库,可以在安装目录下的$WM_PROJECT_DIR/doc中找到PDF格式的文档,也可以访问在线的用户指南,在第3章中会对应用程序和库进行介绍。网址链接:↓传送门↓
OpenFOAM v12 User Guide - Chapter 3 Applications and libraries (cfd.direct)https://doc.cfd.direct/openfoam/user-guide-v12/applications 用户可以使用下面的命令获取应用程序的帮助,还可以从源码中获取帮助:
application_name -help
#如simpleFOAM -help
如下图所示,通过-help选项获取simpleFOAM的使用帮助:
用户可以在$FOAM_SOLVERS目录(可以直接使用sol别名进入该目录)下找到所有的应用程序,在$FOAM_UTILITIES目录(可以直接使用util别名进入该目录)下找到所有的工具。
如下图所示,求解器按照所处理的物理问题进行细分:
通用工具也同样进行细分:
例如在不可压缩incompressible子目录下可以看到以下几种求解器:
在每个目录中,可以找到一个扩展名为*.C且和当前目录名相同的文件,这是main文件,可以在该文件中找到最上层的源代码和一段关于求解器或工具的简单描述。比如在incompressible/icoFOAM/icoFOAM.c中,可以看到:
"Transient solver for incompressible, laminar flow of Newtonian fluids.”
针对牛顿流体的不可压缩、层流瞬态求解器
以下是一些常用的求解器:
icoFOAM:非定常不可压缩层流求解器
simpleFOAM:定常不可压缩层流/湍流求解器
pimpleFOAM:非定常不可压缩层流/湍流求解器
rhoSimpleFoam:定常可压缩层流/湍流求解器
sonicFoam:非定常可压缩高速层流/湍流求解器
interFoam:非定常基于VOF法的分离流多相求解器
laplacianFoam:拉普拉斯方程求解器
potentialFoam:势流求解器
scalarTransportFoam:定常/非定常通用输运方程求解器
二、算例文件结构
通常情况下,算例的文件结构为:
motorBike:案例名称(请勿使用空格或奇怪的符号),需在本级目录中运行程序。
0:包括边界条件(BC)和初始条件(IC)。
constant:包括物理属性、湍流建模属性、高级物理性质等。
constant/polyMesh:包含多面体网格信息。
system:包括运行时控制参数和求解器参数。
注意:需要在案例第一层目录运行OpenFOAM应用程序。
三、运行第一个案例:方腔顶盖驱动流2D
3.1 模型
我们将使用Linux系统运行OpenFOAM对方腔顶盖驱动流进行仿真计算,模型如下:
插播:博主在另一篇文章中对2D方腔顶盖驱动流进行C++代码实现,并对不同Re情况下的流动进行测试。详见:
案例的相关物理性质及处理:
①控制方程为不可压缩的N-S方程;
②模拟2D区域,易扩展至3D区域;
③方便起见,处理不可压缩流动时使用相对压力;
为计算数值解,需要离散计算域、设置边界和初始条件、定义流动特性、设置数值方法和求解器、设置运行参数(时间步长、模拟时长、保存参数等)。
3.2 流程
案例的处理流程如下:
网格模型如下:
我们直接使用官方自带的cavity案例,案例路径如下:
可以将cavity整个目录复制一份到用户的工作目录下,尽可能不影响源文件。
复制完成后切换至cavity目录,运行大致流程为:
①网格划分:使用blockMesh。
②网格检查:使用checkMesh评估网格质量,查找拓扑错误。
③求解:使用icoFoam数值求解。
④后处理:使用paraFoam和其它工具完成计算结果的后处理。
icoFoam是一个简单的求解器,不具备建模功能,后处理功能有限,最好使用pisoFoam或pimpleFoam,它们包括icoFoam的功能,但功能更丰富。
执行命令:
# 执行网格划分
$> blockMesh
# 执行网格检查
$> checkMesh
# 执行求解
$> icoFoam
# 执行后处理功能
$> paraFoam
第一步执行结果:
第二步执行结果:
第三步执行结果:
第四步执行结果:
查看速度分布:
查看压强分布:
2维模型3维映射:
使用Glyph过滤器显示速度矢量:
显示空间某位置的物理量变化曲线:
我们可以将运行过程中的标准输出保存到log文件中,如果计算出现问题或者需要或者残差曲线,可以从log文件中获取相应的信息。可以通过下面命令来执行程序和保存执行过程中的输出信息:
# 清理案例中运行生成的文件,OpenFOAM自带
$> foamCleanTutorials
$> blockMesh | tee log.blockMesh
$> checkMesh | tee log.checkMesh
$> icoFoam | tee log.icoFoam
生成的log文件可以使用gedit、vim等工具来读取。
安装上述流程执行完毕后,文件夹中会生成相应的log文件:
可以使用foamLog工具对log.icoFoam文件中包含的信息进行后处理,提取的信息将存储在当前路径的logs文件夹中:
$> foamLog log.icoFoam
此时我们可以使用gnuplot程序来绘制残差:
初始残差(紫色)下降到与最终残差相同的值(即单调收敛),说明系统稳定迭代。
3.3 控制
①停止计算
可以在cavity/system/controlDict文件中通过对结束时间endTime进行设置:
如果需要在endTime停止计算时保存当前时间步的计算,需要在controlDict中修改为writeNow:
如果在命令行终端中直接运行求解程序,可以直接使用“Ctrl+C”的方式停止计算,但不会保存最后一个时间步的结果。
②清除结果文件
如果你想删除当前案例文件夹中的网格和计算结果,可以在终端中输入(如果是并行运行的,使用foamCleanTutorials命令也将删除processorN文件夹):
$> foamCleanTutorials
如果只想删除网格,可以在终端输入:
$> foamCleanPolyMesh
如果只想删除计算结果,可以在终端输入:
$> foamListTimes -rm
如果并行运行程序并且想要删除并行计算结果目录,可以在终端输入:
$> foamListTimes -rm -processor
四、案例设置
case目录最初包含以下子目录:0、constant和system,运行icoFoam后,还包含时间步目录0.1,0.2,0.3,0.4,0.5、后处理目录postProcessing以及log.icoFoam文件(如果选择重定向标准输出流)。其中时间步目录包含每个时间点的计算结果,0是初始条件和边界条件目录。icoFoam求解器将读取这些文件夹中的文件进行计算。

每个字典文件的1-7行为注释,根据使用的字典不同,class关键字将有所不同。
4.1 constant 文件夹
constan文件夹中包含polyMesh文件夹和transportProperties字典文件,如下图:
transportProperties字典文件用于设置运动粘度(nu),方括号内的值为单位
方括号内的物理量含义如下:
No. | Property | Unit | Symbol |
1 | Mass(质量) | Kilogram | kg |
2 | Length(长度) | meters | m |
3 | Time(时间) | second | s |
4 | Temperature(温度) | Kelvin | K |
5 | Quantity(摩尔质量) | moles | mol |
6 | Current(电流) | ampere | A |
7 | Luminuous intensity(光强) | candela | cd |
即:[1(kg), 2(m), 3(s), 4(K), 5(mol), 6(A), 7(cd)]
因此,运动粘度的单位是:[0 2 -1 0 0 0 0] 即[0 m^2 s^-1 0 0 0 0]。
相当于
这种情况下,我们计算的是不可压缩流动,只需要定义运动粘度:
于是我们可以通过改变运动粘度的值来改变雷诺数(Re):
当然也可以通过改变流动速度U或者参考长度L来改变Re。
根据所涉及的物理和使用的模型,我们需要再transportProperties文件中定义更多的变量,例如对于多相系统,需要定义每个相的密度ρ和运动粘度nu,还需要定义表面张力。
/constant/polyMesh文件夹一开始是空的,运行blockMesh程序之后会生成相应的网格文件:
①boundary文件
使用blockMesh或snappyHexMesh创建网格后,会自动生成该文件。
其中inGroups关键字用于在ParaView/paraFoam可视化过程中对面进行分组,如果在paraFoam软件中打开这个网格,会看到两个组:wall和empty。nFaces和startFaces关键字与网格数据结构中的起始面和终止面相关。
以下的基本类型边界条件是受约束或成对的,也就是说,边界字典和字段变量字典(例如U,p)中的类型需要相同。
constant/polyMesh/boundary | 0/U - 0/p (IC/BC) |
symmetry | symmetry |
symmetryPlane | symmetryPlane |
empty | empty |
wedge | wedge |
cyclic | cyclic |
processor | processor |
4.2 system文件夹
system文件夹包含许多字典文件,用于求解参数设置。
①blockMeshDict文件
convertToMeters是一个缩放因子;vertices定义了几何体的顶点坐标,OpenFOAM始终使用3D网格,即使模型是2D的,也会有八个点。顶点的编号是从0开始的,和C++语法保持一致。
blockMeshDict文件还定义了边界条件,其中包括面的类型和组成该面的节点序号及拓扑关系。比如名称movingWall的类型是“wall”,由节点3/7/6/2连接而成。
该文件构成如下图所示的模型:
②controlDict文件
包含运行控制参数,如开始时间、结束时间、时间步长、保存频率等。
算例从0开始计算,到达stopAt关键字指定的参数时停止,本例将运行0.5s,时间步长为0.005s,保存时间步长为0.005*20=0.1s,pureWrite=0意味着将保存每一步的结果,如果只想保存最后5步的结果,可以设置为5。保存精度为6位,文件类型为ascii。关键字runTimeModifiable=true说明可以在运行模拟时修改所有这些参数。
如何知道每个关键字有哪些可以设置的值,比较麻烦的方法是直接去源代码中查找,另一种方法是“banana”法,即将关键字的值设置为banana,比如设置stopAt的值为banana,运行时会得到下面输出:
③fvSchemes文件
包含控制方程中出现的不同项的离散方法的相关信息。
案例采用欧拉法进行时间离散(ddtSchemes),梯度离散方法(gradSchemes)采用高斯线性法,对流项离散方法(divSchemes)采用div(phi,U)项的线性插值,拉普拉斯离散(laplacianSchemes和snGradSchemes)使用正交校正高斯线性方法。
④fvSolution文件
包含如何求解每个线性离散方程组。
案例中,为求解压力,使用PCG方法,使用预处理器DIC,残差阈值为1e-6,相对误差为0.05,压力最终校正的相对误差为0;为求解速度,使用smoothSolver方法,使用更平滑的symGaussSeidel方法,残差阈值为1e-5,相对误差为0。速度求解相对容易,压力求解耗时较长。PISO字典中包含与压力-速度耦合方法(piso)相关的内容,案例中进行2次PISO校正,没有正交校正。
4.3 0文件夹
0目录包含所有原始变量的初始和边界条件,在本例中是p和U。
①U文件
U文件包含内容:单位是m/s,三个方向速度初始化为(0 0 0),movingWall的边界条件是(1 0 0),fixedWalls为无滑移壁面,
②p文件
p文件内容包含:单位是m^2/s^2,相对压力初值为0,movingWall和fixedWalls的类型为零梯度。
OpenFOAM中的所有不可压缩求解器(icoFoam、simpleFoam、pisoFoam、pimpleFoam)都使用修改后的压力,即
所以在可视化或后处理结果时,需要将压力乘以密度,获得正确的压力单位:
注意:在字典文件的开头位置,class类的值与当前文件指定的物理量与其是标量还是矢量有关,例如p为变量,则指定class的值为volScalarField;U为变量,则指定class的值为volVectorField;gradU为张量,则指定class的值为volTensorField。
本节我们主要学习了OpenFOAM主要的应用程序和工具及其文件夹结构,并实际运行一个简单算例-cavity2D,介绍了算例文件结构以及算例包含的文件的内容及其含义。❀感谢大家支持❀