图 1 长方体:规则六面体网格,三个方向单元数独立控制。
图 2 圆柱:顶面能看到 O-grid 的分块——中间一个方形核心,外面四块连到圆弧。
图 3 弯曲河道:半圆截面沿一条 S 形曲线扫掠,路径在水平面内,截面不扭转。
这三张图对应三句需求:
说一句话,出来一个文件。下面这个是重点——它是怎么做到的。
我:「生成一条 S 形弯曲河道的流体网格,半径 50mm、长 600mm、振幅 80mm」
AI 收到之后做的事:
整个过程我没有参与,也没告诉它网格文件该怎么写。
大模型本身并不知道 PFC 的流体网格是什么格式——这是专业软件里很偏的细节,不在它的通用知识里。是 Skill 把这个知识喂给了它。
四样东西,缺一不可:
一、文件格式规范。Node.dat 和 Elem.dat 怎么写。这里面有个反直觉的地方:PFC 的六面体节点编号约定和 VTK、OpenFOAM 那套"底面四点 + 顶面四点"完全不同,写成后者的话单元体积会算错,而 PFC 不一定报错——网格照样读进去,跑到后面才发现结果不对。
二、分块算法。 圆柱和弯道不能简单按行列划分。圆柱走 O-grid:中间一个方形柱,外面四块从方柱的四条边连到圆的四段弧(图 2 顶面那个结构)。用极坐标直接离散的话,中心轴上所有节点会重合,出来一堆零体积单元。弯道同理,截面分成中央矩形加三个外围块再沿路径扫掠。
三、自检机制。 生成完立刻验证,不是写完就说"好了":
element.cfd.vol() 算一遍,两边对。实测数据两边逐项吻合,直河道那种能解析验证的几何误差是 0.0000%。四、踩过的坑。 写在技能文档里,下次不会再踩。比如弯道算例跑完,500 颗粒里有 4 颗跑到了河道外——原因是末端封盖三角化漏了一个扇区;又比如三维浏览页面里流速箭头整片飞到模型外面——单元索引取错了一位。这些都不写进去,下次还得重来。
没有技能的时候,每次都得从头来一遍:我描述需求、它去查文档、写代码、踩坑、调试。换个几何、换个算例,前面的经验全丢。
有了技能之后,这件事变成一次调用。格式怎么写的、坑在哪、怎么自检,都已经在里面了。
差别不在于"AI 能不能做出来",而在于每一次都要重新做一遍,还是它本来就会。
光能生成文件不算数。拿它跑了完整的河道算例:S 形双弯河道,500 颗颗粒,水流沿河道推着颗粒走。
图 4 流速矢量:箭头沿河道中心线方向,末端橙色 区是颗粒堆积、孔隙率降下来的单元。
图 5 演化前半程:初始均匀分布 → 入口段被冲空。
图 6 演化后半程:颗粒继续推进,在末端弯道堆住。
跑了 20000 步,颗粒群平均位置从 0.293 m 推进到 0.521 m。做对照实验时只加了一行 cfd coupling off,颗粒就只动了 2 mm——差 100 倍,推动力确实来自 CFD 拖曳力。
这套做法不限于流体网格。只要你的工作里有"专业软件 + 繁琐格式"这种组合,都可以照着做:让 AI 做一次,然后把格式、算法、自检、坑全部沉淀下来。
PFC 这边已经沉淀了一批:裂纹导出、接触分析、参数标定、边坡稳定性、隧道开挖……每一样都是这么来的。对做数值模拟的人来说,价值在于——那些"只有老手才知道的坑",可以不再是隐性经验了。