Abaqus中輸出場文件odb的數據結構及Python讀取

Abaqus所生成的Odb文件對象,包含了我們建模中的模型信息,比如:part;assembly;material;section;profiles;interaction等模型信息;在不考慮結果數據的情況下,我們可以把Odb對象與Model對象相對比開看,他們包含了有限元模型的大部分信息,Odb對象的成員信息如下:
這裏寫圖片描述

下面是一個小實例,讀取odb文件中的模型信息:

 o = session.openOdb(name='HertzContact.odb',readOnly = False)#通過已有odb文件來創建Odb對象
>>> p = o.parts#獲取訪問odb對象中的part倉庫
>>> print p 
{'ASSEMBLY': 'Part object', 'BALL': 'Part object', 'BASE': 'Part object'}
>>> m = o.materials#訪問材料倉庫
>>> print m
{'STEEL': 'Material object'}
>>> print m.keys
<AbaqusMethod  session.openOdb(r'C:/windows/system32/HertzContact.odb').models['Default Model'].materials.keys>
>>> m0 = m[m.keys()[0]]
>>> print m0.name
STEEL
#獲取材料的模型鍵值對信息
>>> print m0.density.table
((7.9e-09,),)
>>> print m0.elastic.table
((210000.0, 0.3),)
>>> print m0.elastic.type
ISOTROPIC

下面我們通過構造函數對odb對象進行操作:新建材料對象和屬性

#在當前odb對象o中創建Newsteel的新材料屬性對象
m1 = o.Material(name='NewSteel')
#爲m1添加密度對象參數
>>> m1.Density(table=((7.9e-09,),))
session.openOdb(r'C:/windows/system32/HertzContact.odb').models['DefaultModel'].materials['NewSteel'].options['density']
#爲m1添加彈性對象屬性
>>> m1.Elastic(table=((210000.0,0.3),),type=ISOTROPIC)
>>> print m.keys()
['NewSteel', 'STEEL']#已經創建到材料庫中

一、網格信息
從Odb結果文件中,我們可以得到就有獨立網格部件的model對象,這是因爲Odb對象存儲了模型的基本網格組織信息,Odb對象中的孤立網格信息存在於rootAssembly對象。rootAseembly是odbAssembly的實例對象。
其中rootAssembly對象中具有以下的信息:
rootAssembly對象成員信息

以上各屬性的訪問方式充分體現面向對象的編程思想,通過實例化類的實例來調用對象的屬性,和屬性值。
另外一部分就是結果信息,而Odb對象中的結果數據都是保存在steps對象倉庫中;分爲場變量結果(fieldOutputs)和歷史變量結果(historyOutputs);

Odb的模型數據結構在參考手冊的圖解爲:
這裏寫圖片描述

根據圖解路徑所示,我們要訪問Odb文件中的場輸出數據就必須指定正確的訪問路徑和場路徑索引;
如:
odb.steps[].frames[].filedOutputs[].values[]
odb.historyRegions[].historyOutput[]
其中‘[ ]’中我們可以指定具體的名稱或者索引值。

一:場變量數據的對象信息:


這裏寫圖片描述


二,應用實例:讀取odb文件中的節點和座標

# -*- coding: mbcs -*-
import os, os.path, sys
from odbAccess import *
from abaqusConstants import *
def extractNodes(odbname, tname, tpath=None):
    if tpath==None:
        tpath = os.getcwd()
    tname = tname + '.inp'
    oname = odbname+'.odb'
    tFile=os.path.join(tpath,tname)
    oPath=os.path.join(tpath,oname)
    f = open(tFile, 'w')
    o = openOdb(path=oPath)
    instes = o.rootAssembly.instances
    for key in instes.keys():
        labels, xyz = [], []
        for node in instes[key].nodes:
            labels.append(node.label)
            xyz.append(node.coordinates)
        cc = dict(zip(labels, xyz))
        aa = sorted(labels)
        bb = [cc[item] for item in aa]
        f.write('*Instance '+instes[key].name+'\n')
        for i in range(len(aa)):
            tepS = str(aa[i])+', '+str(bb[i][0])+', '+str(bb[i][1])+', '+\
            str(bb[i][2])+'\n'
            f.write(tepS)
    f.close()
    o.close()

if __name__=="__main__":
    extractNodes(odbname='HertzContact', tname='hertzcontact')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章