☰
焓法相变仿真核心实战:温度场流场耦合与调试排坑
2026/10/13 11:21:42 网站建设 项目流程

做相变仿真这行久了你会发现,最绕不开的数学模型就是焓法。不管你是做金属凝固、石蜡储能、还是电池热管理里的熔融相变,表面上看问题是“材料随着温度变了物理状态”,但真正落到方程里,难点全部集中在相变界面的处理上——界面在移动、潜热在释放、流场跟着温度走,如果直接用传统的比热容法去硬解,数值上有一万种方式让你怀疑人生。这篇文章我就把自己在多个项目里用焓法耦合温度场和流场做相变模型的核心经验拆开讲,从模型思路、数学表达、实操设置到问题排查,尽量把每一步为什么这么做、有哪些坑、参数怎么选说透。适合正在被相变收敛问题折磨的仿真工程师,也适合刚入门想做材料相变过程模拟的同学参考。

1. 相变模型为什么绕不开焓法:先搞清楚问题本质

1.1 相变问题的难点在于移动边界

先说个最简单的物理图景。一块材料放在热源旁边,温度升高到熔点,固体开始变成液体。这个过程里,固液界面是不断移动的——外圈先熔化,熔化的液体如果受热不均还会流动,流动又反过来参与传热,界面就变成不规则的、随时间变化的曲面。你让仿真软件去追踪这个界面,本质上是在解一个移动边界问题。

移动边界问题最让人头疼的地方在于:界面位置不是事先知道的结果,而是求解过程中由能量平衡自动决定的。如果你用界面追踪法(比如水平集法在相变里的一些应用),每一步都要显式地重构界面、设置边界条件、更新网格,复杂几何下很容易把网格扭成一团,而且两相密度差明显时界面附近的质量和能量守恒很难同时保证。

焓法不太一样。它不直接追踪界面,而是把一个称为“总焓”的物理量作为基本未知量。固相、液相、两相区统一用一套控制方程描述,相变潜热被吸收进焓值的变化里,界面位置在求解之后从焓值反推出来,不需要单独处理。

1.2 焓法和等效热容法的本质区别

很多初学者一开始接触的是等效热容法,也叫表观热容法。思路是把相变潜热折算到相变温度区间内的比热容上,比如材料在固相时比热是 2000 J/(kg·K),在液相时是 2100 J/(kg·K),相变潜热是 200 kJ/kg,相变区间是 40℃ 到 60℃,那就把这段 20℃ 区间内的比热加成(200000 / 20) = 10000 J/(kg·K),等效热容一下子翻了五倍。

这个方法好用是好用,但它有个致命弱点:等效热容在相变区间形成了很高的尖峰,如果网格不够密、时间步长不够小,温度场在穿越相变区间时会发生振荡,甚至出现温度来回抖动但不收敛的情况。而且尖峰区间内的积分精度对网格极其敏感,你在 A 方案里算得挺好,把网格一加密,等效热容的积分反而出偏差了。

焓法不这样做。它的控制方程里直接把焓 h 作为待求变量,潜热以焓的连续变化形式存在,不存在高耸的尖峰。从数值稳定性上讲,焓法的非线性主要体现在焓到温度的反解上,处理起来要温和得多。

我个人的建议很直接:只要你的模型里有明显的相变现象,且相变区间相对较小,直接用焓法。等效热容法只适合粗略估算稳态温度分布的情况,动态过程和时间相关的相变比例,焓法的结果可靠得多。

2. 焓法数学模型搭建:几个关键表达式必须吃透

2.1 液相分数的定义与插值方式

焓法的核心变量是总焓 h,它的物理定义是显热和潜热之和。对于纯物质或者窄相变区间材料,通常把焓写成:

h = ∫ c_p dT + f_L · L

其中 c_p 是比热容,L 是单位质量潜热,f_L 是液相分数。f_L 的取值从 0(全固相)到 1(全液相)连续变化。这个 f_L 是整个模型里的灵魂变量,温度场、流场、材料参数都要挂在它身上。

