使用开源工具的三维网格划分方法概述

2020-11-12 02:58:00

互联网上充斥着美丽的3D网格例子,但很难获得关于它们是如何构建的线索。事实上,没有正确的工具或训练,创建一个好的3D网格是非常容易的。此外,大多数商用前处理软件都在不断改进,提出了功能强大的三维网格划分算法,能够构建混合网格或全六面体网格。本文的目的是概述建立结构有限元三维网格所涉及的约束条件,以及各种依赖于自由和开源工具的网格划分方法。

在开始之前,让我们先给出一些关于3D网格构建的背景信息。通常,三维网格可以由4种类型的元素组成:

我们的目标是得到一个自由度最少的网格,同时保持良好的代表性能力。我们可以押注于四面体的竞赛,它只有4个节点(对于线条)。但现实更复杂:某些类型的元素比其他类型的元素表现得更好。在不涉及太多细节的情况下,我们可以提供一些关于这方面的提示:

必须尽量避免四节点四面体(线性单元)。它的表现很差,需要大量的测试才能得到有意义的结果。如果你没有其他选择,试着把它们转换成10个节点的四面体,这样更好。

如果你想保持线性元素,你必须瞄准六面体。大多数有限元软件(你可以猜到SesamX是其中的一部分)提出了一种改进的六面体单元。这使它成为比其他元素更好的选择。

6节点楔形(线性单元)比4节点四面体好,但比8节点六面体差。可以使用,但尽可能使用六面体。

我还没有对金字塔进行足够的测试,无法给出相关的建议。然而,由于该元素在3D网格中很少使用,因此本文不会对其进行详细说明。

使用自动网格器可以很容易地构建一个完整的四面体网格(在各种软件中广泛使用)。相反,全六面体或混合自动网格器更复杂,也更难找到(你可以在商业解决方案中找到它们,但几乎不能在免费的解决方案中找到它们)。

然而,只要使用免费和开源的工具,我们仍然能够构建高质量的3D网格。

本文的其余部分展示了使用Salome或Gmsh构建3D网格的4种方法。我们的目标不是深入了解所用选项的每一个细节,而是概述如何构建3D网格。无论我们使用什么工具,更改元素顺序通常都是一项微不足道的任务(无论是线性的还是二次的)。因此,我在这里不再详细介绍。取而代之的是,我将专注于在网格划分的同时控制元素的形状。

对于每种方法,我都提供了一个带有说明性屏幕截图的逐步指南。而且,在适当的时候,我还提供了最终的结果文件,您可以自己编辑和修改。

这里要提到的一个重要特征是,这个连杆几何体是由3个固体组成的(这个原因在讨论混合网格生成方法时是有意义的),对应于上图中的每种颜色。

如前所述,得到一个完整的四面体网格非常简单。为了构建这个网状结构,我们使用了Salome。

首先,我们转到几何模块并导入STEP文件。莎乐美的树应该是这样的:

然后,我们必须将复合几何体分解为3个子实体,并从这些实体创建分区。这一步是必要的,以确保Salome将合并来自每个实体面的重合节点。然后,结果树为:

接下来,我们转到网格模块,在分区上创建一个新网格。在算法下,我们可以选择“NETGEN 1D-2D-3D”,在假设“NETGEN 3DSimple Parameters”下,我们可以选择“NETGEN 1D-2D-3D”。最后,我们必须输入元素应该具有的边缘大小。

最后,我们必须在网格上单击鼠标右键并点击“计算”。网格应如下所示:

正如你所看到的,网格是由四面体组成的,但也有三角形和边元素。要去除2D和1D元素,第一步是点击网格并选择“创建组”。出现一个面板,我们可以创建一个包含所有2D元素的组(如下图所示),1D元素也是如此。

接下来,要删除这些元素,我们必须在每个组上单击鼠标右键并选择“Delete Group with Content”(删除包含内容的组)。我们得到了以下完整的四面体网格。

最后,为了检查网格是否包含任何重复的节点,我们必须选择网格并使用“控件/节点控件/双节点”。

首先,需要创建包含模型的3个实体的体积物理组。这样可以确保以后的网格导出实际上只会导出3D元素。

接下来,我们转到“工具/选项”,然后选择“网格/常规”来选择网格参数。我们可以选择2D算法、3D算法和2D重组算法。这些参数会影响网格的构建方式,可以随意更改它们以注意网格中的不同之处。作为第一个猜测,我们可以选择“Delaunay”和“Blowsom”。但是,请确保选择“所有十六进制”作为“细分算法”,这样体积将只填充六面体。

最后,我们必须返回Gmsh树,然后单击“网格”下的“3D”来构建网格。

我们可以在“工具/统计”下查看网格内容。如你所见,网格由一维、二维和三维六面体单元组成。因为我们已经为3个体积块创建了一个物理组,所以只会导出3D网格。

如果您在可视化3D元素时遇到困难,可以在“可见性”选项卡下的“网格”选项窗口中调整可见性参数。

不幸的是,这里有个陷阱。得到的网格在3个实体之间的交界处有重复的节点。要可视化它们,我们可以导出一个.med文件,将其导入Salome,然后使用前面提到的“双节点”工具。

最后,要解决这个问题,我们必须使用“修改/转换”下的“合并节点”工具。

