目录
第一章 生成windows系统可执行文件tetgen.exe
第二章 tetgen基于windows系统下的使用步骤
第三章 POLY文件的编写规范
第四章 简单介绍tetgen生成的文件
第一章 生成windows系统可执行文件tetgen.exe
Step1:打开Visual Studio(简称VS)
Step2:新建一个win32 console application,记住文件放置的路径(下图中的位置)并且将项目命名为tetgen,命名结束后点击确定按钮
Step3:点击下一步(不要点击完成),在新出现的界面中的附加选项下选择空项目,然后点击完成
Step4:左边资源管理器中会出现一个tetgen项目,鼠标右键点击其下方源文件, 选择添加,选择现有项
Step5:找到tetgen-master文件的位置,(按住ctrl键)选择tetgen.h,tetgen.cxx,predicates.cxx三个文件后点击添加
Step6:鼠标右键点击项目tetgen,选择生成
Step7:在输出部分出现以下文字,说明tetgen.exe生成成功
Step8:在Step2中项目tetgen所在的路径下,将会有一个含有Debug文件夹的tetgen文件夹,生成的tetgen.exe文件就在Debug文件夹下
第二章 tetgen基于windows系统下的使用步骤
Step1:新建一个文件夹
Step2:将tetgen.exe和filename.poly文件放入文件夹中
Step3:打开Anaconda Prompt()或者终端并依次运行以下命令,运行后会出现四个文件,分别储存着边信息(edge),单元信息(ele),点信息(node),面信息(face)
代码语言:javascript复制cd xxx # 跳转到该文件夹的相对路径
tetgen -pq1.4Aa filename.poly
第三章 POLY文件的编写规范
POLY文件是用户唯一需要自行编写的文件,tetgen软件会根据用户编写的POLY文件生成用户所需要的网格,POLY文件的编写规范并比较复杂,比较建议查阅tetgen官方说明书,或者刘杨师姐编写的tetgen说明,下面我将给出POLY文件最简单的编写格式。
POLY文件是一种文本文件,分为点,面,洞,区四个部分,如图所示。
注:POLY文件的注释符是”#”。
Part1:点列表
在列表的第一行将对点列表进行一个事先的声明,具体格式如下:
代码语言:javascript复制<点的个数> <维数> <属性个数> <边界标记>
点的个数显然应该取大于等于4的整数。tetgen软件暂时只能对三维物体进行网格剖分,所以维数只可以取3。属性个数不重要,取0。边界标记应当为0或者1,0表示关闭边界标记,1表示开启边界标记,开启边界标记之后生成的NODE文件中会表明所有点是属于哪一种边界(或者内部点)。所以实际使用时的格式如下:
代码语言:javascript复制<点的个数> 3 0 <边界标记>
假设有n个点,那么之后的n行将分别记录这n个点的坐标信息,如果打开了边界标记还需要加上一个表示属于哪个边界的值,具体格式如下:
代码语言:javascript复制<点的序号> <x轴坐标> <y轴坐标> <z轴坐标> <第几个边界>
值得注意的是,如果开启了边界标记,那么每一行会有五个数字,否则将省去最后一个数。而且点的个数一定不能写错,否则tetgen将报错。
Part2:面列表
在列表的第一行将对面列表进行一个事先的声明,具体格式如下:
代码语言:javascript复制<面的个数> <边界标记>
面的个数显然应该取大于等于4的整数。边界标记应当为0或者1,0表示关闭边界标记,1表示开启边界标记,开启边界标记之后生成的FACE文件中会表明所有面是在哪一个边界上(或者内部)。对每一个点的描述都只有一行,但是面的描述比对点的描述要复杂的多,对于一个面的描述至少需要两行。其中第一行是对这个面属性的一个声明,具体格式如下:
代码语言:javascript复制<圈的个数> <洞的个数> <第几个边界>
假设t = 圈的个数a 洞的个数b,表示之后的t行表示的是同一个面,前面a行表示这一个面有a个圈,之后的b行表示其中什么地方是洞。例如下面的这个图,我们就需要三个圈(六边形,四边形,三角形)以及两个洞来表示.
描述圈的文本行内,第一个数表示这个圈内有几个点,剩余的数依次是点的标号。需要注意的是,所有的点需要在同一个平面上,且顺序不能出错(线段与线段之间不能有交叉的情况),圈的具体格式为:
代码语言:javascript复制<点的个数#> <第1个点的标号> <第2个点的标号> ... <第#个点的标号>
描述洞则是通过一个点的坐标,我们还是以上面的图例来进行说明,图中有两个洞,我们只需写出洞中任意一个点的坐标即可。具体格式如下:
代码语言:javascript复制<洞的序号> <x轴坐标> <y轴坐标> <z轴坐标>
Part3:洞列表
简单的器件一般用不到这一个列表。假如我们所求的区域是一个类似于保险箱(或瓶子)的结构,不需要中间空洞的部分或者是不用对中间的某个区域进行网格剖分时,我们就需要编写这一个列表。该列表是通过给出洞内的任意一点的坐标,来告诉tetgen洞的区域。第一行给出洞的个数:
代码语言:javascript复制<洞的个数>
显然,如果没有洞的话,该列表只需要一个0。如果有洞的情况则需要依次给出每个洞内的任意一个点的坐标。之后每一行的具体格式如下:
代码语言:javascript复制<洞的序号> <x轴坐标> <y轴坐标> <z轴坐标>
Part4:区列表
例如我们要对PN结进行网格剖分,我们就将分为两个区。亦或是我们想对其中一个区进行更密集的网格剖分,我们也是需要分区。第一行给出区域的个数:
代码语言:javascript复制<区域个数>
显然,如果不想分区的话,该列表只需要一个0。如果有分区的情况则需要依次给出每个区域内的任意一个点的坐标。之后每一行的具体格式如下:
代码语言:javascript复制<区域序号> <x轴坐标> <y轴坐标> <z轴坐标> <区域标记> <最大体积限制>
区域标记将会使得生成的ELEM文件每一行的最后一项,会在ELEM文件中显示每一个单元所在的是哪一个区域。而最大体积限制则是限制了单元的最大体积,同样的区域内,该值越小,分割的单元就越多越密。
第四章 简单介绍tetgen生成的文件
编写完POLY文件后,使用tetgen能生成NODE, ELEM, FACE, EDGE等四个文本文件,以NODE, ELEM文件为主。
Part1:NODE文件
在这个文件内,我们能够获取到每一个点的坐标。该文件的第一行分别记录了总节点个数、维度、属性个数、是否有边界标记,这和我们编写的POLY文件中点列表的第一行非常相近,唯一的不同就是点的数量被tetgen扩充了。而之后的每一行则分别记录了点的序号、点的x轴坐标、y轴坐标、z轴坐标,如果我们在POLY文件中的点列表第一行开启了点的标记,那么每一行的最后还会显示出点是否是边界点。
关于这最后一个数,它会与POLY文件中点列表、面列表的边界标记有关。如果你的POLY文件编写的很好,这个数能告诉你这个点属于哪一个面,或者说你能根据这个数判断出这一个点属于什么边界条件。当然,如果你还不能完全掌握POLY文件的编写规则,也可以在利用自己编写的程序根据点的坐标做出判断(虽然速度可能会慢一些,但是出现的bug会少一些)。
特别地,如果最后一个数为-1,表示tetgen不知道这个点属于的是哪一种边界,很可能是因为这个点处于两个边界的交界处,这个时候就需要另外根据自己的要求写程序对这一类点进行边界判断。如果最后一个数为0,表示这个点是一个内部点。
Part2:ELEM文件
在这个文件内,我们能够获得每一个四面体单元的四个顶点的序号,该序号即为NODE文件中的点序号。该文件的第一行分别记录了总单元个数、每个单元由几个点构成、是否有边界标记。因为暂时tetgen只能生成四面体网格,所以第二个数都会显示4。而之后的每一行则分别记录了单元序号、四个点的序号,如果我们在POLY文件中的区域列表对模型进行了分区,那么每一行的最后还会显示出该单元所在的区域。
Part3:FACE、EDGE文件
在这两个文件内,我们能分别知道边界上的每一个面或是每一条边的构成,表示方式和ELEM文件类似。如果有边界标记,标记与POLY文件的面列表中的边界标记有关。