我想要的是什么:在节点处的应变值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”,一切都没有问题。
错误发生在第一个循环中。因此,它不是在错误发生之前循环几个循环的情况。
问题:有谁知道上述代码中导致错误的原因是什么?
答案 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
)。