在Abaqus复杂装配体分析领域,部件间Cohesive单元的建立一直是技术难点。继之前分享的《Abaqus部件间Cohesive单元建立之共面识别技术》、《Abaqus部件间Cohesive单元建立之单元和节点对提取技术》和《Abaqus部件间Cohesive单元模拟的困境与解决方案》三篇博文后,今天我将为大家带来一种全新的解决方案——基于部件合并的Cohesive单元建立方法。
一、之前的部件间Cohesive单元建立的深层瓶颈
在Abaqus复杂装配体的有限元分析中,部件间Cohesive单元的建立始终是技术难点所在。回顾我们之前探讨的多种解决方案,这些方法虽然在特定场景下有效,但在处理大规模复杂装配体时仍面临诸多挑战。
问题的本质在于部件独立性带来的数据隔离。每个部件在Abaqus中维护着独立的几何拓扑和网格体系,这种设计虽然保证了建模的模块化,却在部件间连接模拟上设置了天然屏障。当我们尝试在不同部件间建立共享节点的Cohesive单元时,就如同要在两个独立的数字王国之间架设桥梁,需要克服节点编号体系、坐标系统、网格密度等多重障碍。
# 之前的方法面临的典型困境
部件A节点体系: [1, 2, 3, 4, ...] # 独立的编号空间
部件B节点体系: [1, 2, 3, 4, ...] # 相同的编号,不同的物理实体
# 即使空间坐标完全对应,节点编号的独立性使得直接连接变得异常复杂
部件A节点1: (x1, y1, z1)
部件B节点1: (x1, y1, z1) # 相同坐标,不同标识!
二、部件合并法的核心创新思路
基于对之前的方法局限性的深刻认识,我们提出了一种逆向思维的解决方案:既然部件间的连接如此困难,何不先将部件合并,再在合并后的单一部件内部识别连接界面?
这种思路的转变具有现实意义。之前的方法试图在保持部件独立性的前提下建立连接,而合并法则通过消除部件边界来从根本上解决问题。具体而言:
之前的思路:部件间连接 → 复杂匹配算法 → 跨部件数据协调
合并法思路:部件合并 → 内部界面识别 → 直接建立连接
合并法的实施包含两个核心环节:
(1) 智能部件合并
在Abaqus/CAE中执行部件合并操作时,必须选择"保留边界"(Retain Boundary)选项。这一选择确保了合并后的部件虽然在外观上是单一的,但在内部仍然保持着原有部件的几何边界信息。
# 合并操作的几何意义
原始状态: [部件A] + [部件B] = 两个独立的几何实体
合并操作: Merge with "Retain Boundary"
结果状态: [部件A|部件B] = 单一部件,包含多个Cell
(2) 内部边界智能识别
合并后的部件包含多个Cell(原部件),我们需要精确识别这些Cell之间的接触界面。这通过分析面的连接特性来实现:
def analyze_part_faces(part_obj):
"""
基于几何拓扑的面类型智能识别
"""
external_faces_dict = {}
interface_faces = []
# 初始化每个Cell的外表面存储
cell_count = len(part_obj.cells)
for cell_index in range(cell_count):
external_faces_dict[cell_index] = []
# 核心识别逻辑
for face in part_obj.faces:
cell_indices = face.getCells()
if len(cell_indices) == 1:
# 外表面:只连接一个Cell
cell_index = cell_indices[0]
external_faces_dict[cell_index].append(face)
elif len(cell_indices) >= 2:
# 内部边界面:连接多个Cell,即Cohesive单元的候选位置
interface_faces.append(face)
return external_faces_dict, interface_faces
三、基于合并法的自动化处理
(1)多层次集合管理体系
为了支持后续的Cohesive单元建立,我们需要在识别出的边界面上创建系统的集合和表面:
def create_sets_and_surfaces(part_obj, part_name, external_faces_dict, interface_faces, cleanup_first=True):
"""
建立层次化的几何特征管理体系
"""
clean_part_name = part_name.replace('-', '_').replace(' ', '_')
# 1. 创建全局公共表面
if interface_faces:
surface_name = "Interface_{}".format(clean_part_name)
# 将所有内部边界面聚合为单一表面,便于批量操作
face_array = part_obj.faces[interface_faces[0].index:interface_faces[0].index+1]
for i in range(1, len(interface_faces)):
face_array = face_array + part_obj.faces[interface_faces[i].index:interface_faces[i].index+1]
part_obj.Surface(name=surface_name, side1Faces=face_array)
# 2. 为每个Cell创建独立的外表面集合
for cell_index, external_faces in external_faces_dict.items():
if external_faces:
set_name = "Ext_Cell{}_{}".format(cell_index, clean_part_name)
# 创建按Cell分类的外表面集合
face_array = part_obj.faces[external_faces[0].index:external_faces[0].index+1]
for i in range(1, len(external_faces)):
face_array = face_array + part_obj.faces[external_faces[i].index:external_faces[i].index+1]
part_obj.Set(name=set_name, faces=face_array)
# 3. 创建详细的公共面对集合
for interface_face in interface_faces:
connected_cells = interface_face.getCells()
if len(connected_cells) == 2:
set_name = "Interface_Cell{}_{}_{}".format(
connected_cells[0], connected_cells[1], clean_part_name)
# 为每对相邻Cell创建专门的界面集合
part_obj.Set(name=set_name, faces=[interface_face])
(2) 装配体级别的扩展应用
合并法的优势不仅体现在单一部件层面,在复杂装配体中同样表现出色:
def analyze_assembly_faces(instances, skip_suppressed=True):
"""
装配体级别的面分析,支持多实例协同处理
"""
all_interface_faces = []
all_external_faces = []
for instance_name, instance_obj in instances.items():
# 智能状态检测,自动跳过被抑制的实例
if skip_suppressed and hasattr(instance_obj, 'suppressed') and instance_obj.suppressed:
continue
# 实例级别的面分析
for face in instance_obj.faces:
cell_indices = face.getCells()
if len(cell_indices) == 1:
all_external_faces.append({
'face': face,
'cell_index': cell_indices[0],
'instance_name': instance_name,
'instance_obj': instance_obj
})
elif len(cell_indices) >= 2:
all_interface_faces.append({
'face': face,
'cell_indices': cell_indices,
'instance_name': instance_name,
'instance_obj': instance_obj
})
return all_external_faces, all_interface_faces
四、圆柱体-带孔板合并实例验证
为了直观验证部件合并法在识别内部公共面方面的可行性和有效性,我们设计了一个典型的圆柱体-带孔板装配模型。
(1) 模型建立与合并
1. 初始几何配置:
我们创建了两个独立的部件:
带孔板(Part-1):10× 10 × 2的板件,中心包含直径4的通孔。
圆柱体(Part-2):直径4,高度5;


