这篇小文旨在介绍在abaqus中生成Voronoi凸多面体的方法,在模拟晶体或类似结构时,经常需要生成许多相互连接的Voronoi多面体,如图1所示。通常方法是利用MATLAB或是其他软件生成多面体的空间结构,然后导入abaqus进一步处理。此外还有国外学者开发的neper及其衍生软件可以使用,不过该软件目前仅支持Linux操作系统,而且往往需要用户做进一步的开发才能满足该用户特定的需求,对于使用者的编程能力要求较高。
图1 Voronoi多边形示意图
其实生成Voronoi多面体这一过程不需借助第三方软件,在abaqus中合理利用脚本也可以实现。Abaqus常用的脚本语言是Python,Python是一种简单易学的编程语言,而且abaqus脚本学习起来也很轻松,因为用户在abaqus的图形界面里每做一个操作,rpy文件就会记录下对应的脚本命令(一些特殊的操作除外),再配合上help文档的详细说明,很多新手也可以在短时间内运用脚本来解决一些仿真中比较繁琐的问题。
Python库Scipy提供了现成的Voronoi类,和MATLAB里的函数一样,可以提供voronoi各个单元的空间点坐标,有了voronoi类后,我们就可以愉快地使用它了,在使用之前,首先需要生成voronoi多面体的种子点,通常种子点是空间上随机分布的点,不过如果我们对种子点施加一定的控制,可以生成很多有趣的空间形状,比如蜂窝状的空间结构。生成种子点后,将种子点坐标代入类中,就可以建立一个voronoi类了。随后就可以把这个voronoi类的信息转化为几何信息,利用abaqus的建模功能,生成voronoi多面体实体(也就是软件脚本语言中的cell对象)。
Abaqus提供了从点到线到面到体的生成过程,生成voronoi多面体的过程就很好地体现了这一点:
1. 通过voronoi类,可以获知一个面上的顶点坐标(贴心的是,顶点是按照点的相连顺序排布的,而不是乱序,这一点非常重要)。
2. 由此就可以生成voronoi某个多面体中的一个面的各条边:使用脚本命令将该面的各点顺次连接生成一个空间上的多边形线框。
3. 使用geometry edit的cover edges功能将线框围住的区域生成1个shell,这个shell就是多面体中的一个面了。
4. 对于该多面体中的其他表面,也可以如法炮制,直到生成这个多面体的全部外表面。然后再使用creat solid—>from shell功能,即可生成该多面体。这就是点—>线—>面—>体生成voronoi多面体的过程。
下面我用一个配图例子来说明一下以上过程:
首先,在空间内建立一个面上的顶点—边线关系,为了尽可能简单,我们采用三角形线框来构成一个面,生成三角形线框步骤如下:
1.使用creat wire功能,输入各个点的坐标,首尾相连(选择chained wires)形成一个三角形,点击ok即可生成线框:
图2 由点生成线框
2.再将另外三条棱边输入,获得四面体的各条棱边:
图3 补全四面体的全部棱边
3.使用Geometry edit工具中的Cover Edges功能,依次封闭各个线框:
图4 封闭线框为壳体
封闭后的壳体如下图所示,为了表示清楚,这里做了一个剖面:
图5 壳体示意图
4.使用create solid:from shell功能,将壳体填充成实体:
图6 由壳体生成实体
填充后的实体如下图所示,为了显示方便,下图依旧使用了一个剖切面:
图7 实体示意图
至此,由点坐标信息生成实体的过程就结束了,相应的Python脚本请见附件,将该脚本复制后粘贴至下图的命令行接口中,即可获得图示的四面体模型。利用这种思路,我们可以在空间中生成任意的凸多面体。无论一个Voronoi多面体有多么复杂,利用脚本就可以方便地生成它。
在生成过程中,可以利用脚本,将不同的几何元素添加到set之中,方便后续赋予材料属性,添加约束或者接触,撒布种子点等等功能。通过使用set,从理论上说,使用者可以对每一个点,每一条边,每一个面和体进行控制,这是neper做不到的。
值得注意的是,voronoi类的属性提供了三种类型的顶点:1) 整个voronoi多面体的全部顶点vertices;2) 各个面上的顶点ridge_vertices;3) 各个体上的顶点regions。并没有提供哪些面是属于哪一个体的,这一点需要用脚本对坐标序号进行筛选判断,把面和体匹配起来,才能实现上述功能。
最后附上成品效果图和脚本,CAE附件:
图8 Voronoi示意图,图中两种不同的颜色表示两种不同的材料
图9 对图 8中的Voronoi多面体进行网格划分
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删