python做圆柱绕流_基于snappyHexMesh生成网格的圆柱绕流算例

基于snappyHexMesh生成网格的圆柱绕流算例

1.创建几何体STL文件

在了解了原理之后,要生成网格第一步就是要创建一个几何体的STL文件,可以使用3Dbulider,3DCAD等软件生成几何体然后以STL格式输出,然后将文件拷贝到虚拟机中。可以使用paraview打开几何体进行查看,确认没有问题。

2.创建背景网格

修改blockMeshDict字典文件来创建一个背景网格,在这个算例中背景网格是一个非常简单的block,背景网格的几何大小与第二章的圆柱绕流算例的尺寸一致。

需要注意的是,在blockMeshDict中所有面的type都为patch。 生成的背景网格如下:

将几何体放置到网格中,发现没有问题,继续之后的步骤。

3.为几何体创建多个表面

默认情况下,几何体STL文件由一个表面组成,如果要创建多个表面,可以使用surfaceAutoPatch。在几何体STL文件所在的目录下终端键入:

surfaceAutoPatch geo.stl cylinder.stl 130程序surfaceAutoPatch将读取原始STL文件geo.stl(一个面组成),并将使用130的角度标准将几何体划分为多个面。

这个角度划分标准类似于表面特征细化角,如果几何体相邻面角度大于resolveFeatureAngle,则标记相邻STL面进行划分(细化),反之不进行划分(细化)。

cylinder.stl最终要拷贝到constant/triSurface中。

这时候打开cylinder.stl,会发现里面定义了三个表面:patch0(通过部分代码上的点位置可以确定patch0是圆柱体的侧表面)

patch1(可以判断为后端面)

patch2(同理可以判断为前端面)

在paraview中可以直观的看到三个面分别是不同的颜色:

4.复制snappyHexMeshDict,meshQualityDict和surfaceFeatureExtractDict文件

在完成上面的操作后,就可以进行网格细化了,网格细化需要snappyHexMeshDict,meshQualityDict和surfaceFeatureExtractDict这三个文件,在这里我们直接从其他的snappyHexMesh算例中进行拷贝过来然后进行修改。在这个算例中,在这里我将SHM演示算例C1中的这三个文件给复制了过来。

当然,我们也可以寻找OpenFOAM自带的教程算例中的这些文件,步骤如下(以snappyHexMeshDict为例):进入OpenFOAM教程算例

cd $FOAM_TUTORIALS寻找snappyHexMeshDict文件

find . -iname snappyHexMeshDict

出现了所有教程算例中的snappyHexMeshDict文件,我们也可以选择自己需要的类型。进入算例文件夹,并将自己需要的文件复制粘贴到system文件夹中。

meshQualityDict和surfaceFeatureDict也是同样按照上面的方法进行复制。

5.修改snappyHexMeshDict等文件

snappyHexMeshDict是主要要修改的文件,meshQualityDict基本不需要修改,surfaceFeatureExtractDict只要将几何体STL文件的名称改为cylinder.stl即可。

snappyHexMeshDIct字典由五个部分组成,即geometry,castellatedMeshControls,snapControls,addLayersControls,meshQualityControls。每个部分控制网格化过程的一个步骤。

修改后的snappyHexMeshDict文件如下

castellatedMesh true;

snap true;

addLayers false;

geometry

{

cylinder.stl//要读取几何体STL文件 {

type triSurfaceMesh;

name banana_cylinder;//snappyHexMesh内表面的名称 ​

regions//定义多个表面 {

patch0 // STL文件中的表面名称 {

name cylinder; // 定义圆柱体侧表面为cylinder,这样其他的文件不用改。 }

patch1

{

name surface1;

}

patch2

{

name surface2;

}

}

}

refinementBox//细化区域,包含几何体的block {

type searchableBox;

min (-1 -1 0);//(minX minY minZ) max (1 1 1);//(maxX maxY maxZ) }

};

castellatedMeshControls//细化参数 {

maxGlobalCells 2000000;//区域中的最大网格数,达到数目后,网格划分器不会再添加网格 minRefinementCells 0;

maxLoadUnbalance 0.10;

nCellsBetweenLevels 2;//控制单元细化级别之间的过渡 ​

features

(

{

file "cylinder.eMesh";//使用命令surfaceFeatureExtract后生成的文件。 level 0

}

);

refinementSurfaces//细化表面 {

banana_cylinder//与上面的name对应 {

level (2 2);//表面网格细化的最小和最大等级,即网格被分割的最小和最大次数。 regions//局部细化 {

patch0

{

level (2 4);

patchInfo//patch信息 {

type wall;//类型只能为wall或者patch }

}

