搞过注浆模拟的人大概都有同感:注浆这件事,最坑的不是建模,而是浆液本身的力学性质。工程上常用的水泥浆、化学浆,很多都属于宾汉姆流体,有屈服应力。压力不够时它纹丝不动;一旦超过屈服应力,又立刻开始流动。再加上浆液流动会改变岩体受力状况,岩体变形反过来又会影响浆液流动通道,这种相互耦合,做数值模拟时真的能把人绕晕。我这段时间在 COMSOL 6.4 上专门做裂隙岩体注浆的流固耦合数值模拟,关于宾汉姆流体注浆这块踩了不少坑,也积累了一些能提高效率的经验。这篇就把建模思路、耦合实现、求解调试和常见错误的完整过程整理出来,给正在用或者准备用 COMSOL 做岩土注浆的朋友做个参考。
1. 模型选型的底层逻辑:为什么是 COMSOL,为什么是宾汉姆流体
1.1 宾汉姆流体本构与注浆场景的匹配关系
先别急着把几何模型拉起来,第一步要把流变模型选对。水泥净浆、部分化学浆、还有矿山防灭火用的高浓度浆液,在静置状态下都有一定的结构强度,只有外部剪切应力大于某个临界值后才会发生持续流动。这个临界值就是屈服应力。数学上写成:
τ = τ_y + μ_p·γ_dot 当 τ > τ_y 时 γ_dot = 0 当 τ ≤ τ_y 时
其中 τ_y 是屈服应力,μ_p 是塑性粘度,γ_dot 是剪切速率。COMSOL 的层流模块默认是牛顿流体,粘度恒定,直接用肯定不行。我一般是在“流体属性”节点里把粘度改成用户自定义表达式,做一个连续性正则化处理,形式类似:
μ_eff = μ_p + τ_y / (γ_dot + ε)
这里的 ε 是一个很小的正则化参数,作用是避免 γ_dot 等于零时粘度无穷大。如果不加这个参数,数值求解器会在屈服区附近直接崩掉。ε 的典型取值可以先从 1e-3 试起,收敛了再慢慢往下压。这里需要提醒一句:ε 不是越小越好,太小会让非线性求解器的雅可比矩阵出问题,太大又会把屈服区的“刚性”抹平,导致浆液在低剪切速率下也出现虚假流动。
注浆场景里选宾汉姆模型而不是更复杂的 Herschel-Bulkley 模型,主要原因是工程上最关心的是扩散半径、注浆压力、浆液锋面位置这些宏观量。在常见的注浆剪切速率范围内,纯宾汉姆模型已经能抓住核心行为。如果后续想考虑剪切变稀,可以在塑性粘度项上叠加幂律修正,但不建议一上来就上全套流变学模型,否则你会同时面对流变参数辨识和多物理场耦合双重困难。
1.2 为什么选 COMSOL 而不是 Fluent 或 FLAC3D
我自己也试过其他工具,简单对比一下:
| 工具选项 | 流固耦合实现难度 | 自定义本构能力 | 网格变形支持 | 适合场景 |
|---|---|---|---|---|
| COMSOL Multiphysics | 多物理场直接耦合,设置相对集中 | 表达式和 PDE 自定义灵活 | 支持移动网格和变形几何 | 耦合机理研究、参数敏感性分析 |
| Fluent | 流体强项,固体场需要结构求解器联合 | 非牛顿模型内置较丰富 | 动态网格能力尚可,但配置偏繁琐 | 偏纯流动、两相流,弱耦合居多 |
| FLAC3D | 热-流-固耦合有内置框架 | 本构开发门槛高 | 大变形容易,但流体细节不足 | 岩土大变形、离散裂隙网络 |
COMSOL 的最大价值在于它能把层流、达西流动、固体力学、移动网格放进同一个模型里,用一套有限元离散方法统一求解。注浆问题本质上是“浆液在裂隙或孔隙中流动”和“岩体变形”之间的强耦合,压力场既是流体的结果,又是固体的荷载源,这种交叉效应在 COMSOL 里表达起来非常直白。另一个优势是它支持参数扫描和批量计算,后面做多工况对比时能省很多时间。当然 COMSOL 也不是万能,遇到特别复杂的裂隙网络或者劈裂注浆大变形,还是需要结合离散元工具。我以前也混用过颗粒流和有限元,但就“快速搭建一个可调参数的耦合模型”这件事来说,COMSOL 的性价比在工程研究里是很高的。
2. 注浆问题的几何翻译与模型简化
2.1 从现场到模型:单裂隙与等效多孔介质怎么选
注浆对象不同,几何简化方式完全不同。我在项目里主要处理的是岩体裂隙注浆,初期不能把现场几万条裂隙全部导进来,否则网格量和接触判断都会失控。工程上最常用、也最容易跑通的做法是“平板裂隙模型”:把一条主要裂隙抽成一个很薄的通道,裂隙两侧是弹性的岩体,注浆孔位于通道中心。
如果是破碎岩体或土层,则可以把岩土体等效为多孔介质,只研究宏观扩散。COMSOL 里可以用“达西定律”或“布鲁克曼方程”描述浆液渗透过程。我的建议是问题初期尽量用二维轴对称模型,注浆孔中心,外围一定半径的岩土体,二维模型跑通机制后再扩展三维。因为流固耦合的非线性很强,一上来就建三维裂隙网络,光网格剖分和解算收敛就能卡住大半个月。
以单裂隙轴对称模型为例,几何尺寸大致如下:注浆孔半径 0.05 米,裂隙带厚度 0.001 米,裂隙长度或模型半径 5 米,外围岩体厚 1.5 米。这个模型里裂隙宽度的量级只有毫米级,而岩体尺寸是米级,几何纵横比非常夸张,网格划分时需要在裂隙内部做细化。
2.2 岩体侧的有效应力关系与固体域设置
固体部分我通常选择“固体力学”接口,本构先用各向同性弹性模型。这听起来很基础,但大多数工程问题第一阶段关心的是压力扩散和裂隙开度变化趋势,弹性假设足够支撑这个目标。如果涉及劈裂注浆或塑性损伤区,那才需要加入塑性本构,那属于第二阶段。
耦合关系上要抓住的是有效应力原理。浆液压力 p 作用在裂隙壁上,岩体内的有效应力变化为 σ′ = σ_total − p 。在 COMSOL 里就是给固体边界施加一个法向压力载荷,载荷大小等于流体压力。固体变形后,裂隙开度 h 发生变化,又反过来改变流动通道的截面积。这种“压力—变形—通道变化—压力重分布”的循环就是流固耦合的本质。
固体远边界通常设置为固定约束,注浆孔壁和裂隙面处设置为流体压力载荷。初始状态可以为无应力状态,即让模型从自然状态开始,通过瞬态求解观察应力在压力传播过程中的逐步积累。
3. 核心难点:流固耦合的数值实现
3.1 用哪个物理场描述浆液流动:层流、达西还是布鲁克曼
这是很多新手卡住的第一道坎。我的经验是:裂隙内部用层流,基质岩体用达西定律。不要把整个模型通通塞进一个物理场接口里。
裂隙中的浆液是有明显速度梯度的剪切流动,需要求解纳维-斯托克斯方程,所以用层流接口。浆液是非牛顿流体,就把修改后的粘度表达式填进层流模块;裂隙两侧的岩体里,浆液可能还会渗透一部分,但速度很小,压力梯度起主导作用,用达西定律接口,渗透率取岩体实际渗透率。
如果有明显的过渡区,比如裂隙壁面附近有破碎带,渗透率较高,用布鲁克曼方程会更合适。布鲁克曼可以看成是达西定律和纳维-斯托克斯方程之间的桥梁模型,能处理过渡区域的惯性效应。但注意,布鲁克曼会带来额外的速度自由度,计算量明显上升。
COMSOL 里做这类分区耦合时,我一般把裂隙层流区和岩体达西区通过“压力连续”和“流量连续”边界条件连接起来。如果模型里只有一个裂隙,也可以把裂隙视为内部薄层,用“裂隙流”特征来处理,它本身提供横跨裂隙面的流量-压力关系,非常适合毫米级裂隙建模。
3.2 双向耦合的实现思路与移动网格取舍
双向耦合是这篇文章最想聊透的地方。流体对固体的作用很直接:把层流计算得到的压力场施加到固体边界上作荷载。固体对流体的反向作用,核心在于“裂隙开度变化如何反馈到流动通道里”。
这里有两种实现路径:
路径一:移动网格(ALE / 变形几何)。COMSOL 里可以启用“移动网格”接口,把流体域的边界位移与固体力学计算的位移关联起来。裂隙边界在压力作用下发生位移,网格跟着移动,通道宽度直接由网格几何变形反映。这种方式物理意义清晰,但只适用于变形量不大的工况。裂隙开度如果从 1 毫米变成 5 毫米,网格单元拉伸严重,很容易出现单元反转,导致计算崩溃。
路径二:等效开度更新。把裂隙开度 h 定义为模型参数或全局变量,在每个时间步结束后,用固体的法向位移增量更新 h,再把这个更新后的 h 带回到流场的渗透率或速度边界条件里。这是一种单向写在数值上的“半耦合”,但对很多工程问题已经够用,而且数值稳定性好太多。
我个人在实际项目中做“压密注浆”和“裂隙扩张监测”时,更偏好路径二。因为注浆泵压力常常在几个小时内逐步上升,裂隙开度的变化是渐进的,不需要每个时间步都去做网格重划分。如果把很薄的裂隙移动网格和大固体域耦合在一起,求解器的负担几乎翻倍,而且失败率成倍增加。
3.3 边界条件与初始值的设置细节
注浆孔的边界条件可以选压力入口或流量入口。压力入口最简单,设置 p = p_in;流量入口则要把注浆流量 Q 换算成入口速度或法向通量。如果用轴对称模型,入口边界是一个圆弧面,面积随开度变化,流量换算时要注意使用实际开度 h,而不是初始开度 h0。
出口边界设在模型远端,通常取压力为 0 或渗流出口常压。如果是对称模型,对称轴处要设置对称边界,不要让浆液速度矢量穿过对称轴。固体边界上,注浆孔壁和裂隙面是压力载荷边界,模型底边和外边可以设为固定约束。
初始值我强烈建议设为零压力、零速度、零位移,然后通过“先稳态后瞬态”的方式加载。比如先算一个只有 10 kPa 入口压力的稳态解,把初始压力场和位移场垫底,再进行瞬态过程。否则从零直接加载到 1 MPa 注浆压力,非线性求解器一开始就会发散。
4. 参数与单位:一份可以直接抄的清单
4.1 典型岩土注浆参数表
参数设置是整个模拟里最需要耐心的一环。这里给出我在工程模拟里常用的初始参数范围,大家可以参考使用,但最终必须根据你自己的浆液配比和现场岩体试验数据标定。
| 参数名称 | 符号 | 典型取值范围 | 注意事项 |
|---|---|---|---|
| 浆液密度 | ρ | 1300~1500 kg/m³ | 水灰比影响明显 |
| 屈服应力 | τ_y | 5~20 Pa | 现场浆液实测为准 |
| 塑性粘度 | μ_p | 0.02~0.1 Pa·s | 搅拌时间影响显著 |
| 正则化参数 | ε | 1e-3~1e-6 1/s | 越小越精确但越难收敛 |
| 裂隙初始开度 | h0 | 0.5~2 mm | 现场压水试验反算 |
| 岩体弹性模量 | E | 5~20 GPa | 裂隙岩体取低值 |
| 岩体泊松比 | ν | 0.2~0.3 | 常规取值 |
| 岩体渗透率 | k | 1e-13~1e-16 m² | 破碎带偏高 |
| 注浆压力 | p_in | 0.5~2 MPa | 按施工设备能力 |
| 注浆流量 | Q | 30~60 L/min | 用于流量入口换算 |
4.2 单位陷阱与不同量级变量的处理
COMSOL 默认单位制是国际单位制,所有表达式中 MPa 必须写成 1e6 Pa,剪切速率用 1/s,粘度单位是 Pa·s。很多刚上手的朋友直接在“注浆压力”参数里填 0.5 或 2,结果发现压力严重偏小,整个流场推不动。这是因为入口压力边的默认单位是 Pa。
另一个容易忽略的是流动尺度与固体尺度的巨大差异。裂隙开度只有 0.001 米,但岩体边界可能是 5 米远,网格尺度差异达到几千倍。这种情况下,求解器的容差设置很关键。我习惯把“容差因子”从默认的 1 调整到 0.1,让非线性迭代更严格,虽然计算时间会变长,但至少能避免那种快到收敛终点又突然崩掉的奇葩局面。
从参数角度看,还要注意量纲交错问题:层流接口里的粘度是运动学粘度还是动力学粘度?COMSOL 的“层流”接口默认处理的是动力学粘度,单位 Pa·s,不是运动粘度 mm²/s。如果你习惯看浆液流动度报告上的表观粘度数据,需要先把单位换算清楚再填。我至少见到两个项目因为把运动粘度当成动力粘度用,导致雷诺数莫名其妙偏大,结果模拟出来的浆液飞得到处都是,明显违背工程常识。
5. 求解配置与调试细节:从“跑不通”到“跑得顺”
5.1 网格剖分:裂隙区域必须做足文章
网格剖分决定了非牛顿流体剪切场能不能算准。裂隙内不要只画一层网格,这会直接扼杀剪切速率梯度。一个简单的方法是在裂隙厚度方向上设置至少 4~6 层网格,或者在裂隙边界上添加边界层网格,让近壁处的剪切速率解析得更充分。如果裂隙宽度是 0.001 米,那么每层网格厚度大约 0.0002 米,这在裂隙域里其实很稀疏,但已经足够反映抛物线速度剖面的大致形状。
对于外部的岩体,可以使用扫掠网格或自由四面体网格,但裂隙附近要逐渐过渡。COMSOL 的“流体动力学”预校准网格尺寸通常比较保守,我建议从“较细化”开始试算,然后逐步加密,直到浆液前锋位置不再随着网格加密而显著变化。这种“网格无关性验证”不仅要盯着速度看,还要盯着裂隙开度变化看。
还有一个小细节:如果移动网格启用了,流体网格和固体网格之间的接口要设置成一致边界层,否则在边界上计算压力载荷时会出现局部应力振荡。我遇到过因为网格密度不匹配导致裂隙开度呈现锯齿状分布的问题,最后通过加密边界层并统一接缝网格解决。
5.2 粘度正则化参数的调参节奏
前面提到粘度表达式里有一个正则化参数 ε,实际调试时的步伐是这样的:先设 ε = 0.01 把模型跑通,观察压力场和速度场分布。如果流动区域都正常,再把 ε 降低一个量级,比如 0.001,重新计算。如果此时出现不收敛,不是急着继续降 ε,而是检查局部剪切速率是否被网格分辨率抹平了。很多时候不是 ε 的问题,而是裂隙网格太粗,剪切速率算不准确,才导致粘度突变尖锐。
我把这个操作称为“从糊到清晰”的逐步逼近策略。这个过程还能帮你诊断本构模型是否设置正确:如果调大 ε 后,浆液锋面出现大范围“弥散”,说明屈服区附近的虚假流动过于明显。一个更稳健的替代表达式是:
μ_eff = μ_p + τ_y / sqrt(γ_dot² + ε²)
这个形式比线性正则化平滑些,在低剪切速率区的渐近行为更好。不过具体用哪个,取决于你流变实测数据的拟合情况。我的建议是两种都试,选一种能兼顾收敛和历史拟合精度的。
5.3 求解器与时间步的控制经验
注浆瞬态过程往往持续几十分钟到几个小时,但数值求解不需要也不应该把每个物理秒都算一遍。我在 COMSOL 里通常启用“瞬态研究”,求解器用 BDF,阶数设定为 1~2。最大时间步长可以按“裂隙中浆液流动特征时间”来估算。比如裂隙长度量级 5 米,入口速度量级 0.01 米/秒,特征时间是 500 秒。如果最大时间步跨到几千秒,前锋位置一步就飞过整个模型,模拟结果就没有意义。
实际操作中,我反而习惯把最大时间步锁在 10 秒以内,尤其是在注浆开始的前 30 秒内。这个阶段压力骤升、前锋快速扩展,最容易发散。等压力场基本稳定后,再把最大时间步逐步放大到 50 秒或 100 秒。COMSOL 的自适应时间步长已经做得不错,但注浆这种强非线性问题不能完全交给自动控制,必须给上限约束。
如果遇到反复不收敛,还有一个笨但有效的方法:周期性重置。先跑一个很短的时间区间,比如 0 到 1 秒,如果这一秒内迭代到收敛,再继续往下加时间区间。这个方法不优雅,但能帮助你快速定位模型里最脆弱的时间段和位置。
6. 后处理与工程结果解读:别只会导图
6.1 浆液扩散锋面应该怎么追踪
很多人问,COMSOL 里怎么才能像试验那样直观看到浆液边界?层流接口本身不追踪组分,需要额外增加一个“假定浓度”或者“红细胞运输”之类的方式,但更轻量化的做法是自定义一个辅助变量,初始值为 0,在注浆孔边界设为 1,通过对流扩散方程求解。这个辅助变量可以把浆液和水区分开,后处理时绘制值为 0.5 的等值面,也就是所谓的浆液锋面。
不过要注意,如果只是追踪锋面,必须保证对流项占主导。数值扩散太大时,锋面会变得模糊,看起来像浆液被稀释了。这时需要用迎风型离散格式,或者加密前锋区域的网格。我在现场报告里通常给出的曲线是“注浆扩散半径—时间曲线”,直接从前锋位置提取数据。
如果不想加额外温度或浓度方程,也可以利用粘度场本身。因为浆液的粘度远高于水,速度场中粘度阶跃的位置大致就是锋面位置。这个方法虽然粗糙,但对快速筛查很管用。
6.2 耦合效果如何在后处理中证明
流固耦合做得好不好,不能只看云图漂不漂亮,要看两条核心曲线:注浆孔压力随时间的变化,和裂隙开度随时间的变化。如果开度在注浆过程中几乎没有变化,说明耦合效应在你的模型里并不显著;如果开度快速增大,压力却突然下降,说明发生了裂隙扩张主导的压力松驰。
我通常会把“是否考虑流固耦合”的两个模型并排计算,提取同一注浆时刻的压力分布和开度变化曲线进行对比。这种对比不仅为了出版,更为了让你自己确认模型设置是不是出了问题。比如我发现开度变大后,相同流量条件下的入口压力下降了 20%~30%,这个趋势是否合理,需要根据现场注浆泵的压力记录判断。如果现场压力曲线明显比较平缓,而数值结果剧烈震荡,那多半是网格或时间步的问题,不是物理现象。
后处理时还要注意提取固体侧的应力结果。很多人只展示浆液压力云图,把岩体应力全忽略掉。实际工程里我们关心“会不会压裂”和“在哪压裂”,所以至少要把最大拉应力区域和浆液压力等值线叠合展示。这种“双颜色+等高线”的图,在给业主汇报时比单张云图有用得多。
7. 常见问题与排查实录:我踩过的坑,你大概率也会踩
7.1 四种最典型的失败现场
| 现象 | 可能原因 | 我的排查思路 |
|---|---|---|
| 求解一开始就报未定义值 | 粘度表达式分母为零,或渗透率/开度参数为负 | 检查 ε 是否过小;给开度增加下限约束 |
| 压力场震荡呈锯齿状 | 裂隙内网格过粗,剪切速率离散误差大 | 对裂隙做边界层加密,降低时间步长 |
| 移动网格单元反转崩溃 | 裂隙变形过大,ALE 变形能力不足 | 改用等效开度更新,或采用重新网格化 |
| 结果云图上浆液“一片模糊” | 对流占比较低,数值扩散严重 | 提高网格分辨率,采用迎风型离散 |
这里面最常见的还是第一类。因为非牛顿粘度自定义表达式里,任何一处除零都会瞬间把整个雅可比矩阵污染,导致求解器直接“原地暴毙”。我的习惯是给所有可能为负的几何变量加一个 max 函数保护,比如在渗流模型的渗透率更新里写 k = max(k_min, k_updated),在裂隙开度更新里写 h = max(1e-4, h_updated)。这种强制约束在物理上对应着裂隙不会完全闭合,在数值上则避免负数渗透率引起的求解崩溃。
7.2 我的分步调试习惯:先解耦,再耦合
做这种强耦合模型,我总结了三个字:别硬刚。所有调试必须遵循“先单物理场,再多物理场;先稳态,后瞬态”的路线。
第一步,把流体物理场和固体物理场彻底拆开。只保留层流接口,设置固定开度,跑纯流动问题,确认宾汉姆粘度表达式和边界条件是否正常。如果纯流动都收敛不了,先解决粘度和网格问题。
第二步,只跑固体。用固定的经验压力场施加在裂隙面上,计算岩体位移和应力,检查变形量是否合理。
第三步,再打开多物理场耦合。此时两边单场都已经没问题,耦合引入的困难只集中在数据传递和移动网格上,排查范围小很多。我几乎每一次遇到疑难杂症都是靠这个“分步法”定位问题,而不是在耦合模型里盲目地改参数。盲目改参数的后果是,你可能花了几天时间调了一堆参数,最后发现是边界条件类型选错了。
8. 后续扩展方向:从“能模拟”到“模拟得有意义”
8.1 从二维到三维:什么时候值得升级
二维轴对称模型适合前期机理研究和参数敏感性分析,但真实工程中的注浆孔往往倾斜,裂隙走向也有方位角,不是严格轴对称。如果要做三维模型,建议先把二维模型的参数体系校准好,再扩展成三维裂隙平面模型。三维模型里裂隙可以表示为一个曲面,岩体用四面体网格,层流区用用户定义的曲面厚度来建模。
三维模型的网格量会呈几何级数增长,这时候就要学会合理妥协。比如可以把远场岩体压缩成一个“吸收边界”,或者用远场无限单元,避免整个 100 米尺寸的岩体都进入网格。这在 COMSOL 里实现并不复杂,但对计算资源的节省非常明显。
8.2 考虑粘度时空变化和劈裂注浆的进阶思路
工程实际中浆液的冷却和水化反应不可忽略,浆液粘度会随时间增长。最简单的改进方法是在流变参数里加入时间函数,比如 τ_y = τ_y0 × (1 + k_t·t),让屈服应力随注浆时间慢慢爬升。但纯时间相关函数不太符合物理逻辑,因为同一时刻不同位置的浆液龄期并不同,更严格的做法是耦合一个龄期变量或温度场,让粘度跟随龄期演化。
劈裂注浆是另一个进阶方向。当注浆压力超过岩体起裂压力时,裂隙会突然扩展,开度产生突变,这时候弹性本构和移动网格都不够用了。可以考虑在固体域中加入内聚力区模型,或者把裂隙扩展区域单独挖出来,设置临界拉应力作为起裂判据。这个方向目前还在研究阶段,没有统一的工程模板,但确实值得继续投入。
回到我自己的经验,数值模拟做得再好,最后还是要回到现场数据这条唯一的标尺。我习惯把每次模拟结果和现场压力记录、注浆量记录放在同一个坐标系里对比,如果偏差超过 20%,先不调整模型参数,而是检查简化假设是否超出了适用边界。注浆是隐蔽工程,地表看不到浆液怎么跑,数值模拟能帮我们打开这层黑盒,但也只是帮我们看得更清楚,不能替我们拍板。把模型当工具而不是答案,是这几个月下来我最想分享的一条心得。