多孔介质流动 多孔介质中的两相流动, 多尺度模拟,孔隙尺度建模,Darcy-Brinkman-biot理论。 可以模拟粘性指进,毛细管力驱动,接触角研究。 模拟驱替和渗吸过程。
先甩段代码热热身,用OpenFOAM搞个孔隙级模拟:
# 定义两相流场 twoPhaseSystem = TwoPhasePhaseSystem( phase1=Air, phase2=Water, porousZone=foam.PorousZone( permeability=1e-9, # 渗透率像堵车似的 porosity=0.35 # 孔隙率比海绵蛋糕还密 ) ) solver = PimpleFoam( timeSchemes=[Backward], nNonOrthogonalCorrectors=2 ) solver.run(endTime=0.1)这段代码的核心是渗透率参数,单位是m²。1e-9什么概念?相当于沙子的渗透能力。当两相流体在这种介质里较劲时,Darcy方程可能hold不住了,得搬出Brinkman修正项来救场:
$$
\mu_{eff} \nabla^2 \mathbf{u} = \frac{\mu}{K} \mathbf{u} + \nabla p
$$
这个式子妙在左边是粘性项,右边是达西阻力,相当于让Navier-Stokes和Darcy两派大佬握手言和。实际模拟时要注意有效粘度μ_eff的取值,这货经常在孔隙尺度与宏观尺度之间反复横跳。
说到尺度问题,最近在折腾多尺度耦合。举个栗子,用Python的PoreSpy生成微观结构:
import porespy as ps im = ps.generators.blobs(shape=[500,500], porosity=0.6) props = ps.metrics.pore_size_distribution(im)生成的孔隙网络活像显微镜下的砂岩(图1)。但直接拿这个做全场模拟?算到明年也出不来结果。机智的搞法是把微观参数升尺度到宏观模型——比如把局域毛细管压力曲线打包成等效参数。
驱替过程的代码更有意思,粘性指进现象堪比流体界的闪电:
// 表面张力项处理 volScalarField pc = pcModel->pc() * (1.0 - saturation); surfaceScalarField phic = fvc::interpolate(pc) * mesh.magSf(); // 求解饱和度方程 fvScalarMatrix sEqn ( fvm::ddt(s) + fvm::div(phi, s) == fvm::laplacian(M, s) + fvc::div(phic) );关键在laplacian项里的M——流动特性矩阵,它决定了粘性指进的分叉程度。当注入速度超过某个阈值时,界面就开始发疯似的分叉,这时候需要自适应网格来捕捉细节(图2)。
最后说说接触角这个磨人精。实验室测接触角要烧香拜佛,数值模拟也没好到哪去。用VOF方法处理三相接触线时,边界条件要这么玩:
contact_angle = 60 # 亲水表面 mesh.boundary['wall'].setContactAngle( angle=contact_angle, limiter=ContactAngleLimiter.COSINE )这个角度参数能让流体界面在固体表面"站"成特定姿势。但实际中发现,动态接触角跟静态设定值能差出20度——所以最新算法开始用神经网络实时预测接触角变化。
折腾完这些,终于能看着模拟动画里两种流体像贪吃蛇一样在孔隙迷宫里你追我赶。虽然头发掉了一地,但看着粘性指进的枝状分叉在屏幕上绽放,比看烟花还带劲——当然,前提是别问我算这个用了多少CPU小时。