1. 从“压裂”到“模拟”:为什么我选择Comsol来做这件事
水力压裂这个名词,在油气行业和地热开发里已经不算新鲜。但真正要把“压裂过程”讲清楚,靠现场经验是不够的。裂缝怎么起裂、怎么扩展、流体往哪里走、压力怎么衰减,这些背后是固体力学和流体渗流的耦合问题。纯粹用解析解算,理想化条件太多,工程参考价值有限;纯粹靠现场试验,成本太高,而且很多地下参数根本测不准。所以我当时接这个课题的时候,第一反应就是找一套能做实打实耦合仿真的工具,最后选来选去,定了Comsol。
Comsol在岩土和油气领域不算最冷门,但比起那些专门的离散元软件或者有限差分工具来说,它最大的优势是“多物理场耦合不需要手动写耦合接口”。水力压裂本质上就是岩石变形、裂缝扩展、流体流动、孔压变化这几个过程交织在一起。用Comsol的固体力学模块去描述岩石骨架的应力和变形,用达西定律模块去描述流体在孔隙介质里的渗流,中间通过孔弹性耦合关系把两个物理场串起来,这条路是走得通的,而且后处理非常直观。
这篇内容的定位不是教科书式的理论推导,而是我从建模思路、参数设置、耦合方式到后处理分析的一整套实操记录。适合正在做岩石力学数值模拟的研究生,或者刚接触Comsol多物理场耦合的工程技术人员。我会把踩过的坑、试过的参数、还有那些文档里不会写清楚的细节,都原原本本放出来。如果你也准备用Comsol做类似的水力压裂模拟,这篇东西能帮你少走不少弯路。
2. 核心建模思路:固体力学、达西定理和孔弹性耦合
2.1 先理解“水力压裂”在这个模拟里到底发生了什么
水力压裂的过程,说白了就是往钻孔里注入高压流体,让井壁附近的岩石所受的有效应力降低,当拉伸应力超过岩石的抗拉强度时,岩石就会起裂。裂缝一旦产生,高压流体继续挤进裂缝,裂缝尖端不断向前推进,同时流体向裂缝壁面周围的孔隙介质渗漏。
在这个过程里,有两个大类的物理行为必须同时被刻画出来:
一个是固体力学行为。岩石本身是有弹性模量、泊松比、抗拉强度的固体材料。注液加压后,井壁周围应力场重新分布,当某个地方的应力状态达到破坏条件,岩石就要开裂。即使在不开裂的阶段,孔压升高也会引起岩石骨架的变形,这就是所谓的“孔弹性效应”。
另一个是流体渗流行为。注入的压裂液不只是老老实实待在裂缝里,它还会沿着裂缝壁面向岩石深处渗漏。这个过程可以用达西定律来描述——流体在多孔介质里的流动速率,正比于压力梯度,反比于流体黏度,还受渗透率控制。
这两个行为不是孤立的。岩石骨架变形会改变孔隙体积,孔隙度一变,渗透率跟着变,渗流场就受影响;反过来,孔隙压力的变化又会改变岩石骨架的有效应力,影响岩石的变形和破裂。这个“双向反馈”就是孔弹性的核心,也是水力压裂模拟里最容易出错、也最值得花时间去处理的地方。
2.2 为什么选择达西定律而不是直接用裂隙流模块
做水力压裂模拟,很多人第一反应是直接用裂隙流接口,但实际建模的时候,要看研究目标是什么。如果只是想模拟流体在已经存在的裂缝网络里怎么流动,那裂隙流模块确实合适。但如果想研究的是完整岩石从“没有裂缝”到“起裂”再到“有裂缝”的全过程,那就必须考虑岩石基质里的渗流行为,以及流体渗漏对孔压分布的影响。这时候,达西定律就是更基础、也更贴合物理过程的切入点。
达西定律的形式大家都熟悉:流速等于负的渗透率除以流体动力黏度,再乘以压力梯度。但在Comsol里,达西定律接口不仅仅是一个公式,它还包括了孔隙介质的存储模型,会计算孔隙度、压缩系数、饱和度对孔压演化的影响。对于水力压裂这种瞬态过程,达西接口自带的存储项非常重要——压裂液注入的瞬间,孔压不会瞬间传遍整个区域,而是有一个逐步扩散的过程,存储项控制的就是这个扩散的快慢。
当然,达西定律描述的是连续介质里的渗流,对于裂缝内部那种高速通道里的流动,它并不完全精确。我在建模的时候做了一个折中:把裂缝区域单独划分出来,在裂缝区域用更高渗透率的达西流动来近似替代裂隙流。这个方法在裂缝开度不大、流动速度不过分高的情况下,结果是比较可信的。如果后面想做得更精细,可以在Comsol里嵌套裂隙流接口,跟达西接口做联合仿真,但初版模型用“等效渗透率”的思路,已经能抓住主要物理特性和规律了。
2.3 固体力学模块里的关键设定:绝不是选个弹性模量就完事
固体力学模块的第一个坑,就是材料本构选择。很多初学者上来就选“线弹性材料”,然后填一个弹性模量和泊松比,就以为万事大吉。实际上对于水力压裂这种涉及断裂的问题,只靠线弹性是不够的。你至少要考虑下面几件事。
第一,失效应力准则。岩石什么时候开裂,不是看某个点的应力绝对值,而是看应力状态是否达到了破坏条件。常用的破坏准则有最大主应力准则、库伦-摩尔准则、Drucker-Prager准则等等。我在模型里用的是最大主应力准则——当某个区域的最大主应力超过了岩石的抗拉强度,就判定该区域发生拉伸破坏。这个准则对于拉张型的水力裂缝比较适用,也跟水力压裂的物理机理比较吻合。
第二,损伤或软化行为。一旦岩石开始破坏,它的承载能力并不会瞬间降到零,而是有一个逐渐软化的过程。如果在模型里不做任何处理,让单元直接失效,容易引起数值不收敛。我采用的方式是引入一个简单的标量损伤模型——破坏区域附近的刚度按照损伤变量逐渐折减,同时保留基本的连续性计算。这样既能模拟起裂和扩展的趋势,又不会因为刚度的剧烈跳变导致计算直接崩掉。
第三,边界条件的设置。模型的边界不能简单地全部固定死,也不能全部设为自由面。地下岩层是有地应力场存在的,所以在模型的外边界上,我施加了初始应力条件,模拟上覆岩层压力和水平构造应力。这个初始应力的大小比例,直接影响裂缝的起裂方向。现场压裂裂缝一般垂直于最小主应力方向扩展,所以如果设反了,裂缝走向就会完全是错的。这块细节,模型做出来以后一定要先对照一下地应力方向和裂缝形态,做合理性分析。
2.4 孔弹性耦合:把两个物理场真正“绑”在一起
Comsol里实现孔弹性耦合,最常用的方式是使用“固体力学”和“达西定律”两个接口,然后通过“多物理场耦合”节点里的“孔弹性”耦合特征把它们连起来。这个耦合逻辑看起来简单,但设置的时候有几个指针要搞清楚。
孔弹性耦合的核心变量有两个方向:一是固体力学方程里的有效应力,它等于总应力减去比奥系数乘以孔隙压力;二是达西方程里的存储项,它要考虑岩石骨架的体积应变对流体质量守恒方程的影响。换句话说,固体力学模块提供体积应变给达西模块,达西模块提供孔隙压力给固体力学模块。这两个量在每个时间步里来回迭代,收敛之后才进入下一个时间步。
实际操作中,我强烈建议先把“固定孔隙压力”的单向耦合跑通,再开双向耦合。第一版模型里,我曾经把比奥系数设成1,然后发现整个模型几乎无法收敛,算出来的位移场大到离谱。后来我查了一下,发现比奥系数取1意味着岩石骨架颗粒不可压缩、所有孔压变化都无损地传递到有效应力上,这个设定对于某些特别致密的岩石可能接近,但对于一般砂岩,比奥系数在0.7到0.9之间更合理。调整之后,模型稳定性和结果合理性一下子就上去了。
3. 模型几何构建与网格划分的实操要点
3.1 几何尺寸怎么定:不能太小也不能太大
水力压裂模型的几何范围,理论上应该是越大越好,因为边界条件的影响范围有限,但实际计算成本不允许无限大。我采用的模型是一个二维平面应变模型,长宽各取50米。这个尺寸对于单井单裂缝的模拟来说足够大了——注入点和裂缝扩展区的应力扰动范围,在几百秒的注入时间内,通常不会超过十几米。当然,如果注入时间特别长,或者研究的是裂缝网络扩展,那几何范围还要适当扩大。
建模的时候,我建议在井筒位置附近预先切出一个细长条区域,作为潜在的裂缝扩展路径。这个裂缝路径区域不是一开始就设成裂缝,而是做一个虚拟的高渗透率薄层,宽度可以取几毫米到一厘米。这样做的好处是,网格可以在裂缝路径附近大幅加密,而远离裂缝的地方用粗网格就够,既保证精度又控制自由度数量。
3.2 网格划分:自由三角形网格还是映射网格
对于二维平面应变模型,网格是自由三角形还是映射矩形,很多新手觉得无所谓,但实际差异很大。我试过两种方案:映射网格的好处是单元排列规则,在裂缝扩展路径附近可以保证长宽比很小的窄长单元,计算稳定性好;缺点是对于圆形钻孔这种几何,要做分区映射,前期几何切割比较麻烦。自由三角形网格的好处是生成简单,但需要在裂缝路径附近做非常细致的尺寸控制,否则容易在裂缝尖端出现单元畸形。
我最终采用的是混合策略:钻孔附近和可能的裂缝扩展路径区域用极细的自由三角形网格,单元最大尺寸控制在0.1米左右;其余区域用渐变的粗网格,最大尺寸控制在5米左右。整个模型的单元数大概在几万量级,单次瞬态仿真在普通工作站上几个小时内能跑完。对于这种多物理场耦合模型来说,这个计算代价完全能接受。
网格质量是另一个容易踩坑的点。Comsol默认生成的网格,有时候在钻孔的圆弧边界附近会出现很小的夹角,导致单元质量下降。我在建模时,在钻孔边缘设置了一圈边界层网格,可以让孔壁附近的网格过渡更平滑,也提升了后续计算中达西渗流和固体力学变量在边界上的数值稳定性。
3.3 初始地应力场施加的两种方式
初始地应力场在Comsol里施加,一般有两种方式:一种是直接在固体力学接口的“初始应力”里设置三个应力分量;另一种是定义一个初始应力和初始孔隙压力,然后通过“稳态”求解先算出一个初始平衡状态,再把结果作为瞬态分析的初始值。
第一种方式简单,但有个隐患——如果初始应力场与边界载荷不完全自洽,模型在瞬态计算一开始就会出现一个额外的位移调整过程,这不是我们想要的“注液前状态”。第二种方式更严谨:先跑一个稳态计算,让模型在初始应力、初始孔压和边界约束条件下达到力学平衡,然后把稳态解作为瞬态分析的初始条件。
我个人强烈推荐第二种方式。我之前偷懒用第一种,结果算出来的初始位移场直接影响了后续的孔压演化,前几秒的压力响应完全失真,后面排查半天才发现问题出在初始应力不自治。
3.4 注液过程怎么模拟:用流量边界而不是压力边界
注入点处的边界条件,教科书里经常说“给定压力”,但实际模拟我更推荐“给定流量”。理由很简单:现场压裂泵车控制的是排量,而不是井口的压力。排量确定后,井底压力会随裂缝扩展和滤失情况自行调整。如果在模型里直接固定压力,就等于把泵的响应理想化了,裂缝扩展过程中的压力波动就看不到。
Comsol里可以在钻孔边界设置一个“法向流入速度”或者“质量通量”边界条件。我通常设的是体积流量除以钻孔壁面积,得到一个等效的流速边界。这里要特别注意单位换算。达西接口的压力单位是帕,流速单位是米每秒,而现场压裂排量常用方每分钟或者桶每分钟。我第一版模型里直接把每分钟的方数当成流速填进去,结果孔压飙升到几百个兆帕,一眼就看出来不对劲。换算公式很简单:流速等于流量除以钻孔的有效注入面积,注意把时间单位换成秒,把体积单位换成立方米。
4. 材料参数选取与多物理场耦合求解设置
4.1 岩石力学参数和渗流参数的合理取值
材料参数是整个模拟里最影响结果、也最容易“拍脑袋”的部分。我直接把常用的一套参数列出来,供大家参考,但实际使用一定要根据你的具体岩样测试数据去调整。
| 参数名称 | 常用取值区间 | 备注 |
|---|---|---|
| 弹性模量 | 10~30 GPa | 砂岩偏低,致密灰岩偏高 |
| 泊松比 | 0.2~0.3 | 取0.25作为中值 |
| 抗拉强度 | 1~5 MPa | 可以通过巴西劈裂试验获取 |
| 比奥系数 | 0.7~0.9 | 致密岩石可接近1,但慎取 |
| 孔隙度 | 0.05~0.2 | 致密储层偏低 |
| 渗透率 | 1e-18~1e-14 m² | 1e-15 m² = 1 * 毫达西,记住这个换算 |
| 流体黏度 | 1~100 mPa·s | 水基压裂液约1,携砂液更高 |
| 初始孔压 | 10~30 MPa | 取决于埋深,约等于静水柱压力 |
渗透率是达西定律里最敏感的参数,没有之一。渗透率差一个数量级,孔压扩散速度和滤失量就会差一个数量级。做敏感性分析的时候,建议把渗透率作为首要考察变量。
4.2 瞬态求解器设置:时间步长和容差不能偷懒
Comsol的瞬态求解器默认用的是BDF(向后差分公式),对于这种刚性问题,BDF是合适的。但有几个关键设置需要手动调。
第一,时间步长建议不要完全让求解器自动控制。我采用的方式是设置一个从0.01秒到10秒的跨度,用对数分布定义输出时间点,这样初期压力骤升的阶段能有足够密的结果输出,后期压力稳定阶段也有数据。求解器内部允许自动步长,但输出的节点按我指定的时间点保存,能保证裂缝扩展过程被完整记录下来。
第二,相对容差不能图省事用默认的0.01。我做孔弹性耦合时,默认容差下经常出现压力振荡,特别是注入刚开始的阶段。把相对容差改成0.005甚至0.001之后,振荡明显减少。代价是计算时间增加,但结果可靠多了。对于这种带强耦合的瞬态问题,多花一个小时换来一套可信结果,完全值得。
第三,如果模型不收敛,优先检查材料参数是否量级离谱,再检查边界条件是否与初始条件冲突,最后检查网格在高压梯度区的细化程度。我之前遇到过反复不收敛的情况,最终原因是渗透率值填少了三个数量级,导致局部压力梯度极其陡峭,任何网格都撑不住。
4.3 井筒附近局部网格细化不能省
井筒附近的孔压和应力梯度是全场最高的地方。如果这里网格太粗,裂缝起裂点和扩展路径都会算偏。
我采用的策略是:在孔壁周围做一圈0.05米到0.1米尺度的高密网格,并以2倍率向外渐变。整个模型最密的部分就在这个区域。你可以用Comsol的尺寸属性里的“自定义增长率”去控制它,增长率不要超过1.3,否则过渡太快,局部网格质量不好。
网格细化的目的是捕捉应力集中,因为水力压裂的起裂完全是由井壁应力集中控制的。井壁处最大主应力比远场应力高出好几倍,网格没细化到位,这个应力集中就体现不出来,裂缝就无法起裂。
5. 后处理分析与结果解读:别只盯着一个“裂缝图”
5.1 如何判断裂缝是否“真正”起裂并扩展
很多新手跑完模型,看到压力云图里有个高压力区域就觉得“裂缝出来了”。这种判断太草率。正确的做法是同时看三个量。
第一个量是最大主应力与抗拉强度的对比。如果某个区域的最大主应力超过抗拉强度,说明理论上已经达到破坏条件。但这个值并不是“裂缝”的直接表征,因为破坏是分布式软化还是集中式断裂,还需要看损伤变量。
第二个量是损伤变量或者单元刚度的折减区域。我在模型里加入了标量损伤变量,结果输出时可以直接画损伤变量的空间分布。损伤变量从0到1变化,0代表完全未破坏,1代表完全失效。裂缝扩展路径,就应该是损伤变量从井壁向外连续延伸的高值带。
第三个量是孔隙压力的分布形态。水力压裂过程中,裂缝内部的高压流体不断向壁面滤失,所以在裂缝周围会形成一个低压力梯度的扩展区域。如果裂缝扩展是真的,那么孔压的“箭形”分布会随着裂缝尖端一起向前推进,而不是只在井口附近堆积。
这三个量要同时对照着看。如果损伤变量显示裂缝路径清晰,但孔压分布模糊,可能说明渗透率设置得不对,滤失量过大,裂缝里的压力没有维持住。所以后处理不是画个云图的事,而是多物理场结果交叉验证的过程。
5.2 绘制压力—时间曲线和裂缝长度—时间曲线
除了空间分布,还要关注特征量随时间变化的规律。我在每次模拟后都会导出两类曲线。
一类是井底压力响应曲线。真实的水力压裂施工曲线里,会看到注入初期压力快速上升,然后随着裂缝起裂和扩展,压力出现一个平台或略有下降。我的模拟结果复现了这个趋势。如果算出来的压力曲线是一条光滑单调上升的直线,多半是裂缝没有起裂,流体全在往基质里渗流。这时候要检查网格和损伤准则。
另一类是裂缝长度随时间的变化曲线。这个可以通过后处理提取损伤变量大于阈值的最大径向距离得到。裂缝长度不是线性增长的,通常在初期增长较快,随着注入进行,增长速率放缓。这跟现场微地震监测到的裂缝扩展规律是一致的。
把这两条曲线跟现场的微地震数据和施工压力曲线做对比,是验证模拟模型可靠性的核心手段。我做的某个井组模拟,模拟裂缝长度与现场解释结果误差控制在15%以内,前提是地应力和渗透率参数标定得比较到“位”。
5.3 参数敏感性分析:哪些参数值得反复试算
水力压裂模拟的一个重要作用,是搞清楚哪些参数对结果影响大,哪些无关紧要。我做过的参数敏感性分析结果可以给一个明确排序:
地应力差(最大水平主应力与最小水平主应力之差):影响裂缝起裂方向和扩展路径的最关键因素。地应力差越小,裂缝越容易偏转;地应力差很大时,裂缝平直扩展。
渗透率:影响滤失量和孔压分布,进而影响裂缝宽度和长度。渗透率越高,流体滤失越快,裂缝扩展难度越大。
排量(流量边界条件):排量增加会提高井底压力,但压力增加的幅度小于排量的比例,所以大排量可以加速裂缝扩展,但不会无限提高。
抗拉强度:影响起裂压力的大小,对裂缝扩展方向影响较小。抗拉强度越低,越容易起裂,起裂压力越低。
弹性模量:影响裂缝宽度,弹性模量越高,裂缝越窄,相同排量下裂缝长度可能越大。
这些分析的价值在于,为现场参数反演和方案优化提供方向。比如在现场施工前,不确定某地层的渗透率,你可以在模拟里把渗透率扫一遍,看裂缝几何和压力响应的变化范围,从而为泵注设计提供参考。
5.4 建议做的多组对比方案
强烈不建议只跑一组参数就出结论。同一口井,同一个层位,至少要做“施工参数对比”和“储层参数对比”两组模拟方案。
施工参数对比方案里,可以固定储层参数,改变注入排量(比如5、10、15方每分钟),改变注入时间总长度,看压力响应和裂缝几何怎么变。储层参数对比方案里,可以固定施工参数,改变地应力差、渗透率、抗拉强度各几个档位,系统评估储层非均质性的影响。
最后把所有方案的结果整理成表格,横向对比裂缝长度、宽度、起裂压力、净压力等关键指标,这样才能从数据里找到真正的规律。做科研、写论文、给工程提供建议,靠一组模拟结果都是站不住脚的。
6. 常见问题排查与经验避坑记录
6.1 计算不收敛的三大主因
水力压裂模拟里,不收敛是家常便饭。根据我的实操经验,主要原因是下面三样。
一是材料参数量级问题。很多参数“看起来合理”但单元刚度矩阵或质量矩阵的病态程度被放大了。尤其是渗透率填写错误,导致流体流动方程和固体力学方程的数值差异过大。可以在求解前先做一个稳态渗流测试,只看达西接口,确认压力场正常后,再打开固体力学接口。
二是边界条件突变。注入开始的一瞬间,边界流量从0直接跳到设计值,这在物理上是一个大冲量,数值上很容易引起压力爬升过猛和收敛困难。我的做法是在注入边界上增加一个“渐变函数”,让流量在前0.5秒从0线性上升到设计值。这在物理上也合理,因为现场泵车启动也是有个过程的。加了渐变之后,求解稳定性明显提升。
三是损伤软化区网格畸变。模型里损伤变量导致刚度下降,等效于该区域材料变软,变形局部集中,单元可能被过度拉长。这时除了细化网格,还可以考虑用“非局部损伤”或者稍大一些的特征长度来缓解网格依赖性。
6.2 孔压振荡的检查思路
如果你算出来的孔压时间曲线在注入初期出现高频振荡,多半是数值因素而非物理现象。我碰到过两种情况,一种是时间步长太大,无法分辨压力传播的瞬态过程;另一种是相对容差太松,导致孔压和位移在一个时间步里无法达到耦合收敛。
解决办法是:把相对容差调低一个数量级,同时把初始时间步长设小,比如1e-4秒,让求解器有足够时间适应压力突变。之后再用自适应步长稳步放大时间步。这个方法我验证过多次,能有效抑制数值振荡。
6.3 多物理场耦合顺序的调试技巧
如果双向耦合跑不起来,先拆开跑。我的调试流程是:先单独跑一个纯固体力学模型,给定一个固定的孔压分布,看应力场和位移场是否合理;然后再单独跑一个纯达西模型,给定一个固定的体积应变场,看孔压演化是否合理。两个都正常后,再叠加成双向耦合模型。
这样做的原因是,双向耦合一旦不收敛,你根本分不清是哪个物理场出了问题。拆开调,能把问题定位在接口设置、参数单位或者边界条件上。这个习惯帮我省了无数时间,强烈建议你也养成。
6.4 单位制统一:最容易翻车的坑
Comsol默认使用国际单位制,但很多人习惯用工程单位,比如渗透率用毫达西,压力用兆帕,流量用方每分钟。如果不在源头统一,数值就会差到离谱。
我建议把所有参数都换算到SI单位后再填进去。渗透率:1千分达西=1e-15 m²;压力:1兆帕=1e6帕;流量:1方每分钟=1/60方每秒。流速边界条件则要用流量除以孔壁面积。换算过程花五分钟,就能避免后面一两天的返工。
6.5 模拟完成后的“合理性验证清单”
每次跑完模型,我都会按下面几条做快速自查,只有全部通过,结果才算可信。
第一,裂缝应从井壁起裂,且起裂位置在应力最集中的方位。对于竖直井筒,在水平地应力差存在的条件下,裂缝应在垂直于最小水平主应力的方向起裂。
第二,井底压力曲线应存在明显的“破裂”特征。起裂压力是峰值的尖角,起裂后压力稍微回落或平稳。
第三,孔压传播范围应与注入时间匹配。短时间内,孔压不会覆盖整个模型。
第四,裂缝扩展路径不应受网格方向的影响。如果你改变网格方向或重画网格,裂缝形态应有可重复性。
这四条都满足的话,这个模拟结果就具备基本的可信度,可以作为后续分析的基础。
7. 初始条件下的几个关键细节补充
7.1 初始孔隙压力的空间分布
初始孔压不一定是均匀的,尤其是地层埋深较大时,孔压随深度线性增加。二维平面应变模型里,如果只取一个小范围,可以近似认为初始孔压均匀,取一个代表值就行。但如果模型的纵向尺度很大,那么初始孔压必须按深度梯度设置。
Comsol里可以用解析函数或者插值函数来定义初始孔压。我通常直接定义一个“随坐标变化的表达式”:初始孔压 = 参考压力 + 深度梯度乘以(某基准面到当前点的深度差)。这个操作看着简单,但如果漏了这一步,瞬态计算刚开始就会产生一个虚假的渗流效应,因为压力分布不自洽。
7.2 初始有效应力状态的计算
设置初始地应力时,要区分“总应力”和“有效应力”。固体力学模块通常把有效应力作为应力变量,但边界载荷和体载荷一般给的是总应力条件。所以正确做法是:在稳态求解第一步里,把初始孔压也一起定义好,让固体力学方程在有效应力状态下自动平衡。如果只给总应力而不给初始孔压,有效应力就偏大,起裂压力会被高估。
7.3 注入流体黏度的影响
压裂液黏度不是一个固定值。如果用清水压裂,黏度很低,滤失大,裂缝窄;如果用冻胶压裂,黏度几百毫帕秒,裂缝宽且扩展距离远。模拟时不要觉得“黏度就是个定值”,把它也作为敏感性参数研究一下,会让你对不同压裂液体系的适用性判断有更深理解。
8. 案例复盘:一次完整的水力压裂模拟过程
我用一个模拟项目X来复盘一下整条流程,方便你对照自己的建模步骤。
这个案例的背景是某致密砂岩储层,埋深约2500米,初始地应力场最大水平主应力约45兆帕,最小水平主应力约38兆帕,垂直应力约55兆帕,地应力差为7兆帕。岩石弹性模量设为20吉帕,泊松比0.22,抗拉强度3兆帕,比奥系数0.85,初始孔压25兆帕,渗透率1e-17平方米,孔隙度0.08。压裂液黏度取2毫帕秒,模拟注入时间300秒,排量折算到模型上是每秒每米厚度注入0.002平方米的体积流量。
建模几何是50米乘50米平面应变区域,钻孔半径0.1米,裂缝潜在路径为一条从钻孔向外延伸的窄带,宽0.01米,用高渗透率表示,渗透率设为初始值的1000倍,模拟裂缝的导流能力。
瞬态求解设置:总时间300秒,输出步长按0.1秒到10秒的对数分布。相对容差0.001。
结果很典型:注入开始后0.5秒,井壁最大主应力超过抗拉强度,损伤变量开始局部增大;10秒后裂缝尖端已延伸到约8米位置;100秒后扩展到约23米;300秒时裂缝长度约35米,裂缝宽度最大约4毫米。
压力曲线方面,井底压力在前10秒内迅速爬升到约41兆帕,随后出现一个小的跌落,之后缓慢上升,到300秒时稳定在43兆帕左右,符合现场水力压裂的典型压力特征。
这个案例验证了模型能捕捉裂缝起裂、扩展和压力响应的关键物理过程。整个过程从建模到出结果,大概用了三周时间,其中一半时间花在参数标定和网格调试上。
9. 一点个人的实操体会
跑了几十组水力压裂模拟之后,我最深的感受是:数值模拟最大的敌人不是模型复杂,而是“觉得某个环节很简单,所以没仔细检查”。单位换算、初始应力自洽、边界渐变加载、渗透率量级,这几个细节任何一个出错,结果都会谬以千里。
另外,Comsol这种多物理场工具,别指望它替你物理建模。你必须先想清楚这个物理过程里哪些变量是核心、哪些效应可以忽略、需要哪些耦合关系,才能在软件里表达出来。软件只是工具,物理直觉和工程判断才是决定模拟价值的东西。
如果你刚开始接触这个方向,建议从二维平面应变、单裂缝的模型起步,先跑通一个最简单的算例,再逐步增加复杂度。等你能熟练解释每一个参数对结果的敏感程度时,你也就真正把水力压裂和孔弹性耦合这套东西吃透了。