本文详细描述OpenFOAM的案例目录。
以cavity案例为例,该案例文件目录结构如下图所示。
constant文件夹中包含一个名为polyMesh的子文件夹与一个名为transportProperties
的文件。
transportProperties文件中指定了流体属性,其文件内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * //
nu [0 2 -1 0 0 0 0] 0.01;
在所有的OpenFOAM输入文件中,可以使用//
注释某一行,也可以使用/* */
注释多行。
方括号中的数值用来表示物理量的单位,OpenFOAM要求为所有的物理量定义单位。方括号中一共有7个值,其含义如下表所示。
No. | Property | Unit | Symbol |
---|---|---|---|
1 | 质量 | Kilogram | kg |
2 | 长度 | meters | m |
3 | 时间 | second | s |
4 | 温度 | Kelvin | K |
5 | 物质的量 | moles | mol |
6 | 电流 | ampere | A |
7 | 光强 | candela | cd |
即方括号中的单位表示为[ 1 (kg), 2 (m), 3 (s), 4 (K), 5 (mol), 6 (A), 7 (cd)] ,因此transportProperties文件中定义的物理量nu
的单位为m^2 s^-1
,即:
本案例计算的是不可压缩流动,因此仅需要定义运动粘度即可。运动粘度与动力粘度的关系为:
运动粘度的值可以在此文件中进行修改。
根据所涉及的物理和使用的模型,可能需要在字典文件transportProperties中定义更多的物理量,例如,对于多相流模型,需要定义每一相的密度Rho及运动粘度nu,有时还需要定义表面张力。
此外,根据所选用的物理模型,将在常量目录中找到更多字典。例如,如果需要设置重力,则需要创建字典g;如果使用可压缩流动,则需要在字典thermPhysicalProperties中定义动力粘度µ和许多其他物理属性。
初始情况下polyMesh是个空文件夹,当生成网格后,文件夹中将会包含有OpenFOAM格式的网格数据。在OpenFOAM中,可以使用网格生成工具blockMesh
生成网格,不过在应用blockMesh
之前,需要在system
文件夹中准备字典文件blockMeshDict
。
下面简要介绍block MeshDict字典的几个重要输入。需要注意的是在实际应用过程中很少使用该工具为复杂几何体生成网格。利用文本编辑器打开字典文件system/blockMeshDict
,其中内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * //
convertToMeters 1; //几何尺寸缩放1,表示不缩放
//下面定义了8个坐标点,点的顺序从0~7
vertices
(
(0 0 0)
(1 0 0)
(1 1 0)
(0 1 0)
(0 0 1)
(1 0 1)
(1 1 1)
(0 1 1)
);
//创建了1个块,注意点的顺序
//指定块上的网格点数量,x、y、z方向分别为20、20、1
//simpleGrading(1 1 1)表示三个方向网格采用等间距分布
blocks
(
hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1)
);
edges
(
);
//下面定义边界面
boundary
(
movingWall //指定边界名称为movingWall
{
type wall;//指定边界类型为wall
faces
(
(3 7 6 2) //此边界面由点3→7→6→2组成
);
}
fixedWalls
{
type wall;
faces //此边界包含3个面,每个面由4个点组成
(
(0 4 7 3)
(2 6 5 1)
(1 5 4 0)
);
}
frontAndBack
{
type empty; //此边界类型为empty,因此本案例为2D问题
faces
(
(0 3 2 1)
(4 5 6 7)
);
}
);
mergePatchPairs
(
);
定义的计算区域以及几何点如下图所示。
字典文件创建完毕后,可以使用在案例文件路径下使用命令blockMesh
生成计算网格。利用paraFoam
查看计算网格,如下图所示。
网格生成完毕后,polyMesh
文件夹中多出了几个文件,其中存放了网格数据。
polyMesh文件夹中包含5个子文件:
这里比较重要的是boundary
文件,下面是boundary文件的内容:
FoamFile
{
version 2.0;
format ascii;
class polyBoundaryMesh;
location "constant/polyMesh";
object boundary;
}
// * * * * * * * * * * * * * * * * //
//这里的3表示定义了3个边界条件
//与blockMeshDict文件中的信息保持一致
3
(
//movingWall是在blockMeshDict文件中定义的,这里可以更改
movingWall
{
//定义边界类型为wall,是在blockMeshDict文件中定义的
//边界类型在这里可以修改
type wall;
//inGroups信息可以删除
//其用途主要为对Patch进行分组,便于后处理查看
inGroups List<word> 1(wall);
//nFaces表示网格面的数量,这个不能改
nFaces 20;
//startFace表示起始面的编号,通常不能改
startFace 760;
}
fixedWalls
{
type wall;
inGroups List<word> 1(wall);
nFaces 60;
startFace 780;
}
frontAndBack
{
type empty;
inGroups List<word> 1(empty);
nFaces 800;
startFace 840;
}
)
边界信息如下图所示。
网格边界的名称与类型在进行计算之前需要检查,确保与0文件夹中所设置的边界条件保持一致。
这些边界类型包括基础边界类型与数值边界类型两种。基础类型中的约束类型如下表所示。
boundary文件 | 0/U文件与0/p文件 |
---|---|
symmetry | symmetry |
symmetryPlane | symmetryPlane |
empty | empty |
wedge | wedge |
cyclic | cyclic |
processor | processor |
基础类型中的patch
类型如下表所示。
boudary文件 | 0/U文件与0/p文件 |
---|---|
patch | fixedValue zeroGradient inletOutlet slip totalPressure supersonicFreeStream … |
壁面边界类型wall
如下表所示。
boudary文件 | 0/U文件 | 0/p文件 |
---|---|---|
wall | type fixedValue; value uniform(u v w) | zeroGradient |
boundary文件中的边界名称必须与0文件夹中的边界条件名称保持一致,否则OpenFOAM会给出警告信息。
system
文件夹中主要包含了三个文件:controlDict、fvSchemes、fvSolution。
controlDict文件的内容如下所示。大多数参数的意义都可以通过字段名猜测得到。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * //
// 指定运行case使用的求解器为icoFoam
application icoFoam;
// 指定求解从startTime时刻开始
startFrom startTime;
// 指定starTime时刻为0s,此参数可修改
startTime 0;
// 指定终止计算的时刻类型为endTime
stopAt endTime;
// 指定终止时间为0.5 s
endTime 0.5;
// 指定时间步长为0.005 s
deltaT 0.005;
// 指定计算结果按时间步长输出
writeControl timeStep;
// 指定结果文件写出频率为20
writeInterval 20;
// 指定保留所有的求解结果文件夹
purgeWrite 0;
// 指定结果文件输出格式为ascii
writeFormat ascii;
// 指定写成精度为6
writePrecision 6;
// 指定是否压缩文件,off为不压缩
writeCompression off;
// 指定时间格式为通用格式
timeFormat general;
// 指定时间精度为6
timePrecision 6;
// 指定是否可以在计算过程中动态修改
// true表示可以,false为不能
runTimeModifiable true;
那么如何知道每个关键字都有哪些选项可用呢?
那banana法是什么呢?此方法包括插入一个虚词(安装中不存在),并让OpenFOAM自动列出可用选项。
例如将文件中的stopAt endTime;
改成stopAt banana;
计算中将得到下面的错误提示输出:
banana is not in enumeration
4
(
nextWrite
writeNow
noWriteNow
endTime
)
所以备选选项是nextWrite、Writenow、noWriteNow、endtime。
fvSchemes文件用于指定控制方程各项所采用的离散算法。
在本例中,我们使用后向差分离散格式(DdtSchemes)。对于梯度离散化(GradSchemes),使用高斯线性方法。对于对流项(DivSchemes)中的项div(φ,U)与项div((nuEff*dev2(T(grad(U))))) 使用线性插值。对于拉普拉斯(LaplacianSchemes和snGradSchemes)的离散化使用高斯线性方法,并进行有限的1次修正(以处理网格的非正交性和非均匀性)。
本案例的fvSchemes文件内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSchemes;
}
// * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
grad(p) Gauss linear;
}
divSchemes
{
default none;
div(phi,U) Gauss linear;
}
laplacianSchemes
{
default Gauss linear orthogonal;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default orthogonal;
}
FvSolution字典文件中包含了对离散化的线性方程组进行求解的算法设置。方程求解器、计算残差以及计算算法都需要在字典文件中进行指定。在字典文件fvSolution(取决于您使用的求解器)中,可以找到找到其他子字典Piso、Pimple、Simple和RelacationFactors。对于controlDict和fvSchemes字典,参数可以动态更改。此外,如果想知道有哪些选项可用,只需使用banana方法即可。
在本案例中,为了求解压力(P),我们使用PCG方法,预处理器采用DIC方法,绝对容差设置为1e-06,相对容差relTol等于0。关键字pFinal
指的是最终压力校正,并且使用的相对公差relTol等于0。本例中对p和pFinal使用相同的公差。但是可以使用不一样的计算容差,在这种情况下,通常在pFinal中使用更严格的容差。
本案例的fvSolution文件内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSolution;
}
// * * * * * * * * * * * * //
solvers
{
p
{
solver PCG;
preconditioner DIC;
tolerance 1e-06;
relTol 0.05;
}
pFinal
{
$p;
relTol 0;
}
U
{
solver smoothSolver;
smoother symGaussSeidel;
tolerance 1e-05;
relTol 0;
}
}
PISO
{
//进行两次PISO校正
nCorrectors 2;
//不进行正交校正
nNonOrthogonalCorrectors 0;
pRefCell 0;
pRefValue 0;
}
为了求解U,这里使用smoothSolver
方法,使用更平滑的symGaussSeidel
,绝对容差设置为1e-05,相对容差relTol设置为0。求解器将进行迭代计算,直到达到用户设置的任何容差值或达到迭代次数的最大值(可选输入)。
PISO子词典包含与压力-速度耦合方法(PISO方法)相关的参数。在本案例中进行2次PISO校正,不进行正交校正。
0文件夹存储初始条件与边界条件。本案例的0文件夹中包含两个文件:p文件与U文件,分别设置压力边界与速度边界。
U文件的内容如下图所示。
FoamFile
{
version 2.0;
format ascii;
class volVectorField; //矢量场
object U;
}
// * * * * * * * * * * //
//这里指定单位为m/s
dimensions [0 1 -1 0 0 0 0];
// 指定内部物理场U分布为均匀的(0 0 0)
internalField uniform (0 0 0);
boundaryField
{
//边界名称movingWall,与boudary中保持一致
movingWall
{
//边界类型为fixedValue,边界值(1 0 0)
type fixedValue;
value uniform (1 0 0);
}
fixedWalls
{
type noSlip;
}
frontAndBack
{
//类型为empty,无需指定参数,与boundary中保持一致
//指定为empty表示计算的是2D模型
type empty;
}
}
p文件指定边界压力分布。
FoamFile
{
version 2.0;
format ascii;
class volScalarField; //标量场
object p;
}
// * * * * * * * * * * * * * * //
// 不可压缩求解器采用修正的压力,单位质量的压力
// 压力单位为pa/(kg/m3),换算后位m2/s2
// 后处理的时候需要将压力值乘上密度,得到实际压力
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
//边界名称需要与boudary文件中保持一致
movingWall
{
//边界类型指定为zeroGradient
type zeroGradient;
}
fixedWalls
{
type zeroGradient;
}
frontAndBack
{
type empty;
}
}