从零开始创建 Flat Plate Flow 算例

这算例是 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 按钮可以看到形成稳态后的流场。可根据这一流场,加密网格再进行计算,这一任务留给读者们。

  班门弄斧了,欢迎同行批评指正!

常恭

作者: 常恭

略懂 OpenFOAM

发表评论