openFoam网格绘制总结笔记

目录

1. 如何运行一个算例

1)openFOAM结构

2)网格生成

3)计算的运行与结果查看

2. openFOAM的网格生成逻辑

1)openFOAM网格的生成方式

Points

Faces

Owner

Neighbor

2)边界条件的设定 

3. blockMeshDict代码阅读

1)convertToMeters

2)vertices

3)blocks

 单级网格划分

多等级网格划分

4)edges

5)boundary

 6)mergePatchPairs

 7)Example

4. snappyHexMesh

1)简介

生成流程

2)背景网格blockMesh

3)全局参数(Global)

全局网格细化参数 castellatedMeshControls

4)面贴合参数

5)面加密(refinementSurfaces)

6)体加密(refinementRegions)

平面切割(searchablePlane)

细化小特征gapMode

7)边界层(addLayersControls)

基本参数设置

高级控制参数设置:

表面网格最大纵横比(maxFaceThicknessRatio)

8)网格质量控制(meshQualityControls)

5. 画网格工具

1) Pointwise

2)Ansys workbench meshing


1. 如何运行一个算例

openFOAM网格绘制教程1:如何运行一个算例 - 知乎

1)openFOAM结构

openFoam网格绘制总结笔记_第1张图片

在这个文件系统中system存储的是算例求解的一些基本信息,主要包含三个文件:

controlDict:这个文件中有一系列参数可以控制计算的起始时间,时间步长,输出精度等。

fvSchemesfvSolution:主要规定了CFD的离散格式以及求解方法等,要了解这两个文件的设置需要有一定的流体力学基础。

此外还有一个blockMeshDict文件,这个文件的作用就是为blockMesh命令输入参数,我们会在3.2节详细介绍再说。

constant:文件夹下面主要存储了计算过程中的一些常量和网格数据。

在没有绘制网格前constant文件夹下并不包含网格数据,在这个例子中它只有一个transportProperties文件,用于规定流体的运动黏度。

此外在算例文件夹下还有一系列时间文件夹,在没有进行模拟前只有一个0文件夹,这个文件夹定义的是流体模拟初始时刻的温度,压力等各种场量以及它们所满足的边界条件。

2)网格生成

在对openFOAM的文件系统有所了解之后,我们的第一步就是绘制网格。众所周知,绘制网格需要向计算机提供一系列参数,而这些参数就储存在blockMeshDict字典文件之中。在已经编写好blockMeshDict文件之后,我们只需要在算例文件夹下打开终端,然后在终端中输入如下命令,并按Enter键执行。

blockMesh

这个过程中,计算机就会调用blockMeshDict,并生成网格。

我们如果修改blockMeshDict中的设定,计算机就会生成相应的网格,来满足我们需求。

在输入blockMesh并成功运行之后,我们会发现constant文件夹下多出了一个polyMesh文件夹,实际上这个文件夹就储存了我们计算所需要的网格。

3)计算的运行与结果查看

在完成网格划分后我们在终端中输入命令:

icoFoam

这个命令会让计算机调用我们案例文件夹下所有相关的输入文件,将其输入icoFoam求解器,然后完成计算。在计算完成后我们会发现案例文件夹下多出了一系列时间文件夹,名称分别为0.1, 0.2 ,0.3 ,0.4 ,0.5 。这实际上就是计算机计算的结果,包含了各个时间下这个空腔内流体的压力与速度分布。

如果我们需要对这个计算结果进行可视化查看,我们可以通过在终端输入命令:

paraFoam

这个命令可以调用openFOAM的后处理程序paraView对数据结果进行处理,我们可以根据需要对网格进行查看或者绘制计算结果的云图或矢量图。

2. openFOAM的网格生成逻辑

openFOAM网格绘制教程2:openFOAM的网格生成逻辑 - 知乎

1)openFOAM网格的生成方式

openFOAM的网格本身,也就是openFOAM是如何告诉计算机这些网格的大小,形状,位置,以及连接顺序的。

在构建网格的过程中openFOAM首先确定是所有网格点的坐标,再由一系列点生成面,由面生成网格单元,这样一来网格单元的大小,形状,位置就被唯一确定了下来。然后再通过面与网格单元的从属相邻关系,确定网格的连接关系。

