我在做华北某区块煤层气排采试验井的模拟时,第一版模型怎么都匹配不上试井数据,后来发现问题不在井筒,而在少算了温度。正是那次经历,让我把煤层气开采里的热流固三场耦合从“听说过”变成了“一条总能对上的逻辑链”。这篇内容就围绕煤层气数值模拟中热流固三场耦合的机理、建模路线、参数取值和踩坑记录展开,适合正在做煤储层模拟、从事非常规天然气开发,或者刚开始接触多物理场耦合方程的工程师。
1. 三场之间到底在“耦合”什么:单场和两场模型为什么不够
1.1 吸附态为主:煤层气与常规气藏的本质差异
常规天然气主要是游离气,储集在孔隙和裂缝里,开采时压降驱动气体流向井筒,流固耦合的影响当然存在,但很多时候可以简化处理。煤层气不一样,绝大多数甲烷以吸附态附着在煤基质微孔内表面,一般占总含气量的80%到95%。想采出这部分气,必须先把压力降下来,让吸附态甲烷解吸成游离气,再经过基质扩散进入裂隙系统,最后通过裂隙渗流到井筒。
这是煤层气开发最核心的逻辑链:排水—降压—解吸—扩散—渗流。链条每个环节都不是孤立的。降压会改变煤储层的有效应力,有效应力变化又让裂隙张闭,进而改变渗透率;压力降低导致甲烷解吸,煤基质收缩,裂隙重新张开;解吸本身是吸热过程,温度场随即变化,温度变化又会反过来影响吸附平衡和煤岩力学性质。单看任何一个场都能说通,但放在一起就说不清了。
所以“热流固三场耦合”不是学术上炫技的提法,而是煤层气开采中实际存在的物理过程。温度场看似温和——储层温度变化往往只有几度——但它参与反馈的方式是持续的,长期排采下影响会累积到不可忽略的程度。
1.2 排采过程中的三重连锁反应
我在实际建模时,会把热流固三场之间的相互作用拆成三条主线去理解。
第一条是流固耦合:排水降压后,储层孔隙压力降低,上覆岩层压力基本不变,煤骨架承受的有效应力增加。煤是裂隙性多孔介质,裂隙对有效应力极其敏感,有效应力一增大,裂隙就被压得更紧,渗透率下降。这在排采初期尤其明显,也是很多低渗煤层气井产量迟迟起不来的原因之一。
第二条是基质收缩:降压到临界解吸压力以下后甲烷开始解吸,煤基质随之收缩,裂隙宽度反而增大,渗透率回升。基质收缩的强弱取决于煤阶和含气量,高煤阶煤的收缩应变可以达到1%左右,低煤阶相对小一些。这个效应与有效应力效应是竞争的,一个让渗透率下降,一个让渗透率上升,最终曲线呈现“U形”或“先降后升”的特征。
第三条是温度反馈:甲烷解吸吸热,井筒周围温度下降;温度降低让煤基质发生热收缩,裂隙再变化;同时低温会增强煤对甲烷的吸附能力,等于给解吸过程“踩了刹车”。如果储层温度较高,吸附能力本来就弱,解吸更容易;一旦局部温度降下来,同一压力下的平衡吸附量反而上升,产气速率会变慢。
这三条线交织在一起,就是标题里“变形记”的含义:煤储层在排采过程中不是静态的骨架,而是随压力、温度、吸附状态不断变形演化的活体。
1.3 “变形记”到底指什么
从力学角度看,煤储层的变形来源至少有三个:有效应力变化引起的压缩变形、温度变化引起的热应变、吸附/解吸引起的基质膨胀或收缩应变。三者同时发生,方向还不一致,所以不能简单线性叠加。
我经常打一个比方:把煤储层想象成一块泡发过的海绵。用力挤它,水被挤出来,海绵变薄——这是有效应力;把海绵放进热环境里,它膨胀——这是热应变;把海绵里原本吸附的某种“溶胀剂”抽走,它收缩——这是吸附应变。煤层气排采就是一边挤压、一边降温、一边抽走吸附质,这三个过程在同一时间轴上进行,海绵最终变成什么样,取决于三者谁占上风。
数值模拟要做的,就是把这三者的竞争关系用方程表达清楚,并在时间步进中保持它们的一致性。这也是后面所有参数设置和求解策略的出发点。
2. 控制方程里的耦合通道:有效应力、孔隙度与渗透率的勾稽关系
2.1 应力场方程中多出来的三个力
煤储层中的应力平衡方程,形式上比普通弹性力学方程多出三个耦合项。
第一个是孔隙压力项。煤体承受的总应力一部分由煤骨架承担,一部分由孔隙流体承担,这就是有效应力原理。用修正的Terzaghi有效应力表达:有效应力等于总应力减去Biot系数与孔隙压力的乘积。Biot系数反映骨架和孔隙的刚度关系,煤的Biot系数一般接近1,但也有不少学者取0.8到0.9,这个参数不能随便设,要结合声波测试结果标定。
第二个是热应力项。温度变化产生热应变,在约束条件下转化为热应力。煤的线膨胀系数大约在1×10⁻⁵到3×10⁻⁵ /K,量级不算大,但在三场耦合里足够影响裂隙开度。排采井周围温度下降几度,产生的热应变虽然小于基质收缩应变,但在中后期也不容忽视。
第三个是吸附应变项。这是煤储层特有的。吸附甲烷时煤基质膨胀,解吸时收缩,常用Langmuir型公式来描述:吸附应变与压力相关,达到极限值ε_l。不同煤阶的ε_l差异很大,低阶煤可能只有0.2%到0.5%,中高阶煤可以达到1%以上。这个参数直接决定基质收缩效应能多大程度抵消有效应力效应。
把这三个项写进本构关系后,应力场方程才真正与渗流场、温度场形成了双向耦合。只保留孔隙压力项的模型,本质上就是常规流固耦合;只有三项全包括,才能算热流固三场耦合。
2.2 渗透率动态模型:P&M与S&D的取舍
流动方程的核心是渗透率如何随生产动态变化。目前业界用得最多的两类经典模型是P&M模型和S&D模型。
P&M模型(Palmer-Mansoori)从裂隙孔隙度出发,认为渗透率变化受有效应力压缩和基质收缩共同控制。裂隙孔隙度满足:
φ_f / φ_f0 = 1 + (c_m / φ_f0)(p - p0) + (ε_l / φ_f0)(K_m / M - 1)[ (b p) / (1 + b p) - (b p0) / (1 + b p0) ]
其中c_m是基质压缩系数,K_m是基质体积模量,M是约束轴向模量,b是Langmuir型压力常数。渗透率假设与孔隙度满足立方关系:
k / k0 = (φ_f / φ_f0)^3
这个模型的优点是物理意义清晰,能直观看到有效应力项和基质收缩项之间的竞争。缺点是它对裂隙几何做了很多简化,参数多,每项都需要实验标定。
S&D模型(Shi-Durucan)走的是另一条路,它认为渗透率与有效应力满足指数关系:
k / k0 = exp[-3 c_f (σ_eff - σ_eff0)]
σ_eff随孔隙压力和基质收缩变化,所以同样能模拟出渗透率先降后升。这个模型更贴合裂隙应力敏感强的储层,但参数c_f(裂隙压缩系数)和后期的渗透率回升幅度绑定在大,需要谨慎。
我的做法是:粗算阶段用P&M模型,因为它对细观机理交代得清楚;历史拟合阶段换S&D模型或者把两套模型都跑一遍,用现场产量数据倒逼参数。没有哪个模型是普适的,关键看你手里的数据能标定到哪一层。
2.3 温度场不是陪跑:热源项与解吸吸热的量级估算
温度场方程相对直接:多孔介质的等效热容乘温度变化率,加上流体的热对流项,减去有效导热系数控制的扩散项,等于源汇项。麻烦的是源汇项的种类和量级。
煤层气温度场的主要源汇有三个。
一是解吸吸热。甲烷从煤表面解吸要吸收热量,这个热量大约在15到25 kJ/mol之间,我一般取18 kJ/mol做初步估算。18 kJ/mol换算成单位质量大约是1.1 MJ/kg甲烷。假设1吨煤含气量25 m³(标准状态下约17.9 kg甲烷),完全解吸需要吸收热量约20 MJ。煤的比热容大约在1到1.5 kJ/(kg·K),单算煤体绝热温降可以超过10℃。当然实际排采中有水流和地层热补给,温度不会降这么夸张,但井周区域降温3到5℃是常见的模拟结果。这就足以影响吸附平衡和热应力了。
二是焦耳-汤姆逊效应。甲烷在降压膨胀过程中温度会降低,在地面管网里这种现象非常明显,储层内同样存在。甲烷的焦汤系数在储层温压条件下大约0.4到0.5 K/MPa,一口井从原始压力降到井底流压,压降好几兆帕,气体膨胀降温贡献1到2℃并不奇怪。
三是粘性耗散。流体在裂隙中流动时摩擦生热,这个量级通常很小,在常规排采模拟中我一般忽略,只有在注热增产或压裂液返排这类注入工况下才把它放回去。
温度场的源项处理,直接决定了温度模拟结果是否可信。我在第一次做三场耦合时,把解吸热写成了常数源,结果温度场出现明显漂移;后来调整成与解吸速率联动的形式,整个能量守恒才闭合。这是数值实现里最容易忽略、也最容易出错的地方。
3. 从地质参数到可收敛模型:热流固三场耦合的建模流程
3.1 几何建模与网格:井筒附近加密的尺度控制
我做概念模型时,通常建一个500m×500m范围、储层厚6m的单井模型,模拟区域太大网格数量会失控,太小又体现不了远井区的补给效应。网格划分时,井筒附近必须加密,因为压降漏斗、温度降和应力集中都集中在这个区域。
网格加密的经验是:井筒径向从内向外按等比数列扩张,相邻网格尺寸比控制在1.1到1.2之间。这样做的好处是既保证井壁附近几十厘米到几米范围内的分辨率,又不让远井区的网格数量爆炸。如果网格尺寸从井壁的0.5m直接跳到煤储层边界的50m,相邻网格体积差太大,有限元插值误差会成倍放大,求解器很容易振荡。
单元类型上也有讲究。煤岩泊松比往往在0.3以上,有些情况下接近0.4,接近不可压缩。使用一阶线性单元做力学计算可能会出现体积自锁,应力结果失真。我一般对力学场采用二阶单元,或者采用混合单元方案,流体压力用低阶插值,位移用高阶插值,这种搭配能显著改善收敛性。
另外,如果模型中包含人工裂缝,裂缝周围的网格还要再加密一个级别。但第一版模型我不建议急着把裂缝细节放进去,先把热流固三条反馈跑通,确认边界和参数都没问题,再加裂缝,否则出了数值问题很难定位是裂缝网格引起的还是耦合算法引起的。
3.2 耦合求解策略:全耦合与顺序耦合的组合用法
三场耦合的数值实现,本质上是如何组织三个物理场的求解顺序。主要有两条路线。
全耦合(monolithic)是把位移、压力、温度、饱和度等所有未知量放进同一个非线性方程组,一起Newton迭代求解。优点是物理一致性最好,每一步得到的都是三场同时平衡的解;缺点是矩阵规模大、内存消耗高,而且非线性强时收敛窗口很窄,网格稍微差一点就容易发散。
顺序耦合(staggered/operator splitting)是先解某个场,再用结果去更新其他场,循环迭代直到收敛。优点是灵活、省内存,可以复用成熟的单场求解器;缺点是如果时间步长取得很大,场与场之间的信息交换存在滞后,可能引入数值误差。
我在实际项目中用组合方案:流固两场采用全耦合,因为它们之间的反馈最快、最强;温度场用顺序耦合接入,在每一个时间步内先算流固场,再算温度场,更新吸附参数和温度应变后回头迭代。这样既保证了最关键的流固反馈不脱节,又避免了把温度场强行拉进全局矩阵带来的收敛压力。
时间步长的控制也直接影响成功与否。排采初期压降传播快,解吸尚未大规模启动,时间步需要压得很小,我一般从0.01天开始;进入平稳排采期后逐步放大到0.5天甚至1天。自适应时间步长功能要打开,当某一步Newton迭代不收敛时自动减半重算,这是最实用的兜底策略。
3.3 边界条件与初始场:不能凭感觉给的开采参数
边界条件看起来简单,实际是错误高发区。
力学边界方面,模型顶部施加上覆岩层自重对应的垂向应力,侧向根据侧压系数取0.8到1.2倍垂向应力,底部固定垂向位移。如果模型直接从地表建起,顶部直接加自由面边界;如果是箱体截断模型,顶部应力值必须按实际埋深计算,不能随便给一个数。我见过不少模型,上覆应力取少了,导致有效应力偏低,模拟出来的渗透率一直上去,产气量虚高。
渗流边界方面,外边界采用定压条件,数值取原始储层压力;井底采用排采制度控制,最常用的是定井底流压或定产水量。排采制度要写成时间函数,比如前90天以每5天降0.2 MPa的速度从原始压力降到4 MPa,而不是一步到位。实际工程中为了控制煤粉产出和裂隙闭合,降压速率比这更慢,模拟时也应当对应。
温度边界方面,外边界取地层原始温度;井底不能简单定温,更合理的是对流换热边界,让流体与井壁之间按换热系数交换热量。忽略这一点,井周温度会被定得过低或过高,三场耦合的效果就被歪曲了。
初始场设定最关键的是初始有效应力平衡。给定了孔隙压力场和重力载荷后,初始位移必须由静力平衡方程解出来,不能直接置零。否则模型一开始就处于不平衡状态,会“假变形”,这个变形量会叠加在排采引起的变形上,导致渗透率演化曲线失真。初始含水饱和度也不能随便给,要与储层深度、相渗曲线端点匹配,否则气水两相渗流在头几个时间步内剧烈振荡。
4. 360天排采模拟:渗透率、井周温度与产气曲线的联动
4.1 典型储层参数与排采制度设计
为了让内容具体,我放一组典型华北中高阶煤储层参数,这套参数来自我做过的一个概念模型,用来研究三场耦合对产能预测的影响:
| 参数 | 取值 | 备注 |
|---|---|---|
| 埋深 | 800 m | 中深部煤层 |
| 储层压力 | 8 MPa | 近似静水压力 |
| 储层温度 | 35℃ | 地温梯度约2.5℃/100m |
| 煤岩弹性模量 | 3.2 GPa | 煤岩常见范围2~5 GPa |
| 泊松比 | 0.35 | 中高阶煤典型值 |
| 初始裂隙孔隙度 | 0.04 | 裂隙孔隙度远小于基质孔隙度 |
| 初始渗透率 | 0.5 mD | 低渗储层典型值 |
| Langmuir压力 | 2.5 MPa | 等温吸附实验拟合 |
| Langmuir体积 | 25 m³/t | 对应含气量中高 |
| 最大基质收缩应变 | 0.01 | 中高阶煤偏大 |
| 煤体导热系数 | 0.3 W/(m·K) | 干煤偏低,饱和水后更高 |
| 解吸热 | 18 kJ/mol | 换算约1.1 MJ/kg甲烷 |
排采制度按阶梯降压设计:第1到30天井底流压从8 MPa降到6 MPa,第30到90天降到4 MPa,第90到360天再缓慢降到2 MPa。全程控制压降速率,避免有效应力骤增对裂隙造成不可逆伤害。
4.2 渗透率“先降后升”的经典演化路径
这套参数下的模拟结果很有代表性。前30天,井周有效应力迅速增加,裂隙被压缩,渗透率从0.5 mD下降,最低会到0.32 mD左右,降幅接近40%。这个阶段对应井筒附近压降漏斗的快速扩张,煤基质收缩还没有充分启动,有效应力效应完全占主导。
进入第90天后,储层压力进一步降到临界解吸压力以下,甲烷解吸范围扩大,基质收缩逐渐成为渗透率的主导因素。渗透率开始回升,到第200天左右恢复到初始值,第360天可以达到0.75 mD左右。整条曲线呈现明显的“U形”或“先降后升”形态。
这个形态对现场的意义很大。如果只做流固耦合、不考虑基质收缩,渗透率会随有效应力持续下降,模拟出来的产气量会明显偏低;但如果只强调基质收缩,前期渗透率下降被弱化,又会高估早期产量。三场耦合里的“热”在这里的作用是调节基质收缩的启动速度——温度降低抑制解吸,基质收缩来得比纯两场模型更慢、更平缓。所以三场耦合预测的渗透率回升点会比两场模型晚一点,最终稳态渗透率也低一些。
4.3 井周温度降对产气峰值的“刹车”作用
温度模拟结果显示,井筒周围50m范围内降温最明显,模拟360天时井壁附近温度比初始值低3.5℃左右。这个降温由解吸吸热主导,辅以气体膨胀的焦汤效应。离井筒越远,温度降越小,100m处只有零点几度,因为地层热传导和流体热对流在持续补充热量。
温度降的反馈体现在吸附平衡上。甲烷吸附是放热过程,温度降低会增强煤对甲烷的吸附能力。我用温度修正后的Langmuir参数重算,发现每降低1℃,相同压力下的平衡吸附量大约增加2%到3%。井周温度降低3.5℃,相当于在局部给了解吸过程一个明显的反向阻力。
对比试验更有说服力:同一套参数下,忽略温度场仅做流固耦合时,第250天左右达到产气峰值,峰值日产气约3200 m³/d;考虑完整热流固三场耦合后,峰值时间推迟到第270天附近,峰值降到2800 m³/d左右,降幅约12%。长期累计产气量也有约8%的差距。这个结果表明,温度效应虽然“温和”,但对产能预测的修正量完全在工程决策需要考虑的范围之内。
5. 收敛性、单位制与实际校准:不跑一遍不会知道的坑
5.1 数值不收敛时的四个调优旋钮
三场耦合模型出数值问题是常态,不收敛的原因千奇百怪,但我排下来发现80%集中在四个方面。
第一个是网格尺寸跳跃。相邻单元尺寸比超过3,局部插值误差就会显性化,表现为压力或温度场出现“棋盘式振荡”。解决办法很简单,网格过渡区域多设两层过渡单元,让尺寸连续变化。
第二个是初始时间步长过大。排采刚开始时井底压力突变,非线性方程组需要很小的步长才能找到平衡。把初始步长压到0.01天,前几个步长跑稳定后再逐步放大,能解决大部分“第一步就发散”的问题。
第三个是物性参数剧烈跳变。比如渗透率模型里基质收缩参数取太大,渗透率在解吸启动瞬间从一个量级跳到另一个量级,方程刚度剧增。我的处理是把基质收缩参数的敏感性分开测试,先不激活温度场,单独看渗透率曲线是否连续,如果不连续就是参数范围不合理。
第四个是强非线性材料的单元退化。当煤岩接近不可压缩时,线性单元可能出现体积自锁,表现为位移场严重振荡。升级为二阶单元或者混合单元后,这个问题基本消失。如果求解器不支持混合单元,也可以把泊松比稍微调低一档做试探,但这样会牺牲物理精度,只适合排查。
5.2 单位制与吸附/热参数的一致性检查
单位制混乱是三场耦合里最隐蔽的坑。有限元软件本身没有单位概念,它只认数值大小。同一个方程里,压力用Pa还是MPa、渗透率用m²还是mD、时间用秒还是天,如果混用,矩阵条件数会差好几个数量级,结果自然一塌糊涂。
我习惯统一采用SI基本单位:长度m、时间s、质量kg、温度K、压力Pa、渗透率m²。煤层气行业常用的mD和MPa需要换算:1 mD约等于9.869×10⁻¹⁶ m²,工程上粗略记为10⁻¹⁵ m²;1 MPa是10⁶ Pa。吸附参数也要同步转换:Langmuir压力2.5 MPa在SI里是2.5×10⁶ Pa;Langmuir体积25 m³/t,换成kg/kg需要乘以甲烷密度0.717 kg/m³再除以1000。
最容易出问题的是解吸热和吸附量的单位配套。如果解吸热用J/mol,而吸附量用m³/t,两者不在一个计量体系,能量源项就会差一个数量级。我在第一个三场模型里就栽过这个跟头,温度场整体偏低十几度,折腾了两天才发现是解吸热单位换算少了分子量这一步。后来我把所有涉及能量的物理量全部转换成“J/kg甲烷”,吸附量也换算成“kg甲烷/kg煤”,模型才稳定下来。
另外,气体性质不能当常数处理。甲烷压缩因子随着压力下降明显偏离1,尤其在低压阶段,如果不做修正,产气量会被高估。我倾向于在模型中加入气体偏差因子与压力的关联式,或者在每个时间步用闪蒸计算更新气体密度,这样产气曲线更贴近现场。
5.3 用试井和产气数据反推模型参数
参数再精确,模拟结果也必须经过现场数据校准,这是整个流程的最后一道关。
我的校准顺序是:先用试井压降数据反演初始渗透率,因为排采初期的压力传播速度对渗透率最敏感;再用压力恢复曲线约束裂隙压缩系数,这段数据能反映渗透率随有效应力变化的敏感程度;然后用产气曲线的峰值和峰期位置匹配Langmuir参数和解吸热,最后才轮到热物性参数。
实际操作中,我很少追求所有参数一步到位。先固定力学参数,手调渗透率;渗透率对上了,再放开吸附参数;吸附参数跑通了,最后才动温度相关参数。这种逐层开放的策略,能避免多参数同时调整导致的“参数补偿效应”——两个错误参数互相掩盖问题,表面拟合很好,但模型一点预测能力都没有。
我在做历史拟合时,以现场月产气量为目标,要求模拟结果与实测误差控制在15%以内,同时井底压力的下降趋势也要基本吻合。如果产气对但压力不对,说明渗透率参数可能错了;如果压力对但产气不对,多半是吸附参数或解吸热的设置有问题。这种交叉验证比单纯对一条曲线要可靠得多。
最后说几个跑完这个项目后的个人习惯。我拿到一个新模型,一定会先做“温度场关闭/开启”的对比试验,如果温度对结果影响小于2%,说明储层温度系统本身就不敏感,可以简化处理;一旦超过5%,热流固三场耦合就没得商量,必须做。还有个小心得是,每次调整参数后都把渗透率、温度和产气量三条曲线存一份快照,跑完几十组工况后回看这些快照,很容易发现参数之间的弱关联规律。三场耦合的计算量确实比两场耦合大不少,但这些前期工作做扎实了,后期反而更省时间。