几个月前我在跑一组碎石单轴压缩模拟,用的还是PFC5.0里最顺手的clump。跑了三天出来一条特别光滑的应力-应变曲线,当时还挺开心。结果对照组一放进去我傻眼了:试验曲线在峰值之后有明显的跌落和应力平台,碎屑越来越多,级配一直在变,而clump模型从头到尾一颗没碎,整个试样像一块铁疙瘩被压变形的,根本不是“碎石压碎”。那一刻我才意识到,要用PFC5.0模拟碎石、矿渣混凝土这类材料,真正的主角不是clump,而是可以破碎的cluster,底层则是无数个ball通过粘结形成的可破裂结构。
这篇东西写给谁看?主要给两类人:一是做颗粒材料离散元模拟的研究生和工程师,模型里需要体现颗粒破碎但不知道cluster怎么建、参数怎么给;二是已经建过cluster但发现“不好用”的朋友——要么不碎,要么一加载就炸,要么碎片数量离谱。后面这些坑我都会讲到。文章里的命令和脚本都是PFC5.0的写法,部分细节不同小版本有差异,但建模逻辑和排错思路是通用的。
1. 为什么非要用cluster:clump和刚性颗粒模拟不了的事
1.1 从一次失败的clump模拟说起
PFC里clump的基本思想是让若干个ball重叠成一个刚性体,内部接触不再参与计算,只保留颗粒外轮廓和外界接触。它的优势是能快速生成任意不规则形状的“固体颗粒”,计算量也比同等形状的ball集合小很多。问题是clump内部自由度为零,任何荷载下都不可能发生颗粒内部破裂。
这在模拟卵石、钢球、完整岩块这类高强不易碎材料时没问题。但碎石和矿渣混凝土的宏观力学行为恰恰和“内部破裂”强相关。以级配碎石基层为例,振动压实过程中粗颗粒尖端会产生应力集中,单颗粒可能在接触点附近被压碎或剪碎,原来的一个粗颗粒变成几个小颗粒,级配随之变细。矿渣混凝土在单轴压缩或劈裂试验中,骨料与砂浆界面的裂纹会扩展到骨料内部,产生穿晶断裂,也就是骨料本身碎了。这些现象用clump完全看不到。
我见过不少文章把clump当作“可破碎颗粒”来用,其实是在移花接木。他们手动设定一些弱面,让clump在特定位置分离——但这只是人为预置了断裂路径,颗粒内部并没有物理意义上的渐进损伤和碎片生成。真正要模拟“这颗粒子在受力过程中自己决定在哪断、断成几块”,PFC5.0的cluster是更合适的选择。
1.2 clump、cluster和散体ball的定位差别
三者定位我整理成一个表,新手可以按这个表快速判断自己该用哪个:
| 对象 | 内部结构 | 是否可破碎 | 内部接触参与计算 | 适用场景 |
|---|---|---|---|---|
| 单个ball | 无内部结构 | 否 | 无 | 砂土、粉体、流动问题 |
| clump / rigid block | 多个ball刚性叠加,内部自由度冻结 | 否 | 不参与 | 卵石、砾石、完整岩块、边界设备 |
| cluster | 多个ball由bond连接,可相对位移 | 是 | 参与 | 碎石、矿渣混凝土、软岩、煤岩 |
一个容易混淆的点是:PFC5.0中ball是几何单元,clump和cluster都是ball的集合体,但内部力学完全不同。clump内部接触被冻结,计算效率高;cluster内部每一个pebble之间的接触都参与力学计算,并且额外承担bond强度。换句话说,cluster是把“一堆ball”用粘结剂粘起来,外力够大时粘结先破坏,然后颗粒组解体。
1.3 什么时候必须上cluster
我判断一个项目是否必须用cluster,就看三个问题:
- 模型是否要输出级配演化,也就是“破碎后各粒径质量占比”?如果要,必须上cluster,因为只有bond断裂后的碎片才有天然的粒径分布。
- 是否关注峰值后的残余强度和剪胀行为?脆性颗粒材料的脆-延转化通常由内部破碎主导,clump给出的残余平台往往是假的。
- 是否关注局部应变集中和断裂网络?比如碎裂带、剪切带怎么扩展?cluster能让你直接看到bond断裂的空间分布,这是试验里都很难直接观测的。
如果你的模拟只是看整体应力应变趋势、不管颗粒破碎,那用clump反而效率高。但如果“破碎”本身就是研究对象,就不要绕路,直接面对cluster的建模成本和参数标定问题,值得。
2. 破碎的内核:cluster的细观结构和bond断裂逻辑
2.1 一个cluster到底由什么组成
cluster在PFC5.0里的本质是一组互相接触的pebble(本质上就是ball),pebble之间通过粘结模型连接。注意“粘结”和“接触”是两个概念:接触是几何上的贴合,只要有重叠就会产生排斥力;粘结是额外的力学连接,在接触点额外传递拉力和弯矩。
我把cluster想成砖块和水泥的关系。pebble是砖块,bond是水泥。没有bond的ball堆在一起,就是一垛没砌的砖,一碰就塌;有了bond,它们才能形成一块完整的“人造石”,但它不像clump那样水泥终身坚固,而是受力超限时水泥接缝会开裂,整块石头碎裂成若干小块。这样的碎片传播过程正好对应真实材料里骨料破碎的细观机制。
建模时需要在两个层面选择参数:
- pebble层面:密度、刚度kn/ks、摩擦系数fric,这些决定了“砖块”本身的变形和摩擦力。
- bond层面:法向刚度pb_kn、切向刚度pb_ks、抗拉强度pb_ten、黏聚力pb_coh、内摩擦角pb_fa,这些决定了“水泥”的力学性能。
模拟碎石和矿渣混凝土,我default接触模型直接用linearpbond(平行粘结)。有些资料推荐contact bond,但我个人不建议用于这类材料:contact bond只在接触点传力,不传力矩,颗粒一旦有轻微转动就会很脆地断开,碎片容易过碎;平行粘结在接触处形成一个有面积的“胶接盘”,可以同时传递力和弯矩,更接近岩石、混凝土骨料之间胶结物的力学行为。
2.2 平行粘结是怎么断的:强度判据与破坏模式
平行粘结的核心逻辑是:在每一个bond接触面上,法向力和切向力共同作用,产生法向应力sigma和切向应力tau。当应力超过材料给bond设定的强度,bond断裂,这个接触从“粘结接触”退化成普通接触。
用公式说,PFC5.0的linearpbond会实时计算:
- 法向应力:sigma_n = F_n / A,其中A是bond的截面积。
- 切向应力:tau = F_s / A,同时考虑扭转和弯矩产生的附加应力。
判断条件分两种:
- 拉断:当法向拉应力sigma_n超过抗拉强度pb_ten,bond立刻断裂。
- 剪断:当切向应力tau超过剪切强度,即pb_coh加上法向压力产生的摩擦项pb_fa,bond断裂。
这里需要特别理解剪切判据:tau_c = pb_coh + sigma_n * tan(pb_fa)。这意味着法向压力越大,bond越不容易被剪断——材料内部的摩擦角pb_fa牵制了剪切破坏。这个特点很重要,模拟碎石在高压三轴下的“压而不碎”和低围压下“脆性破碎”的分野,很大程度上就是pb_fa在起作用。
理解了断裂判据,就能理解cluster的破坏模式为什么与实际实验对得上。单轴压缩时试样内部主应力是轴向的,最危险的是那些垂直于加载方向的bond,它们承受拉应力,材料表现为劈裂破坏;高围压时法向压力抑制了拉断,剪切断裂变成了主导,材料表现为更韧的破坏。这就是为什么cluster模型能复现很多试验中的破坏模式转变。
2.3 为什么“碎片阈值”和pebble数量决定了模拟质量
刚上手cluster最容易犯的错误是单颗cluster里的pebble数量太少,比如只塞5到6个球。这种情况下bond断裂的模式极其有限,cluster要么不碎,要么断成两大块,根本谈不上级配演化。
pebble数量直接决定了一个cluster能够“碎成多少种可能的碎片组合”。数量太少,破坏路径几乎没有选择空间;数量太多,内部接触和bond数量呈几何级数上涨,计算成本飙升,而且很多bond从一开始就处于高应力的“冗余”状态,加载初期的破碎行为会被这些冗余bond干扰。
从我自己的经验看,模拟碎石或矿渣混凝土骨料,单个cluster内pebble数量控制在20到40个比较合理。这个范围下,既能保证足够的内部裂缝扩展路径,计算量也可以接受。如果你要把几万个cluster放进一个试样,那单个cluster的pebble数量还要再往下砍,否则模型规模会失控。
另外一个细节是pebble的粒径级配。cluster内部的pebble也不能全做成等径球,最好有个1.5到2.5的半径比。等径球组成的cluster内部结构过于规整,压碎时容易产生规则的贯穿裂纹,不真实。适度引入粒径变化能让cluster内部结构更像真实骨料,破碎模式会自然散乱许多。
3. 从零搭一个能破碎的cluster:PFC5.0命令流与FISH脚本
3.1 建模流程总览
PFC5.0里建cluster的完整流程我拆成五步:
- 生成pebble集合:在目标几何区域内随机填充ball,控制粒径范围和孔隙率。
- 定义cluster模板:告诉程序哪些ball属于同一个cluster,以及该cluster在空间中的包络范围。
- 实例化cluster:在指定坐标位置生成一个cluster,程序会把该位置区域内的ball组合成cluster。
- 设置bond参数:给cluster内部的pebble之间的接触赋予平行粘结属性。
- 建立加载环境:加上伺服墙或加载板,进入求解循环。
需要注意,PFC5.0的cluster模板功能在不同小版本里位置有差异。我下面的脚本是常用版本写法,如果你的版本提示不识别cluster template或cluster create,去菜单里找一下rblock或cluster相关模块,另一条路是用rblock创建模板再生成cluster,逻辑是一样的。
3.2 关键命令与脚本示例
先看最核心的建模段:
; ========== PFC5.0 可破碎cluster建模示例 ========== model new ; ---- 1 设定全局参数 ---- def par_cluster global r_min = 1.5e-3 global r_max = 2.5e-3 global cx = 0.0 global cy = 0.0 global cz = 0.0 end @par_cluster ; ---- 2 在正方体空间生成pebble集合 ---- ball distribute box x [-0.04] [0.04] ... y [-0.04] [0.04] ... z [-0.04] [0.04] ... radius [r_min] [r_max] ... tries 20000 ; ---- 3 声明cluster模板 ---- cluster template create id 1 ... type 'box' ... length_x 0.08 ... length_y 0.08 ... length_z 0.08 ; ---- 4 在指定位置生成可破碎cluster ---- cluster create x [cx] y [cy] z [cz] ... id 1 template-id 1这里说明一下参数含义:
r_min和r_max是pebble半径范围,实际颗粒级配就是由这两个值控制的。tries 20000是生成球集合时的最大尝试次数,如果初始密实度过高导致重叠球太多,程序会在这里反复重试,直到满足目标孔隙率。cluster template create定义了一个虚拟的边界形状,稍后实例化时,落在该边界内的ball会被组合成一个cluster。
需要注意,ball distribute生成的只是独立的ball,它们之间是普通接触,还没有bond。cluster的作用是把这些ball在逻辑上归组,归组之后才有下一步的bond赋值。
3.3 接触模型与bond参数的注入方式
cluster生成后,需要给cluster内部的pebble之间赋予平行粘结。最简单的做法是设置全局接触模型默认值,让后续建立的接触都采用linearpbond:
; ---- 5 默认接触模型设为平行粘结 ---- contact cmat default model linearpbond ... property pb_kn 3e7 pb_ks 2.5e7 ... pb_ten 2e6 pb_coh 3e6 pb_fa 35 ; ---- 6 设置ball本身的接触属性 ---- contact cmat default property kn 2e7 ks 2e7 fric 0.6在PFC5.0中,cmat default设置的是“之后再生成的接触”或“尚未显式设置接触模型的现有接触”的默认属性。所以顺序很重要:先生成ball,再设置cmat,最后跑几个cycle让程序把默认属性写到现有接触上。
有时候cluster内部的bond没有被正确继承,这时需要主动遍历cluster内的pebble,手动给它们之间的接触设置bond强度。下面是一段简单示例:
; ---- 7 手动检查并补齐cluster内bond属性 ---- fish define repair_bond local cp = cluster.find(1) if cp != null local count = cluster.pebble.count(cp) loop local i while i < count local p1 = cluster.pebble(cp, i) if i < count - 1 local p2 = cluster.pebble(cp, i + 1) local c = contact.find(p1, p2) if c != null contact.prop(c, 'pb_ten') = 2e6 contact.prop(c, 'pb_coh') = 3e6 contact.prop(c, 'pb_fa') = 35 endif endif i += 1 endloop endif end @repair_bond这只是一个示意脚本,真实建模时应遍历cluster内所有pebble对,并给所有真实存在的接触赋bond属性。如果你用的是比较新的PFC5.0版本,cluster模板本身就带有bond属性字段,在定义模板时通过cluster template property一并设置,后续生成的cluster直接继承,会省事很多。
加载环境的建立也提一下。模拟碎石或矿渣混凝土的单轴压缩,常见做法是上下两个伺服墙:
wall generate box ... wall attribute normal_stiffness 1e8 ; 给上板一个向下速度 wall attribute yvelocity -0.005 range id 2加载速率需要刻意控制。如果速度太快,惯性效应会把破碎模式带偏,出现“试样中央炸裂”而不是“从加载端向内部传播裂纹”。我建议先把应变率控制在低于0.1/s,具体计算公式是:加载速度 / 试样高度。如果试样高0.1m,那加载速度不应超过0.01m/s。
4. 让模拟“像真材料”:碎石和矿渣混凝土的参数标定流程
4.1 标定目标与试验参照
cluster模型的参数不能直接查材料手册,它是细观参数,只能通过宏观试验结果反演标定。标定的目标量一般是四个:弹性模量E、泊松比ν、单轴抗压强度σc、残余强度或破坏模式。
以级配碎石为例,室内单轴压缩和常规三轴试验的典型结果是:E在30到60 GPa量级,σc在几MPa到几十MPa之间,破坏模式表现为明显的劈裂和局部破碎。矿渣混凝土则不同,材料内部有砂浆基体和骨料两个相,如果只模拟骨料颗粒的破碎,标定目标更多是“骨料在混凝土破裂后不立即粉化,而是形成一定数量的粗碎片”。
建模之前,先把手头试验数据整理好。我习惯做一张这样的表:
| 物理量 | 目标值 | 对应PFC参数 |
|---|---|---|
| 弹性模量E | 由试验曲线弹性段斜率得到 | kn、ks、pb_kn、pb_ks |
| 泊松比ν | 试验横向/纵向应变比值 | kn/ks 或 pb_kn/pb_ks |
| 峰值强度σc | 试验峰值应力 | pb_ten、pb_coh |
| 残余强度 / 剪胀角 | 破坏后的应力水平 | fric、pb_fa |
4.2 标定顺序与经验公式
标定顺序非常关键。我建议的流程是:
- 固定摩擦性质:先把ball的fric设成0.5到0.7,pb_fa设成30到35度附近,这两个值后期尽量少动。
- 调刚度匹配弹性段:单轴压缩算到弹性阶段就停,观察应力应变曲线的斜率。E偏大就同时降低kn、ks、pb_kn、pb_ks;E偏小就同时增大。这一步可以先只调线性刚度,不碰bond强度。
- 调泊松比:E匹配后看横向应变。如果ν偏大,增大kn/ks的比例(比如从1.0调到1.5);如果ν偏小,反过来减。
- 调bond强度匹配峰值:峰值强度对pb_ten和pb_coh最敏感。先保持pb_ten与pb_coh比例约1:1.5,整体乘一个系数,看峰值是否落在目标区间。
- 调破坏模式:如果试样表现为整体崩解,说明bond强度分布太均匀,需要给bond强度加一点随机波动;如果加载早期就大量破裂,说明初始应力集中太强,需要检查初始平衡状态。
一个粗略的经验关系:峰值抗压强度大约正比于bond抗拉强度,系数通常在3到8之间。也就是说,如果试验峰值强度是10 MPa,pb_ten可以先试2 MPa量级,然后微调pb_coh。这个线性关系能帮你把标定起点定准,而不是靠瞎猜。
4.3 一组典型参数参考
下面给一组我标定过的碎石和矿渣混凝土参数范围,供做初值参考。注意不同级配、不同含水率、不同加载方式都要重新标定,下面数值并非万能:
| 参数 | 级配碎石 | 矿渣混凝土骨料 | 说明 |
|---|---|---|---|
| ball密度 kg/m³ | 2600 | 2400 | 堆叠密实度会自然影响质量 |
| kn / ks (N/m) | 2e7 | 1e7 | 弹性变形主导 |
| fric | 0.6 | 0.5 | 控制残余强度 |
| pb_kn / pb_ks (Pa/m) | 3e7 / 3e7 | 1.5e7 / 1.5e7 | bond刚度 |
| pb_ten (Pa) | 2e6 | 8e5 | 抗拉强度 |
| pb_coh (Pa) | 3e6 | 1.2e6 | 黏聚力 |
| pb_fa (°) | 35 | 30 | bond内摩擦角 |
第一趟标定时,bond强度宁低勿高。强度设置太高,cluster完全不破碎,算出来的结果是clump的翻版;强度稍低,至少能观察破碎行为,再逐步往上调。
4.4 cluster内部的级配与尺寸效应
标定过程中我发现一个高频坑:试样内的cluster数量太少,或者单个cluster太大,会导致宏观结果对“该cluster内部bble怎么排”异常敏感。换一组随机种子,峰值强度能差20%以上。这不是数值错误,而是代表性体积单元不够大。
解决办法有两个:一是增加试样内cluster的数量,让统计平均覆盖单颗cluster的随机性;二是在同一cluster内部让bond强度有适当空间波动,比如按FISH随机乘一个0.8到1.2的系数,模拟真实骨料内部微缺陷分布。后者对破碎模式的真实感提升非常明显。
至于试样尺寸,一个直径0.1m、高0.2m的标准圆柱试件,颗粒数量至少到数千颗才谈得上稳定。如果完整试件上万颗甚至几十万颗颗粒跑不动,建议先缩小到1/4或1/8标定参数,确认力学响应稳定后再放大模型。
5. 调试与排坑:cluster不碎、炸裂、碎片异常怎么办
5.1 不破碎:先查力链还是先查bond参数
cluster模型最常见的故障是“明明设了bond,为什么跑完整个加载过程一颗都没碎”。
第一优先要查的不是bond强度,而是力链是否真正传到了cluster内部。很多时候模型里的试样在压缩过程中已经整体刚体运动了,上下墙和cluster之间只有一两个接触点,大力全部被墙消耗掉,cluster内部的bond自然不碎。这种情况在初始堆积松散、孔隙率偏高的模型里特别常见。解决方法就是先把孔隙率降到合理区间,比如0.30到0.40,然后跑足够的cycle让试样先产生稳定的接触力链。
排除了力链问题,再检查bond强度。我之前常犯的错误是用宏观抗压强度去估算bond强度,结果设高了10倍。记住4.2节里的换算经验:bond抗拉强度大约是宏观峰值强度的1/5到1/8。如果你设的pb_ten已经低于这个量级还是不碎,那把加载速度调快一点试试——这多半是时间步内变形量太小,还没到bond断裂阈值,而模型的阻尼又把应力波完全吸收了。
5.2 一加载就炸:初始均衡与阻尼的坑
另一种常见故障是模型“开局即炸”。刚开跑几个cycle,cluster就从内部崩开,或者整个试样瞬间失稳。这时候问题多半不在bond参数,而在初始状态没搞干净。
PFC5.0里生成ball时,随机填充会造成大量重叠接触,产生巨大的初始不平衡力。这种不平衡力如果不消除就赋bond,相当于给每个bond施加了额外预应力,一旦开始加载,这些初始应力会率先把bond推垮。所以在生成cluster之后、赋bond之前,最好先跑几百到几千个cycle,让系统把不平衡力降到足够小。标准做法是检查model unbalanced-force,把它降到最大接触力的1%以下再继续。
阻尼也值得单独说。PFC5.0默认的局部阻尼是0.7,这个值对大部分静力问题是稳的,但如果你的模型动态效应明显(比如加载速度太大),会出现应力波在试样内反复弹跳导致局部炸裂。把局部阻尼临时调到0.0,用model solve跑静力,或者降低加载速度,都可以缓解。
5.3 碎片数异常和性能问题
碎片数异常有两个方向:一个是“全碎成单颗粒”,一个是“几乎不碎但是碎得很碎”。
全碎成单颗粒,多半是bond没有在cluster内部完全建立,只是给少数几个接触赋了bond,剩下的pebble本来就没粘住,加载时自然全部脱落。检查方法是统计cluster内实际bond数量:
fish define count_bond local cp = cluster.find(1) if cp != null local n = 0 local count = cluster.pebble.count(cp) loop local i while i < count local p1 = cluster.pebble(cp, i) if i < count - 1 local p2 = cluster.pebble(cp, i + 1) local c = contact.find(p1, p2) if c != null if contact.prop(c, 'pb_ten') > 0.0 n = n + 1 endif endif endif i += 1 endloop io.out('cluster 1 bond count: ' + string(n)) endif end @count_bond我见过一个案例,cluster有200多个pebble,实际bond数量却只有30,结果一开始加载就全散了。补上bond之后,破碎模式立即正常。
“碎得很碎”通常说明pebble粒径比太大或bond强度太低。把半径比降到2以内、适当提高pb_ten和pb_coh,会让碎片尺寸更集中在几个大块上。
性能问题则是另一个烦恼。cluster模型比clump慢一个量级,因为内部接触全参与计算。优化思路有三个:减小pebble数量、用wall替代不关心的ball边界、设置合理的计算域。还有一个小技巧:跑纯压缩标定时,把模型尺寸缩小,标定完参数再放大到最终模型,能省下大量的调试时间。
5.4 调试时的可视化检查
调试cluster时,我强烈建议在PFC5.0里把接触和bond的状态可视化出来:
plot create view_bond plot add contact type bond plot add contact type crack这样可以直观看到加载过程中哪些位置先裂、裂纹怎么扩展、碎片怎么分离。很多时候光看数值曲线根本看不出问题,但stress-strain曲线一出现异常拐点,配合裂纹云图马上就能定位原因。
6. 数据不会骗人:破碎率、配位数、能量曲线与碎片统计
6.1 颗粒材料破碎的核心量化指标
模型能跑出破碎之后,下一个问题是:怎么把“破碎了多少”量化出来。
最常用的是Marsal破碎率。试验中通过筛分得到加载前后的级配曲线,两个曲线之间围成的面积就是破碎率。PFC里实现这个思路有两个入口:
- 直接统计bond断裂数量,用断裂bond数除以初始bond总数作为“内部损伤度”。这个方法简单,但bond断裂并不完全等价于宏观破碎。
- 真正意义上的Marsal破碎率,需要把cluster的碎片按“等效粒径”归类,做虚拟筛分。碎片等效粒径可以按碎片内pebble体积折算成球径,然后统计加载前后级配曲线。
第二种结果更容易和试验对比,但实现复杂。如果只是做相对对比,我个人认为bond断裂数加碎片数量组合已经够用。
配位数(coordination number)是另一个直观指标,表示每个ball平均有多少个接触:
CN = 2 * N_c / N_b
其中N_c是接触总数,N_b是ball总数。配位数下降说明颗粒间接触变少,骨架在“溶解”;破碎刚开始时配位数往往先下降,之后新生成的细小碎片重新接触,配位数又有所回升。这个“先降后升”的形态是颗粒破碎的典型特征,写论文或者做报告时可以重点展示。
6.2 用FISH和history把数据取出来
PFC5.0里提取这些指标不难。history命令可以记录想要的标量:
; 记录不平衡力 history id 1 model unbalanced-force ; 记录平均配位数(需要FISH函数支持) history id 2 ball coordination-number ; 记录bond断裂数(需要FISH函数维护计数器) history id 3 bond-break-count history interval 100bond断裂数在PFC5.0里可以用crack相关FISH函数统计,如果你的版本没有内置,也可以自己遍历接触,检查bond是否已经失效,每次失效就把全局计数器加一。注意history只能记录FISH函数返回的标量值,所以必须先把统计逻辑写成FISH函数,再被history引用。
一个完整的“碎片统计”FISH示例如下:
fish define frag_stat local btot = 0 local bbreak = 0 ; 遍历所有bond接触,统计总数和断裂数 loop foreach c contact.list if contact.type(c) = 8 ; linearpbond类型编号因版本而异 btot = btot + 1 if contact.prop(c, 'pb_ten') = 0.0 bbreak = bbreak + 1 endif endif endloop global frag_ratio = bbreak / max(btot, 1) global frag_count = bbreak end @frag_stat注意PFC5.0里bond断裂后接触模型通常会退化为线性接触,contact.type的编号会变化,我这个例子只写逻辑,具体类型编号需要对着你版本的FISH手册查。
6.3 从曲线判断破坏阶段的经验
处理这些数据时,可以把整个过程分为三个阶段:
- 第一阶段:加载初期,配位数略有上升或稳定,bond断裂数极少。这是试样压密和力链重组的阶段。
- 第二阶段:应力接近峰值时,bond断裂数量开始陡增,配位数明显下降。这是破碎活跃期,对应试样内部裂纹大量扩展。
- 第三阶段:峰值后,bond断裂增速放缓,碎片开始重新排列和接触,配位数可能略有回升,应力曲线出现残余平台。
这三个阶段的划分直接对应试验中的声发射特征。如果有条件,把每千cycle的bond断裂数做成“事件率”曲线,你会看到它和真实的声发射振铃计数曲线长得非常像,这也能侧面验证你的模型抓到的是不是真实的破碎行为。
最后分享一个笨办法。我在做碎石压实模拟时,最怕的就是参数组合不唯一:bond强度和摩擦角都能让峰值强度看起来差不多,但残余阶段差很远。所以我的顺序永远是先固定摩擦性质,再调bond强度,把这个顺序固化到标定流程之后,一次标定基本能控制在两到三轮试算内。如果哪次模型跑出来的破碎模式和试验对不上,我第一件事是去检查初始孔隙率和初始平衡,而不是急着调bond——因为内力链状态不对,后面所有参数都白调。