我们结合上一讲的案例来看,我们首先打开polyMesh文件夹,发现下面有一系列文件。分别为pointsfacesownerneighborboundary

Points

其中points文件就是一个存储了所有网格结点的列表,如其基本格式如下:

openFoam网格绘制总结笔记_第2张图片

图中点的定义遵循以下格式:

点的总数量

(

(点0坐标)

(点1坐标)

……

(点N坐标)

)

文件中第一行为模型中点的总数量,随后小括号内就是一系列点的列表,这个列表中每一个行存储了一个节点的坐标。同时这个列表中的点是带有编号的,这个编号从0开始。也就是说第0个点的坐标是(0 0 0),第1个点的坐标是(0.005 0 0)以此类推。

Faces

有了点的坐标之后我们就可以利用这些点的坐标来围成面,因此就有了faces文件。

openFoam网格绘制总结笔记_第3张图片

face文件的基本格式如下:

面的数量

(

构成面1的点数(点编号1 点编号2 点编号3 ……)

构成面2的点数(点编号1 点编号2 点编号3 ……)

......

构成面N的点数(点编号1 点编号2 点编号3 ……)

)

 faces文件的第一行是面的数量,接着小括号内部标出的是面的列表,这个列表同样是带有编号的,编号从0开始。另外openFOAM在对面进行编号的时候会优先对网格的内部面进行编号,在此之后再给边界面编号。每一行的内容中,括号外的数字表示这个面有几个点组成,括号内的数字则是这些点的编号,点的编号与points文件中的编号一致。另外还要注意这些点的书写有一定的顺序要求,必须按照右手螺旋定则来进行书写。

Owner

在有了面以后,我们就需要用这些面来生成网格单元。openFOAM中生成网格单元的方法是:首先计算系统内有多少个网格,然后给每个网格单元一个序号。接着在owner这个文件中,指定每一个面从属于一个特定的网格。这样当每一个面都被分配从属于一个特定的网格之后,相当于我们知道了每一个网格是由哪些面围成的。这样一来我们就知道了每一个网格的大小,形状和位置。owner文件示例如下:

openFoam网格绘制总结笔记_第4张图片

owner文件代码基本格式如下:

面的总数量

(

面0从属的网格编号

面1从属的网格编号

……

面N从属的网格编号

)

在这段代码中,第一行1640表示面的数量,括号内每一行表示对应编号的面所从属的网格编号。例如第一行表示的就是0号面从属于0号网格,第二行表示的就是1号面从属于0号网格,以此类推。

Neighbor

最后我们再确定网格之间的连接关系,我们知道对于一个内部的网格面,它实际上连接着两个网格的,在前一步中我们已经指定了它从属于哪一个网格,因此再下一步中我们只需要指定它与哪一个网格相邻就可以了,相关的信息就存储在neighbor文件中。

openFoam网格绘制总结笔记_第5张图片

neighbor文件的代码格式如下:

内部面数量

(

面0相邻的网格

面1相邻的网格

……

面N相邻的网格

)

代码的第一行表示了这个模型中有760个内部面,括号内每一行表示对应编号的面所相邻的网格编号。例如第一行表示的就是0号面相邻于1号网格,第二行表示的就是1号面相邻于20号网格,以此类推。

2)边界条件的设定 

在一个网格文件中实际上包含两类网格,一类是内部网格,一类是边界网格,对于边界网格我们需要指定其边界条件,边界条件对于CFD的计算必不可少。,

这也要求我们在绘制网格的过程中还需要提供边界信息,具体而言就是一个边界包含哪些网格,这个边界属于哪种类型。这一系列指定需要在boundary文件中进行。打开boundary以后我们就可以看到一个典型的边界定义如下(忽略文件头):

openFoam网格绘制总结笔记_第6张图片

代码的首行为边界的数量,括弧内为各个边界的详细定义,其中的movingWall就是用户给边界定下的名称。对于每一个边界大括号内给定了与这个边界名称相关的三个参数:type设定了这个边界的类型,nFaces表明了这个边界包含的面的数量,startFace指的是这个边界的起始面编号。

