在abaqus中⽣成voronoi多⾯体的⽅法
在abaqus中⽣成voronoi多⾯体的⽅法
本⽂转⾃技术邻张磊
这篇⼩⽂旨在介绍在abaqus中⽣成Voronoi凸多⾯体的⽅法,在模拟晶体或类似结构时,经常需要⽣成许多相互连接的Voronoi 多⾯体,如图1所⽰。通常⽅法是利⽤MATLAB或是其他软件⽣成多⾯体的空间结构,然后导⼊abaqus进⼀步处理。此外还有国外学者开发的neper及其衍⽣软件可以使⽤,不过该软件⽬前仅⽀持Linu x操作系统,⽽且往往需要⽤户做进⼀步的开发才能满⾜该⽤户特定的需求,对于使⽤者的编程能⼒要求较⾼。
英语图表作文
图1Voronoi多边形⽰意图
其实⽣成Voronoi多⾯体这⼀过程不需借助第三⽅软件,在abaqus中合理利⽤脚本也可以实现。Abaqus常⽤的脚本语⾔是Python,Python是⼀种简单易学的编
程语⾔,⽽且abaqus脚本学习起来也很轻松,因为⽤户在abaqus的图形界⾯⾥每做⼀个操作,rpy⽂件就会记录下对应的脚本命令(⼀些特殊的操作除外),再配合上h elp⽂档的详细说明,很多新⼿也可以在短时间内运⽤脚本来解决⼀些仿真中⽐较繁琐的问题。
Python库Scipy提供了现成的Voronoi类,和MATLAB⾥的函数⼀样,可以提供voronoi各个单元的空间点坐标,有关Voronoi类的调⽤,所需变量及其属性,可参考如下,其中属性部分我⽤中⽂做了介绍:
scipy.spatial.Voronoi(points,furthest_site=Fal,incremental=Fal,qhull_opti ons=None)
Parameters:points:ndarray of floats,shape(npoints,ndim)
Coordinates of points to construct a convex hull from
furthest_site:bool,optional
Whether to compute a furthest-site Voronoi diagram.Default:Fal incremental:bool,optional
cbestAllow adding new points incrementally.This takes up some additional resources. Qhull_options:str,optional
Additional options to pass to Qhull.See Qhull manual for details.(Default:“Qbb 4and“Qbb Qc Qz”otherwi.Incremental mode omits“Qz”.)
注:对于⼀般⽤户,只需要注意points参数即可,代表voronoi的种⼦点,可以是N维数组,只不间上的意义了。(在我们这个宇宙是这样的,对于⾼维宇宙可能并不成⽴^_^)
Attributes points(ndarray of double,shape(npoints,ndim))Coordinates of input point 核⼼点坐标,n⾏2列的数组
vertices(ndarray of double,shape(nvertices,ndim))Coordinates of the Vorono
click2pay
emery多边形顶点的坐标,n⾏2列的数组,只标出有限的顶点,处于⽆限远的顶点不会标出
ridge_points(ndarray of ints,shape(nridges,2))Indices of the poin Voronoi ridge lies.
输出的是点信息,每条voronoi边所处的两个核⼼点的序号
ridge_vertices(list of list of ints,shape(nridges,*))Indices of the Vor each Voronoi ridge.
多边形每条边的端点序号,如果端点是⽆限远,那么序号就是-1
regions(list of list of ints,shape(nregions,*))Indices of the Voronoi vert region.-1indicates vertex outside the Voronoi diagram.
给出了每个多边形的端点信息,如果端点是⽆限远,那么序号就是-1,有多个⽆限远端点的,都
dog days are overpoint_region(list of ints,shape(npoints))Index of the Voronoi region If qhull option“Qc”was not specified,the list will contain-1for points tha a Voronoi region.
对于每⼀个输⼊点,给出其对应的region序号
divina注:
ridge_vertices这个属性的名字有⼀定误导性,对于2维voronoi来说,这个属性指的是边上的来说,这个变量实际上指的是⾯上的顶点序号,对于N维voronoi⽽⾔,这个变量指的是N-1
insurancepolicy
参考出处:
/doc/ca446817c381e53a580216fc700abb68a982ad71.html
.
pl/~pbechler/scipy_doc/generated/scipy.spatial.Voronoi.ht 介绍完voronoi类后,我们就可以愉快地使⽤它了,在使⽤之前,⾸先需要⽣成
voronoi多⾯体的种⼦点,通常种⼦点是空间上随机分布的点,不过如果我们对种⼦点施加⼀定的控制,可以⽣成很多有趣的空间形状,⽐如蜂窝状的空间结构。⽣成种⼦点后,将种⼦点坐标代⼊类中,就可以建⽴⼀个voronoi类了。随后就可以把这个voro noi类的信息转化为⼏何信息,利⽤abaqus的建模功能,⽣成voronoi多⾯体实体(也就是软件脚本语⾔中的cell对象)。
Abaqus提供了从点到线到⾯到体的⽣成过程,⽣成voronoi多⾯体的过程就很好地体现了这⼀点:
1.通过ridge_vertices属性,可以获知⼀个⾯上的顶点序号(贴⼼的是,这个属
性提供的点是按照点的相连顺序排布的,⽽不是乱序,这⼀点⾮常重要),⽽通过顶点序号,就能从vertices属性中获知该点的坐标。
2.由此就可以⽣成voronoi某个多⾯体中的⼀个⾯的各条边:使⽤脚本命令Wir
ePolyLine将该⾯的各点顺次连接⽣成⼀个空间上的多边形线框。
3.然后使⽤geometry edit的cover edges功能将线框围住的区域⽣成1个sh
ell,这个shell就是多⾯体中的⼀个⾯了。
4.对于该多⾯体中的其他表⾯,也可以如法炮制,直到⽣成这个多⾯体的全部外
表⾯。然后再使⽤creat solid—>from shell功能(对应的脚本⽅法为AddCell s),即可⽣成该多⾯体。这就是点—>线—>⾯—>体⽣成voronoi多⾯体的过程。视频 英文
下⾯我⽤⼀个配图例⼦来说明⼀下以上过程:
⾸先,在空间内建⽴⼀个⾯上的顶点—边线关系,为了尽可能简单,我们采⽤三⾓形线框来构成⼀个⾯,⽣成三⾓形线框步骤如下:
1.使⽤creat wire功能,输⼊各个点的坐标,⾸尾相连(选择chained wires)形成⼀个三⾓形,点击ok即可⽣成线框:
图2由点⽣成线框2.再将另外三条棱边输⼊,获得四⾯体的各条棱边:
图3补全四⾯体的全部棱边
3.使⽤Geometry edit⼯具中的Cover Edges功能,依次封闭各个线框:
图4封闭线框为壳体
封闭后的壳体如下图所⽰,为了表⽰清楚,这⾥做了⼀个剖⾯:知道的英文
图5壳体⽰意图
4.使⽤create solid:from shell功能,将壳体填充成实体:
lastfriday图6由壳体⽣成实体
填充后的实体如下图所⽰,为了显⽰⽅便,下图依旧使⽤了⼀个剖切⾯:
图7实体⽰意图
⾄此,由点坐标信息⽣成实体的过程就结束了,相应的Python脚本请见附件,将该脚本复制后粘贴⾄下图的命令⾏接⼝中,即可获得图⽰的四⾯体模型。利⽤这种思路,我们可以在空间中⽣成任意的凸
多⾯体。⽆论⼀个Voronoi多⾯体有多么复杂,利⽤脚本就可以⽅便地⽣成它。
在⽣成过程中,可以利⽤脚本,将不同的⼏何元素添加到t之中,⽅便后续赋予材料属性,添加约束或者接触,撒布种⼦点等等功能。通过使⽤t,从理论上说,使⽤者可以对每⼀个点,每⼀条边,每⼀个⾯和体进⾏控制,这是neper做不到的。
值得注意的是,voronoi类的属性提供了三种类型的顶点:1)整个voronoi多⾯体的全部顶点vertices;2)各个⾯上的顶点
ridge_vertices;3)各个体上的顶点reg ions。并没有提供哪些⾯是属于哪⼀个体的,这⼀点需要⽤脚本对坐标序号进⾏筛选判断,把⾯和体匹配起来,才能实现上述功能。
最后附上成品效果图和脚本,CAE附件: