找回密码
 注册
Simdroid-非首页
查看: 358|回复: 2

[精华汇总] 利用Python对Abaqus进行后处理结果输出

[复制链接]
发表于 2017-11-14 16:19:57 | 显示全部楼层 |阅读模式 来自 广东江门

利用PythonAbaqus进行后处理结果输出

本文作者:长安CAE(技术邻id)

1 概述

在Abaqus的二次开发过程中,通常需要采用Python脚本语言将Abaqus的计算结果进行输出,然后再进行处理。Python使Abaqus的内核语言,使用较为方便,Abaqus运行Python语言的方式有多种,可以直接命令窗口,也可以读入脚本,还可以采用类似批处理的方式。

本次以一个例子细说Python语言在Abaqus后处理中的应用,模型的计算结果云图如图1所示。

图1 计算结果

2 输出所有节点的Mises应力

直接上Python代码:

import os

myodb=openOdb(path='Job-1.odb')

cpFile=open('artlcF1.txt','w')

RF=myodb.steps['Step-1'].frames[1].fieldOutputs['S'].values

for i in range(len(RF)) :

     cpFile.write('%10.3F\n' % (RF.mises))

else:

    cpFile.close()

#引入模块,因为需要打开结果文件

#打开结果文件,并复制给变量myodb

#打开一个txt文件

#将输出场赋值给RF

#循环语句,向txt文件逐行写入mises应力

Abaqus的结构层次分的很细,比如结果文件下分如下:

图2 Model data

使用过Abaqus的都知道step表示载荷步,frame表示载荷子步,因而在读取Mises应力时需要详细地指定输出哪一步的应力,而应力结果是输出场数据(fieldOutput)的中一种,需要指定是何种应力,程序才知道怎么读取并写入。

由于Abaqus里面涉及的变量特别多,通常很难记清楚那一项下面都有哪些量可以调用,此时比较好的方式是采用print 函数查看,例如查看myodb.steps['Step-1'].frames[1].fieldOutputs下面有哪些变量可以调用,在窗口输入:

Print myodb.steps['Step-1'].frames[1].fieldOutputs

显示:

{'CF': 'FieldOutput object', 'E': '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[1]

显示:

({'baseElementType': 'CPS3', 'conjugateData': None, 'conjugateDataDouble': 'unknown', 'data': array([-4.9620509147644, -0.408748656511307, 0.0, 1.02521646022797], 'f'), 'dataDouble': 'unknown', 'elementLabel': 2, 'face': None, 'instance': 'OdbInstance object', 'integrationPoint': 1, 'inv3': -5.08271312713623, 'localCoordSystem': None, 'localCoordSystemDouble': 'unknown', 'magnitude': None, 'maxInPlanePrincipal': -0.188559949398041, 'maxPrincipal': 0.0, 'midPrincipal': -0.188559949398041, 'minInPlanePrincipal': -5.1822395324707, 'minPrincipal': -5.1822395324707, 'mises': 5.09057950973511, 'nodeLabel': None, 'outOfPlanePrincipal': 0.0, 'position': INTEGRATION_POINT, 'precision': SINGLE_PRECISION, 'press': 1.79026651382446, 'sectionPoint': None, 'tresca': 5.1822395324707, 'type': TENSOR_2D_PLANAR})

输出的信息特别多,但是可以看到有mises这一项。

最终得到的txt文件如下:

图3 txt文件

3 输出所有节点的位移

RS=myodb.steps['Step-1'].frames[1].fieldOutputs['U'].values

cpFile=open('distance.txt','w')

for i in RS :

     cpFile.write('%d %7.4f %7.4f\n' % (i.nodeLabel,i.data[0],i.data[1]))

else:

    cpFile.close()

同样的,输出位移场U,txt写入时第一列是节点编号,第二列和第三列分别是x方向位移和y方向位移。

如上面代码中的红色标记,有nodeLable和data两项,nadeLable使节点编号,data则是位移数据。

在窗口输入代码:

Print myodb.steps['Step-1'].frames[1].fieldOutputs['U'].values[1].data

显示:

[ -1.42043456e-03   8.08681193e-07]

分别是两个方向的位移。

再通过data[0]和data[1]读取这两个位移值,最终得到的txt文件如图4。

图4位移输出txt文件

除了读取结果数据,还可以再次基础上做一些运算,同样的输出结果最大值则只需要写一个遍历,比较前后数据大小即可找到最大值,这和其他任何语言都是一样。

文中对输出格式没有解释,可以通过其他书籍和资料了解。

更有精华汇总,点击  阅读原文


发表于 2017-12-7 14:41:24 | 显示全部楼层 来自 湖南长沙
Simdroid开发平台
最近在学python,等等试着做下
回复 不支持

使用道具 举报

发表于 2019-1-14 10:58:26 | 显示全部楼层 来自 北京
楼主太给力了,最近也在研究这个
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-24 04:29 , Processed in 0.029961 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表