隧道开挖flac-pfc耦合代码包含平衡开挖部分 如图隧道衬砌外面是pfc的ball与wall-zone再外面是Flac的zone每行都有很详细的注释小白也能看得懂隧道开挖模拟最头疼的就是围岩和支护结构的相互作用。FLAC处理连续介质稳得一批PFC模拟颗粒离散介质又灵活得要命这俩货搞在一起干活简直绝配。今天咱们直接开撸耦合代码的关键部分先看整体架构怎么搭——外层FLAC网格负责远场应力中间wall-zone当传力中介内层PFC颗粒直接怼到衬砌上。先看PFC部分的粒子初始化这里用了分层填充的骚操作;PFC粒子生成段 ball generate id1 x5.0 y5.0 radius0.3 ;生成中心粒子 ball distribute porosity 0.3 radius 0.2 0.3 ;孔隙率控制粒径分布 wall generate id100 polygon (0,0) (10,0) (10,10) (0,10) ;边界墙孔隙率参数0.3不是随便设的实测发现超过0.35颗粒体系容易崩。wall的坐标范围得比FLAC网格小个5%左右给应力传递留缓冲空间。FLAC这边网格划分讲究递进过渡;FLAC网格生成 zone create quad size 20 20 ;20x20基础网格 zone group 远场 range pos-x 15 25 pos-y 15 25 ;外层标签 zone interface name耦合面 groupwall-zone ;创建接触面interface这个命令是耦合的关键相当于在FLAC和PFC之间架了座数据桥。实测发现网格密度得比PFC粒子直径大3倍左右不然应力波传递会抽风。隧道开挖flac-pfc耦合代码包含平衡开挖部分 如图隧道衬砌外面是pfc的ball与wall-zone再外面是Flac的zone每行都有很详细的注释小白也能看得懂平衡开挖的核心在这段迭代控制;开挖平衡循环 loop n(1,10) ;最多10次应力重分布 solve_age 2000 * n ;计算步数动态调整 command model solve ratio 1e-5 ;FLAC收敛标准 fish callback pfc_sync ;调用同步函数 ball cycle solve_age ;PFC迭代 endcommand if check_balance then break ;平衡检测 endloop这个动态调整solveage贼重要——前期开挖扰动大给20000步后期平衡了可能200步就够。checkbalance函数内部做了粒子动能检测和网格力偏差计算避免死循环。耦合同步函数才是真·灵魂代码;fish同步函数 def pfc_sync loop i (1,wall_cnt) ;遍历wall-zone wall_force wall.force(i) * 0.8 ;力衰减因子 zone.apply(wall_force, i) ;映射到FLAC网格 endloop zone_force zone.stress * 1.2 ;应力放大系数 ball.force(zone_force) ;反向传递到颗粒 end这里0.8和1.2两个系数是玄学调参的结果实测能有效防止力震荡。原理大概是FLAC到PFC的力传递要适当放大反过来要缩小跟声波阻抗匹配似的。最后来个开挖步进触发;开挖触发机制 def step_excavate loop over zones if zone.pos.x excavate_front zone.delete ;删除开挖区网格 ball.delete range pos.x excavate_front ;同步删除颗粒 wall.delete range pos.x excavate_front ;拆除支护 endif endloop excavate_front excavate_front 0.5 ;进尺0.5m end这里删除顺序不能乱——先FLAC再PFC反过来会出幽灵力。进尺0.5m是经验值超过1m容易引发颗粒大规模失稳。整个代码跑起来像齿轮组咬合——FLAC算大范围应力重分布PFC处理局部破碎。有个坑要注意耦合面别用全自动接触手动控制力传递步长能避免80%的数值震荡。下次可以试试把PFC颗粒换成clump模拟节理岩体更带劲不过那又是另一个掉头发的故事了。
隧道开挖flac-pfc耦合代码,包含平衡开挖部分 如图,隧道衬砌外面是pfc的ball与wa...
隧道开挖flac-pfc耦合代码包含平衡开挖部分 如图隧道衬砌外面是pfc的ball与wall-zone再外面是Flac的zone每行都有很详细的注释小白也能看得懂隧道开挖模拟最头疼的就是围岩和支护结构的相互作用。FLAC处理连续介质稳得一批PFC模拟颗粒离散介质又灵活得要命这俩货搞在一起干活简直绝配。今天咱们直接开撸耦合代码的关键部分先看整体架构怎么搭——外层FLAC网格负责远场应力中间wall-zone当传力中介内层PFC颗粒直接怼到衬砌上。先看PFC部分的粒子初始化这里用了分层填充的骚操作;PFC粒子生成段 ball generate id1 x5.0 y5.0 radius0.3 ;生成中心粒子 ball distribute porosity 0.3 radius 0.2 0.3 ;孔隙率控制粒径分布 wall generate id100 polygon (0,0) (10,0) (10,10) (0,10) ;边界墙孔隙率参数0.3不是随便设的实测发现超过0.35颗粒体系容易崩。wall的坐标范围得比FLAC网格小个5%左右给应力传递留缓冲空间。FLAC这边网格划分讲究递进过渡;FLAC网格生成 zone create quad size 20 20 ;20x20基础网格 zone group 远场 range pos-x 15 25 pos-y 15 25 ;外层标签 zone interface name耦合面 groupwall-zone ;创建接触面interface这个命令是耦合的关键相当于在FLAC和PFC之间架了座数据桥。实测发现网格密度得比PFC粒子直径大3倍左右不然应力波传递会抽风。隧道开挖flac-pfc耦合代码包含平衡开挖部分 如图隧道衬砌外面是pfc的ball与wall-zone再外面是Flac的zone每行都有很详细的注释小白也能看得懂平衡开挖的核心在这段迭代控制;开挖平衡循环 loop n(1,10) ;最多10次应力重分布 solve_age 2000 * n ;计算步数动态调整 command model solve ratio 1e-5 ;FLAC收敛标准 fish callback pfc_sync ;调用同步函数 ball cycle solve_age ;PFC迭代 endcommand if check_balance then break ;平衡检测 endloop这个动态调整solveage贼重要——前期开挖扰动大给20000步后期平衡了可能200步就够。checkbalance函数内部做了粒子动能检测和网格力偏差计算避免死循环。耦合同步函数才是真·灵魂代码;fish同步函数 def pfc_sync loop i (1,wall_cnt) ;遍历wall-zone wall_force wall.force(i) * 0.8 ;力衰减因子 zone.apply(wall_force, i) ;映射到FLAC网格 endloop zone_force zone.stress * 1.2 ;应力放大系数 ball.force(zone_force) ;反向传递到颗粒 end这里0.8和1.2两个系数是玄学调参的结果实测能有效防止力震荡。原理大概是FLAC到PFC的力传递要适当放大反过来要缩小跟声波阻抗匹配似的。最后来个开挖步进触发;开挖触发机制 def step_excavate loop over zones if zone.pos.x excavate_front zone.delete ;删除开挖区网格 ball.delete range pos.x excavate_front ;同步删除颗粒 wall.delete range pos.x excavate_front ;拆除支护 endif endloop excavate_front excavate_front 0.5 ;进尺0.5m end这里删除顺序不能乱——先FLAC再PFC反过来会出幽灵力。进尺0.5m是经验值超过1m容易引发颗粒大规模失稳。整个代码跑起来像齿轮组咬合——FLAC算大范围应力重分布PFC处理局部破碎。有个坑要注意耦合面别用全自动接触手动控制力传递步长能避免80%的数值震荡。下次可以试试把PFC颗粒换成clump模拟节理岩体更带劲不过那又是另一个掉头发的故事了。