玩转Abaqus插件开发】让裂缝在模型里自由生长
abaqus插件打包, 裂缝信息获取,包括cohesive和xfem裂缝信息获取,泰森多边形生成,全局插入cohesive单元。 随机生成泰森多边形。 二维/三维cohesive单元全局插入,可实现不受预置裂缝位置的影响而实现裂缝随机扩展模拟。 裂缝信息获取,提取二维裂缝长度,三维裂缝面积等

做断裂仿真的兄弟应该都懂,传统预设裂缝路径的方式简直反人类——现实中的裂缝哪会乖乖按你画的线走?今天咱们搞点刺激的,用Python给Abaqus整几个实用插件,让裂缝爱怎么长就怎么长。

先来点硬核的——泰森多边形生成器。这玩意儿可是搞随机网格的利器,直接上菜:
from scipy.spatial import Voronoi
import numpy as np
def generate_voronoi(points_num, area_size):
# 撒豆子似的生成随机点
points = np.random.rand(points_num, 2) * area_size
vor = Voronoi(points)
# 处理边界问题
lines = []
for ridge in vor.ridge_vertices:
if -1 not in ridge:
lines.append(vor.vertices[ridge])
return lines
这个函数生成的泰森多边形边缘,后续可以直接转成Abaqus的线特征。注意那个ridge_vertices的处理,相当于把无限大的区域给截断,不然模型边界会飞出去。

接下来是全局插入cohesive单元的黑魔法,二维版本的核心逻辑长这样:
def insert_cohesive_2D(part, material):
all_edges = part.edges
cohesive_set = part.Set(edges=all_edges, name='CohesiveEdges')
# 用mesh编辑大法插入cohesive
mesh = part.mesh
for elem in mesh.elements:
if elem.type == 'CPE4':
# 在相邻单元间插眼
neighbors = mesh.getAdjacentElements(elem)
for neighbor in neighbors:
if neighbor not in processed:
new_elem = mesh.Element(
elemType='COH2D4',
connectivity=[*elem.connectivity, *neighbor.connectivity]
)
# 分配材料
section = mesh.MaterialSection(
name='Cohesive',
material=material,
elements=[new_elem]
)
return cohesive_set
这里有个骚操作——直接遍历已有单元找邻居,比常规的拓扑检测快得多。注意材料属性要提前定义好,建议用双线性损伤模型。

三维裂缝面积提取才是真功夫,看这个ODB后处理技巧:
from odbAccess import openOdb
def get_crack_area(odb_path):
odb = openOdb(odb_path)
total_area = 0.0
for step in odb.steps.values():
for frame in step.frames:
# 抓取STATUS场输出
status = frame.fieldOutputs['STATUS']
for value in status.values:
if value.data == 0.0: # 失效的cohesive单元
element = value.element
# 计算三维单元表面积
coords = [n.coordinates for n in element.connectivity]
area = 0.5 * np.linalg.norm(np.cross(coords[1]-coords[0], coords[2]-coords[0]))
total_area += area
return total_area
这个方法比官方文档教的更暴力,直接通过单元失效状态来统计。注意坐标系转换的问题,建议用单元局部坐标计算更准。

最后打包插件的玄学:别用Abaqus自带的打包工具!自己写setup.py才是王道:
from setuptools import setup
setup(
name='FractureToolkit',
version='0.9.2',
packages=['fracture'],
entry_points={'console_scripts': ['fracture-cli = fracture.cli:main']},
install_requires=['numpy>=1.18', 'scipy>=1.4'],
package_data={'fracture': ['icons/*.png']}
)
记得把GUI图标塞进package_data里,不然装完插件图标全裂。建议用PyInstaller打个独立exe,用户不用配环境直接扔进Abaqus插件目录。
实测用这套工具包做混凝土梁开裂,裂缝路径比女朋友的心思还难预测。有个坑得提醒:泰森多边形的种子点数量别超过500个,不然Abaqus划分网格时会表演当场去世。建议搭配mesh种子控制,在重点区域局部加密更划算。
更多推荐

所有评论(0)