一个提高访问Abaqus结果ODB文件效率的方法技巧

在看达索的用户手册的时候看到这一节的内容,觉得很有用,遂拿过来翻译并自己组织了一下语言,贴在这里与大家分享:

正文:

如果有一个变量需要多次被访问,那么最好的办法就是将这个变量拿出来赋值给一个对象objectA,然后通过多次访问这个对象objectA,通过访问这个临时对象来避免对输出数据库的多次访问。

假如有以下代码,需要访问odb中的Mises应力和真实应变,如果Mises应力大于某个值,那么打印该单元的应变分量,一般的代码可能是这样做的:

stressField = frame.fieldOutputs['MISES']
strainField = frame.fieldOutputs['LE']
count = 0
for v in stressField.values:
  if v.mises > stressCap:
    if v.integrationPoint:
      print 'Element label = ', v.elementLabel, \
          'Integration Point = ', v.integrationPoint
    else:
      print 'Element label = ', v.elementLabel
    for component in strainField.values[count].data:
      print '%-10.5f' % component,
    print
  count = count + 1

在这段脚本中,定义一个strainField,在每次需要访问strainField中的应变值时,都需要调用strainField.values[count]来获得变量的值,由于对于odb数据库来说,每一次去调用这个values变量都需要进入到数据库中去查找并读取,所以这是一个非常费时的做法,但是对上述脚本做一个简单修改就可以大大改善访问效率,如下:

stressField = frame.fieldOutputs['MISES']
strainFieldValues = frame.fieldOutputs['LE'].values
count = 0
for v in stressField.values:
  if v.mises > stressCap:
    if v.integrationPoint:
      print 'Element label = ', v.elementLabel, \
          'Integration Point = ', v.integrationPoint
    else:
      print 'Element label = ', v.elementLabel
    for component in strainFieldValues[count].data:
      print '%-10.5f' % component,
    print
  count = count + 1

注意看第二行,直接通过一次访问,将所有的真实应变得值保存到一个对象中,这个对象是在内存中的,所以需要访问应变值得时候,不需要去输出数据库中去读取,只需要通过访问列表的方法去访问即可。

另外一个问题,如果需要访问多个frame,也是有两种方式:

方式1:

for i in range(len(odb.steps[name].frames)-1):
  frame[i] = odb.steps[name].frames[i]

方式2:

frameRepository = odb.steps[name].frames
for i in range(len(frameRepository)-1):
  frame[i] = frameRepository[i]

明显,方式2是更经济的做法。

(4条)
默认 最新
亲测,效率确实提高不少
评论 点赞
谢谢分享,收藏学习
评论 点赞

查看更多评论 >

点赞 13 评论 5 收藏 2
关注