PFC 7.0版】二维隧洞非平稳渗流模拟研究 【PFC】管域非平稳渗流模拟研究-以二维隧洞渗流为例PFC版本为7.0。 这个案例主要以二维渗流为例利用fish语言编写差分法 并进行了改进实现非平稳的隧道渗流研究。 旨在通过该方法的可行性扩展到非稳定渗流的颗粒流模拟。蹲在电脑前盯着PFC黑黢黢的界面瞎捣鼓突然发现用颗粒流搞渗流模拟这事儿还挺带劲。二维隧洞渗流这玩意儿传统有限元看着太乖了咱偏要用颗粒碰撞来折腾非稳态水流。别的不说单就看着那些小圆点带着水压到处乱窜可比看静态云图刺激多了。先甩段核心的Fish代码镇楼; 网格初始化 nx 50 ny 30 array p(nx,ny) ; 压力场 array q(nx,ny) ; 流量场 ; 边界条件设定 loop i (1,nx) p(i,1) 10.0 ; 底部定压 p(i,ny) 0.0 ; 顶部自由渗出 endloop这段看着简单其实暗藏玄机。nx和ny控制网格精度但别贪多——PFC粒子数要是爆炸了显卡能给你表演当场去世。边界条件这里玩了个小花招底部固定水压顶部自由渗出中间夹着隧洞结构的空隙率参数后面循环里会动态更新。时间步进这块整了个骚操作define time_step local dt 0.01 loop k (1,1000) loop i (2,nx-1) loop j (2,ny-1) q(i,j) (p(i1,j)p(i-1,j)p(i,j1)p(i,j-1)-4*p(i,j)) * perm(i,j)/dx^2 p_new(i,j) p(i,j) dt*q(i,j) endloop endloop p p_new if k%100 0 io.write(Step ,k, completed with max pressure ,array.max(p)) endif endloop end典型的显式差分套路但重点在perm(i,j)这个空隙率参数——这货是跟PFC粒子位置实时联动的。每次颗粒移动导致孔隙变化时perm矩阵就跟着刷新相当于把固体骨架变形和渗流场来了个动态耦合。dx是特征长度实际操作中发现取2~3倍平均粒径比较稳。【PFC】管域非平稳渗流模拟研究-以二维隧洞渗流为例PFC版本为7.0。 这个案例主要以二维渗流为例利用fish语言编写差分法 并进行了改进实现非平稳的隧道渗流研究。 旨在通过该方法的可行性扩展到非稳定渗流的颗粒流模拟。说到颗粒和流场的耦合这段才是灵魂代码fish define apply_flow_force loop foreach ball ball.list local pos ball.pos i int((pos.x - xmin)/dx) 1 j int((pos.y - ymin)/dy) 1 grad_p (p(i1,j)-p(i-1,j))/(2*dx), (p(i,j1)-p(i,j-1))/(2*dy) ball.force.add(-grad_p.x * ball.vol, -grad_p.y * ball.vol) endloop end每个颗粒根据所在网格的压力梯度挨个吃水流推力vol是颗粒体积。这里有个坑当颗粒跨网格边界时直接取整可能会跳变后来改成双线性插值才稳住。ball.force.add那行看着简单实则把达西定律和牛顿力学拧成了麻花迭代的时候得控制好耦合频率不然容易数值爆炸。跑起来之后发现个有趣现象当渗流速度超过临界值时颗粒会突然进入蹦迪模式孔隙率剧烈波动导致渗透率震荡。这非稳态特性用传统方法还真不好捕捉但在PFC里成了自带特效。不过要拿到漂亮的数据得在结果输出上费点心思; 实时输出渗流量 define monitor_flow local total_q 0.0 loop i (1,nx) total_q total_q q(i,ny) endloop io.out(Current outflow: ,total_q) end监控总流出量这个操作配合PFC自带的movie命令能录出渗流前锋推进的鬼畜动画。后来试过把压力场映射到粒子颜色上红蓝渐变的视觉效果直接能拿去忽悠甲方。折腾完最大的体会是用颗粒流搞渗流就像在豆腐上雕花——既要保持数值稳定又不能丢了物理过程的野性。传统有限差分的框架加上PFC的颗粒运动居然真能擦出非稳态模拟的火花。不过内存消耗是真的大建议跑案例前先清空微信聊天记录给电脑腾点地方。