Abaqus Python脚本 - 从* .odb文件中读取“TENSOR_3D_FULL”数据

时间:2017-08-07 22:45:48

标签: python-3.x abaqus

我想要的是什么:在节点处的应变值LE11,LE22,LE12 我的脚本是:

#!/usr/local/bin/python
# coding: latin-1

# making the ODB commands available to the script
from odbAccess import*
import sys
import csv

odbPath = "my *.odb path"   
odb = openOdb(path=odbPath)    
assembly = odb.rootAssembly

# count the number of frames    
NumofFrames = 0
for v in odb.steps["Step-1"].frames:
    NumofFrames = NumofFrames + 1

# create a variable that refers to the reference (undeformed) frame    
refFrame = odb.steps["Step-1"].frames[0]  

# create a variable that refers to the node set ‘Region Of Interest (ROI)’    
ROINodeSet = odb.rootAssembly.nodeSets["ROI"]

# create a variable that refers to the reference coordinate ‘REFCOORD’    
refCoordinates = refFrame.fieldOutputs["COORD"]

# create a variable that refers to the coordinates of the node 
# set in the test frame of the step        
ROIrefCoords = refCoordinates.getSubset(region=ROINodeSet,position= NODAL)

# count the number of nodes    
NumofNodes =0
for v in ROIrefCoords.values:
    NumofNodes = NumofNodes +1


# looping over all the frames in the step
for i1 in range(NumofFrames):

# create a variable that refers to the current frame
currFrame = odb.steps["Step-1"].frames[i1+1]

# looping over all the frames in the step    
for i1 in range(NumofFrames):

    # create a variable that refers to the strain 'LE'    
    Str = currFrame.fieldOutputs["LE"]                
    ROIStr = Str.getSubset(region=ROINodeSet, position= NODAL)

    # initialize list
    list = [[]]

    # loop over all the nodes in each frame
    for i2 in range(NumofNodes):

        strain = ROIStr.values [i2]

        list.insert(i2,[str(strain.dataDouble[0])+";"+str(strain.dataDouble[1])+\
        ";"+str(strain.dataDouble[3]))

    # write the list in a new *.csv file (code not included for brevity)


odb.close()

我得到的错误是
    strain = ROIStr.values [i2]
IndexError:序列索引超出范围

其他信息:
ROIStr的详细信息:

ROIStr.name
'LE'
ROIStr.type
TENSOR_3D_FULL
OIStr.description
'对数应变分量' ROIStr.componentLabels
('LE11','LE22','LE33','LE12','LE13','LE23')
ROIStr.getattribute
'openOdb的getattribute(r'path到 .odb')。steps ['Step-1']。frames [1] .fieldOutputs ['LE']。getSubset(position = INTEGRATION_POINT,region = openOdb(r'路径 .odb')。rootAssembly.nodeSets ['ROI'])'

当我对VECTOR对象使用相同的代码时,比如节点位移的“U”或节点坐标的“COORD”,一切都没有问题。
 错误发生在第一个循环中。因此,它不是在错误发生之前循环几个循环的情况。

问题:有谁知道上述代码中导致错误的原因是什么?

1 个答案:

答案 0 :(得分:0)

这是您获得IndexError的原因。菌株(显然)在积分点计算;根据 ABQ脚本参考指南

  

SymbolicConstant,指定元素中输出的位置。可能的值有:

     

NODAL,指定在节点处计算的值。

     

INTEGRATION_POINT,指定在积分点计算的值。

     

ELEMENT_NODAL,指定通过外推在积分点计算的结果获得的值。

     

CENTROID,指定通过外推在积分点计算的结果获得的质心值。

因此,为了使用您的代码,您应该使用position= ELEMENT_NODAL

获取结果
ROIrefCoords = refCoordinates.getSubset(region=ROINodeSet,position= ELEMENT_NODAL)

ROIStr.values[0].data

然后,您将获得一个包含张量的6个独立分量的数组。

替代解决方案

要读取节点集的时间序列结果,可以使用函数xyPlot.xyDataListFromField()。我注意到这个功能比使用odbread快得多。代码也更短,唯一的缺点是你必须获得abaqus许可才能使用它(与使用abaqus python的odbread相比,后者只需要安装的abaqus版本而不需要获得网络执照)。

对于您的应用程序,您应该执行以下操作:

from abaqus import *
from abaqusConstants import *
from abaqusExceptions import *
import visualization
import xyPlot
import displayGroupOdbToolset as dgo


results = session.openOdb(your_file + '.odb')
# without this, you won't be able to extract the results
session.viewports['Viewport: 1'].setValues(displayedObject=results) 
xyList = xyPlot.xyDataListFromField(odb=results, outputPosition=NODAL, variable=((
        'LE', INTEGRATION_POINT, ((COMPONENT, 'LE11'), (COMPONENT, 'LE22'), (
        COMPONENT, 'LE33'), (COMPONENT, 'LE12'), )), ), nodeSets=(
        'ROI', ))

(当然你必须添加LE13等。)

您将获得xyData

的列表
type(xyList[0])
<type 'xyData'>

包含每个节点和每个输出的所需数据。因此它的大小将是

len(xyList)
number_of_nodes*number_of_requested_outputs

列表的第一个number_of_nodes元素是每个节点的LE11,然后是LE22,依此类推。

然后,您可以在NumPy数组中对其进行转换:

LE11_1 = np.array(xyList[0])

在第一个节点处为LE11,尺寸为:

LE.shape
(NumberTimeFrames, 2)

也就是说,对于每个时间步,您都有时间和输出变量。 NumPy数组也很容易在文本文件上编写(请查看numpy.savetxt)。