1 网格的约束
1.1 点
1)点的列表中不能有重复的点,不能包含不位于这个面上的点;
2)点的命名顺序遵循右手定则,大拇指方向为法向量的方向,四只手指的顺序为点的编号顺序;
1.2 面
1)面的中心必须位于面的内部;
2)面可以是曲面。
1.3 单元
1)单元必须是封闭的,所有面面积矢量指向单元外时,它们的总和等于零矢量;
2)每条边必须由该单元的两个面使用,不能多也不能少,其实就是要求单元不能有重叠的面和线,用ICEM划分过网格的应该很容易理解;
3)法向量的传递通常是由编号小的网格传到编号大的,eg:从二号网格传到三号网格;
2 PolyMesh
以tutorial中的顶盖方腔流为例,执行blckMesh后,
(base) jzz@DESKTOP-I13L3PF:~/exercises/cavity$ cd constant/polyMesh/^C
(base) jzz@DESKTOP-I13L3PF:~/exercises/cavity$ tree
可以看到polymesh中生成了以下文件
.
├── boundary
├── faces
├── neighbour
├── owner
└── points
查看points文件的部分
*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 8
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class vectorField;
location "constant/polyMesh";
object points;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
882
(
(0 0 0)
(0.005 0 0)
(0.01 0 0)
文件头在https://blog.csdn.net/WHTU_JZZ/article/details/126601537?spm=1001.2014.3001.5502中提到过,这里不做赘述。
882代表点的数量,规定从上到下对点依次编号,如0号点为(0 0 0),1号点为(0.005 0 0)....
同理,faces:
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 8
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class faceList;
location "constant/polyMesh";
object faces;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1640
(
4(1 22 463 442)
4(21 462 463 22)
4(2 23 464 443)
1640为面的数量,前面的4是组成这个面的点的数量,后面的点为点的索引如
4(1 22 463 442)
中这个面是由第1,22,463,442的点构成的,面同样也按由上至下的方式编号。
neighbour:指定网格间的相邻关系
760
(
1
20
2
21
3
22
4
23
5
24
6
owner,说明每个面所属的网格编号:
1640
(
0
0
1
1
2
2
3
3
4
4
5
5
boundary:说明每个边界上的网格数量和使用了哪些网格:
(
movingWall
{
type wall;
inGroups List<word> 1(wall);
nFaces 20;/网格的数量
startFace 760;/网格的编号
}
fixedWalls
{
type wall;
inGroups List<word> 1(wall);
nFaces 60;
startFace 780;
}
frontAndBack
{
type empty;
inGroups List<word> 1(empty);
nFaces 800;
startFace 840;
}
)
2 boundary
以cavity中的blockMeshDict为例,通过type指定边界类型。
boundary
(
movingWall
{
type wall;
faces
(
(3 7 6 2)
);
}
fixedWalls
{
type wall;
faces
(
(0 4 7 3)
(2 6 5 1)
(1 5 4 0)
);
}
frontAndBack
{
type empty;
faces
(
(0 3 2 1)
(4 5 6 7)
);
}
);
常用边界类型:
patch | |
symmetryPlane | 对称面 |
empty | 空,在二维的情况下通常将frontAndBack设置为empty |
wedge | 前后为轴对称几何的楔形 |
cyclic | 平面循环曲线 |
wall | 紊流中的壁面 |
processor | 并行计算时,不同网格之间的边界 |
3 blockMesh
blockMesh用于生成带梯度和曲线的结构化网格,其原理为将几何分成一个或多个六面体块。还是以cavity的blockMeshDict为例:
convertToMeters 0.1;
vertices
(
(0 0 0) //0
(1 0 0) //1
(1 1 0) //2
(0 1 0) //3
(0 0 0.1) //4
(1 0 0.1) //5
(1 1 0.1) //6
(0 1 0.1) //7
);
blocks
(
hex (0 1 2 3 4 5 6 7) //由0 1 2 3 4 5 6 7组成的六面体
(20 20 1) // 在1和2方向上20个,在3方向上1个
simpleGrading (1 1 1) //类型为simpleGrading,三个方向上网格大小一致
);
edges
(
);
boundary
(
movingWall
{
type wall;
faces
(
(3 7 6 2)
);
}
fixedWalls
{
type wall;
faces
(
(0 4 7 3)
(2 6 5 1)
(1 5 4 0)
);
}
frontAndBack
{
type empty;
faces
(
(0 3 2 1)
(4 5 6 7)
);
}
)
convertToMeters为缩放比,openfoam的默认单位为m,这里乘以0.1,单位就是1dm
vertices为点的列表,和上一章中的points类似。
blocks为分区,具体包括一个由点的标签组成的列表,指定各方向上网格数量的向量和各方向上单元增长率的类型和列表。单元增长率有两种类型simpleGrading和edgeGrading。
simpleGrading | 指定三个方向上的增长率 eg.(1 2 3) |
edgeGrading | 从第一个单元指向最后一个单元 eg.七个单元:(1 1 2 2 3 3 4) |
edges为曲线,上面的代码中没有指定,因为cavity就是个长方形,edges有以下几种:
arc | 曲线 | |
simpleSpline | 样条曲线 | |
polyLine | 曲线光顺 | |
polySpline | Set of splines(看不懂,直接粘贴的user guide) | |
line | 直线 |
其中arc是最常用的
edges
(
arc 1 5 (1.1 0.0 0.5)
);
这里的曲线是以1号点和5号点为起点和终点,经过点(1.1 0.0 0.5)的一条曲线。
boundary为网格的边界,通过type指定类型,通过点的编号指定面。
boundary // keyword
(
inlet // patch name
{
type patch; // patch type for patch 0
faces
(
(0 4 7 3) // block face in this patch
);
} // end of 0th patch definition
outlet // patch name
{
type patch; // patch type for patch 1
faces
(
(1 2 6 5)
);
}
walls
{
type wall;
faces
(
(0 1 5 4)
(0 3 2 1)
(3 7 6 2)
(4 5 6 7)
);
}
);