ABAQUS二次开发在变形几何模型重构中的应用
2016-03-17龚亚飞李旭东
龚亚飞,李旭东,何 玲
(兰州理工大学 省部共建有色金属先进加工与再利用国家重点实验室,甘肃 兰州 730050)
ABAQUS二次开发在变形几何模型重构中的应用
龚亚飞,李旭东,何玲
(兰州理工大学 省部共建有色金属先进加工与再利用国家重点实验室,甘肃 兰州730050)
摘要为了实现变形几何模型的重构,通过在ABAQUS平台的Python脚本的二次开发,访问ABAQUS的结果输出数据库(ODB),读取ODB对象的数据,通过相应的计算获取建模需要的数据。在此基础上,编写脚本程序,重新构建出变形后的几何模型,并且实现了几何模型构建过程的可视化,从而为后续的多载荷分析奠定了基础,同时也为不规则几何模型的构建提供了一种新的思路。
关键词多载荷;二次开发;几何模型重构;可视化
当今社会,随着产品设计的复杂程度越来越高,工程分析的复杂程度也相应呈现出加速增长的趋势。针对这一现象,大型有限元分析软件在其分析过程中的应用越来越广泛。有限元分析是以电子计算机为工具的一种现代数值计算方法[1]。而ABAQUS就是一种功能强大且通用性很强的商用工程分析有限元软件[2],它可以解决从相对简单的线性问题到复杂的非线性等各种工程问题。
Python语言是一门功能强大的面向对象的编程语言,它允许在多种平台上编写脚本和快速开发[3,4]。ABAQUS软件二次开发环境提供的脚本接口就是基于Python语言进行的定制开发。对于形状异常复杂或者特殊形状的模型,在ABAQUS软件或其他软件中难以实现时,就可以尝试编写脚本来建立或修改模型[5]。
在工程分析中,有很多部件或装配体要受到多次载荷的作用,在这种情况下,下一次载荷的作用是基于前一次载荷作用后分析的结果,而下一次载荷作用前的模型建立成为了一个难点。研究通过ABAQUS的二次开发来重新构建施加载荷作用后的几何模型。主要的方法是通过Python脚本程序访问ABAQUS的输出数据库(ODB,output data base),获取数据并进行计算,最终获取建模所需要的数据信息。在此基础上,编写脚本程序,重新构建出变形后的几何模型,并实现了构建几何模型的可视化过程。
1ABAQUS的二次开发
1.1二次开发的意义
使用ABAQUS进行数值模拟的一般步骤是:根据所要模拟的问题类型进行建模,包括建立几何模型、分配材料的属性、施加载荷和边界条件、设定分析步和划分网格等;建模完成后形成输入文件提交给ABAQUS/Standard或ABAQUS/Explicit进行计算;最后对计算完成得到的结果进行后处理[6]。后处理就是利用计算机图形学原理对计算结果进行形象的描述和解释,供用户进行查看和分析。
ABAQUS后处理提供了许多功能,如云图的显示、模拟过程的动画显示、等值线的绘制以及其他的列表及曲线等。但是,还有一些功能是ABAQUS并未提供的,例如几何体变形后的节点的坐标信息,需要使用Python进行二次开发。
1.2二次开发实现的原理
对后处理的二次开发,首先要读取结果数据库中的数据,即使用Python语言通过ABAQUS脚本接口访问ABAQUS对象中的数据。ABAQUS脚本接口即是一个基于对象的程序库[7]。在对象创建后,可以使用该对象提供的方法来处理对象中的数据成员。ODB对象是结果数据库对象,包含了模型数据和结果数据,是后处理二次开发考察的重点。模型数据描述了分析汇总使用的模型,包括部件、装配等。结果数据描述了分析得到的结果,包括步、帧、场变量输出和历史变量输出等[8]。在对后处理的二次开发中,就是读取ODB对象中的数据、进行计算等相应的处理,然后输出为相应形式供用户查看和使用。
1.3几何重构的原理
研究基于3D打印的思想,首先把变形后的几何体离散成为一个个的单元,然后再分别构建这些单元,最后再把这些单元合并起来构建出整个变形后的几何模型。
对于每一个单元来说,进行几何拆解:一个单元是由面构成,一个面是由线构成,而线是由点构成。在重构的过程中,则是由点构线,由线构面,由面构体。
2变形几何体重构的过程
2.1访问输出数据库获取数据
(1)模型建立,获取ODB文件建立一个20 mm×20 mm×100 mm的模型,如图1所示[9],它由两个部件装配而成,采用六面体网格技术划分网格,总共的网格数目为46 600个。然后施加一个载荷,使其产生转动,最终的效果如图2所示。需要注意的是,在构建模型的时候,要为每个部件都建立一个节点,目的是保证获取的节点信息和位移信息能够一一对应,确保最终获取的模型变形后的节点坐标信息是准确的。
(2)获取变形后每个节点的坐标信息在访问ODB的时候会进行大量数据的读写,数据的快速读写取决于计算机的软硬件两个方面,在现有硬件上提高读写速度,只能是优化应用程序和操作系统的API接口调用。Python语言对文件读写通常要对三个层次的缓存进行操作,分别是运行库、操作系统和硬盘。这些缓存被设置,主要是因为在I/O操作中底层操作耗时较多,只能满足一般小数据读取的高速性。但是大数据量读取写入时,这样的缓存设置就成为负担,需要先将数据写入缓存再往内存中写入。为了跨越这个瓶颈,可以采用直接读写文件的方法,绕过这些缓存,从而实现大数据文件的快速读入和回写[10]。
得出分析结果后,通过访问ODB下面的部件实例的节点集合nodeSets,就可以获得节点对象,而该对象的成员就包含有节点的编号、节点变形前的坐标等信息。
通过访问ODB下面的steps对象,遍历多个分析步和帧的位移值(U)[11],该位移对象的成员包含节点编号、位移在x,y,z三个方向上的分量。脚本主要代码如下:
f11 = open(filename,’w’)
odb =openOdb(odb name)
sRegion=odb.rootAssembly.instances[instance_name].nodeSets[set_name]
N =sRegion.nodes
U= odb.steps.values()[-1].frames[-1].fieldOutputs['U'].getSubset(region =sRegion).values
#通过循环,获取节点的编号和变形前的坐标信息
for i in N:
n1 = i.label
x1 = i.coordinates[0]
y1 = i.coordinates[1]
z1 = i.coordinates[2]
#通过循环,获取节点编号和变形后的位移信息
for j in U:
n2 = j.nodeLabel
x2 = j.coordinates[0]
y2 = j.coordinates[1]
z2 = j.coordinates[2]
#通过判断,获取节点编号和变形后的坐标信息
if n1 == n2:
n = ‘%6d’%n1
x = ‘%20.10e’%(x1+x2)
y = ‘%20.10e’%(y1+y2)
z = ‘%20.10e’%(z1+z2)
#将信息写入到文件里面
print >>f11,n,x,y,z
f11.close()
(3)获取每个单元的编号及其节点编号通过访问ODB下面的部件实例的单元集合elementSets,就可以获得 elements对象,而该对象的成员包含有单元的编号和构成该单元的每个节点的编号信息。主要代码如下:
f21 = (filename,’w’)
E= odb.rootAssembly.instances[instance_name].elementSets[set_name].elements
for element in E:
print >>f21,'%8d'%element.label,
fornodeNumin element.connectivity:
print >>f21,'%8d'%nodeNum,
print >>f21,' '
f21.close()
odb.close()
(4)获取建模需要的数据格式为了方便建模,需要将每个单元的节点信息写入到一个列表里面。已经获取了变形后的节点信息和单元的信息,通过对其进行数据处理,将每个单元构成点的节点编号替换成其变形后的坐标信息,这样就获得了一个单元的建模数据。例如,一个单元由4个点构成,列表为[1,2,3,4],其中的1,2,3,4为节点编号,通过数据处理后,变为[(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),(x4,y4,z4)],即为建模所需要的每个单元的信息。
2.2根据数据进行几何重构
由于之前画网格时选用的网格技术是六面体网格,因此它是由八个节点、六个面构成,每个面是由四个节点构成。在重构的过程中,需要确定每个面的节点信息。确定了一个面的节点信息后,由点构线,再由线构面。构建好每一个面后,再通过ABAQUS中合并功能,将这些面合并成为一个壳体,然后将这个壳体填充构建好一个实体单元。通过循环,将所有的单元构建出来,最后再合并成为一个实体,那么整个几何体就重构出来了。
(1)获取每个面的节点信息主要代码如下:
Df1 = (list[0],list[1],list[2],list[3],list[0])
Df2 = (list[0],list[4],list[7],list[3],list[0])
Df3 = (list[3],list[7],list[6],list[2],list[3])
Df4 = (list[2],list[6],list[5],list[1],list[2])
Df5 = (list[0],list[4],list[5],list[1],list[0])
Df6 = (list[4],list[5],list[6],list[7],list[4])
Dfs = [Df1,Df2,Df3,Df4,Df5,Df6]
del Df1,Df2,Df3,Df4,Df5,Df6
其中:list表示的是构成每个单元的节点信息的列表,它总共由8个节点构成;Df1,Df2,Df3,Df4,Df5,Df6表示的是每个面的节点的数据信息,而Dfs表示的是每个单元的所有面的数据信息,这样就可以通过循环快速地构建每个面。然后删除每个面的数据信息,这样可以减少内存的使用,提高建模的效率。
(2)由点构线,由线构面主要代码如下:
k1 = 1
for Df in Dfs:
facename = 'face-'+str(k1)
faceNameSet+=(facename,)
p1=
mdb.models['Model-1'].Part(name=facename,dimensionality=THREE_D,type=DEFORMABLE_BODY)
p1= mdb.models['Model-1'].parts[facename]
p1.ConvertToPrecise()
p1.WirePolyLine(Df)
p1.CoverEdges(p1.edges[:],
tryAnalytical= TRUE)
k1+= 1
其中:Df表示每个面的节点数据信息。命令p1.WirePolyLine(Df)就是将节点连接起来构成一个封闭的线框,此线框就是该面的边界。命令p1.CoverEdges(p1.edges[:],tryAnalytical= TRUE)就是由那些构成线框的所有线生成一个面。这样,通过循环就可以构建出每个单元的所有面。
(3)由面构体主要代码如下:
cellname='Cell-'+str(k)
a = mdb.models['Model-1'].rootAssembly
a.PartFromBooleanMerge(domain = GEOMETRY,instances =faceInstanceSet,name = cellname)
p = mdb.models['Model-1'].parts[cellname]
p.AddCells(p.faces)
其中:faceInstanceSet表示的是一个单元所有面的部件实例的集合,此处即为6个面的部件实例的集合。命令PartFromBooleanMerge(domain = GEOMETRY,instances =faceInstanceSet,name = cellname)就是将所有的面合并成为一个壳体。命令p.AddCells(p.faces)就是将合并好的壳体填充成为一个实体部件[12]。这样一个单元的实体部件就构建好了。
通过循环,获取一个单元的信息就构建一个实体部件,直到最后一个单元构建完成,整个几何体的轮廓就产生了,然后把所有的实体部件合并成为一个新的实体部件。该部件是由很多个小部件合并而成,所以在它的表面会有很多个小面。由于这些小面的存在,与实际的几何体不符,故需要将每个面轮廓上的小面都修复成一个大面。只有把所有面轮廓上的小面都修复完毕,整个几何体的构建才算完成。
(4)结果展示两个部件的构建原理是一样的,部件1重构过程的可视化如图3所示。部件2重构过程的可视化如图4所示。两个部件分别合并完成后,可以看到它们表面有许多小面。通过修复,将这些小面合并成一个轮廓面,这样,几何模型的重构就完成了,如图5所示。
3结论
通过ABAQUS的二次开发,实现了变形几何模型的重构,并且实现了可视化。得到以下几点结论:
(1)通过Python脚本访问ABAQUS的输出数据库,可以获取从该软件不能直接获取的结果数据。此方法补充了ABAQUS/CAE的功能,扩展了其应用;
(2)实现了变形的、不规则几何体在ABAQUS的前处理中的自动建模过程,并且做到了可视化,说明此方法是正确的。这也为构建其他不规则几何体模型提供了一种新的思路。
参考文献:
[1]杨利花,杨世强.现代设计方法及其发展趋势[J].甘肃科学学报,2004,16(2):111-114.
[2]石亦平,周玉蓉.ABAQUS有限元分析实例详解[M].北京:机械工业出版社,2006.
[3]钟同圣,卫丰,王鸷,等.Python语言和ABAQUS前处理二次开发[J].郑州大学学报:理学版,2006,38(1):60-64.
[4]鲍荣浩,卢文浩.ABAQUS前处理程序二次开发在蜂窝材料中的应用[J].工程设计学报,2003,10(6):330-333.
[5]曹金凤,王旭春,孔亮.Python语言在ABAQUS中的应用[M].北京:机械工业出版社,2011.
[6]连昌伟,王兆远,杜传军,等.ABAQUS后处理二次开发在塑性成形模拟中的应用[J].锻压技术,2006,31(4):111-114.
[7]滕军,张何,李祚华.ABAQUS后处理二次开发在结构弹塑性分析中的应用[J].防灾减灾工程学报,2013,33(S1):9-14.
[8]张强,马永,李四超.基于Python的ABAQUS二次开发方法与应用[J].舰船电子工程,2011,31(2):131-134.
[9]俞树荣,严志刚,曹睿,等.有限元软件模拟裂纹扩展的方法探讨[J].甘肃科学学报,2003,15(4):15-21.
[10]张龙,李旭东,郭德昌.3D打印过程的计算机仿真[J].计算机仿真,2014,31(8):226-229.
[11]ABAQUS Inc.ABAQUS Scripting User’s Manual.Version6.10[M].Pawtucket:ABAQUS Inc,2010.
[12]ABAQUS Inc.ABAQUS Scripting Reference Manual.Version6.10[M].Pawtuckt:ABAQUS Inc,2010.
Application of Secondary Development of ABAQUS in Geometric Deformable Model Reconstruction
Gong Yafei,Li Xudong,He Ling
(State Key Laboratory of Advanced Processing and Recycling of Nonferrous Metals,Lanzhou University of Technology,Lanzhou 730050,China)
Key wordsMultiple load;Secondary development;Geometric model reconstruction;Visualization
AbstractIn order to implement the geometric deformable model reconstruction,data required by modeling is obtained by secondary development of Python script in ABAQUS platform,visiting ODB of ABAQUS,reading the data of ODB after corresponding calculation.Based on that data,visualization during geometric model building process is implemented by writing script programs and reconstructing geometric deformable model,which lays a foundation for the subsequent multiple load analysis,provides a new idea for the building of irregular geometry model as well.
doi:10.16468/j.cnki.issn1004-0366.2016.03.017.
收稿日期:2015-02-12;修回日期:2015-03-25.
作者简介:龚亚飞(1987-),男,山西运城人,硕士研究生,研究方向为计算机仿真模拟、CAE软件的二次开发.E-mail:gongyafei0408@sina.com. 通讯作者:李旭东.E-mail:lixd@lut.cn.
中图分类号:N945.12
文献标志码:A
文章编号:1004-0366(2016)03-0080-05
引用格式:Gong Yafei,Li Xudong,He Ling.Application of Secondary Development of ABAQUS in Geometric Deformable Model Reconstruction[J].Journal of Gansu Sciences,2016,28(3):80-84.[龚亚飞,李旭东,何玲.ABAQUS二次开发在变形几何模型重构中的应用[J].甘肃科学学报,2016,28(3):80-84.]