PFC-FLAC 3D耦合】‘边坡库水位骤降破坏过程的数值模拟‘案例 【PFC- FLAC 3D耦合】实现库水位骤降边坡的破坏过程PFC与FLAC版本均为6.0。 案例主要以边坡库水位骤降为例 。 主要创新有 [1]将浸润线运用到离散元数值模拟中。 [2]将地下水位变动的区域进行了划分天然状态区饱和区和非饱和区。 [3]在不同的位置施加了不同大小的拖拽力以模拟库水位下降的力。 附赠案例最近在搞边坡稳定性分析的时候碰到个有意思的案例——水库水位骤降导致的边坡破坏。传统方法处理这种流固耦合问题总感觉差点意思试了试PFC和FLAC 3D的耦合计算效果挺带劲。先说怎么把浸润线塞进离散元这事。PFC本身不带渗流模块但用fish语言写个渗流压力分布函数就能曲线救国。核心是给颗粒施加体积力模拟水压作用; 浸润线函数 def apply_seepage_force loop foreach gp ball.list y_pos ball.pos.y(gp) if y_pos water_table_height seepage_force 9.81 * (water_table_height - y_pos) ball.force.app.y(gp) -seepage_force endif endloop end这个函数遍历所有颗粒根据颗粒Y坐标和当前水位线高度计算渗流力。水位下降时动态更新watertableheight参数颗粒受到的浮力就会实时变化。注意这里用负号是因为PFC坐标系Y轴向上和实际重力方向相反。【PFC- FLAC 3D耦合】实现库水位骤降边坡的破坏过程PFC与FLAC版本均为6.0。 案例主要以边坡库水位骤降为例 。 主要创新有 [1]将浸润线运用到离散元数值模拟中。 [2]将地下水位变动的区域进行了划分天然状态区饱和区和非饱和区。 [3]在不同的位置施加了不同大小的拖拽力以模拟库水位下降的力。 附赠案例区域划分这块搞了个三色法天然状态区保持原地下水位饱和区按完全饱和处理非饱和区用折减系数。FLAC里用group分组特别方便zone group saturated range position-y 15 25 zone group unsaturated range position-y 25 35 zone property saturated density 2000 zone property unsaturated density 1800 saturation 0.6水位每下降5米就重新划分一次区域。实测发现非饱和区密度取天然状态的90%、饱和度折减到0.6-0.8时计算结果和现场监测数据最接近。拖拽力加载是重头戏。坡脚部位的水流速度大用速度平方乘以拖曳系数算力值坡顶区域按线性递减。PFC里这么实现loop foreach cnt contact.list if contact.group(cnt) toe drag_force 0.5 * 1000 * vel^2 * 1.2 contact.force.app(cnt) drag_force elseif contact.group(cnt) slope drag_force 0.5 * 1000 * vel^2 * 0.8 * (1 - pos_y/30) contact.force.app(cnt) drag_force endif endloop这里1000是水的密度1.2和0.8是不同区域的拖曳系数pos_y用来做高度衰减。有个坑要注意力必须施加在接触上而不是颗粒否则会破坏力链传递。附带的案例里有个骚操作——用FLAC先算稳态渗流场把孔隙水压力导到PFC当初始条件。数据对接用了个中间转换脚本import itasca from pfc import connect flac_pressures itasca.get_zone_data(pressure) pfc_grid connect.grid_transfer(flac_pressures) for ball in pfc.balls: ball.extra(pore_pressure) pfc_grid.interpolate(ball.pos())实测发现这种初始化方式比直接硬算快三倍不止。跑完计算看着边坡像融化的冰淇淋一样逐渐滑落位移云图从蓝变红的过程相当治愈。下次试试把降雨条件加进去估计能搞出更带劲的破坏动画。