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')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章