TetGen — CAE术语解释
TetGen
我想在自己的FEM代码中生成四面体网格,TetGen怎么使用呢?
TetGen的理论基础
TetGen的基本概念
听说过"TetGen"这个名字,但不知道它是做什么的,能否解释一下?
TetGen是一个将3维几何形状自动分割成四面体网格的软件,也就是"四面体网格划分工具"。特别的是,它从给定的表面网格生成内部体积网格,采用"Delaunay四面体化"和"边界保持"算法而闻名。是用C++编写的开源软件。
听说过Delaunay分割,但在四面体情况下它优化的是什么呢?三角形情况是外接圆内没有其他点,对吧?
完全正确。在3维Delaunay分割中,任意四面体的外接球内部不存在其他网格顶点。这个性质可以防止网格单元的形状(长宽比)变得极端恶劣,有助于数值计算的稳定性。TetGen能够高效地构建满足这一特性的分割。
提到边界保持很重要,但复杂的CAD形状表面精确再现似乎很难,怎么实现的呢?
很好的问题。TetGen以表面网格(如STL文件)的三角形面片群作为输入。算法内部采用"约束Delaunay分割"或"Delaunay细分化",强制将这些表面三角形的边和面作为网格的边和面保持。这样在指定的几何公差(默认约1.0e-9)范围内近似边界。
TetGen的数值计算方法
算法和控制参数
实际使用TetGen时,主要控制参数有哪些呢?
命令行选项中的主要参数包括:"-p"进行简单Delaunay分割,"-q"进行网格品质改进(设置目标边比),"-a"限制最大四面体体积,"-Y"禁止修复自相交等输入面网格问题。例如-q1.5/20表示目标边比1.5以下,最小二面角20度以上。
"-a"限制"最大四面体体积"是用来均匀地细化网格吗?
是的。例如指定-a0.01会使生成的四面体体积不超过0.01立方单位。这在应力集中区域等需要局部细化的场合很有效。但因为应用于全体,存在过度增加整体单元数量的风险。局部细分需要其他方法。
品质改进"-q"的具体算法是怎样修复坏单元的呢?
主要采用"顶点插入"和"顶点移动(光顺)"相结合的"Delaunay细分化"以及"优化型光顺"。发现品质低于阈值的四面体时,在其外心或边中点等处添加新顶点,在保持Delaunay条件下重新构造网格。通过这种迭代处理提高平均单元品质。
TetGen的实务应用
工作流程和前处理
从CAD到用TetGen生成体积网格,典型的工作流程是怎样的呢?
大致步骤如下:1. 用CAD软件(SolidWorks、CATIA等)建模。2. 生成表面网格(使用多数CAE前处理软件,或Netgen、gmsh等),输出为STL或PLY、OFF格式。3. 将表面网格输入TetGen,用-pq等选项生成体积网格。4. 将输出的.node、.ele、.face文件转换为求解器(CalculiX、Code_Aster等)的输入格式。
第2步的"表面网格"品质似乎对TetGen成功与否影响很大,具体要注意什么呢?
最重要的是"水密性"。表面网格有间隙(非流形边)或自相交时,TetGen无法判断内外,导致体积网格生成失败。此外,极细长的三角形或尺寸急剧变化的单元也会造成问题。用前处理软件的网格修复功能(如Salome的"Remove bad cells"或MeshLab的"Remeshing")提前修复是通常做法。
有多种材料(如金属零件和塑料零件)接触的装配体形状,TetGen能处理吗?
可以。此时输入表面网格需要明确定义不同材料区域的界面三角形面片。TetGen将识别所有输入的表面面片作为边界。输出的.face文件和.ele文件带有区域标记,后续求解器在分配不同材料常数时可以使用。
TetGen的软件对比
与其他网格划分工具的定位
商用CAE软件(Ansys、Abaqus)也有内置网格划分工具,TetGen的优势和应用场景在哪里呢?
没错。Ansys Meshing或Abaqus/CAE的网格划分工具在GUI集成和CAD连接方面很强大。TetGen的优势首先是"开源",易于集成到研究开发和自定义工具链中。其次是"鲁棒性",对于非常复杂和品质差的表面网格,也能用修复选项(-d或-w)尝试网格生成。许多开源CAE软件(FEniCS、Elmer FEM)都采用它作为默认网格划分工具。
与其他开源网格划分工具(如"Netgen"或"gmsh")相比怎么样呢?
很好的对比。Netgen有自己的几何内核(CSG),可以直接从CAD生成网格。gmsh由脚本驱动,能进行高度的网格控制,既支持结构化也支持非结构化网格。而TetGen专注于"从给定表面网格生成体积网格"这一点。因此在工作流中常见gmsh生成表面网格,再用TetGen进行体积网格化的组合。
商用软件中有采用或参考TetGen的吗?
直接公开"采用"的例子很少,但TetGen的算法在学界被广泛引用,其思想影响了许多网格划分工具。例如COMSOL Multiphysics的"四面体网格"功能采用Delaunay算法和品质改进技术。在医学图像处理领域,3D Slicer等软件直接集成了TetGen库,用于器官模型的网格生成。
TetGen的故障处理
常见错误和对策
运行TetGen时报错"Self-intersections detected. Use -d option to remove them.",怎么办呢?
这表示输入表面网格自相交。首先尝试-d选项,它会尝试检测并修复自相交。但根本解决还需用MeshLab或Blender等网格编辑工具手动修正自相交部分。表面网格生成时分辨率过低也会导致此问题,可以在原CAD中倒角或重新生成更细的表面网格。
网格生成成功了,但后续有限元求解器报"负Jacobian"错误。原因是什么?
这表示TetGen生成的四面体中可能包含形状极端恶劣的单元(如某顶点在其他三顶点构成的平面反面,几乎被压扁的单元)。尝试提高TetGen品质改进选项"-q"的目标值。例如-q1.2/15(边比1.2以下,最小二面角15度以上)。或用-a限制最大体积,整体细化网格。
非常细长的形状(薄板或细梁)网格化时,要么单元数爆炸要么失败。有办法吗?
这是四面体网格的本质问题。薄板结构应该用壳单元,细长梁用梁单元。如果非得用3D固体单元,有两个办法:1. 表面网格生成时确保薄部分厚度方向有足够的三角形层(即保证厚度方向分辨率)。2. 把TetGen的-a参数设为与薄部分体积相适应的很小值。无论如何单元数会剧增,应该先重新审视网格策略。
网格生成耗时很长。有加速的办法吗?
首先检查编译优化等级-O0到-O3。运行时可先只用-p进行网格生成,再根据需要逐步提高品质目标。品质改进"-q"计算代价大,"-a"参数值要保守。根本上最有效的是减少输入表面网格的三角形数量(去除不必要的细节)。