1. 开篇:这个模型到底在算什么
上周四晚上两点十七分,我盯着屏幕上终于不再报错的迭代日志,狠狠松了一口气。为了这个水合物开采模型,我整整调了一周,期间换了三版初始条件、重剖了两套网格、翻了十几篇文献对比相对渗透率参数,中间无数次想摔键盘,但最终看到产气曲线平稳上升的那一刻,觉得前面熬的夜都值了。
先把话说清楚,经常有朋友问我,水合物开采模型到底在算什么?简单说,天然气水合物(我们俗称“可燃冰”)是在低温高压条件下、由甲烷分子与水分子形成的笼状固体,藏在海底沉积层或冻土区。开采的核心逻辑就是打破它的稳定条件——降压、注热、注抑制剂或者CO2置换——让水合物分解成甲烷气体和水,再把气体采出来。而数值模型要做的,就是把这套“分解-流动-传热-力学变化”的耦合过程在计算机里复现出来,回答诸如:以某口井降压生产二十年能产多少气、压力波传播多快、会不会二次生成水合物堵井、地层沉降多少等工程问题。
这套模型之所以难跑通,是因为它不像普通的油藏模拟那样只求解流动方程。它要同时处理多相(气、水、水合物)、多组分(甲烷、水、可能还有抑制剂)、相变(水合物分解与生成)、热量传递(水合物分解是强烈吸热反应,会造成局部降温甚至重新冻住),再加上随时间变化的渗透率和孔隙度——水合物一旦分解,固体占据空间减少,渗流通道会发生变化,这又反过来影响压力场。这些物理过程高度耦合,数值求解的时候稍不留神就是不收敛或者结果发散。
这篇博文我不打算写成教程,更像是一份踩坑记录。我把自己从建模、调参到跑通全过程的经验整理出来,包括走了哪些弯路、哪个参数是最容易坑人的、怎么判断模拟结果靠不靠谱。如果你也在折腾水合物开采的数值模拟,或者打算用TOUGH+HYDRATE这类工具做类似课题,这篇文章应该能帮你省下不少时间。
2. 建模前的关键决策:选工具、定物理模型
2.1 工具选型:为什么我选了TOUGH+HYDRATE
目前做水合物开采数值模拟,主流选择无非三四条路:TOUGH+HYDRATE(劳伦斯伯克利国家实验室开发的专门模块)、CMG STARS、HydrateResSim,以及完全自编程。
我这次用的是TOUGH+HYDRATE(T+H),这个选择不是随手定的。先说结论:如果你想做科研发论文,或者工程预研需要可靠的相平衡模型,T+H基本是行业标配;如果你更偏向商业项目或者需要跟地质力学模拟器耦合做沉降分析,那CMG STARS和FLAC3D联合会更顺手。
T+H最核心的优势在于它对水合物相平衡处理得非常细。它内置了三种水合物动力学模型(Kim-Bishnoi、Clarke-Bishnoi以及基于平动模型的简化版),同时支持平衡模型和动力学模型两种模式切换。在做降压开采模拟时,压力降到相平衡曲线以下水合物就分解,这个过程的计算精度直接决定产气曲线的形态。CMG STARS当然也能做,但它在水合物分解动力学方面的默认参数体系更偏向重油热采场景,你需要做大量的二次开发才能匹配水合物实验数据。
我这么说可能有点抽象,打个比方:T+H像是为水合物这个“特殊病灶”定向开发的手术刀,而STARS更像一把通用手术刀,技术上什么都能做,但术业有专攻。T+H的另一个优点是开源、有大量文献的模型验证案例可参照,我遇到的绝大多数报错都能在官方论坛或者论文里找到线索。
2.2 储层物性参数怎么定
建模最折磨人的不是软件操作,而是给模型填参数。这些参数直接决定了模拟结果靠不靠谱。我这次模拟的是一个理想化的II类水合物藏——上层是水合物稳定带,下层是自由气层,这种构造在自然界中相当常见,也是目前降压开采研究最集中的类型。
储层的核心参数包括:
- 孔隙度(porosity):我取0.30到0.35之间。这个值不是瞎定的,是根据实际钻探岩心的测井解释结果取的中值。孔隙度会随着水合物分解而增加“有效孔隙”,但T+H里默认孔隙度是常数,需不需要做动态修正是个关键选择——我第一版跑不收敛,部分原因就在这。
- 绝对渗透率(absolute permeability):取50 mD到100 mD量级。注意,模型中真正参与流动计算的是有效渗透率,它等于绝对渗透率乘以相对渗透率,再乘一个水合物饱和度相关的折减系数(通常是指数形式,比如T+H默认的渗透率下降指数n=3到4)。
- 初始水合物饱和度:我取的是40%到50%。这直接影响水合物分解后的产气潜力。饱和度越高,分解后产气越多,但初始有效渗透率也更低,压降传播更慢。
- 初始温度与压力:这是最需要谨慎的参数。我设定海底温度为4.5摄氏度左右,静压按海水深度加地层深度换算——大概每下降10米增加0.1 MPa。边界处要落在水合物相平衡曲线下方的自由气区。
这些参数并不是独立变量,它们之间的耦合关系非常强。最典型的是水合物饱和度与渗透率之间的关系——饱和度高,气体能流动的通道就少,降压开采的压力波传播就慢,分解效率自然降低。有同行做过统计,在渗透率50 mD、水合物饱和度50%的储层中,降压开采的累计产气量可能只有高渗透率(200 mD)、低饱和度(30%)情形下的五分之一。所以,建模前先把目标储层的岩心物性搞清楚,比什么都重要。
2.3 网格设计与初始平衡
我第一版模型网格用的是均匀粗网格,径向30个网格、纵向10层,总网格量只有300个。当时觉得量小跑得快,结果初始平衡阶段就崩了。
这里就涉及一个新手很容易忽略的问题:水合物模型不是随便给个初始压力场就能跑的。因为水合物只在特定温压条件下稳定存在,你给它一个处在相平衡曲线边界附近的初始状态,计算一开始就会发生大规模的水合物分解或生成,导致压力和饱和度剧烈震荡。正确做法是让模型先跑一个“稳场”阶段——固定边界条件,让内部压力和温度场达到与给定水合物饱和度分布自洽的平衡状态,然后再开启开采井。
这个过程有点像让一个新团队先磨合流程,再开始干活。你直接扔进战斗状态,必然出乱子。初始平衡阶段我建议至少跑5到10个模拟年(虚拟时间),观测压力和温度不再变化了,再进入生产阶段。
网格设计上,我最后采用的是径向非均匀网格:井筒附近0.1米加密到0.05米,向外逐渐放大到5米、10米。纵向则在含水合物层段加密,上下盖层用相对粗的网格。总网格数控制在1500左右,单步计算时间在十几秒到一分钟之间,整体不至于等得太痛苦。
3. 调试过程踩过的坑:从报错到跑通的完整记录
3.1 第一道坎:初始平衡状态怎么都坐不住
第一版模型启动后,我满怀期待地看着迭代窗口刷新,然后不到两分钟就收到了第一个报错:非线性迭代次数超过上限(iterations exceeded maximum number)。这个报错在T+H里太经典了,基本等于告诉你——你的初始压力场或者饱和度场不符合物理规律,程序在努力寻找一个解但找不到。
排查顺序我是这样做的。第一步检查初始条件是否满足相平衡约束。按照T+H手册,初始化的关键是让模型的压力-温度分布落在水合物相平衡曲线的适当位置:水合物稳定带内应当位于相平衡曲线的低温高压侧,自由气层应当位于高温低压侧。我当时把整个储层的压力按静水梯度线性赋值,温度按地温梯度赋值,但忽略了水合物稳定带底部界面处的相平衡跨越——结果在那个界面附近出现了一整排网格的水合物饱和度突变,数值求解器自然就疯了。
后来我改成了“分段赋值”:水合物稳定带内按静水压力计算,但温度场在界面附近做平滑过渡;自由气层压力单独处理,确保界面两侧的压力-温度点分别落在相平衡曲线的正确一侧。改完这版,初始平衡阶段总算能跑下去了。
3.2 第二道坎:降压开采导致压力场波动崩溃
初始平衡搞定后,我满心以为接下来能一路顺风,结果很快被现实暴击。开启生产井模拟后,第一个时间步就出现严重的压力震荡,局部网格压力在几步迭代内从10 MPa跳到了0.5 MPa甚至出现负压,然后求解器直接发散。
这个问题折磨了我整整两天。后来冷静下来分析,核心原因有两个。
第一个是井筒处理方式。T+H里模拟生产井通常是用网格内汇(sink)来实现,你需要给定井底流压(BHP)或者产率。我一开始用的是“固定产率”模式——指定产气速率,然后让压力自动响应。但问题在于,初始阶段水合物还没有大规模分解,气体来源有限,产率设置过高会逼迫压力急剧下降,直接冲出相平衡稳定区。这就好比你在一个水池子里只开一个很小的入水口,却用一个大功率水泵往外抽水,抽着抽着池子就吸瘪了。
解决办法有两条路可选:一是改用固定BHP模式,让井底压力逐步降低(比如每模拟一个月降低0.2 MPa),用“压力滑降”来模拟工程上逐步调节井底流压的操作;二是用固定产率但加上限保护。我最终选择了固定BHP配合阶梯降压,这样更符合实际工程操作,数值稳定性也远好于暴力降压。
第二个原因是时间步长。T+H的自适应时间步长在遇到剧烈变化时会自动缩小,但有时候缩得不够快,等求解器反应过来时震荡已经扩散了。我手动限定了最大时间步长——生产初期限制在1e-4天(约8.6秒),等压力波传播稳定后再逐步放开到0.1天。这个操作看起来损失了计算速度,但实际省了更多反复调试的时间。
3.3 第三道坎:计算时间爆炸
度过了发散危机后,新的挑战是计算速度。随着水合物分解前沿逐步推进,每个时间步需要求解的非线性方程越来越多,计算时间开始指数级增长。到了模拟时间的第200天(计算尺度上),一个时间步要算将近三分钟,而预计总模拟时长是五年。照这个速度,六天六夜都跑不完。
这里我做了三个方面的优化,效果非常显著。
第一是网格粗化。把纵向的盖层网格从原来的20层减少到6层,因为盖层没有流体流动和相变,粗网格完全不影响精度;同时在远离井筒的外围区域增大径向网格间距。这样总网格数从1500降到了800多,计算量下降了将近一半。
第二是调整线性求解器参数。T+H底层用的是EOS模块加非线性求解器,其中线性方程组求解的容差设定值得关注。默认容差往往偏保守,我调到了1e-5而不是默认的1e-6,精度损失几乎可以忽略,但每次迭代时间明显缩短。
第三是物理建模的合理简化。把动力学模型改成平衡模型——T+H支持在满足一定条件时用局部平衡代替水合物分解动力学。因为在我们研究的降压开采场景中,分解速率足够快,平衡模型与实际动力学模型的误差很小。这一改动让单步计算时间从三分钟降到了二十秒以内,直接能跑了。
3.4 最终跑通的参数组合
我把最终成功跑通的参数组合整理成了一张表,给大家做个参考。注意,这只是一个针对理想化II类水合物藏的示例参数,实际研究还是要根据你的目标储层做校核,千万别照抄。
| 参数 | 数值 | 说明 |
|---|---|---|
| 储层顶深 | 1000 m | 假设海水深度约900 m,地层厚100 m |
| 孔隙度 | 0.33 | 取岩心测井中值 |
| 绝对渗透率 | 80 mD | 水平向与垂向一致,未做各向异性 |
| 初始水合物饱和度 | 45% | 水合物稳定带内平均值 |
| 初始温度(储层中部) | 12 ℃ | 按地温梯度计算 |
| 初始压力(储层中部) | 10.5 MPa | 静水压力 |
| 初始气饱和度(自由气层) | 20% | 低于临界流动饱和度 |
| 相对渗透率模型 | Van Genuchten-Mualem | T+H内置选项 |
| 水合物分解模型 | 平衡模型 | 简化后的版本 |
| 生产井井底流压 | 6 MPa,分三步降低 | 每步降低约1.5 MPa |
| 生产时长 | 5年 | 模拟虚拟时间 |
| 网格数量 | 860 | 径向非均匀,纵向分层 |
这套参数从建模角度来看是物理上自洽的,从计算角度也留了足够的稳定裕度。跑通之后我看到的产气曲线符合降压开采的典型特征——初期产气量因为自由气层的气体采出出现一个高峰,随后下降到水合物分解驱动产气的平台期,最后缓慢递减。
4. 跑通之后:结果分析与模型验证
4.1 产气产水曲线怎么看
模型跑通之后,最直接的产出就是产气量、产水量、累计产气量这些随时间的曲线。但曲线出来了,不等于你就能直接写报告了。关键是怎么解读这些曲线的形态特征。
我这次模拟得到的气水比曲线变化非常典型。前30天产气量很高但主要由自由气贡献——这部分气原本就是游离态的,降压后立刻涌入井筒。从第30天到第300天,产气量快速下滑,然后进入一个相对平稳的平台,这个平台期就是水合物分解驱动的产气,它的高度和持续时间取决于降压强度与水合物分解吸热之间的平衡。如果平台期下滑太快,往往说明井底附近的温度因为水合物分解吸热而降到冰点附近,导致二次水合物生成、堵塞渗流通道。
再看产水量。水合物分解会释放大量水,所以产水量通常由两部分构成:储层原始自由水 + 水合物分解水。如果产水突然上升而产气骤降,要警惕“水锁效应”——分解产生的水在井筒附近形成高含水区,气相相对渗透率骤降,气体采出困难。这在低渗透储层里尤其严重。
我一般拿到曲线后会做三个快速判断:其一,累计产气量的增长趋势是否接近对数型或指数型,有没有出现长期平台停滞;其二,井底附近的水合物饱和度分布是否随时间均匀消耗,有没有局部聚集;其三,温度场是否维持在相平衡边界之上,如果局部温度降到平衡温度以下,二次水合物生成的几率很高。这些判断能帮你快速发现模拟中是否存在异常物理过程,而不是一上来就盯着产气峰值看。
4.2 模型敏感性分析
跑通一遍之后,我强烈建议你做一轮敏感性分析。说白了就是逐个改变关键参数,观察模拟结果怎么变,找到哪些参数对产气曲线影响最大。这个过程大有用处——一是验证模型是否对某一参数过度敏感(如果稍微改一点结果就天翻地覆,说明模型自身有问题),二是判断工程上最值得优先优化的方向。
我选了四个参数做敏感性扫描:绝对渗透率(50/80/120 mD三档)、初始水合物饱和度(35%/45%/55%三档)、井底流压(5/6/7 MPa三档)、储层厚度(60/80/100 m三档)。
最终结论符合预期但也有意外收获:渗透率的影响最显著——渗透率从50 mD提高到120 mD,累计产气量提升了近140%;而初始水合物饱和度的影响没有想象中大,因为饱和度高虽然可分解的资源量更大,但初始流动能力更差,两者互相抵消。这个结果提示,在实际工程选址中,高渗透率储层比高饱和度储层更重要。
敏感性分析还能顺带检验网格无关性。我会把关键工况在粗网格和加密网格上各跑一遍,如果产气曲线差异在3%以内,就说明当前网格精度够用。这一步在审稿或汇报时经常被问到,提前做了有备无患。
4.3 结果反哺试验设计
数值模拟跑通了,最终目的是指导实验或者现场方案设计,而不是停留在纸面上。
我用模拟结果做了三件事。第一,确定了降压速率的安全上限。模拟显示,井底流压的降低速率如果超过每模拟月0.5 MPa,近井地带会快速降温,造成局部二次水合物生成。据此建议试验井采用分段降压策略,每级压降之间留足“恢复期”。
第二,估算了合理的井距。通过观测压力波在水平方向上的传播范围,发现五年内有效影响半径大约在150米左右。这意味着相邻生产井的井距不宜小于300米,否则井间干扰会非常明显。
第三,给出了排水量的预测范围。模拟预测五年累计产水量约为产气量对应生成水的一半左右,这部分水的地面处理设施需要提前规划容量。这些信息对实验方案设计、经济性评估都有直接参考价值。
5. 常见问题速查与调试建议
5.1 典型报错与对策速查表
我把这几周遇到的典型问题和排查方法整理成了表格,方便大家遇到类似情况时快速定位。
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 非线性迭代次数超限 | 初始条件不满足相平衡约束、时间步过小、BHP设置过激 | 检查初场温压与相平衡曲线的相对位置;启用阶梯降压;限制最大时间步 |
| 计算发散(出现负压力和负饱和度) | 井产率过高、流动参数异常、网格质量差 | 改用固定BHP模式;检查相对渗透率函数在端点处的光滑性;检查网格正交性 |
| 水合物饱和度异常增加 | 温度场冷却导致二次水合物生成 | 检查能量方程是否收敛;限制热边界热流;延长降压间隔 |
| 计算时间过长 | 网格过密、动力学模型计算代价高、求解器容差过小 | 粗化盖层;改用平衡模型;放宽线性求解器容差 |
| 产气量出现锯齿波动 | 时间步长反复调整导致数值噪声 | 稳定时间步长上下限,避免频繁跳动 |
| 储层压力平白下降过多 | 边界条件设置错误、外围补给区域未定义 | 确认模型外边界是封闭还是定压边界,径向模型要设定足够大的外围区域 |
关于最后一条多说一句,很多新手在做径向模型时会忽略外边界的影响。如果外边界离井筒太近,相当于人为制造了一个封闭储层,储层压力会因采出而无补给地持续下降,导致产气曲线很快衰减。我把外边界设到1000米、并给定压边界条件后,结果才合理。这个细节值得重点关注。
5.2 调试效率的几条实操建议
挨个分享几条我这次调试中总结的效率技巧,每一招都是踩过坑之后才学会的。
第一,版本管理一定要做。我给每一版模型文件都加上日期和备注,比如model_0321_coarse_grid_ini_fix。调试水合物模型是个反复试错的过程,改来改去很容易忘了哪一版改了什么、哪一版是最接近跑通的。没有版本管理,等于把自己推向绝望。
第二,先跑小模型再扩大。如果最终目标是三维三维模型,先用一个简单的二维径向小模型做物理验证。我这次就是先在100个网格的小模型上确认了参数设置没问题,才加到800多网格跑生产工况。直接用大模型调试,一次计算几小时,你怎么快速迭代?
第三,充分利用重启动功能。每次跑通一个稳定阶段,马上保存重启动文件。后面如果发生了发散,不需要从头再来——从最近一个稳定状态重启动,调整相应参数即可。这个习惯至少帮我省了三分之一的时间。
第四,记录每一次修改与响应的映射关系。我专门有个调试日志,记录每次修改了什么、跑的结果如何。不要高估自己的记忆力——在连续调了几天之后,你根本记不清某个参数是从哪一版开始改的。
第五,遇到解决不了的问题,先去看看官方案例和文献的输入文件。T+H官方发布了很多验证算例的输入文件,找一个储层条件和你类似的案例,对比它的参数取值思路,很多问题迎刃而解。很多报错不是你物理上想错了,而是软件本身的参数范围限制你没摸清。
6. 关于“模型跑通”这件事的一点个人体会
最后聊点软件之外的感受。
跑通一个水合物开采模型,技术上固然有价值,但我觉得更值钱的是建立了一套判断“结果是否靠谱”的直觉。数值模型这个东西非常容易“貌似合理”——它给你画出一条光滑的产气曲线、一个漂亮的压力云图,看着像那么回事,你可能就会天然地对结果产生信任。但它背后的物理假设、边界条件、参数简化,每一个环节都可能偏离实际。
我的做法是,拿模拟结果和已发表的同类实验数据做对比。哪怕是不同储层的开采实验,只要量级接近,就能帮我们建立对结果的敏感度。比如,如果模拟的初始日产气量比我查到的现场数据高出一个数量级,那我很可能哪里搞错了。这种外部校验的习惯,比把模型调到自己满意重要得多。
至于“跑通”这个词本身,我也越来越觉得它是个相对概念。模型能跑出曲线只是第一步,曲线背后的物理过程能不能解释清楚、参数敏感性能否经得起推敲,这才是后面更深的功夫。我这一版也只是在平衡模型和简化地质模型下成立,真要放到实际井位做定量预测,还需要更多地质约束和实验数据。
给正在跑类似模型的朋友一个最实在的建议:别怕报错,报错是模型在告诉你它哪里不“物理”。把每一次发散、每一个异常值当作线索去追,你会比跑通的人更快理解这套模型。我这一版跑通也只是一轮迭代的起点,接下来还会加注热方案对比、井距优化这些工况。折腾水合物模型的过程确实熬人,但屏幕上产气曲线出来的那一刻,一切辛苦都值了。