如果存在两个最长边,如何细化四面体?

计算科学 网格
2021-12-11 02:16:10

在一些细化四面体的算法中,我们需要计算最长边。

背景

如果存在一个带节点的四面体ABCD,它就有边AB,AC,AD,BC,BD,CD

假设AB是最长边,E 是边 的中点AB,则四面体可以分裂为两个四面体,即BCDEACDE

我的问题是,如何处理具有许多最长边的情况?

为了展示更多细节:

假设存在两个四面体ABCPABCQ它们共享面ABC

假设AB=AC它们是每个四面体中最长的边。

如果ABCP选择AB分裂又ABCQ选择AC分裂,网格将不兼容,会导致有限元计算出错。

如果ABCP选择AB拆分ABCQ也选择AB拆分,网格仍然兼容。

那么如何确定ABCPABCQ选择相同的边进行分割呢?

异常情况如何处理?

2个回答

最简单的事情是确保一个一致的(尽管是任意的)打破平局的方案。如果您的节点/顶点被索引,这通常意味着首选具有最低顶点索引的分割边。如果边共享相同的最低索引顶点,则检查另一个顶点并选择具有最低索引的那个。

因此,在您的情况下,对顶点进行成像的索引使得A<B<C. 更糟糕的是,想象一下AB=BC=AC,算法可以选择在两个四面体之间分割共享三角形的三个边中的任何一个。现在边缘ABAC将优先于BCsince A<B然后AB是首选,AC因为在看到它们共享最低顶点之后,比较另一个顶点(和B<C)。

两个四面体都将执行相同的检查并得出相同的结论:AB是分割的首选部分。

重要的是每个四面体具有相同的顶点坐标(理想情况下,索引到保存顶点坐标的相同数据结构中)并执行相同的浮点精度计算以在进入平局步骤之前比较长度。如果计算长度的方式有任何细微差别,浮点不一致可能会阻止平局。

对于更一般的情况,简单性模拟是处理这些几何比较中的退化/平局的框架。

埃德尔斯布伦纳,赫伯特;Mücke,Ernst Peter简单模拟:一种在几何算法中处理退化情况的技术,ACM Trans。图形。9, No. 1, 66-104 (1990)。ZBL0732.68099

亚历克斯爵士已经给出了一个绝妙的答案。

我只是添加了一些关于如何在分布式案例中使用 Alex 爵士的建议的评论。

如果算法是分布式的。例如ABCPABCQ分别存储在不同的进程中,A,B,C,P,Q这里是节点的全局索引。

假设ABCP存储在进程 0 中,其本地索引为0,1,2,3

假设ABCQ存储在进程 1 中,其本地索引为0,2,1,3

我们可以看到人脸ABC在每个过程中都有不同的索引顺序。在进程 0 中,A<B<C,但在进程 1 中,A<C<B

除非可以保证节点索引顺序,否则我们不应该使用本地索引来进行细化过程。如果无法保证索引顺序,则首选全局索引。

但是,有时计算全局索引有很大的开销。

我们可以ABC在运行时通过坐标给出索引。一旦我们可以获得坐标的比较规则,我们就可以为节点提供索引。Follow 是比较规则的一个示例。

首先,我们可以比较x坐标。如果x1>x2这样node1 > node_2然后比较y坐标,最后比较z坐标。