想要索引Abaqus模型中定义的surface每个单元面上的节点序列,按照内部定义的单元面局部节点序列排列。
为什么会产生上面的问题呢?
本期就借助Python对Abaqus的cae模型进行节点索引,导出surface对应的单元内部节点序列。
首先给大家介绍一下什么是单元面内部节点序列?
在Abaqus中,单元的面节点序列与单元的几何类型密切相关。对于三维单元,Abaqus使用特定的节点排序规则来定义单元的表面(face)及其对应的节点编号。这些节点序列通常用于施加边界条件或载荷,例如表面压强。
具体的排列方式可在手册[1]中查找:
现在尝试使用 Python 读取模型 surface 的节点,并按照 Abaqus 内部定义的 surface 局部节点顺序排列。
当前模型名字为'Model-1',实例Instance 名字为'Part-1-1',定义模型上表面 surface 名字为'Surf-1',编写脚本如下:
#!/user/bin/python
# -*- coding:UTF-8 -*-
from abaqus import *
from abaqusConstants import *
# 获取当前模型中的实例
inst = mdb.models['Model-1'].rootAssembly.instances['Part-1-1']
# 获取表面(Surface)对象
surf = inst.surfaces['Surf-1']
# 获取表面上所有元素
elements = surf.elements
# 获取表面上所有节点,并按顺序存储
node_labels = []
surf_node_labels = [node.label for node in surf.nodes]
for elem in elements:
for face in elem.getElemFaces():
face_node_labels = [node.label for node in face.getNodes()]
# 检查当前面的所有节点是否在表面节点集 合中
if all(label in surf_node_labels for label in face_node_labels):
# 添加新节点标签到列表中,并确保不重复
for label in face_node_labels:
if label not in node_labels:
node_labels.append(label)
print("Element {} face nodes: {}".format(elem.label, face_node_labels))
最终得到结果:
Element 1 face nodes: [1, 4, 13, 10, 35, 39, 28, 37]
Element 3 face nodes: [4, 7, 16, 13, 53, 55, 48, 39]
Element 5 face nodes: [10, 13, 22, 19, 28, 68, 61, 66]
Element 7 face nodes: [13, 16, 25, 22, 48, 78, 74, 68]
上面脚本在索引 surface 的节点时用到了 getElemFaces
方法,目的是想得到每个单元面上 surface 对应的节点,方便后续在程序中对单元进行循环遍历。
如果想直接获取 surface 上的所有节点,可直接使用 mdb.models[name].parts[name].surfaces[name].nodes
方法。Abaqus手册[2]中对于 getElemFaces
方法的定义:
This method returns a tuple of element face objects that share the node.
Arguments:None.
Return value:A tuple of MeshFace objects.
以上就是获取surface单元面上节点序列的方法,之后的操作就是将之代入到节点等效函数中,进行施加表面压强,将在下一期推文中分享,感谢您的阅读。
Abaqus手册: Abaqus-Analysis-User's-Guide-Part6:Elements
[2]Abaqus手册: SCRIPTING-REFERENCE-GUIDE