1. 项目背景与核心价值
最近在颗粒材料数值模拟领域,PFC6.0(Particle Flow Code)作为一款基于离散元方法的专业软件,其内置的Fish语言为用户提供了强大的二次开发能力。我在研究柔性三轴试验模拟过程中,发现体变参数检测环节存在重复性操作问题——每次都需要手动提取颗粒位置数据再通过外部程序计算体积变化,这个过程既耗时又容易出错。
于是我用Fish语言开发了一个体变检测工具,主要解决三个痛点:
- 实时监测三轴试验过程中试样体积变化
- 自动记录关键步数的体变参数
- 生成可视化数据曲线供快速分析
这个工具虽然代码量不大(核心算法约50行),但将原本需要5-6步的手动操作简化为一次函数调用。特别是在处理大颗粒体系(10万+颗粒)时,避免了频繁的数据导出导入,计算效率提升显著。
注意:PFC6.0的Fish语言是大小写敏感的,所有变量名和函数名建议统一使用小写+下划线命名法,避免与内置关键字冲突。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法设计思路
2.1 体变计算原理
在离散元模拟中,试样体积通常通过包围盒法计算。我的工具采用改进的最小包围盒算法:
fish复制; 计算当前步所有颗粒的包围盒
def calc_bbox
bbox_xmin = 1e20
bbox_xmax = -1e20
; 同理定义y/z方向的min/max
loop foreach gp ball.list
pos = ball.pos(gp)
bbox_xmin = math.min(bbox_xmin, pos.x)
; 更新其他五个边界值...
end_loop
return array(bbox_xmin, bbox_xmax, ...)
end
与传统方法不同,我增加了动态颗粒过滤功能——只统计处于指定应力状态下的有效颗粒(如轴向应力>10kPa的颗粒),避免边界无效颗粒干扰计算结果。
2.2 数据记录策略
采用环形缓冲区存储最近N步的体变数据:
fish复制; 初始化缓冲区
array buffer_size = 1000
array buffer_index = 0
array volume_buffer = array.create(
