乐于分享
好东西不私藏

从零构建2D随机纤维建模插件:一次完整的Abaqus二次开发实践

从零构建2D随机纤维建模插件:一次完整的Abaqus二次开发实践

在复合材料的微观力学研究中,很多问题最终都会回到一个极其基础却又极其复杂的命题:如何构建一个真实、可控、统计意义合理的随机纤维模型

当我们研究短切纤维增强复合材料、二维随机网络导热结构、微观损伤路径演化或者统计均匀化问题时,往往需要在一个给定区域内生成大量随机分布的纤维。数量可能是几百根,甚至上千根。每一根纤维的起点、方向、长度都应满足一定分布规律,同时又必须受限于几何边界,甚至需要满足不允许相交的物理约束。

如果依赖手工建模,这件事情几乎是不可能完成的。哪怕只是生成100根随机线段,也足以消耗数小时操作时间,更不用说统计意义上的模型重复构建。因此,自动化建模不仅是效率问题,更是研究质量问题。

正是在这样的背景下,我完整独立开发了一个二维随机纤维生成插件,并将其封装为可视化界面,直接集成到Abaqus 中。这个插件不仅能够一键生成随机纤维网络,还能够控制边界类型、长度范围、数量规模以及是否允许交叉,并且具备完整的图形界面交互能力。

这并不是一个简单的脚本,而是一个包含界面层、算法层和插件注册层的完整工程模块。

从建模需求到算法抽象

当我们说生成随机纤维时,表面上看只是画很多条随机线段。但如果把这个问题拆开,会发现它其实包含了三个层次:

1)随机几何采样

2)约束条件控制

3)计算几何判定

我在写代码之前,先把问题抽象成一个数学过程:在给定区域 Ω 内,生成 N 条线段 Li = (Pi, Qi),满足长度区间约束,并可选满足互不相交

第一步:生成起点——定义随机分布

代码中首先生成每根纤维的起点:

if geometry == 'rectangle':x1 = random.uniform(0, width)y1 = random.uniform(0, length)start_points.append((x1, y1, 0))

在矩形区域 [0, width] × [0, length] 内做均匀采样。这里用的是 Python  uniform(a, b),它在统计上是严格均匀分布的。如果区域是圆形,需要更改成:

x1 = random.uniform(-r1, r1)y1 = random.uniform(-r1, r1)if (x1**2 + y1**2) < r1**2:start_points.append((x1, y1, 0))

这里用的是“拒绝采样法”。先在外接正方形里随机生成点,然后筛选出满足圆方程的点。

为什么不用极坐标?

本来这里用的极坐标法,但是直接用角度和半径生成时,若半径线性分布,会导致中心区域概率更高。拒绝采样保证的是严格的面积均匀分布

第二步:方向生成——避免方向偏置

接下来要给线段一个方向。代码里不是直接生成角度,而是这样写的:

dx = random.uniform(-11)dy = random.uniform(-11)vec_len = (dx**2 + dy**2) ** 0.5dx /= vec_lendy /= vec_len

这里的逻辑是:

a)生成一个二维随机向量

b)计算长度

c)归一化为单位向量

如果直接随机角度,有时在数值处理中会出现周期性处理问题。而向量归一化方法天然给出一个方向均匀分布的单位向量。

这一段代码背后其实是一个几何抽象:在单位圆上随机取一个方向。

第三步:长度控制——给随机过程加约束

fiber_length = random.uniform(min_length, max_length)

如果长度是固定的,模型是单一尺度结构。如果长度有区间分布,模型就具有统计特征。

第四步:终点计算——从抽象到几何

终点通过向量运算得到:

x2 = start_points[i][0] + fiber_length * dxy2 = start_points[i][1] + fiber_length * dy

这一步其实就是:Qi = Pi + L · ui

这是线段的参数表达式。到这里,一条随机线段已经构造完成。但它还不一定合法。

第五步:边界约束——保证物理合理性

矩形判断:

if 0 < x2 < width and 0 < y2 < length:

圆形判断:

if (x2**2 + y2**2) < r1**2:

这一步本质上是做集合成员判断:Qi Ω

如果不满足,程序重新生成方向。

第六步:线段相交检测

当用户选择不允许交叉时,计算模型会出现大的变化。核心函数是:

def do_intersect(p1, q1, p2, q2):

里面最关键的一行是:

val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1])

 #其实是二维向量叉积。

它的符号决定三点的相对方向:

l正值:顺时针

l负值:逆时针

l零:共线

通过判断四组方向关系,可以确定两条线段是否跨立。数学原理是如果两条线段互相跨立,则必然相交。程序中:

if o1 != o2 and o3 != o4:return True

这就是经典的线段相交判定算法。当检测到相交时,该纤维被丢弃。当密度很高时,可行方向越来越少。为了防止程序无限尝试,我设置:

max_attempts = 5000

如果超过上限,该纤维被跳过。


以下为线段相交检测的几何原理阐述

