一個提高訪問Abaqus結果ODB文件效率的方法技巧
瀏覽:3891 評論: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是更經濟的做法。
技術鄰APP
工程師必備
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP
13
5
2




















