一个提高访问Abaqus结果ODB文件效率的方法技巧
2019年2月19日 浏览:2915 评论:5 收藏:2
在看达索的用户手册的时候看到这一节的内容,觉得很有用,遂拿过来翻译并自己组织了一下语言,贴在这里与大家分享:
正文:
如果有一个变量需要多次被访问,那么最好的办法就是将这个变量拿出来赋值给一个对象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是更经济的做法。
点赞 13 评论 5 收藏 2
查看更多评论 >