Itasca PFC6.0与FLAC耦合三轴体应变计算 计算效率确实要比柔性膜高很多 柔性膜变形的褶皱效果还是颗粒膜要好些

最近在搞PFC6.0和FLAC的耦合计算,三轴试验的体应变分析效率提升明显。直接拿球颗粒膜做边界替代传统的柔性膜,发现个有趣的现象——当围压加载到峰值时,颗粒膜表面居然能自然形成波浪形褶皱,这可比有限元模拟的"橡皮膜"真实多了。

先说说计算效率这事儿。传统柔性膜需要反复更新网格,每次边界变形都得重新计算接触力。用PFC的颗粒膜当边界,配合FLAC做应力传递,实测发现20万颗粒规模的模型,计算时间直接从8小时压缩到2小时。关键代码其实就这几行:

; FLAC边界应力传递
zone initialize stress xx @s_xx yy @s_yy zz @s_zz
[PFC]
ball attr force @f_x @f_y @f_z

这串代码相当于在FLAC和PFC之间架了座数据桥。重点在于stress关键词后的@符号,实时把FLAC的单元应力映射到PFC颗粒的接触力上。注意这里要用异步耦合,别傻乎乎地搞实时同步,否则计算速度反而会掉沟里。

Itasca PFC6.0与FLAC耦合三轴体应变计算 计算效率确实要比柔性膜高很多 柔性膜变形的褶皱效果还是颗粒膜要好些

再来看变形效果。颗粒膜形成的褶皱不是预设的几何形态,而是自然演化出来的接触链失稳。用clump模板生成的非球形颗粒特别适合这种场景:

clump template create ...  # 自定义星形轮廓
ball generate cubic ...    # 带孔隙率的初始堆积

调试时发现个坑:颗粒的摩擦系数不能直接照搬土体参数。建议先用单轴试验标定,比如当围压400kPa时,摩擦系数调到0.3左右褶皱效果最明显。用Fish脚本实时监控变形量:

def track_wrinkles
    total_wrinkle = 0
    loop foreach bp ball.list
        if ball.pos.z(bp) > 0.95*wall.pos.z(top_wall)
            total_wrinkle += abs(ball.disp(bp))
        endif
    endloop
    return total_wrinkle
end

这个自定义函数实时统计表层颗粒的位移累计值,数值越大说明褶皱越明显。实测发现当应变达到5%时,褶皱指数会突然跳升,对应着土样的剪切带形成。

不过颗粒膜也有尴尬时刻——当围压卸载时,部分颗粒可能会"卡"在奇怪的位置回不来。这时候需要祭出接触刚度动态调整大法:

ball.property 'kn_contact' @kn * (1.0 + ball.disp.x^2)

这行代码贼有意思,它让颗粒的接触刚度随着位移平方增长,既能保持卸载时的稳定性,又不影响加载阶段的变形。调试参数时可别手抖多打个零,否则颗粒会硬得像铁坨,完全失去变形能力。

总的来说,这种耦合方法特别适合做反复加卸载的动态分析。下次准备试试循环荷载下的颗粒膜疲劳特性,或许能整出更有意思的变形花样。不过得先解决内存泄露的问题——连续跑10个工况后,FLAC进程占用的内存会涨到12G,得查查是不是应力映射的缓存没清理干净...

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