2. 关键合并操作
在Abaqus/CAE中执行合并操作:
- Assembly模块下选择带孔板和圆柱体两个部件实例
- 使用"Merge/Cut"功能中的"Merge"选项
- 勾选"Retain boundary edges"选项
- 生成新的合并部件"Part-3"
# 合并后的几何结构
合并后部件: Merged_Part
包含Cell数量: 2个
Cell-0: 原带孔板(去除圆柱重叠部分)
Cell-1: 原圆柱体
内部边界: 圆柱面与孔面的接触区域

(2)公共面识别结果
运行我们的识别程序后,获得了显著的成果:
def find_common_faces_main():
"""
主程序执行结果
"""
print("=== 圆柱体-带孔板模型分析结果 ===")
print("模型名称: Cylinder_Plate_Model")
print("分析类型: 部件级别")
# 分析结果统计
external_faces_dict, interface_faces = analyze_part_faces(merged_part)
print("部件包含Cell数量: {}".format(len(merged_part.cells)))
print("识别出的外表面数量: {}".format(
sum(len(faces) for faces in external_faces_dict.values())))
print("识别出的内部边界面数量: {}".format(len(interface_faces)))
# 创建集合和表面
create_sets_and_surfaces(merged_part, "Merged_Part",
external_faces_dict, interface_faces)
程序输出结果:
=== 开始处理模型 'Model-1' 的部件 ===
找到 3 个部件
处理部件: Part-1
部件只有 1 个体,跳过处理
处理部件: Part-2
部件只有 1 个体,跳过处理
处理部件: Part-3
部件包含 2 个体,开始分析面...
找到 1 个内部边界面, 9 个外表面
内部边界面 7: 连接体 (0, 1)
** 清理部件中之前创建的集合和表面 **
删除集合: Ext_Cell0_Part_3
删除集合: Ext_Cell1_Part_3
删除集合: Interface_Cell0_1_Part_3
删除表面: Interface_Part_3
总共删除了 3 个集合和 1 个表面
成功创建表面: Interface_Part_3 (包含 1 个面)
成功创建集合: Ext_Cell0_Part_3 (实际包含 6 个面)
成功创建集合: Ext_Cell1_Part_3 (实际包含 3 个面)
** 创建公共面集合 **
成功创建公共面集合: Interface_Cell0_1_Part_3 (连接体: [0, 1])
总共创建了 1 个公共面集合
** 创建结果验证 **
表面 'Interface_Part_3' 包含 1 个面
集合 'Ext_Cell0_Part_3' 包含 6 个面
集合 'Ext_Cell1_Part_3' 包含 3 个面
** 公共面集合验证 **
公共面集合 'Interface_Cell0_1_Part_3' 包含 1 个面
=== 模型 'Model-1' 部件处理完成 ===
Abaqus中对应的结果如下:



五、结语
"在工程仿真的世界里,最复杂的难题往往需要最简单的解决方案。"部件合并法的提出,正是这种思想的体现。通过将复杂的部件间问题转化为简单的部件内问题,我们不仅找到了技术上的解决方案,更重要的是展示了一种面对工程挑战时的创新思维方式。
圆柱体-带孔板模型的成功验证,不仅证明了该方法在技术上的可行性,更展现了其在工程实践中的巨大潜力。从简单的轴孔配合到复杂的多体装配,部件合并法为我们提供了一条高效、精确的Cohesive单元建立途径。

2万+

被折叠的 条评论
为什么被折叠?



