在Abaqus有限元分析中,特别是在复合材料、层合结构和界面力学等领域,Cohesive单元(内聚力单元)的准确建立对于模拟材料的损伤和失效过程至关重要。然而,在复杂的多Part装配体中,如何自动识别相邻Part之间的接触面并建立Cohesive单元,一直是技术难点。本文将基于Abaqus二次开发,深入探讨这一过程的关键第一步------共面识别技术。
在Abaqus中处理复杂装配体时,我们常常面临以下挑战:
如何自动识别相邻的Instance?
如何确定Part间的潜在接触表面?
如何处理Abaqus中的几何变换(平移、旋转)?
如何兼容不同建模阶段(几何阶段 vs 网格阶段)?
通常,利用abaqus提供的网格编辑工具或者传统的手动选择方法在大规模模型中不仅效率低下、容易出错,有时甚至无法实现,因此需要开发基于Abaqus Python接口的自动化共面识别算法。
一、技术方案概述
为了让用户有更多的选择,开发的基于Abaqus Python接口的共面识别插件,提供两种检测模式:
(1)基于Instance节点的快速检测:
def detectByInstanceNodes(assembly, tolerance):
# 利用Instance级别的Surface和节点信息
# 适用于网格划分后的模型
(2)基于Part几何的精确检测:
def detectByPartGeometry(assembly, model, tolerance):
# 基于Part几何特征和变换矩阵
# 适用于几何模型阶段
关键做法如下:
1. Abaqus对象模型的理解
在Abaqus二次开发中,关键对象关系如下:
(1)mdb.models[modelName] → 模型对象
(2)model.rootAssembly → 装配体对象
(3)assembly.instances → Instance集合
(4)instance.surfaces → Instance层面的Surface
(5)part.surfaces → Part层面的Surface
2. 包围盒算法的Abaqus实现
(1)包围盒基础类
class BoundingBox:
def __init__(self, min_coords=None, max_coords=None):
self.min = min_coords if min_coords else [1e20, 1e20, 1e20]
self.max = max_coords if max_coords else [-1e20, -1e20, -1e20]
(2)基于Abaqus节点的包围盒创建
@classmethod
def create_from_nodes(cls, nodes):
bbox = cls()
for node in nodes:
bbox.update(node.coordinates) # 使用Abaqus节点的coordinates属性
return bbox if bbox.is_valid() else None
(3)基于Abaqas几何的包围盒创建
@classmethod
def create_from_part_vertices(cls, part):
bbox = cls()
if hasattr(part, 'vertices') and part.vertices:
for vertex in part.vertices:
try:
bbox.update(vertex.pointOn[0]) # 使用Abaqus几何顶点的坐标
except:
continue
return bbox if bbox.is_valid() else None
3. Abaqus变换处理
Abaqus中的Instance通常包含平移和旋转变换:
def applyTransform(bbox, translation, rotation_data):
"""应用Abaqus Instance的坐标变换"""
corners = []
for x in [bbox['min'][0], bbox['max'][0]]:
for y in [bbox['min'][1], bbox['max'][1]]:
for z in [bbox['min'][2], bbox['max'][2]]:
# 平移变换
corner = [x + translation[0], y + translation[1], z + translation[2]]
# 旋转变换
if rotation_data and rotation_data[2] != 0:
corner = applyRotation(corner, rotation_data)
corners.append(corner)
4. 接触检测算法
系统提供两种不同精度的接触检测算法,分别针对网格划分前后的不同应用场景和工程需求。这两种算法的设计基于对Abaqus建模工作流的深入理解,充分考虑了不同阶段数据精度和工程目标的差异。
(1)模式1:尺寸匹配+位置对应(精确检测模式)
模式1算法主要应用于Instance节点模式,专门为网格划分后的精确检测而设计。该算法的核心思想是通过严格的几何条件来确保检测到的接触面具有高度的匹配性,为后续高质量Cohesive单元的生成奠定基础。
算法采用三级检测策略来保证结果的精确性。首先进行尺寸匹配检查,要求两个包围盒在至少两个维度上的尺寸差异不超过设定的容差范围。这一步骤确保了接触面在几何形状上具有良好的一致性,避免了尺寸不匹配导致的Cohesive单元质量问题。其次进行位置对应检查,寻找两个包围盒在哪个维度上存在表面接触关系。最后进行完全重叠验证,要求在接触维度之外的其他两个维度上必须完全重叠,从而确保接触面在空间位置上精确对应。
这种严格的检测标准特别适用于需要高精度Cohesive单元的场景,如复合材料层合板的层间界面、精密装配的接触面等。通过利用网格划分后获得的精确节点坐标数据,模式1算法能够为Cohesive单元生成提供可靠的接触面对应关系。
def surfacesContactMode1(bbox1, bbox2, tolerance):
# 第一步:尺寸匹配检查(关键特征)
# 要求至少2个维度的尺寸相近,确保接触面几何一致性
dim_matches = 0
for i in range(3):
if abs(bbox1['size'][i] - bbox2['size'][i]) <= tolerance:
dim_matches += 1
if dim_matches < 2: # 严格的尺寸匹配要求
return False
# 第二步:精确位置对应检查
for i in range(3):
if (abs(bbox1['max'][i] - bbox2['min'][i]) <= tolerance or
abs(bbox1['min'][i] - bbox2['max'][i]) <= tolerance):
# 第三步:其他维度完全重叠验证
# 确保在接触维度上,其他两个维度完全重叠
other_dims = [j for j in range(3) if j != i]
overlap_count = 0
for j in other_dims:
if (bbox1['min'][j] <= bbox2['max'][j] + tolerance and
bbox1['max'][j] >= bbox2['min'][j] - tolerance):
overlap_count += 1
if overlap_count == 2: # 必须两个维度都完全重叠
return True
return False
(2)模式2:表面接触检测(宽松检测模式)
模式2算法主要应用于Part几何模式,专门为网格划分前的初步检测而设计。该算法采用相对宽松的检测标准,旨在快速发现模型中所有潜在的接触区域,为后续的详细分析提供全面的参考依据。
算法采用两级检测策略来平衡检测效率和覆盖率。首先进行基础重叠检查,快速排除那些在空间中明显分离的包围盒对,减少不必要的计算开销。然后进行表面接触判断,只要在任意一个维度上存在表面接触关系即认为两个包围盒可能接触。这种宽松的标准能够有效适应几何数据的不确定性,在概念设计阶段提供有价值的接触面信息。
模式2算法的优势在于其能够处理几何建模阶段常见的数据近似问题。由于Part几何数据通常基于有限的顶点采样,包围盒计算可能存在一定的不精确性。宽松的检测标准确保了即使在这种情况下,重要的潜在接触区域也不会被遗漏。该算法特别适用于复杂装配体的初步接触分析、概念设计验证等场景。
def checkContact(bbox1, bbox2, tolerance):
# 第一步:基础重叠检查
# 快速排除明显不重叠的包围盒对
for i in range(3):
if bbox1['max'][i] < bbox2['min'][i] - tolerance or bbox1['min'][i] > bbox2['max'][i] + tolerance:
return False
# 第二步:表面接触判断
# 宽松的接触标准,只要任一维度存在表面接触即返回True
contact_dims = 0
for i in range(3):
if (abs(bbox1['max'][i] - bbox2['min'][i]) <= tolerance or
abs(bbox1['min'][i] - bbox2['max'][i]) <= tolerance):
contact_dims += 1
return contact_dims >= 1 # 宽松的接触条件
在实际工程应用中,建议采用两阶段检测策略来充分发挥两种算法的优势。在模型开发的早期阶段,可以使用Part几何模式配合模式2算法进行快速筛查,全面了解模型的接触特性。在网格划分完成后,再使用Instance节点模式配合模式1算法进行精确验证,确保最终用于Cohesive单元生成的接触面满足高质量要求。这种分层递进的检测方法既保证了工程效率,又确保了最终结果的可靠性。
参数设置方面,几何模式通常建议使用较大的容差值(0.1-1.0范围)来适应几何数据的不确定性,而节点模式则建议使用较小的容差值(0.001-0.01范围)来确保检测的精确性。通过合理的参数调整和算法选择,用户可以在不同建模阶段获得最优的接触检测效果。
二、层合板结构接触分析
我们通过一个实际的层合板接触案例来验证程序的正确性:
(1)上部板: up_beam,定义Surface名称为coh_up
(2)下部板: dn_beam,定义Surface名称为coh_dn
1. 网格划分前验证(Part几何模式)
建立宽度为1,厚度为0.1,长度为9的两片相同的板件,两板件上下叠拼组装,不要划分网格,此时上部板件及其上的surface如下图所示。

程序启动界面,用户通过Abaqus的GUI界面输入检测参数:

运行结果如下图所示:

2. 网格划分后验证(Instance节点模式)
对上述两板件的装配体,进行网格划分,下部板件及其surface如下图所示。

修改检测模式重新运行:

运行结果如下图所示:

两种检测模式的结果一致,验证了程序能准确识别出coh_up和coh_dn之间的接触关系。
三、结语
基于Abaqus二次开发的共面识别技术,成功解决了Part间Cohesive单元建立的第一步难题。该技术不仅提高了建模效率,还保证了接触识别的准确性,为后续的Cohesive单元自动生成奠定了坚实基础。通过上下叠拼板件结构测试案例,验证了程序在不同检测模式下的一致性。用户可以根据模型的具体情况选择合适的检测模式,并通过调整容差参数来平衡精度和效率,显著提升了仿真分析的工作效率。
基于识别出的接触表面,可开发Cohesive单元的自动生成模块,实现从共面识别到单元建立的完整自动化流程。