odb文件的数据结构
工作路径设置
import os, os.path, sys#导入当前工作路径
os.chdir(‘d:\Temp’)#修改当前工作路径
print(os.getcwd())#查看当前工作路径
生成和打开odb文件
Field output提取方法
场变量输出是以set来输岀的,如果不选择set,就默认为输岀整个模型对应的场变量
在 abaqus model里面有两个地方是可以用来创建set,所以在输岀场变量区域的时候就有如下两种路径:
odb-rootAssembly-Sets
odb-rootassembly-instances-Sets
用户可以通过相关命令查看对应集合的名称,以节点集为例:
print'Node sets =',odb.rootAssembly.nodeSets.keys
print'Node sets =',odb.rootAssembly.instances['PART-1-1'].nodeSets.keys
这两种分别能打印出所有节点集合,注意需要预先区分个人定义的节点集合是否在 Instances上
定义需要输出区域的语句是
Region=odb.rootassembly.nodesets['要研究的set名']
而定义相关场变量输出时,语句就非常简单
例如,用户想要输出在Step-3,第i个frame时(也可以写个循环来调用不同 frame)的U3位移场,这样定义的场变量方式为
Frame=odb.steps['Step-3'].frame[i]
RootU3=Frame.fieldOutputs['U3']
或者直接就是
RootU3=odb.steps['Step-3'].frame.fieldOutputs['U3']
后续写出数据到文件只需遵照 Python的读写文件操作即可,读取 Abaqus时所需要的头文件也都是一样的
所以,采用 Python读取 Abaqus ODB局部区域的某一场变量的整理思想是:
- 先定义所关心的Step中所对应的第i个frame
- 然后定义自己关心区域
- 最后结合这两者.(注意大小写)
如下:输出Set-1集合上的U3存储到 RegioncareU3中
Frame=odb.steps['Step-3'].frame[i]
RootU3=Frame.fieldOutputs['U3']
Regioncare=odb.rootAssembly.nodeSets['Set-1']
RegioncareU3= RootU3.getSubset(region=Regioncare)
History output提取方法
History output提取方法类似,首先是 Pyhton中对应的一些头文件
from odbAccess import
from abaqus Constants import
定义odb对应的路径,写岀文件的路径(建议这部分在bat文件中进行,后期处理会更简单)。
基本思路也是类似的,但需要注意的是,history output中并不存在 frame的问题
所以定义需要输出的历史变量仅仅涉及到step的问题
定义区域基本语句为:
Step1 = odb. steps['Step-1']
Regiopoint1 = step1. historyRegions['位置名称']
同样,此处需要知道自己输出了model中哪些区域的”位置名称”,可以通过如下语句在屏幕中打印出来,打印出step1加载步中输出的所有historyregions名称
Step1 = odb. steps['Step-1']
print Step1. historyRegions keys()
通过以上命令打印出所有”位置名称”,选择自己关心的区域即可
选择需要输岀的场变量(输岀之前选择的”位置名称”上的RF3),如下所示
RFPoint1=RegionPoint1.historyOutputs['RF3'].data
之后的流程及基本一样,写入到文件即可
核心语句有
odb=openodb(path=odbPath,readOnly=TRUE)
Stepl=odb. steps['Step-1']
Regionpoint1=step1.historyRegions['位置名称']
RFPoint1=RegionPoint1.historyOutputs[''].data
odb对象的涉及参数
Python范例:
python访问数据
from odbAccess import*
odb=openOdb(path=odbname)
step1=odb.steps['Step-1']
region=step1.historyRegions['Node PART-2-1.1']
u3Data=region.historyOutputs['U3'].data
disFile=open(outputname,'w')
for time,u3Disp in u3Data:
disFile.write('%10.4E %10.4E\n'%(time,u3Disp))
disFile.close()
python提取数据到excel
from visualization import *
from odbAccess import *
from abaqusConstants import *
import string
import xlwt
odb = openOdb(path = 'Job1.odb')
wbkName = 'RF2Exaction' #命名表格文件名
wbk = xlwt.Workbook() #创建新的表格
sheet = wbk.add_sheet('sheet1') #创建sheet1
myAssembly = odb.rootAssembly
frameRepository = odb.steps['Step-1'].frames
RefPointSet = myAssembly.nodeSets['Master Node 5']
for i in range(len(frameRepository)):
#提取参考点RF1在y方向的支反力
RForce = frameRepository[i].fieldOutputs['RF'] #访问fieldoutput中RF变量
RefPointRForce = RForce.getSubset(region = RefPointSet) #访问需要的区域RefPointSet
RForceValues = RefPointRForce.values #提取数值
RF_2 = RForceValues[0].data[2] #提取y方向数值
#提取参考点RF1的位移量
displacement =frameRepository[i].fieldOutputs['U']
RefPointDisp = displacement.getSubset(region = RefPointSet)
DispValue = RefPointDisp.values
Disp = DispValue[0].data[2]
#将结果写入相应的行和列
sheet.write(i,0,round(Disp,3))
sheet.write(i,1,round(RF_2,2))
wbk.save('wbkName.xls')
python提取数据到txt
from visualization import *
from odbAccess import *
import string
f=open('Disp_RF3_extract.dat','w')
Disp_data=''
Rf_data=''
odb = openOdb(path = 'Job-MultiFiber.odb')
myAssembly = odb.rootAssembly
frameRepository = odb.steps['Step-1'].frames
RefPointSet = myAssembly.nodeSets['Master Node 5']
for i in range(len(frameRepository)):
#提取参考点RF1在y方向的支反力
RForce = frameRepository[i].fieldOutputs['RF']
RefPointRForce = RForce.getSubset(region = RefPointSet)
RForceValues = RefPointRForce.values
RF_3 = RForceValues[0].data[2]
#提取参考点RF1的位移量
displacement =frameRepository[i].fieldOutputs['U']
RefPointDisp = displacement.getSubset(region = RefPointSet)
DispValue = RefPointDisp.values
Disp_3 = DispValue[0].data[2]
Disp_data = '\t' + '\t' + str(Disp_3)
Rf_data = '\t' + '\t' + str(RF_3)
Disp=str(Disp_data)
RF=str(Rf_data)
f.write(Disp)
f.write('\t')
f.write('\t')
f.write(RF)
f.write('\t')
f.write('\n')
print "Done!"
python提取节点坐标
# -*- 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')
交互访问范例:
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对象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']#已经创建到材料库中