最近在整理相变蓄能模块的仿真文档,顺手把相变潜热处理的一整套算法流程用伪代码固定了下来。这个动作看着不起眼,但你要真去做过传热数值计算就会知道,相变潜热处理是储能材料、蓄冷蓄热装置、电池热管理甚至建筑围护结构仿真里最绕的一环:光有能量方程不够,里面那部分“藏起来的潜热”不会老老实实地按显热升温来走。伪代码的作用,就是把这个非线性过程从“心里明白”变成“纸上能交流、代码能落地”的东西。这篇博文就围绕“伪代码示意相变潜热处理”展开,写给正在做相变仿真、需要复现算法或刚接触这块内容的工程师和研究生。
我自己日常做相变传热仿真,经常要在论文、技术报告、评审材料里向别人解释:相变潜热到底是怎么被数值算法“吃”进去的?与其丢一段几千行的Fortran或者Python源码,不如先丢一段伪代码。伪代码没有语法负担,又能把时间推进、相变区间判断、焓场修正这些核心逻辑讲得明明白白。下面我就从物理背景、方案选型、设计思路、完整伪代码示例和踩坑经验这几个方面,把这些年总结的东西一次说透。
1. 相变潜热处理到底在算什么
1.1 相变过程的主要热学特征
相变潜热处理,处理的对象本质上是“材料在熔化或凝固过程中吸收或放出的那一大块热量”。拿大家都熟悉的冰水混合物来说:0℃的冰吸收热量融化时,温度长时间停在0℃附近,直到全部冰变成水,温度才继续往上升。这块让冰融化、却不表现为温度升高的热量,就是潜热。
数值模拟里遇到相变材料,最常见的麻烦是:材料的热物性在相变点附近发生了很剧烈的变化。固态时是某个比热容和导热系数,液态时是另一个,两者可能差几倍甚至一个量级;再加上相变界面又会移动,如果把材料当成普通固体来算,算出来的温度曲线往往和实验对不上。更麻烦的是,相变不是在一个严格的单点温度发生的,实际材料通常有一个相变温度区间,比如石蜡类相变材料可能在 28℃ 到 32℃ 之间逐步完成熔化。区间内既存在固态部分,也存在液态部分,两部分的体积分数还在不断变化。
所以,相变潜热处理处理的核心问题是:在一个既有显热(温度升高带走的热量)又有潜热(相变界面移动带走或释放的热量)的系统里,如何用一个统一的能量方程,把这两部分热量都算对,还要求数值过程稳定、不振荡、不焓发散。
1.2 处理潜热的难点与算法目标
如果只看经典的导热方程:
ρ c_p (∂T / ∂t) = ∇·(k ∇T)
这个方程只能描述显热过程。要描述相变潜热,需要在方程右边或者物性项里额外加入潜热贡献。假如一个单元正在发生相变,每秒钟吸收的热量里只有一部分让温度升高,剩下一部分在“制造液态部分”。如果你的算法没有把这个过程显式表达出来,很容易出现两种典型故障:温度卡在相变温度附近振荡,或者相变界面推进速度明显偏快偏慢。
从算法目标来说,相变潜热处理至少要满足三点:
- 能量守恒要尽量好。整个计算域内的总能量增量应该等于边界流入的热量,不能让潜热“凭空消失”。
- 相变界面位置和温度场的演化要合理。界面推进速度、温度分布要和解析解或者实验数据对得上。
- 数值过程要稳定。特别是在相变温度区间较窄时,温度迭代不能出现非物理振荡。
这三条说起来简单,实际做的时候反反复复出问题。我自己的体会是,先把物理图像搞清楚,再谈算法怎么写。
1.3 为什么伪代码能帮上忙
很多新手拿到相变仿真代码,习惯直接去读现成开源程序或商业软件的帮助文档,结果看半天也不知道某个模块到底在干什么。伪代码最大的价值不是给机器看,而是给人看。它把物理场更新、物性判断、潜热修正这些步骤,按照人脑容易理解的方式重新组织一遍。
我写这篇“伪代码示意相变潜热处理”,本质上就是把工程里已经验证过的一种通用处理框架拿出来,去掉具体编程语言的干扰,让读者先建立算法骨架。等你真的要把这段伪代码翻译成 Python、MATLAB 或 C++ 时,只需要把每个框里的步骤映射到对应的数组操作和循环结构就行了。伪代码的另一个好处在于:它能清楚地区分“物理判断”和“数值细节”,比如相变区间判断、液相分数更新这类物理逻辑,应该放在最显眼的位置;而网格编号、索引进位这些琐碎内容,可以后置处理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 主流处理方案与伪代码选型
2.1 等效比热容法
等效比热容法,也叫显热容法,是最容易理解的一类方案。它的核心思路是:既然相变潜热会让材料在相变区间内表现出“大得离谱的比热容”,那我干脆把潜热折算到比热容里,让比热容在相变区间内变大。
公式上通常写成:
c_p,eff(T) = c_p,s + L / (T_l - T_s) ,当 T_s ≤ T ≤ T_l
c_p,eff(T) = c_p,s 或 c_p,l ,当 T 在相变区间外
其中 T_s 是固相线温度,T_l 是液相线温度,L 是单位质量潜热。等效比热容法的优点是编程简单,只用普通导热方程,把物性函数替换成温度相关的等效比热,再搭配迭代算法就能算。我自己早期做一维融化问题时就先用这个方法练手。
它的麻烦在于,如果相变温度区间很小(比如纯物质相变接近单点温度),等效比热容会变得非常大,时间步长必须取得很小,否则温度会跳过相变区间,潜热根本没被吸收。伪代码里体现这个方法时,重点要放在“物性查表”和“比热容如何随温度更新”上。
2.2 焓法
焓法是目前处理相变潜热的主流方案之一,也是我在伪代码里最常选择的方法。所谓焓,就是把显热和潜热打包成一个状态量:
H = ∫ c_p dT + L · f_l
其中 f_l 是液相分数。液固两相区里,f_l 在 0 和 1 之间变化;固态区 f_l = 0,液态区 f_l = 1。相变潜热处理在这里就变成了:先计算每个单元焓的演化,再从焓反推温度或液相分数。
焓法的好处是能量守恒形式很直接,不需要人为去制造一个“等效比热”,而且处理有相变温度区间的材料时稳定性比等效比热容法好。缺点是要多维护一个焓场,并且在从焓反推温度时要做判断和插值。但从伪代码的组织来看,焓法反而逻辑更顺:先更新焓,再更新液相分数
