参考文献:
F. Moukalled, L. Mangani, M. Darwish. The finite volume method in computational fluid dynamics. An advanced introduction with Openfoam and Matlab[M]. Chapter 6.
本文仅介绍结构化网格。
1. 有限体积网格
以“在网格上计算参数梯度”问题说明FVM对网格的要求。
网格单元上参数C的平均梯度为
根据散度定理,将体积分转化为面积分
根据中值定理
上式中为界面中心点处参数值,该值由与该界面相邻的网格单元中心点(cell-cenered)参数值确定,如下图所示,f处值由C处和F1处参数值插值获得。
因此,FVM需要网格生成模块提供的信息有:界面向量(,包括面积大小和方向)、单元中心点和相邻单元中心点参数值(
) ,以及计算界面上参数值(
)的插值方法(也可称为参数变化型线)。假设
gc和gf1的给定方法代表不同插值方法,给定一种方法
2. 结构化网格
2.1 网格拓扑
网格不仅需要提供网格几何坐标值、界面参数等,还需要提供网格拓扑信息。网格拓扑信息代表了网格局部索引与全局索引之间的关系(需要网格拓扑是因为问题的全局求解矩阵是根据各网格单元的积分方程构造的)。对结构化网格,其拓扑是已知的,无需另外定义。
对二维结构化网格,全局坐标n与局部坐标(i,j)之间的关系为
对三维结构化网格,全局坐标n与局部坐标(i, j, k)之间的关系为
2.2 几何信息
对网格单元(i, j)
其四周界面为S1(i, j), S2(i, j), S1(i+1, j), S2(i, j+1) (为界面名,界面方向由全局索引较小单元指向全局索引较大单元)。当针对单元时,规定单元界面法向量向外,因此
存储信息:2D和3D结构化网格的相关信息存储可以用1D列表/矩阵,如对Ni*Nj的2D网格,可采用Ni*Nj长度的1D列表存储信息,单元(i, j)所存储列表位置为其对应的全局索引n。
2.3 单元参数
对单元(i, j)
其梯度根据公式
可写作
根据界面方向,上式
当采用全局索引时,上式可写作
注意界面正方向总是由索引值较小的单元指向索引值较大的单元。
以上内容更清楚的说明,在FVM计算前,网格生成需要提供的信息包括: 拓扑、界面向量(,包括面积大小和方向)、单元中心点和相邻单元中心点参数值 ,以及计算界面上参数值的插值方法(也可称为参数变化型线)。下文说明这些参数值的给定/计算方法,首先介绍常见的网格单元类型。
2.2.1 网格单元类型
最常用的三维网格单元类型包括四面体、六面体、棱柱等,如下图所示。
最常用的二维网格单元类型包括四边形、三角形、五角形等,如下图所示。
在进行二维计算时,二维网格的体积是将二维网格面积乘以单位长度1(平面法矢量方向),因此二维网格参数与三维网格参数的计算方法一致。
2.2.2 单元面积和中心点坐标计算
多边形的几何中心为
几何中心一般与多边形中心点不重合,当多边形为三角形时,二者重合。为了计算多边形中心点,以几何中心为顶点,将多边形划分为若干三角形,如下图所示
得多边形面积与中心点位置为
其中三角形面积的计算方法为,给定3点1,2,3和坐标原点,形成矢量r1,r2,r3,该3点形成的三角形的面积为
当为二维网格时,z3=z2=z1,因此,
2.2.3 体积和单元中心
计算多面体体积和中心时,首先计算其几何中心,再以其为顶点,以多面体的面为底面,将多面体分解为若干棱柱。具体计算方法如下
2.2.4 界面权重系数
为由单元中心点处参数值计算界面上参数值,需要定义单元中心点之间的参数分布型线。1D情况下,进行线性插值时,可得
2D或3D情况下,基于界面法向量上单元中心点距离插值
f为界面中心点,ef为界面单位法向量
3. uFVM mesh
uFVM是一个教学/研究用非结构化FVM Matlab code,uFVM在许多方面都与工业开源程序Openfoam相似,但更为简单。与网格相关的信息存储于算例物理性质设置路径constant的polyMesh中。如下图展示了算例flange中包含的文件
其中0文件中包含了初始场信息、边界条件等;constant中包含相关物理性质,如polyMesh为网格参数;system中进行算例设置、数值格式设置/选择、求解参数定义。本文重点介绍polyMesh。
polyMesh包含文件夹points, faces, owners, neighbours, boundary.
1) points
形式如下所示,由上之下为第0个,第1个,……第n个点。
举例:
2) faces
形式如下,由上至下为第0个,第1个,……,第n个面。每个面由组成其边缘线的顶点定义。
举例:
3)owners
owner文件中存储的是截面的owner单元,所在行位置代表其所在界面。owner的总数等于界面总数(内部界面+边界界面),owner的最大值等于网格单元数。
形式如下:
举例:
4) neighbors
neighbor文件中存储的是内部界面的neighbor单元,neighbor总数等于内部界面总数。
形式如下:
举例:
5)boundary
boundary文件列出了计算域的边界。
形式如下:
举例:
4个边界,名分别为patch1, patch2, patch3, patch4; 类型均为wall; 分别有2440,348,96,384个界面; 开始界面索引分别为15316...
uFVM中采用cfdReadOpenFoamMesh(现版本中采用cfdReadPolyMesh)读取OpenFOAM网格,依次读入points,faces, boundary, owners, neighbors,形成elements,并利用读入数据计算其他几何和拓扑信息。