边界数量

(

边界1名称

{

type 边界1类型;

nFaces 边界1面数量;

startFace 边界1起始面;

}

边界2名称

{

type 边界2类型;

nFaces 边界2面数量;

startFace 边界2起始面;

}

……

)

3. blockMeshDict代码阅读

这个slide图文并茂解释的特别清晰:

Slide 1 (openfoamwiki.net)

zT​​​​​​​BlockMesh笔记 - 知乎

通过编写blockMeshDict文件 blockMesh划分网格

1)convertToMeters

convertToMeters 0.001;

字面上的意思就是将单位转换成m,在文件中是转换因子的意思。例如在输入的量为mm时,convertToMeter为0.001。

2)vertices

 几何图形的顶点坐标,几何图形的顶点排序从0开始依次增加,坐标系原点为集合图形的第一个点0点。顶点定义的顺序代表了顶点的序号,第一个定义的为0,第二个定义的为1,以此类推。

3)blocks

由下面代码表示

 单级网格划分

hex (0 1 2 3 4 5 6 7) ($xcells $ycells $zcells) simpleGrading (1 1 1)

hex表示的是六面体,(0 1 2 3 4 5 6 7)是vertices里面定义的几何图形的顶点编号,八个顶点表示一个六面体。

($xcells $ycells $zcells)表示的是X,Y,Z方向上几何图形的网格数,计算过程如下

```c++ xmin 0;//几何图形X方向起点 xmax 1;//几何图形X方向终点 ymin 0;//几何图形Y方向起点 ymax 1;//几何图形Y方向终点 zmin 0;//几何图形Z方向起点 zmax 1;//几何图形Z方向终点

deltax 0.05;//X方向单元格间距 deltay 0.05;//Y方向单元格间距 deltaz 0.05;//Z方向单元格间距

lx #calc "$xmax - $xmin";//X方向上的长度 ly #calc "$ymax - $ymin";//Y方向上的长度 lz #calc "$zmax – $zmin";//Z方向上的长度

xcells #calc "round($lx/$deltax)";//X方向上网格数 ycells #calc "round($ly/$deltay)";//Y方向上网格数 zcells #calc "round($lz/$deltaz)";//Z方向上网格数 ```

在编写blockMeshDict的时候可以不写以上的计算代码,直接在block中给定即可。

simpleGrading(1 2 3)括号中的三个数分别表示X、Y、Z方向上的网格拉伸或缩减的程度,例如1为X方向上网格大小不变,2为Y方向上最后一个网格Y方向上的长度是第一个网格Y方向上长度的两倍,3为Z方向上最后一个网格Z方向上长度为第一个网格Z方向上长度的3倍。

多等级网格划分

hex (0 1 2 3 4 5 6 7)  ($xcells $ycells $zcells)  //和前面叙述的一致

simpleGrading
(
   // x-direction expansion ratio     x 方向膨胀率 
   (0.2 0.25 8)       //Division 1    第一部分网格长度占X方向上图形长度的20%;网格数占X方向上网格数的25%;膨胀率8
   (0.6 0.50 1)       //Division 2    第二部分网格长度占X方向上图形长度的60%;网格数占X方向上网格数的50%;膨胀率1
   (0.2 0.25 0.125)   //Division 3    第三部分网格长度占X方向上图形长度的20%;网格数占X方向上网格数的25%;膨胀率0.125
)        
   // y-direction expansion ratio     Y方向膨胀率
   (
   (0.2 0.25 8)     //第一部分网格长度占Y方向上图形长度的20%;网格数占Y方向上网格数的25%;膨胀率8
   (0.6 0.5 1)      //第二部分网格长度占Y方向上图形长度的60%;网格数占Y方向上网格数的50%;膨胀率1
   (0.2 0.25 0.125) //第三部分网格长度占Y方向上图形长度的20%;网格数占Y方向上网格数的25%;膨胀率0.125
   )
   // z-direction expansion ratio     Z方向膨胀率
   1 //no expansion ratio             均匀分布

4)edges

