我有很多计算结果的ODB文件,需要把模型四周所有节点的RVF值求和。如果每个ODB文件都自己手动选择很费时费力,非常的朴实无华且枯燥。我想做的就是通过编写python程序进行后处理。
大体思路参考Python脚本提取Abaqus ODB文件中指定节点数据这篇文章,比这篇文章难的地方在于我仅知道要提取的节点在四个边界上而不知道节点的具体标签(Label)。因此首先需要知道这些标签才能套用那篇文章的方法。于是就有了本篇文章的解决思路,如下:
第一步,提取这个部件上所有节点的坐标信息及标签;
第二步,遍历各节点的坐标信息,判断该节点是否位于边界上,将位于边界上的节点的标签单独存放到一个数组;
第三步,创建目标节点的元组集合备用,至此,后续大体参考上篇文章;
第四步,提取该部件的RVF场;
第五步,使用getSubset函数提取目标节点的RVF值;
第六步,对值求和并输出结果。
python 基本操作;numpy数组操作;
下面这段程序主要针对提取一个odb文件,多个odb文件的提取只需要加个循环。
本数值模型概况如下,如果是不同的模型可以修改对应的信息:
模型地址:D:\w6s6.odb
目标节点所在部件:SOIL-1(该名称与Create Display Group中的Part instances对应,如下图所示)
底部边界Y值为0;上部边界Y值为120;左右两侧X值分别为-60,60。
要提取结果的分析步为“Step-1”
#!/user/bin/python
# -* - coding:UTF-8 -*-
# 读取变形前后所有节点坐标,读取变形位移
import numpy as np
from odbAccess import*
odb=openOdb(path=r"D:\w6s6.odb")
assembly=odb.rootAssembly
part=assembly.instances['SOIL-1']
nodes = part.nodes
# 提取该部件所有节点的坐标信息和标签放置在coor_lab二维numpy数组中,每个节点的信息单独放一行,共4列,分别是X值、Y值、Z值、Label
coor_lab = np.empty(shape=[0, 4])
for node in nodes:
row = list(node.coordinates)
row.append(node.label)
coor_lab = np.append(coor_lab, [row], 0)
# 筛选目标节点并提取其Label信息形成元组序列nodes_label,其中Label必须为int数据类型
boundary_nodes = coor_lab[(np.where((coor_lab[:, 1] == 0)|(coor_lab[:, 1] == 120)|(coor_lab[:, 0] == 60)|(coor_lab[:, 0] == -60)))]
nodes_label = tuple(boundary_nodes[:, 3])
nodes_label = tuple(map(int, nodes_label))
# 提取rvf场信息,提取目标节点的RVF值并求和
node_set = my_odb.rootAssembly.instances['SOIL-1'].NodeSetFromNodeLabels(name='set_for_datass',nodeLabels=nodes_label)
step = my_odb.steps['Step-1']
frame = step.frames[-1]
rvf_field = frame.fieldOutputs['RVF']
local_por_values = rvf_field.getSubset(region=node_set).values
sum_rvf = sum([i.data for i in local_por_values])
print(sum_rvf)
程序计算结果与手动计算结果分毫不差,任务圆满完成,完结撒花。
程序结果
手动操作结果
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删