“ 场变量内部方法addData简析”
getSubset和addData这两个函数,可以说是Abaqus后处理二次开发的两个核心函数。getSubset函数在上一篇文章中已经详细介绍过,这篇文章将主要讲解addData函数的使用方法。
addData函数的主要功能,顾名思义即向Odb文件内写入数据的方法,在Abaqus帮助文档中可以找到该函数的简介,不过该简介过于简略,要想通过学习帮助文档相关内容达到可以使用该函数的目的,还是会走很多弯路的。
以下为基础代码,本文将只对最后一个增量步即frame添加数据,如果有的读者希望得到自定义数据随载荷步变化的情况,可以遍历所有frames,道理上是等同的:
from odbAccess import openOdb
from textRepr import prettyPrint
from abaqusConstants import *
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]
既然要向Odb添加数据,那么为了维护数据结构,应新建一个FieldOutput用以存放数据,新建一个FieldOutput的函数位于frame内,上述代码的f1即可调用:
# 使用FieldOutput创建一个fieldOutput,用于存放二次开发的结果
testf = f1.FieldOutput(name='testdata',
description='this is a test',
type=SCALAR)
01
—
FieldOutput
该函数可以通过frame实例进行调用,以定义该frame下的场变量。
必选参数:
name:场变量名
description:关于场变量的描述
type:数据类型,abaqusConstant :SCALAR,VECTOR,TENSOR_3D_FULL,TENSOR_3D_PLANAR, TENSOR_3D_SURFACE, TENSOR_2D_PLANAR, and TENSOR_2D_SURFACE
02
—
addData
该方法用于向调用它的FieldOutput添加数据
必选参数:
position:通过abaqusConstant常量指定数据计算或存储的位置:
NODAL,INTEGRATION_POINT,ELEMENT_NODAL,CENTROID
instance:Abaqus装配体是以instance的形式进行组织了,其允许各个instance直接节点号相同,所以在此时需要指明是对哪一个instance进行操作,为后面的参数(labels)指定命名空间。
labels:label的概念看起来像是Abaqus独有的概念,我觉得可以把它理解成节点或者单元的ID。该参数是一个整数(代表节点或单元或积分点或中心点)序列,是一个一维的元组。
data:将被写入的数据。该参数是一个元素为元组的元组,如果对应的FieldOutput为标量,则子序列应为单元素元组。data的长度必须与labels等长,并且数据时一一对应的,要注意顺序问题。
第2部分的正文内容从这里开始。
03
—
计算vonMises与MaxPrincipal的插值写入Odb
from odbAccess import openOdb
from textRepr import prettyPrint
from abaqusConstants import *
file = r"W:\temp\Job-gzdemo.odb"
o = openOdb(path = file)
steps = o.steps
# 根据step名称获取对应的step
step = steps["Step-test"]
# 假设我们只关心该step最后一个增量步的结果
# 如果希望获得自定义结果随载荷步的变化,可以遍历frames
f1 = step.frames[-1]
# 获取目标instance,同理,可以使用遍历
inst = o.rootAssembly.instances["PART-1-1"]
labels = [] # 存放元素ID
data = [] # 存放计算数据
fop = f1.fieldOutputs
f_S = fop["S"]
es = inst.elements
for i in es:
# 使用上一篇文章中介绍的getSubset方法获得单元素数据
fopSFormSet = f_S.getSubset(region=i)
for j in fopSFormSet.values:
maxMises = j.mises
maxPrincipal = j.maxPrincipal
vp = maxMises - maxPrincipal
labels.append(i.label)
data.append((vp,))
# 使用FieldOutput创建一个fieldOutput,用于存放二次开发的结果
testf = f1.FieldOutput(name='v_sub_p',
description='vonMises subtract MaxPrincipal',
type=SCALAR)
testf.addData(position=CENTROID,
instance=inst,
labels=tuple(labels),
data=tuple(data))
04
—
总结
通过addData方法可以将在分析结果的基础上计算得到的你所想要关注的指标写入Odb,进行后处理可视化。