ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

COMSOL三维离散裂隙注浆模型:宾汉姆流体与粘度空间衰减实现

COMSOL三维离散裂隙注浆模型:宾汉姆流体与粘度空间衰减实现 COMSOL三维离散裂隙注浆模型是我这段时间一直在啃的方向。三维离散裂隙网络DFN下的注浆模拟难点从来不是软件操作而是怎么把“浆液在粗糙裂隙里怎么走”这件事儿用数学和物理模型说圆。这个题目把宾汉姆流体、粘度空间衰减、随机圆盘裂隙这几个核心要素都点出来了正好是当前岩土注浆仿真里最有代表性的组合。这篇文章我打算从工程视角切入先讲清楚每个物理要素背后的真实需求再给出一套可以直接在COMSOL里落地的建模方案包括几何生成、边界条件设置、粘度衰减的用户自定义函数写法以及求解器配置的坑。全程用我自己的实操经验来串保证你看完能直接上手。1. 项目到底在解决什么问题注浆仿真不只是“画个模型”1.1 为什么三维离散裂隙模型比等效连续介质模型更接近现实我们做注浆设计最终关心的是浆液在地层里扩散到了什么范围、充填了哪些裂隙、堵水效果如何。传统做法是把岩体等效成多孔连续介质用达西渗流来模拟注浆扩散。这套办法在均质土体里好使但放在节理裂隙发育的岩体里就很尴尬——浆液实际上走的是裂隙“通道”不是均匀地从孔隙里挤过去。离散裂隙网络DFN模型的思路是把岩体里的裂隙抽象成一个个单独的几何对象比如圆盘、多边形然后让浆液严格在这些裂隙面内流动。这个思路和实际物理过程是吻合的浆液确实只在开度较大的裂隙里跑得快在微裂隙和岩块孔隙里几乎不动。用DFN模型你可以明确看到浆液沿着某条优势裂隙窜出去多远哪个区域没被充填这对注浆孔的布置和注浆参数的确定非常有指导意义。1.2 圆盘裂隙假设的合理性边界什么时候能用什么时候必须放弃随机圆盘裂隙模型是DFN体系里最经典的几何简化。每一组裂隙用一个圆盘来表示圆盘的位置服从随机分布半径服从幂律分布或对数正态分布倾角和倾向按Fisher分布或均匀分布来生成。圆盘和圆盘之间通过相交线形成连通网络浆液就在这个网络里迁移。圆盘假设的逻辑是大部分自然裂隙的平面展布形态接近圆形或椭圆形用一个等效圆盘来近似几何上简单数学上也好处理。在COMSOL里生成圆盘裂隙网络比生成多边形裂隙方便得多因为圆盘之间的相交检测和布尔运算在几何内核层面更稳定。但要注意圆盘模型天然假设裂隙是平直的、开度均匀的如果实际工程里裂隙受构造影响强烈弯曲或者开度变化剧烈圆盘模型的误差就会增大。这时候你需要考虑多边形裂隙甚至曲面裂隙代价是几何复杂度大幅上升求解耗时也成倍增长。1.3 宾汉姆流体注浆浆液的真实流变学“人格”水泥基浆液不是水也不是牛顿流体。它的核心特征是存在一个屈服应力τ₀。当剪应力小于τ₀的时候浆液根本不流动像一个固体只有当剪应力超过τ₀浆液才开始像液体一样流动。这个“要突破一个门槛才肯动”的属性决定了注浆扩散的最终形态——浆液不会像地下水那样无限扩散达到最大扩散半径之后自然停止。宾汉姆流体的本构关系写成公式就是τ τ₀ μ·γ̇ 当 τ τ₀其中τ是剪应力τ₀是屈服应力μ是塑性粘度γ̇是剪切速率。这个模型抓住了浆液的两个关键参数屈服应力决定了浆液能跑多远塑性粘度决定了浆液跑得快不快。在COMSOL里宾汉姆流体不能直接作为材料属性赋值因为它的本构关系在τ τ₀的区间是不连续的。常用的处理办法是用正则化方法把理想宾汉姆模型近似成双粘度模型或者Papanastasiou模型。1.4 粘度空间衰减这个“细节”才是决定扩散形态的胜负手很多初学COMSOL注浆仿真的同学不管三七二十一直接把浆液的粘度设成一个常数。这样算出来的结果浆液扩散形态是均匀的、对称的看着非常漂亮但和工程实际完全对不上。真实情况是水泥浆液在裂隙里流动的同时水泥颗粒在不断水化浆液粘度随时间的推移持续上升同时浆液从注浆孔向远处扩散的过程中水分会向裂隙壁面渗滤导致浆液浓度升高、粘度增大。更直接地说靠近注浆孔的地方浆液新鲜、粘度低扩散前锋位置的浆液因为水化时间长和渗滤效应粘度明显更高。这个从注浆孔到扩散前锋的粘度梯度就是题目里说的“粘度空间衰减”——严格来说是“随空间变化的粘度场”或者“粘度空间分布”。粘度空间衰减对扩散形态的影响非常大。如果粘度恒定浆液会均匀地向外扩散如果粘度随距离衰减靠近孔口低、远端高浆液前锋的推进速度会越来越慢扩散形态更接近实际工程里观察到的“短粗”形态。要是反过来——不可思议但确实有论文这么干——粘度随距离增大而降低那浆液就会像脱缰的野马一样沿着裂隙窜出很远扩散半径虚高设计值就偏危险了。所以在模型里我们不能把粘度设成常数而是要用用户自定义函数让它随到注浆孔的距离变化。这个看似不起眼的设定恰恰是模型能否反映工程实际的关键分水岭。2. COMSOL建模全流程拆解从几何生成到方程落地2.1 项目整体思路把“浆液从钻孔进入裂隙网络”这件事拆成三个子问题整个建模过程我习惯拆成三个子问题来逐个击破第一个是几何问题如何在COMSOL里生成随机圆盘裂隙网络并和注浆孔的空间位置正确咬合。第二个是流动物理问题宾汉姆流体在裂隙网络里的流动控制方程怎么设屈服应力和粘度衰减怎么塞进方程里。第三个是求解问题三维裂隙网络几何非常复杂网格动辄几百万单元怎么配置求解器才能算得动、算得稳。把这三个子问题都想清楚了再动手建模就会非常有条理。否则很容易陷入COMSOL操作细节的泥潭里——设置了半天边界条件结果发现几何有问题全盘推翻重来。2.2 随机圆盘裂隙几何在COMSOL里的生成策略手动、外部导入还是脚本驱动COMSOL不是专业的DFN生成工具直接在GUI里手动画几十个随机圆盘不现实。我试过三种方案逐个说一下优劣方案一直接在COMSOL里用“Work Plane”或“Geometry”节点里的圆盘特征配合全局参数来生成。适合裂隙数量很少比如个位数的教学模型。缺点是裂隙数量一多手动输入参数的工作量大得惊人。方案二先用Python脚本配合NumPy或专门的DFN库生成裂隙圆盘参数表导出为文本文件再在COMSOL里通过“几何导入”功能把圆盘一个个加进来。这个方案灵活性最高推荐。具体做法是在Python里生成圆盘的中心坐标、半径、法向量保存成CSV或TXT然后在COMSOL里写一个小循环比如用“Application Builder”或“Method Editor”读取参数文件并自动创建几何对象。方案三直接用COMSOL的“参数化扫描”或“内置函数”配合随机数发生器在软件内部生成圆盘参数。这个方法可以做到完全参数化修改裂隙密度或者圆盘半径分布都很方便但要注意COMSOL内置的随机数发生器在使用时需要固定随机种子否则每次建出来的模型都不一样不利于结果的复现和对比。我个人的习惯是用Python生成参数文件固定随机种子这样每一次建模都可以严格复现。2.3 裂隙网络连通性的判定为什么需要定期检查裂隙相交情况生成几何之后不能急着划分网格。三维离散裂隙模型里最致命的问题就是“孤立的裂隙”——浆液从一个裂隙流到另一个裂隙前提是它们必须相交。如果圆盘之间没有交点整个裂隙网络就是一堆互不连通的碎片注浆从钻孔进去之后只能在局部的几个圆盘里打转。检查连通性的办法是计算圆盘之间的距离和夹角判断它们是否相交。COMSOL里不太好可视化地检查相交关系我习惯的做法是先在Python里做一次预处理剔除那些与主裂隙网络不连通的孤立圆盘或者调整圆盘位置让网络形成一个整体。这里有一个小技巧把圆盘的半径适当放大5%~10%可以有效提高网络的连通率代价是裂隙密度会略微偏高。对于注浆仿真来说这个偏差是可以接受的。2.4 钻孔与裂隙的耦合注浆源项的施加方式注浆孔和裂隙网络的耦合方式直接决定了源项怎么加。在真实工程里注浆孔是垂直于地表钻进岩体的浆液通过钻孔壁上的射浆孔进入裂隙。在模型里我用圆柱体来表示注浆孔圆盘裂隙从孔身的不同高度穿过。在COMSOL里这一步用“布尔操作”里的“并集”或“交集”来处理把注浆孔圆柱和圆盘网络合并成一个完整几何然后通过“Form Union”形成装配体。几何处理好之后源项的位置就明确了——就在注浆孔壁与裂隙的交界处。可以用“边界”上的“流入”条件来施加注浆压力或注浆流速也可以用“域”上的“源项”来近似。对于恒定注浆速率的情况我通常用流量边界条件单位是m³/s作用在注浆段的裂隙边界上对于恒定注浆压力的情况直接用压力边界在COMSOL里设置起来更简单。3. 粘度空间衰减和宾汉姆流体的实现细节这才是模型的核心3.1 裂隙内宾汉姆流体流动的控制方程从广义牛顿流体到雷诺润滑方程在裂隙中流动的浆液控制方程和管道流动类似。裂隙开度b很小浆液在面内的流动可以类比为两个平行平板之间的流动也就是经典的“立方定律”的推广版本。对于宾汉姆流体在平行板裂隙中流动时存在一个未剪切的“活塞流”区域中心的浆液像固体一样整体前进。这一段的流速分布和压力梯度之间的关系不再是线性的不能用达西定律直接描述。在实际的COMSOL建模中我不会去显式求解宾汉姆流体的完整速度分布那需要解析解而且非常复杂而是把裂隙内的流动等效成一种“广义牛顿流体”——用一个等效粘度μ_eff来替换宾汉姆流体的本构关系然后在达西定律或裂隙流方程的框架下求解。具体的做法是写出宾汉姆流体的流量-压力梯度关系式反解出等效粘度。这里给出常用的三参数近似μ_eff μ_pl · (1 τ₀·b / (6·μ_pl·v̄))²其中μ_pl是塑性粘度τ₀是屈服应力b是裂隙开度v̄是平均流速。这个表达式来自Bingham流体在平行板间流动的解可以理解为流速越低屈服应力占的比重越大等效粘度越高浆液越“稠”。用等效粘度替换之后COMSOL里的裂隙流控制方程就和牛顿流体的形式一致了可以直接套用软件现有的求解框架。3.2 用COMSOL的“裂隙流”接口还是“达西定律”接口COMSOL里和裂隙流动相关的接口有“达西定律Darcy”接口还有在较新版本里专门为裂隙流开发的“裂隙流Fracture Flow”接口。对于三维圆盘裂隙网络来说我的建议是能用裂隙流接口就优先用裂隙流接口。它的核心优势在于把裂隙的几何降维处理成二维流面裂隙开度b作为等效厚度参数直接嵌入到控制方程里。这样几何上仍然是三维的但物理上等价于求解二维流动计算量比三维实体网格小一个数量级。在裂隙流接口里你需要在每个圆盘域上设定“开度”参数。不同位置的裂隙开度可以不同可以在“域”设置里用不同的值也可以用函数随圆盘半径变化。COMSOL里设定开度的地方在“Fluid and Matrix Properties”节点这里有一个“Fracture Thickness”参数直接填入数值或表达式即可。3.3 粘度空间衰减怎么落地写一个随径向距离变化的用户自定义函数粘度空间衰减在COMSOL里的落地方法非常直接把粘度定义成一个随到注浆孔中心距离变化的函数。具体操作是在“Global Definitions”下新建一个“Analytic”函数比如命名为mu_degrade(r)表达式里引用到孔心的距离变量。注意COMSOL里“到某点的距离”需要通过内置变量来实现。在裂隙流接口里你可以用“Dist”或自己定义变量来计算到注浆孔中心的距离。这里有个常见的坑在三维模型里坐标变量是x、y、z如果你直接用sqrt((x-x0)^2(y-y0)^2(z-z0)^2)来计算距离注意语法要对尤其在裂隙流接口里COMSOL会自动把三维坐标投影到裂隙切平面上变量的含义要确认清楚。我通常的做法是定义一个变量d_well表达式为sqrt((x-x0)^2(y-y0)^2)这里假设注浆孔沿z向、注浆段中心在(x0, y0)位置。然后粘度的表达式可以是μ μ_0 · (1 α · (d_well / R_max)^β)其中μ_0是孔口附近浆液的初始粘度α是增长系数β是衰减指数R_max是最大设计扩散半径。这样写的好处是粘度从注浆孔向外平滑增大到扩散边界处达到最大值。参数α和β需要根据浆液的实际流变试验数据来拟合如果暂时没有数据α取0.5~1.0、β取1~2是合理的起步范围。3.4 等效粘度里同时塞进屈服应力和粘度衰减一个混合表达式宾汉姆流体的屈服应力效应和粘度空间衰减效应在模型里并不是互斥的。理想的做法是把两个效应都放进等效粘度里。我把等效粘度写成以下形式μ_eff _total μ_pl (r) · (1 τ₀(r) · b / (6 · μ_pl (r) · v̄))²其中μ_pl(r)和τ₀(r)都可以是到注浆孔距离的函数。比如μ_pl(r)按上面说的衰减函数变化τ₀(r)也可以随距离增大而增大——实际上水泥浆液水化越充分、浓度越高屈服应力也会上升。这样一个表达式同时表达了“浆液在远距离处更稠、更难流动”和“屈服应力导致浆液停止扩散”两个物理过程。在COMSOL里实现这个表达式的方式是先在“模型定义”节点下创建变量比如visc_eff初始值写上上面那一长串表达式。然后在“裂隙流”物理接口的“流体属性”里把动力粘度指定为这个变量。注意如果表达式涉及流速v̄而v̄本身是求解变量那么这个粘度场就是非线性的——COMSOL会用多次迭代来收敛你需要在求解器设置里打开“非线性”选项确保迭代次数足够多。3.5 移动网格与界面的处理要不要做浆液前沿追踪很多人第一次做注浆仿真时都会下意识地问要不要用移动网格来追踪浆液和水的分界面答案是如果追求的就是最终扩散范围和充填形态用“固定网格饱和度扩散”的思路就够了——把浆液浓度或饱和度当成一个被动标量在裂隙流场里输运通过监视“饱和度0.5”的等值面来确定扩散前沿。这个方法稳定、计算量小而且在工程精度范围内完全够用。移动网格当然更精细能捕捉到真实的浆液-水界面形态但要付出巨大的计算代价而且三维裂隙网络本身几何就复杂移动网格极其容易发生单元畸变和拓扑失效。我的建议是除非你有明确的科研需求要研究前沿形态的细部特征否则不要上移动网格。用“被动输运等值面提取”的方式在COMSOL里就是加一个“稀物质传递Transport of Diluted Species”物理接口把浆液浓度作为因变量扩散系数设成极小值甚至可以改成纯对流扩散系数设成0再用流速场作为对流速度。求解之后切一个三维等值面浆液的扩散形态就出来了。4. 实操过程详解从参数设置到求解运行的完整步骤4.1 材料参数和浆液参数的初始设定先搭好一个可复现的参数骨架在开始建模之前我建议先把所有参数集中写在COMSOL的“参数”表里。这样后面修改参数时不用到处找直接改一行就完事。下面给出我常用的初始参数表可以直接复用参数数值单位说明b0.001m裂隙开度mu_00.05Pa·s孔口处浆液初始塑性粘度tau_05Pa浆液屈服应力alpha0.81粘度衰减增长系数beta1.51粘度衰减指数R_max5m最大设计扩散半径Q_in0.01m³/s恒定注浆速率rho1800kg/m³浆液密度p_out101325Pa裂隙远端出口压力大气压这套参数来自室内试验的典型值范围。实际工程中浆液的水灰比不同、外加剂不同粘度和屈服应力差异会很大建议针对具体浆液配比做一次流变试验测出τ₀和μ_pl再代入模型。4.2 网格划分策略裂隙流接口下的尺寸控制和收敛性网格划分是三维裂隙注浆模型成败的另一个关键点。裂隙流接口本质上是在三维的圆盘面上生成二维网格但圆盘的数量多、空间位置随机网格质量很容易参差不齐。我的经验是分三步来控制网格第一步设置全局最大单元尺寸。先设一个比较粗的值比如R_max/20大概估算全局单元数不要一上来就往细了调。第二步对裂隙圆盘内部再细化一级。在裂隙流接口的“域”选择里单独选中所有圆盘域设置一个局部尺寸属性通常取全局尺寸的一半。这样做可以保证裂隙面内流动的计算精度。第三步检查网格质量。COMSOL的“网格统计”功能会给出单元质量直方图。重点关注极小单元质量如果低于0.1说明某些圆盘交界处的网格畸形严重需要局部加密或者调整几何。裂隙网络模型的计算量通常很大动辄几十万甚至上百万的域单元。我没有一上来就开完整三维模型而是先在一个子区域上验证参数和边界条件的合理性再扩展到全域。这个习惯帮我省下了大量调参时间。4.3 求解器配置稳态还是瞬态、直接还是迭代对恒定注浆速率工况求解策略我建议分两步。第一步先关闭粘度衰减和屈服应力效应设置成普通的牛顿流体做一次稳态求解。这一轮主要检验几何和边界条件的正确性看流场形态是否合理注浆孔周围的压力是否在正常范围。第二步打开粘度衰减表达式和屈服应力修正切换成瞬态求解时间步长取总注浆时间的1/50左右后处理时监视扩散前锋的推进速度和压力随时间的变化。瞬态求解能直观地显示浆液从注浆孔出发、逐渐充满裂隙网络的过程通过提取不同时间戳的饱和度等值面还能做出一个扩散动态视频对外汇报或者写论文都很有说服力。求解器选择上三维裂隙网络模型我建议默认用“PARDISO”直接求解器。虽然内存占用高但鲁棒性最好不容易在复杂几何上发散。如果模型规模实在太大可以改成“GMRES”迭代求解器配合“ILU”预处理器牺牲一些鲁棒性换计算速度。4.4 后处理与结果提取浆液扩散半径、注浆压力曲线和充填率后处理部分我最关心的三个量是扩散半径、注浆压力和充填率。扩散半径用一个“三维截点”或者“参数化表面”在裂隙网络的中心面上做一个截面然后绘制浆液饱和度/浓度的等值线直接量出最远扩散距离。也可以定义一个变量d_max在结果节点里用“最大值”计算自动提取所有单元里到注浆孔距离的最大值。注浆压力曲线在注浆孔边界上定义一个“边界探针”记录压力p随时间的变化。典型的压力曲线趋势是初期快速上升、中期稳定、后期再次上升——后期上升往往是因为浆液粘度衰减导致流动阻力增大或者浆液前锋已经接近裂隙网络的边缘流动受限。这个曲线和现场注浆记录的P-t曲线可以直接对比验证模型。充填率用“体积分”计算饱和度大于某个阈值比如0.5的裂隙体积除以裂隙网络的总体积得到一个百分数。这个值对评价注浆质量非常直观是设计报告中必须出的一张图。5. 常见问题与排查技巧我踩过的坑你就不用再踩了5.1 模型不收敛提示“找不到一致初始值”——宾汉姆流体的老毛病这个问题在COMSOL裂隙注浆模型里出现频率极高原因多半是等效粘度表达式里出现了流速v̄在分母上。当某个位置的流速接近零时等效粘度趋向无穷大方程发散了。解决办法有三条一是给等效粘度表达式加一个“下限保护”比如max(v_eff_min, v_eff)把等效粘度的最大值限制在一个合理范围内二是给流速项加一个极小值epsilon比如分母写成6*mu*darcy_velocityeps三是调整初始值在“因变量”设置里给流速一个合理的非零初值。我通常三条都加保险。5.2 裂隙网络不连通浆液扩散范围异常小之前调试一个模型注浆孔周围只有两个相邻圆盘有浆液分布其他地方干干净净。排查发现是圆盘裂隙之间根本没有相交。原因是生成裂隙参数时圆盘位置和半径的取值导致网络连通性极差。解决办法先在Python里做一个连通性检验计算所有圆盘两两之间的几何关系只保留“至少与一个其他圆盘相交”的圆盘。同时可以考虑适当放大圆盘半径提高网络密度。这一步做扎实了后面COMSOL里的分布形态才有意义。5.3 网格数量爆炸算不动怎么办三维裂隙模型算不动是硬件资源限制下的常见问题。我有几个降级策略第一把裂隙开度设为一致去掉不必要的局部细化第二用“自适应网格细化”功能只对压力梯度大的区域加密第三如果裂隙数量特别多考虑剔除直径特别小的圆盘因为它们对主通道的贡献有限但浪费的网格资源却不少。5.4 粘度衰减系数调不好扩散半径对参数极其敏感粘度衰减参数α和β对结果的影响非常敏感。α稍微调大一点扩散半径就明显缩小。这个问题的本质是粘度空间衰减是强烈非线性效应微小的参数变化会被放大。我建议采用的策略是先用一组保守参数α小一些、β小一些跑通模型得到一个偏于安全的扩散范围然后再在合理范围内扫描参数观察扩散半径的敏感性。如果时间有限就用最保守的扩散半径作为设计依据安全第一。6. 扩展思路这个模型还能往哪些方向升级6.1 多组裂隙非均质开度从理想化走向工程现实圆盘裂隙模型最容易被诟病的就是“太理想”。如果条件允许可以在模型里加入第二组甚至第三组裂隙——不同倾角、不同优势方向、不同开度——让它们在三维空间里交叉形成更复杂的渗流通道网络。开度也可以设定为随半径变化比如中心大、边缘小的收敛式裂隙开度这更接近真实自然裂隙的形态。6.2 恒定流量与恒定压力切换贴合不同施工工艺注浆施工工艺有“恒流量注入”和“恒压力注入”两大类。模型里预设的是恒流量Q_in但如果现场采用恒压力注浆只需要把注浆孔的边界条件从“流量”改成一个“压力”。两种边界条件下的扩散半径和注浆时间会有明显差异做对比分析非常有意思能直接指导现场设备的选择。6.3 浆液-水两相相互作用把水的阻力效应放进来更深入的模型可以做“浆液-水两相流”裂隙里原本充满水浆液注入时水被驱替到裂隙网络的更外圈形成“浆液驱水”的流动形态。这个阶段浆液不仅受到自身本构关系的控制还要克服水的黏性阻力和界面张力。在COMSOL里可以考虑用“两相流”接口来做但计算量会比单相模型大不少建议在单相模型验证充分之后再上。我自己的切身体会是三维离散裂隙注浆模型最大的价值不是输出一张好看的扩散云图而是逼着你去思考浆液在裂隙里“到底怎么走”的每一个环节。这里面最容易被忽略的恰恰是粘度空间衰减这种细节——它不像几何和边界条件那么显眼却对最终结果的真实性有决定性影响。建模之前先去搞清楚浆液的流变参数和裂隙网络的几何特征模型自然就能收敛得又好又快。
RELATED READING

延伸阅读

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