odb文件的数据结构

image.png

工作路径设置

import os, os.path, sys#导入当前工作路径
os.chdir(‘d:\Temp’)#修改当前工作路径
print(os.getcwd())#查看当前工作路径

生成和打开odb文件


Field output提取方法

场变量输出是以set来输岀的,如果不选择set,就默认为输岀整个模型对应的场变量
在 abaqus model里面有两个地方是可以用来创建set,所以在输岀场变量区域的时候就有如下两种路径:

  1. odb-rootAssembly-Sets
  2. odb-rootassembly-instances-Sets

用户可以通过相关命令查看对应集合的名称,以节点集为例:

  1. print'Node sets =',odb.rootAssembly.nodeSets.keys
  2. print'Node sets =',odb.rootAssembly.instances['PART-1-1'].nodeSets.keys

这两种分别能打印出所有节点集合,注意需要预先区分个人定义的节点集合是否在 Instances上

定义需要输出区域的语句是

  1. Region=odb.rootassembly.nodesets['要研究的set名']

而定义相关场变量输出时,语句就非常简单
例如,用户想要输出在Step-3,第i个frame时(也可以写个循环来调用不同 frame)的U3位移场,这样定义的场变量方式为

  1. Frame=odb.steps['Step-3'].frame[i]
  2. RootU3=Frame.fieldOutputs['U3']

或者直接就是

  1. RootU3=odb.steps['Step-3'].frame.fieldOutputs['U3']

后续写出数据到文件只需遵照 Python的读写文件操作即可,读取 Abaqus时所需要的头文件也都是一样的

所以,采用 Python读取 Abaqus ODB局部区域的某一场变量的整理思想是:

  • 先定义所关心的Step中所对应的第i个frame
  • 然后定义自己关心区域
  • 最后结合这两者.(注意大小写)

