如何从顶点生成人脸列表?

计算科学 计算几何 有限体积 网格生成 数据结构
2021-12-08 08:29:02

我在编写玩具有限体积 CFD 代码方面有一点背景。在二维笛卡尔场景中,我通常采用xmin, , ,中的点数来计算然后,我计算单元中心并组装一维单元阵列。为了执行现场操作,我遍历这个单元格数组,将项目存储在节点中心并根据需要插入到面。xmaxyminymaxxyΔxΔy

在研究更高级的项目时,我发现基于人脸的数据结构在保护、灵活性和边界条件的应用方面具有优势。

我的问题:对于笛卡尔二维域,如何从顶点坐标数组生成面列表?这些面应组成四边形单元。这可以明确地完成吗?

显然,我可以创建一个非常简单的 2D 笛卡尔网格Gmsh,但随后我必须读取网格并解析文件。我最终可以编写这个功能,但是为了我自己的启迪,我想快速探索一个基于人脸的代码。

1个回答

与计算中的许多问题一样,很多问题都归结为您要实现的目标。对于四边形上的结构化网格,处理此问题的最佳和最有效的方法是不要像您所建议的那样打扰和隐式工作(有点建议)。如果您的以单元格为中心的变量具有索引对 (i,j),那么您可以将面朝左/右(取决于您的编号和边界条件)标记为 (i,j),朝上/朝下标记为 (i,j)并将两个列表分开。如果您正在研究有时称为Arakawa C 网格的东西,那么这也会分别为您提供 U 和 V 变量的索引。

当您的网格真正是非结构化的时,这会变得更有趣。在这种情况下,您可能正在从一组从元素/单元索引到顶点索引的映射构建整个拓扑。事实上,这就是像 GMSH 这样的网格划分程序从根本上为您提供的。对于结构化网格,如有必要,您可以作弊,例如以螺旋状向外编号单元和顶点。一个相当简单的算法来获得面部邻居对是这样的:

  1. 通过扫描单元列表一次,构建从顶点/节点到单元/元素的映射K
  2. 对于单元格,按顺序围绕边缘工作。m
  3. 对于每条边,识别两个顶点p1p2
  4. 对于所属的每个单元格,检查是否也属于它。您找到的第一个不是的是邻居。如果 <,那么这是你第一次找到这张脸。Kp1p2mmn

再说一遍,这对于结构化网格来说是多余的。