“场变量内部方法getSubset简析”
在前一篇文章中, 我们介绍了场变量(以位移和应力为例)的存储方式, 接上篇:
> from odbAccess import openOdb
> from textRepr import prettyPrint
"W:\temp\Job-gzdemo.odb" > file = r
> o = openOdb(path = file)
> steps = o.steps
#根据step名称获取对应的step >
"Step-test"] > step = steps[
#假设我们只关心该step最后一个增量步的结果 >
1] > f1 = step.frames[-
> fop = f1.fieldOutputs
> prettyPrint(fop)
"U"] > f_U = fop[
_ > f_U.__members_
['baseElementTypes', 'bulkDataBlocks', 'componentLabels', 'description', 'isComplex', 'locations', 'name', 'type', 'validInvariants', 'values']
_ > f_U.__methods_
['addData', 'getConnectorFieldXformedToNodeA', 'getScalarField', 'getSubset', 'getTransformedField', 'setComponentLabels', 'setDataType', 'setMaxClamp', 'setMinClamp', 'setValidInvariants']
通过观察场变量U中的属性与方法, 从名字上判断, 可以发现在方法中的addData与getSubset看起来比较有用, 因为当前的场变量信息存储的是整体模型的位移场变量结果, 而我们要提取的信息一般都是以Set或者单个节点或单元的结果, 而f_U并没有提供这样一个方法, 只有getSubset看起来功能比较接近. 而addData则可以认为是向odb中写入数据的方法.
这篇文章中, 我们将一探getSubset方法.
Odb commands-->FieldOutput Object, 可以看见好多个getSubset方法, 他们根据不同的可选参数而返回不同的结果, 以下将介绍其中两个我感觉比较实用的(也是我使用过的两个), 其余的道理也都是差不多的.
01
—
getSubset(position, readOnly)
position参数必须引入abaqusConstants:
from abaqusConstants import *
NODAL, 指定返回在节点处计算的值.
INTEGRATION_POINT, 指定返回在积分点处返回的值.
ELEMENT_NODAL,指定返回由积分点计算结果外推得到的值.
CENTROID,指定由积分点处计算的结果外推得到的质心处的值.
readOnly参数:
一个布尔值,指定是否将此调用返回的外推数据写入输出数据库。缺省值为false.
position参数的前两个可选项是指定计算得到的值, 后两个参数指定的是由积分点计算得到的值的外推值. 也就是说由节点计算的值是无法外推的(即如果读取位移结果的时候使用后两个参数将返回空列表).
对于C3D8R单元, 只有一个积分点, 如果处于特殊需求, 可以使用ELEMENT_NODAL参数将计算结果外推至单元节点处(此时你将发现结果列表变为之前的8倍长).
02
—
getSubset(const odb_Set®ion)
region参数:指定提取值的区域的OdbSet。为了提高性能,集 合中的节点或元素标签最好按升序排序。
region参数接收的是一个OdbSet, 其内容可以是多值的(也就是说, 如果要提取位移值则应传入nodeSet, 如果要提取应力数据则应提供elementSet), 那么其返回值必然是一个列表形式的数据.
这样一来我们就明确了一点, 那就是如果要读取一个节点(或积分点)的数据, 可以采用遍历前处理过程中定义好的Set的形式.如下可以获取每一个Set的最大vonMises值:
f_S = fop["S"]
es = o.rootAssembly.elementSets
for i in range(len(es.keys())):
setXE = es[es.keys()[i]]
fopSFormSet = f_S.getSubset(region=setXE)
setName = es.keys()[i]
for j in fopSFormSet.values:
if j.mises >= maxMises:
maxMises = j.mises
elemLabel = j.elementLabel
print(maxMises)