连接两个顶点的边默认为是直线,如果两个顶点连接不是以直线的方式可以通过 edges 来指定为曲线

edges
( 
arc  1 5 (1.1 0.0 0.5) //arc 圆弧;simpleSpline 样条曲线 ;polyline 线集 ;polySpline 样条曲线集 ;直线默认不用补充。
 );
可选曲线类型 描述 格式
arc 圆弧 arc V1 V2 (p1i p1j p1k )
spline 样条曲线 spline V1 V2 ((p1i p1j p1k) (p21i p2j p2k) …)
polyLine 折线 polySpline V1 V2 ((p1i p1j p1k) (p21i p2j p2k) …)
BSpline B样条曲线 BSpline V1 V2 ((p1i p1j p1k) (p21i p2j p2k) …)
line 直线

 上表中v1和v2指定边的起始、终止端点编号。直线是边生成的默认设置,不需要用户进行参数设置。Arc圆弧中需要用户指定第三点坐标,软件依据起点v1和终点v2采用三点绘制圆弧。polyLine折线中需要用户指定多组坐标(注意点的顺序),软件用直线连接端点及其它指定坐标。spline样条曲线定义一条通过端点和指定坐标点序列的样条曲线,样条曲线是经过一系列给定点的光滑曲线。

5)boundary

定义了要应用边界条件的所有面。

boundary
   (
   top        //patch 名 
   {
   type wall; //patch 的类型 
   faces 
   (
   (3 7 6 2)  //每个 block 面通过 4 个顶点来定义,从 block 里面来看,它们起始于任何顶点,其它顶点以顺时针方向来排序。 
   );
   }

4.2 Boundaries (openfoam.com)

The patch types are specified in the mesh and field files of a OpenFOAM case. More precisely:

  • the base type is specified under the type





     keyword for each patch in the boundary file, located in the constant/polyMesh directory;

An example boundary file is shown below for a sonicFoam case

17
186
19(
20    inlet
21    {
22        type            patch;
23        nFaces          50;
24        startFace       10325;
25    }
26    outlet
27    {
28        type            patch;
29        nFaces          40;
30        startFace       10375;
31    }
32    bottom
33    {
34        type            symmetryPlane;
35        inGroups        1(symmetryPlane);
36        nFaces          25;
37        startFace       10415;
38    }
39    top
40    {
41        type            symmetryPlane;
42        inGroups        1(symmetryPlane);
43        nFaces          125;
44        startFace       10440;
45    }
46    obstacle
47    {
48        type            patch;
49        nFaces          110;
50        startFace       10565;
51    }
52    defaultFaces
53    {
54        type            empty;
55        inGroups        1(empty);
56        nFaces          10500;
57        startFace       10675;
58    }
59)
60
61// ************************************************************************* //

The type in the boundary file is patch for all patches except those patches that have some geometrical constraint applied to them, i.e. the symmetryPlane and empty patches.

Selection Key Description
patch


generic patch
symmetryPlane


plane of symmetry
empty


front and back planes of a 2D geometry
wedge


wedge front and back for an axi-symmetric geometry
cyclic


cyclic plane
wall


wall — used for wall functions in turbulent flows
processor


inter-processor boundary

patch


The basic patch type for a patch condition that contains no geometric or topological information about the mesh (with the exception of wall), e.g. an inlet or an outlet.

wall


There are instances where a patch that coincides with a wall needs to be identifiable as such, particularly where specialist modelling is applied at wall boundaries. A good example is wall turbulence modelling where a wall must be specified with a wall





 patch type, so that the distance from the wall of the cell centres next to the wall are stored as part of the patch.

symmetryPlane


For a symmetry plane.

empty


While OpenFOAM always generates geometries in 3 dimensions, it can be instructed to solve in 2 (or 1) dimensions by specifying a special empty





 condition on each patch whose plane is normal to the 3rd (and 2nd) dimension for which no solution is required.

wedge


For 2 dimensional axi-symmetric cases


, e.g. a cylinder, the geometry is specified as a wedge of small angle (e.g. 

< 5∘ \relax \special {t4ht=

) and 1 cell thick running along the plane of symmetry, straddling one of the coordinate planes, as shown in Figure 4.3. The axi-symmetric wedge planes must be specified as separate patches of wedge





 type. The details of generating wedge-shaped geometries using blockMesh are described in section 4.3.3.

cyclic
Enables two patches to be treated as if they are physically connected; used for repeated geometries, e.g. heat exchanger tube bundles. One cyclic





 patch is linked to another through a neighbourPatch keyword in the boundary file. Each pair of connecting faces must have similar area to within a tolerance given by the matchTolerance keyword in the boundary file. Faces do not need to be of the same orientation.

processor


If a code is being run in parallel, on a number of processors, then the mesh must be divided up so that each processor computes on roughly the same number of cells. The boundaries between the different parts of the mesh are called processor





 boundaries.

 6)mergePatchPairs

blockMesh允许用户使用多个block来创建网格。在包含多个block的情况下,需要处理各个block间连接问题。其有两种合并方式:

1、面匹配:

要求需合并的block A与block B中,交接面patch A1、patch B1的顶点是完全相同的。当通过面匹配来连接blocks时,用户不需要定义mergePatchPairs内参数。blockMesh会自动将这两个patch匹配成内部面,如下例所示:

mergePatchPairs

(

);

2、面融合:

两个block中的两个patch存在映射关系,不要求顶点完全相同。融合规则如下:

1)主面masterPatch保持不动,其上所有点坐标不做更改。

