ABAQUS可以利用Python脚本进行数据提取,方便快捷,一劳永逸,实例如下:
#!/user/bin/python
# -*- coding:UTF-8 -*-
#***************************************
#**
程序提取场变量输出
**
#** 主要为梁单元应力、内力和节点位移 **
#***************************************
#导入模块
from odbAccess import*
from abaqusConstants import*
import sys
import os
def getFeildOutputs(odb_name,beam):
##***************************************
#------------- 参数说明 ----------------
#odb_name:odb文件名字,包含路径;
#beam:梁单元编号及节点,元组格式
#***************************************
#打开ODB文件
print
'----------------------------------------------------'
print 'The name and path
of odb file: '+odb_name
odb=openOdb(path=odb_name)
#获取assembly和instance
assembly=odb.rootAssembly
instance_name=
assembly.instances.keys()
getInstance =
assembly.instances[instance_name[0]]
print 'The name of
instance: '+instance_name[0]
#创建单元集合,注意创建集合的结果是ODB数据库中建立了相应的集合,并且不能删除,若ODB数据库已经
#含有了相同名字的集合,则创建失败,出现“duplicate set or surface name **”的错误信息
beam_element_num='beam_element_%d'�am[0]
getInstance.ElementSetFromElementLabels(name=beam_element_num,elementLabels=(beam[0],))
#创建节点集合
node_num1='node_num_%d'�am[1]
node_num2='node_num_%d'�am[2]
getInstance.NodeSetFromNodeLabels(name=node_num1,nodeLabels=(beam[1],))
getInstance.NodeSetFromNodeLabels(name=node_num2,nodeLabels=(beam[2],))
#输出分析步
step_name =
odb.steps.keys()
print 'The odb file has
%i steps: '%(len(step_name))
for step in
step_name:
print
'%s'%step
print '\n'
#提取结果的分析步
print 'The necessary
step: '+step_name[-1]
print '\n'
getStep=odb.steps[step_name[-1]]
#分析步所有的帧
frame_all=getStep.frames
print 'The name,type and
location of field variable: '
for f in
frame_all[-1].fieldOutputs.values():
print f.name,':',f.description
print 'Type',f.type
for loc in f.locations:
print
'Position:',loc.position
#读取结果
disp1=[]
#储存节点1
xyz位移
disp2=[]
#储存节点2
xyz位移
nset1=getInstance.nodeSets[node_num1]
nset2=getInstance.nodeSets[node_num2]
sect_force=[]
#储存sf1 sf2
sf3
sect_moment=[]
#储存sm1 sm2
sm3
elset=getInstance.elementSets[beam_element_num]
type=getInstance.elementSets[beam_element_num].elements[0].type
#单元类型
sectionCategory=getInstance.elementSets[beam_element_num].elements[0].sectionCategory
sectPointNum=len(sectionCategory.sectionPoints)
#截面点个数
s11=[]
#储存最大S11应力
print 'Element
type'+type+',section point %i 个: '%(sectPointNum)
for fi in
range(len(frame_all)):
frame=frame_all[fi]
#节点位移
disp=frame.fieldOutputs['U']
dispxyz1=disp.getSubset(region=nset1)
dispxyz2=disp.getSubset(region=nset2)
disp1.append((dispxyz1.values[0].data[0],dispxyz1.values[0].data[1],dispxyz1.values
[0].data[2])) #1节点位移
disp2.append((dispxyz2.values[0].data[0],dispxyz2.values[0].data[1],dispxyz2.values
[0].data[2])) #2节点位移
#单元内力
sf=frame.fieldOutputs['SF']
sF=sf.getSubset(region=elset,position=INTEGRATION_POINT)
sect_force.append((sF.values[0].data[0],sF.values[0].data[1],sF.values[0].data[2]))
sm=frame.fieldOutputs['SM']
sM=sm.getSubset(region=elset,position=INTEGRATION_POINT)
sect_moment.append((sM.values[0].data[0],sM.values[0].data[1],sM.values[0].data[2]))
#单元应力,提取截面点最大拉、压应力
maxS11=0
minS11=0
for sectPoint in
sectionCategory.sectionPoints:
try:
stressField=frame.fieldOutputs['S']
field=stressField.getSubset
(连接下行)
(region=elset,position=INTEGRATION_POINT,sectionPoint=sectPoint)
if
field.values[0].data[0]>maxS11:
maxS11=field.values[0].data[0]
#应力分量S11
if field.values[0].data[0]
minS11=field.values[0].data[0]
#应力分量S11
except
IndexError: #跳过不输出应力的截面点
continue
s11.append((maxS11,minS11))
return
[disp1,disp2,sect_force,sect_moment,s11]
#----------------------------------------------------------------------------------------
if __name__ == '__main__':
odbname=['SeismicAnalysis.odb']
odb_name=odbname[0]
beam=(20000021,3605,5388)
data=getFeildOutputs(odb_name,beam)
参考文献:
Abaqus Scripting Reference Manual
Abaqus Scripting User's Manual
加载中,请稍候......