ARTICLE · 999965
给 AI 装上眼睛,让它自己修好 PFC 的颗粒漏点
给 AI 装上眼睛,让它自己修好 PFC 的颗粒漏点
技巧
先说结论:我做直剪(剪切盒)单元实验时,颗粒总从盒子的两处"缝隙"飞出去。真正让它自己修好的,不是一次更聪明的提问,而是先给它装了一双"看 PFC"的眼睛——把黑盒状态探查成可读数据。有了眼睛,AI 一眼定位到两个漏点,自己改了墙体几何、重跑、再复查,0 颗粒越出。
提示
环境与背景:PFC 6.0 · 无胶结砂土直剪(剪切盒)单元实验 · 盒 60×60 mm · 3824 颗颗粒 · 竖向应力 σn=100 kPa · 目标剪切位移 10% 盒宽(6 mm)。
开场 跑一个直剪,颗粒却"逃逸"了
直剪盒在数值里通常做成上、下两半可错动的刚性盒:下盒固定,上盒被拉着水平平移,同时顶盖用一个"伺服"顶着恒定竖向应力,模拟压板。做完后看剪切带、看 τ-δ 曲线,本应是件顺理成章的事。
但我发现一个很扎眼的现象:跑到一半,颗粒跑到墙外面去了,最远的直接贴到计算域边界。这一步本该是"土壤压在盒子里被剪切",结果变成了"土从盒子里漏出来"。
注意
麻烦的是:PFC 是个黑盒。跑完除了几个动画和曲线,你很难精确说出"从哪里漏的、漏了多少颗"。这就是最大的障碍——不是不会改,而是看不清。
一、先解决"看不见":给 AI 装探查眼睛
我的思路很直:与其让 AI 对着黑盒猜,不如把"怎么看清一个 PFC 保存状态"这件事,做成一个可复用的技能 pfc-result-probe。它的核心就一句话:
对一个
.sav(模型快照)只读探查:restore 起来 → 用 FISH 遍历模型 → 把统计写进io.out、把数据导出成 CSV → 在 PFC 外面画图。
一次探查 = 一个 .dat 模板。对我这次的问题,用到了两个:
| wall(墙体) | wall.vertexlist 按序取顶点,导出 (墙id, 顶点序号, x, y) | |
| ballfield(颗粒场) | (id, x, y, vx, vy, 半径) |
用起来就是几行命令:
# 生成探查脚本(默认只读、不改模型)
python gen_probe.py --save 6result2 --probe wall --out probe_wall.dat
python gen_probe.py --save 6result2 --probe ballfield --out probe_pf.dat
# 无头跑(PFC 控制台 + 相对路径 + 自动补 program quit)
python run_pfc.py probe_wall.dat
python run_pfc.py probe_pf.dat
# 把墙顶点和颗粒叠在一张图里
python plot_wall.py --walls 6result2_wall.csv --field 6result2_ballfield.csv
重要
这里有个容易被忽略的点:很多 FISH 访问器光靠命令文档是查不到的,比如墙的顶点接口
wall.vertexlist/wall.vertex.pos、以及哪些接口在 FISH 里根本不存在(wall.facets、wall.contacts)。这些都要实机跑一遍确认。而"怎么查、哪些能用、哪些是坑"——恰好是应该被固化进技能里的东西。这也是"装眼睛"的一半:把方法沉淀下来。
二、眼睛第一次起作用:一眼看清"漏在哪"
把墙的顶点和颗粒场叠画出来后,问题一下就清楚了:
• 剪切面(y=0)两边,上盒一平移就和下盒错台,留出水平开口; • 更隐蔽的是顶部两角:顶盖在伺服下随压缩/剪胀上下活动,而上盒的左右侧墙顶端是固定的,一抬升就在墙角开出一小条缝。
结果就是这张图里红点标出的两处:

