做裂缝性油气藏渗吸模拟的人,大多绕不开COMSOL的相场方法。我在尝试用COMSOL模拟裂缝多孔介质中的自发渗吸时,走过不少弯路——从最简单的直缝推进,一路做到随机裂缝网络与孔隙结构耦合。这篇文章就记录我“从简单到复杂”的完整探索过程:相场参数怎么调、裂缝几何怎么建、裂缝和基质之间的边界怎么耦合,以及那些真正会把你卡住的问题。
1. 项目定位与整体设计思路
1.1 为什么用相场方法处理渗吸
先交代背景。渗吸,指的是润湿相流体在毛管力作用下自发进入多孔介质的过程。在裂缝性油气藏开发里,压裂液或注入水进入裂缝以后,会顺着裂缝快速向前推进,同时不断向周围致密基质里渗。这个裂缝与基质之间的流体交换,直接决定压裂液返排率、注入水波及范围这些关键指标。所以模拟渗吸的核心难点,是如何同时捕捉两种差异极大的流动模式:裂缝中的快速两相界面移动,以及基质里的缓慢渗流。
传统界面追踪方法有两个主流,VOF和Level Set。VOF对质量守恒非常友好,液滴体积不容易跑丢,但在复杂裂缝交叉处,界面几何重构容易出错,而且你想让界面形状保持平滑,需要额外做一堆处理。Level Set的界面表示很平滑,拓扑变化方便,但质量守恒经常出问题,模拟到后面液体总量悄悄减少,这在渗吸这种长时间演化问题里是致命的。相场方法则换了一套思路:它不直接追踪界面,而是用一个连续变化的标量场来描述两相状态,界面被视为一个有限厚度的过渡层,由Cahn-Hilliard方程控制其演化。这种方法的天然优势是界面分裂、合并、拓扑变化都能自动处理,不需要人为干预。
把相场放到COMSOL里还有一个工程层面的优势:表面张力不再通过界面曲率显式计算,而是被转化为体积力,自动耦合进Navier-Stokes方程。对裂缝这种狭窄几何来说,力的计算稳定性比界面逻辑本身更关键,这也是我最终选相场的原因。
1.2 从简单到复杂的三级建模路径
如果你一上来就直接建一个随机裂缝网络加上多孔介质基质的模型,大概率一个晚上都在调收敛,最后气得想砸鼠标。我的经验是,先建一个简单到不能再简单的模型,跑通了,再逐步加复杂度。这样出问题时你能快速定位到底是几何问题、物理问题还是纯数值问题。
我建议的路径分三级:
- 单条平直裂缝:验证相场基本参数和渗吸基础现象,目标是让界面能稳定推进,不散、不乱。
- 多裂缝交叉网络:加入几何复杂度,观察裂缝之间的连通性如何影响水相优先通道。
- 裂缝加多孔介质基质:把多孔介质以合理方式叠加上去,让水从裂缝渗入基质,观察真正的“渗吸”。
每一步只增加一个复杂度变量。这个习惯帮我解决过很多莫名其妙的问题,因为模型一旦崩了,你几乎能立刻判断是这一层新增的因素引起的。
还需要提前点出一个建模思想问题:所谓“多孔介质”在COMSOL里有两种完全不同的处理思路。一种是孔隙尺度建模,把颗粒骨架直接画出来,孔隙空间用相场两相流去模拟;另一种是等效连续介质,用Darcy定律描述基质内部流动,不把每个孔隙画出来。两种思路各有代价,前者真实但计算量巨大,后者高效但需要额外校准毛管压力曲线。后面会详细展开这两种路线该怎么取舍。
1.3 COMSOL接口选型
我用的物理场接口是COMSOL自带的“层流两相流,相场”接口。这个接口把层流Navier-Stokes、Cahn-Hilliard相场方程、表面张力体积力串联在一起,建模时不需要自己去写弱形式方程,省了很多功夫。如果你需要把Darcy区域加进来,还需要额外启用“多孔介质”模块,使用Darcy定律接口处理基质部分。
关于接口,有一个经验值得说:很多教程会让你直接用“层流两相流”再加“相场初始化”,但如果你在接口选择里直接勾选“层流两相流,相场”,COMSOL会自动生成相场变量、初始化步骤和体积力耦合,比手动连接省事得多,也不容易漏掉耦合边界。
2. 第一阶段:单裂缝中的渗吸模拟
2.1 几何构建与初始界面设置
单裂缝模型我建得很朴素,一个二维矩形区域,长10 mm,高0.5 mm,代表一段裂缝的剖面。为什么从二维开始?三维相场模拟计算量是二维的十几倍,刚开始探索真没必要上三维,先搞清楚物理机制和参数手感更重要。
几何构建里有几个关键操作:第一,在矩形两端各加一个扩展段,表示入口和出口,然后用“组合对象”合并成一个域,避免内部边界影响计算;第二,初始界面用一条竖直线近似,通过解析函数或阶跃函数定义在入口段与裂缝段的交界处;第三,务必在初始界面附近预留网格细化区域,否则相场初始化第一步就会出现界面被“拉扯”的假象。
我在这个阶段反复调整的一个细节是,初始界面的位置不要紧贴着入口边界。如果界面离入口边界太近,进入边界的流体和初始界面会互相干扰,产生一个虚假的压力冲击波。留出至少0.5 mm到1 mm的距离,让流体进入后有缓冲空间,界面演化会更自然。
2.2 相场接口的3个核心参数
相场参数调节是重头戏,核心参数有三个:表面张力σ、界面厚度参数ε、迁移率M。
σ直接取水的物理性质,0.072 N/m,这个没什么好调的。真正容易翻车的是ε和M。
界面厚度ε控制相场变量从0过渡到1的宽度。数值上,ε太小,界面附近需要极细网格,计算量爆炸;ε太大,界面会弥散得很宽,模拟结果明显偏离物理。按COMSOL文献的推荐,ε取特征网格尺寸的50%到100%,并且要保证界面区域至少覆盖2到3个网格单元。以我的模型为例,界面附近最细网格是0.005 mm,那ε就可以取0.01 mm。这里有一点新手很容易误解:ε不是按物理孔径选的,而是与网格尺寸配套选的。你没看错,这是一个数值参数,不是一个物理参数。
注意:界面厚度ε和网格尺寸是配套的,不是按真实物理界面厚度取的。我见过不少新手一上来把ε设成2e-7这种小值,最后模型网格破百万,纯属自己给自己加戏。
迁移率M控制界面松弛速度,本质上决定了Cahn-Hilliard方程中界面扩散运动的阻尼。COMSOL默认迁移率表达式与ε²和σ有关,通常可以直接用默认值。我习惯先用默认值跑一遍,如果发现界面出现“薄膜断裂”,或者质量守恒误差偏大,再把M调大或调小1到2个数量级。可以这样理解:M像界面运动的“润滑剂”,太小界面僵硬,容易产生非物理的碎块;太大界面过度平滑,细节全被抹掉。
2.3 边界条件与求解器配置
单裂缝模拟的边界条件并不复杂,但有三个位置需要仔细设置。
入口边界,我优先使用压力边界而不是速度边界。因为渗吸本质上就是毛管力驱动的自发过程,用压力边界更容易贴近物理本质。比如一个高于环境压力50 Pa的压力入口,让水和空气在压力差和毛管力共同作用下推进。出口边界设置为压力等于0的开口边界,并勾选允许回流。壁面边界,设置为“润湿壁”,显式给定接触角。这个是重中之重:接触角控制了毛管力方向和大小,亲水裂缝取30度,疏水裂缝取120度,要在这个边界条件里明确指定,只靠材料属性的接触角不可以自动生效。
求解器方面,我用瞬态研究,PARDISO直接求解器。相场问题是强非线性的,刚开始把时间步设小一点,比如0.001 s,后面交给自动时间步进机制接管。相对容差建议设在1e-3到1e-4之间,太粗糙会看到界面前沿抖动,太细会慢到怀疑人生。过去我习惯把容差卡得很小,比如1e-6,结果发现计算时间翻了几倍,结果几乎没差别,纯属浪费。
3. 第二阶段:裂缝网络与多孔介质基质的嵌入
3.1 多裂缝交叉几何的构建
单裂缝跑通之后,我开始加裂缝网络的几何复杂度。最简单的实验是十字交叉,然后是倾斜交叉,最后用COMSOL的阵列功能生成多条平行加分支的裂缝网络。
这里有一个很实用的操作心得:不要用一个个矩形去拼裂缝,再用布尔操作合并。那样做,裂缝交叉处容易出现重合几何和退化单元,网格质量必然很糟糕。更好的做法是用折线或样条曲线创建裂缝骨架,然后用拉伸操作生成带有圆角或矩形截面的裂缝域,交叉位置能自动处理好连续性。
如果你想做更接近真实岩石的随机裂缝网络,可以走两条路。一条是在COMSOL里用全局定义写随机位置参数,配合几何零件库去生成;另一条是从MATLAB或CAD导入DFN离散裂缝网络模型。DFN听起来高大上,但我的建议是:从少量确定性裂缝开始,比如三五条交叉裂缝,逐步增加数量,比一上来就导几百条随机裂缝要稳得多。每增加一批裂缝,都要重新检查网格单元质量,裂缝交叉点附近的网格长宽比经常能差出两个数量级,这是后期不收敛的常见元凶。
3.2 多孔介质基质的三种嵌入方式
处理基质区域,才算真正进入“裂缝多孔介质”的范畴。我分别试过三种主流方式,各自优缺点都踩过一遍。
第一种,全孔隙结构几何,直接建一个颗粒堆积体,把颗粒之间的空间当作孔隙,与裂缝直接连通。这种模型物理上最真实,所有渗吸细节都是显式模拟出来的。缺点也很明显:网格量巨大,相场界面要挤过狭窄孔隙,时间步被压到很小,模拟一天只能跑零点几秒的物理时间。我建议只用在很小的局部区域,验证机理时做,不适合全尺寸工程模拟。
第二种,Darcy等效介质。基质区域不画孔隙,直接用Darcy定律物理场,设置孔隙度比如0.2,渗透率比如1e-14 m²。这种方式效率高,能够覆盖较大区域,但需要对基质毛管压力曲线做额外标定,一般用Brooks-Corey或van Genuchten模型给饱和度与毛管压力的关系。这是工程实用路线。
第三种,全Darcy两相流,裂缝和基质都用宏观两相Darcy去描述,不追踪界面。这一类实际上已经不是相场方法了,很多工业级渗吸模拟用它。但如果你想保持“相场追踪界面”这个特点,重点应该看第一种和第二种的组合。
3.3 裂缝-基质界面耦合:我最推荐的设置
我最终采用的方案是“近缝区域相场自由流加远处Darcy基质的混合模型”。在裂缝附近和紧邻裂缝的孔隙区域,我用相场两相流去追踪界面形态;在远离裂缝的基质区域,我用Darcy定律去描述渗流。两者在内部交界面上通过压力连续和法向流量守恒耦合起来。
在COMSOL里的具体操作,我摸索了一套稳定流程:第一,在几何里把近缝域和远场域用一条共享边分开,设置成内部边界。第二,物理场使用两个接口:“层流两相流,相场”作用在近缝域,“Darcy定律”作用在远场域。第三,利用多物理场耦合节点的“压力一致性”选项,把交界面两侧的压力关联起来。第四,给Darcy区域设置一个毛管压力约束上限。这个约束很关键,因为基质渗透率低时,裂缝水向基质推进会在交界面产生虚假的高压区,甚至导致水流倒流。用基质最大毛管压力做上限,能把这个伪影压住。
这个混合模型最大的好处,是裂缝中前沿形态保留完整的相场细节,同时不用为整个基质内部超细的孔隙网格买单。缺点是需要对交界面条件做仔细调试,前期多花点时间在数值验证上是值得的。
4. 关键物理参数与数值实验设计
4.1 润湿性是如何影响渗吸的
相场模拟最吸引人的地方,就是能直观看到润湿性改变导致渗吸行为完全不同。亲水裂缝,接触角小于90度,水沿壁面铺展,界面前沿有明显的爬行现象,渗吸速度快;疏水裂缝,接触角大于90度,水像不情愿一样待在裂缝里,可能形成不规则的流体团,渗吸速度慢甚至完全不渗吸。
实际操作中,接触角对渗吸速度的影响经常是非线性的。我把接触角从60度调到30度,渗吸前沿的推进速度能快两三倍。所以在做参数扫描时,接触角是我第一个要扫的参数。COMSOL的参数化扫描功能可以批量跑,非常省心。这里要提醒一个单位问题:接触角在COMSOL里默认单位是度,如果在参数表里不小心用了弧度,表面看不出异常,但润湿壁行为会完全偏离预期。
4.2 尺度效应:裂缝宽度与孔隙尺寸
相场模拟里,尺度选择是个绕不开的难题。真实裂缝宽度可能从几十微米到几毫米,孔隙尺度更小,但你不可能在完整模型里把所有小孔隙都用相场直接画出来。
数值上有个重要约束:如果裂缝宽度w和界面厚度ε之比太小,比如w/ε小于10,界面厚度就开始影响流体受力,模拟结果不可信。我的经验法则是,w最好至少是ε的20到50倍。举个例子,如果ε=0.01 mm,那裂缝宽度至少要0.2到0.5 mm,否则你模拟出来的不是裂缝中的真实流动,而是“界面厚度被挤变形”的假象。
孔隙尺寸也有类似的限制。如果你想在相场里模拟一个孤立小孔中的渗吸,孔直径不能只比网格大3到5倍,那样界面根本没法挤进去。这是很多人在微观模拟里结果异常的原因,界面在窄喉处卡住,不是因为物理上真的被卡住,而是数值分辨率不够。解决方式还是回到上一节说的:小孔隙区域用Darcy等效模型,避免直接相场。
4.3 无量纲参数:怎么设计渗吸模拟实验
做数值实验前,我会先算几个无量纲数,心里大概有个预期,哪些机理占主导。
最核心的是毛细数Ca,等于μu/σ。它表示粘性力与毛管力的比值。渗吸过程中毛管力应该占主导,Ca应该尽量在1e-6到1e-3量级。算一个例子:如果水黏度0.001 Pa·s,入口速度0.005 m/s,表面张力0.072 N/m,那么Ca大约就是7e-5,属于明显的毛管力主导。如果你把入口速度调大到0.5 m/s,Ca变成7e-3,模拟就从“自发渗吸”变成了“粘性驱替”,物理性质完全变了。
雷诺数Re = ρuL/μ也要心里有数。裂缝宽度小、流速低,Re通常远小于1,层流假设完全成立。如果结果里出现非物理的涡旋或振荡,先回头检查Re是不是大到偏离层流范围了。
我建议做一组“接触角-毛细数”双参数扫描。接触角取30、60、90度三个水平,Ca取1e-5、1e-4、1e-3三个水平,一共9组。COMSOL参数化扫描跑完这9组,基本就能摸清这个体系在哪个参数区域以哪种机理为主。这份参数矩阵也是后期写论文或做汇报时的好素材。
5. 典型结果解读与常见问题排查
5.1 应该看到什么样的渗吸现象
模拟跑完拿到结果,我会先看三件事:裂缝中的水是否形成清晰的向前舌形前锋,前锋是否在向两侧基质侧向侵入,界面附近有没有非物理的碎块或“孤岛”。
一个典型结果场景是这样的:亲水裂缝,接触角30度,水由入口进入,初期界面快速沿裂缝推进,同时两侧基质开始出现缓慢的湿润范围。30秒后,裂缝中的水头已经推进了很大一段距离,而基质中的渗吸深度大概只有裂缝推进距离的几分之一,呈现明显的“裂缝优先型”形态。反之,如果基质渗透率高而且强亲水,你会看到裂缝内水推进同时,侧向渗吸深度均匀增长,渗吸深度与时间的平方根成正比,这是典型的“基质控制型”。
除了云图,我强烈建议你把沿裂缝轴线的压力剖面导出来看。如果能观察到两个明显不同的压力梯度区段,说明裂缝段和基质段驱动力来源不同,这份数据对解读机理非常有用。
5.2 我从实操中踩过的5个坑
做相场渗吸模拟真的不是开箱即用。下面这些坑我基本都踩过,有的甚至卡了一整天。
坑1:初始界面设置导致瞬时压力尖峰。初始界面一设置好,如果压力场没有经过初始化,界面附近立刻能看到速度剧烈震荡。解决办法是把初始压力场设成与毛管压力平衡的分布,或者先跑一个极短的“初始瞬态”阶段,把压力尖峰消掉再做正式模拟。这个坑很隐蔽,因为从云图上可能看不出来,但速度场里已经一团乱麻。
坑2:界面厚度ε设得太小导致网格爆炸。我一度追求“足够精细”,把ε设到1e-6这个量级,然后COMSOL自动生成的网格简直像蜘蛛网一样密,模型直接卡得动弹不了。后来老实回到“ε和网格配套”的思路,先跑通再逐步加密,效率高得多。
坑3:迁移率M调大后质量不守恒。如果你在“全局计算”里发现水相体积随时间在减少,大概率是M太大了。相场方法的扩散项如果过强,会让界面扩散速度超过物理速度,水看起来就像凭空消失。解决办法是把M降到默认值的1/5到1/10,重新跑一遍看看体积守恒曲线有没有改善。
坑4:接触角只在润湿壁上生效。很多人设了接触角却看不到壁面效应,仔细检查以后发现物理场里根本没有“润湿壁”边界条件。COMSOL默认壁面是“无滑移、零通量”,它不会自动应用接触角。这个坑我浪费过不少时间,现在每次建模都会专门检查一遍边界条件类型有没有给对。
坑5:Darcy耦合区域出现压力反冲。混合模型里,裂缝水向基质推进时,如果基质渗透率太低,会在交界面产生虚假高压区,甚至导致水流倒流。解决办法是给Darcy区域设置一个合理的毛管压力上限,由基质孔径计算得到,让压力受物理约束。检查的时候可以看交界面上的压力剖面,如果有异常的高压尖峰,就是这个问题。
我做了一个常用的排错速查表:
| 症状 | 可能原因 | 快速排查方法 |
|---|---|---|
| 界面抖动 | 时间步太大或容差太粗 | 减小初始时间步、收紧相对容差 |
| 界面过宽 | ε过大 | 将ε降至网格尺寸的50%左右 |
| 水相体积减少 | M过大 | 将M降一个数量级重算 |
| 壁面接触角无效 | 缺少润湿壁边界 | 检查边界条件类型 |
| 裂缝-基质界面高压 | 基质渗透率过低 | 检查毛管压力上限设置 |
| 计算太慢 | 网格在全局过密 | 只在界面和近缝处细化,其余区域切到粗网格 |
这个表格基本是我日常排错的顺序,多数问题按这个顺序查都能定位出来。
说实话,COMSOL里做相场方法模拟裂缝多孔介质渗吸,真的不是照着教程点一遍就能出结果的事。从参数选取、几何构建到裂缝-基质耦合方式,每一步都要结合具体物理问题去反复试。我自己最深的体会是,别急着追复杂模型,先把单裂缝跑准,搞清楚ε、M、接触角这些参数对结果的影响手感,再去叠加裂缝网络和多孔介质,每一步都留个计算日志,把关键参数和结果特征记录下来。这样不仅复现方便,后面遇到要模拟页岩压裂液返排、煤层气注水驱替这类问题时,这套“从简单到复杂”的路径也能直接迁移,只需要把岩石物性、润湿性和边界条件重新标定一遍就行。最后再分享一个小经验:参数扫描时,把结果按照“饱和度场加压力剖面”的组合导出,比只存云图有用得多,后期的数据分析和机理判断都靠这些定量信息。