对于纯物质理想情况,相变发生在单一温度点 T_m,f_L 是一个阶跃函数。但数值计算里没法处理无穷陡的阶跃,必须给它一个小的过渡区间。风扇常见做法是定义固相线温度 T_s 和液相线温度 T_l,然后在线性插值假设下:

f_L = (T - T_s) / (T_l - T_s),当 T_s ≤ T ≤ T_l
f_L = 0,当 T < T_s
f_L = 1,当 T > T_l

这是工程中最常见的线性插值。如果相变不是线性的,也可以用 smoother 的 S 形函数,比如基于误差函数或者正弦的函数补插,但对于大多数工程模拟,线性插值已经能给出足够准确的结果,而且数值稳定性更好。

这里有个细节值得注意:相变区间的宽度不是随便设的。区间设置太窄,比如 T_l - T_s 只有 1℃,焓法模型里热容变化剧烈,求解器每一步都要处理强非线性,极易不收敛。区间设置太宽,相变过程被人为拉长,潜热释放被抹平均摊,结果温度曲线失真。通常建议把区间宽度设置为材料实际相变范围的 1.5 到 2 倍,或者至少大于二维/三维网格尺寸对应的最小特征时间内的温度增量。

2.2 焓值反解温度的逻辑

焓法里第二个关键点是如何从焓值反推出温度。因为控制方程解出来的是焓 h,但材料参数、换热系数、浮力项都需要温度 T,所以必须建立 h 到 T 的逆关系。

在分段线性假设下,反解逻辑是这样的:

如果 h < h_s = ∫_0^T_s c_p,s dT,说明处于全固相,T = h / c_p,s
如果 h > h_l = h_s + L + ∫_T_s^T_l c_p,l dT,说明处于全液相,T = T_l + (h - h_l) / c_p,l
如果 h_s ≤ h ≤ h_l,说明处于两相区,T = T_s + (h - h_s) / (h_l - h_s) · (T_l - T_s)

这个分段逻辑在软件里用条件表达式写,直接用 h 作为自变量。

实现时的注意点:当材料在相变区间内时,它的实际比热不是恒定的,而是等效变化的。建议整个相变区间的焓差(显热加潜热)用一个统一表达式计算,避免分段点处的不连续导致残差跳变。

2.3 参数实例:给一个可以抄作业的案例

我在一个储能项目里做过典型的石蜡相变模型,参数直接拿来举例(点地数据做了一定归一化,工程上符合典型石蜡特性):

参数数值说明
固相密度860 kg/m³固液相密度差不大时可近似常数
固相比热2100 J/(kg·K)
液相密度760 kg/m³如果考虑自然对流浮力,这个差要体现
液相比热2400 J/(kg·K)
导热系数0.25 W/(m·K)固液导热接近,暂不分段
潜热180 kJ/kg典型石蜡级入能量密度
固相线 T_s45℃
液相线 T_l55℃实际石蜡熔化区间比这更宽,我这里做的简化
热膨胀系数0.001 /K用于自然对流浮力项
动力粘度0.005 Pa·s液态石蜡典型粘度,随温度变化略

照这个参数,你算一下相变区间的焓差:

h_s = 2100 × 45 = 94500 J/kg
h_l = 94500 + 180000 + 2400 × (55 - 45) = 94500 + 180000 + 24000 = 298500 J/kg
也就是在 45℃ 到 55℃ 之间,每公斤石蜡要吸收大约 298.5 kJ 的能量,其中潜热占了 180 kJ,比例非常高。这个数字直接决定了储能时间和加热速率,你在后处理时看到某个区域内温度始终停在 45-55℃ 区间,就是在相变储能,温度曲线出现一个明显的平台段。

有了这个参数表,接下来搭建多物理场耦合就有了抓手。

3. 温度场和流场的耦合方式:从单向到双向的升级

3.1 能量方程里的对流项:别漏掉

