一個提高訪問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是更經濟的做法。

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

13
5
2