你是否有人知道(如果有的话)在Abaqus中提取模型外表面的节点号的方法?表面上我不是指一个实体,我纯粹是在谈论一个物体的外部区域。
谢谢!
答案 0 :(得分:3)
如果您已定义了Set或Surface ,那么获取节点非常简单:
p = mdb.models[name].parts[name]
# Get the Node objects on the previously defined surface:
node_objects = p.surfaces[name].nodes
# Same from a set:
node_objects = p.sets[name].nodes
# Get the labels for the Node objects:
node_labels = [node.label for node in node_objects]
如果使用零件几何体定义“设置”或“曲面”,则重新网格化零件时不会更改。
但是,如果你没有Set或Surface ,并且你不能轻易地创建/获取一个,那么你必须遍历可用于的部分中的其他对象检查它是否在表面上。 @ max9111显示了一种方法。但是,我建议循环部分elementFaces
列表。这是由网格元素定义的唯一Face对象的列表。我说是独一无二的,因为如果两个元素共享一个面,它只会放在列表中一次。这与名称相似的elemFaces
列表不同。查一查。
在下面的示例中,您可以直接获取Node对象,如果需要,可以从中获取节点标签/坐标/等。
p = mdb.models[name].parts[name]
surf_nodes = []
for face in p.elementFaces():
if len(face.getElements()) == 1:
# Then the face has only one associated element, ie it's on the surface.
# Get the nodes on the face:
surf_nodes.extend([node for node in face.getNodes() if node not in surf_nodes])
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Example usage/output for some arbitrary part/mesh:
>>>len(surf_nodes) # <-- A normal list of node objects.
14
>>>surf_nodes[0] # <-- Refer to an individual node object.
mdb.models[name].parts[name].nodes[2]
>>>surf_nodes[0].label # <-- From it you can access all kinds of stuff.
3
>>>surf_nodes[0].coordinates
(0.0, 10.0, 10.0)
因此,在5行代码中,您可以非常有效地获取网格整个表面上的所有节点。当然,这适用于网格中的任何元素类型。不幸的是,你仍然遍历所有内部面,但是这比检查每个元素上的面更少,因为每个内部面只能被检查一次。也就是说,你可以减少必须检查的面数,但这是另一个问题。
答案 1 :(得分:1)
首先,您需要元素的连接和元素类型。在Abaqus手册(+)中,您将找到元素面的定义。 在模型中只存在一次的每个面都是一个曲面,因此属于该曲面的节点是曲面节点。
Abaqus分析用户指南中的(+)28.1.4
以下示例需要numpy&gt; = 1.9。如果你有一个较旧的numpy版本,你必须找到另一种方法来获得只出现一次的面孔。
# for example C3D4, np_Connectivity is a numpy array describing the element connectivity
def get_Surface_Nodes_tet(np_Connectivity):
#Face definition
Face=np.concatenate((np_Connectivity[:,[0,1,2]],np_Connectivity[:,[0,3,1]],np_Connectivity[:,[1,3,2]],np_Connectivity[:,[2,3,0]]))
#Sort the nodes of the faces
Face.sort()
#get the faces which are only once in the array
b = np.ascontiguousarray(Face).view(np.dtype((np.void, Face.dtype.itemsize * Face.shape[1])))
#min numpy version=1.9
_, idx_2,counts = np.unique(b, return_index=True,return_counts=True)
only_once=np.where(counts<2)
idx=idx_2[only_once[0]]
#All nodes of faces, which occur only once are surface nodes
SurfaceNodeLabels=np.unique(Face[idx])
return SurfaceNodeLabels
修改强> 以下函数显示如何使用abaqus cae获取表面节点。所以对于这个版本,需要abaqus cae的许可证。
def get_Surface_Nodes(Faces):
surface_Faces=[]
#get the surface Faces
for i in xrange(0,len(Faces)):
Elements=Faces[i].getElements()
if Elements is not None:
if len(Elements)==1:
surface_Faces.append(i)
S_Node_Labels=[]
#get the corresponding node labels
for i in surface_Faces:
NodeO=Faces[i].getNodes()
for Node in NodeO:
S_Node_Labels.append(Node.label)
S_Node_Labels=np.unique(S_Node_Labels)
return S_Node_Labels
以及如何使用此功能的示例:
import part
import assembly
import numpy as np
#Get the Element Faces
Faces=mdb.models['Model_1'].rootAssembly.instances['Instance_1'].elementFaces
SurfaceNodeLabels=get_Surface_Nodes(Faces)