单纯导热模型只解能量方程,温度场和流场互不影响。但实际相变过程里,液相一旦出现,自然对流就会显著改变热量输运。这时候能量方程需要写成包含对流项的形式:

ρ c_p ∂T/∂t + ρ c_p u · ∇T = ∇·(k ∇T) + Q_latent

其中 Q_latent 是潜热源项,在焓法框架里可以做到温度方程里。也可以用焓形式直接写:

ρ ∂h/∂t + ρ c_p u · ∇T = ∇·(k ∇T)

注意对流项里用的是 c_p 乘温度梯度,不是焓梯度,这在数学上更符合能量守恒的物理分解,也是焓法实现时最容易出错的表达式。

我在实操中的一个体会是,如果材料固相和液相的比热差别较大,对流项里的 c_p 到底取固相值还是液相值会导致明显的温差。通常做法是使用与温度相关的分段 c_p(T),借助液相分数对固液两相的值做插值:

c_p,eff = c_p,s (1 - f_L) + c_p,l f_L

这个表达式看着简单,但它保证了能量守恒在固液界面处的一致性。直接把 c_p 设成常数会高估或低估融化速度,跑出来的相变时间差个 10%-20% 很正常。

3.2 自然对流的浮力驱动:Boussinesq 近似

液态相变材料里的流动绝大多数是自然对流,由温度引起的密度差驱动。如果你直接写流体密度随温度变化的全可压缩 N-S 方程,求解器会处理大量和相变无关的声学尺度物理,又慢又不稳定。

工程上最常用的处理是 Boussinesq 近似。思路是在动量方程里只保留浮力项的密度变化,把动量方程写成:

ρ0 ∂u/∂t + ρ0 (u · ∇)u = -∇p + μ ∇²u + ρ0 β (T - T_ref) g

其中 ρ0 是参考密度,β 是热膨胀系数,T_ref 通常取初始温度或平均温度,g 是重力矢量方向。浮力项只在液相区有物理意义,固相区因为速度被阻尼冻结,该项自然不起作用。

这里有一个先决条件:密度差不能太大,一般要求 ρ_l / ρ_s 在 0.9-1.1 之间。石蜡这种材料固液相密度差在 10%-15%,Boussinesq 近似还能凑合用,如果要更严格,就得走变密度流模型。金属相变时固液相密度差也不大,同样适用。

3.3 糊状区阻尼:保证固相区速度为 0 的物理手段

这是相变耦合模型里最容易忽略、最影响收敛的关键项。试想液相分数 f_L = 0 的区域,材料还是固体,不应该有任何流动速度。但如果只靠前面那些方程,速度场会把整个计算域都当流体去算,固相区会出现泄漏速度,物理上完全错误。

解决思路是在动量方程里加一个“糊状区阻力项”,模拟固相区对流动的巨大阻力。最常用的是基于 Darcy 定律的 Carman-Kozeny 表达式:

F = -C (1 - f_L)² / (f_L³ + ε) · u

这里的 C 是糊状区常数,工程上取 10^4 到 10^7 甚至更大, ε 是个很小的正数防止分母为零,通常取 10^-3 量级。当 f_L = 0(全固相)时,这个阻力项趋向无穷大(物理上被 C 限制在一个超大值),速度被强推为 0。当 f_L = 1(全液相)时,阻力项为 0,不影响流动。

有个实用经验:C 值不能无条件取最大。C 取 10^7 时,动量方程里这个阻力项的数量级非常大,会破坏矩阵的条件数,导致非线性求解器每步都很难收敛。我的习惯是先从 10^4 开始试算,确认固相区的速度泄漏量级已经低于 10^-6 m/s 之后再逐步加,加到 10^6 为止。大部分情况下 10^5 到 10^6 足够。

这个阻尼项还顺便解决了相变界面的数值稳定性问题。没有它,液相分数在 0-1 之间的界面区域会产生虚假的对流,严重时会在界面两侧形成振荡的温度涟漪,画面非常难看。

3.4 耦合方式是单向还是双向?什么时候必须双向