接下来,我将展示如何使用Salome构建高效的混合网格。这种方法是我最喜欢的,因为它产生了一个结构良好的网格,可以更有效地捕捉几何体的细节(例如,如果你仔细观察自动的四面体和十六面体网格,你会发现文件并不总是被很好地捕捉到)。这种方法的缺点是,它不会生成完整的六面体网格,而是由大多数六面体和少数楔形组成的混合网格来填补缝隙。这一方法的缺点是,它不能生成完整的六面体网格,而是由大多数六面体和少数楔形组成的混合网格来填补缝隙。

3D网格将首先通过对2D曲面进行网格化,然后再对其进行挤出来构建。为了使这一过程可行,几何体已预先分割成3个实体。然后,这些实体中的每一个都可以作为曲面网格的挤出进行网格化。

正如对全四面体网格的解释,我们首先需要分解复合几何体并建立一个分区。

然后,为了在曲面和3D拉伸网格上构建2D网格,我们需要从该分区提取(使用分解)相关几何图形:

实体1的顶面(实体1图像上的红色面),它将驱动实体1上的3D网格。

实体2和实体3的“圆角面”(实体3图像上的红色面),它将驱动实体2和实体3上的三维网格。

计算网格时将不使用默认的3D网格参数,因为子网格定义将覆盖整个分区。不过,Salomestill需要这些默认参数。

要创建面子网格,我们必须在网格上单击鼠标右键并选择“创建子网格”。然后我们需要选择其中一个面,并选择带有“NETGEN 2D简单参数”的“NETGEN 1D-2D”算法。然后我们可以输入元素大小,并确保选中“四边形控制”(以避免最多的三角形)。

要计算子网格,我们必须右击它并选择“ComputeSub-Mesh”。我们对第二个面重复这些操作。

创建3D子网格的方法与此类似。一旦我们选择了实体到网格,我们就选择“三维挤出”作为网格划分算法,不需要关联任何假设,但是我们必须提供一维算法和假设来定义网格挤出的行为。

一维算法采用Wire Discretisation算法,假设二维子网格的局部长度为先前的局部长度。

我们对另外两个实体重复此操作。网格树应如下所示:

在计算网格之前,我们需要告诉Salome计算子网格的顺序。为避免挤出时的网格冲突,在我们的情况下,最好是在对实体2和实体3的驱动曲面进行网格划分之前,先对实体1进行全网格划分。我们必须在网格上单击鼠标右键并选择“更改子网格优先级”。网格划分顺序应如下所示:

计算完成后,我们可以使用与全四面体方法相同的技巧来删除无用的一维和二维元素。

正如你所看到的,这个网格比之前的两个自动网格规则得多,圆角细节也被更好地捕捉到了。

在我看来,这种方法用在复杂的形状上是不现实的,但它是一个重要的方法,值得解释一下。这种方法可以通过将体积分割成块来构建结构良好的全六面体网格。

它通常用于计算流体力学(CFD)网格。将这种方法应用于结构有限元要困难一些,并且需要时间和精力从CAD几何构造块。

Salome提供的一些工具可以让您更有效地构建“块就绪”几何图形,但我认为从概念上讲,它们破坏了整个设计工作流程。通常,我们开始构建CAD模型,然后开始网格划分过程。在这个过程中,我们可能不得不简化几何图形(例如移除小孔),最后使用类似于前面所展示的方法对其进行网格划分。

另一方面,在网格划分过程中使用“块就绪”几何图形工具时,我们是在网格级别从头开始构建几何图形。这不在啮合过程的职责范围之内。并且网格和CAD之间的链接丢失。

然而,使用Salome来说明什么是块网格仍然很有趣。为连杆模型创建块是很痛苦的,我更喜欢使用工具来直接构建一个气缸体几何图形作为例子。

首先,我们进入几何图形,在“新实体/块”下选择“分割圆柱体”。然后我们输入圆柱体的半径和高度,并检查“正方形分割模式”(这个模式告诉Salome应该如何将圆柱体分割成块)。

从上一张图的细分图中我们可以看到,每个块都是由8个角、12条边和6个面组成的Facta实体。我允许您使用“检查”菜单下的“检查块化合物”工具来检查我们的实体整体是否由有效的块组成。

接下来,我们转到网格模块,添加一个新网格。对于3D算法,我们选择“六面体(i,j,k)”。对于2D算法,我们选择了“四边形:映射”,并在假设条件下选择了“标准网格剖分模式”。对于1D算法,我们选择“线段离散化”和“线段数量”作为假设,我们必须输入线段的数量而不是长度,因为块的每条边都必须有相同数量的节点(否则Salome将无法构建网格)。

最后,我们可以计算网格并检查其内容。体积只由六面体组成,是的,我是懒惰的,我没有删除1D和2D元素:)。

我希望你从这些例子中对如何构建3D网格有了更好的了解。当然,在构建一个完整的部件时,你可以根据你想要网格化的零件来混合这些方法。根据我的个人经验,我使用以下规则:

如果零件可以被描述为挤压体的混合物,我将使用线性元素的混合挤压法。

如果零件具有复杂的几何形状,但对整个模型并不重要,我将使用带有线性元素的自动四面体方法(并在计算后确保实际上应力梯度很小)。

如果零件具有复杂的几何形状,并且对整个模型至关重要,我将使用带有线性元素的自动六面体方法。如果网格计算失败(有时在复杂的几何形状上可能失败),那么我将退回到使用二次元素的自动四面体方法。

我希望你读得愉快。如果你有任何问题或者想要分享你的经验,你可以联系我。