2)若主面masterPatch与副面slavePatch之间是存在间隙,则将副面slavePatch投影到主面masterPatch上,以满足面融合要求。

3)通过最小公差值调整副面上的节点的位置,提高主面与副面之间节点匹配度,以清除小于最小公差的细微边;

4)当主、副面间部分重叠时(如下图),重叠部分会成为内部面,不重叠的部分依然为外部面,需要定义边界条件;

5)如果副面slavePatch完全融合进主面中,则副面将会被移除。

openFoam网格绘制总结笔记_第7张图片

mergePatchPairs //合并块
  (

  );

当通过面融合来连接blocks时,需要在mergePatchPairs参数中定义要融合的两个patch,如下例所示:

mergePatchPairs

(

( )

);

 7)Example

​​​​​​BlockMesh笔记 - 知乎 (zhihu.com)

openFoam网格绘制总结笔记_第8张图片

编写blockMeshDict文件

convertToMeters 0.001;
vertices
(
    (0 0 0)          //0
    (1061.2 0 0)     //1
    (1061.2 75.8 0)  //2
    (0 75.8 0)       //3
    (1061.2 833.8 0) //4
    (0 833.8 0)      //5
    (2051.4 75.8 0)  //6
    (2051.4 833.8 0) //7

    (1061.2 0 10)    //8
    (0 0 10)         //9
    (1061.2 75.8 10) //10 
    (0 75.8 10)      //11
    (1061.2 833.8 10)//12
    (0 833.8 10)     //13
    (2051.4 75.8 10) //14
    (2051.4 833.8 10)//15   
);
blocks
(
    hex (0 1 2 3 9 8 10 11) (50 4 1)    simpleGrading (1 1 1)
    hex (3 2 4 5 11 10 12 13) (50 45 1) simpleGrading (1 1 1)
    hex (2 6 7 4 10 14 15 12) (45 45 1) simpleGrading (1 1 1)
);  
edges
(

);
boundary
(
    inlet
    {
        type patch;
        faces
        (
            (0 3 11 9)
            (3 5 13 11)     
        );
    }

    outlet
    {
        type patch;
        faces
        (
            (14 15 7 6)
        );
    }

   top
    {
        type symmetry;
        faces
        (
            (13 5 4 12)
            (12 4 7 15)
        );
    }

    bottom
   {
        type wall;
        faces
       (
            (0 9 8 1)
       );
    }

    wall
   {        
        type wall;
        faces
      (
            (8 10 2 1)         
      );
    }

    reattach
    {
        type wall;
        faces
        (

            (2 10 14 6)
        );
    }

     frontAndBackPlanes
    {
        type empty;
        faces
        (
            (1 2 3 0)
            (2 4 5 3)
            (6 7 4 2)
            (9 11 10 8)
            (11 13 12 10)
            (10 12 15 14)   
        );
    }                
);
blockMesh