技巧
用颗粒数据一量就更实锤:25 颗颗粒里的 25 颗,全部出现在顶部两角(y≈0.02~0.05,|x|≥0.04),没有一颗从剪切面正下方跑掉。所以"漏"主要不在分盒处,而在顶盖抬升导致的墙角开缝。
三、对症下药:封住两处缝隙
找准漏点就好办了。修复其实就两句话,改的是盒子的墙体几何:
1. 剪切面加"套筒唇"——模拟真实剪切盒上下两半贴合滑动。上盒在 y=0 处加一条向右外伸的地板唇(随上盒一起 +x),下盒在 y=0 处加一条向右外伸的地板唇(固定),两唇错位、互相覆盖,平移再多也不会露口。唇长 ext要 ≥ 最大剪切位移(我留了 10 mm,剪切位移才 6 mm)。2. 顶部侧墙加高——把上盒左右墙的顶端向上延伸,超过顶盖最大剪胀高度。这样顶盖(加载板)就在加高的侧圈里上下滑,跟真实直剪仪一样,抬升也不会露出墙角。
提示
顺带一个脚本质量的坑:这几个
.dat原本是 GBK 编码、带中文注释,用编辑工具一改就被转成 UTF-8、还把中文弄乱,控制台直接解析失败。我干脆把改动脚本改成纯 ASCII 注释,一劳永逸。
四、自动闭环:改 → 跑 → 复查,0 越出
改完重新跑整链(成样 → 固结 → 剪切),再用同一套探查复查。这次数据是这样的:
| 越出墙外的颗粒 | 25 颗 | 0 颗 |
wall 探查显示共 8 面墙(6 面盒 + 2 面唇),几何、位移都对:上盒三墙整体右移 +6 mm(剪切位移)、顶盖剪胀抬升、两片唇正好压在错台处。τ-δ 曲线也正常——达到 6 mm 剪切位移,顶盖法向力稳住 ≈6000 N(σn·宽·厚),剪应力约 44 kPa。

写在最后
回头看,真正让这次修复闭环的,不是"某个提示词更聪明",而是把三件事交给了 AI:
1. 把"怎么看"做成技能(探查):黑盒数据 → 可读的墙/颗粒数据。这是眼睛。 2. 把"什么算好"写进判定:比如 wall 探查要几何闭合、ballfield 要"0 越出"。这是标准。 3. 把"改→跑→查"串成回路:改脚本、无头重跑、再探查对比。这是手脚。
通用模型不会自动修好一个 PFC 工程,但你把看、判、改、验这条路交给它,它就能把这个角色演得很稳。
技巧
如果把"给 AI 装眼睛"这套也扩展到别的模拟(三轴、单轴、巴西劈裂、真三轴……),那就是一套可复用的数值实验自动闭环。感兴趣可以评论区聊聊你平时最头疼哪一步,下次拆给你看。
重要
VibePFC 社区 · 一起把 AI 玩进 PFC我成立了一个 VibePFC 社群,专门聊 AI 怎么落地到 PFC / 数值模拟——让大模型读懂模型、自己改脚本、自动排查"看不懂"的问题。收一个 50 元的门槛费。想进群的同学,加 QQ
763388012,备注"vibePFC"即可。📦 附:本文用到的东西
• 探查技能 pfc-result-probe(墙体 / 颗粒场 / 胶结 / 断裂 四类探查 + 外置绘图)• 修复后的直剪脚本: 1chengyang.dat(8 墙盒)、6jiazai2.dat(上盒 4 墙剪切)、main.p2dat• 复现图: 修复前-两个漏点机理示意.png、修复后-墙包住颗粒.png、封面封面-master.png
参考资料
• 探索&测试均在本地 PFC 6.0 控制台( pfc2d600_console.exe)无头运行验证。• 直剪剪切盒"套筒唇/侧圈全高"设计思路参考了 PFC 手册 wall servo命令页的 Shear Box 示例。• 本文实验参数为占位标定值,用于演示方法,不代表最终材料参数。