在程序中,我采用的是基于三点方向判断(Orientation Test)的标准算法。其核心思想是,通过计算向量叉积判断三个点的相对方向关系。如果两条线段在几何上发生跨立,则可以通过四次方向判断得出结论。

更具体地说,对于线段ABCD,如果点CD分别位于AB的不同侧,同时点AB分别位于CD的不同侧,那么两条线段必然相交。除此之外,还必须处理共线重叠的特殊情况。这一算法来源于经典计算几何理论,时间复杂度为常数级,因此在中等规模(数百条线段)情况下仍然具有良好的性能。

当用户在界面中选择不允许交叉时,程序会对每条新线段执行与现有线段集合的逐一检测。如果存在交点,则放弃该候选线段并重新生成方向。为了避免在高密度情况下出现无限循环,我设置了最大尝试次数上限。需要注意的是,当纤维数量接近空间填充极限时,生成效率会显著下降,这是算法本身的数学特性,而非程序错误。

从算法到工程实现

完成核心算法之后,真正将其变成插件的关键在于Abaqus的二次开发机制。

Abaqus插件本质上分为三层结构:GUI层、内核算法层和插件注册层。界面层通过RSG框架构建对话框,包括几何类型选择、数量输入、长度范围输入以及重叠控制等选项。所有参数通过关键字传递给内核函数。注册层则通过插件工具集将该功能挂载到Abaqus主界面菜单中,实现一键调用。

当用户点击确定按钮时,界面自动调用内核函数,将参数传入。内核函数完成随机生成与几何创建后,直接在当前模型中生成二维可变形部件,并通过WirePolyLine命令创建线段几何。

我认为的这项工作的真正价值

很多人会认为,写一个随机生成脚本似乎并不复杂。但真正将其工程化、可视化、结构化,并且保证稳定性与可扩展性,其难度远远高于单纯写几行代码。

这套插件不仅解决了随机建模效率问题,更重要的是建立了一种可扩展的建模框架。未来完全可以在此基础上加入纤维半径、最小间距约束、方向分布函数、周期边界处理甚至三维扩展。算法本身已经构建完成,后续升级只是功能叠加。

更重要的是,这个项目完整涵盖了计算几何、随机过程、工程软件架构以及有限元二次开发机制。它并不是一个脚本练习,而是一套完整的软件模块设计。


效果展示

下图所示为本插件在 Abaqus 中的操作界面。整个界面采用分组结构设计,参数逻辑清晰,尽量避免用户误操作。

界面最上方为几何区域选择,支持矩形与圆形两种域类型。为了增强直观性,我在不同Tab页面中加入了示意图标,让用户在选择几何区域时能够一眼理解建模空间形态。

在“Fiber Parameters”部分,可以设置纤维数量以及长度范围。长度采用区间形式输入,这意味着模型不再是单尺度结构,而是具有统计分布特征的随机网络,这对于微观均匀化分析尤为重要。

本次新增的功能是Allow fiber overlaps选项。

这个选项的加入,是整个插件逻辑的重要扩展。

当选择Yes 时,程序将允许纤维之间发生相交。此时生成过程只受边界约束控制,算法速度较快,适用于需要构造高密度随机网络或者研究纤维交叉结构特性的场景。

当选择No时,程序将启用线段相交检测机制。每生成一条新纤维,都会与已有纤维进行几何判定,一旦发现交叉则重新生成方向。这种模式下生成的是完全无交叉的随机纤维网络,更符合某些物理模型的假设条件,例如理想化的短切纤维分散结构。

需要注意的是,当选择不允许交叉且纤维数量较高时,生成效率会有所下降,这是空间填充逐渐趋于饱和所导致的必然现象,而非程序异常。

在下方的“Domain Dimensions”区域中,矩形与圆形的参数输入是分离的。程序内部逻辑会根据 Geometry Type的选择自动读取对应的几何参数。换句话说,只有当 Geometry Type 选择为 rectangle 时,Width 与 Length 才会生效;当选择 circle 时,Radius 才会被调用。这样设计的目的,是保证参数逻辑清晰,避免不同几何类型之间的输入冲突。

下图展示了两种典型生成效果。

第一种为允许交叉模式。可以看到纤维之间存在明显的交点,整体网络更加致密,结构具有明显的随机穿插特征。

第二种为禁止交叉模式。所有纤维之间互不接触,整体结构呈现出更均匀的分布形态,局部区域会因为空间约束而出现自然留白,这种特征正是随机顺序填充模型的典型表现。

从视觉效果上看,两种模式差异明显,而从算法角度看,其本质差别仅在于是否启用几何判交函数。但正是这一小小的开关,让模型能够适应完全不同的物理假设与研究需求。

写在最后
本次的所有源代码和插件程序均会开源放置于公众号中,在公众号回复“2D随机纤维”即可获取插件,数量有限,先到先得。
注:3D随机纤维目前正在开发过程中,整个模型相较于2D更为复杂,空间结构更为精细。
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 从零构建2D随机纤维建模插件:一次完整的Abaqus二次开发实践

评论 抢沙发

3 + 6 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