一文读懂如何提升Abaqus Python二次开发代码通用性
来源:复合材料力学 作者:君莫
我们在Abaqus/CAE中进行各种操作时,后台的各种指令会实时记录在rpy文件和jnl文件中,因此,在Abaqus二次开发中,为了提升编程效率,经常需要调取rpy文件或者jnl文件,参照其中的指令来辅助进行高效的二次开发,这一点大家都是比较清楚的。
但是当查阅或者修改Abaqus.rpy 文件以及.jnl 文件时,经常会看到系统默认采用的getsequencefrommask 函数去选取单个或者多个对象,该函数是采用特殊的掩码编码来表示所选取的对象,而实际编程过程中,用户无法确定自己所需对象的掩码。因此,很难将基于这种掩码的代码改成具有通用性的代码。
这种情况下就需要采用其他方式获取用户所需要的对象,一般建议采用基于对象自身索引号或者基于特征点坐标的方式选取对象。想实现这两种选取方式需要对rpy 文件jnl 文件的指令输出格式进行定制。
需要用到的指令是
session.journalOptions.setValues(...)
上述函数包含以下几个参数:
(1)replayGeometry
该参数通过一个符号常量来指定.rpy文件中几何体的索引格式,该参数有COORDINATE、INDEX 和COMPRESSEDINDEX 三种参数值,默认值为COMPRESSEDINDEX。
当replayGeometry=COORDINATE 时,rpy 文件中对几何体的索引采用的是findAt()函数加坐标点的方式;当replayGeometry=INDEX 时,rpy 文件中对几何体的索引采用的是几何体自身索引号的方式;当replayGeometry = COMPRESSEDINDEX 时,rpy文件中对几何体的索引采用的就是掩码编码的方式。
(2)recoverGeometry
该参数同replayGeometry 类似,其表示的是在恢复文件(.rec 文件,.jnl 文件的存储格式同.rec 文件)中几何的索引格式,其参数值也是分为COORDINATE、 INDEX和COMPRESSEDINDEX 三种,代表的意义同replayGeometry 参数值一样。
举个栗子
对一个名为“Part-1”的零件创建一个set,命名为“set-2”,类型选择Geometry,选择模型中某一个平面作为该集合的元素,将模型保存后,查询生成的指令文件Abaqus.rpy,如下:
p = mdb.models['Model-1'].parts['Part-1']
f = p.faces
faces = f.getSequenceFromMask(mask=('[#2 ]', ), )
p.Set(faces=faces, name='Set-2')
注意,上述代码中对象faces 的索引方式getSequenceFromMask,即默认的replayGeometry=COMPRESSEDINDEX 情况。这种情况下,我们是搞不清那堆字符串的含义的,因此代码也就很难修改成通用代码,怎么办呢?
现在呢,在Abaqus GUI 命令行交互窗口输入以下指令,看看会有什么发生:
>>>session.journalOptions.setValues(replayGeometry=COORDINATE,recoverGeometry=COORDINATE)
然后,再在CAE中重复一遍操作,发现代码的输出格式变成了下面这个样子。
p = mdb.models['Model-1'].parts['Part-1']
f = p.faces
faces = f.findAt((20.211912, 3.333333, 20.0),)
p.Set(faces=faces, name='Set-3')
#: The set 'Set-3' has been created (1 face).
此时对象faces 的索引方式已经转换为findAt() 函数配合点坐标的方式。这就方便多了,我们可以自己去根据一些特征点坐标去指定想要选取的对象了。
除此之外呢,还可以采用对象自身索引号的方式选取,类似的,在Abaqus GUI 命令行交互窗口输入以下指令:
>>>session.journalOptions.setValues(replayGeometry=INDEX,recoverGeometry=INDEX)
再次查看工作目录下的Abaqus.rpy 文件,其最新更新内容如下:
p = mdb.models['Model-1'].parts['Part-1']
f = p.faces
faces = f[1:2]
p.Set(faces=faces, name='Set-4')
此时选取对象faces 的索引方式已经转换为实际特征索引号的方式。
除此之外呢,还可以采用对象自身索引号的方式选取,类似的,在Abaqus GUI 命令行交互窗口输入以下指令:
>>>session.journalOptions.setValues(replayGeometry=INDEX,recoverGeometry=INDEX)
再次查看工作目录下的Abaqus.rpy 文件,其最新更新内容如下:
p = mdb.models['Model-1'].parts['Part-1']
f = p.faces
faces = f[1:2]
p.Set(faces=faces, name='Set-4')
此时选取对象faces 的索引方式已经转换为实际特征索引号的方式。磨刀不误砍柴工,这样修改后,你的编程效率就会高很多了,快去体验一下吧。
参考文献:贾利勇, 富琛阳子, 贺高. Abaqus GUI程序开发指南[M]. 人民邮电出版社, 2016.
想了解更多Abaqus二次开发的读者可以购买《Abaqus GUI程序开发指南 Python语言(异步图书出品)》