openFoam网格绘制总结笔记_第9张图片

paraFoam

openFoam网格绘制总结笔记_第10张图片

 运算:

使用pyFoam进行分块计算

pyFoamDecompose.py --methods=cotch . 4
pyFoamPlotrunner.py --clear --autosense-parallel simpleFoam

没有安装pyFoam,直接使用simple计算

simpleFoam

 计算结果

openFoam网格绘制总结笔记_第11张图片

4. snappyHexMesh

这个slide讲的特别清楚

Slide 1 (openfoamwiki.net)

SnappyHexMesh-0 - 知乎 (zhihu.com)

1)简介

五、网格划分篇-SnappyHexMesh(之一) - 知乎 (zhihu.com)

在CFD计算中,要想获得好的较为准确的结果,网格质量必须好。OpenFOAM中,有一个强大的网格生成工具-snappyHexMesh。这个工具强大,但是很不好用,需要很多配合理解。推荐看一下用户指南和SHM初谈。当然了认真看看OpenFOAM维基里的相关内容也是很有必要的。

snapyhexmesh用于从三角化曲面或简单基本形状的输入自动创建高质量的三维十六进制主网格。

生成流程

1. 使用blockMesh实用程序(或任何其他六面体网格生成器)创建背景网格

2. 使用surfaceFeatureExtract实用程序提取表面上的特征

3. 设置snappyHexMeshDict输入字典

4. 以串行或并行方式运行snappyHexMesh

openFoam网格绘制总结笔记_第12张图片

2)背景网格blockMesh

五、网格划分篇-SnappyHexMesh(之二) - 知乎 (zhihu.com)

blockMesh是结构化的六面体网格生成器。一般用于生成简单几何模型的结构网格,随着几何图形复杂性的增加,需要设置参数的工作量也会大幅增加。通常处理复杂模型时,其作为snappyhexmesh软件的背景网格生成工具使用。

参数文件路径为system/blockMeshDict。建议使用一个通用模板,使用时只需修改指定参数。当然也可以使用m4或则Python脚本自动化生成。执行blockMesh命令时依赖文件openfoam中controlDict文件,blockMesh目前不支持并行运行。

前面已经详细介绍过了

3)全局参数(Global)

snappyHexMesh采用自上而下生成网格的方法,即先生成求解域内体网格,在将体网格拟合到几何表面。全局性参数设置主要包含全局网格细化控制参数(castellatedMeshControls)与面贴合参数设置(snapControls)。

全局网格细化参数 castellatedMeshControls

全局网格细化参数在castellatedMeshControls中设置,其目的为细化背景网格(例如:采用blockMesh生成的网格文件),通过细化背景网格以使几何特征与几何表面上拥有一定网格量,以提高几何特征捕捉的准确性。同时通过参数设置,保证网格细化时尺寸变化尽量平缓。

castellatedMeshControls

{

maxLocalCells 10500000;

maxGlobalCells 80000000;

minRefinementCells 1;

maxLoadUnbalance 0.2;

nCellsBetweenLevels 3;

resolveFeatureAngle 30;

allowFreeStandingZoneFaces false;

locationInMesh (0 0 0);

features

(

…

);

refinementRegions

{

…

}

refinementSurfaces

{

…

}

}

 其中features、refinementRegions、refinementSurfaces为局部网格细化功能,会在后面章节详细讲解。本章节主要针对网格细化时全局性优化算法控制参数,并展示一些重要参数的网格控制效果图。五、网格划分篇-SnappyHexMesh(之三) - 知乎 (zhihu.com) 具体各参数中文解释在这看。

4)面贴合参数

五、网格划分篇-SnappyHexMesh(之四) - 知乎 (zhihu.com)

面贴合参数在snapControls中设置,主要目的是将体网格节点移动到几何表面上,贴合体网格中锯齿状表面(如下图面贴合效果展示)。参数功能包含:控制体网格贴合到几何面上的迭代次数nSolveIter、捕捉面特征距离tolerance等,详细参数解析见下文。面贴合执行步骤如下图所示:

openFoam网格绘制总结笔记_第13张图片

从以上网格表面贴合步骤可以看出,软件优先保证网格达到最低质量标准,其次才考虑网格的贴体性。

snapControls

{

nSmoothPatch 5;

nSmoothInternal 5;

tolerance 2.0;

nSolveIter 30;

nRelaxIter 5;

nFeatureSnapIter 10;

implicitFeatureSnap false;

explicitFeatureSnap true;

multiRegionFeatureSnap false;

…

}

在表面贴合步骤中,需保证网格节点捕捉到几何特征。通常表面贴合过程中,点只需沿垂直于表面的方向捕捉特征。但在边缘的位置捕捉方式更复杂,需要更多的迭代次数。SnappyHexMesh提供了两种特征捕捉方法,显示(explicitFeatureSnap)与隐式(implicitFeatureSnap)特征捕捉。用户通过输入true或者false值,来开启或者关闭此功能。

其中显示特征捕捉方法需要用户自定义特征边文件(.eMesh),并且指定特征边的细化等级(通过castellatedMeshControls子字典中features参数指定)。软件根据用户设置的参数对特征边进行细化,以提升用户关注几何特征边的捕捉成功率。

隐式方法不需要用户提取几何特征边,其特征识别自动化程度优于显示特征捕捉方法。它使用全局细化参数中resolveFeatureAngle参数识别曲面几何特征(例如:面的相交线、曲率变化较大的曲面特征)。但在尖角特征或者挡板界面处,显示方法捕捉特征效果优于隐式方法。

5)面加密(refinementSurfaces)

五、网格划分篇-SnappyHexMesh(之五) - 知乎 (zhihu.com)

面加密(refinementSurfaces)是针对与几何表面相交的体网格进行加密,以保证后续面贴合的准确性。面加密相关参数设置包括细化等级(Level),最小、最大细化等级(levelMin,levelMax)。并允许用户依据几何表面指定面域(faceZone ),以及依据封闭几何面指定体域(cellZone )。

snappyHexMesh采用八叉树方法划分网格,细化级别的每次增加都会使细化网格单元尺寸减少一半。参考尺寸ΔX0为基本网格单元大小为0级,其网格尺寸大小等于“背景网格大小”,以下公式适用于每个坐标方向上的单元大小:

细化方法如下图所示:

openFoam网格绘制总结笔记_第14张图片

6)体加密(refinementRegions)

五、网格划分篇-SnappyHexMesh(之六) - 知乎 (zhihu.com)

五、网格划分篇-SnappyHexMesh(之七) - 知乎 (zhihu.com)

SnappyHexMesh支持用户在geometry子字典中导入、创建、修复几何。

目前SnappyHexMesh只支持三角面元triSurfaceMesh的几何类型,格式类型包括:stl(ASCII)、stlb(binary)、obj、vtk、ftr(openfoam标准格式)、ac、smesh、tri 以及dx。

软件也支持用户自定义SnappyHexMesh中标准化几何模块。其中三维几何体包括:立方体、旋转立方体、圆柱、圆锥体(空心)、圆管和球;二维片体包括:圆面及无限平面。

其次允许用户采用高级功能对已有几何进行修复处理。例如:几何中小缝隙的修复,几何等比例缩放与布尔求和等。

用户最终可在体加密参数refinementRegions中对geometry定义几何进行区域网格细化。

几何导入命令输入示例如下所示:

geometry

{

solid_0

{

type triSurfaceMesh;

file "solid_0.stl";

}

…

}
几何体类型(type) 参数 示例图
参数名 参数解释
立方体(searchableBox) min 最小对角点坐标
max 最大对角点坐标
圆锥体(空心)(searchableCone) point1 中轴线端点1
point2 中轴线端点2
radius1 断面1外圆半径
radius2 断面2外圆半径
innerRadius1 断面1内圆半径
innerRadius2 断面2内圆半径
圆柱(searchableCylinder) point1 中轴线端点1
point2 中轴线端点2
radius 外圆半径
旋转立方体(searchableRotatedBox) origin 最小对角点坐标
span XYZ方向尺寸长度
e1 e1、e2、e3为几何ijk方向向量,旋转通过向量(e1 、 e2),(e2 、 e3)或(e3 、 e1)的组合定义
e2
e3
圆管(searchableExtrudedCircle) file 用户导入曲线文件
radius 制定圆管半径
球(searchableSphere) Centre 中心点坐标
radius 球半径

 高级几何处理:

