Abaqus:一种本地化外部节点的方法?

时间:2017-04-25 11:30:44

标签: python abaqus

你是否有人知道(如果有的话)在Abaqus中提取模型外表面的节点号的方法?表面上我不是指一个实体,我纯粹是在谈论一个物体的外部区域。

谢谢!

2 个答案:

答案 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)