有限元网格划分后,还可以对节点进行重新编号。这种重新编号,不改动几何坐标,只是改变节点数组的存储顺序。从而改变有限元大型稀疏矩阵的节点编号,可以优化稀疏矩阵非零元分布、带宽、轮廓、和缓存命中率,从而降低矩阵带宽,减少内存与求解时间。节点重新编号不会改变仿真计算结果,但是可以提升有限元计算效率。

本文从实际开发与应用的角度,讨论常用的两种节点重编号算法:Reverse Cuthill McKee(RCM)和Hilbert空间填充曲线算法。两种方法各有优点,适用于不同类型的矩阵计算,两种方法的特征与优点如下表所示。
算法名 | Reverse Cuthill McKee | Hilbert |
|---|---|---|
输入信息 | 拓扑连通性,不需要坐标 | XYZ 几何坐标,不使用单元连通 |
优化目标 | 最小矩阵带宽 /profile | 空间局部性、CPU/GPU 缓存 |
适用求解器 | 直接稀疏求解器 (SPARSELU,MUMPS) | 迭代求解器 (CG,GMRES),GPU FE |
多分离部件 | 表现稳健 | 部件相距远时效果退化 |
计算开销 | BFS 图遍历,中等 | 坐标变换 + 大数组排序,通常更快 |
矩阵带宽 | 优秀 | 一般,经常更大 |
空间局部性 | 无保证 | 优秀 |
Reverse Cuthill McKee算法
RCM是一种经典的图重排序算法,用于有限元节点重编号后,可以减小刚度矩阵带宽(bandwidth) / 轮廓 (profile),即让非零元素尽量靠近主对角线,降低求解内存开销,优化直接稀疏求解器性能。算法只使用纯拓扑的网格连通关系,不使用几何空间坐标,纯图论算法,因此几何邻近的节点在重排以后,编号不一定邻近。
RCM具体算法流程如下:
1. 收集参与重编号的节点,构建节点 顶点邻接图(graph)。
2. 寻找伪外围节点 (pseudo peripheral node)。图上距离最远的一对作为起点,减少最终带宽。作为广度优先搜索(BFS)遍历起点。
3. 执行 Cuthill McKee BFS 分层遍历,得到编号序列。
4. Reverse 反转序列,得到 RCM 编号。
在实际开发RCM算法时,有一些细节,如
• 只对实体网格节点做图,跳过孤立节点。图是无向图,图边代表两个顶点共同属于至少一个单元。对图做连通分量分解,当模型有多个互不相连部件时,每个连通分量独立处理。
• 伪外围节点的寻找使用多次 BFS 迭代,不是严格的全图直径,而是使用工程近似方法,可以提升搜索遍历效率。
• RCM也适合用于四面体、六面体混合网格。对连通性好的连续体网格效果最好。对高度不连通、多分离部件模型,效果退化。

Hilbert空间填充曲线算法
使用Hilbert空间填充曲线对节点排序,可以使几何空间上邻近的节点在内存编号上变得接近,从而达到优化稀疏矩阵的目的,尤其是优化 CPU的L1/L2缓存命中率和内存带宽,对迭代求解器和大规模非结构网格收益明显。Hilbert方法内存开销小,不需要构建庞大的顶点邻接图,只存节点的指针,额外内存只有递归栈。
Hilbert具体算法流程如下:
1. 获取模型全部网格节点,提取每个节点的坐标 (x,y,z)。
2. 计算整个网格模型的全局包围盒 (bounding box),对于多部件模型,也可以直接放在同一个 Hilbert空间下。
3. 三维 Hilbert 曲线把单位立方体 [0,1]^3分成 2^3=8 个子立方体,曲线依次穿过这 8 个子立方体。同时,通过八叉树递归算法来实现节点的排序,无需使用额外的Hilbert 整数键值,而是直接在递归过程中用分区重排数组。
4. 生成置换数组,执行全局顶点与连通表重映射,后续流程和RCM 一致。
值得注意的是,这个算法并不生成显式的 64/128 位 Hilbert 整数索引,而是采用原地八叉树递归划分和格雷码变换,原地对顶点指针数组排序,避免大整数溢出问题。Hilbert法不优化矩阵带宽;生成的矩阵带宽经常比 RCMK 更大;直接求解器性能通常不如 RCM。
总结
本文讨论了两种常见的对网格节点重新排序的方法,网格节点重排序不改变有限元数学解,不改变单元 ID、面 ID,也不改变节点坐标,只是通过改变存储顺序提升求解效率,仿真结果完全等同。
这两种方法在选用时,可以根据后续的求解器来选择,直接求解器使用RCM方法,迭代求解器使用Hilbert方法。也可以根据是否多体模型来选择,模型包含大量空间分离独立零件,优先 RCM,如果坚持用 Hilbert,建议按物理实体分片处理。
网格重编号的算法的具体实现并不唯一,只要能够高效且正确地重新编号,并提升求解器效率,就是优异的算法。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。