这算例是 IIT(印度理工学院)某 OpenFOAM 公开课的课后作业,旨在帮助初学者了解 OpenFOAM 算例的结构、了解 blockMesh 和 simpleFoam 的使用方法。这套公开课结构完整,对初学者十分友好,只是教授的印度口音有些难懂。项目网站 Spoken Tutorial Project, IIT Bombay,YouTube 链接 Spoken-Tutorial IIT Bombay。
1 问题描述
流体掠过平板,受平板影响,平板附近流速较低,形成边界层。详细的问题描述参见 YouTube 视频 Flow over a flat plate – English
2 几何模型、网格和求解控制
参考以下命令新建算例的根目录
run mkdir -p simpleFoam/flatPlate cd simpleFoam/flatPlate
2.1 创建blockMeshDict文件,定义几何模型和网格
mkdir system/ cd system/ gedit blockMeshDic
在 blockMeshDict 中输入以下内容,本文为了缩减篇幅,省去 OpenFOAM 的文件头,请读者加上。这里需要注意两点,一是点的编号从0开始,一是定义面的时候,注意选点的顺序应该满足右手定则,指向外法向。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
convertToMeters 1;
vertices
(
(0 0 0)
(3 0 0)
(3 0.5 0)
(0 0.5 0)
(0 0 1)
(3 0 1)
(3 0.5 1)
(0 0.5 1)
);
blocks
(
hex (0 1 2 3 4 5 6 7) (50 50 1) simpleGrading (1 3 1)
);
edges
(
);
boundary
(
inlet
{
type patch;
faces
(
(3 0 4 7)
);
}
outlet
{
type patch;
faces
(
(1 2 6 5)
);
}
farfield
{
type patch;
faces
(
(2 3 7 6)
);
}
lowerWall
{
type wall;
faces
(
(0 1 5 4)
);
}
frontAndBack
{
type empty;
faces
(
(3 2 1 0)
(4 5 6 7)
);
}
);
mergePatchPairs
(
);
// ************************************************************************* //
Code language: JavaScript (javascript)
2.2 创建 controlDict 文件,定义求解时间
gedit controlDict
有了 blockMeshDict,再加上 controlDict,就可以使用 blockMeshDict 工具创建网格了。controlDict 文件非常直白,很容易懂,将以下内容复制到文本编辑器并保存。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application simpleFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 2000;
deltaT 1;
writeControl timeStep;
writeInterval 100;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// ************************************************************************ //
Code language: JavaScript (javascript)
2.3 创建 fvSchemes 文件,定义离散算法
gedit fvSchemes
该文件一般不需要修改,可以直接从其他算例复制,如下
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default steadyState;
}
gradSchemes
{
default Gauss linear;
}
divSchemes
{
default none;
div(phi,U) bounded Gauss linearUpwind grad(U);
div(phi,k) bounded Gauss limitedLinear 1;
div(phi,epsilon) bounded Gauss limitedLinear 1;
div(phi,omega) bounded Gauss limitedLinear 1;
div(phi,v2) bounded Gauss limitedLinear 1;
div((nuEff*dev2(T(grad(U))))) Gauss linear;
div(nonlinearStress) Gauss linear;
}
laplacianSchemes
{
default Gauss linear corrected;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default corrected;
}
wallDist
{
method meshWave;
}
// ************************************************************************* //
Code language: JavaScript (javascript)
2.4 创建 fvSolution 文件,定义求解器参数
gedit fvSolution
写入以下内容并保存。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
solvers
{
p
{
solver GAMG;
tolerance 1e-06;
relTol 0.1;
smoother GaussSeidel;
nPreSweeps 0;
nPostSweeps 2;
cacheAgglomeration on;
agglomerator faceAreaPair;
nCellsInCoarsestLevel 10;
mergeLevels 1;
}
"(U|k|epsilon|omega|f|v2)"
{
solver smoothSolver;
smoother symGaussSeidel;
tolerance 1e-05;
relTol 0.1;
}
}
SIMPLE
{
nNonOrthogonalCorrectors 0;
consistent yes;
residualControl
{
p 1e-2;
U 1e-3;
"(k|epsilon|omega|f|v2)" 1e-3;
}
}
relaxationFactors
{
equations
{
U 0.9; // 0.9 is more stable but 0.95 more convergent
".*" 0.9; // 0.9 is more stable but 0.95 more convergent
}
}
// ************************************************************************* //
Code language: JavaScript (javascript)
2.5 使用 blockMesh 创建网格
blockMesh >> log.blockMesh &
Code language: CSS (css)
输入以上命令,可以在后台运行 blockMesh 工具,日志记录在 log.blockMesh 文件中,可用 less 工具查看
less log.blockMesh
Code language: CSS (css)
blockMesh 只会用到 blockMeshDic 和 controlDic 这两个文件,如果报错请检查这两个文件,成功结束后,会生成 constant/polyMesh 文件夹。
2.6 使用 paraFoam 查看网格
paraFoam
在左侧 Representation 下拉列表选择 wireframe 可以看到从平板向外,网格逐渐变稀疏,事实上,根据后面的计算结果可以发现,描述边界层的网格数量仍然很少,可以再加密网格。
3 物理性质、紊流模型和初边值条件
3.1 创建 transportProperties 文件,定义运动粘度
cd ../constant gedit transportProperties
本例 transportProperties 文件只定义运动粘度一项,代码如下
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
transportModel Newtonian;
nu [0 2 -1 0 0 0 0] 1e-5;
// ************************************************************************* //
Code language: JavaScript (javascript)
3.2 创建 turbulenceProperties 文件,定义紊动特性
gedit turbulenceProperties
将以下内容写入文件并保存
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object turbulenceProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
simulationType RAS;
RAS
{
RASModel kEpsilon;
turbulence on;
printCoeffs on;
}
// ************************************************************************* //
Code language: JavaScript (javascript)
有关紊流模型的更多内容可以学习 $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily 算例,文档中有简要的说明,并可以切换使用 k-epsilon、k-omega 等紊流模型。
3.3 创建 U 文件,定义流速的初边值条件
cd .. mkdir 0/ gedit U
将以下内容写入文件并保存。
FoamFile
{
version 2.0;
format ascii;
class volVectorField;
object U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
inlet
{
type fixedValue;
value uniform (1 0 0);
}
outlet
{
type zeroGradient;
}
farfield
{
type zeroGradient;
}
lowerWall
{
type fixedValue;
value uniform (0 0 0);
}
frontAndBack
{
type empty;
}
}
// ************************************************************************* //
Code language: JavaScript (javascript)
3.4 创建 p 文件,定义运动压强的初边值条件
gedit p
将以下内容写入文件并保存。
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object p;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type zeroGradient;
}
outlet
{
type fixedValue;
value uniform 0;
}
farfield
{
type fixedValue;
value uniform 0;
}
lowerWall
{
type zeroGradient;
}
frontAndBack
{
type empty;
}
}
// ************************************************************************* //
Code language: JavaScript (javascript)
3.5 创建 k 文件,定义紊动能的初边值条件
gedit k
将以下内容写入文件并保存。
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "0";
object k;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0.375;
boundaryField
{
inlet
{
type fixedValue;
value uniform 0.375;
}
outlet
{
type zeroGradient;
}
farfield
{
type zeroGradient;
}
lowerWall
{
type kqRWallFunction;
value uniform 0.375;
}
frontAndBack
{
type empty;
}
}
// ************************************************************************* //
Code language: JavaScript (javascript)
3.6 创建 epsilon 文件,定义紊动动能耗散率的初边值条件
gedit epsilon
将以下内容写入文件并保存。
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "0";
object epsilon;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -3 0 0 0 0];
internalField uniform 14.855;
boundaryField
{
inlet
{
type fixedValue;
value uniform 14.855;
}
outlet
{
type zeroGradient;
}
farfield
{
type zeroGradient;
}
lowerWall
{
type epsilonWallFunction;
value uniform 14.855;
}
frontAndBack
{
type empty;
}
}
// ************************************************************************* //
Code language: JavaScript (javascript)
3.7 创建 nut 文件,定义涡粘度的初边值条件
gedit nut
将以下内容写入文件并保存。
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "0";
object nut;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -1 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type calculated;
value uniform 0;
}
outlet
{
type calculated;
value uniform 0;
}
farfield
{
type zeroGradient;
}
lowerWall
{
type nutkWallFunction;
value uniform 0;
}
frontAndBack
{
type empty;
}
}
// ************************************************************************* //
Code language: JavaScript (javascript)
4 求解和后处理
4.1 使用 simpleFoam 求解
simpleFoam >> log.simpleFoam &
Code language: CSS (css)
4.2 使用 paraFoam 后处理
paraFoam >> log.paraFoam &
Code language: CSS (css)
在工具栏的下拉菜单中选 U,点 last frame 按钮可以看到形成稳态后的流场。可根据这一流场,加密网格再进行计算,这一任务留给读者们。
班门弄斧了,欢迎同行批评指正!