从零开始创建 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

发表评论