如果你的相变材料是纯导热主导,比如热源功率很小、液相区流动很弱,那可以只做单向耦合:先解温度场,根据温度分布算出液相分数,再把液相分数映射到材料参数(粘度、热容、导热系数),更新流场速度。这种解法和解耦求解,速度快很多。

但如果自然对流的 Rayleigh 数高,热源功率大,流场反过来显著影响温度分布,尤其你想准确预测“融化前锋的形状”时,单向耦合完全不够。必须做双向耦合,也就是每个时间步内同步求解动量方程、连续性方程、能量方程和焓反解,所有变量联动更新。焓法的非线性本身已经够强,双向耦合会让非线性进一步增强,这时候求解策略就成了关键。

我个人的取舍标准是看无量纲数 Ra 是否超过临界值:

Ra = g β (T_hot - T_cold) H³ / (ν α)

H 是特征尺度,ν 是运动粘度,α 是热扩散率。Ra 超过 10^5 时自然对流已经是主要传热机制,必须双向耦合。低于 10^4 时单向耦合误差可以接受。这个判断标准我用了很多年,基本靠谱。

4. 实操流程:从几何搭建到后处理的完整执行方案

4.1 物理场选择与接口组合

我不强调具体软件品牌(工程圈都知道这类多物理场工具的通用流程),但无论你用哪套平台,典型的相变-流-热耦合模型物理场组合都是:

  • 流体流动接口,求解 N-S 方程 + 连续性方程
  • 固体传热/流体传热接口,用于能量方程
  • 自定义变量/方程,用于计算液相分数 f_L、焓 h、温度反解 T(h)

这里有个自由度的选择问题。用哪个温度变量去求解,决定了表达式写法。我用过两种方案。

方案 A:主变量直接用温度 T,焓法以“表观热容”加“潜热源项”的形式实现。具体做法是能量方程里把热容替换成热焓对时间的偏导数项,同时在瞬间添加一个潜热释放源项。优点是与传热接口兼容度最高,后处理直接看温度。缺点是实质上回到等效热容路线,对网格敏感。

方案 B:主变量改成焓 h 或使用热容形式材料,但这种写法通常要到更高阶的自定义弱形式才能实现,通用接口下反而难操作。

对于绝大多数工程场景,我建议你使用表观热容形式的写法,但要把热容表达式精心构造,避免直接用尖峰函数。具体做法:定义等效热容 C_eff(T),在整个温区内连续:

C_eff = c_p,s (1 - f_L) + c_p,l f_L + L / (T_l - T_s) · df_L/dT

由于 f_L 是线性插值时,df_L/dT 在两个相变边界点是阶跃的。为了让数值稳定,我给 df_L/dT 用一个小平滑,实际效果比理想阶跃好得多。

4.2 几何建模与网格分区

建立二维或轴对称模型时,我通常把计算域画成矩形或圆柱腔体。关键网格处理原则:

  • 相变前沿可能经过的区域加密,加密区的网格尺寸不超过总特征长度的 1/30
  • 壁面处添加边界层网格,至少 5 层,第一层厚度根据预期对流强度设定,确保 y+ 满足低 Re 涡模拟要求
  • 如果使用高度函数初始化液相分数 0,初始时刻全固相,逐步融化

焓法和 Level Set 不同,不需要界面附近高精度贴体网格,因为界面是隐式捕捉的,只需要确保相变区间温度变化对应的焓值能被网格积分覆盖。一个可量化的经验:在最大局部热流密度下,网格间距需要满足使得一个时间步内温度变化小于 0.5×(T_l - T_s)。

4.3 边界条件设置实例

以一个带内热源的方形储能单元为例:

  • 左侧壁面加热,温度恒定 80℃
  • 右侧壁面自然对流散热,对流系数 10 W/(m²·K),环境温度 25℃
  • 上下壁面绝热
  • 初始温度 25℃,全固相,速度场初始为 0
  • 重力方向沿-y轴,浮力驱动液相向上流动

这些条件写起来都不复杂,但耦合设置里有两个坑:

