Abaqus中输出场文件odb的数据结构及Python读取

来源:互联网 发布:利润表数据分析 编辑:程序博客网 时间:2024/06/09 22:55

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.nameSTEEL#获取材料的模型键值对信息>>> print m0.density.table((7.9e-09,),)>>> print m0.elastic.table((210000.0, 0.3),)>>> print m0.elastic.typeISOTROPIC

下面我们通过构造函数对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, sysfrom 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')