本项目是将 MATLAB 工具 “Abaqus Mesh for Fiber-reinforced Composites (Embedded)” 转换为 Python 实现的版本,主要用于在 Abaqus 中模拟纤维增强复合材料中纤维的嵌入式建模(Embedded Element)。
.inp
文件(按 group 写入多个 ELSET)TOML
格式配置文件(支持注释)FiberPy/
├── main.py # 主程序,读取 config.toml 并驱动流程
├── utils.py # 通用函数,如 load_config()
├── fiber_generator_grouped.py # 支持分组和编号的纤维生成器
├── geometry_filters.py # 几何筛选器构造函数(椭球、球体、柱体等)
├── mesh_generator.py # 规则立方体网格生成工具
├── plot_mesh_grouped.py # 可视化函数(按 group 上色)
├── write_inp_file_grouped.py # 写入 Abaqus .inp 文件(分组写入)
├── config.toml # 主配置文件
使用 Python 3.8+,并安装以下库:
pip install numpy pyvista
如使用旧版本 pyvista(<0.42),建议使用兼容构造方式(代码已支持)。
1. 网格生成(C3D8)
x/y/z
区间与 dx/dy/dz
步长;MATRIX
分组。2. 纤维生成(T3D2)
orientation
列表:支持任意多个方向组合 + 比例;random
:球面均匀采样方向;vector
:固定方向 [l, m, n]
;ELSET=FIBER_<group>
。3. 几何区域筛选器(可选)
geometry.type
选择约束区域;""
(空字符串)表示不筛选;"ellipsoid"
:椭球体;"sphere"
:球体;"box"
:立方体内部;"cylinder"
:垂直或任意方向的柱体;4. 可视化展示
5. 输出 INP 文件
*NODE
*ELEMENT, ELSET=MATRIX, TYPE=C3D8
*EMBEDDED ELEMENT, HOST ELSET=MATLAB_MESH-1.MATRIX
MATLAB_MESH-1.<FIBER_GROUP>
6. 导入进Abaqus
File -> Import -> Abaqus Input File -> 选择生成的 .inp 文件,导入进Abaqus中将显示不同分组下的纤维集 合。
在本程序中,每根纤维被表示为三维空间中一条具有固定长度 的线段,形式为:
Fiber_i = [x1, y1, z1, x2, y2, z2]
其构造包括起点 和终点 ,构造过程如下:
Step 1:随机选取纤维起点
在立方体域中均匀采样:
x1 = np.random.uniform(*x_range)
y1 = np.random.uniform(*y_range)
z1 = np.random.uniform(*z_range)
即
Step 2:随机生成球面方向向量
为了让纤维方向在三维空间中均匀分布,可以使用 球面对称采样:
theta = np.random.uniform(0, 2 *np.pi)
v = np.random.uniform(-1, 1) # 方向余弦,相当于 cos(φ)
l = np.sqrt(1 - v**2) * np.cos(theta)
m = np.sqrt(1 - v**2)* np.sin(theta)
n = v
direction = np.array([l, m, n])
这种方法比直接采样 更均匀,避免极点密集问题。
Step 3:构造终点
构造长度为 的向量,并叠加在起点上得到终点:
sign = np.sign(np.random.uniform(-1, 1)) # 随机正负方向
d_scaled = sign * L * direction
p1 = np.array([x1, y1, z1])
p2 = p1 + d_scaled
Step 4:边界判断
若终点落出边界,则放弃该纤维并重试,直到合法为止:
if not (x_range[0] <= p2[0] <= x_range[1] and y_range[0] <= p2[1] <= y_range[1] and z_range[0] <= p2[2] <= z_range[1]):
continue
Step 5:存储结果
最终每条纤维为:
fibers[i] = [x1, y1, z1, x2, y2, z2]
生成 条纤维,即得到 的 numpy.ndarray
。
其中,关键采样公式
程序中的 orientation
参数用于控制纤维的空间走向,支持灵活配置,适用于多种建模场景。
使用一个三维向量 [l, m, n]
表示固定方向,程序将自动单位化:
orientation = [
[{type = "vector", value = [1, 0, 0]}, 1.0]
]
或
orientation = [
{type = "vector", value = [1, 0, 0]}
]
示例:沿 X 轴生成所有纤维;
[1, 1, 0]
表示 XY 平面 45°;
[1, 1, 1]
表示 XYZ 对角线方向;
支持 ± 随机反向;
不要求是单位向量,程序内部会归一化。
orientation = [
[{type = "random"}, 1.0]
]
通过设置多个方向 + 比例,模拟复杂铺层:
orientation = [
[{type = "vector", value = [1, 0, 0]}, 0.4],
[{type = "vector", value = [0, 1, 0]}, 0.3],
[{type = "vector", value = [1, 1, 0]}, 0.3]
]
程序会自动根据比例分配纤维数量。例如:
count = 1000
将生成 [400, 300, 300] 根对应方向的纤维。
完全支持如下混合方式:
orientation = [
[{type = "random"}, 0.3],
[{type = "vector", value = [1, 0, 0]}, 0.4],
[{type = "vector", value = [0, 1, 0]}, 0.3]
]
生成:
注意事项
[0, 0, 0]
会被忽略;高级用法建议
[1, 1, 0]
、[0, 1, 1]
等表示 ±45°、面内铺层;在默认模式下,程序只保证纤维的两个端点落入全局立方体盒 [x0,x1] × [y0,y1] × [z0,z1]
。但可以通过 "geometry"
字段进一步设定 纤维必须落入的几何内域,如椭球体、球体、盒体、柱体等。
type | |||
---|---|---|---|
"" | type = "" | ||
"ellipsoid" | center axes | ||
"sphere" | center radius | ||
"box" | min max | ||
"cylinder" | base axis , radius , height |
[geometry]
type = ""
[geometry]
type = "ellipsoid"
center = [50, 50, 50]
axes = [30, 20, 10]
[geometry]
type = "sphere"
center = [50, 50, 50]
radius = 25
[geometry]
type = "box"
min = [20, 20, 20]
max = [80, 80, 80]
[geometry]
type = "cylinder"
base = [50, 50, 0]
axis = [0, 0, 1]
radius = 15
height = 100
程序会调用一个 inside_fn(p1, p2)
判断纤维两端点是否都在指定几何内域内,若不满足则放弃该纤维并重新采样。
例如椭球判断:
rel = p - center
value = (x/a)^2 + (y/b)^2 + (z/c)^2
if value > 1: reject
每种几何体都有对应的 inside_<type>()
函数,并由 build_inside_fn()
自动构造过滤器。