面网格生成算法是所有网格算法的基础
深入理解数值计算网格(3)--非结构化网格生成算法(点击链接查看)
深入理解数值计算网格(2)--结构化网格生成算法(点击链接查看)
以上文章对主要的算法做了大概介绍,本文将重点介绍学习实践方法和技术路线。
算法1:Delaunay三角化以及衍生方法
笔者经常称Delaunay为“德隆尼”,实际应该是“德劳内”
关于Delaunay方法的书比较多,这里介绍一本:
Delaunay Mesh Generation
作者:Siu-Wing Cheng
该书15章近400页,讲述了二维,三维Delaunay方法,以及约束
Delaunay,加权Delaunay方法,还涉及网格加密,质量改进,四面体生成。
该书英文版,主要讲述原理,没有源码,适合数学功底好的同学。如果想快速上手,此书不合适。
笔者最早参考的是这本书,2005年出版的,现在好像已经买不到了:
开源库:
主流的网格库几乎都有对Delaunay算法的实现。所以称其为Delaunay大法好像也不为过。
项目使用推荐两个开源库:Triangle和detri2。这两个开源库代码都过万,而且最早使用的是C语言,控制参数丰富,功能比较齐全,License宽松,可以闭源商用,使用的话要进行必要的封装,避免重复造轮子。
只要是做网格研发,Delaunay方法必掌握
算法2: 波前法
深入理解数值计算网格(3)--非结构化网格生成算法(点击链接查看)
波前法的核心思想就是从几何边界开始往内部插点,所以核心涉及到点位置判断,网格质量评估,网格优化。波前法可以支持三角形,四边形,四面体,六面体等各种单元。如果输入信息有基于BREP的几何信息,更容易得到进行数据的计算。
之前做过介绍,可在www.cae-sim.com 下载 pdf文件查看:
以一个极端的例子说明波前法:
有一个长为10,宽为1的长方形,生成网格长度为2的三角形网格。可以看到不管怎么设置初始边,长度为2的网格必定在长方形外,所以需要判断点是否在多边形内部。也就是每一步都必须要实现迭代,至于是二分迭代,还是其它计算迭代,根据实际情况选择,或者设置参数。
学习资源 Gmsh: http://gmsh.info/
Gmsh工程化做的比较好,适合学习,但License是GPL的,无法闭源商用,使用注意合规。
GMBH是一个特定的德语词汇缩写,代表了“有限责任公司”,注意区分。
波前方是一种比较通用,自动化程度高,但复杂度高的算法。一般的三角化和网格引擎都有实现。做底层网格研发必掌握。
算法3:四叉树/八叉树
关于树的数据结构,早前文章也做过介绍,参考:
工业软件底层技术200个知识点<1-10>(点击链接查看)
以上树结构仅仅用来加速计算,并不用来生成网格。
四叉树适用平面二维网格,八叉树适用三维体网格。四叉树/八叉树实现原理简单,通用性强,适合并行分布式实现。此外八叉树既可以实现六面体,也可以用来生成四面体。
但缺点也非常明显,局部网格质量差,难以调试。进行局部加密时往往也难以保证网格质量。
目前主要在CFD等特定领域实现比较多。
作为通用网格算法,可以了解,不一定要实现。
github上有个不错的开源程序,可以参考:
https://github.com/CMU-CBML/HybridOctree_Hex
在实际网格引擎中,上述三种方法往往同时使用。并且有自适应功能,即根据实际的几何数据选择合适的算法。