平面切割(searchablePlane)

缩放、转换与合并几何体(searchableSurfaceCollection)

缝隙修复searchableSurfaceWithGaps

五、网格划分篇-SnappyHexMesh(之八) - 知乎 (zhihu.com)

用户在几何字典(geometry)中定义了几何区域,例如:三维几何模型(searchable Box)、上传三角面元几何模型(triSurfaceMesh)或二维几何模型(searchable Disk)。然后可通过定义refinementRegions字典对几何区域网格进行体加密。体加密相关参数包括基础加密参数设置、细化小特征(gapMode)以及各向异性设置(levelIncrement)。

细化小特征gapMode

7)边界层(addLayersControls)

五、网格划分篇-SnappyHexMesh(之九) - 知乎 (zhihu.com)

snappyHexMesh的网格生成策略是自上而下生成网格,即先生成体网格,再拟合表面上面网格。边界层网格生成时,软件采用中轴位移法收缩现有体网格。即先沿表面法向向网格划分区域投影指定厚度,再根据投影厚度值计算网格松弛系数收缩现有体网格,收缩后形成的空腔作为边界层网格的划分区域。具体边界层划分原理步骤如下所示

openFoam网格绘制总结笔记_第15张图片

在划分边界层时,用户需注意在全局参数设置中激活边界层划分功能,即将addLayers值设置为true。边界层配置参数在addLayersControls子字典中设置,其参数类型可分为基本参数与高级控制参数。

基本参数设置

snappyHexMesh边界层生成基本参数包含:相对值(relativeSizes)、边界层数(nSurfaceLayers)、膨胀比(expansionRatio)、最后一层厚度(finalLayerThickness)、第一层厚度(firstLayerThickness)边界层总厚度(thickness)、边界层最小总厚度(minThickness)以及nGrow。

用户可通过expansionRatio、finalLayerThickness、firstLayerThickness、thickness四项参数,选择其中两项指定边界层厚度。如果同时指定多个参数,则软件只会使用最后两个参数。因为snappyHexMesh划分边界层时是先挤出一定边界层厚度区域,再插入边界层。为提高边界层网格生成质量,边界层厚度控制参数选择finalLayerThickness优于firstLayerThickness,相对临近单元尺寸比值优于绝对值,即relativeSizes值true优于false。

高级控制参数设置:

表面网格最大纵横比(maxFaceThicknessRatio)

边界层最大面夹角(featureAngle)[°]

边界层滑移角度(slipFeatureAngle)[°]

......so many

8)网格质量控制(meshQualityControls)

五、网格划分篇-SnappyHexMesh(之十) - 知乎 (zhihu.com)

在SnapPyHexMesh执行全局参数控制、面贴合、局部细化以及边界层生成时,程序都会依据网格质量控制参数不断调整网格迭代。且当网格位移或拓扑更改操作导致单元或面网格质量降低时,软件可根据控制参数撤消移动或拓扑更改操作以将网格还原为之前满足网格质量标准的状态。

网格质量控制参数在子字典meshQualityControl中设置,命令输入示例如下所示:

meshQualityControls

{

maxNonOrtho 65;

maxBoundarySkewness 20;

maxInternalSkewness 4;

maxConcave 80;

minVol 1e-13;

minTetQuality 1e-15;

minArea -1;

minTwist 0.05;

minDeterminant 0.001;

minFaceWeight 0.05;

minVolRatio 0.01;

minTriangleTwist -1;

nSmoothScale 4;

errorReduction 0.75;

relaxed

{

maxNonOrtho 75;

maxBoundarySkewness 25;

maxInternalSkewness 8;

}

}

5. 画网格工具

1) Pointwise

2)Ansys workbench meshing

你可能感兴趣的:(自学,openfoam)