加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Python脚本提取ABAQUS场输出变量

(2014-04-27 22:08:02)
标签:

abaqus

python

提取

变量场

结果文件

it

分类: abaqus资料
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

0

阅读 收藏 喜欢 打印举报/Report
前一篇:dyna功能
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有