多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

XFlow格子玻尔兹曼方法模拟多孔介质两相流:从毛细管渗吸到参数标定实操

XFlow格子玻尔兹曼方法模拟多孔介质两相流:从毛细管渗吸到参数标定实操 格子玻尔兹曼方法LBM这个名词在油藏工程和渗流力学圈子里早就不是什么新鲜概念了但真正能用工程级软件把它跑起来、而不是自己吭哧吭哧写两万行C代码的人确实不算多。我当年用XFlow做毛细管自发渗吸的模拟说白了就是被逼出来的——甲方想看水怎么在微观孔隙里自己吸进去传统VOF搞不定随机骨架里的接触线移动而自己写LBM又面临生命周期和调试的双重压力。最后把宝押在XFlow的格子玻尔兹曼内核上总算把双相流动、接触角滞后、渗吸深度与时间的关系这些硬骨头都啃下来了。这篇文章就是冲着能复现三个字来的。如果你正在评估XFlow能否用于多孔介质两相流模拟或者你已经打开软件但面对一堆物理模型参数不知道该从哪下手那么下面这些从原理到实操、从参数标定到结果验证的内容应该能帮你少烧掉一沓笔记本。1. 为什么毛细管自发渗吸把传统CFD逼到了墙角1.1 界面追踪的先天之痛先说我为什么一开始没走常规路线。传统CFD里处理两相流主流方案其实就是VOF流体体积法和Level Set水平集法。VOF的思路是把每个网格单元里水的体积占比当作一个标量场来追踪这个思想很直观实现也不复杂所以OpenFOAM和Fluent里都有成熟求解器。但VOF有个绕不过去的坎它必须对相界面做几何重构也就是说你每一时刻都要专门去算界面在哪个位置、什么形状这需要额外引入界面压缩项和几何算法。当你的计算域是一块充斥着几百个随机喉道和孔腔的复杂多孔介质这些重构计算就会变得异常繁琐而且界面一拉伸就断裂。Level Set的思路稍微优雅一点它用一个距离函数来隐式表达界面数值稳定性比VOF好但它在相界面附近的体积守恒差尤其是充满曲率极小的毛细管壁面附近液面推进一点点都可能导致质量误差累积。1.2 渗吸问题的硬约束接触线真正逼近传统CFD极限的其实不是怎么算界面而是怎么算接触线。毛细管自发渗吸的驱动力是弯月面处的Laplace压差而这个压差的数值直接取决于动态接触角和毛细管半径。接触线在固体壁面的移动涉及微观分子尺度的物理化学作用而宏观连续性方程对这部分无能为力。传统方法最常见的做法是人为指定一个接触角边界条件但碰到真实岩心那样表面粗糙度极高的孔隙壁面接触角实际上是时变的这会让速度场和压力场在壁面附近出现非物理的奇异性。1.3 LBM的介观哲学格子玻尔兹曼方法能走通这条路核心在于它的世界观完全不同。LBM不做界面追踪也不解宏观N-S方程它站在介观尺度上用一堆离散速度分布函数的碰撞和迁移来重现流体行为。你设定一个粒子群在格点上碰撞后趋向平衡态的规则然后让计算自动涌现出界面的曲率、表面张力、接触线滑移。这种哲学对两相流简直是量身定制的界面不需要重构它在密度场或序参量场里自然形成自带梯度壁面处的相互作用力可以通过伪势模型非常自然地引入接触角不再是硬性边界条件而是材料属性多孔介质边界即使复杂到每个格点都是固体节点LBM的反弹格式bounce-back也能天生处理。我这么描述可能有点抽象你试着把LBM想象成一场大型的交通仿真每个格子是一个路口分布函数是不同方向的车辆数碰撞规则是红绿灯时序迁移规则是车辆移向相邻路口。你不需要去追踪每一辆车的轨迹只要规则设对了早晚高峰的拥堵波自然而然就出现了。两相流模拟就是这个逻辑的高级版——不同的车辆颜色代表不同的流体相。1.4 为什么项目最终落在XFlow上既然LBM这么好那自研代码是不是更可控是的学术圈大量论文都是自己写Lattice代码而且D3Q19、D3Q27这些方案在开源社区也都有现成模板。但我的项目周期不允许我从头折腾并行计算和网格生成尤其需要的是工程化后处理和模型参数的第一手解释。XFlow走的是无网格路线它不需要传统意义上的网格划分几何体直接以曲面形式导入软件自动在计算域内填充格子这对随机生成的多孔介质模型来说省掉了巨大的前处理工作量。此外XFlow的物理模型库中直接内置了多相流模型能让你在图形界面里设置表面张力、壁面润湿性、接触角这些参数。它把学者们争论不休的微尺度参数封装成了工程参数对做应用研究而不是做算法研究的人来说这是效率上的降维打击。2. XFlow里的两相模型从Shan–Chen理论到可调参数2.1 伪势模型的本质XFlow的多相流模型其核心本质是Shan-ChenSC伪势模型这是1993年提出来的经典框架。SC模型不去显式追踪界面而是在每个格点上定义一个伪势函数这个势函数依赖于局部的密度或序参量。邻近格点之间因为伪势差异会产生一个相互作用力这个相互作用力在宏观尺度上等效为同种流体之间趋向于抱团不同种流体之间趋向于分离。界面张力就是这种微观力统计平均的宏观表现。要注意Shan-Chen模型里没有显式的表面张力系数向量表面张力是从等温状态方程和相互作用强度参数$\psi(\rho)$中自发涌现出来的。这带来一个工程问题你没办法直接填入水的表面张力等于72.8 mN/m你得先做参数标定。这也是很多第一次用XFlow做两相流的人卡壳的地方。2.2 XFlow中界面参数的三种设定逻辑在XFlow的界面里与表面张力相关的参数设置大致可以分成三类第一类是直接指定表面张力系数的如果你选择连续的表面应力模型这种情况比较少见因为软件仍然需要在模拟过程把表面张力转化为体积力或格子力内部做了复杂的换算。第二类是接触角和壁面润湿性的设置。XFlow支持在几何壁面上赋予不同的润湿属性。这个润湿属性实质上是在壁面格点额外施加一个偏向某一相的伪势相互作用导致接触角从90度向亲水或疏水方向偏移。如果你设置的壁面参数偏向水相水就会更容易铺展偏向气相水就会收缩成球。第三类是状态方程的参数。XFlow让用户可以修改流体的状态方程来改变密度比和压力密度关系。在LBM里密度比不能设成真实水-气那样的夸张比例真实水气密度比接近1000SC模型稳定范围一般几百以内所以工程上要做一个折中让两相密度比尽量高一些同时保证数值不发散。2.3 元胞自动机式的直觉理解这其实是理解LBM两相流最核心的思维转变不要把界面张力当成一个施加在已知界面上的外力而要把界面张力当成微观规则运行后的统计结果。就像你在站台上看人群人多的区域人和人之间会自然形成有一定距离的排队间距这个间距不是某个管理员画的黄线而是所有人遵循同一套别挤我的微观规则涌现出来的宏观现象。Shan-Chen的界面也是一样它没有一个追踪界面的网格但界面却永远在那个势函数梯度最大的地方存在。2.4 格子单位与物理单位的桥梁LBM的一切计算都在格子单位中运转而你关心的结果渗吸速率、压力是物理单位。这里的换算关系必须在建模前写清楚否则结果一出来你都不知道自己在看什么。XFlow软件本身会把大部分换算工作拦下来它允许你在界面中直接定义流体的物理属性然后在内部完成格子与物理单位的映射。但作为使用LBM的人你至少要明确两件事一是特征长度对应关系即你所设定的1个格子长度实际代表多少微米这决定了毛细管内径在计算域里占据的格点数二是特征时间对应关系这影响你能用多大的时间步长进行瞬态模拟。我的经验是在XFlow中先用小模型把单位换算的逻辑彻底打通之后再上完整的多孔介质模型不然在结果阶段反复调整物理单位会让人崩溃。3. 把水的天性标定进计算域表面张力与接触角的实操校准3.1 第一个案例静止液滴测试任何LBM两相模型第一关永远是液滴测试。你不用设置复杂的边界只需要在一个不大的计算域内放一个静止的球形液滴然后观察它在表面张力作用下是否保持稳定形状且是否满足Young-Laplace定律。XFlow有个好处它可以直接用后处理功能输出压力场你就能方便地读出液滴内外的压差。具体操作上我建议按如下步骤进行建立一个小型三维计算域例如每个方向100个格点中央处放置一个球形水相液滴其余区域为气相。液滴半径至少取25个格子太小的半径会由于离散曲率误差导致压力场数值乱跳。设定两相密度比例如设置成10到50表面张力参数先行给一个默认值。运行直到液滴内外的密度场达到稳态以总动能的减小为标准判断是否达到稳态。然后输出中心轴线上的压力分布考察界面两侧的压力差$\Delta p$与理论预测公式$\Delta p2\sigma / R$对球形液滴的匹配程度。如果压差偏大说明表面张力参数偏高压差偏小则反之。这个校准过程的目的不仅在于设置一个正确的数值更关键的是找到格子单位下表面张力系数与物理表面张力之间的乘数因子。3.2 接触角标定从90度出发接下来是接触角标定。XFlow允许你在壁面上设置不同的润湿性参数我在实际操作中发现最好在每个相似度的模拟系列开始前都自己做一个接触角参照测试。方法很简单在计算域底部设置一个平面壁面。在壁面上放置一个半球形的液滴。运行状态达到平衡后通过后处理输出密度等值面量取液滴在壁面上接触角。这个测试几乎是所有多孔介质毛细管模拟的地基因为你后续所有关于亲水/疏水渗吸能力的结论全部建立在壁面参数与接触角的对应关系上。如果这里标定不准后面所有的渗吸深度、渗吸速率都会偏。我在一次硅酸盐玻璃毛细管的模拟里标定目标接触角是35度第一次跑出来只有55度。反复排查才发现壁面的润湿参数被我在模型复制时不小心覆盖回了默认值。这种错误极其典型——软件的几何树界面里表面属性和求解器设置经常被混用新手尤其容易在看参数面板时漏掉某个表面是否启用了物理属性这一开关。3.3 黏度的格子单位换算格子玻尔兹曼方法里面流体的运动黏度与松弛时间relaxation time直接相关关系式为$\nu c_s^2 (\tau - 0.5)\Delta t$。如果你在XFlow里直接输入物理单位下的黏度值软件会负责换算但你心里得有本账当$\tau$接近0.5时数值黏度很小模拟趋向于不稳定界面可能波动当$\tau$过大时例如大于1.0数值耗散太大界面运动会变得过于钝化。我的建议是尽量把两个相的松弛时间控制在0.5到1.5之间宁可把水相和气相的黏度比缩小一些也不要让任何一个相的$\tau$值接近下限。我在模拟液态水-氮气体系时真实黏度比大约为50XFlow初始配方直接给了个默认黏度比达到了200结果初始步长还没有跑到1024步压力场就开始振荡。用XFlow做两相流模拟你最终必须接受的现实是它的范式面向快速工程评估你必须在物理精度和计算稳定性之间做一个工程化的取舍。3.4 密度比与计算效率的权衡高密度比是LBM两相流模拟的永恒主题。对于水-气体系密度比越接近真实值数值稳定性越差密度比压得过低则水和气两相的密度差异不够显著界面两侧惯性力对比失真。做自发渗吸模拟时主要的驱动力是毛细张力而非重力所以密度比对渗吸速率影响有限。基于这个前提我认为把密度比设置在50到200之间是合情理的选择。密度比选用200时水的格子密度约2.0气相约0.01收敛性和物理真实性达到了一个在工程上可以接受的平衡。4. 搭一座自发渗吸的可视化实验台4.1 单毛细管模型的几何设置从最简单的算例开始——一根直的毛细管嵌入一块固体基体毛细管一端与液池连接另一端开放到气相。计算域我可以描述如下整体尺寸长度300格点截面100×100格点毛细管半径10到15个格点位于计算域中央沿z方向贯穿固体基体的材质设置为亲水壁面接触角目标值由前面的液滴测试标定的壁面参数给定。这里有个小技巧毛细管入口和出口处不要做成突变截面用一个斜坡或者锥形过渡否则入口效应会干扰渗吸早期阶段的速度场让初期渗吸深度$H(t)$曲线偏离理论的$t^{1/2}$规律。4.2 边界条件怎么给才自发自发渗吸的核心要求是水相没有外部压力驱动纯粹靠弯月面的Laplace压差把水拉进毛细管。实际操作中常见做法是设为两端压力均为0参考压力一致出口侧允许开放流动入口侧连接一个无限大液池。在XFlow中这意味着要合理设置计算域的开放边界open boundary。我不建议在这类瞬态渗吸模拟中把出口直接设成固定压力边界因为初期弯月面形成时会产生压力脉冲固定压力边界会把这种物理过程给反射回去。开放边界配合适当的缓冲区更加贴近实际的实验条件而且缓冲区还能抑制压力波反射的数值伪影。4.3 初始状态的设置技巧初始化时毛细管内预先填满气相计算域入口侧的一段区域也就是液池区域填充水相。注意初始时刻不能把弯月面设置得太陡否则界面处的密度场在第一步就会被强烈的伪势力冲散产生所谓数值爆炸。稳妥的办法是给初始相分布一个平滑的过渡带这个过渡带宽度大约为5-10个格子即可。另一个容易忽视的地方是初始速度场。我见过太多人在LBM模拟里直接把速度初值设为0这个逻辑在单相流里没问题但在两相流里初始时刻界面附近的密度梯度会立刻产生很大的局部力若速度场完全没有缓冲就会导致早期压力振荡。我的做法是让模拟前2000步采用较小的全局时间步长或者干脆在最初的几百步内把表面张力从0线性增加到目标值让系统软启动。XFlow如果支持时间相关的自定义场这是一个非常实用的技巧。4.4 多孔介质骨架构造的注意事项做完单毛细管就可以往真实的多孔介质模型迈进了。XFlow接受STL或STEP格式的几何文件所以你可以用开源工具生成随机孔隙网络模型然后导出几何。我当时用的是竞争性生长算法生成的堆积球体骨架再提取内部孔隙空间作为流体域。入口和出口附近需要设置集流腔manifold否则多孔介质内的流动会受入口几何的强烈干扰。集流腔的尺寸至少是最大孔径的5倍。计算域的边界如果采用周期性边界条件要注意XFlow在多相流下的周期性边界与单相流实现有细微差异——周期性边界下不相连通的两相压力自由浮动此时验证体积守恒就格外重要。5. 结果判读渗吸深度、Washburn定律与易错陷阱5.1 渗吸前沿的提取方法模拟跑完之后第一步是从后处理数据中提取渗吸前沿的位置。我的习惯是取密度等值面$(\rho_{liquid}\rho_{gas})/2$与毛细管中心轴线相交的点作为瞬时弯月面位置。将不同时刻的前沿位置连成一条$H(t)$曲线。这里要特别提醒XFlow后处理的默认颜色映射未必能清楚显示两相界面建议自定义密度值的user field。颜色映射范围一定要手动锁定因为气液两相的密度差异可能高达两个数量级自动映射会把低密度相的细节压到一片混沌之中。5.2 和Washburn方程面对面毛细管自发渗吸的经典理论是Lucas-Washburn方程$$ H(t) \sqrt{\frac{\gamma , r \cos\theta}{2\mu} , t} $$这个公式表达了渗吸前沿位置与时间的平方根关系其中$\gamma$是表面张力$r$是毛细管半径$\theta$是接触角$\mu$是液体黏度。我把模拟结果和这个理论公式做了对比发现早期阶段初始几十个时间单位模拟结果会出现与平方根关系偏离的情况这主要是因为入口处的流动需要一定时间才能建立起稳定的弯月面形状。在毛细管半径小、初始界面曲率与平衡曲率差异大的情况下这种偏离会更加明显。当你撰写研究报告时一定要把这段过渡期单独标注出来不要为了拟合理论曲线而隐藏它。5.3 我的实测参数表以直径20个格子、长度200个格点的单毛细管为例一组能够稳定跑通并得到合理结果的重要参数如下物理含义参数值格子单位备注液滴初始半径30用于Young-Laplace标定水相密度1.5密度比50:1气相密度0.03密度比50:1水相松弛时间0.8换算黏度见公式气相松弛时间0.6气相速率更快壁面润湿力偏置正值表现为亲水具体值由接触角测试确定时间步长0.1保证稳定对照组数据表明对于亲水毛细管接触角35°模拟渗吸深度指数即$\log H$对$\log t$的斜率约为0.49与理论值0.5高度吻合这个结果在工程上可以说相当漂亮。5.4 质量守恒是最容易被忽略的评判标准做了这么多LBM模拟我的最深体会是很多人只盯着界面形状好不好看却忽视了质量守恒。一个两相流模拟如果液体总质量随时间减少5%那么你就不能用它来定量分析渗吸速率。在XFlow中每次运行结束后我都建议输出两相的总质量随时间的变化曲线确认其波动在百分之零点几的范围内。如果出现明显的质量漂移通常原因包括时间步长过大导致局部数值不稳定、壁面处浸润层厚度不足或者开放边界压力反射导致非物理的泄漏。在我自己跑的一组多孔介质随机骨架案例中第一次质量漂移率高达8%排查两小时后发现问题出在前处理的几何修复上STL文件里有一些肉眼看不见的自交面导致LBM在局部格点上的反弹格式出现错误把流体吞掉了。用软件自带的几何清理工具重新修复后质量守恒恢复到了0.5%以内这一课值两小时。5.5 从单毛细管到真实岩心的路还长最后要坦诚一句单毛细管与真实多孔介质之间还存在一个很大的鸿沟。真实岩心的孔隙网络有着宽泛的孔径分布、顽固的角隅滞留效应、以及复杂的互连性这些都是模拟难以完美复现的因素。但XFlow的价值恰恰在于它能让你快速淘汰那些明显错误的物性假设从而把时间留在真正值得深入研究的物理问题上。如果你手头正好要开始这类模拟我给你的建议是不要一上来就追求和实验数据的完全一致。先用单毛细管模型跑通全流程记录你设置的所有参数与对应的结果特征然后加一个孔或者加一个弯逐步逼近你要研究的真实结构。这种从简到繁的路子比起直接堆一个巨大的随机结构模型然后面对无数个不知从何调起的参数要省心得多。
返回列表