Python提取ABAQUS结果数据

背景介绍

  调研发现,传统结构设计过程中需要依赖工程师的理论知识和工程经验,针对具体问题提出初步设计方案,后续通过多次的迭代优化,直到满足要求为止。这种传统设计方法不仅工作量大,效率低,企业还需要投入巨量的成本。因此,我们可以通过优化算法 + 有限元模拟的方式,在加工制作阶段采用优化后的模型参数,该方法能大大减少迭代的次数,缩短产品从立项到上市的周期。

  我们可以将python程序作为ABAQUS和优化算法之间的桥梁,通过编写脚本提取有限元软件的计算结果,作为参数传递给优化算法。其中,在采用Python对ABAQUS结果提取之前,首先我们要了解ABAQUS odb文件结构,具体如下图所示:
Python提取ABAQUS结果数据_第1张图片

ABAQUS odb文件结构

实例展示(采用ABAQUS 2017调试)

1、查询ABAQUS数据结构

# -*-coding:UTF-8 -*-
#***************************************
#**         程序提取场变量输出        **
#** 主要为梁单元应力、内力和节点位移  **
#***************************************
#导入模块
from odbAccess import*
from abaqusConstants import*
import sys
import os
odb =openOdb(path='C:\\Temp\\shangtest.odb')
cpFile=open('artlcF1.txt','w')
#----------------------------------------------------------------------------------------
#创建变量topCenter,得到单元集CENT
topCenter=odb.rootAssembly
print topCenter

2、采用Python提取位移

from odbAccess import*
from abaqusConstants import*
import os
myodb=openOdb(path='C:\\Temp\\jieguosuchu.odb')
RS=myodb.steps['Step-3'].frames[1].fieldOutputs['U'].values
cpFile=open('distance.txt','w')
for i inRS :
     cpFile.write('%d %7.4f %7.4f\n' % (i.nodeLabel,i.data[0],i.data[1]))
else:
cpFile.close()

3、采用Python提取mises应力

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 inrange(len(RF)) :
     cpFile.write('%s\n' % (RF[i].mises))
else:
cpFile.close()

4、提取节点集合上的位移

from odbAccess import*
from abaqusConstants import*
import sys
import os
odb =openOdb(path='C:\\Temp\\shangtest.odb')
#创建变量lastFrame,得到载荷步Step-1的最后一帧
lastFrame= odb.steps['Step-3'].frames[-1]
# Createa variable that refers to the displacement 'U'
# in thelast frame of the first step.
#创建变量displacement ,得到最后一帧的位移场数据
displacement= lastFrame.fieldOutputs['U']
#创建变量center,得到节点集PUNCH
center =odb.rootAssembly.instances['SHANGBIAN-1'].\
    nodeSets['SHANGTEST']
#创建变量centerDisplacement,得到region center的位移场数据
centerDisplacement= displacement.getSubset(region=center)
#输出各种信息,该节点集只有一个节点
for v incenterDisplacement.values:
    print 'Position = ', v.position,'Type =',v.type
    print 'Node label = ', v.nodeLabel
    print 'X displacement = ', v.data[0]
    print 'Y displacement = ', v.data[1]
    print 'Displacement magnitude =',v.magnitude
odb.close()
#----------------------------------------------------------------------------------------

5、提取节点集合上的力

# -*-coding:UTF-8 -*-
#***************************************
#**         程序提取场变量输出        **
#** 主要为梁单元应力、内力和节点位移  **
#***************************************
#导入模块
from odbAccess import*
from abaqusConstants import*
import sys
import os
odb =openOdb(path='C:\\Temp\\shangtest.odb')
cpFile=open('artlcF1.txt','w')
#----------------------------------------------------------------------------------------
#创建变量topCenter,得到单元集CENT
topCenter=odb.rootAssembly.instances['DIBIAN-1'].elementSets['XIAJIECHUTEST']
#创建变量stressField,得到位移场数据
stressField= odb.steps['Step-3']
stressField= odb.steps['Step-3'].frames[3].fieldOutputs['S']
#创建变量field,得到该单元集的积分点的数据
field =stressField.getSubset(region=topCenter,
    position=INTEGRATION_POINT, elementType ='CPS4R')
#创建变量fieldValues,得到field的数值数据
fieldValues= field.values
#循环输出单元号,单元上的积分点号以及积分点的应力分量
for v infieldValues:
#    cpFile.write(v.elementLabel,)   
#    cpFile.write ('Integration Point = ',v.integrationPoint)
# Foreach tensor component.
    for component in v.data:
# Printusing a format. The comma at the end of the
# printstatement suppresses the carriage return.
        cpFile.write ('%-15.5f' % component)
# Aftereach tuple has printed, print a carriage return.
    cpFile.write('\n')
cpFile.close()

注意事项:

  • 在ABAQUS CAE中运行Python文件;

  • A=odb.steps[‘Step-1’].frames和B=odb.steps[‘Step-1’].frames[-1]的理解:A是Python的一个列表,B是表示列表A中最后一个元素

你可能感兴趣的:(西工大期间的工作内容,ABAQUS,有限元,python,优化设计)