ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于Comsol的煤层气抽采流固耦合模拟方法与工程实践

基于Comsol的煤层气抽采流固耦合模拟方法与工程实践 1. 煤层气抽采为什么要做流固耦合模拟1.1 现场最头疼的问题气路为什么越抽越堵煤层气抽采这活儿干久了你会发现真正难的不是把井打下去而是怎么维持住储层里那条“气路”不堵。过去在现场我们调抽采参数基本靠经验井间距大了气抽不出来井间距小了井间干扰又上来成本还翻倍。最难解释的是有些井刚开始产气很猛没过几个月压力降不下去气量直线掉洗井、增压、换抽采制度都试了效果还是不明显。后来转用 Comsol 做流固耦合模拟才把“煤层变形—裂隙开闭—渗透率变化—气体流动”这条链路的因果关系搬到电脑屏幕上。为什么说耦合很关键因为抽采过程不是单纯的流体问题它同时伴随着强烈的力效应井筒附近压降漏斗越拉越大有效应力不断升高煤体被压密裂隙闭合渗透率掉得厉害。反过来甲烷从煤基质表面解吸之后基质体积收缩裂隙又会重新打开一点。这两个方向相反的作用在同时竞争谁占上风直接决定产气曲线长什么样。1.2 流固耦合模拟到底能回答哪些工程问题先说清楚Comsol 里的“流固耦合”不是把固体力学模块和流体模块简单地堆在一起而是要把煤层内部的应力状态、孔隙压力变化、渗透率演化这三者之间的双向反馈完整地描述出来。我用下来觉得这套模拟能有针对性地回答下面几类问题单井控制半径能有多大极限压降能到多少抽采负压应该怎么选。不同井距、不同压抽制度下储层渗透率沿着什么路径演化会不会在某一段突然恶化。煤层在压降漏斗范围内会不会因为有效应力过高发生压实破坏裂隙闭合是渐变的还是一步到位的。煤层气的解吸速率和抽采速率是否匹配什么时候应该调低负压来“养生”什么时候应该提产。这些问题全部靠现场试验来回答一口井的成本动辄上百万周期以年计。数值模拟可以把试错成本大幅压低在方案设计阶段先把参数空间扫一遍找出值得做现场试验的组合。这就是模拟存在的价值。1.3 这篇文章适合谁看如果你正在做煤层气、页岩气、地热等储层改造相关的数值模拟或者你在研究多孔介质流固耦合手里已经装了 Comsol但对“怎么把地应力、渗流和产量预测串成一套完整模型”还没有清晰思路这篇文章就是写给你的。我会从建模前的逻辑设计开始一路讲到几何处理、网格剖分、参数设置、求解控制、结果判读最后再分享一些我踩过的坑。你会发现Comsol 里很多功能单独拎出来都不难难的是理解“它们在一个真实工程问题里到底怎么配合”。2. 建模前想清楚物理场、控制方程和耦合逻辑2.1 方案选型为什么用 Darcy 定律 固体力学Comsol 里能用来做流体流动的模块很多层流、裂隙流、Darcy 定律、多孔介质稀物质传递都有。我在这个项目里选的是“Darcy 定律 固体力学”的组合而不是做完整的 Navier-Stokes 流场。原因很简单煤层气的渗流发生在微米级裂隙和孔隙网络里流速极低惯性项可以忽略用 Darcy 定律描述最契合物理本质计算量也更可控。固体力学模块负责算煤层的应力应变。煤层虽然是破碎的多孔介质但在工程尺度上把它当成连续介质来处理是合理的这也是国际上主流文献的一致做法。需要注意的是煤体的本构关系不能直接套用弹性体最好用摩尔-库仑或 Drucker-Prager 这类更适合煤岩材料的塑性本构至少也要在有效应力更新里加上临界破坏判断否则压实段的变化捕捉不到。两个物理场之间的耦合项可以通过 Comsol 的多物理场节点直接串联也可以在“变量”菜单里手动定义。对于初学者我建议先把“多物理场耦合”节点搭起来后面再逐步手动替换耦合表达式这样不容易整体塌掉。2.2 核心控制方程与参数逻辑给你看一下我真正在模型里用的核心方程不是教科书简化版是能落地的版本。有效应力是最基础的一环关系式为σ_eff σ_total - α · p_pore其中 α 是 Biot 系数煤岩通常取 0.81.0p_pore 是孔隙压力。抽采时孔隙压力下降σ_eff 升高煤体被压密。这个方程看起来简单但如果你在 Comsol 里直接把地应力和孔隙压力设成常数后面所有渗透率演化都是错的。渗透率演化我用的指数形式关系式k k_0 · exp[-c_f · (σ_eff - σ_eff0)]其中 k_0 是初始渗透率c_f 是裂隙压缩系数σ_eff0 是初始有效应力。这个公式能捕捉压密导致的渗透率衰减。如果要考虑解吸收缩带来的渗透率回升就再加一项k k_0 · exp[-c_f · (σ_eff - σ_eff0) a_m · ε_v]这里的 ε_v 是煤基质解吸收缩的体积应变a_m 是耦合系数。具体系数可以通过实验室做个简易的单轴应变测试来标定。气体解吸量采用 Langmuir 等温吸附模型描述V V_L · p / (p P_L)V_L 是 Langmuir 体积P_L 是 Langmuir 压力。这个方程描述了压力下降时甲烷从煤基质表面释放的过程。Comsol 自带“吸附/解吸”的物理接口选项但默认的表达式比较简单我建议自己在“变量”里按上面这个公式写控制感更强。2.3 耦合逻辑怎么串起来很多新手最容易卡住的地方就是不知道这几个方程在 Comsol 里应该放在哪里、谁先算谁后算。我建议采用的耦合逻辑是一个双向循环先由固体力学模块基于当前孔隙压力算出应变和有效应力分布再把这个有效应力代入渗透率变量Darcy 模块基于更新后的渗透率算新的压力场新压力场又反过来更新固体力学方程的载荷项。每走完一个循环检查一下压力残差和位移残差满足收敛判据再进入下一个时间步。在 Comsol 里具体操作时我会把渗透率写成与有效应力相关的“变量表达式”然后让 Darcy 模块的渗透率参数直接引用这个变量。这样布置的好处是你不需要在物理场之间手动传递数据整个模型在一个单元里全耦合求解物理一致性有保障。3. 几何建模与网格处理实操3.1 工作平面的作用从二维草图到三维井群模型Comsol 里工作平面算得上是万物起点它的作用是让你在一个指定平面上画二维草图再通过拉伸、旋转、扫掠等操作生成三维体。这个机制在做煤层气这种层状地层模型时特别顺手因为我们可以先在工作平面上画出井筒位置、水力裂隙轨迹和储层边界再用“拉伸”工具把它变成有厚度、有分层的三维模型。我实际建模时会做三层结构顶板、煤层、底板。煤层是主研究对象厚度根据地质资料填顶板和底板则是为了给应力边界提供足够的“夹持”作用防止直接给煤层切出一个人为边界条件导致应力严重失真。如果你只在乎产气量预测顶底板厚度各取煤厚的 1.52 倍就够用取太厚只会白白增加网格量。有时候需要做井网平面布置的模拟这种场景不用建全三维体直接在顶视图工作平面上画一个二维平面模型就够了。Comsol 的 2D 模型一样可以计算 Darcy 流动和平面应力计算速度快一个数量级适合用做井距、井型参数的初步筛选。等选出两三个候选方案再单独建 3D 模型细算。3.2 从 SolidWorks 导入 step 文件后的一堆警告怎么处理如果你手里已经有一个从 SolidWorks 建好的几何模型直接“另存为 step”再导入 Comsol大概率会碰到一串警告。我刚开始也以为模型废了后来才搞清楚原因。最常见的问题有这么几类。第一是单位不匹配SolidWorks 里用的是毫米Comsol 默认是米如果导入时不选单位整个几何体缩小一千倍网格直接崩。第二是曲面不封闭SolidWorks 导出 step 时偶尔会有拓扑缺口在 Comsol 里表现为“不能形成实体”需要手动修补。第三是冗余小面太多SolidWorks 的历史建模会留下大量碎面导入后网格剖分时这些小面会产生几十万个不需要的自由度。对应处理方法我基本按三步走先确认单位再点击“修复”按钮自动清理最后如果有碎面用“虚拟几何操作”把小面合并成大面。很多人看到警告就想全部消掉其实没必要只要确保实体闭合有几个警告不影响计算。真正要盯的是网格统计如果网格质量线报红那才需要回头处理几何。3.3 移动网格到底该不该用很多做流固耦合的人一听见“变形”两个字就想到“移动网格Moving Mesh / ALE”。这里我要泼一盆冷水在煤层气抽采这种工程尺度模拟里移动网格通常不是必需品反而容易给你添乱。移动网格的价值在于几何边界真的发生了肉眼可见的变形比如大位移的活塞推进、流道开闭。但煤层抽采的变形量级是毫米级相对于几十米尺度的模型几何变形完全可以忽略。工程上真正在变化的是孔隙度和渗透率这些不需要移动网格也能更新。Comsol 里可以通过在多孔介质接口里定义孔隙率随应力的变化来实现这一目的并且稳定得多。移动网格最大的坑在于时间步稍微大一点网格单元翻转、质量下降、不收敛接踵而来。我见过不少人为了“看起来更物理”去开移动网格结果三个月卡在收敛性上。如果你真的需要做裂隙开度变化、颗粒运移这类几何层面变化的研究那移动网格确实是选项之一但对常规煤层气抽采我的建议是关闭移动网格把精力放在渗透率演化本构上。3.4 网格剖分不是越细越好而是分块合理网格策略上我最核心的体会是“分块加密整体控制”。煤层气模型里井筒附近是压力梯度最大的区域必须加密往远处压力梯度平缓网格可以慢慢放稀。中间用扫掠网格过渡这样可以保证网格数量控制在十几万左右普通工作站就能跑得动。Comsol 里自动网格生成的功能不错但要记得把“边界层网格”打开在井筒壁面附近加两层边界层用来捕捉径向压降的陡变。煤层和顶底板的接触界面处也建议加密一层网格因为层间滑移和应力传递容易在这里发生突变。网格尺寸的具体数值没有标准答案取决于你的储层规模。我的经验是先跑一个粗网格模型看压力场的整体分布再对比一次中等密度网格如果两个结果差别小于 5%就说明网格已经收敛不用再往细里调。盲目加密只会把求解时间从半小时拉到半天物理结论没有任何变化。4. 边界条件、参数设置与求解控制4.1 渗透率-应力耦合参数的确定这块是模拟成败的关键我单独拎出来说。之前提到渗透率的指数形式公式里面有 c_f 这个裂隙压缩系数。它怎么定如果在实验室拿到了不同围压下的渗透率测试数据直接做指数拟合就行。没有实验数据时可以参考同区块煤样的文献值一般取 0.050.20 MPa⁻¹浅埋深煤层取大值深埋取小值。还有一个容易踩的坑——渗透率不能无限衰减。数值计算里当有效应力涨到一定程度指数公式会给一个极小的渗透率导致局部流动彻底锁死这在物理上不合理因为裂隙就算被压到极限还留有一条残余渗流通道。所以我在模型里一定会给渗透率设下限一般是初始值的 5%10%。这个下限在 Comsol 里写起来也简单k max(k_min, k0 * exp(-c_f * (σ_eff - σ_eff0)))4.2 边界条件设置的几个误区边界条件是最容易被当成“随便设一下”的环节但它的影响比你想象中大得多。我见过很多模型算出来的产气量跟现场完全对不上最后查下来都是边界条件设错了。应力边界上地应力要用初始应力状态而不能只给一个自重载荷。煤层层面上我一般用辊支撑允许横向位移约束法向位移这样既防止刚体漂移又不会过度约束变形。模型的四个侧面和底面模拟范围取得足够大之后可以设成固定约束或者较低刚度的虚拟地层。流动边界上抽采井筒处设置压力边界条件数值设为套管鞋处的井底流压一般取 25 kPa 绝压或者用相对压力 0.51 atm 的负压。模型的远边界设置为与储层初始压力一致的压力边界或者直接设为零通量边界。这里有个常见错误就是把远边界画得太小压力漏斗很快扩展到边界模拟结果就会失真。所以我建议侧向边界距井筒至少取单井控制半径的 3 倍。由于不同模拟目标所需的边界条件存在差异我把常用的场景归纳为下表方便你快速对照。模拟场景应力边界建议流动边界建议热/传质边界单井产能评价顶部固定侧面辊支撑井壁定压远边界定压绝热/无气体侵入多井干扰分析对称边界面外约束井壁定压对称面零通量区间对称处理水力压裂抽采一体化考虑压裂液注入的孔压边界压裂段压力动态变化视压裂液侵入设定参数敏感性扫描保持统一初始地应力统一井底压力统一温度/浓度初始4.3 求解器设置的实战要点Comsol 默认的求解器配置在简单问题上很稳但遇到强耦合的煤层气模型直接点“求解”大概率不收敛。我的习惯是选择分隔式求解Segregated Solver把固体力学和 Darcy 模块分成两步迭代比全耦合更容易稳定而且每一步的物理意义清楚调试起来也方便。分隔求解的情况下两个物理场之间的耦合通过外部迭代实现。外迭代次数要设够一般 10 次起步。如果发现残差曲线一直往下走但收敛很慢可以把外迭代上限调到 25 次。内部求解器——线性部分用 MUMPS 或 PARDISO非线性收敛准则尽量放宽到 1e-3 或 1e-4不要直接上 1e-6那个精度在实际工程里没有意义反而让计算量成倍增加。求解顺序对端到端效率的影响也很大。我强烈建议先做两步预处理第一步只算固体的地应力平衡得到煤层在原始状态下的应力场和位移场第二步只算 Darcy 流场的稳态压力分布作为后续瞬态分析的初始条件。预处理不充分直接上瞬态初始阶段会出现一个很大的压力震荡不仅算得慢还可能把后面的结果带歪。4.4 时间步长与瞬态控制煤层气抽采的模拟时间跨度通常以年计但关键的压力变化集中在前几天。时间步长如果全程用常步长要么前段步长太粗丢失过程要么后段步长太细浪费时间。我采用的策略是“初始细步长逐步放大”前 1 天用 12 小时步长第 230 天用 612 小时步长之后切换到 12 天步长最后一个月以上直接用周步长。Comsol 的时间步进里可以自己指定一个“时间网格数列”这是最灵活的做法。5. 结果判读、导出与工程应用5.1 怎么判断模拟结果有没有毛病算完不是终点结果合不合理要先过自己这一关。我一般会看三件事。第一压力场的形态。抽采中后期井筒附近的压降漏斗应该平滑扩展不能出现明显的锯齿状或者局部压力高于远边界的情况。锯齿往往出自网格不够或者收敛残差太大需要回查网格和容差设置。第二渗透率演化曲线。模拟开始后近井区域渗透率应该有一个先快速下降、后趋于稳定的过程如果模型考虑了基质收缩后期渗透率会出现一定程度的回升。这条曲线的形状就是整个耦合模型的“体检报告”形状不对说明你耦合参数学得不对。第三产气量曲线。典型煤层气井的产气曲线是“先解吸、后峰值、再衰减”的三段式。如果你算出来的气体产量直接从高往下掉没有任何升段大概率是初始条件或边界条件设错了或者是没有让井筒先经历一段压降过程。5.2 数据导出与动态结果分析Comsol 的结果数据导出其实是个非常灵活的工具能把模拟结果应用到工程分析里。我的常用方法是在模型里定义几个“探针点”分别设在井壁、近井 5 米、十米、二十米处然后把压力、渗透率、位移随时间的曲线数据直接导成 CSV 文件在 Excel 里做成汇报图表。如果你要输出整片压力场的变化过程可以在“结果”节点里创建“动画”或者“派生值”导出 GIF 或一组图片。这里有一个小技巧导出图片前把配色方案调成适合打印的色带比如蓝白红而不是默认的彩虹色否则放到报告里会非常杂乱。数据导出一步要注意坐标单位。Comsol 导出的坐标默认是米但国内地质上习惯用米高程和井深所以导出前先在“设置”里把坐标刻度换成你要的单位体系。另一个问题是导出结果的“粒子 ID”和“计算单元号”经常让人搞不清实际上你只要选好数据集和探针点导出的数据结构就会自动对应到具体的空间位置。5.3 从模拟到抽采方案优化一个真实流程模拟最终还是要指导现场。我在实际项目中把 Comsol 模型和现场动态数据结合起来做过一轮优化流程大致是这样的先用现场 30 天的压力监测数据反演渗透率模型参数再把反演后的模型放开做 3 年产量预测对比不同井底流压下的产气峰值和稳产时间最后选出最优负压制度。算出来的结果很有意思——井底流压并不是越低越好。负压提得太猛压降漏斗扩展快但近井渗透率衰减也快耦合效应导致总产量被“锁死”。负压适中时压力下降慢一些但渗透率维系得好长期累计产气量反而更高。这就是流固耦合模拟比普通产能模型强的地方因为在传统模型里渗透率是常数根本不会出现这种“限产保渗透”的博弈。6. 常见问题排查与工程落地心得6.1 常见问题速查表我把自己做煤层气流固耦合模拟踩过以及帮别人排查过的典型问题整理成一个速查表遇到了可以直接对照着处理。现象常见原因排查与解决思路一直不收敛渗透率表达式过陡、外迭代次数不足给渗透率加上下限约束调低 c_f增加外迭代次数收敛但产气量明显偏高渗透率没设置下限近井枯竭区还在给气检查 k_min 设置了没有确认远边界距离足够产气曲线没有升段初始压力设置错误或井筒未先经历压降检查初始压力和井底压力差值调整初始条件压力场出现锯齿网格太粗或收敛容差过紧在井筒附近加密网格适当放宽非线性收敛容差计算时间过长网格量过大、全耦合求解、时间步过小换分隔求解拉长时间步长压缩远场网格导入 step 后几何破缺SolidWorks 导出面断裂在 Comsol 中自动修复或返回 CAD 重新缝合面移动网格单元翻转变形量超过网格承受范围关闭移动网格改用变量更新渗透率6.2 用 Comsol 的 MCP 服务建立可复用的模拟流程做模拟做到后期你会发现真正耗时的是反复调整参数、重复提交计算。Comsol 提供的 MCP 服务模型控制协议在这里特别有用。你可以通过外部脚本调用建模与求解指令这样就能把整条建模和参数扫描流程跑成自动化流水线不用手动在界面里来回点。我在煤层气项目里会用 MCP 服务写一个小型参数扫描脚本自动改井底流压、渗透率系数、煤层厚度然后把每一次计算的核心指标——峰值产气量、稳产时间、累计产气量——汇总到一张表里。一个晚上能跑几十组工况而手动在界面操作可能一周都做不完。这个思路特别适合做方案比选和敏感性分析。虽说直接用 Comsol 内置的“扫描式参数研究”也能实现但如果你的模型有复杂的预处理、多个物理场联动或者需要对接别的数据格式用 MCP 服务能做到更细粒度的控制而且对后期做模型版本管理也很有帮助。6.3 我自己的一些体会做煤层气流固耦合模拟这几年我最深的感受是软件永远是次要的物理模型和参数标定才是核心。Comsol 再强大它也只是一个求解工具它不会告诉你该取多大的裂隙压缩系数也不会替你去判断渗透率衰减规律到底该用指数型还是幂律型。这些判断只能来自于对煤储层物理的深刻理解和对现场数据的敬畏。另外一个经验是能用二维解决的问题不要急着上三维。二维模型计算快、调试方便能帮你迅速找到建模思路里的逻辑漏洞。等二维模型的产气规律和现场对上了再扩展到三维这样踩坑成本最低。最后分享一个建议给每一个版本的模型都要保留完整的参数记录包括渗透率更新公式、边界条件、网格参数、求解器设置。否则三个星期后你回头调整模型时大概率已经忘了当初某个参数是怎么标定的。把参数记录做成一张表放在模型目录里会让后续的传承和迭代省非常多事。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进