3、二维网格划分:三角形网格生成算法与四边形网格生成算法

各位同学,今天我们来聊聊二维网格划分。说实话,这是CFD分析中最基础也最容易被忽视的一环。我见过太多人拿着漂亮的几何模型,结果网格一塌糊涂,算出来的结果根本没法看。嗯,咱们今天就把它掰开揉碎了讲清楚。

3.1 三角形网格生成算法

三角形网格,说白了就是用三角形把计算域填满。它适应性最强,什么复杂形状都能搞定。我个人习惯在几何特别复杂的时候优先考虑三角形网格。

3.1.1 Delaunay三角剖分

Delaunay算法,核心就一句话:任何一个三角形的外接圆内不包含其他点。这个性质保证了生成的三角形尽可能"胖",不会出现特别狭长的单元。

Delaunay算法的基本步骤:

  1. 构建一个包含所有点的大三角形(超级三角形)
  2. 逐个插入点,找到包含该点的三角形
  3. 删除该三角形,连接新点与三角形顶点
  4. 检查并翻转边,恢复Delaunay性质
  5. 删除超级三角形及其相关边

我在项目中遇到过一个问题:当点分布不均匀时,Delaunay算法生成的网格质量会下降。你想想看,如果边界上点很密,内部点很稀疏,那靠近边界的三角形就会特别小,而内部的三角形特别大。这种网格用在CFD里,收敛性会很差。

我的经验:Delaunay算法生成的网格,建议用Laplacian平滑处理一下。就是把每个节点移到相邻节点的中心位置,迭代3-5次,网格质量能提升不少。

3.1.2 前沿推进法(Advancing Front Method)

前沿推进法,我更喜欢叫它"从边界往里长"。它的思路很直观:从几何边界开始,一层一层往内部生成三角形。

具体怎么做呢?

  1. 先把几何边界离散成一系列线段,这就是初始前沿
  2. 从前沿上选一条边,根据尺寸要求生成一个新点
  3. 检查新点是否与已有网格冲突
  4. 生成三角形,更新前沿
  5. 重复直到前沿为空

我曾经用前沿推进法处理过一个带小孔的流道网格。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 边界层网格的生成方法

生成边界层网格,常见的方法有两种:

  1. 挤压法:从壁面节点沿法向挤压出多层网格。简单直接,但处理尖角时容易出问题。
  2. 前沿推进法:在壁面附近用前沿推进法生成层状网格。适应性更好,但实现复杂。

避坑指南:我曾经在处理一个带90度尖角的几何时,挤压法生成的边界层网格在尖角处严重扭曲。后来改用前沿推进法,并在尖角处做了局部加密,问题就解决了。

3.4 知识体系总览

为了让大家更直观地理解本章的知识结构,我画了一张图:

二维网格划分知识体系 三角形网格 四边形网格 Delaunay三角剖分 前沿推进法 映射法 子映射法 边界层网格 第一层高度 增长因子 总层数 总厚度 三角形网格:适应性强,适合复杂几何 四边形网格:精度高,适合规则几何 边界层网格:捕捉壁面流动,CFD计算的关键

这张图把本章的知识体系串起来了。三角形网格和四边形网格是两大分支,边界层网格则是两者的重要补充。在实际项目中,我经常混合使用——主体用四边形网格,复杂区域用三角形网格,壁面附近加边界层网格。

总结一下:

  • Delaunay算法:适合任意几何,但要注意点分布均匀性
  • 前沿推进法:边界控制好,但要注意碰撞问题
  • 映射法:简单高效,适合规则几何
  • 子映射法:自动分解,适合中等复杂度的几何
  • 边界层网格:CFD计算的关键,参数设置要合理

好了,二维网格划分的内容就讲到这里。记住,网格质量直接影响计算结果,多花点时间在网格上,后面算起来会省心很多。


专注资料整理