层理岩体的蠕变特性总让人又爱又恨。今儿咱们拿PFC2D整点有意思的——单级加载直接怼到位,分级加载玩心跳分阶段,最后再搞个剪切蠕变收尾。别慌,咱用代码说话
PFC2D层理岩体单级/分级蠕变(含剪切蠕变模拟)
先整点基础活,创建层理模型得注意节理面的bond设置。下面这段是生成层理岩体的核心:
ball generate box -10 10 -5 5 radius 0.1 0.15 contact cmat default model linearpbond contact cmat add 1 model linearbond ... [这里接具体的刚度、强度参数]关键在contact cmat add后面那串参数,特别是tension和shear的peak值直接影响层间滑移。建议bondkn比bondks大个2-3倍,毕竟层理面抗压不抗剪。
单级加载简单粗暴,适合急性子:
fish define apply_load loop local ball ball.list if ball.pos.y > 3.0 ball.force.app = vector(0, -1e5) endif endloop end这个fish函数直接给上层颗粒"拍砖",1e5的力一步到位。跑起来记得用history记录位移,当看到位移曲线从陡变缓再趋稳,说明进入稳态蠕变阶段。
分级加载就得讲究节奏感了。在单级代码基础上加个循环控制:
fish define step_load local load_level = 0 loop while load_level < 5 load_level = load_level + 1 apply_load(load_level*2e4) ;每次加2e4 command solve time 1e4 ;每级维持1e4时步 endcommand endloop end注意每级加载后要给solve足够的驰豫时间,这时候用fish的command嵌套特别管用。观察位移曲线应该呈现阶梯状上升,每级之间的"平台期"长度能反映岩体流变恢复能力。
PFC2D层理岩体单级/分级蠕变(含剪切蠕变模拟)
剪切蠕变得玩点花的,在法向力基础上叠加剪切分量:
contact property ks 1e8 kd 5e7 fish define shear_creep loop local cnt contact.list if contact.prop(cnt,'mat') == 2 ;假设层理面是材料2 contact.force.app.shear.x = 5e4 endif endloop end这里直接对接触面施加剪切力,ks是剪切刚度,别设太高否则容易数值爆炸。建议边加载边监测剪切位移,当发现位移速率降到初始值1%以下,基本可以判定进入衰减阶段。
跑仿真时最容易栽在时步控制上。建议用:
set timestep auto solve timestep_scale 0.3自动时步加个0.3的安全系数,特别是分级加载阶段容易突然失稳。遇到过不收敛的情况,先别急着砸键盘,把contact list看看哪个接触点力异常,八成是刚度参数设飘了。
最后整个数据记录的骚操作:
history id 1 ball displacement id 100 ;跟踪id100颗粒 history id 2 energy kinetic plot create creep_curve plot add history 1 vs time边跑边画图才是王道,位移-时间曲线要是出现剧烈抖动,赶紧ctrl+c保命,回头调整阻尼系数。用能量曲线辅助判断系统稳定状态,动能突然飙升就是失稳前兆。
仿真这玩意儿就像熬汤,参数火候到了自然出结果。记得多备几组对比实验,层理面角度调个30°、60°试试,说不定能抓到有意思的各向异性特征。
