结论先行:判断破坏是弥散还是局部化,别数裂纹。剪切带的定义是应变局部化,所以要从位移场算应变,再用 Radon 变换把带的倾角、宽度、统计显著性一次量出来。这套流程我已经做成了技能 pfc-shear-band,2D/3D、胶结/无胶结都能跑。
一个三维单轴压缩的平行胶结试样,加载到峰后,把断键位置画出来是这样:
中间密、边缘疏,看不出任何"带"的形状。更麻烦的是碎片分析:226 个碎块里最大一块含 91% 的球,100–1000 球的中间尺度是空的——试样根本没碎成几块,也不像有一条贯穿的破坏面。
单看这张图,很容易得出"这个模型破坏是弥散的,没有剪切带"。
这个结论是错的。
有两条原因,第二条才是致命的。
第一条:无胶结材料根本没有裂纹。 砂土没有平行胶结,也就没有 DFN,任何基于裂纹的检测器在它上面直接失效。所以判据的底座不能是裂纹。
第二条:密度场对"宽带"几乎失明。 剪切带的宽度通常是 5–10 个颗粒直径。粒径 2.5 mm 时带宽就是 12–25 mm,而试样半径才 25 mm——带占了试样一大半。这种宽度投影到密度场上,就是一团渐变的光斑,你不可能从中读出一条"线"。
宽带还有个更隐蔽的陷阱:变异系数(CV)会给出完全相反的信号。我实测过一个算例,把粒径减半后 CV 从 1.02 降到 0.88,看着"更均匀了",可形态其实发生了质变——出现了清晰的 X 形双带。CV 低只是因为它把损伤铺得更开。
一句话记住:密度类图(散点、密度场、CV)只能告诉你损伤量,不能告诉你损伤形状。判局部化必须换物理量。
剪切带的定义是应变局部化,那直接观测应变就好了。PFC 没有位移 getter,位移按标准做法取:导出两个 save 的颗粒场,按球 id 相减。
拿到位移场之后,对每个球拟合它邻域的位移梯度张量:
这里有个参数必须选对:邻域半径。太小球数不够,3×3 的最小二乘会欠定。实测半径取 4 倍中位粒径(约 34 个邻居)时 12789 个球里能拟合 12779 个;降到 2.5 倍只剩 17%。判据是每个邻域至少 12 个球。
有了剪应变场,还要客观地找出带,不能靠眼睛。用 Radon 变换:把点集投到观察平面,沿各个方向做投影直方图。
一条直线带的特点是——沿着它的法向投影时,带上的点会塌缩成一个窄峰。它在变换图上表现为某个(角度,偏移)处的尖峰。
裂纹和应变场可以统一处理,区别只是权重:
代码上是同一个函数:
这样无胶结的砂土也能跑——把 γ_max 当权重就是了。
必须做显著性检验。有限点集总有峰值,光看山峰高度没有意义。零假设要按通道选:裂纹用同尺寸圆柱内均匀随机撒点(CSR);应变场用权重置换——在同样的点位上打乱 γ_max。后者更严格,它隔离的是"权重的带状",而不是"试样本身的形状"。
技能做出来后,我在仓库里五个已有算例上全跑了一遍。结果如下(角度均以各算例的加载轴为基准):
| 5° | 84.7 | ||||
| 无胶结 | 1° | 45.4 | |||
| 4° | 92.6 |
其中两条是"标准答案"式的验证。
直剪。直剪的剪切带本应该水平、且落在 y=0 的剪切面上。技能给的角度 5°(砂土 1°)、偏移 1.0 mm(砂土 −0.0 mm)。而且砂土那个算例完全没有 DFN,走的是纯位移场通道——这条结果直接证明方法不依赖裂纹数据。
巴西劈裂。劈裂的定义就是裂纹平行于加载方向。技能给出与加载轴仅 4°,几乎完全平行。更有意思的是偏移 −8.9 mm——劈裂面明显偏离圆心,这和我之前用别的方法得到的"端部起裂、非中心起裂"结论是吻合的,等于用一条独立路径复现了它。
回到开头那个"弥散"的三维单轴。它的带被量出来了:与加载轴成 27°、宽 20.4 mm、显著性 z = 23.4。带确实存在,只是宽到和试样同尺度——所以它在裂纹密度场上只能读作弥散。
下图是 2D 单轴的对照,35° 的斜带穿破试样中部:
角度基准最容易错。 Radon 峰值的角度 θ 是带的法向,带本身与坐标轴的关系是 |90 − θ|。写这篇文章时我就把"与 x 轴 63°“当成了"与加载轴 63°”,结论差点反了。报数之前,一定要用叠加图目视核对一遍。
3D 的角度是"视倾角"。 带在三维里是一个平面,投影到某个坐标面得到的倾角,只有在带法向恰好落在该平面内时才等于真倾角。要真倾角得换观察面重做,或者直接拟合三维平面。
两条通道可以不一致。 同一个算例,裂纹通道给 27°、应变通道给 45°。这不是 bug——裂纹找的是"损伤集中带",应变找的是"变形集中带",两者错开本身是有用信息。报数时说清楚用的是哪条就行。
这套方法给的是带的几何与统计显著性,它不判断带的力学成因。z 值高只说明"这里确实有一条带",至于它是剪切带、压实带还是别的什么,要结合应力路径和裂纹类型去判断。
另外,宽度是取跨带剖面的半高全宽(FWHM)。对边界模糊的弥散带,这个值对平滑参数有一定敏感性,跨算例比较时建议用同一套参数。
VibePFC 社区 · 一起把 AI 玩进 PFC
我成立了一个 VibePFC 社群,专门聊 AI 怎么落地到 PFC / 数值模拟——让大模型读懂模型、自己改脚本、自动排查"看不懂"的问题。收一个 50 元的门槛费。
想进群的同学,加 QQ 763388012,备注"vibePFC"即可。
~/.claude/skills/pfc-shear-band/(band_a nalyze.py 找带 + plot_band.py 叠加)剪切带识别报告/report.html