由二次拉格朗日元素组成的三角剖分中顶点的全局编号

计算科学 有限元 网格生成
2021-12-14 04:17:14

也在 Computational Science SE 上问过这个问题

考虑以下矩形的三角剖分(0,a)×(0,b)

在此处输入图像描述

我们有两种类型的三角形:

在此处输入图像描述

我从左下角开始从左到右,从下到上枚举矩形(由两个三角形组成)。三角形的枚举方式如下:A 类型的每个三角形与其对应的单元格具有相同的索引,B 类型的三角形的每个索引都是其对应单元格的索引之和“+细胞总数”。

例如,在上面描述的三角剖分中,左下角的单元格具有索引1并且包含的​​类型 A 和 B 的三角形的索引分别为 1 和 17。

顶点的局部编号显示在第二个图中。从左下角开始,从左到右,从下到上,构建顶点的全局索引。例如,在上面描述的三角剖分中,左下角的顶点有索引1, 它的水平邻居有索引2并且它的垂直邻居有索引6.

如果每个三角形都被认为是线性拉格朗日元素(在顶点处计算),则此索引是合适的。如果我想改用二次拉格朗日元素(顶点评估加上边缘中点评估),我需要如何修改索引?

我想对顶点使用以下本地编号:

在此处输入图像描述

我不清楚我应该如何构建附加节点的全​​局编号(即边缘的中点)。我不确定,但我可以想象编号的选择会以一种关键的方式影响线性方程组(例如,我读过一个增加局部顶点数的元组应该对应于一个全局元组顶点数)。

1个回答

第一种方法:使用稀疏矩阵的模式

您说的是二阶三角拉格朗日有限元,所以我想您熟悉一阶的“”-您知道如何使用线性元素组装由拉普拉斯或泊松方程产生的系统。

对于生成的矩阵,我们通常使用压缩的稀疏(下三角)列格式 CSlC(有关详细信息,请参阅SPARSKIT 文档Harwell-Boeing 稀疏矩阵集合的用户指南)。

首先我们构建矩阵的模式(向量colptrrowind),然后我们组装我们的系统。当一个有矩阵模式时,一个也有中间节点(或肋骨)的编号

考虑以下网格和生成的矩阵模式:

在此处输入图像描述

我们有

colptr={1,3,6,10,11,11,12,12},rowind={1,7,3,4,7,4,5,6,7,5,7}.

为了得到元素(i,j)我们做的CSlC矩阵

for k = colptr[j], colptr[j] + 1, ..., colptr[j+1] - 1
    if (i == rowind[k]) return values[k]

通常三角剖分中的任何顶点的度数约为 6,所以这个操作是O(1).

因此,如果您想获得多个连接顶点的肋骨ij, 只需使用k从上面的算法。在我的图片中,连接顶点 3 和 7 的肋骨的编号为 9。

第二种方法:使用元素的邻居

你说的是相当结构化的网格。实际上,为了处理更复杂的几何图形,我们通常将网格表示为顶点向量 + 元素向量(顶点索引的三元组)。有时存储邻居向量(相邻元素索引的三元组)也很方便。一方面,Mathematica 在其网格抽象中这样做(参见 Scope > “ElementConnectivity”)。我敢打赌,所有流行的网格生成软件工具(例如gmsh)也可以做到这一点。

显然,如果您有邻居,则很容易枚举遍历元素的 ribs。我倾向于在我的项目中使用这种方法,因为我可以接触到邻居。

更新

但我可以想象编号的选择会以一种关键的方式影响线性方程组

实际上,不同的自由度数对应于不同的矩阵模式。但是,如果要使用迭代求解器,则根本不应该关心这一点。

相反,如果想要使用某种基于 LU 分解的稀疏直接求解器,则应该关心自由度的计算,因为它对带宽(因此,内存)有至关重要的影响:CSC 型矩阵的 LU 分解可能是密集的;Skyline 矩阵的 LU 分解保留了稀疏模式。

然而,正如@BillGreene 和@anton-menshov 提到的,有一些算法可以最小化矩阵的带宽(即重新编号自由度)。在组装/选择 DOF 计数时,您不应该关心这一点。