如下:输出Set-1集合上的U3存储到 RegioncareU3中

  1. Frame=odb.steps['Step-3'].frame[i]
  2. RootU3=Frame.fieldOutputs['U3']
  3. Regioncare=odb.rootAssembly.nodeSets['Set-1']
  4. RegioncareU3= RootU3.getSubset(region=Regioncare

History output提取方法

History output提取方法类似,首先是 Pyhton中对应的一些头文件
from odbAccess import
from abaqus Constants import
定义odb对应的路径,写岀文件的路径(建议这部分在bat文件中进行,后期处理会更简单)。
基本思路也是类似的,但需要注意的是,history output中并不存在 frame的问题
所以定义需要输出的历史变量仅仅涉及到step的问题
定义区域基本语句为:

  1. Step1 = odb. steps['Step-1']
  2. Regiopoint1 = step1. historyRegions['位置名称']

同样,此处需要知道自己输出了model中哪些区域的”位置名称”,可以通过如下语句在屏幕中打印出来,打印出step1加载步中输出的所有historyregions名称

  1. Step1 = odb. steps['Step-1']
  2. print Step1. historyRegions keys()

通过以上命令打印出所有”位置名称”,选择自己关心的区域即可
选择需要输岀的场变量(输岀之前选择的”位置名称”上的RF3),如下所示

  1. RFPoint1=RegionPoint1.historyOutputs['RF3'].data

之后的流程及基本一样,写入到文件即可

核心语句有

  1. odb=openodb(path=odbPath,readOnly=TRUE)
  2. Stepl=odb. steps['Step-1']
  3. Regionpoint1=step1.historyRegions['位置名称']
  4. RFPoint1=RegionPoint1.historyOutputs[''].data

odb对象的涉及参数

[ABAQUS] Python 提取 odb 数据 - 图2
[ABAQUS] Python 提取 odb 数据 - 图3

Python范例:

python访问数据

  1. from odbAccess import*
  2. odb=openOdb(path=odbname)
  3. step1=odb.steps['Step-1']
  4. region=step1.historyRegions['Node PART-2-1.1']
  5. u3Data=region.historyOutputs['U3'].data
  6. disFile=open(outputname,'w')
  7. for time,u3Disp in u3Data:
  8. disFile.write('%10.4E %10.4E\n'%(time,u3Disp))
  9. disFile.close()

python提取数据到excel

  1. from visualization import *
  2. from odbAccess import *
  3. from abaqusConstants import *
  4. import string
  5. import xlwt
  6. odb = openOdb(path = 'Job1.odb')
  7. wbkName = 'RF2Exaction' #命名表格文件名
  8. wbk = xlwt.Workbook() #创建新的表格
  9. sheet = wbk.add_sheet('sheet1') #创建sheet1
  10. myAssembly = odb.rootAssembly
  11. frameRepository = odb.steps['Step-1'].frames
  12. RefPointSet = myAssembly.nodeSets['Master Node 5']
  13. for i in range(len(frameRepository)):
  14. #提取参考点RF1在y方向的支反力
  15. RForce = frameRepository[i].fieldOutputs['RF'] #访问fieldoutput中RF变量
  16. RefPointRForce = RForce.getSubset(region = RefPointSet) #访问需要的区域RefPointSet
  17. RForceValues = RefPointRForce.values #提取数值
  18. RF_2 = RForceValues[0].data[2] #提取y方向数值
  19. #提取参考点RF1的位移量
  20. displacement =frameRepository[i].fieldOutputs['U']
  21. RefPointDisp = displacement.getSubset(region = RefPointSet)
  22. DispValue = RefPointDisp.values
  23. Disp = DispValue[0].data[2]
  24. #将结果写入相应的行和列
  25. sheet.write(i,0,round(Disp,3))
  26. sheet.write(i,1,round(RF_2,2))
  27. wbk.save('wbkName.xls')

python提取数据到txt

  1. from visualization import *
  2. from odbAccess import *
  3. import string
  4. f=open('Disp_RF3_extract.dat','w')
  5. Disp_data=''
  6. Rf_data=''
  7. odb = openOdb(path = 'Job-MultiFiber.odb')
  8. myAssembly = odb.rootAssembly
  9. frameRepository = odb.steps['Step-1'].frames
  10. RefPointSet = myAssembly.nodeSets['Master Node 5']
  11. for i in range(len(frameRepository)):
  12. #提取参考点RF1在y方向的支反力
  13. RForce = frameRepository[i].fieldOutputs['RF']
  14. RefPointRForce = RForce.getSubset(region = RefPointSet)
  15. RForceValues = RefPointRForce.values
  16. RF_3 = RForceValues[0].data[2]
  17. #提取参考点RF1的位移量
  18. displacement =frameRepository[i].fieldOutputs['U']
  19. RefPointDisp = displacement.getSubset(region = RefPointSet)
  20. DispValue = RefPointDisp.values
  21. Disp_3 = DispValue[0].data[2]
  22. Disp_data = '\t' + '\t' + str(Disp_3)
  23. Rf_data = '\t' + '\t' + str(RF_3)
  24. Disp=str(Disp_data)
  25. RF=str(Rf_data)
  26. f.write(Disp)
  27. f.write('\t')
  28. f.write('\t')
  29. f.write(RF)
  30. f.write('\t')
  31. f.write('\n')
  32. print "Done!"

python提取节点坐标

  1. # -*- coding: mbcs -*-
  2. import os, os.path, sys
  3. from odbAccess import *
  4. from abaqusConstants import *
  5. def extractNodes(odbname, tname, tpath=None):
  6. if tpath==None:
  7. tpath = os.getcwd()
  8. tname = tname + '.inp'
  9. oname = odbname+'.odb'
  10. tFile=os.path.join(tpath,tname)
  11. oPath=os.path.join(tpath,oname)
  12. f = open(tFile, 'w')
  13. o = openOdb(path=oPath)
  14. instes = o.rootAssembly.instances
  15. for key in instes.keys():
  16. labels, xyz = [], []
  17. for node in instes[key].nodes:
  18. labels.append(node.label)
  19. xyz.append(node.coordinates)
  20. cc = dict(zip(labels, xyz))
  21. aa = sorted(labels)
  22. bb = [cc[item] for item in aa]
  23. f.write('*Instance '+instes[key].name+'\n')
  24. for i in range(len(aa)):
  25. tepS = str(aa[i])+', '+str(bb[i][0])+', '+str(bb[i][1])+', '+\
  26. str(bb[i][2])+'\n'
  27. f.write(tepS)
  28. f.close()
  29. o.close()
  30. if __name__=="__main__":
  31. extractNodes(odbname='HertzContact', tname='hertzcontact')

交互访问范例:

  1. o = session.openOdb(name='HertzContact.odb',readOnly = False)#通过已有odb文件来创建Odb对象
  2. >>> p = o.parts#获取访问odb对象中的part仓库
  3. >>> print p
  4. {'ASSEMBLY': 'Part object', 'BALL': 'Part object', 'BASE': 'Part object'}
  5. >>> m = o.materials#访问材料仓库
  6. >>> print m
  7. {'STEEL': 'Material object'}
  8. >>> print m.keys
  9. <AbaqusMethod session.openOdb(r'C:/windows/system32/HertzContact.odb').models['Default Model'].materials.keys>
  10. >>> m0 = m[m.keys()[0]]
  11. >>> print m0.name
  12. STEEL
  13. #获取材料的模型键值对信息
  14. >>> print m0.density.table
  15. ((7.9e-09,),)
  16. >>> print m0.elastic.table
  17. ((210000.0, 0.3),)
  18. >>> print m0.elastic.type
  19. ISOTROPIC
  20. #在当前odb对象o中创建Newsteel的新材料属性对象
  21. m1 = o.Material(name='NewSteel')
  22. #为m1添加密度对象参数
  23. >>> m1.Density(table=((7.9e-09,),))
  24. session.openOdb(r'C:/windows/system32/HertzContact.odb').models['DefaultModel'].materials['NewSteel'].options['density']
  25. #为m1添加弹性对象属性
  26. >>> m1.Elastic(table=((210000.0,0.3),),type=ISOTROPIC)
  27. >>> print m.keys()
  28. ['NewSteel', 'STEEL']#已经创建到材料库中