做冻土数值模拟这几年,我体会最深的一点是:温度场只是入场券,真正让计算变得复杂、也真正贴近工程实际的,是水、热、力、盐四个过程搅在一起、互相牵制的状态。水变成冰会放热,冰晶析出会把盐分挤到未冻区,盐浓度升高又反过来压低冰点,而未冻水含量变化直接改变渗透系数和冻胀力。这套“水土热力盐四场耦合”概念听起来门槛很高,实际拆开之后,每个物理过程都能用常见软件的多物理场框架表达清楚。这篇文章以一套二维冻土土柱模型为例,把我在COMSOL里从方程选择、边界设置、求解策略到参数标定、调试排错的全过程写出来,适合正在做冻土路基、寒区渠道、盐渍土场地模拟的研究生和工程师参考。
1. 四个场各管什么事:建模前必须想清楚的物理图像
1.1 温度场是总指挥,相变是一切耦合的起点
四场耦合里,温度场之所以被放在第一位,是因为冻土问题的本质驱动源是温度变化。外界冷空气进入土体,土中温度降到冰点以下,孔隙水开始相变成冰。冰水相变不只是物态变化,它会释放潜热,反过来减缓温度继续下降;同时冰晶的出现占据了孔隙空间,堵塞了水分迁移通道;相变造成的体积膨胀还直接产生冻胀变形。这一连串反应说明:温度场不是孤立求解的,它和水分场、应力场有天然的双向反馈。
模拟温度场时最需要注意的是“相变潜热”怎么处理。稳态热传导方程本身只描述热流,不关心能量从哪来、到哪去。一旦出现冰水相变,能量方程里就必须加一项潜热源项,否则温度计算会明显失真。具体数值上,水的相变潜热约334 kJ/kg,这个数值含量其实很大——1 kg水结冰放出的热量,足以让同样质量的干土温度升高几十度。很多第一次搭模型的人忽略了这一项,算出的冻结深度会明显偏大,这就是原因所在。
温度场还决定冻结锋面的位置和推进速率。冻结锋面推进越快,水分来不及向锋面迁移,冻胀量一般较小;推进越慢,未冻水有充分时间向冻结锋面汇集,分凝冰会不断发展,冻胀问题反而更突出。“慢冻大冻胀”在工程上是一个非常经典的规律,但要在数值模型里复现这个规律,必须让水分场对温度梯度有正确响应。
1.2 水分场、盐分场、应力场的角色与交互链条
水分场描述的是土中液态水和冰的含量如何随时间和空间变化。未冻水在温度梯度作用下会从暖端向冷端迁移,这是因为冻结锋面处的孔隙水势降低,形成水势梯度。这部分迁移水到达锋面后继续结冰,冰透镜体因此不断增厚。如果只算原位水的冻胀,那冻胀量很小;但分凝冰机制下,迁移水的冻胀量可以比原位水的理论膨胀大一个数量级。工程中看到的严重冻胀,绝大多数是水分迁移驱动的。
盐分场的加入让问题从“三场”变成“四场”。盐分不直接产生变形,但它通过两个途径强烈影响冻胀:一是盐浓度升高会降低冰点,也就是所谓的“冰点下降效应”;二是冰晶析出时盐分在水中的浓度会浓缩,浓度梯度会造成额外的水分和盐分迁移,改变冻融过程中的盐分重分布。在盐渍土地区,这两种效应叠加,常常出现“盐胀”和“冻胀”交替作用的复杂情况。
应力场是最终工程关心的输出对象。冻胀力、温度应力、自重应力叠加在一起,决定结构物的变形和受力状态。力学计算需要输入冻胀应变,而冻胀应变取决于含冰量增量,含冰量又由温度和水供给决定。这条链条组织起来后,四个场就闭环了:温度驱动相变,相变改变水分与含冰量,含冰量产生应变,应变影响应力与变形,盐分则通过冰点下降和浓度梯度调节前面所有过程的强度。
我一开始建模时总想把所有耦合项都塞进去,结果模型动不动不收敛。后来一位做冻土试验的前辈提了个建议:先把耦合关系分级。一级耦合是必须保留的,比如相变与热量、水分迁移与含冰量、冻胀应变与含冰量增量;二级耦合可以先简化,比如化学渗透作用带来的额外水分迁移、盐分对渗透系数的影响等。高优先级先做扎实,低优先级后加,这是四场耦合建模中很关键的一项策略。
2. 求解策略:怎么把四套控制方程放进同一个COMSOL模型
2.1 控制方程与软件的对应关系
在COMSOL Multiphysics里搭四场耦合,不一定需要从零编程。常见做法是混合使用内置物理接口和自定义偏微分方程。我比较推荐的方案是:用固体力学接口算应力场,用系数型偏微分方程接口求解温度、水分和盐分三个因变量,再通过耦合项把它们串起来。
温度场使用非稳态热传导方程,表达式为:
ρCp·∂T/∂t - ∇·(λ∇T) = Q_phase
其中ρ是土体密度,Cp是等效比热容,λ是等效导热系数,Q_phase是相变潜热源项。
水分场使用扩展的达西模型。这里不建议直接用COMSOL内置的达西接口,因为冻土中渗透系数随含冰量变化剧烈,不是常数,写成自定义方程反而更灵活。常用的水分连续性方程为:
∂θw/∂t + (ρi/ρw)·(∂θi/∂t) = ∇·(K(θw, θi)·∇H)
θw是体积未冻水含量,θi是体积含冰量,H是压力水头,K是随含水率与含冰量变化的渗透系数。方程左边的第二项就是冰水相变产生的水量交换。
盐分场采用对流-弥散方程:
∂(θw·C)/∂t = ∇·(θw·D·∇C) - v·∇(θw·C)
C是盐溶液浓度,D是水动力弥散系数,v是达西流速。这个方程能反映盐分在冻融过程中的重分布,包括冰晶析出导致的盐分浓缩和浓度梯度驱动下的盐分扩散。
力学场采用准静态平衡方程:
∇·σ + ρg = 0
冻胀应变通过热应变或自定义应变项加入,表达式为ε_frost = β·(θi - θi0),β是冻胀系数,需要通过试验或工程经验标定。
2.2 全耦合和分离式求解怎么选
COMSOL求解多物理场问题时,有两种思路:一种是全耦合求解,所有因变量在同一个Newton迭代里同时更新;另一种是分离式求解,每步先算温度,再算水分,再算盐分和力学,场与场之间通过迭代或上一时刻值交换信息。
我的实际经验是:如果你的模型边界条件比较温和、相变过程平缓、计算时间不太长,可以尝试全耦合。全耦合的优点是物理上更一致,结果不会出现场之间的时间错位;缺点是Jacobian矩阵规模很大,而且各项时间尺度差异太大,很容易不收敛。
四场耦合里,温度变化和力学变形的时间尺度差异尤其明显:温度扩散以小时到天计,而力学平衡是瞬时建立的,准静态方程几乎不随时间变化。这种多时间尺度问题,用全耦合会让Newton迭代很难找到合适的步长,经常出现震荡。
所以我更推荐分离式求解,具体做法是:把温度、水分、盐分三个自定义PDE放在同一个求解步骤里同步计算,因为它们三者之间的反馈是瞬态的、高频的;力学场放在另一个步骤,每几个时间步更新一次即可。这样既能保证水热盐三者的强耦合精度,又避免了力学场拖慢整体计算。实测下来,这种方案在相同时间步长下,计算速度可以快30%到50%,而且稳定得多。
还要注意求解器的设置。COMSOL默认的迭代求解器对强耦合PDE往往不太好使,建议物理场接口全部改用直接求解器,PARDISO或MUMPS都可以。直接求解器虽然内存占用更高,但稳定性好,尤其处理相变这种强非线性问题时优势明显。
3. 从零搭一个二维冻土土柱模型
3.1 几何、材料参数与初始条件
我用一个长1米、高0.5米的二维土柱来演示整套建模过程。土柱尺寸不用太大,关键是验证四场耦合逻辑是否跑得通。几何结构很简单:一个矩形域,底部设置固定约束,顶部为自由边界,左右两侧设置对称或约束边界。在COMSOL里直接画矩形,然后划分网格就可以,不需要复杂几何。
材料参数以粘性土为例,参数表如下:
| 参数 | 数值 | 说明 |
|---|---|---|
| 土体干密度 | 1500 kg/m3 | 常规粘性土取值 |
| 孔隙率 | 0.45 | 密度中等 |
| 饱和渗透系数 | 1e-10 m/s | 粘性土典型量级 |
| 干土比热容 | 900 J/(kg·K) | 矿物骨架比热 |
| 饱和导热系数 | 1.5 W/(m·K) | 含水率较高时 |
| 冰的导热系数 | 2.2 W/(m·K) | 冰比水导热快约4倍 |
| 水的相变潜热 | 334000 J/kg | 常规物性常数 |
| 初始盐浓度 | 0.5 mol/L | 中等盐渍土水平 |
需要注意,这里的参数是常规文献典型值,具体项目应用时必须用实际土样的试验数据替换。我见过有人直接抄文献参数做“精确”预测,结果和实测冻深差了30%以上,根源就是参数不匹配。
初始条件方面:土柱初始温度设为5℃,初始均匀盐浓度为0.5 mol/L,初始孔隙水压力按静水压力分布设置,初始位移为零。然后重点来了:顶部温度在第一个小时内从5℃线性降到-10℃,之后保持-10℃恒定;底部温度始终为3℃。这个边界条件模拟的是地表持续降温、深部温度相对稳定的场景。
3.2 边界条件、源项与SFCC曲线的函数实现
四场耦合建模的边界条件要分别设置。温度边界比较直接:顶面指定温度为-10℃,底面指定温度为3℃。水分边界方面,顶面设为可排水的通量边界,但冻胀过程中水分会从暖端向上迁移,所以最好设置为开放边界,让水分按水势梯度自由流动;底面设为隔水边界。盐分边界与水分边界类似,顶面保持初始浓度,底面零通量。力学边界则按土柱实际约束来:底面固定,侧向水平约束,顶部自由。
相变潜热源项是能量方程里最容易出问题的地方。简单做法是采用“表观热容法”,把相变潜热折算进等效热容,相当于让土体在冰点附近的热容突然变大。这种方法实现简单,但弊端是它默认相变只发生在冰点附近一个很窄的温度区间,而且无法和盐分影响自动联动。我的做法是直接在能量方程中加入潜热源项:
Q_phase = L·ρi·(∂θi/∂t)
这里θi是含冰量,需要由温度和盐浓度共同决定。这里就要引入土壤冻结特征曲线SFCC,即含冰量和温度之间的关系。常用的广义形式是:
θi(T, C) = θmax·(1 - exp(-a·(Tf(C) - T))) 当 T < Tf(C)
θmax是最大冻结含冰量,Tf(C)是当前盐浓度下的冰点。盐浓度对冰点的压制可以通过类似Tf(C) = Tf0 - k·C表示,其中k是冰点下降系数。这里的k和SFCC的a参数最好用冻结试验曲线去拟合,直接抄文献数值时务必谨慎。
在COMSOL里,这些关系可以用解析表达式直接写到PDE的源项或系数中。比如在系数型偏微分方程中,能量方程的源项写成:
f_T = -L·ρi·dθi/dt
其中dθi/dt需要在表达式中对时间和温度做链式求导。如果怕求导出问题,可以用COMSOL的内置时间延迟函数,或者把θi设为额外的因变量,通过代数方程求解,也是一种可行策略。
3.3 网格与时间步:相变锋面稳定计算的关键
网格划分是四场耦合模型最容易翻车的地方。相变区域往往是一个很薄的锋面,温度变化剧烈,水分和盐分梯度也大。如果网格太粗,锋面会被“磨平”,冻深推进速度和实际差别很大。我在这套土柱模型中,把上部0.2米范围加密到2毫米网格,下部逐渐过渡到5毫米。这个加密范围要根据冻结深度预判,一般取期望最大冻深再加20%的富余量。
时间步设置同样重要。COMSOL默认的自适应时间步在纯热传导问题中表现不错,但一旦加了相变源项和水分强耦合,默认设置很容易让时间步突跳,导致相变锋面跨过多个网格单元,结果出现“冰含量锯齿状分布”的典型错误图像。我的经验是:对瞬态求解器设置初始时间步为1秒,最大时间步限制在60秒以内,同时打开自适应容差控制。随着温度场趋于稳定,时间步会自动放大,前期花的时间也不会太多。
关于网格和时间步还有一个“隐形坑”:射流或对流项的存在会让问题变成对流占优,可能出现盐分浓度的数值振荡。判断标准可以看网格Pe数,也就是网格尺寸与特征迁移长度的比值。Pe过大时要加密网格或者给弥散系数加一个小的人工扩散项,否则盐分分布会出现肉眼可见的“梳子齿”状振荡。
4. 模型参数标定:用室内试验数据把模型“拉回现实”
4.1 哪些参数必须自己测、哪些可以合理引用文献
四场耦合模型的参数数量不少,但重要性差异很大。有些参数是普适常数,例如水相变潜热、水的密度、冰的导热系数,直接取手册值没有任何问题。有些土性参数如干密度、孔隙率、饱和渗透系数,不同场地差异很大,必须用实际土样测或至少做颗粒分析间接估算。
最需要花心思标定的是三类参数:第一是冻结特征曲线SFCC,这是决定含冰量随温度变化的核心关系,直接影响相变潜热释放速率和水分迁移量;第二是冻胀系数β,决定含冰量增量转化为冻胀应变的效率,这个参数很难直接测定,往往要根据冻胀量反演;第三是渗透系数随含冰量的衰减函数。饱和渗透系数只是一个基准值,实际冻结过程中含冰量升高会让渗透系数下降几个数量级,这种非线性关系对水分迁移模拟效果影响极其显著。
盐分相关的参数也要重视。冰点下降系数k决定了盐分浓度对相变过程的抑制作用,不同盐分种类(氯化钠、硫酸钠、碳酸钠)的k值不同。如果模拟的是硫酸盐渍土,还需要额外考虑盐分结晶析出带来的盐胀效应,这部分机理在偏盐胀研究的文献中可以找到更完整的描述。
4.2 四场耦合模型校准的基本流程
模型校准不是一个“把参数调到和试验曲线重合”的简单过程,因为参数之间常常互相影响。我的校准顺序是:先做纯热学校准,再做热-水耦合校准,最后加入盐分和力学校核。
第一步,模拟一个仅有温度边界条件的土柱冻结过程,对比试验实测的温度分布曲线,重点校核导热系数和体积热容。这一阶段不考虑水分迁移,调节这两个参数让计算温度和实测温度误差控制在1℃以内。第二步,开启水分迁移,对比实测的未冻水含量剖面,重点校核渗透系数衰减函数和SFCC曲线。这一步是四场耦合里最耗时的,因为未冻水含量随温度变化既要符合SFCC,又要受渗透系数控制,两个参数会互相牵扯。第三步,加入盐分场,对比实测盐浓度重分布曲线。第四步,对比冻胀量曲线,标定冻胀系数β。如果整体误差仍然偏大,再回头微调早期的参数,但每次只动一个参数,避免陷入“参数组合迷宫”。
参数估计过程中,可以先用COMSOL自带的一维参数扫描或优化模块做初步反演,也可以直接人工反复试算。实测下来,人工试算配合可视化对比,在前几轮反而更直观,因为你能看到曲线形态上的偏差是哪类机理造成的,而不是被一个综合误差指标带偏方向。等人工把参数范围压缩到合理区间后,再用自动化优化做精修,效率最高。
5. 高频报错与调试实录
5.1 不收敛的常见原因与处理顺序
做四场耦合模型,不收敛是家常便饭。我自己跑这套模型时遇到最多的问题,按出现频率排序是:时间步长过大、初始条件与边界条件冲突、相变源项太尖锐导致数值刚度、力学场与其它场时间尺度不匹配。
时间步长过大的典型表现是:求解器前面几步还算稳定,然后突然在某个时刻报“找不到解”。排查时先看收敛失败发生的时间点是否对应温度变化最剧烈的时段,如果对应,那就是时间步太大。解决办法很简单:把初始时间步降到0.1秒级别,最大步长限制在30秒以内,如果还不行就继续缩。COMSOL的容差控制默认是0.01,对于强非线性问题建议调到0.001甚至更低。
初值和边界条件冲突也是一个很常见的坑。比如你给顶面直接设为-10℃恒定温度,可是初始温度是5℃,二者在边界上瞬间产生一个巨大温度梯度,加上水分场和盐分场的初值,整个系统在零时刻就处于高度非平衡态。这种情况我建议加一个起步阶段:前1小时内让边界温度从5℃线性过渡到-10℃,类似实际中的缓慢降温,而不是阶跃式突变。这不是在“作弊”,反而更贴近真实物理过程,能让初始阶段的求解稳定许多。
相变源项太尖锐这个问题,解决思路是让SFCC曲线不要设置得太陡。在物理上,土中水的相变并不是在单一温度点瞬间完成的,因为孔隙尺寸分布、基质势、盐分分布都导致相变发生在一个温度区间。人为设置一个过度平缓的相变区间,比如从冰点到冰点以下2℃范围内完成主要相变,不仅符合实际,也能显著改善收敛性。
5.2 看起来收敛但结果明显不对:几个典型症状
不收敛至少明确告诉你“模型有问题”,最让人头疼的是模型“收敛了但结果明显违背物理常识”。
我遇到过的一个典型问题是含冰量在空间上“锯齿状”。温度剖面是平滑的,但含冰量分布像一把梳子,每隔几个网格就出现尖峰。这往往是时间步长超过了对流/相变特征时间,导致相变过程在多个网格间跳跃。解决方法是加密网格、缩短最大时间步,或者对SFCC曲线做平滑处理,三者配合使用。
第二个典型问题是水分不守恒。温度场正常,应力场也正常,但累计含水量随时间明显增加或减少,总量偏离初始值超过几个百分点。这就要回到水分方程检查边界通量。常见错误是顶面边界条件设成了“指定压力水头”,导致整个计算期间水分从边界源源不断补充进来,这个补水量远超实际,造成冻胀量虚高。正确的做法是设置为“开放边界”或“通量随水势梯度自动调整”,这样水分迁移完全由冻吸力驱动,不会人为灌水。
第三个典型问题是盐浓度出现负值。负浓度在物理上没有意义,它通常是对流项占优后数值振荡导致的。解决办法一是加密网格降低网格Pe数,二是给弥散系数增加一个下限值,保证数值稳定。需要注意,增加弥散系数会略微扩大盐分扩散范围,所以这个下限值不能取得太大,以刚好消除负值振荡为准。
6. 结果怎么用:从冻胀量预测到工程方案比较
6.1 四场耦合模型能回答哪些工程问题
模型跑通之后,最大的价值不是生成几张好看的云图,而是能帮助工程决策。最基本的输出是冻胀量,从位移场中可以提取地表最大冻胀位移、冻胀沿深度分布,以及不同时刻的冻胀发展速率。温度变化下盐浓度重分布的结果,可以判断盐分是否会在某个人为设置的位置富集,帮助预判盐胀的高发区。
边界条件的敏感性分析也很有价值。比如在模拟项目X里,我曾经用这套模型对比了两种工程方案:一种是在路基顶部设置保温层,另一种是换填非冻胀性材料。模型结果显示,由于该场地的盐分浓度较高,单纯保温并不能彻底消除冻胀,因为盐分造成的冰点下降会推迟冻结,但一旦温度降到冰点以下,水分迁移量反而更大。换填方案则能够显著降低表层的盐分积累,冻胀控制效果更好。这种“方案比较型”的模拟结论,比单独算一个工况有说服力得多。
四场耦合结果的另一类应用是长期冻融循环评估。在模型中输入多个周期的温度边界条件,可以观察每次冻融后的残余变形是否逐周期累积,盐分是否逐年向冻结深度富集。虽然长时间多周期模拟的计算成本较高,但可以从短周期的趋势推算出几年甚至十几年的累积效应,这对寒区基础设施的耐久性评估具有重要的参考意义。
6.2 往三维、长时间冻融循环扩展的可行路径
二维土柱模型验证四场耦合逻辑后,可以逐步扩展到更复杂的问题。最直接的扩展是三维化,比如模拟一段真实的路基结构在横向上的不均匀冻胀。三维模型的计算量会显著上升,此时分离式求解策略的优势更加明显,因为力学场的网格可以比水热盐场稍粗一些,用不同物理场的网格独立划分来节省算力。
时间尺度的扩展需要格外小心。四场耦合中短期过程和长期过程的数值特征不同,短周期模拟中瞬态相变是主导;而长周期冻融循环模拟需要注意残余变形累积的合理性。大量循环计算会让数值误差逐周期积累,如果每个周期都有微小的水分残差不消除,累计几十个周期后结果会明显偏离物理规律。我的经验是定期检查整体水分质量和盐分质量,如果漂移超过阈值,就需要减小容差或重新划分网格。
最后一个建议:这套模型不要停留在“能跑出结果”就结束。建议把冻深、冻胀量、盐分分布等结果和已有的冻土地区观测资料或经验公式进行交叉验证,哪怕只是对比一个冻结指数的经验关系。四场耦合的优势在于机理表达完整,但如果连基本规律都对不上,后续的应用就失去了根基。把验证做扎实,这套模型在寒区工程问题中能发挥的作用会越来越大。