利用Python对Abaqus进行后处理结果输出
-----中大_戚超_2016.10.3
1 概述
在Abaqus的二次开发过程中,通常需要采用Python脚本语言将Abaqus的计算结果进行输出,然后再进行处理。Python使Abaqus的内核语言,使用较为方便,Abaqus运行Python语言的方式有多种,可以直接命令窗口,也可以读入脚本,还可以采用类似批处理的方式。
本次以一个例子细说Python语言在Abaqus后处理中的应用,模型的计算结果云图如图1所示。
图1 计算结果
2 输出所有积分点上的Mises应力
直接上Python代码:
import os
from odbAccess import*
from textRepr import*
myodb=openOdb(path='Job-1.odb')
cpFile=open('','w')
RF=myodb.steps['Step-1'].frames[1].fieldOutputs['S'].values
for i in range(len(RF)) :
cpFile.write('%.3F\n' %(RF[i].mises))
else:
cpFile.close()
#引入模块,因为需要打开结果文件
#打开结果文件,并复制给变量myodb
#打开一个txt文件
#将输出场赋值给RF
#循环语句,向txt文件逐行写入mises应力
Abaqus的结构层次分的很细,比如结果文件下分如下:
使用过Abaqus的都知道step表示载荷步,frame表示载荷子步,因而在读取Mises应力时需要详细地指定输出哪一步的应力,而应力结果是输出场数据(fieldOutput)的中一种,需要指定是何种应力,程序才知道怎么读取并写入。
由于Abaqus里面涉及的变量特别多,通常很难记清楚那一项下面都有哪些量可以调用,此时比较好的方式是采用print 函数查看,例如查看myodb.steps['Step-1'].frames[1].fieldOutputs 下面有哪些变量可
以调用,在窗口输入:
print myodb.steps['Step-1'].frames[1].fieldOutputs
显示:
{'AC YIELD': 'FieldOutput object', 'CF': 'FieldOutput object', 'E': 'FieldOutput object', 'PE': 'Fiel dOutput object', 'PEEQ': 'FieldOutput object', 'PEMAG': 'FieldOutput object', 'RF': 'FieldOutput object', 'S': 'FieldOutput object', 'U': 'FieldOutput object'}
各种不同的结果,包括位移、应力和支反力等等,因此可以知道通过如下的方式读取应力:myodb.steps['Step-1'].frames[1].fieldOutputs ['S']
此时读取的信息特别多,我们想要的是其中的数值信息,因此可以:
myodb.steps['Step-1'].frames[1].fieldOutputs ['S'].values
通过此句能够读取所有节点的应力数据,输出其中一个:
print myodb.steps['Step-1'].frames[1].fieldOutputs ['S'].values[0]
显示:
({'baseElementType': 'C3D8R', 'conjugateData': None, 'conjugateDataDouble': 'unknown', 'da ta': array([-855397.25, 58.817497253418, 358.723419189453, -139.652938842773, -456.986175537109, 4.29301929473877], 'f'), 'dataDouble': 'unknown', 'elementLabel': 1, 'fac e': None, 'instance': 'OdbInstance object', 'integrationPoint': 1, 'inv3': -
855606.3125, 'localCoordSystem': None, 'localCoordSystemDouble': 'unknown', 'magnitude': None, 'maxInPlanePrincipal': 0.0, 'maxPrincipal': 359.0310********, 'midPrincipal': 58.7767 486572266, 'minInPlanePrincipal': 0.0, 'minPrincipal': -
855397.5, 'mises': 855606.375, 'nodeLabel': None, 'outOfPlanePrincipal': 0.0, 'position': INTE G
unknown怎么处理RATION_POINT, 'precision': SINGLE_PRECISION, 'press': 284993.25, 'sectionPoint': None, 'tr esca': 855756.5, 'type': TENSOR_3D_FULL})
输出的信息特别多,但是可以看到有mises这一项。
显示:
3 输出所有节点的位移
RS=myodb.steps['Step-1'].frames[1].fieldOutputs['U'].values cpFile=open('','w')
for i in RS :
cpFile.write('%d %7.4f %7.4f %7.4f\n' % (i.nodeLabel,i.data[0],i.data[1],i.data[2])) else:
cpFile.close()
同样的,输出位移场U,txt写入时第一列是节点编号,第二列,第三列和第四列分别是x方向位移,y方向位移和z方向位移。
如上面代码中的红标记,有nodeLable和data两项,nadeLable使节点编号,data则是位移数据。在窗口输入代码:
print myodb.steps['Step-1'].frames[1].fieldOutputs['U'].values[1]
显示:
({'baseElementType': '', 'conjugateData': None, 'conjugateDataDouble': 'unknown', 'data': arr ay([-0.0
0350000010803342, 7.22819168004207e-
05, 0.000206231634365395], 'f'), 'dataDouble': 'unknown', 'elementLabel': None, 'face': Non e, 'instance': 'OdbInstance object', 'integrationPoint': None, 'inv3': None, 'localCoordSystem': None, 'localCoordSystemDouble': 'unknown', 'magnitude': 0.0035068157594651, 'maxInPlan ePrincipal': None, 'maxPrincipal': None, 'midPrincipal': None, 'minInPlanePrincipal': None, 'mi nPrincipal': None, 'mises': None, 'nodeLabel': 2, 'outOfPlanePrincipal': None, 'position': NODA L, 'precision': SINGLE_PRECISION, 'press': None, 'sectionPoint': None, 'tresca': None, 'type': VECTOR})
print myodb.steps['Step-1'].frames[1].fieldOutputs['U'].values[1].data
显示:
[ -3.50000011e-03 7.22819168e-05 2.06231634e-04]
最后执行程序,显示:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论