Python提取AbaqusODB中的场变量(Fieldoutput)与历史变量(Historyoutput)方法胡剑桥(jianqiaohu@126.com)(1)创建bat文件,这一步并不是必须的,但是推荐使用。用来提供ODB路径以及写出文件路径的方法。方便在windowscommand中提交。也可以直接在Python中提供读写路径。(2)关于场变量和历史变量的提取,Python对接odb时有很简单严格的数据结构。具体的ODB数据结构如下所示:(3)Fieldoutput提取方法。场变量输出是以一个个set来输出的,如果不选择set,就默认为输出整个模型的对应的场变量,选择set是为了输出研究者感兴趣区域的场变量。在abaqusmodel里面创建set时,是有两个地方是可以用来创建set,所以在选出需要输出场变量区域的时候就涉及到了如下的两种路径:一是:odb—rootAssembly—Sets二是:odb—rootAssembly—instances—Sets用户可以通过相关命令查看对应的集合的名称,以节点集为例。print'Nodesets=',odb.rootAssembly.nodeSets.keys()print'Nodesets=',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[i].fieldOutputs[‘U3’]后续写出数据到文件只需遵照Python的读写文件操作即可。读取Abaqus时所需要的头文件也都是一样的。所以,采用Python读取AbaqusODB局部区域的某一场变量的整理思想是:先定义所关心的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)(4)Historyoutput提取方法Historyoutput提取方法类似,首先是Pyhton中对应的一些头文件:fromodbAccessimport*fromabaqusConstantsimport*定义odb对应的路径,写出文件的路径(建议这部分在bat文件中进行,后续处理会更简单)。基本思路也是类似的,但需要注意的是,historyoutput中并不存在Frame的问题。所以定义需要输出的历史变量仅仅涉及到Step的问题。于是定义区域基本语句为:Step1=odb.steps['Step-1']RegionPoint1=Step1.historyRegions['位置名称']同样,此处需要知道自己输出了model中那些区域的“位置名称”,可以通过如下语句在屏幕中打印出来,打印出step-1加载步中输出的所有historyregions名称。Step1=odb.steps['Step-1']printStep1.historyRegions.keys()通过以上命令打印出所有“位置名称”,选择自己关心的区域即可。选择需要输出的场变量(输出之前选择的“位置名称”上的RF3),如下所示:RFPoint1=RegionPoint1.historyOutputs['RF3'].data之后的流程及基本一样,写入到文件即可。因此,综合来讲,核心语句有:odb=openOdb(path=odbPath,readOnly=TRUE)Step1=odb.steps['Step-1']RegionPoint1=Step1.historyRegions['位置名称']RFPoint1=RegionPoint1.historyOutputs['RF3'].data