第一次在计算流体模拟里看到水相前缘像钻迷宫一样穿过随机孔隙、把空气挤成一串串气泡的时候,我意识到格子玻尔兹曼方法(LBM)下的自发渗吸模拟,远比教材上那张经典的Lucas-Washburn曲线要热闹得多。孔隙喉道里的弯月面一会儿加速突进,一会儿被卡住,空气在角落被切断成孤立的残余气泡——这种“水与空气的奇妙交互”,恰好是宏观计算流体力学最不愿意碰的场景。
这篇内容想写给三类人:刚接触LBM、想拿它做多孔介质两相流的研究生;从有限体积/VOF转过来、对格子方法半信半疑的工程师;以及做了几年仿真、想认真把渗吸动力学跑出物理味道的同行。我会完整复盘一次自发渗吸模拟从物理分析、模型选型、参数标定到结果解读的全过程,包括那些文献里很少写、但实际操作中一定会遇到的坑。
1. 为什么自发渗吸这个问题值得用LBM来啃
1.1 宏观CFD想描述“水挤空气”这件事有多难
先说说为什么我不建议直接用基于纳维-斯托克斯方程的传统界面追踪方法做这个课题。表面上看,VOF(流体体积法)和水平集方法都很成熟,处理油气水三相流动也有大量案例。但多孔介质中的自发渗吸有个致命特征:连续气相会被水相切割成大量孤立气泡,发生合并、破裂、拓扑变化。VOF依赖网格内的相分数重构界面,每次拓扑变化都要处理界面连通性;水平集方法则需要周期性重新初始化符号距离函数,在随机孔隙结构里调试这些算法,工作量非常可观。
更麻烦的是网格。多孔介质计算域是固体骨架、孔隙、喉道交替分布的高度不规则几何。宏观CFD要么用贴体网格,要么用浸没边界法。贴体网格在几百个随机颗粒之间生成六面体网格,质量很难保证;浸没边界法虽然能处理复杂几何,但在捕捉“弯月面卡在喉道处”这种局部润湿细节时精度不足。
1.2 LBM的介观视角天然匹配孔隙尺度物理
格子玻尔兹曼方法走的是一条完全不同的路。它不直接求解宏观速度场和压力场,而是追踪离散速度方向上的分布函数,通过“碰撞-迁移”两步演化。流体的宏观密度、速度和压力都是通过对分布函数求矩获得的,界面不需要显式追踪,而是由不同组分之间的作用力自然涌现。
用一个比喻来说:宏观CFD像是站在高架桥上统计整条路的车流,LBM则是模拟每一辆车的加减速和变道,再汇总成宏观的流量和平均车速。对于多孔介质这种充满几何约束的流动,后者天然适合——流体粒子在固体节点上通过反弹格式(bounce-back)处理边界,复杂几何不会增加额外计算负担。
自发渗吸的物理本质,恰恰就是孔隙尺度上的毛细力驱动流动。水相在亲水孔隙壁上自发铺展,空气被逐步驱替,整个过程由喉道几何、接触角、界面张力共同控制。要复现这种局部控制的现象,模拟工具的网格分辨率必须能直接分辨单个喉道的截面和弯月面形状。LBM的格子直接落在孔隙结构上,每个格子代表一个微元,弯月面的局部曲率可以自然捕捉,这正是LBM在这个问题上胜出的核心原因。
1.3 我看中的三个关键物理点
做这次模拟前,我给自己列了三个必须回答的问题,也是整个课题的核心:
- 渗吸前缘的推进是否符合经典标度律?Lucas-Washburn理论给出渗吸长度平方与时间成正比的结论,但真实多孔介质中的孔喉尺寸分布很宽,前缘往往不是匀速推进,而是跳跃式前进,标度指数可能偏离0.5。
- 空气是如何被捕获的?水相绕过某些大孔隙后,气相被切断形成残余气泡,这些气泡在后续水相推动下会发生变形、挤压甚至重新移动,构成“水与空气奇妙交互”的主要画面。
- 前缘形态如何演变?是稳定的平整推进,还是形成指进?这取决于毛细数与粘性比的组合。
这三个点,每一个都需要孔隙尺度的时空分辨率,也决定了我在模型选型和参数设置上不能瞎凑合。
2. 从物理现象到格子模型:一次完整的建模转化
2.1 先用无量纲数确定“这是个什么尺度的物理问题”
建模之前,我会先做一次量纲分析,避免在模拟中放进根本不起作用的力。
孔隙尺度毛细数定义为:
Ca = μ v / σ
其中μ是水相动力粘度,v是特征渗吸速度,σ是水-空气界面张力。在微米级孔隙、自然渗吸条件下,特征速度大约在毫米每秒量级,水的粘度约1 mPa·s,水-空气界面张力约0.072 N/m,算下来Ca在10的负5次方量级。这意味着粘性力相对毛细力非常弱,体系处于毛细力主导的准静态渗吸区间。
邦德数定义为:
Bo = Δρ g L² / σ
Δρ是两相密度差,g是重力加速度,L是特征孔隙尺寸。取L在10微米量级,Bo大约在10的负6次方。重力完全可以忽略。于是我在模拟中直接关闭重力项,或者仅设置一个极小的重力值作为数值稳定性的参考,这能让计算更快收敛。
这两个无量纲数帮我确定了基本物理画像:这是一个毛细力主导、重力可忽略、粘性效应次要的准静态过程。模拟时不需要刻意追求高雷诺数,也不需要复杂的湍流模型,但必须把表面张力和接触角做准。
2.2 伪势模型还是颜色梯度模型:我的选型对比
LBM两相流模型有很多分支,我在实际中主要纠结过两个:Shan-Chen伪势模型和Rothman-Keller颜色梯度模型。
伪势模型把两相之间的相互作用力直接揉进演化方程,相分离自动发生,代码实现简单,与多孔介质固体边界的耦合也直接。但它的硬伤是密度比受限,常规网格上稳定支持的水气密度比大约在1:50以内,真实水-空气密度比约1:1000,直接硬上会导致界面附近数值发散。同时,界面附近会有伪速度(spurious current),数值量级一旦超过真实渗吸速度,动力学测量就会被污染。
颜色梯度模型通过染色函数追踪相场,表面张力计算控制更精细,密度比可以做得很高,接触角的控制也更直接。缺点是每个时间步需要额外处理界面法向和曲率,代码复杂度明显上升,计算量也更大。
以我这次要跑的算例规模(单域约30万格子,三维条件下还要翻几倍),初始阶段先用伪势模型快速扫参数是完全合理的。伪势模型能快速把相分离、润湿性、多孔结构耦合跑通;等需要精确提取渗吸动力学曲线、做定量对比时,再切换到颜色梯度模型验证关键算例。两条腿走路,既能加快探索节奏,又能保证最终数据可信。
2.3 接触角不是改一个参数那么简单
自发渗吸的发生条件取决于水相与固体表面的接触角θ。当θ小于90度,固壁亲水,水相趋向于铺展,渗吸才会自发进行。接触角决定了毛细压力的方向和大小,进而决定渗吸驱动力。
在LBM中接触角的实现方式,取决于模型类型。伪势模型通过调节流体与固体节点之间的作用力参数来等效调节润湿性。这个参数的取值没有统一标准,必须根据自己的力格式、格子系数来标定。
我强烈建议做一件事:正式跑多孔介质算例之前,先在一个光滑平板上做“静态液滴标定”。具体做法是在平板上放置一个半圆形液滴,让体系充分演化到平衡,然后量取液滴与固壁的接触角,反推出作用力参数与表观接触角的对应关系。这个标定曲线只对当前代码和当前力格式有效,换一个力格式、换一个界面厚度设置,标定关系就变了。我在初次摸索时偷懒跳过了这一步,直接把别人论文里的接触角参数套进来,结果模拟出的表观接触角明显偏大,前缘推进形态完全走样。
3. 模型搭建过程中的关键实操
3.1 多孔介质生成:这是最容易毁掉整个模拟的环节
多孔介质计算域的构造质量,决定了后续所有物理结果的可靠性。我自己踩过一个大坑:一开始为了省事,在计算域里随机撒了几百个圆盘,重叠放置当作固体颗粒。结果跑出来的渗吸前缘完全不像样——并非物理上不合理,而是这种随机圆盘重叠生成的孔隙连通性极差,渗透率比真实多孔介质低了几个数量级,渗吸速度几乎为零。
正确做法有两种:
- 四参数随机生长法(QSGS):通过生长概率、定向概率等参数生成具有统计代表性的多孔骨架,可以控制孔隙率、孔隙尺寸分布和连通性。
- 直接读取真实结构的CT扫描截面:比如将岩心的二维切片二值化后导入LBM网格。如果你没有实测数据,网上有不少公开的多孔介质二值图像数据集可用。
我最终选择的是QSGS加一个“介质各向同性检查”的组合。生成之后,我会用小尺寸的Darcy流动测试(单相流)先标定渗透率,用Kozeny-Carman公式做交叉验证。渗透率对不上,说明生成算法里的连通性有问题,这时千万别启动两相模拟,否则后面所有数据都白跑。
3.2 计算域、边界与初始条件设置
典型的二维自发渗吸算例配置如下:计算域800x400格点,左侧是水储藏区,中间是多孔介质区,右侧是空气出口区。上下边界采用周期性边界,模拟无限长介质条带的截面;左右边界采用恒压边界或速度边界。初始时刻,多孔介质孔隙内全部充满空气,左侧水相通过一个薄膜与孔隙空气接触,水相在毛细力驱动下自动进入介质。
设置边界条件时最容易出错的是出口。如果你直接设置成自由出口,空气可以被轻易排出,渗吸动力学基本不受气相压缩影响。但如果要研究空气捕获和残余气泡,就需要让气相有足够的排出通道,同时设置合理的出口压力,否则整个介质内部压力场会异常。
初始条件方面,一个容易忽视的细节是两相密度场的初始扰动。如果初始时刻水相和空气相分界面完全对齐,数值上可能永远触发不了相分离。我通常在初始密度场上叠加幅值约万分之一的小随机扰动,给相分离一个“种子”。
3.3 格子单位到物理单位的换算
LBM计算本质是在格子单位下进行的,时间步、空间步、密度、粘度全都无量纲化。要做定量研究,必须建立格子单位与物理单位的映射。
我的做法是以孔隙率为基准做“两步走”。第一步,在格子单位下设置一个与目标孔隙率匹配的介质结构,测量格子渗透率K_lat;第二步,通过与Darcy定律(单相流模拟)计算得到的渗透率对比,反推格子与真实物理空间的尺度换算系数。
举个例子,假设真实岩石渗透率约为100 mD(约10的负13次方平方米),孔隙尺寸约10微米,模拟中测得的格子渗透率是一个无量纲值(约几十个格子平方)。两者相除,就能得到每个格子的实际物理边长。时间步的换算则通过渗吸前缘的早期惯性阶段数据与Lucas-Washburn理论对照来校准。
实际换算时我给自己定了一个硬性检查标准:单相流的渗透率标定误差要在10%以内,才能进入两相模拟。否则先回去查几何生成和边界设置,别急着跑浸吸。
4. 结果分析:当渗吸前缘真正碰上被压缩的空气
4.1 动力学曲线:Lucas-Washburn标度律的检验
模拟数据跑通之后,首先要做的是提取渗吸前缘位置随时间的变化曲线。经典Lucas-Washburn理论认为,在毛细力与粘性力平衡的区间内,渗吸长度与时间的平方根成正比,即L约等于t的0.5次方。
我的模拟结果却显示,前缘位置随时间的关系更接近t的0.45次方,而且在早期阶段有一段近似线性增长段。这个偏差不是数值误差,而是物理原因造成的:
- 孔喉尺寸分布的非均匀性导致局部毛细力差异明显,前缘不是一条光滑曲线,而是高低参差的“指状推进”。
- 空气并非完全不可压,气相被压缩后会对水相产生反压,减缓渗吸速度。
- 当部分空气被封闭成孤立气泡时,气泡内部压力不随出口相通,产生额外的阻力。
这个问题提醒我:直接用Lucas-Washburn的简单幂次律来预测复杂多孔介质中的渗吸是不可靠的。更合适的做法是定义局部饱和度剖面和前缘厚度,用分形或统计模型解释。
4.2 空气的“奇妙交互”:Haines跳跃与气泡捕获
这才是整篇题目里“水与空气的奇妙交互”最精彩的部分。当水相前缘遇到一个狭窄的喉道时,弯月面会被卡住,水相需要不断累积压力,直到突破喉道的毛细阈压,然后发生一次快速的突进。这个不连续的“跳跃式”推进,在文献中称为Haines跳跃。
模拟中观察到的Haines跳跃非常清晰:水相在某一时刻几乎停顿,界面曲率逐渐增大,累积的Laplace压力差不断上升,在达到临界值的一瞬间,水相以极快速度穿过喉道,随后进入下游大孔隙,速度骤降。这个过程会直接导致空气被切断:
- 当水相绕过一个大孔隙并从两侧汇合时,大孔隙内的空气与上游主气相连通的通道被水相封堵,形成一个孤立气泡。
- 这些孤立气泡被困在孔隙中央,被后续水相挤压,变形为各种不规则形状。
- 在压力足够高的情况下,气泡还可能被挤压通过喉道,分裂成更小的气泡。
从压力场的角度理解,这就像一个又一个“闸门”在逐级放水。我每次看到这种画面都觉得,教材里那句“多孔介质中两相流动的复杂性主要源于孔隙结构的非均质性”,在这组模拟数据面前有了最直观的呈现。
为了定量描述这种交互,我在每个时间步记录了气相饱和度、孤立气泡数量和最大气泡体积。结果发现,孤立气泡数量在渗吸中期达到峰值,随后部分气泡被水相推动合并或排出,气泡数量的变化与Haines跳跃的频率呈现出明显相关。
4.3 前缘形态:稳定推进还是指进
渗吸前缘的形态直接受毛细数与粘性比控制。在Ca极低的近似准静态条件下,前缘形态主要是“毛细指进”,即水相沿着连通性较好、毛细阻力较小的路径优先推进,形成多分支的指状结构,而不是一个平整的宏观界面。
我在模拟中发现,随着接触角减小(更亲水),前缘推进更均匀,指进程度降低;随着孔隙尺度的非均质性增强,指进现象显著加剧。有些大孔隙区域会形成“水相孤岛”,周围被空气包裹,随后再通过细喉道与其他水相连通。这种前缘形态演变,对最终油气采收率或燃料电池水管理中的气体通道效率有直接影响。
如果你也想分析前缘形态,建议在模拟中设置一个“局部前锋检测算法”:逐行扫描饱和度,找到饱和度从0突变到1的位置,提取前缘的尖点位置,统计前缘粗糙度。前缘粗糙度的变化曲线,比单纯看动力学曲线能提供更多微观机制信息。
5. 实测中的坑与调参经验
5.1 伪势模型的密度比困境与压力波动
伪势模型最大的麻烦在于密度比受限。真实水-空气密度比约1:1000,标准Shan-Chen格式下基本不可用。我试过几种改进措施,包括加密近界面网格、使用双分布函数法、调整状态方程参数(如Carnahan-Starling型状态方程),才把稳定密度比推到约1:100的可接受范围。
这个折衷是否影响物理结果?我的看法是:在自发渗吸这个特定问题上,密度比并不是决定整个动力学过程的核心参数。决定渗吸能否发生的是接触角和毛细力,密度差主要影响重力的相对大小。既然前面已经通过邦德数确认重力可以忽略,那么把密度比从1:1000降到1:100,并不会改变渗吸推进的基本物理特征,但它能带来更稳定的数值演化。这属于典型的“用物理分析指导数值妥协”。
压力波动是另一个头痛的问题。伪势模型在界面附近会产生非物理的伪速度涡旋,其强度在某些参数组合下甚至会超过真实渗吸速度,导致渗吸前缘出现随机抖动。解决办法包括:
- 采用更高阶的各向同性离散速度格式(比如改进的力的离散方式);
- 适当降低密度比,让界面厚度更厚、更平滑;
- 在作用力计算时采用对称组合形式,减少非物理的方向性偏差;
- 将松弛时间控制在0.6到1.0之间,避免过小松弛引发不稳定。
这些调整并非无脑堆参数,而是基于一个原则:让伪速度的量级至少比真实渗吸特征速度低一个数量级。每次改完参数,我都会先跑一个没有多孔介质的简单平板算例监测伪速度,达标后再进正式算例。
5.2 多孔介质几何对渗吸结果的决定性影响
这个坑我反复踩过,因此专门拿出来说。多孔介质几何生成过程中的微小组分差异,会对最终渗吸形态产生难以预料的放大效果。同样是孔隙率0.4,如果孔隙尺寸分布偏向于大量小孔配少量大孔,渗吸前缘会出现明显的“瓶颈效应”:小孔的毛细压力高,水相优先进入小孔,但小孔的流阻也高,整体推进速度反而被大孔中的气相隔断拖累。
反过来,如果孔隙尺寸偏大且分布均匀,渗吸前缘更平稳,气泡捕获也更少。这说明单靠孔隙率一个参数远不足以描述多孔介质的两相流行为,孔径分布、连通性、拓扑结构同样重要。
我的建议是:在正式跑对比算例之前,先做一次多孔介质结构的“统计画像”:统计孔径分布、喉道宽度分布、配位数、曲折度。这些统计量不仅帮你理解模拟结果,还能在写论文、做汇报时作为量化描述的依据。
5.3 气相出口条件的敏感性测试
刚开始跑稳态渗吸模拟时,我直接把右侧出口设为固定低压,结果发现渗吸曲线出现缓慢而持续的下降趋势,怎么调都消不掉。后来排查发现,问题出在气相出口的边界压力设置过弱,导致空气无法顺畅排出,介质内部压力逐渐积累,反向抑制了水相的进入。
之后我做了一次系统的出口条件敏感性测试,把出口压力从基准值附近按比例调低和调高10%,对比渗吸深度和气泡捕获数量。结果调低10%几乎不影响前缘推进,但气泡捕获数量明显减少;调高10%则导致前缘推进减缓,部分小孔隙中的空气根本无法被驱替。
这个测试的结论是:如果你主要关注渗吸前缘的推进速度和形态,适当调低出口压力是可接受的;但如果你关注残余空气饱和度和气泡分布,就必须严格保持出口压力与真实开放条件一致,否则会得到完全错误的气泡捕获统计数据。
5.4 计算时间步与总时间的预算控制
最后分享一个务实的建议:LBM多孔介质两相模拟的时间成本不可小觑。我跑一个800x400的二维算例,完成一次完整渗吸通常需要上万步,耗时数小时。三维算例的代价还要上升一到两个数量级。
控制时间预算的几个有效技巧:
- 所有参数扫描首先在二维小尺寸算例(比如200x100)上做,只保留最关键的几个参数组合到三维验证。
- 每完成一个算例,立即检查“前缘位置-时间”曲线是否出现平台期,如果长时间无推进,大概率是参数设置不合理,果断终止,不要干等。
- 对于二维网格,逐步放松时间步内的松弛参数,在保证稳定的前提下尽量用大的格子速度上限,提升收敛速度。
- 善用检查点(checkpoint)机制。每次跑大规模算例之前先跑一个小规模试算,确认稳定后再释放大规模任务,避免因为某个参数配置错误烧掉一整个下午的计算资源。
我在投入大量计算时间之前,习惯于先跑一个约1万步的快速试算,输出前缘位置和总饱和度曲线,观察基本趋势是否符合预期,再决定是否开启全量算例。这个习惯帮我节省了很多无效计算成本。
回顾整次模拟经历,我最想强调的一条经验是:LBM本身只是工具,真正决定模拟质量的,是你对目标物理过程的理解深度。先想清楚这个渗吸过程由哪些力主导、哪些参数敏感,再去选择模型和调参,才不会在格子动物园里迷失方向。如果你正准备用LBM做多孔介质渗吸模拟,建议你先从一个小尺寸二维算例起步,把接触角标定和单相流渗透率验证做扎实,再逐步放大。这样打下的基础,会让你后面面对Haines跳跃和气泡捕获这些复杂现象时,更有底气去判断哪些结果是物理的、哪些是数值的。