网格生成软件——Easymesh使用说明

这是一个提供二维区域Delaunay三角形剖分的 C语言程序。能够对于由折线围成的多空洞、多介质区域,生成指定局部加密的Delaunay三角形剖分。使用的方法和基本步骤是:

(1) 首先要在 或者 5.0编辑器上生成执行程序 EasyMesh.exe。注意,编辑的结果是生成三个文件EasyMesh.dsp,~.ncb,~.plg和一个子目录Debug。而且在Debug中生成七个文件,而其中最关键的是执行程序EasyMesh.exe。

(2) 然后,将等待进行三角形剖分的区域边界节点"链"(按逆时针顺序排列)、内部空洞边界节点"链"(按顺时针顺序排列),介质分界线,需要局部加密的点、线、区,等等目标和要求,逐一地编制输入(Input)的数据文件filename.d 。

(3)在MDOS窗口下,运行EasyMesh, 采用下面的命令

C:\Triangulation\Debug >EasyMesh filename [options]

结果生成四个Data文件:

三角单元filename.e ,节点坐标文件filename.n ,线元文件filename.s ,以及三角形剖分的Tecplot 图形数据文件filename.t 。其中最后的文件可以用来直接在图形软件Tecplot7.0上绘出区域的Delaunay三角形剖分图。

其中开关项 [option] 可以省缺。若为 -d就仅仅生成边界的三角形剖分。+dxf 则生成Delaunay 三角形剖分和Voronoi凸多边形的对偶图形文件。

(这里应当说明,Tecplot7.0是一个当前PC个人计算机上很好的数值计算和计算机模拟的绘图软件,特别是对于计算流体力学和偏微分方程数值解的研究工作,是难得的应用软件。但是,目前还不是Free的。)

自行编制一个截取、分离上述数据文件中的有关数据的程序。通过运行该程序来得到构成有限元方法,或者有体积方法需要的Data数组。

作为一个简单的例子,我们考虑如图 1 的内部含有孔洞的区域

图1、待分割区域 

 

首先需要编制输入文件 example.d:

#-------------------------#

#Example #

#--------------------------#

#------------------- #

# POINTS # //#_____________#表示注释

#--------------------#

# number of points#

0: 0.0 0.0 0.25 1

1: 5.0 0.0 0.25 2

2: 5.0 2.0 0.25 2

3: 4.0 3.0 0.25 3

4: 0.0 3.0 0.25 3

5: 1.0 1.0 0.1 4

6: 1.0 2.0 0.1 4

7: 2.0 2.0 0.1 4

8: 2.0 1.0 0.1 4

#---------------------#

# SEGMENTS #

#---------------------#

0: 0 1 1

1: 1 2 2

2: 2 3 2

3: 3 4 3

4: 4 0 3

5: 5 6 4

6: 6 7 4

7: 7 8 4

8: 8 5 4

在输入文件中,节点的第四列指明三角元的边长、第五列和线段的第三列是标志值。

接下来在MSDOS下运行

EasyMesh examlpe

图2、三角形符号表示

我们得到:

exampe.e 其中

l 第1行: Number of elements

l 其它行:serial number i j k ei ej ek si sj sk xv yv marker

l 末两行:注释

exampe.n 其中

l 第1行:Number of nodes

l 其它行:serial number x y marker

l 末两行:注释

example.s为线元数据文件。

l 第1行:Number of sides

l 其它行:serial number c d ea eb marker

l 末两行:注释

其中的注释行,就是上面我们已经在各个数据文件中"其它行"一栏所指。

     图3、生成网格

 

最后,我们可以利用绘图文件example.t在Tecplot7.0上,通过打开这个数据文件直接得到非常漂亮的三角形剖分图,如图 3 所示。

3 三角形剖分的结果 应当指出,在 example.e 三角形单元数据文件中,每一行有13列数据:

8: 4 6 9 13 9 5 17 16 12 4.976718248931231e-001 1.365972984309878e-001 1

冒号前的第1个数是三角单元的序号,2-4列是三个节点的节点序号,5-7列是三个相临单元的序号(注意,ei 单元是对向 i顶点的),8-10列是相应的三边的线元序号。11-12列是三角单元的外接圆圆心的坐标值,它表示成双倍字长的浮点数。最后一列是标记,一般情况下,1表示该单元是边界元。0 表示是内部单元。

在我们需要利用它们进行有限元方法,或者有限体积方法的数值计算前,必须将上述复合的数据进行分离和截取,生成三角单元、节点、线元的相应数组。简单的方法是利用READ语句,例如

C Define arrays about elements

NNODE(0: NE,0: 2)

NELEMENT(0: NE,0: 2)

NSIDE(0: NE,0: 2)

XCIRCLE(0: Ne)

YCIRCLE(0: Ne)

C Open the outputfile example.e

OPEN(10,file=example.e)

READ(10,100) # 跳过一行 #

DO N=0, Ne READ(10,200)I, J, K, Ie, Je, Ke, Is, Js, Ks, X, Y

NNODE(N, 0)=I

NNODE(N, 1)=J

NNODE(N, 2)=K

NELEMENT(N, 0)=Ie

NELEMENT(N, 1)=Je

NELEMENT(N, 2)=Ke

NSIDE(N, 0)=Is

NSIDE(N, 1)=Js

NSIDE(N, 2)=Ks

XCIRCLE(N)=X

YCIRCLE(N)=Y

ENDDO CLOSE(10)

100 FORMAT(X5)

200 FORMAT(6X, 3(I 4,1X),1X,3(I 4,1X),1X,3(I 4,1X),1X,2(E21.17))

线元的输出数据文件 example.s 的每一行有六列。譬如

11: 7 3 6 -1 3

特别应当指出的是数据的第4、5列为线元两则的三角形单元序号,如果出现 -1,则表示这是边界线元。相应 -1 序号的三角形单元已经不存在,因为是区域边界外面。