时间马上到了六月下旬,这个学期是最为忙碌的一个学期。趁着学期的末尾的空闲,写下最近的一点小小的功能。之前有人问我Gmsh怎么划分STL模型,Gmsh在划分实体模型上的流程还是非常多的资料参考的,但是在STL模型的资料相对不多,本着学习兴趣,本人在查看文档后发下Gmsh下有个面分割(可能说法不准确)功能,能够快速提取STL的边界线及其面,基于这个功能可以快速重构网格模型到实体模型,而分割面的这个功能依赖于一个叫METIS的库。以下是我在网上资料上找到的关于METIS库的简单信息:
METIS 是一款开源的图划分(Graph Partitioning)和矩阵重排序(Matrix Reordering)库,由美国明尼苏达大学的Karypis Lab开发。它以高效、可扩展和高精度著称,广泛应用于科学计算、数据分析和工程模拟等领域。
核心功能 |
详情 |
图划分 |
将大型图(Graph)划分为多个子图,满足以下目标:
|
网格划分 |
对有限元分析(FEM)中的计算网格进行分区,优化并行计算效率。 |
矩阵重排序 |
通过重排稀疏矩阵的行和列,减少矩阵分解或求解时的填充元(fill-in),提升计算效率(如Cholesky分解、LU分解)。 |
支持多种划分方式 |
|
主要作用 |
详情 |
提升并行计算效率 |
在分布式计算中,将任务或数据均匀分配到不同进程/节点,减少通信开销 |
优化存储和计算性能 |
通过矩阵重排序降低稀疏矩阵运算的复杂度,节省内存和计算时间。 |
简化复杂问题 |
将大规模图或网格问题分解为可管理的子问题,便于分布式处理。 |
应用领域 |
详情 |
科学计算与工程模拟 |
|
数据科学与机器学习 |
|
稀疏矩阵运算 |
线性代数求解器(如PETSc、Trilinos)依赖METIS优化矩阵存储和计算 |
数据库与高性能计算 |
|
VLSI与芯片设计 |
|
特点与优势 |
详情 |
高效性 |
基于多级算法,处理百万级节点图仅需秒级时间。 |
轻量级 |
纯C语言实现,接口简单,易于集成。 |
灵活性 |
支持加权图、多种划分约束条件。 |
开源免费 |
遵循Apache 2.0许可证 |
Gmsh源码自带了METIS源码,在编译的时候勾选METIS即可。
cmake勾选:
Gmsh软件内部操作:
弹出窗口的参数设置在gmsh.h中的对应接口是:
目前比较大的问题就是这个curveAngle角度设置问题,之后是将这个模型重构为几何体,核心接口如下:
gmsh::model::mesh::createGeometry();
之后是正常的划分流程。
本人做的修改:在参考METIS源码后,实现一个可以尽可能还原实际面的网格划分功能。以下是实现的效果:
STL模型在FreeCAD1.0下的显示效果图:
网格划分效果图:
有些面的分割还是不准确的,但是效果比Gmsh自带的有一些改进,对于想实现STL网格划分,且需要提取每个面的网格的需求,这个是一个思路。