1. 为什么冻土仿真必须是“三场耦合”:先理解水、热、力的物理纠缠
1.1 相变是三场耦合的发动机
很多刚接触冻土模拟的朋友第一反应是:温度场会算,渗流场会算,应力场也会算,那我把三个物理场堆到一起不就是冻土模型了吗?我在视频里反复强调过一个观点:冻土三场耦合的真正难点不在于“三个场”,而在于“相变”这个中间环节。水变成冰不是简单的材料参数变化,它会释放潜热、占据孔隙、挤压土骨架,这三件事分别作用在温度场、渗流场和应力场上,然后又反过来影响相变的进程,形成一个闭合的反馈环。
说得直白一点,如果没有相变,多孔介质里的热-流-固耦合只是一个常规的线性叠加问题;一旦有相变,温度低于冰点的区域里液态水含量会急剧下降,冰晶体逐渐占据原本连通的孔隙通道,渗透率可能一下子就掉一到两个数量级。而这个过程中释放的相变潜热又会抬升局部温度,减缓冻结锋面的推进速度。与此同时,体积膨胀约9%的水变成冰之后,会在约束条件下产生冻胀应力,改变土体的孔隙比和变形场,变形场的变化又会反过来影响渗透率和热接触情况。这个闭环不建立起来,冻土仿真就只是“三个互不搭理的物理场”在同一个软件里各算各的,数值上能出图,物理上站不住。
1.2 温度场、渗流场、应力场之间的三条主传递链路
我习惯把三场耦合拆成三条主链路来理清思路,模型搭建的时候按这个逻辑逐条加耦合项,不容易乱。
第一条链路是从温度场到渗流场:温度决定冰饱和度,冰饱和度决定液态水含量和有效渗透率。这里最核心的关系是“未冻水含量随温度变化的曲线”,也就是所谓的土壤冻结特征曲线。温度降到0℃以下之后,土体中并不是所有水都立刻结冰,不同土质、不同盐分含量对应的未冻水含量曲线差异非常大。冰的存在会堵塞孔隙通道,渗透率通常按指数衰减,我一般用K = K0 × 10^(-Ω·θ_i)来近似,Ω是经验衰减系数,取3到10之间,砂土偏小,黏土偏大。
第二条链路是从温度场到应力场:冰的生成直接导致体积应变,这个应变并不是普通的“热胀冷缩”,而是由冰体积分数变化驱动的本征应变。同时,冻结过程中土的弹性模量、黏聚力和摩擦角都会显著变化,冻土的强度可能比融土高出一个数量级。如果这一步不处理,力学场就完全反映不出“冻”和“融”的本质差异。
第三条链路是从渗流场和应力场回传到温度场:水流会带来对流传热,水分迁移到冻结锋面附近后会集中冻结,释放大量潜热;而应力场引起的体积变形会改变孔隙率,进而影响有效导热系数和渗透系数。三条链路合在一起,才是一个完整的“水热力三场耦合”框架。
1.3 工程场景里到底靠这个模型解决什么问题
三场耦合冻土模型不是做出来好看的学术玩具。人工冻结法隧道施工、多年冻土区路基工程、寒区渠道防渗、季节性冻土边坡,这些工程里最怕的就是“预测偏差”。比如人工冻结法,你要估算冻结壁厚度和形成时间,只用温度场算出来的结果是偏快的,因为忽略了水分向冻结锋面迁移后集中相变释放的潜热效应。而有水压环境下的冻结施工,还要同时评估冻胀力对支护结构的影响,这就必须把应力场纳入进来。
所以我在视频更新里给这个模型定了一个非常明确的目标:完整复现一维和二维情况下温度场、水分场、应力场的动态演化过程,并且能够跟经典试验数据对上。这个目标看着简单,实际跑下来坑非常多,后面我会把每一步怎么做、为什么这样做、踩了哪些雷详细讲清楚。
2. 从控制方程到Comsol接口:一个可复现的建模骨架
2.1 能量方程:用“等效热容法”处理相变潜热
在Comsol里搭冻土模型,我推荐直接用内置的“固体传热”接口而不是从零写偏微分方程,但前提是你必须把相变潜热正确地折算进热容和热源项里。能量守恒方程的基本形式如下:
ρC_eff·∂T/∂t = ∇·(λ_eff·∇T) + ρ_w·L·∂θ_i/∂t
其中ρC_eff是考虑土骨架、冰、液态水共同贡献的等效体积热容,λ_eff是等效导热系数,ρ_w是水的密度,L是水的相变潜热(约334 kJ/kg),θ_i是体积冰含量。右侧这个ρ_w·L·∂θ_i/∂t项就是相变潜热项,它的物理意义很明确:冰增加的时候放出热量,相当于热源;冰融化的时候吸收热量,相当于热汇。
实际建模中很多人喜欢用“等效热容法”,把潜热折到热容里去,写成C_eff = C_0 + L·dθ_i/dT。这个做法在操作上很方便,在Comsol里只需要把热容定义成温度的函数就行,但我必须提醒一点:dθ_i/dT在相变区间内是一个极其尖锐的峰函数,如果处理不好,数值解会在冻结锋面附近剧烈振荡。我后面会专门讲怎么平滑处理这个尖峰。
另外还有一个容易被忽略的对流项:如果渗流速度比较明显,水分迁移携带的热量不能忽略。这时能量方程要加上ρ_w·C_w·q·∇T这一项,其中q是达西流速。在Comsol里可以通过“固体传热”接口的对流项或者“多孔介质传热”接口来加。
2.2 水流方程:达西定律、Richards方程与冰阻塞渗透率
渗流场在冻土模型里通常用达西定律或者Richards方程来描述。如果你模拟的是饱和土体冻胀,达西定律就够了;如果你要处理非饱和入渗或冻融过程中的水分重分布,我建议用Richards方程,因为非饱和区的渗透系数是基质吸力的函数,冻融过程中孔隙水压力的变化非常关键。
Richards方程的基本形式是:
∂θ_w/∂t + ∂θ_i/∂t = ∇·[K(θ_i,ψ)·∇(H)] + Q
注意这里的∂θ_i/∂t项是冻土特有的源汇项。它的含义是:水分冻结成冰后,液态水被消耗,但“总水量”并没有消失,只是从可流动的水变成了固定的冰。在Comsol里实现时,可以把这项加到Richards接口的“质量源”里,也可以把它作为存储项的修正来处理。
渗透率部分是冻土模型和普通渗流模型最大的区别。我上面提到了K = K0 × 10^(-Ω·θ_i),实际使用中还要考虑水的粘度随温度变化。这个细节很多人不处理,但水的动力粘度在0℃到20℃之间能差出约30%,在寒区温度跨度大的情况下,忽略粘度变化会带来明显的渗透率误差。在Comsol里很好处理:定义渗透系数时,分母乘上一个温度相关的粘度比项,μ_w(T)/μ_w(0℃)。
2.3 力学方程:弹性-塑性本构如何纳入冻胀应变
力学场相对复杂一些,因为它涉及本构关系和应变分解。如果你用“固体力学”接口,最简单的框架是把总应变分解成三部分:
ε = ε_elastic + ε_thermal + ε_phase
其中ε_elastic是弹性应变,ε_thermal是热应变(由温度变化引起),ε_phase是相变应变(由冰体积分数变化引起)。相变应变这一项是关键,它直接响应冰的形成和融化。对于冻胀过程,ε_phase通常表示成β_phase·Δθ_i的形式,β_phase是冻胀系数,和土体的冻胀敏感性有关。
进入塑性阶段后,我建议使用摩尔-库仑准则,因为它在岩土工程界接受度最高。破坏准则的表达式是τ_f = c + σ_n·tanφ,其中c是黏聚力,φ是内摩擦角。这里又涉及一个冻土特性:冻结状态下黏聚力和摩擦角都不是常数,而是随温度变化的。冻土的黏聚力在负温下会显著提高,摩擦角的变化相对小一些,但也不能忽略。所以我在模型中把所有力学参数都设置成温度的函数或者冰饱和度的函数。
2.4 Comsol接口选型与耦合变量清单
为了让第一次上手的读者少走弯路,我把推荐的接口搭配和各自的作用整理如下:
| 物理过程 | Comsol接口 | 所需模块 | 耦合项/备注 |
|---|---|---|---|
| 温度场 | 固体传热(Heat Transfer in Solids) | 传热模块 | 热容中含等效热容项,源项加潜热 |
| 渗流场 | Richards方程(或达西定律) | 地下水流模块 | 存储项加∂θ_i/∂t,渗透率乘冰阻塞因子 |
| 应力场 | 固体力学(Solid Mechanics) | 结构力学模块 | 加本征应变ε_phase,塑性用摩尔-库仑 |
| 未冻水含量 | 系数型偏微分方程(弱形式或ODE) | PDE模块 | 辅助计算θ_u(T)并平滑相变区间 |
耦合变量我建议在Comsol的“定义”节点里统一建立全局变量或变量表达式,不要散落在各个物理场里,否则后期调整参数非常痛苦。常用的一组变量包括:未冻水含量θ_u(T)、体积冰含量θ_i(T)、渗透率衰减系数k_ice、等效热容C_eff、相变潜热源项Q_phase、冻胀应变ε_phase。把这些变量用清晰的命名放在同一个“变量集”里,后续做参数扫描和结果分析都会方便很多。
3. 相变参数化与前处理细节:决定模型成败的十个关键点
3.1 先定义“冰饱和度函数”,而不是直接定义温度函数
很多新手在Comsol里一上来就写“if(T<0, 1, 0)”这样生硬的阶跃表达式,意思是低于零度就全部结冰。这个写法必炸,原因有两个:第一,物理上不真实,实际土体在负温下仍然有未冻水,尤其是黏土在-5℃可能还有相当比例的液态水;第二,数值上不收敛,阶跃函数让dθ_i/dT变成狄拉克函数,任何Newton迭代法都处理不了这种突变。
正确的做法是先定义一条连缝平滑的未冻水含量-温度曲线。工程上常用幂函数形式:
θ_u(T) = θ_0 · |T|^(-b)(T<0时)
这里θ_0是初始含水率,b是土质相关的拟合参数,砂土通常在0.4左右,黏土可以达到0.8甚至更高。为了避免尖角和突变,我在Comsol里会在相变区间内引入平滑过渡函数,把dθ_i/dT变成一个有限宽度的钟形曲线。这样等效热容的峰值虽然大,但不会出现无限尖锐的奇异点,求解器就能处理了。
3.2 渗透率衰减、导水系数与未冻水含量怎么设置
关于渗透率衰减,我习惯把冰阻塞效应和粘度温度效应合并写成:
K_eff(T) = K_0 · 10^(-Ω·θ_i) · μ_w(0℃)/μ_w(T)
这里Ω是衰减系数。注意这个参数非常敏感,取值不同,冻结锋面的推进速度和冻胀量会差出好几倍。我在参数设置时一般给出范围:砂土取3~5,粉土取5~7,黏土取7~10。具体取多少,要和后文的试验数据对标后再回调。
视频里我特别演示了一个现象:当Ω取值过大的时候,冻结区渗透率趋近于零,水分被完全“锁死”,但实际工程中未冻水膜仍然能迁移,所以结果会低估冻胀量;当Ω取值过小的时候,冻结区水分仍然大量流动,冻结锋面处的冰透镜体迅速增长,冻胀量又会高估得离谱。这个参数的标定,是整个模型最关键的一步。
3.3 弹性模量、摩擦角与黏聚力的温度依赖性
力学参数的温度依赖性是冻土模型容易被忽视的地方。融土的弹性模量可能只有20~50 MPa,而冻土在-10℃下可以达到200~500 MPa,相差一个数量级。我建议用平滑的分段函数定义:
E(T) = E_thawed + (E_frozen - E_thawed)·smoothed_fraction(T)
smoothed_fraction从0(温度高于冰点)平滑过渡到1(温度远低于冰点)。Comsol里有现成的平滑阶跃函数flc2hs或者atan函数,可以用它们构造这个过渡带。
黏聚力和内摩擦角同样按这个思路处理。冻土的黏聚力随温度下降显著增加,可能从融土的10~20 kPa增加到冻土的数百kPa,而内摩擦角的变化幅度相对小。我个人的经验是:摩擦角从融土到冻土的变化量通常在5°~10°之间,而黏聚力可能翻几倍,所以如果你计算资源紧张,优先精确拟合c(T),φ可以取一个近似线性插值。
3.4 边界条件的物理一致性
冻土三场耦合里边界条件的设置要格外注意“物理一致性”。温度边界还好办,要么第一类边界给定温度,要么第三类边界给对流换热系数;渗流场边界最容易出问题的是底部排水边界,如果不设排水边界,冻结过程中被“挤”出来的水没有出路,孔隙水压力会异常升高,进而影响有效应力计算。力学边界则需要注意:如果模拟的是自由冻胀,顶部应该自由变形;如果模拟的是约束条件下的冻胀力,就要在相应方向加位移约束。
我强调过很多次:边界条件的合理性要反复用物理常识检验。一个非常常见的错误是顶面温度边界设成恒温-10℃,而底面也设成恒温0℃,模型跑完发现整个土柱很快就全部冻结,这跟实际情况不符,因为真实的气温是波动的,边界上的温度不是一直恒定。好在模型本身是瞬态的,你可以通过给边界温度加随时间变化的函数来模拟真实的气温波动。
4. 求解器与收敛:从“迭代未收敛”到稳定输出的调参经验
4.1 为什么默认设置跑不出结果
我刚接触冻土模型的时候,直接在Comsol里搭好物理场,点了一下“研究-瞬态”,结果没跑几步就报“迭代未收敛”。然后用了一个下午调参数,最后发现问题的核心不在模型本身,而在求解器配置上。
冻土模型的非线性程度非常高:等效热容在相变区间急剧变化,渗透率随冰含量指数衰减,塑性迭代又涉及屈服面的不光滑角点。默认求解器的容差太松,阻尼方式太激进,Jacobian矩阵更新不够频繁,导致Newton迭代在相变尖峰附近来回振荡,永远收敛不了。所以,这时候不能怀疑模型错了,而要先怀疑求解器没有为“强非线性”做好准备。
事先说明:这套模型我跑通了三维、二维轴对称和一维三种情况,求解器的调参经验是一致的,并没有因为维度不同而有什么区别。
4.2 阻尼牛顿、Jacobian更新与时间步控制
我给瞬态求解器配的配置如下,直接照抄基本能跑:
- 求解器选择“瞬态”,时间步进方式用“自由步进”配合BDF公式,最大BDF阶数设为2,避免高阶格式在强非线性下产生振荡。
- 初始时间步长设置得很小,比如物理时间尺度为天时,初始步长取1e-3天,先让温度场和渗流场在微小时间步里稳定下来。
- 非线性方法从“自动(Newton)”改成“阻尼Newton”,阻尼因子下限设为0.01,收敛容差设到1e-3,最大迭代次数从25提高到50。
- 开启“Jacobian矩阵的每次迭代重计算”选项。默认设置下Jacobian不会每次都更新,对于冻土这种强非线性问题,Jacobian过期会导致收敛速度骤降甚至发散。
还有一个技巧:分阶段加载。先关闭温度场,只让渗流场和应力场做稳态计算得到一个初值;然后打开温度场,但把降温幅度设得很小,比如先降温0.1℃,跑一个小时间步;最后再恢复正常降温速率。这个“热身”过程看起来多余,实际上能大幅降低初始非线性带来的数值冲击。
4.3 塑性区不收敛的处理:摩擦角、软化参数与正则化
摩尔-库仑模型在Comsol里有个天生的问题:屈服面在应力空间的六个角点处存在不光滑性,导数不连续,Newton迭代很容易在这些角点附近卡住。你在搜索“comsol塑性变形用于查找弹塑性应变变量在迭代未收敛”时,看到的方法就是通过监视塑性应变变量来定位发散区域,这个方法我用过很多次,确实有效。
具体操作是:在求解过程中添加“全局变量探针”或者“域点探针”,监视等效塑性应变、von Mises应力、塑性应变张量分量。如果发现某个点的塑性应变在迭代过程中从10^-3数量级突然暴涨到0.1甚至1,那说明该处已经进入无法收敛的塑性区。这时候通常的做法有三个:
- 第一,检查摩擦角和黏聚力的取值是否合理。如果荷载远超土体强度,任何数值技巧都救不回来,必须调整力学参数。
- 第二,给屈服面加“角部光滑处理”。Comsol里有限元实现通常带有塑料势的流动规则选项,可以选非关联流动或者对屈服函数做小范围光滑。
- 第三,引入轻微的塑性硬化或粘塑性正则化。给黏聚力加一个随等效塑性应变缓慢增长的硬化项,能让屈服点处的Jacobian更平滑,但要注意硬化不要太大,否则结果偏离实际情况。
4.4 移动网格和几何大变形的坑
冻胀涉及到明显的位移,尤其是一维土柱实验里顶部可能隆起几厘米。如果变形量相对于模型尺寸不大(比如小于网格尺寸的30%),直接让固体力学接口在固定网格上算就够了;如果变形量很大,你可以考虑“移动网格”功能,让网格跟随几何变形。
但移动网格是另一个容易踩雷的地方:冻结锋面附近的网格单元在反复冻融循环中会发生大扭曲甚至翻转,一旦出现负雅可比行列式,求解就会中止。我遇到过报错“转换为CAD内核时不支持的拓扑”,排查下来其实不是CAD拓扑问题,而是移动网格单元翻转后导出几何时出现的连锁问题。解决方案是:在移动网格接口里开启“自动重划分网格”,或者把变形量限制在单元尺寸的合理范围内;如果冻胀量实在太大,最好的办法是不要用更新的拉格朗日框架,改为在固定网格上计算变形场,后处理时把真实位移显示出来即可。
5. 结果验证与后处理:如何判断“完美复现”而不是自嗨
5.1 三大标准曲线
模型跑通了不代表结果正确,我判断一个冻土模型能不能算“复现成功”,标准很明确:
- 温度时程曲线:取几个特征深度(比如土柱中部、底部、近表面),把模拟温度曲线和热电偶实测曲线叠在一起对比。冻融交变的拐点、最冷时刻的谷值、回温过程的斜率,这些部位对得上,基本说明热参数和边界条件是对的。
- 冻结锋面深度-时间曲线:这个曲线非常关键,理论上有近似√t的规律(Stefan问题解),如果你的模拟结果明显偏离√t趋势,先查等效热容和渗透率衰减参数。
- 冻胀量-时间曲线:顶部竖向位移随时间的变化,这个量直接反映力学场和渗流场的耦合是否合理。冻胀曲线中间应该有一个“快速冻结段”和一个“明显减速段”,快速段对应冻结锋面在表层推进,减速段对应未冻水膜迁移补给变慢的过程。
把这三条曲线放进同一张图里,物理上的合理性基本一目了然。
5.2 与经典试验数据对比时的误差修正
我发现很多人搭建模型后,测出来的冻胀曲线和试验值总是差一截,调来调去也不知道该调哪个参数。这里我给一个从后向前的调试顺序:
先调热参数:比对温度时程,如果温度曲线整体偏高或偏低,调导热系数和热容;如果相变平台段不明显(曲线在0℃附近没有明显的弯折平台),说明等效热容法里的相变区间设置不合理,检查dθ_i/dT的平滑宽度。
再调渗流参数:比对冻结锋面深度和水分重分布云图。如果冻结锋面推进太快,说明渗透率衰减系数Ω太小,水分能持续补给到锋面处释放潜热,减缓冻结;反过来如果冻结锋面推进过慢,Ω可能偏大。如果水分重分布云图显示冻结缘附近没有明显的含水率堆积峰,说明未冻水含量曲线参数需要调高b值。
最后调力学参数:比对冻胀量曲线。如果冻胀量偏小,先检查β_phase冻胀系数,再看摩擦力/黏聚力对塑性变形的抑制程度;如果冻胀量偏大但曲线形态合理,多半是渗透率衰减系数取小了,导致水分补给过多。
5.3 参数敏感性分析与工程结论
模型跑通之后,我会建议你做一个简单的参数敏感性分析:选Ω、未冻水含量曲线参数b、冻胀系数β_phase、摩擦角φ这四个关键参数,分别上下浮动20%~50%,用Comsol的“参数扫描”功能跑几组,把冻胀量和冻结壁厚度的变化范围画出来。
这个步骤在实际工程中价值非常高。比如在做人工冻结法设计时,如果发现冻胀量对Ω极其敏感,而Ω在工程岩土勘察里通常又没有精确数据,那就需要在设计上预留更大的冻胀余量;如果冻胀量对φ不敏感,那勘察时就不必为这个参数耗费太多成本。这才是仿真模型的真正价值——不是给你一个精确的“答案”,而是告诉你哪些因素最重要、哪些不确定性需要重点控制。
写在最后的一点实操建议
这套三场耦合模型我自己从建模到跑通前后花了将近三周时间,其中大部分时间都消耗在排查不收敛问题上。如果你打算复现,我的建议是:不要一上来就建三维完整模型,先建一维的土柱模型把三场耦合逻辑全部调通,再慢慢扩展成二维、三维。一维模型跑通之后,再上三维,基本上就是网格和边界条件的平移,不会再有原理性的坑。
另外,Comsol的“结果”后处理里有一个容易被忽视的功能:探测器和全局评估。把关键点的温度、孔隙水压力、位移都设置成探针,一边求解一边实时观察曲线变化。这个习惯能帮你在求解失败之前就发现问题,而不是等报错之后再去大海捞针地查原因。
如果你在建模过程中遇到奇怪的报错或者结果不贴合实际情况,先别急着改参数,回头检查三条耦合链路里是否有缺失——温度场到渗流场、温度场到应力场、渗流场/应力场回传到温度场。三场耦合的乐趣也就在这:你推着这个环,环带着你转,物理过程的每一个细节都会在结果里显现出来。