跳转至

Abaqus_FRC_Mesh(Python版)

约 1503 个字 73 行代码 11 张图片 预计阅读时间 6 分钟

本项目是将 MATLAB 工具 “Abaqus Mesh for Fiber-reinforced Composites (Embedded)” 转换为 Python 实现的版本,主要用于在 Abaqus 中模拟纤维增强复合材料中纤维的嵌入式建模(Embedded Element)。

功能概述

  • ✅ 支持生成规则立方体 C3D8 网格(基体)
  • ✅ 支持多方向分组生成 T3D2 纤维(随机 + 定向组合)
  • ✅ 支持通过配置文件设定椭球体、球体、长方体、圆柱体等几何区域筛选
  • ✅ 自动构建嵌入式约束关系(*Embedded Element),与原有网格模型不共节点
  • ✅ 可视化:PyVista 显示立体网格 + 不同颜色显示不同纤维组
  • ✅ 输出标准 Abaqus .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                 # 主配置文件
├── README.md                   # 使用说明

所需环境依赖

使用 Python 3.8+,并安装以下库:

pip install numpy pyvista

如使用旧版本 pyvista(<0.42),建议使用兼容构造方式(代码已支持)。

整体实现流程

1. 网格生成(C3D8)

  • 程序读取 x/y/z 区间与 dx/dy/dz 步长;
  • 构造规则 hexahedral 网格(C3D8 单元);
  • 所有网格单元统一归为 MATRIX 分组。

2. 纤维生成(T3D2)

  • 读取 orientation 列表:支持任意多个方向组合 + 比例;
  • 可设为:
  • random:球面均匀采样方向;
  • vector:固定方向 [l, m, n]
  • 每组纤维将记录 group 名并被区分处理;
  • 所有 T3D2 元素被分组写入多个 ELSET=FIBER_<group>

3. 几何区域筛选器(可选)

  • 通过配置文件 geometry.type 选择约束区域;
  • 支持:
  • ""(空字符串)表示不筛选;
  • "ellipsoid":椭球体;
  • "sphere":球体;
  • "box":立方体内部;
  • "cylinder":垂直或任意方向的柱体;
  • 程序会自动过滤掉超出指定区域的纤维。

4. 可视化展示

  • 使用 PyVista 绘制绿色网格 + 多组彩色纤维;
  • 每个 group 使用独立颜色;
  • 可用于模型结构完整性检查。

5. 输出 INP 文件

  • 所有节点写入 *NODE
  • C3D8 单元写入 *ELEMENT, ELSET=MATRIX, TYPE=C3D8
  • T3D2 元素按 group 写入多个 ELSET
  • 自动添加:
*EMBEDDED ELEMENT, HOST ELSET=MATLAB_MESH-1.MATRIX
MATLAB_MESH-1.<FIBER_GROUP>

6. 导入进Abaqus

File -> Import -> Abaqus Input File -> 选择生成的 .inp 文件,导入进Abaqus中将显示不同分组下的纤维集合。

理论实现细节:随机纤维生成原理

在本程序中,每根纤维被表示为三维空间中一条具有固定长度\(L\)的线段,形式为:

Fiber_i = [x1, y1, z1, x2, y2, z2]

其构造包括起点\(P_1\)和终点\(P_2\),构造过程如下:

Step 1:随机选取纤维起点\(P_1\)

在立方体域中均匀采样:

x1 = np.random.uniform(*x_range)
y1 = np.random.uniform(*y_range)
z1 = np.random.uniform(*z_range)

\(P_1 = (x_1, y_1, z_1)\)

Step 2:随机生成球面方向向量$\hat{d} \in \mathbb{S}^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])
  • \(theta \in [0, 2\pi]\):极角
  • \(v = \cos(\phi) \in [-1, 1]\):方向余弦
  • \(\hat{d} = (l, m, n)\):单位向量,均匀分布在球面上

这种方法比直接采样\(\phi\in[0,\pi]\)更均匀,避免极点密集问题。

Step 3:构造终点\(P_2\)

构造长度为\(L\)的向量,并叠加在起点上得到终点:

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]

生成 \(N\) 条纤维,即得到 \(N\times 6\)numpy.ndarray

其中,关键采样公式

\[ \begin{aligned} l &= \sqrt{1 - v^2} \cdot \cos(\theta) \\ m &= \sqrt{1 - v^2} \cdot \sin(\theta) \\ n &= v \\ P_2 &= P_1 + L \cdot \hat{d} \end{aligned} \]

纤维方向设置说明

程序中的 orientation 参数用于控制纤维的空间走向,支持灵活配置,适用于多种建模场景。

1. 单一方向模式

使用一个三维向量 [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 对角线方向;
  • 支持 ± 随机反向;
  • 不要求是单位向量,程序内部会归一化。

2. 随机方向模式

orientation = [
  [{type = "random"}, 1.0]
]

  • 每根纤维的方向在单位球面上均匀分布;
  • 适用于无特定铺设方向的增强体模拟;
  • 也可与定向模式组合使用。

3. 多方向组合模式(混合铺设)

通过设置多个方向 + 比例,模拟复杂铺层:

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] 根对应方向的纤维。

4. 随机 + 定向混合模式

完全支持如下混合方式:

orientation = [
  [{type = "random"}, 0.3],
  [{type = "vector", value = [1, 0, 0]}, 0.4],
  [{type = "vector", value = [0, 1, 0]}, 0.3]
]

生成:

  • 30% 球面均匀分布的随机方向纤维;
  • 40% 沿 X;
  • 30% 沿 Y。

注意事项

  • 所有方向自动归一化;
  • 支持正反方向随机扰动;
  • 若方向为 [0, 0, 0] 会被忽略;
  • 比例不需归一,总和自动标准化;
  • 可通过 group 字段追踪每类纤维。

高级用法建议

  • 使用 [1, 1, 0][0, 1, 1] 等表示 ±45°、面内铺层;
  • 可通过配色和分组在可视化中查看铺设效果;
  • 后续将支持不同组的材料属性与行为。

几何区域筛选器(geometry)设置说明

在默认模式下,程序只保证纤维的两个端点落入全局立方体盒 [x0,x1] × [y0,y1] × [z0,z1]。但你可以通过 "geometry" 字段进一步设定 纤维必须落入的几何内域,如椭球体、球体、盒体、柱体等。

可选类型与配置示例

类型 type 描述 示例参数字段
无筛选 "" 或缺省 所有合法纤维均保留 type = ""
椭球体 "ellipsoid" 椭球体中心 + 三轴长度 center, axes
球体 "sphere" 球体中心 + 半径 center, radius
立方体内盒 "box" 内盒最小最大点 min, max
圆柱体 "cylinder" 底面中心、轴向、半径、高度 base, axis, radius, height

配置文件中写法示例(TOML)

无筛选(默认)

[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() 自动构造过滤器。

适用场景

  • 模拟局部增强区(如椭球形芯区);
  • 控制纤维只出现在特定空间;
  • 分析特定路径上的纤维沉积或成型区域。

未来扩展建议

  • 支持不同组纤维长度不同;
  • 支持纤维弯折;
  • 支持导入inp文件(六面体、四面体),随机生成纤维;