第一个坑是压力参考点必须设置。纯自然对流问题,速度场是由浮力驱动的,压力没有唯一绝对参考,不设参考点的话压力方程奇异,求解器会报错或长时间不收敛。我在所有涉及自然对流的模型里,计算域角落固定一个压力零点。

第二个坑是壁面附近的浮力方向。如果加热壁在左侧,液体受热后沿左壁上升,在顶部转向右,在右壁冷却下降,形成一个逆时针的大涡环。你不能把所有壁面都设为无滑移就完事,还要检查浮力项的方向设定是否正确。我第一次做的时候把重力项写错方向,算出来的涡环方向完全反了,温度场倒是没太大差异,但流场后处理一眼就看出来有问题。

4.4 瞬态求解器参数与时间步策略

瞬态求解设置里最影响结果是时间步进方式:

  • 用 BDF 2(二阶向后差分)或等价的隐式时间格式,避免显示格式的时间步限制
  • 初始时间步设得非常小,取 0.001 秒量级,让求解器从全固相平稳启动
  • 开启自适应时间步进,步长上限控制在 1 秒左右,下限 1e-5 秒
  • 非线性残差容差设置为默认值的 1/10,比如 0.001,保证界面推移的精度

焓法模型的非线性非常强,尤其是温度穿越相变区间的瞬间,物理特性突变。这种情况下直接全体方程全耦合求解,求解器每步的雅可比矩阵更新成本很高,但值得。

我常用的策略是“先导热后对流”两步走:第一步关闭流体求解,只算纯导热的相变过程 0.5 秒,得到初始温度场;第二步再开启流体耦合求解。这个方法能快速跨过最困难的启动段,节省大量时间并且显著提高稳定性。

4.5 后处理重点指标与可视化

模型算完,后处理要看哪些东西?

第一个是液相分数云图。它是最直观的相变过程体现,你能够在不同时间切片上看到固相逐渐缩小的全过程轮廓。可以用 0.5 等值线代表界面位置,看它的推进路径是否合理。

第二个是温度历史曲线。选取几个监测点,分别位于靠近热源、中间区域、远离热源位置,画出温度随时间变化。典型的相变曲线应该出现斜率先升、中间变缓(相变平台)、随后斜率恢复的过程。平台段的长度对应潜热吸收时间。

第三个是速度场。看液相区的涡环结构是否形成,涡心位置大概在哪个区域,最大流速数量级是否符合自然对流的常识(通常几毫米每秒到几十毫米每秒)。

第四个是能量守恒校验。这个方法非常必要:把整个计算域的焓随时间的变化率与边界热流积分总量去做对比。我每次都要算这个总量差的曲线,如果能量不平衡超过 5%,说明模型或者求解参数有问题。曾经有一次我漏掉了相变区间的热量计算,能量曲线直接缺口,排查了半天才发现是液相分数插值表达式写错了一个边界。

5. 常见问题与排查技巧实录

5.1 温度场锯齿振荡,界面像锯齿怎么办

锯齿振荡基本都出在液相分数和潜热的处理上。排查顺序:

第一步,检查相变区间的宽度是不是太小。如果 T_l - T_s 只有 0.5℃,网格稍粗就被温度跳跃跨过了,必然振荡。把区间放大到 2-5℃,如果振荡消失,就是这个问题。

第二步,检查等效热容是不是存在尖峰。理想线性插值产生的 df_L/dT 是常数,不会尖峰,但如果你用了非线性光滑函数,相位变化集中在极窄区间内,等效热容就有尖峰隐患。

第三步,检查网格在相变前沿区域是否足够细。界面处温度梯度大,网格太粗时界面推进是一格一格跳的,看起来像锯齿。

5.2 计算发散,提示非线性求解器不收敛

最典型的场景发生在材料刚开始熔化那几步。这时候潜热突然释放,温度对焓的非线性映射变化剧烈,牛顿迭代容易振荡。

排查技巧:

第一,调小初始时间步长。把这个参数缩小一个数量级,通常就能跨过启动难关。

