基于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