

| 》》 《《 |
|---|
odb文件的数据结构
工作路径设置
import os, os.path, sys#导入当前工作路径
os.chdir(‘d:\Temp’)#修改当前工作路径
print(os.getcwd())#查看当前工作路径
生成和打开odb文件
Field output提取方法
场变量输出是以set来输岀的,如果不选择set,就默认为输岀整个模型对应的场变量
在 abaqus model里面有两个地方是可以用来创建set,所以在输岀场变量区域的时候就有如下两种路径:
odb-rootAssembly-Setsodb-rootassembly-instances-Sets
用户可以通过相关命令查看对应集合的名称,以节点集为例:
print'Node sets =',odb.rootAssembly.nodeSets.keysprint'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对象的涉及参数
![[ABAQUS] Python提取odb数据 - 图4](/uploads/projects/u50787@bszkkf/b7a48de6d726d66cb18e45a576f4598e.png)
![[ABAQUS] Python提取odb数据 - 图5](/uploads/projects/u50787@bszkkf/9b107968bd3390f7edece771dd1d2683.png)
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'].datadisFile=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 stringimport xlwtodb = openOdb(path = 'Job1.odb')wbkName = 'RF2Exaction' #命名表格文件名wbk = xlwt.Workbook() #创建新的表格sheet = wbk.add_sheet('sheet1') #创建sheet1myAssembly = odb.rootAssemblyframeRepository = odb.steps['Step-1'].framesRefPointSet = 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) #访问需要的区域RefPointSetRForceValues = RefPointRForce.values #提取数值RF_2 = RForceValues[0].data[2] #提取y方向数值#提取参考点RF1的位移量displacement =frameRepository[i].fieldOutputs['U']RefPointDisp = displacement.getSubset(region = RefPointSet)DispValue = RefPointDisp.valuesDisp = 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 stringf=open('Disp_RF3_extract.dat','w')Disp_data=''Rf_data=''odb = openOdb(path = 'Job-MultiFiber.odb')myAssembly = odb.rootAssemblyframeRepository = odb.steps['Step-1'].framesRefPointSet = 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.valuesRF_3 = RForceValues[0].data[2]#提取参考点RF1的位移量displacement =frameRepository[i].fieldOutputs['U']RefPointDisp = displacement.getSubset(region = RefPointSet)DispValue = RefPointDisp.valuesDisp_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, 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.instancesfor 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.nameSTEEL#获取材料的模型键值对信息>>> print m0.density.table((7.9e-09,),)>>> print m0.elastic.table((210000.0, 0.3),)>>> print m0.elastic.typeISOTROPIC#在当前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']#已经创建到材料库中

