首页/文章/ 详情

ABAQUS odb数据解析系列文章---getSubset

1年前浏览4355

“场变量内部方法getSubset简析



    在前一篇文章中, 我们介绍了场变量(以位移和应力为例)的存储方式, 接上篇:

















>>> from odbAccess import openOdb>>> from textRepr import prettyPrint>>> file = r"W:\temp\Job-gzdemo.odb">>> o = openOdb(path = file)>>> steps = o.steps>>#根据step名称获取对应的step>>> step = steps["Step-test"]>>> #假设我们只关心该step最后一个增量步的结果 >>> f1 = step.frames[-1]>>> fop = f1.fieldOutputs>>> prettyPrint(fop)>>> f_U = fop["U"]>>> 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&region)


    region参数:指定提取值的区域的OdbSet。为了提高性能,集 合中的节点或元素标签最好按升序排序。


    region参数接收的是一个OdbSet, 其内容可以是多值的(也就是说, 如果要提取位移值则应传入nodeSet, 如果要提取应力数据则应提供elementSet), 那么其返回值必然是一个列表形式的数据. 


    这样一来我们就明确了一点, 那就是如果要读取一个节点(或积分点)的数据, 可以采用遍历前处理过程中定义好的Set的形式.如下可以获取每一个Set的最大vonMises值:












f_S = fop["S"]es = o.rootAssembly.elementSetsfor 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)
   






来源:SimCoder
Abaqus
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-02-02
最近编辑:1年前
签我的导演他姓张
本科 怕什么真理无穷进一寸有一寸欣喜
获赞 51粉丝 51文章 44课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