这个标题里的三个词,单拎出来其实都不算特别难——相场法是两相流模拟里的常客,渗吸是油藏工程和岩土工程里的经典课题,多孔介质更是 COMSOL 里天天碰到的材料定义方式。可一旦把它们仨摞在一起,你很快就发现,事情没那么简单。我最近在 COMSOL 里把“裂缝性多孔介质渗吸”的完整算例从头到尾跑了好几轮,从二维单裂缝简化几何,到带微孔隙团块的复合模型,再到把移动网格也拽进来配合相场界面,踩坑踩到怀疑人生。这篇不整虚的,直接把我用 COMSOL 复现相场法渗吸的全过程、关键参数和报错经验摊开讲,适合正在做两相流、裂缝渗吸、或者被 COMSOL 库函数折磨的仿真人。
1. 为什么是相场:先搞懂裂缝渗吸的“物理脾气”
1.1 渗吸的实质:毛细力在裂缝里干的活
渗吸(imbibition)拆开看,就是液体在毛细管压力驱动下,自发地钻进未饱和孔隙或裂缝的过程。你在岩芯尺度看到的“水慢慢爬进裂缝”,本质上是一堆微米级通道里的固液气三相博弈。最经典的毛细管压力公式是:
p_c = 2σ cosθ / r
σ 是表面张力,θ 是接触角,r 是等效毛细半径。裂缝虽然比基质孔隙宽,但它其实就是一个“扁长的大毛细管”,所以这物理劲儿一点没变。换句话说,渗吸能不能发生、吸得多快,不是看压力入口给多少,而是看裂缝宽度、润湿性和液体物性之间的拉扯。这也是为什么干巴巴地给个入口压力做“强灌”模拟,往往复现不出实验里那种“自己往里面钻”的现象。
我做模拟时最初的困惑是:水进入裂缝后,气液界面会发生明显的拓扑变化,水会沿着粗糙缝壁往前爬,可能形成液桥、手指状前沿,甚至把空气圈闭在小孔隙里。这种强非线性界面运动,如果靠常规的界面追踪法去抠每个节点,网格很容易被撕裂或纠缠。相场法在这种场景下的优势就体现出来了。
1.2 相场法是怎么“变戏法”的
相场法的核心思路,是不直接追踪界面位置,而是引入一个连续变化的序参数 φ,用 φ 从 1(水)平滑过渡到 0(空气)的等值面来代表界面。界面不再是一条线或一个薄层,而是有厚度的过渡带。COMSOL 的“两相流,相场”接口基于 Cahn–Hilliard 方程:
∂φ/∂t + u·∇φ = ∇·(M∇ψ)
ψ = λ(−∇²φ + (φ²−1)φ / ε²)
这里 ε 是界面厚度,M 是迁移率,λ 是混合自由能密度。物理上看,φ 的分布受化学势 ψ 的驱动,界面会自动向能量最低的形态演化。这带来的工程好处非常直接:界面可以自由合并、分裂、消失,不需要人为干预。
我在实际算例里感受到的“相场魔性”是:当你把裂缝设计成 S 形弯曲,或者让水绕过几个圆形颗粒时,相场法不需要提前布置界面追踪线,只要初始相场给得对,水头往前推进时界面就自动跟着走。省了不少网格重构的麻烦。代价是必须满足 ε 远小于几何特征尺寸、网格在界面附近要细到 ε/2 左右,这两条后面展开说。
1.3 和水平集、VOF 相比,相场到底强在哪
COMSOL 里做气液两相流,常见的选择还有水平集法和 VOF。水平集法简单,但要不断做重新初始化来保证距离函数性质;VOF 在商业 CFD 里工程化程度高,但处理接触角时容易在壁面产生虚假速度。相场法则因为基于能量变分,接触角被天然缝进边界能量里,对裂缝壁面的润湿性处理要顺手得多。
举个我自己的例子:裂缝壁面我设了亲水接触角 30°,相场法里只需要在“润湿壁”边界条件里写 theta_w = 30° 就行,计算出来界面在壁面附近会自动形成对应的曲率,水滴爬坡的形态很自然。VOF 在 Fluent 里做类似设置也不是不行,但要多配动态接触角模型,还要处理壁面粘滞层,工程量不一样。
所以我的结论是:做裂缝渗吸这种强毛细控制、强润湿效应、界面拓扑可能出幺蛾子的题目,相场法跟 COMSOL 的有限元框架是绝配。尤其裂缝网络几何复杂时,自由三角形网格与相场接口的兼容性,比结构化网格上的 VOF 舒服太多。
2. 建模前的准备:选对几何、接口和参数
2.1 几何与介质简化:从真实岩芯到可算模型
很多人一上来就想建真实岩芯的三维 CT 重构模型,我劝你冷静。渗吸是强多尺度现象,真实岩芯孔隙从纳米到毫米跨越几个数量级,全解析网格在 COMSOL 里做个静态渗流还能勉强跑,加相场瞬态基本就是灾难。
我的做法是分两级走。第一级是单裂缝二维模型:一个矩形域代表储层骨架,中间切一条宽 2~10 μm 的曲线裂缝,裂缝两侧或末端挖若干圆形或椭圆形的“基质孔隙团块”。这个模型保留了两个关键要素——裂缝作为高速入渗通道,以及孔隙团块作为毛细储集空间。第二级才是带裂缝网络的多孔介质复合模型,把裂缝做成交叉或分形形式,周围基质用“多孔介质”域属性去等效。这样既抓住渗吸的物理本质,又不会让网格数失控。
几何构建时有个细节容易忽略:裂缝与孔隙相连的位置一定要做圆角过渡。尖锐的断角在相场求解时会产生局部曲率异常,导致化学势突变,常常表现为界面在尖角处“钉住”不往前走。我是直接在 COMSOL 几何序列里给角点加了 0.5 μm 的倒角,后续收敛性立刻改善。
2.2 接口搭配:相场 + 流动 + 多孔介质的组合逻辑
对应上述几何策略,物理场搭配也有两套方案。
方案 A(几何解析式):整个求解域都是流体域,空气和水均通过“两相流,相场”接口驱动,周围孔隙团块不是多孔介质,而是真实挖出来的孔洞。这在孔隙尺度上是最准确的,可以得到局部弯月面、圈闭气泡、液桥等精细现象。缺点是网格量大,如果想模拟裂缝壁面的粗糙度,计算成本更要翻倍。
方案 B(等效介质式):裂缝处用层流 + 相场,基质多孔区用 Brinkman 方程或达西定律,通过接口耦合。这个方案能代表更大尺度的工程问题,但在相场设定上要多做一些处理,比如多孔介质中两相饱和度的初始分布,用什么函数把 φ 与饱和度对应起来,都需要额外思考。
我建议做现象复现、出文章插图时用方案 A;做油藏尺度的动态驱替预测时用方案 B。这篇主要讲方案 A,因为相场的优势在方案 A 里体现得最淋漓尽致。
需要特别提到的接口细节是,COMSOL 里相场接口会内嵌“相场初始化”研究步骤。在正式瞬态计算前,最好先跑一次初始化,让 φ 从阶梯函数平滑成符合 ε 厚度分布的初始构型。我见过好几个同事跳过这步直接瞬态,结果界面附近出现诡异的锯齿振荡,其实不是模型错,是初始条件太粗暴。
2.3 关键参数清单:别让迁移率和界面厚度坑了你
相场模拟的参数敏感性比普通两相流强得多。下面是我跑裂缝渗吸时固化下来的一组参考值,fluid 介质为水–空气体系,界面张力 σ = 0.072 N/m,接触角 θ_w = 30°(亲水裂缝)。
| 参数 | 参考值 | 设定思路 |
|---|---|---|
| 界面厚度 ε | 1~2 μm(网格最小尺寸的一半) | 太厚会把毛细力削掉,太薄网格爆炸 |
| 迁移率 M | 1e-14 ~ 1e-12 m³·s/kg 量级 | 数值稳定性与物理真实性的折中 |
| 混合自由能密度 λ | λ = 3σε / √8 换算得到 | COMSOL 自动依赖 ε 和 σ |
| 入口压力 | 0(靠毛细自吸) | 主要关注自发渗吸,不用给外压 |
| 重力 | 根据几何尺寸决定是否需要 | 微米尺度裂缝中重力影响通常可忽略 |
| 接触角 | 亲水 30°,疏水 120° 做对照 | 裂缝壁面的润湿性改变渗吸速率 |
迁移率是相场接口里最“阴”的参数。物理上它控制界面弛豫的快慢,数值上如果取太大,界面会像泡水馒头一样发软,产生非物理的扩散前锋;取太小,界面又硬得像刀片,时间步长被迫压到极小。我的通用方法是先把迁移率设成界面速度平方级的低值,比如 1e-13,算一个短时间段看看界面是否平滑推进,再适当增大。偷懒窍门是观察 COMSOL 内置变量 spf.U 和 phi 的耦合是否稳定,如果有高振频,优先把迁移率调低一档。
3. 实操全记录:从“新建模型”到“看渗吸过程”
3.1 分步建模:五步搭出裂缝渗吸模型
以二维单裂缝为例,我按下面步骤走,每一步都在 COMSOL 6.x 的界面里能吃得很透。
第一步,新建模型向导,选择二维空间维度,物理场里搜“两相流,相场”,研究选瞬态。这里不要盲目勾“两相流,水平集”,除非你确定不需要能量法计算接触角。
第二步,几何序列。我建了一个 100 μm × 200 μm 的矩形域,在其中挖出一条宽度 2 μm 的 S 形裂缝,并在裂缝中段放两个半径 5 μm 的圆孔作为孔隙团块,布尔差集后得到流体域。入口在下边界,出口在上边界,裂缝壁面单独定义边界选择。
第三步,材料参数。流体相设为水(密度 1000 kg/m³,动力粘度 0.001 Pa·s),空气相用内置材料。值得注意的是,相场接口中密度和粘度是按 φ 值插值的,所以不需要再额外手动做平滑函数。
第四步,物理场细节设置。初始相场设 φ = 0(全域为空气),入口边界的层流流入压力设为 0,出口也设压力 0,这样渗吸完全靠毛细力驱动。关键是裂缝壁面的“润湿壁”条件,接触角填 30°,这类边界会自动引入润湿能量。
第五步,网格划分。界面细化采用“尺寸”属性控制,最大单元尺寸设为 ε/2,即 0.5 μm 左右,并给裂缝壁添加边界层网格。在孔隙团块和裂缝交接处添加“角细化”。网格总量在二维问题里大约 5 万到 15 万单元,瞬态求解不会太慢。
上述五步跑完后,先在“研究”里只执行“相场初始化”这一步,查看 φ 的等值面是否平滑。随后再添加瞬态,时间区间 0~2 s,时间步长从小到大,我常用 0.001 s 起步,乘以 1.2 的增长率逐步放大到 0.05 s。
3.2 网格与移动网格:要相场就得舍得下本
我知道很多人吐槽相场法吃网格,但这不是方法的问题,是使用方式的问题。裂缝宽度只有 2 μm,界面厚度 ε 如果也取 2 μm,整个裂缝横截面只有一两个网格,任何界面弯曲都表达不出来。合理做法是 ε 取裂缝宽度的 1/3~1/5,即 0.4~0.7 μm,网格在界面附近加密到 0.2~0.35 μm。我实测下来网格数翻倍,但计算性态也稳定得多。
如果后续要加入裂缝变形或者缝宽随压力变化,就绕不开移动网格。COMSOL 里“移动网格”接口要提前准备好:把计算域分割成“变形域”和“固定域”,变形域只在裂缝附近,边界位移按压力驱动模型给定。这个功能看着简单,实际非常容易踩坑,尤其是与相场结合时,大位移会让网格反转。我的建议是先跑一个纯二维裂缝张开的小算例,确认移动网格的位移边界条件没问题,再叠加两相流物理场。千万别一上来就全耦合,否则错误定位会浪费你一整天。
3.3 求解器配置与收敛技巧
瞬态求解器的选择上,我强烈建议用分离式,而不是全耦合。分离式求解器按“流体流动”和“相场”两个模块交替迭代,内存占用低,且当相场与流场时间尺度相差大时更容易稳定。具体在“求解器配置”里,选择“分离式”,在“流动”和“相场”之间设置迭代次数 2~3 次。直接上全耦合会出现 “Failed to find consistent initial values” 的概率非常高。
时间步长控制我一般不用默认的 BDF 全自动,而是开“初始步长”0.001 s,“最大步长”0.02 s,再用“后处理时输出”选“指定时间”来输出 0.01 s、0.05 s、0.1 s 等固定时间帧,便于做动画和对比实验数据。压力约束别忘了在角落加一个“压力点约束”,值 0,用来消除不可压缩流动的常压自由度冗余。不这么做,我第一次跑就碰到“矩阵奇异”报错。
还有一个小技巧:给壁面接触角做参数扫描时,为避免每次重算相场初始化,可以把“相场初始化”这一步保持启用,让每个接触角算例都在初始化基础上瞬态。这样可以减少大部分冷启动的初始化时间,批量扫参时效率高很多。
3.4 后处理:把 φ 和压力读出物理意义
后处理才是让仿真结果“说话”的地方。我常用的组合是:等值线画 φ = 0.5,表示气液界面;再叠加箭头图,表示局部速度;背景填上压力场。水分进入裂缝后会形成明显的舌形前沿,速度矢量在弯月面附近最大,这就是毛细驱动渗吸的直接可视化证据。
更定量一点,可以定义“渗吸深度 L(t)”为入口边界到 φ=0.5 最前端这段平均距离。然后画 L 与 t 的关系曲线。自发渗吸在纯毛细作用下满足 Lucas–Washburn 律,即 L ~ √(t)。我建议到这一步做个线性拟合,如果结果在双对数坐标下的斜率接近 0.5,说明模型物理上是靠谱的;如果斜率明显偏离,就要回头检查初始相场和接触角设对了没有。
压力场方面要看毛细压力的空间分布,把 p 减去静水压力后沿中心线画剖面。通常在弯月面前缘会出现一个局部低压峰,峰的高度接近 2σcosθ/r。我对比过自己的模拟值和这个理论值,误差在 10% 以内,这基本可以作为模型校验的硬指标。
4. 现场事故排查:我在这个模型里踩过的坑
4.1 界面厚度与网格尺寸的“两难”
最典型的坑,是为了省网格把 ε 设得比格网尺寸大好几倍。这样界面上会有无数个网格单元落在过渡带内部,虽然能算,但界面被“糊掉”了,表面张力对应的毛细力变成平均场的一部分,渗吸驱动力大幅削弱。现象就是水头推得很慢,像在糖浆里爬。
反过来,ε 设得比最小网格还小,虽然看着界面很锐利,但 Cahn–Hilliard 方程要求界面梯度由 ε 控制,网格解析不了梯度,就会出现振荡的锯齿界面。解决思路是:ε 保持与网格最小尺寸同量级,具体取网格最小尺寸的 1.5~2 倍。如果几何不允许,优先加密界面区域网格,然后用“网格自适应”功能在界面附近自动加密。
4.2 迁移率调小了不渗、调大了虚胖
迁移率可能是最折磨人的一个参数。有一次我把迁移率从 1e-12 直接调到 1e-9,想加快收敛,结果是界面变成了一团“弥散云”,φ=0.5 等值线几乎变成了一条模糊宽带,水不是作为整体前锋推进,而是像墨水晕开那样扩散。这是典型迁移率过大。相反,迁移率取 1e-16,界面倒是锐,但时间步长被压缩到 1e-6 量级,计算时间成倍增加,一个 2 s 瞬态跑了一天一夜。
我的经验是,迁移率应该与真实界面迁移的时间尺度匹配。可以先设一个初始值 1e-13,跑 0.05 s 的短时间,观察界面前沿移动距离,然后用“界面速度 × ε”反推合适的量级。这个参数没有一劳永逸的定值,只能随几何和物性调,但一旦调好,后续参数扫描基本不用动。
4.3 接触角与润湿性引发的“悬停”假象
另外一个我印象深刻的问题是接触角设置反了。我把裂缝壁面设为疏水 120°,结果水在入口处傻愣愣地停住,就是不肯爬进去。我当时以为模型有问题,排查了网格、压力、初始场一上午,最后才发现是润湿壁条件里接触角输成了 120°,亲水方向设反。
这个踩坑其实很有物理意义:如果裂缝被油浸或者表面改性,接触角从亲水翻到疏水,渗吸确实会从“爬升”变成“排斥”。所以模拟里务必先确认接触角是指液体相在固体表面上的接触角,还是指空气相的补充角。COMSOL 的润湿壁边界直接采用液—气—固体系角度,要输入的是水相对壁面的角度,不是在油气藏里常说的“润湿角补角”。建议对照实验接触角测量值写注释,防止前后设置搞混。
4.4 COMSOL 和 Fluent,气液两相流到底选谁
热搜里总有人问“气液两相流 COMSOL 与 Fluent 哪个更适用”,我在裂缝渗吸这个专门问题上的回答很明确:如果核心机制是毛细力、润湿、界面拓扑变化,选 COMSOL 相场;如果算的是大尺度工业两相管流、喷淋塔、搅拌槽,选 Fluent VOF 更顺手。两者不是替代关系,而是物理问题挑选工具的关系。
COMSOL 优势在于:多物理场耦合原生支持,相场接口自带接触角能量项,复杂几何用非结构网格很自由。Fluent 优势在于:大网格并行效率高,湍流模型丰富,VOF 钝态界面重构工程验证充分。对于裂缝性多孔介质渗吸,流动几乎总是层流、低速、界面主导,这正好是 COMSOL 相场的主场。真让我用 Fluent 反而要找动态接触角模型、用户自定义函数,累。
| 对比维度 | COMSOL 相场 | Fluent VOF |
|---|---|---|
| 界面追踪 | 隐式连续场,支持拓扑变化 | 锐界面重构 |
| 接触角设置 | 能量法内建,精确 | 需要动态接触角模型 |
| 网格适应性 | 非结构网格友好 | 结构化/多面体更佳 |
| 多物理场耦合 | 原生耦合 | 需要外部耦合或UDF |
| 适用尺度 | 微米到毫米级孔隙裂缝 | 毫米级以上工程设备 |
| 上手难度 | 物理场组合相对复杂 | 工程界面相对直观 |
5. 从复现到扩展:这个模型还能怎么玩
5.1 批量扫参与脚本控制
当你把单个算例跑通后,最想做的事情就是扫参数:接触角从 20° 到 60°、裂缝宽度从 1 μm 到 10 μm、表面张力不变但流体物性换一换。一个个手点模型再导出数据会累死,COMSOL 提供了 Java API 和 LiveLink for MATLAB 脚本接口,PUZZLE 爱好者还可以用 LiveLink for Python 控制。
我在脚本里最常用的操作就三件:修改全局参数、运行瞬态、导出渗吸深度曲线。通过循环扫描接触角,可以一次性画出“接触角–渗吸系数”曲线,和理论 Lucas–Washburn 解对比。建议脚本里把模型另存为 .mph 模板再跑,避免反复从头建模。如果机器内存够,还可以把不同参数算例放在多个 COMSOL Server 实例里并行,省一半墙钟时间。
5.2 扩展:考虑裂缝变形、岩石亲水性变化
跑通基础模型以后,有两条扩展路线值得尝试。第一条是耦合固体力学:把裂缝壁面设成弹性边界,水进入后引起局部压胀甚至微裂缝张开,这会反过来增加裂缝导流能力,形成正反馈。注意这时必须上移动网格,并且要让相场界面与移动网格的网格速度一致,不然会产生虚假的对流输运。第二条是模拟润湿梯度表面:在裂缝壁面沿长度方向设置逐步变化的接触角,从亲水渐变到疏水,这样水会受表面能量梯度驱动,形成类似“马朗戈尼”式定向输运,进一步模拟生物矿化、毛细泵等场景。
我还试过把温度场耦合进来:温度改变表面张力和接触角,相场接口里表面张力作为温度的函数可以直接定义,于是可以模拟裂缝注热水驱动渗吸加速的问题。COMSOL 的好处这时就非常明显,流体、相场、传热、固体力学全在一个界面里,物理场之间的依赖关系不用像外部耦合那样辛苦传递数据。
5.3 复现论文时的“半年经验浓缩”
最后说点关于“复现论文”的大实话。网上很多用 COMSOL 复现激光熔覆、相场渗吸的文章,核心参数写得非常简略,你很难一步还原实验曲线。我的复现套路是:先拿模拟结果和理论解对照,比如把渗吸深度和 Lucas–Washburn 律对照,把界面形态和毛细管上升实验照片对照;然后做网格无关性验证,固定物理参数,只加密网格,直到渗吸深度曲线的差异在 1% 以内;再把参数扫描结果放到同一张图上和文献数据找规律。
复现类论文工作里,最大的坑往往不是核心物理场,而是几何边界和材料插值方式。微米级几何中,边界的一点钝化、入口流动是否充分发展、材料参数的平滑方式,都会让最终曲线偏移 10% 以上。所以拿到别人的模型,先跑一遍原始默认参数,再一个个改动,而不是上来就改一堆参数然后问“为什么结果不一样”。
最后分享一个我实际操作的体会:相场法和渗吸放一起,是个“只要物理清晰,就不怕COMSOL闹脾气”的题目。但别指望一次瞬态算完就能拿到完美结果,我自己的习惯是,先把“相场初始化”单独跑稳,再上瞬态;先做二维单裂缝,再做复杂几何;先固定时间步,再放开自适应。每次只改一个参数、看一个指标,保存一个版本,才是绕开相场法那堆隐蔽参数最快的路。这个思路从我早期算气液两相流时养起,到现在做多孔介质渗吸,依然是最值得坚持的习惯。