3、二维网格划分:三角形网格生成算法与四边形网格生成算法
各位同学,今天我们来聊聊二维网格划分。说实话,这是CFD分析中最基础也最容易被忽视的一环。我见过太多人拿着漂亮的几何模型,结果网格一塌糊涂,算出来的结果根本没法看。嗯,咱们今天就把它掰开揉碎了讲清楚。
3.1 三角形网格生成算法
三角形网格,说白了就是用三角形把计算域填满。它适应性最强,什么复杂形状都能搞定。我个人习惯在几何特别复杂的时候优先考虑三角形网格。
3.1.1 Delaunay三角剖分
Delaunay算法,核心就一句话:任何一个三角形的外接圆内不包含其他点。这个性质保证了生成的三角形尽可能"胖",不会出现特别狭长的单元。
Delaunay算法的基本步骤:
- 构建一个包含所有点的大三角形(超级三角形)
- 逐个插入点,找到包含该点的三角形
- 删除该三角形,连接新点与三角形顶点
- 检查并翻转边,恢复Delaunay性质
- 删除超级三角形及其相关边
我在项目中遇到过一个问题:当点分布不均匀时,Delaunay算法生成的网格质量会下降。你想想看,如果边界上点很密,内部点很稀疏,那靠近边界的三角形就会特别小,而内部的三角形特别大。这种网格用在CFD里,收敛性会很差。
我的经验:Delaunay算法生成的网格,建议用Laplacian平滑处理一下。就是把每个节点移到相邻节点的中心位置,迭代3-5次,网格质量能提升不少。
3.1.2 前沿推进法(Advancing Front Method)
前沿推进法,我更喜欢叫它"从边界往里长"。它的思路很直观:从几何边界开始,一层一层往内部生成三角形。
具体怎么做呢?
- 先把几何边界离散成一系列线段,这就是初始前沿
- 从前沿上选一条边,根据尺寸要求生成一个新点
- 检查新点是否与已有网格冲突
- 生成三角形,更新前沿
- 重复直到前沿为空
我曾经用前沿推进法处理过一个带小孔的流道网格。Delaunay算法在孔周围生成的网格质量很差,但前沿推进法就很好——因为它能严格控制边界附近的网格尺寸。
注意:前沿推进法容易在几何曲率大的地方"打架"。两个前沿推进过来,中间可能会留下一个很小的缝隙,生成质量极差的三角形。我建议在推进过程中加入碰撞检测,提前处理这种情况。
3.2 四边形网格生成算法
四边形网格,我个人更偏爱一些。为什么?因为四边形网格在相同节点数下,计算精度更高,收敛性也更好。但代价是——生成难度大。
3.2.1 映射法
映射法是最简单的四边形网格生成方法。它的核心思想:把复杂几何映射到简单几何上。
举个例子,你要在一个L形区域生成四边形网格。你可以把它分成两个矩形,每个矩形用映射法生成网格,再拼起来。
// 映射法生成四边形网格的伪代码
function generateQuadMesh(geometry, nx, ny):
// 将几何映射到单位正方形 [0,1] x [0,1]
for i = 0 to nx:
for j = 0 to ny:
u = i / nx
v = j / ny
// 从参数空间映射回物理空间
x = mappingFunction(u, v)
nodes.push(Node(x, y))
// 连接节点生成四边形
for i = 0 to nx-1:
for j = 0 to ny-1:
quads.push(Quad(i,j, i+1,j, i+1,j+1, i,j+1))
我在做换热器仿真时,经常用映射法生成管束间的网格。只要几何能分解成四边形或三角形区域,映射法就特别好用。
3.2.2 子映射法
子映射法,说白了就是把复杂区域自动分解成多个简单区域,再分别用映射法生成网格。它比手动分解要智能得多。
我记得有一次处理一个带凹槽的几何,手动分解花了我半天时间。后来改用子映射法,几分钟就搞定了。它自动识别几何特征,把区域分解成可映射的子区域。
子映射法的关键步骤:
- 识别几何的边、角、孔洞等特征
- 根据特征自动分割区域
- 对每个子区域应用映射法
- 合并子区域的网格
3.3 边界层网格
边界层网格,这是CFD网格划分的重中之重。为什么?因为壁面附近的流动梯度最大,需要更密的网格来捕捉。
我曾经犯过一个错误:在计算管道流动时,边界层网格只设了3层。结果算出来的壁面摩擦系数跟实验值差了20%。后来增加到15层,误差降到了3%以内。
3.3.1 边界层网格的参数设置
| 参数 | 说明 | 推荐值 |
|---|---|---|
| 第一层高度 | 壁面第一个网格的高度 | 根据y+值计算 |
| 增长因子 | 相邻层高度的比值 | 1.1 - 1.3 |
| 总层数 | 边界层网格的层数 | 10 - 20 |
| 总厚度 | 边界层网格的总高度 | 边界层厚度的80%-100% |
你想想看,如果增长因子设得太大,比如1.5,那网格从壁面到主流区会突然变粗,造成数值误差。我一般用1.2,既保证网格平滑过渡,又不会增加太多节点数。
3.3.2 边界层网格的生成方法
生成边界层网格,常见的方法有两种:
- 挤压法:从壁面节点沿法向挤压出多层网格。简单直接,但处理尖角时容易出问题。
- 前沿推进法:在壁面附近用前沿推进法生成层状网格。适应性更好,但实现复杂。
避坑指南:我曾经在处理一个带90度尖角的几何时,挤压法生成的边界层网格在尖角处严重扭曲。后来改用前沿推进法,并在尖角处做了局部加密,问题就解决了。
3.4 知识体系总览
为了让大家更直观地理解本章的知识结构,我画了一张图:
这张图把本章的知识体系串起来了。三角形网格和四边形网格是两大分支,边界层网格则是两者的重要补充。在实际项目中,我经常混合使用——主体用四边形网格,复杂区域用三角形网格,壁面附近加边界层网格。
总结一下:
- Delaunay算法:适合任意几何,但要注意点分布均匀性
- 前沿推进法:边界控制好,但要注意碰撞问题
- 映射法:简单高效,适合规则几何
- 子映射法:自动分解,适合中等复杂度的几何
- 边界层网格:CFD计算的关键,参数设置要合理
好了,二维网格划分的内容就讲到这里。记住,网格质量直接影响计算结果,多花点时间在网格上,后面算起来会省心很多。