patch1//patch1和patch2在生成外部网格时会被去除,可以不用定义。 {

level (2 2);

patchInfo

{

type patch;

}

}

patch2

{

level (2 2);

patchInfo

{

type patch;

}

}

}

}

}

resolveFeatureAngle 30;

//resolveFeatureAngle 30; //默认 //resolveFeatureAngle 60; //避免细化过度 planarAngle 30;

refinementRegions

{

refinementBox

{

mode inside;

levels ((1E15 1));

}

}

locationInMesh (4.5 4.5 0.1);//这一点定义了要在何处进行网格划分。可以是内部网格,也可以是外部网格。 //如果点在STL内部,则为内部网格如果点在背景网格内部且在STL外部,则为外部网格。 //此外,该点不可以是表面或者是网格线上的一点,必须是网格内的一点。 allowFreeStandingZoneFaces true;

snapControls

{

nSmoothPatch 3;//面对应之前的面广顺迭代 tolerance 2.0;//网格单元的顶点和几何表面的点或特征面的距离 nSolvelter 100;//网格移动最大迭代数 nRelaxlter 10;//网格贴合最大迭代数 nFeatureSnaplter 10;

implicitFeatureSnap false;

explicitFeatureSnap ture;

muliRegionFeatureSnap false;

addLayersControls

{

relativeSize ture;//绝对边界层厚度(false 相对边界层厚度) expansionRatio 1.2;//边界层网格膨胀因子 finalLayerThickness 0.5;//壁面最近的边界层厚度 minThickness 0.1;//边界层网格的最小厚度 layers//边界层字典 {

banana_cylinder

{

nSurfaceLayers 3;

}

}

nGrow 0;//抽取点,没有抽取点则生成指定数量的边界以连接面,使得特征边附近的边界层添加过更容易收敛 ​

featureAngle 130;//边界层自动坍塌特征角 maxFaceThicknessRatio 0.5;//停止边界层增长的包裹网格率 nSmoothSurfaceNormals 1;//面法向光顺迭代器 nSmoothThickness 10;//面上边界层厚度光顺器 minMedialAxisAngle 90;//中轴点角度 maxThicknessToMedialRatio 0.3;//距离中轴比的最大距离 nSmoothNormals 3;//内部网格移动的广顺迭代器 slipFeatureAngle 30;

nRelaxIter 5;//对齐过程的最大迭代数 nBufferCellsNoExtrude 0;//新的边界层外缓冲层数 nLayerIter 50;//最大边界层添加迭代数 nRelaxedIter 20;//最大网格回放迭代数 ​

meshQualityControls

{

relaxed

{

maxNonOrtho 75;//最大非正交角 }

nSmoothScale 4;//每次回放的光顺数 ​

errorReduction 0.75;//网格内某些点的回放量 }

mergeTolerance 1e-6;

6.运行算例

在运行算例前,需要将第二章的圆柱绕流算例文件中的controlDict,0,fvSolution,fvShemes拷贝到算例文件夹中。

然后输入以下代码

surfaceFeatureExtract//从几何文件中提取特征边缘,同时,在triSurface文件中会生成cylinder.eMesh文件。 blockMesh//生成背景网格

在生成背景网格之后,为了之后的运算,我们还需要将polyMesh/boundary字典中的表面类型修改为对应的类型(与0/p,0/U中的边界面类型一致):

然后再输入:

snappyHexMesh

生成的网格如下:

此时,在算例文件夹中会生成两个时间步文件。

时间步文件中只有一个polyMesh文件夹,文件夹里面包含了使用程序snappyHexMesh之后的网格信息:

boundary文件里面包含了包括几何体在内的完整的边界信息:

我们使用时间步文件中的polyMesh文件替换掉constant/polyMesh,并删除时间步文件。

然后就可以进行运算了,输入:

icoFoam

7.与blockMesh生成网格算例对比

选择几i个点的U和p进行比较,点(-1 0 0.5)位于来流的壁面上,点(-1.5 0 0.5)在壁面附近,点(1 0 0.5)位于圆柱背面,点(0 1 0.5)位于侧面。

比较网格图不难发现使用snappyHexMesh划分的网格在壁面附近更精细。

从上面的表中可以看出两种网格算例的值在壁面附近也有一些区别,使用blockMesh的算例壁面附近的U值大体上比snappyHexMesh的U值小,而相反p值稍微大一些。

由于两种网格的生成方式不同,导致计算结束后,两种算例中流体的流动状态有区别,因此p和U的云图也有区别。

p(左:snappyHexMesh,右:blockMesh)

U

你可能感兴趣的:(python做圆柱绕流)