调研发现,传统结构设计过程中需要依赖工程师的理论知识和工程经验,针对具体问题提出初步设计方案,后续通过多次的迭代优化,直到满足要求为止。这种传统设计方法不仅工作量大,效率低,企业还需要投入巨量的成本。因此,我们可以通过优化算法 + 有限元模拟的方式,在加工制作阶段采用优化后的模型参数,该方法能大大减少迭代的次数,缩短产品从立项到上市的周期。
我们可以将python程序作为ABAQUS和优化算法之间的桥梁,通过编写脚本提取有限元软件的计算结果,作为参数传递给优化算法。其中,在采用Python对ABAQUS结果提取之前,首先我们要了解ABAQUS odb文件结构,具体如下图所示:
ABAQUS odb文件结构
# -*-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
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()
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()
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()
#----------------------------------------------------------------------------------------
# -*-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()
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删