简介:这套资料聚焦 Fluent 中重力热管蒸发冷凝过程的 UDF 模拟实现,面向需要编写相变自定义函数的热管理仿真工程师与研究生。压缩包共 2 个文件,包含 1 个 C 语言 UDF 源码与 1 篇中文文献,前者可用于蒸发冷凝相变模型搭建与源项修改,后者提供超长重力热管地热提取案例供参数和边界条件参考。已有 1561 人学习下载。内容覆盖工作流体物性定义、相变质量与能量源项更新、冷凝端边界条件设置等关键环节,并结合具体文献场景展示如何调试时间步长、输出温度分布与质量流率。对于正在开展热管仿真、希望借助 UDF 提升模型精度或优化设计的人员,这份资料提供了可落地的代码模板和对照文献,能有效缩短相变模拟的上手周期。
1. 蒸发冷凝模拟不是选模型,是写源项
热管仿真的问题从来不是“Fluent 里哪个模型能做蒸发冷凝”,而是默认设置下你根本得不到一个能稳定收敛的相变界面。做热管理的人第一次跑热管时,往往栽在同一个地方:液相体积分数初始化没问题,温度场也有梯度,但蒸发段就是不降温,冷凝段就是不回落,残差曲线一路攀升。原因基本都能归到 UDF 里那段质量源项身上——符号写反了、单位错了、或者 dS[eqn] 给成了 0,任何一个都足以让连续方程在几百步内崩掉。
所以蒸发冷凝的 Fluent 仿真,真正要解决的核心不是选 VOF 还是 Mixture,而是把 Lee 模型的相变源项老老实实写成 C 代码,再挂到对应的 cell zone 上。本文按“模型 → UDF 写法 → 热管结构 → 文献参数换算 → 验证方法”的顺序,给出一套可以直接往自己算例里搬的模板和调试路径。适合正在做热管、均温板或微通道蒸发冷却的工程师,也适合刚接触 Fluent 二次开发、想知道相变 UDF 从哪下手的 CFD 从业者。
2. 蒸发冷凝 UDF 怎么写:Lee 模型的源项与挂载
2.1 为什么 Fluent 自带模型不够用
Fluent 自带蒸发冷凝模型,内部也是 Lee 模型那一套温度阈值判断,理论上勾选 Multiphase 里的 Evaporation-Condensation 就能用。但实际跑热管时会发现两个比较棘手的问题。第一,自带模型的相变方向按饱和温度一刀切,热管里有蒸发段、绝热段、冷凝段三个区域,根据壁面热流的方向,局部温度可能非常接近饱和温度,判断容易抖动。第二,当吸液芯用多孔介质建模时,自带模型对 Porous Zone 里 VOF 的处理不透明,孔隙率和有效导热系数怎么参与相变、参与多少,文档不会告诉你细节。
VOF 框架下自己写 UDF,好处是源项逻辑完全可控。你可以明确写出“当这个单元在蒸发段且液相体积分数大于某个阈值时,液相质量被抽走、气相质量被加上、能量按潜热扣除”,并且用坐标或 region ID 去判别部位。这样一来,热管的三个功能段就不是靠默认模型自动猜,而是由你通过几何条件显式控制。这也是蒸发冷凝仿真中“确定性与可复现性”的关键。
给自己写 UDF 的另一个理由是参数标定。自带模型不开放系数,修改需要进入隐藏的非标准路径。而 UDF 里蒸发系数、冷凝系数、饱和温度、潜热、密度修正全部是宏定义常量,改一个数就能重新编译,适合按实验数据来回校准。
2.2 一套可直接编译的 UDF 模板
下面这套基于 VOF 框架的模板,是最常见的蒸发冷凝 UDF 写法。液相质量源项为负(蒸发使液相减少),气相为正。dS[eqn]一律给出源项对温度的导数,这样隐式求解器才能有效处理相变的强烈非线性。
#include "udf.h" #define T_SAT 323.15 /* 饱和温度,单位 K,按热管工作压力换算 */ #define H_FG 2.26e6 /* 汽化潜热,单位 J/kg,水工质参考值 */ #define EVAP_COEF 0.1 /* 蒸发系数,单位 1/s,标定起点 */ #define COND_COEF 0.2 /* 冷凝系数,单位 1/s,通常略大于蒸发系数 */ DEFINE_SOURCE(mass_liq, c, t, dS, eqn) { real source = 0.0; real T = C_T(c, t); real al = C_VOF(c, t, 0); /* 液相体积分数 */ real rl = C_R(c, t, 0); /* 液相密度 */ if (T > T_SAT && al > 1e-4) { /* 蒸发条件:过热度 + 有液可蒸发 */ source = -EVAP_COEF * al * rl * (T - T_SAT) / T_SAT; dS[eqn] = -EVAP_COEF * al * rl / T_SAT; /* 对 T 求导 */ } else { dS[eqn] = 0.0; } return source; } DEFINE_SOURCE(mass_vap, c, t, dS, eqn) { real source = 0.0; real T = C_T(c, t); real al = C_VOF(c, t, 0); real rv = C_R(c, t, 1); /* 气相密度 */ if (T > T_SAT && al > 1e-4) { source = EVAP_COEF * al * rv * (T - T_SAT) / T_SAT; dS[eqn] = EVAP_COEF * al * rv / T_SAT; } else { dS[eqn] = 0.0; } return source; } DEFINE_SOURCE(energy_pc, c, t, dS, eqn) { real source = 0.0; real T = C_T(c, t); real al = C_VOF(c, t, 0); real rl = C_R(c, t, 0); if (T > T_SAT && al > 1e-4) { source = -EVAP_COEF * al * rl * (T - T_SAT) / T_SAT * H_FG; dS[eqn] = -EVAP_COEF * al * rl / T_SAT * H_FG; } else if (T < T_SAT && al < 0.999) { real rv = C_R(c, t, 1); source = COND_COEF * (1.0 - al) * rv * (T_SAT - T) / T_SAT * H_FG; dS[eqn] = -COND_COEF * (1.0 - al) * rv / T_SAT * H_FG; } return source; }这段代码里能量源项同时处理了蒸发与冷凝两个方向。蒸发时潜热被吸收,所以源项是负值;冷凝时潜热释放,源项为正。这里把能量源项写在一个宏里,而不是分别给液相和气相各挂一次,能避免相变潜热被重复计算。
三个参数需要特别关注。EVAP_COEF和COND_COEF的单位是 1/s,本质是“单位过热度下单位体积内可参与相变的液体或蒸汽的比例速率”。系数越大,相变越剧烈,源项绝对值越大,收敛越困难。热管水工质场景,一般从 0.1 起步,量级在 0.01~1.0 之间调整。T_SAT必须根据热管内部工作压力换算,不能直接填 100 摄氏度,因为热管内部是负压或正压充装,饱和温度可能偏离常压沸点十几摄氏度以上。
2.3 在 Fluent 里挂载 UDF 的步骤与两个隐藏坑
编译挂载的路径是 Define → User-Defined → Functions → Compiled,选中.c文件构建后,在 Cell Zone Conditions 里进入对应流体区域的 Source Terms 面板,分别给液相、气相选择mass_liq、mass_vap,给混合相选择energy_pc。这里要注意 Multip Phase 模型必须提前选成 VOF,否则C_VOF宏不会正常工作。
坑一:源项单位。Fluent 对质量源项按 kg/m³/s 积分,对能量源项按 W/m³ 积分。很多从 MATLAB 或自编程序转过来的工程人员,容易把能量源项写成焦耳而不是瓦,导致区域温度在几步之内冲上几千开尔文。建议挂载前先对数量级做一次手算:蒸发 1 kg/m³/s 的水,潜热 2.26e6 J/kg,体积热源是 2.26e6 W/m³,这个量级放在一个厘米级热管单元上是很大的,亚松弛因子必须压到 0.3 以下。
坑二:初始化。热管初始状态应该是液相工质充满吸液芯,蒸汽腔里是饱和蒸汽。如果直接 Standard Initialization,整个计算域默认全是空气或全是单一相,蒸发源项里al > 1e-4的条件永远不会成立。建议先 Standard Initialization 给全场基础流场,再用 Patch 把吸液芯区域液相体积分数设为 0.8~0.95,蒸汽腔设为 0。这个操作顺序比用混合初始化更符合热管实际物理状态。
3. 热管里的蒸发与冷凝:多孔介质、分区与参数配置
3.1 热管三段结构怎么在 UDF 里判别
热管的结构决定了蒸发冷凝源项不能全局统一。蒸发段靠吸液芯里的液体吸热蒸发,冷凝段靠蒸汽接触壁面放热凝结,二者在同一个流体域里同时发生。用温度阈值判断只能区分“高于饱和温度”和“低于饱和温度”,但绝热段几乎总是处于饱和温度附近,温度抖动会造成源项方向频繁反转。
常见的做法是用几何坐标划分区域。对于一根轴向放置的圆柱热管,假设蒸发段在底部、冷凝段在顶部,UDF 里取单元中心坐标的轴线分量即可。
#include "udf.h" #define Y_EVAP_END 0.04 /* 蒸发段结束的轴向坐标,单位 m */ #define Y_COND_START 0.08 /* 冷凝段开始的轴向坐标,单位 m */ real check_section(real y) { if (y < Y_EVAP_END) return 1.0; /* 蒸发段 */ if (y < Y_COND_START) return 0.0; /* 绝热段 */ return -1.0; /* 冷凝段 */ }在mass_liq源项里调用check_section(C_CENTROID(c, t)[1]),蒸发段置 1 时正常蒸发,冷凝段置 -1 时让液相源项反向作为凝结项。这种方式比纯温度判断稳定得多,尤其是热管启动阶段,整体温度都在缓慢上升,用坐标分区能保证边界条件从第一步就符合几何设定。
3.2 吸液芯多孔介质参数设定
热管蒸发段内部是多孔吸液芯,在 Fluent 里一般建模成 Porous Zone。蒸发冷凝 UDF 是否收敛,很大程度上取决于多孔介质参数的物理合理性。下面是热管吸液芯最常用的一组设定参考。
| 参数 | 典型范围 | Fluent 设置位置 | 对 UDF 的影响 |
|---|---|---|---|
| 孔隙率 | 0.5~0.7 | Porous Zone → Porous Zone | 决定液相体积分数的初值和可蒸发量 |
| 粘性阻力系数 | 1e10~1e12 1/m² | 同一面板,Direction Vector 按轴向 | 决定吸液芯内毛细回流压降,过高会让液体回流不足 |
| 惯性阻力系数 | 0~5 1/m | 同上 | 低速热管可忽略,高速蒸汽需计入 |
| 有效导热系数 | 由孔隙率和固体材料计算 | LTNE 模型或手动给出 | 影响固体壁到液体的热量传递路径 |
吸附芯内液体回流是靠毛细力驱动,压降太小则蒸干风险高,压降太大则冷凝段液体回不来。工程上先用达西定律估算粘性阻力系数:已知渗透率 K 的情况下,粘性阻力系数等于 1/K。烧结铜吸液芯渗透率约在 1e-11~1e-13 m² 量级,换算成 Fluent 输入就是 1e11~1e13 1/m²。先用低值跑通,再逐步提高,观察蒸发段壁面最高温度的变化趋势,是标定多孔介质参数最直接的方式。
3.3 边界条件与初始化的配合
热管没有传统意义上的入口和出口,边界主要是蒸发段壁面的恒热流、冷凝段壁面的对流换热系数或定温。Fluent 中可以对壁面热流密度做参数化,常见做法是 Define → Expressions 里写一个表达式,比如把热流密度定义成工况变量的函数,后续只需改动参数值即可批量计算。这个思路很适合热管性能曲线的扫描:改变加热功率,观察总热阻和蒸发段温度,不用每次重新编译 UDF,只要改表达式里的一个数。
初始化顺序上,热管这类封闭循环系统建议使用 Standard Initialization 加 Patch,而不是直接上 Hybrid Initialization。混合初始化会先做几个伪时间步让流场连续,但热管内液体与蒸汽的初始分布是强间断的,混合初始化反而可能把液相体积分数抹平到其实不合理的位置。Patch 的液相区域要严格限定在吸液芯 zone,蒸汽腔的液相体积分数设为 0。第一轮算 200 步之后,如果发现蒸发段液体被抽空了,说明EVAP_COEF偏大或液相回流补不上,优先减小系数而不是强行加密网格。
4. 文献参考:蒸发/冷凝系数的取值与单位换算
4.1 文献参数不能直接抄的三类情况
热管和蒸发冷凝相关的文献里,UDF 最常被引用的参数是蒸发系数、冷凝系数、潜热和饱和温度。但直接抄论文里的系数通常跑不出同样的结果,因为文献里给出的系数经常不是同一个物理定义。第一类文献给的是 Lee 模型原式系数,单位 1/s,可以直接对照本文模板里的EVAP_COEF;第二类文献给的是蒸发传热系数,单位 W/m²/K,需要通过公式换算;第三类文献给的是基于实验拟合的经验常数,带长度量纲或时间量纲,需要还原到源项形式。
最常踩的换算错误是把单位制搞混。英文论文里热流密度用 W/cm²,潜热用 J/g,密度用 g/cm³,三个换算系数叠加后源项可能差出 1e3 倍。拿到文献参数后的第一步应当是统一到 SI 单位,把所有能量换算成焦耳、长度换算成米、密度换算成 kg/m³,再代入 UDF。
4.2 蒸发传热系数与 UDF 系数的换算公式
如果文献给的是蒸发传热系数 h_evap,定义是壁面过热度与热流密度的比值,那么要把 h_evap 换算成 Lee 模型里的蒸发系数,可以用下面这个关系近似换算。假设蒸发发生在液相体积分数 al 的区域内,热流密度 q 等于蒸发传热系数乘以过热度,同时 q 也等于质量源项乘以潜热,展开后得到:
COEF ≈ h_evap / (rl * H_FG)这里 rl 是液密度,单位 kg/m³,H_FG 是潜热,单位 J/kg,h_evap 单位 W/m²/K。热管水工质在 60~80 摄氏度工作温度下,rl 约 970 kg/m³,H_FG 约 2.3e6 J/kg。若文献给出 h_evap = 5 kW/m²/K,换算下来的 COEF 大约为 0.0022 1/s,比直接拍脑袋填 0.1 低两个数量级。这也是很多热管仿真过热的真正原因:系数过大导致单位步长内蒸发量远超实际,局部压力飙升,求解器只能通过时间步崩溃来“刹车”。
下面这张表汇总了热管蒸发冷凝 UDF 参数的主要来源和推荐起点。
| 参数 | 文献常见来源 | 推荐起点 | 调整方向 |
|---|---|---|---|
| 饱和温度 T_SAT | 根据热管内充装压力和工质物性计算 | 等于工况平均壁温附近 | 以冷凝段壁温为锚点,偏差不超过 5 K |
| 蒸发系数 EVAP_COEF | Lee 模型原式或蒸发传热系数换算 | 0.01~0.1 1/s | 蒸发段出现温度尖峰的,降低一个数量级 |
| 冷凝系数 COND_COEF | 冷凝传热系数换算 | 0.1~0.5 1/s | 冷凝端温度变化过慢的,适当增大 |
| 汽化潜热 H_FG | NIST 物性表或工质手册 | 工作温度下取值 | 随饱和温度小幅变化,不宜用 0 摄氏度参考值 |
4.3 表面张力与接触角在热管 UDF 里的位置
蒸发冷凝 UDF 本身不直接引用表面张力和接触角,但在热管仿真中这两个参数通过毛细回流间接影响蒸发速率。吸液芯的毛细压差由表面张力、接触角和有效孔径共同决定。如果仿真只写蒸发冷凝源项而不设置表面张力,多孔介质内的液相回流只靠重力或惯性力,热管蒸发段到冷凝段的液体循环会非常缓慢,最终表现为蒸发段被蒸干。
Fluent VOF 模型的表面张力设置在 Phase Interaction → Surface Tension 面板,接触角作为壁面边界条件的一部分施加。热管常用的水-铜组合,接触角在浸润状态下接近 0~30 度,表面张力系数按工质工作温度查表。要注意的是,在多孔介质区域中,接触角应施加在吸液芯与蒸汽腔的交界面,而不是外壁面上,否则毛细力会作用在错误的位置。
5. 验证蒸发冷凝 UDF 的最小用例与三个典型收敛病
5.1 一个不需要实验数据的验证方法
没有实验数据时,验证蒸发冷凝 UDF 是否正确的办法是构造一个封闭系统做能量和质量守恒自检。以一根简化热管为例:2D 轴对称,长度 100 mm,蒸发段 30 mm,绝热段 30 mm,冷凝段 40 mm,吸液芯厚度 1 mm,蒸汽腔半径 3 mm。边界条件设定为蒸发段给恒定热流密度 5 W/cm²,冷凝段给对流换热系数 1000 W/m²/K 与冷却流体温度 20 摄氏度,绝热段绝热。
计算收敛后检查三个量。一是整体的液相体积分数总和几乎不变,因为蒸发段抽走的液体和冷凝段凝结回来的液体应当平衡;二是蒸汽腔平均温度接近饱和温度,偏差超过 10 K 说明系数或饱和温度设置有问题;三是蒸发段壁面温度与冷凝段壁面温度的差值,这个温差代表热管总热阻,正常情况下应当在 10 K 以内,远小于同样热流密度下纯固体铜壁的温差。
质量守恒的具体判断标准,可以在 Fluent 里增加两个 Report Definition:一个监测液相质量源项的体积分,另一个监测气相质量源项的体积分。稳态收敛时两者绝对值差应小于 0.5%,差值过大说明能量源项与质量源项之间潜热系数H_FG不一致,或者两个源项挂载到了不同的 zone 上。
5.2 三个典型收敛病与对应处理
残差曲线上的三种典型病各有明确对策。第一种是能量残差锯齿状震荡、每步都周期性回升,通常原因是时间步长与蒸发源项特征时间不匹配。解决办法是先把时间步长从 1e-4 s 降到 1e-5 s,同时把能量亚松弛因子从 1.0 压到 0.5。第二种是连续性残差始终不降,卡在 1e-3 附近,先检查源项符号和单位,再检查质量源项里的dS[eqn]是否给了零值,隐式处理缺失会让连续方程只能靠显式迭代硬顶。第三种是蒸发段温度正常但冷凝段完全不凝结,温度场显示蒸汽一路冲过热管末端,这是冷凝系数过小或冷凝段壁面热量排不出去,优先提高COND_COEF,或检查冷凝段边界条件是否真的处于低温侧。
如果以上都调不动,最后一招是把EVAP_COEF从 0.1 改成 0.05,同时把液相体积分数的阈值从 1e-4 提高到 1e-3,让源项在界面上更平缓地切入。这个操作往往比单纯减小松弛因子更快降低残差峰值,也是蒸发冷凝 UDF 标定过程中投入产出比最高的一步。
本文还有配套的精品资源,点击获取