第二,给液相分数加“松动”。英语里叫 under-relaxation,也就是液分更新不用全量,每一步只更新一部分:

f_L,new = f_L_old + α (f_L_calc - f_L_old)

α 取 0.5-0.8。这个做法牺牲一点点时间精度,但换来了极其稳定的收敛过程。

第三,如果时间步长已经非常小而仍然发散,查看是不是糊状区常数 C 太大。把 C 从 10^6 降到 10^4 试试。有的模型里 C 过强会让动量方程局部条件数剧增。

第四,检查初始条件是否自洽。初始温度恰好卡在相变区间边界上,有时候会触发初始残差极大。把初始温度稍微调整 0.1℃,或者初始给一个极小的液相分数 1e-4,也能绕过。

5.3 速度场在固相区出现非零速度

如果固相区速度不是零,先检查糊状区阻尼项是不是写进了方程。这个大概率是漏写了这个源项。不是漏写的话,检查 C 值是不是太小,增大一个数量级看看。

另外注意 f_L 的数值精度。如果 f_L 在固相区因为数值误差变成 1e-5 而不是精确的 0,那个小值被代入阻尼公式(1-f_L)²/(f_L³+ε),虽然分母有 ε 保护,但 C 值如果不够大,仍旧会出现微小泄漏。

5.4 相变时间过短或过长,和理论值明显不符

相变持续总时长对不上理论估算,通常在两个地方:

第一,潜热值是不是被正确“激活”了。有时候材料定义里 L 被填成 0,潜热完全不起作用,融化时间比理论值少 40% 以上。排查方式是在能量守恒曲线里看潜热贡献段。

第二,相变区间宽度被设置得过宽。假设实际材料相变区间只有 1℃,但你在模型里为了数值稳定把它拉成 20℃,潜热在这个过程中均匀释放,虽然消耗的总能量一致,但热流分配方式和实际情况不一样,会导致融化过程持续时间偏长。这里要做一个平衡:数值稳定和物理保真之间的折中。

5.5 快速排查清单

症状首要怀疑点推荐措施
温度锯齿振荡相变区间太窄/网格太粗增大 T_l-T_s,加密网格
不收敛初始步长过大初始步长缩到 1e-4 再试
流场冻结/泄漏糊状区阻尼缺失检查 C(1-f_L)²/(f_L³+ε)项
相变时间偏短潜热没接上检查 L 的表达式链接
温度平台不明显等效热容无尖峰但区间宽适当压缩相变区间

5.6 一个非常隐蔽的坑:热物性参数插值

固相和液相的热物性不同,尤其导热系数可能差好几倍。如果你只在材料属性里用分段函数切换,而没有通过液相分数做光滑过渡,界面处的导热系数突变会带来严重的数值不连续性。

建议所有依赖于相态的物性参数都统一写成:

k_eff = k_s (1 - f_L) + k_l f_L

这样的形式。这不是额外的物理假设,而是数值处理上的必需操作。我当年做金属相变时,固态的导热系数比液态高大约 60%,最初没做过渡处理,温度场界面处出现了无物理意义的高频扰动。改成这个直接插值后,一切都稳了。

关于参数选择,我最后再啰嗦几句

相变仿真做到最后,瓶颈往往不在软件操作,而在你对材料相变行为的物理理解有多深。焓法这个数学框架本身非常优雅,它把一个强非线性移动边界问题转化为单域固定网格问题,只要掌控了液相分数、焓反解、糊状区阻尼这三个核心环节,绝大多数工程相变场景都能稳定算出来。

最后分享一个我个人的实践经验:拿到任何相变模型,第一件事不是急着调求解器,而是先验算焓差和能量总量。在 Excel 里花十分钟把固相升至熔点、潜热吸收、液相继续升温这三段能量相加,和总加热功率乘以预期时间做个对比。如果这个粗算和仿真结果的量级对不上,后面调什么都白费。把这一步养成习惯之后,你做相变模型的速度和一次成功率高得惊人。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询