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對象中具有以下的信息:
以上各屬性的訪問方式充分體現面向對象的編程思想,通過實例化類的實例來調用對象的屬性,和屬性值。
另外一部分就是結果信息,而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')