十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Fluent重力热管蒸发冷凝UDF实现与仿真要点

Fluent重力热管蒸发冷凝UDF实现与仿真要点 简介面向 Fluent 热管仿真研究者的蒸发冷凝 UDF 辅助资料聚焦重力热管内蒸发与冷凝过程的数值模拟。压缩包共 2 个文件约 3.1MBC 源码文件用于定义物性、相变模型、源项及边界条件CAJ 文献则提供某超长重力热管提取地热的模拟思路可作为模型参数与验证依据。已有 1561 人学习下载。资料覆盖饱和温度、汽化潜热等热物性定义质量与能量源项更新、相变速率控制、时间步长调节及输出变量设置等关键实现细节能帮助读者快速搭建 Fluent 自定义相变仿真框架理解热管两相流动与传热机理。同时文献与代码相互补充为热管设计优化提供可直接参考的 UDF 示例和验证路线适合具备一定 CFD 基础、希望借助 UDF 深化热管研究的工程师与研究生。1. 重力热管的蒸发冷凝UDF先解决相变再谈仿真精度一个重力热管模型在Fluent里跑起来并不难难的是让蒸发段真正产生蒸汽、冷凝段按时开始凝结并且整体循环稳定不发散。很多人在壁面上直接施加温度载荷得到的只是纯导热结果热管内部的相变过程被完全跳过。这次拆解的UDF源码zfln.c是典型的蒸发冷凝相变UDF配合超长重力热管提取地热的模拟文献可以把热管工作机理写成可执行的控制方程。我一般建议先理解蒸发冷凝、热管、UDF三者之间的关系再进入代码。文章沿着物性定义、相变模型、源项注入、边界条件、时间步长这条线把重力热管的Fluent模拟完整落地。2. VOF与Lee模型怎么选蒸发冷凝UDF的介入点2.1 为什么热管模拟不能跳过相变模型重力热管内部的工作流体在蒸发段吸热后从液态变成蒸汽蒸汽在压差驱动下流向冷凝段冷凝段放热后蒸汽重新凝结成液体液体靠重力流回蒸发段。这个循环的核心是气液相变而不是单纯的导热或对流。Fluent默认的冻结流场和能量方程只能算出温度分布无法体现蒸发和冷凝造成的大规模质量转移。如果只依赖壁面温度边界蒸发段的近壁区域会被加热到过热度但不会产生蒸汽热量只能靠液体导热向上传递计算结果会严重低估热管轴向导热能力。2.2 VOF、Mixture、Eulerian三选一热管内气液界面清晰重力回流特征明显适合用VOF模型捕捉相界面。Mixture模型适合颗粒流或相间滑移较弱的情形但它把两相看成一种混合流体界面不再锐利无法准确描述薄膜冷凝Eulerian模型虽然能求解两相各自的动量方程但对封闭热管这种以界面传热为主的问题计算量成倍上升且收敛困难。VOF加UDF是Fluent热管模拟的主流组合。需要注意VOF本身并不含相变源项它只负责追踪液相体积分数α相变产生的质量和能量需要通过UDF添加到连续方程和能量方程中。2.3 Lee模型方程UDF要替换哪个环节Fluent自带的蒸发冷凝模型基于Lee模型。相变方向由单元温度与饱和温度的差值判断T Tsat发生蒸发液相减少、气相增加T Tsat发生冷凝气相减少、液相增加相变质量流率与过热度、体积分数、密度成正比比例系数是松弛常数写成UDF后源项的形式为蒸发时单位体积液相质量变化率 -coeff × α_l × ρ_l × (T - Tsat) / Tsat冷凝时单位体积液相质量变化率 coeff × α_v × ρ_v × (Tsat - T) / Tsat这里coeff就是Lee模型中的相变强度。coeff过小相变速率不足热管内部温度会持续超调coeff过大源项太硬压力波和温度振荡会让计算直接发散。我在实际试算时会用0.1起步再看蒸发段壁温和相分数变化通常这个值已经能让热管启动。要注意coeff的作用是控制传质松弛不是物性参数不同工质和网格尺度下需要重新标定。2.4 常用工质物性参考热管工质最常见的是水、氨和甲醇。下表给出常压饱和状态下的参考值UDF中写死或通过单元格压力修正都可以工质饱和温度 K汽化潜热 kJ/kg液相密度 kg/m³气相密度 kg/m³水373.1522569580.60氨239.813696820.89甲醇337.811007911.20参数表里只有水更接近常见热管工况。如果是超长重力热管提取地热工质常常是水饱和温度按当地蒸发段压力设定。我在代码里一般把Tsat定义成宏常量方便在Fluent面板中通过UDF参数调整而不是每次重新编译。3. 蒸发冷凝UDF代码实现zfln.c的源项与编译拆解3.1 宏定义与相物理量获取zfln.c这类源码通常直接基于Fluent的UDF框架编写核心是液相质量源项、气相质量源项和能量源项三个函数。先给出文件开头部分#include udf.h #include sg_mphase.h #define T_SAT 373.15 /* 饱和温度单位为 K */ #define LAT_HT 2.256e6 /* 汽化潜热单位为 J/kg */ #define COEFF 0.1 /* Lee 相变系数无单位 */代码逻辑说明udf.h提供所有UDF宏定义sg_mphase.h提供多相流线程操作函数。T_SAT和LAT_HT是水和热管工况下最常用的两个常量COEFF是相变强度。如果你模拟的是氨或甲醇替换这三个宏即可。3.2 液相质量源项函数DEFINE_SOURCE(liq_src, cell, pri_th, dS, eqn) { Thread *sec_th THREAD_SUB_THREAD(pri_th, 1); real m_dot_l 0.0; real Tcell C_T(cell, pri_th); real alpha_l C_VOF(cell, pri_th); real alpha_v C_VOF(cell, sec_th); if (Tcell T_SAT) { m_dot_l -COEFF * alpha_l * C_R(cell, pri_th) * (Tcell - T_SAT) / T_SAT; dS[eqn] -COEFF * alpha_l * C_R(cell, pri_th) / T_SAT; } else { m_dot_l COEFF * alpha_v * C_R(cell, sec_th) * (T_SAT - Tcell) / T_SAT; dS[eqn] -COEFF * alpha_v * C_R(cell, sec_th) / T_SAT; } return m_dot_l; }参数说明pri_th是主相线程这里设定液相为主相sec_th是次相线程对应气相。蒸发时液相质量源项为负数值等于单位时间内流出液相的质量冷凝时为正代表气相回流到液体的部分。C_VOF读取液相或气相体积分数C_R读取对应相密度。dS[eqn]是源项对因变量的线性化系数取值对收敛速度有影响可以先用代码中的形式如果压力波动大就改成0但注意这会降低稳定性。3.3 气相质量源项函数DEFINE_SOURCE(vap_src, cell, sec_th, dS, eqn) { Thread *pri_th THREAD_SUB_THREAD(sec_th, 0); real m_dot_v 0.0; real Tcell C_T(cell, sec_th); real alpha_l C_VOF(cell, pri_th); real alpha_v C_VOF(cell, sec_th); if (Tcell T_SAT) { m_dot_v COEFF * alpha_l * C_R(cell, pri_th) * (Tcell - T_SAT) / T_SAT; dS[eqn] COEFF * alpha_l * C_R(cell, pri_th) / T_SAT; } else { m_dot_v -COEFF * alpha_v * C_R(cell, sec_th) * (T_SAT - Tcell) / T_SAT; dS[eqn] -COEFF * alpha_v * C_R(cell, sec_th) / T_SAT; } return m_dot_v; }逻辑说明气相源项和液相源项符号完全相反。蒸发时气相获得质量所以m_dot_v为正冷凝时损失质量m_dot_v为负。两者必须成对出现才能保证整个计算域内气液总质量守恒。实际挂载时liq_src挂到液相相的“Mass”源项vap_src挂到气相的“Mass”源项。3.4 能量源项函数DEFINE_SOURCE(eng_src, cell, mix_th, dS, eqn) { Thread *liq_th THREAD_SUB_THREAD(mix_th, 0); Thread *vap_th THREAD_SUB_THREAD(mix_th, 1); real m_l 0.0; real Tcell C_T(cell, mix_th); real alpha_l C_VOF(cell, liq_th); real alpha_v C_VOF(cell, vap_th); if (Tcell T_SAT) { m_l -COEFF * alpha_l * C_R(cell, liq_th) * (Tcell - T_SAT) / T_SAT; } else { m_l COEFF * alpha_v * C_R(cell, vap_th) * (T_SAT - Tcell) / T_SAT; } dS[eqn] 0.0; return m_l * LAT_HT; }参数说明mix_th是混合相线程多相流UDF中常用它来操作能量方程。这里用液相质量源项m_l乘以潜热得到能量源项。蒸发时m_l为负能量源项为负表示从流场中吸热冷凝时m_l为正能量源项为正表示向流场放热。dS[eqn]置0是因为能量方程对温度的源项导数较难估计靠亚松弛也能稳住。3.5 编译与挂载这段代码推荐用Compiled方式编译因为Interpreted方式对C语法和Fluent内部函数支持有限特别是THREAD_SUB_THREAD在解释模式下容易报错。在Fluent控制台执行/define/user-defined/user-defined-functions/compiled选择zfln.c所在目录输入库名build后load。然后在“Cell Zone Conditions”中对液相区域添加liq_src气相区域添加vap_src混合相能量方程中添加eng_src。挂载完成后检查一遍相顺序确保液相是主相、气相是次相否则THREAD_SUB_THREAD索引会错位导致源项实际作用在错误的相上。4. Fluent热管实战网格检查、初始化、时间步长控制4.1 网格准备与孤儿网格排查热管几何通常是细长圆柱网格质量直接决定UDF能不能跑稳。先用/mesh/check检查负体积再用/mesh/quality查看最小正交质量和偏斜度。孤儿网格多出现在导入外部网格或局部重构之后表现为某些单元没有正确关联到zoneFluent里显示为壁面碎片或流动区域不连续。常见处理方式是回到Fluent Meshing中重新生成边界层并执行“Repair Mesh”或者用/mesh/reorder/reorder-domain重排单元编号减少缓存访问乱序。超长重力热管轴向长度远大于径向建议使用结构化六面体网格蒸发段和冷凝段附近做局部加密径向网格不低于8层。4.2 求解器设置推荐热管模拟必须使用压力基求解器开启瞬态、能量方程、VOF模型和表面张力重力也在这里打开。VOF格式建议选择显式体积分数格式时间步进用Geo-Reconstruct这样界面最锐利。湍流模型先不开如果换热强度高导致局部流速过大再切换为低雷诺数k-epsilon模型。以下是常用设置表设置项推荐值说明瞬态格式一阶隐式起步稳定性优先后期换二阶VOF体积分数显式Geo-Reconstruct界面锐利但需限制库朗数表面张力开启指定表面张力系数重力热管泡状流需要压力速度耦合PISO相变大压力扰动下更稳压力离散Body Force Weighted重力与表面张力共存时推荐能量方程亚松弛0.8 起步过热度过大时降到0.5质量源项亚松弛先保持1.0若发散改为0.84.3 边界条件设定重力热管蒸发段一般设为恒热流或恒壁温冷凝段设为对流换热边界其他外壁面绝热。如果模拟某超长重力热管提取地热蒸发段热流密度常取几千到几万W/m²冷凝段对流换热系数需要根据冷却方式换算。边界条件里要确保换热系数和来流温度不出现阶跃突变否则蒸发段近壁区域会瞬间达到过热度UDF在第一个时间步就会产生极大质量源项。4.4 初始化混合初始化还是标准初始化Fluent 2020以后版本默认推荐混合初始化它会根据边界条件估算压力和速度场对流场收敛有帮助。但在热管两相流场景下混合初始化会先按照全液相或全气相估算有时会在封闭空腔内生成明显非物理的速度环流导致UDF一开始就把整个计算域按过热或过冷判定产生不合理的相变源项。我一般先使用标准初始化把整个计算域设为液相、温度略低于饱和温度再用“Patch”把冷凝段的一部分单元标记为气相。这样做的好处是热管启动阶段能自然形成蒸汽塞而不是人为注入一个速度场。具体操作是Standard Initialization设置全域温度300K液相体积分数1然后通过Region适配器选择冷凝段顶部区域patch气相体积分数为0.95。4.5 时间步长与库朗数控制UDF相变源项对时间步长非常敏感。显式VOF要求体积分数库朗数低于1也就是一个时间步内界面移动距离小于一个网格。热管蒸汽速度通常在0.5到5m/s1mm网格对应的时间步大约控制在0.2到0.001秒之间。但由于相变源项会放大温度扰动实际我常用1e-5秒起步跑200步观察壁温是否出现锯齿状振荡。如果稳定再逐步放大到5e-5秒。收敛判据不要只看残差热管模拟中温度残差下降到1e-3后可能还在缓慢漂移此时要增加监视器分别监视蒸发段和冷凝段的体积平均温度和液相体积分数同时监视整个计算域的总质量。总质量随时间变化如果超过0.1%一定是液相源项和气相源项没有守恒。5. 蒸发冷凝模拟收敛后还能加的三个细节5.1 把饱和温度改成局部压力函数固定T_SAT在工况简单时没问题但超长重力热管内部蒸汽压力从蒸发段到冷凝段存在压降饱和温度也随之变化。更精确的做法是在UDF中读取单元格压力结合安托因公式或克劳修斯-克拉佩龙方程实时计算局部饱和温度。常见写法是在每个源项函数开头加上#include math.h real Tsat_local 1.0 / (1.0 / T_SAT - RGAS * log(C_P(cell, mix_th) / P_REF) / LAT_HT);代码说明RGAS是工作流体的气体常数P_REF是参考压力。通过局部压力修正蒸发段和冷凝段的饱和温度不再相同热管内的相变驱动力更接近真实循环。这个技巧能明显改善长距离热管轴向温度分布的模拟精度。5.2 用自定义内存变量输出相变强度默认后处理只能看到温度和相分数看不到局部蒸发冷凝速率。注册一个UDMUser Defined Memory在源项中把m_dot_l存进去后处理直接显示UDM云图。具体做法挂载源项前在“User Defined Memory”中分配一个索引然后在liq_src函数最后一行写入C_UDMI(cell, pri_th, 0) m_dot_l;这样能快速定位蒸发段哪里相变最剧烈、冷凝段是否存在局部过冷盲区排查源项设置错误时比看曲线直观得多。5.3 用Fluent Python接口批量扫参数当需要系统扫描不同热流密度和COEFF值对“热管的传热性能”影响时手动改边界条件太慢。Fluent的Python 3接口可以直接操作TUI甚至访问case数据。常见做法是维护一个模板case把蒸发段热流和相变系数定义为参数然后写一段脚本循环提交计算自动保存每一组的壁面温度曲线。这样可以在不打开图形界面的情况下完成几十个工况的对比尤其适合做超长重力热管设计与校核。5.4 和文献结果对标时的取舍林红等人的超长重力热管模拟文献中蒸发段边界通常采用恒热流冷凝段采用对流冷却工作介质为水。复现时不要一上来就追求和实验壁温完全吻合先对比两个特征量热管启动时间和稳态蒸发段壁面过热度。启动时间主要由热管质量和工质总量决定过热度则由相变系数和热流密度共同决定。如果实验过热度偏小而模拟偏高优先加大COEFF如果模拟启动时间过短优先检查初始液相patch区域是否覆盖了整个蒸发段。最后提醒一句UDF里COEFF不是越大越好超过一定值后计算会出现压力震荡这个临界点需要你自己在当前网格和时间步长下标定。本文还有配套的精品资源点击获取
返回列表