转载至:[https://www.jishulink.com/content/post/331773]
在使用python脚本处理abaqus 仿真分析的模型时,一个不可避免的问题就是选取各种几何元素并为之赋予集合,以满足材料赋予、种子点指定、载荷/边界条件/约束/接触等操作的需求。赋予集合这一过程本身并无太多难度,但是几何选取,尤其是复杂模型的几何选取,有时会让二次开发者颇费一番周章。
本贴针对abaqus支持的几何元素选取方法做一个梳理汇总,对其应用范围和注意事项进行说明,以期对各位二次开发者有所帮助。
1.Abaqus中支持的几何元素的种类
如图所示,abaqus中支持的主要几何元素有:cell(体)、edge(边)、face(面)、vertex(顶点)、interesting points(关注点,包含三种:边中点、弧中点和弧圆心),reference point(参考点),以及由虚拟拓扑压缩掉的点线(ignored vertex/edge)。我们日常工作中常用的几何元素都可以全面覆盖到了。同种几何元素组成的序列,abaqus中专门称之为geometry sequence对象,是一种类似list的数据结构。生成Set时使用的几何元素,实际上就是这种几何元素的序列,哪怕这个序列里只有一个元素。
2.几何元素捕捉
2.1.通过序号捕捉
通过序号捕捉其实有两种方法。
第一种是经典的index方法,一类几何元素中的每个元素都有一个唯一的序号值,这个序号值可能和空间结构有些关系,也可能没有太多关联,而且在几何模型发生变化后(比如做了一个partition),这些序号可能发生变化,因此当你的模型是静态的,不会再加入新特征,使用index来捕捉几何元素还不失为一种方法。
实际使用中,因为我们很难事先知道一个几何元素的index,所以一般不直接凭空使用index来指定元素,往往是配合其他命令产生的index来寻找几何元素,例如,cell对象有一个方法是getFaces(),这个方法可以返回一个cell上所有面的index,利用这种方法就可以很轻松地找到包围一个体的所有面。
使用index寻找几何元素方法的语句非常简单,和list的使用方法完全一致,可以单独指定一个index,也可以进行切片操作:
mdb.models[name].parts[name].edges[i]
mdb.models[name].parts[name].edges[1:100]
第二种方法是第一种方法的抽象版,abaqus里的journalOption 对象里面把这种方法称之为COMPRESSEDINDEX,顾名思义,可以理解为一种压缩后的index,用一串字符串来代表一系列的index。下面用实例来比较一下index和COMPRESSEDINDEX:
Index:
cells=c[4:5]+c[6:7]+c[14:15]+c[16:18]+c[19:20]+c[31:34]+c[36:37]+c[40:41]+
c[42:43]+c[51:52]+c[54:55]+c[63:64]+c[65:66]+c[69:70]+c[80:81]+c[84:85]+
c[88:89]+c[92:93]+c[100:101]+c[102:103]+c[104:105]+c[112:113]+c[114:115]+
c[119:120]+c[124:125]+c[126:127]+c[132:133]+c[137:138]+c[141:142]+
c[146:147]+c[151:153]+c[163:164]+c[166:167]+c[170:171]+c[173:174]+
c[175:176]+c[177:178]+c[181:184]+c[185:186]+c[187:188]+c[189:192]
COMPRESSED INDEX:
cells = c.getSequenceFromMask(mask=(’[#800b4050 #80480513 #11110022 #50850150 #1842210 #eae2a448 ]’, ), )
从例子中可以看出,index方法傻傻地把一些index的切片加起来,而getSequenceFromMask方法可以仅用一串mask字符串指代这些切片。getSequenceFromMask的坏处是:代码可读性很差,没办法知道这一串mask字符到底指代的是哪些index。
因此,在实际使用中,很少有人自己去编写这串字符串,往往是照搬那些从rpy里转过来的脚本语句,当你的脚本处理的几何体相对固定,而几何体的数量又较大,用index或其他方法一时表示不清楚几何体时,可以使用这种mask字符串的方法。当然,abaqus也提供了一种由几何元素反推mask的方法:getMask(),提供了一种生成mask字符串的简单方法。
如果事先知道想捕捉的几何元素的序号或mask字符串,而且捕捉后几何模型也不会发生变化时,用序号或者抽象化序号捕捉几何元素是非常方便的。不过实际使用中我们往往并不事先知道序号,几何模型也经常变化导致序号发生变化,因此,用序号捕捉几何体的应用受到了很大限制。
2.2.通过空间所占位置捕捉
空间位置捕捉几何元素的方法,可以分为两种:findAt方法和其他方法。
findAt方法可以通过点坐标来捕获单独的几何元素或几何元素序列,具体取决于提供给它的参数是一个简单的只包含三个坐标的tuple(元组),还是一个包含有多组坐标点的tuple,即tuple的tuple。使用findAt需要注意的是一定要让给出的点坐标仅属于一个几何体,不要提供公共点的坐标,否则findAt函数会给出不确定的答案。
例如寻找边线时,最好用边线的中点,而不是端点,因为一条边线的端点往往也是另一条边线的端点,无法保证唯一性。6.11之前的版本findAt功能在搜索几何元素序列时,语法较为繁琐,且和帮助文档描述不太相符。6.14之后的版本则友好了很多。在找准点的前提下,findAt功能十分好用,符合人的空间想象,不像index那样不直观。findAt功能便于编程实现,代码可读性也较好。但是当需要寻找的几何元素非常多时,这种“坐标点——几何元素”的一一对应关系会像index方法一样,有些繁琐。
此时就需要“其他方法”的登场。Abaqus提供了利用空间立方体、圆柱体、球体框选几何元素的函数,如下图红框所示。框选后得到的都是几何元素序列,哪怕只框到了一个几何元素。值得注意的是,abaqus还提供了一个框选函数的反函数,即图中绿框内的getBoundingBox(),此函数可以获得一个刚好能包裹住几何元素的立方体。常用的场合有:添加外流场,添加颗粒增强复合材料的基底材料等等。
框选函数可以方便的框取大量几何元素,但是也容易“多管闲事”,因为只要是在框内的几何元素都会被框取进来,其中有些元素可能不是我们想要的。遇到这种情况,要么需要精心选取框选的类型和大小,要么就得回到findAt的老路上去,findAt虽然略微繁琐,但是也胜在灵活,几何元素必有可以唯一标识的点,只要能把所有标识点找到,几何元素也就找到了。而几何元素序列类似list的特性,可以让你轻松地用一个“+”号把多个序列拼接起来。
2.3.通过几何元素相互关系捕捉
正常情况下,几何体中的“点、线、面、体”都不是孤立存在的,而是有相互关联,通过一条线可以找到“使用”这条线的若干个面,通过一个面又能找到围成这个面的所有的边线, 等等。“高级”几何元素,例如cell,可以找到自身的所有表面,边线,顶点。而相对“低级”的顶点,则只能反推自己的上一级几何元素,按照家族图谱来理解,其实可以这么类比:爷爷直接知道自己的所有儿辈和孙辈,而孙辈只直接知道自己的父辈,不能直接获取自己的爷爷辈。如图中红框所示:
图中绿色框给出了另一种通过相互关系寻找几何元素的方法,即寻找毗邻的“同辈”几何元素,例如实体可以找到另一个相邻实体(所谓相邻实体,即两个实体有公共面)。
2.4.通过特征捕捉
特征捕捉功能和上一节的相互关系捕捉法一样,脱离了空间位置的束缚,我们不再需要费心思去找那些坐标点或是寻找一个合适的框选工具,我们建立了一个特征,自然就产生了几何元素,这种天然的联系,可以大加利用。下图即为通过特征捕获点线面体的四个函数,这四个函数不同于“相互关系捕捉法”的一点是,它们直接返回几何元素,而不是几何元素的index,在使用中更加方便。
值得注意的是,在Help文档里,这四个函数并不属于Basic Geometry Command章节,而是属于Part Commands章节。
几何体的特征一般都具有父子关系,父子关系可谓是特征捕捉法的最大障碍,使用者需要理清头绪方能发挥特征捕捉法的最大威力。以下介绍一些我在实践中摸索的经验:
1.和其他方法一样,捕获工作应当留到几何模型建立完毕后再执行,因为新的特征产生的几何元素变动会影响旧特征生成的几何元素。
2.直观上说,通过一个特征捕捉到的元素,都是由该特征“新增”出来的元素。
3.建立新特征后,如果旧特征的一部分几何元素被新特征所修改(比如一个面被切分为两个面,或是一个面被切掉一部分),旧特征依旧能捕获到属于自己的几何元素,尽管它们被修改了。
4.被新特征整个抹除的几何元素,无法被捕获,例如被整个拉伸删除的面,在sweep建模中被整条合并的wire等等。
5.新特征增长出来的旧特征的几何元素,仍旧属于旧特征所有。例如:一个拉伸实体上又做了一个拉伸且两个拉伸出来的实体之间没有内部边界,那么事实上两个拉伸只产生了一个实体,这个实体属于旧特征,而不是新特征。这一点可以认为是第二点的特例。
3.结语
我在使用python脚本对abaqus进行二次开发时频频需要对一些较为复杂的几何元素进行选取,在实践过程中我也总结了如前文所述的一些个人心得和方法,希望对各位二次开发者有所助益。