前言:很多人说OpenFOAM很难,要啃上很多的理论书籍,什么流体力学、计算流体力学、矩阵理论、线性代数、数值计算、C++程序设计神马的,看看光这一堆书就能吓倒绝大多数的人。其实我们并不一定要从这些基础的东西入手,我觉得要学习使用一个工具,首先使它运转起来才是最靠谱的。通过大量实例练习,做多了自然就能有所感悟。
前面讲到了利用icoFoam求解器计算弯曲管道中流体混合问题。现在来自己动手做一个简单的案例,还是利用icoFoam求解器。icoFoam求解器计算的是瞬态不可压层流流动问题,是OpenFOAM中最简单的求解器之一。
有亲们留言说不知道什么是OpenFOAM,可以查看此文:【一起学OpenFoam】01 OpenFoam的优势。不知道OpenFOAM如何安装的,可以看此文:【一起学OpenFOAM】02 软件准备。
关于此求解器内部实现原理,我们以后再慢慢剖析,一开始就讲一大堆的公式推导会吓坏小朋友的。闲话少说,我们来开始我们的案例。
案例描述
一个非常简单的管道流动问题。
我们不强调问题多复杂,只关注OpenFOAM解决问题的思路。
流体流经一个直径0.01m,长度0.5m的管道,计算其内部流场。流体介质为水,密度1000kg/m3,动力粘度0.001 pa.s,入口流速0.1 m。
雷诺数:
几何及网格如图所示。在ICEM CFD中创建几何并划分网格,各边界命名如图所示。生成并输出网格pipe.msh。
OpenFOAM准备
本案例采用icoFoam求解器进行求解。因此先从tutorials文件夹中拷贝一个icoFoam模板,我们这里还是使用前面的elbow文件夹。
在此之前,先创建一个工作文件夹。我用命令在run路径下创建文件夹pipe。
mkdir $FOAM_RUN/pipe
之后利用命令copy一个elbow文件夹到pipe下面。
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/elbow/ $FOAM_RUN/pipe
这样的话,pipe文件夹下就有了elbow文件夹。如果有洁癖的话,可以把elbow文件夹命名为pipe,或者把elbow文件夹下的文件copy到pipe文件夹下,然后删除掉elbow。这里懒得折腾,直接进入到elbow路径下,并把前面生成的pipe.msh文件拷贝到elbow文件夹下。
网格转换
进入到elbow目录下,利用命令:
fluentMeshToFoam pipe.msh
此命令将网格pipe.msh转化为OpenFOAM能够识别的网格文件。
elbow目录如下所示:
├── 0 │ ├── p │ └── U ├── Allclean ├── Allrun ├── constant │ ├── polyMesh │ │ ├── boundary │ │ ├── cellZones │ │ ├── faces │ │ ├── faceZones │ │ ├── neighbour │ │ ├── owner │ │ ├── points │ │ └── pointZones │ └── transportProperties ├── elbow.msh ├── pipe.msh └── system ├── controlDict ├── foamDataToFluentDict ├── fvSchemes └── fvSolution 4 directories, 19 files
此时可以查看polyMesh文件夹下的boundary文件。文件内容为:
FoamFile { version 2.0; format ascii;
class polyBoundaryMesh; location "constant/polyMesh"; object boundary; }
3( INLET { type patch; nFaces 288; startFace 210864; } OUTLET { type patch; nFaces 288; startFace 211152; } WALL { type wall; inGroups 1(wall); nFaces 7968; startFace 211440; } )
检查文件边界名称分别为:INLET、OUTLET以及WALL。这些是我们在ICEM CFD中定义的Part名称。此文件不需要修改。
设置p文件与U文件
0文件夹中包含有p文件和U文件。
先利用命令打开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; } WALL { type zeroGradient; } }
再打开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 (0.1 0 0); } OUTLET { type zeroGradient; } WALL { type noSlip; } }
这里修改INLET边界的速度为x方向0.1 m/s。
修改transportProperties
此文件中设置一些常数项,本案例只需要设置运动粘度即可。
FoamFile { version 2.0; format ascii;
class dictionary; location "constant"; object transportProperties; }
nu [0 2 -1 0 0 0 0] 1e-6;
注意这里设置的是运动粘度,其量纲单位是m2/s。
设置controlDict文件
打开controlDict文件:
FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; }
application icoFoam; startFrom latestTime; startTime 0; stopAt endTime; endTime 20; deltaT 0.05; writeControl timeStep; writeInterval 20; purgeWrite 0; writeFormat ascii; writePrecision 6; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable true; functions {
#includeFunc residuals
}
计算
回到elbow目录下,运行命令:
icoFoam
也可以用并行计算:
mpiexec -n 6 icoFoam
利用6个cpu进行计算。
此时可以利用命令监测残差:
foamMonitor -l postProcessing/residuals/0/residuals.dat
注意:此方法是建立在已安装gnuplot的基础之上,否则是看不到残差的。我的机器上blueCFD使用此命令出错,但是在虚拟机中用OpenFOAM没有任何问题,我不清楚是gnuplot没安装好还是其他什么原因。看不到残差曲线的,将就着看输出的数据好了。
后处理
输入命令:
paraFoam
软件自动启动ParaView,可观察剖面上速度分布云图,如图所示。
总结
对于icoFoam求解器,我们做了些什么?对于本案例,我们只做了这么几件很简单的事情:
(1)网格是导入的ICEM CFD生成的网格,然后利用命令fluentMeshToFoam将其转化为OpenFoam能识别的网格。
(2)修改了p文件与U文件。分别设置了初始条件和边界条件。
(3)修改了transportProperties文件,更改了流体介质的动力粘度
(4)更改了controlDict文件,设置了时间和输出残差。
后面没有了。总体来说,icoFoam求解器还是很简单的。
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册