CoolProp热力学物性计算库:5分钟跑通制冷剂物性查询与制冷循环COP
【免费下载链接】CoolPropThermophysical properties for the masses项目地址: https://gitcode.com/gh_mirrors/co/CoolProp
周五下班前,客户要把 R134a 制冷循环的 COP 核对稿发过来,你却还卡在物性表上翻找一个饱和焓值——图表插值的误差和翻页的时间都在拖进度。开源库CoolProp把这一步压进一行代码:Helmholtz 自由能方程(基于实验数据回归的高精度状态方程)驱动,100 余种流体与混合物,密度、焓、熵一次查齐。
先判断值不值得用
| 维度 | 情况 |
|---|---|
| 精度 | 主流流体密度、焓误差 0.1% 量级,对标 REFPROP |
| 语言覆盖 | Python、C++、MATLAB、Fortran、Excel、Julia 等 20 余种封装 |
| 许可 | MIT 协议,商用、教学免费 |
| 学习成本 | 安装加首条查询约 5 分钟 |
安装并验证:一条命令跑通
先装好,再验证,两分钟内可以完成:
python --version # 确认 3.9 及以上 pip install coolprop随后写三行验证代码。这里选水在 1 个标准大气压下的饱和温度:公式上应当是 100 ℃,任何环境差异都会立刻暴露出来。
import CoolProp.CoolProp as CP print(CP.__version__) # 输出版本号 T_sat = CP.PropsSI('T', 'P', 101325, 'Q', 0, 'Water') print(f"{T_sat - 273.15:.2f} ℃")预期输出:版本号加99.97 ℃。到这里,查表环节就可以从你的工作流里删掉了。
单点查询:PropsSI 的签名
所有查询走同一个入口,六个参数按位置排好:
CP.PropsSI('输出量', '输入1', 值1, '输入2', 值2, '流体名')输出量支持T、P、D(密度)、H、S(熵)、C(定压比热)等。纯组分、饱和线(干度Q从 0 到 1)、临界参数(如Tcrit,只需两个参数)都用同一签名,不存在"换物性换函数"。
完整案例:算一个 R134a 循环的 COP
把上面这条签名串成一条链,就是完整的制冷循环计算。先给定蒸发与冷凝温度:
fluid = 'R134a' T_evap = 273.15 + 5 # 蒸发 5℃ T_cond = 273.15 + 40 # 冷凝 40℃ h1 = CP.PropsSI('H', 'T', T_evap, 'Q', 1, fluid) # 蒸发器出口饱和蒸气焓 s1 = CP.PropsSI('S', 'T', T_evap, 'Q', 1, fluid) # 压缩机入口熵 p_cond = CP.PropsSI('P', 'T', T_cond, 'Q', 0, fluid) # 冷凝压力 h2s = CP.PropsSI('H', 'P', p_cond, 'S', s1, fluid) # 等熵压缩出口焓 h3 = CP.PropsSI('H', 'T', T_cond, 'Q', 0, fluid) # 冷凝器出口液态焓 COP = (h1 - h3) / (h2s - h1) # 制冷量/耗功 print(f"COP = {COP:.2f}")预期输出落在 4.5~5.0 之间,可直接与教材 R134a 理想循环参考值核对。四个状态点在 T-s 图上的位置关系,正好是这张图描述的:红色实线是实际压缩过程、紫色虚线是等熵基准、绿色是考虑了多变效率的修正路径,右上角放大框展示两者压差的细节。
顺手把这个循环画出来,审稿材料就齐了:
import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.plot(s1 / 1000, T_evap, 'o', label='1 蒸发出口') ax.plot(s1 / 1000, (h2s * 0 + CP.PropsSI('T', 'P', p_cond, 'S', s1, fluid)), 'o', label='2s 等熵出口') ax.plot(CP.PropsSI('S', 'T', T_cond, 'Q', 0, fluid) / 1000, T_cond, 'o', label='3 冷凝出口') for h in (h1, h2s, h3): pass ax.set_xlabel('S [kJ/(kg·K)]'); ax.set_ylabel('T [K]') ax.legend(); plt.tight_layout(); plt.savefig('cycle_ts.png', dpi=150)排障速查
症状:ImportError: No module named 'CoolProp'根因:包装进了另一个解释器的环境。修复:pip show coolprop核对,与当前解释器不一致就用python -m pip install coolprop重装。
症状:unable to solve with given inputs,或算出来是离谱值根因:输入对在两相区失效(如P,T落在饱和线内),或流体名拼错。修复:改用P,Q、T,Q;流体名以CP.get_global_param_string('fluids_list')输出为准。
症状:几千个状态点算到怀疑人生根因:逐点调用PropsSI,每次调用都隐含建对象、求解、销毁的开销。修复:换用AbstractState循环外建一次(写法见下文批量算点一节)。
如果你还想更进一步
混合物闪蒸:两相区不用自己写求解器
制冷剂替代方案比选、油气闪蒸都绕不开混合物。AbstractState加一行摩尔分数设定,就能拿到任意比例物系的状态:
mix = CP.AbstractState("HEOS", "Water&R134a") mix.set_mole_fractions([0.5, 0.5]) mix.update(CP.PT_INPUTS, 3e5, 300) print(f"h = {mix.hmass():.1f} J/kg, s = {mix.smass():.2f} J/(kg·K)")落在两相区时不用自己写相平衡:内部先做稳定性分析(判断单相还是分相),再做相分裂计算解出气液分配,最后才返回结果。这套两步逻辑就是下面这张流程图的内容。
批量算点提速:同一个对象跑一万个点
循环里逐点调PropsSI会反复初始化,一万个点就是三次万倍的开销。把状态对象提到循环外,只更新输入对即可:
st = CP.AbstractState("HEOS", "R134a") p = CP.PropsSI('P', 'T', 300, 'Q', 0, "R134a") h = [] for T in (250 + i) for i in range(10000): # 伪代码,实际用 range(250, 260) 步长 0.001 st.update(CP.TDmolarT_INPUTS, T, 1200) # T,Dmolar 对免闪蒸、最快 h.append(st.hmass())同样的点表,速度通常能提一个量级;对表格化场景,仓库里dev/TTSE/目录还有基于表格插值的状态后端源码可供参考。
强制相态:跳过自动判断
点明明在液相区却报相态歧义,多半是闪蒸判断多绕了弯路。输入键加|liquid、|gas直接锁定相区,一次调用即可省掉探测开销:
rho = CP.PropsSI('D', 'T|liquid', 300, 'P', 1e5, 'Water') # ≈ 996.6 kg/m³注意:只有确认点确实在所锁相区内才能用,点跨进另一相区时强锁相态反而会拿到错值。
周五那版 COP 核对稿,现在用一段脚本就能复现、画图、归档。下一步建议:拿你手头真实的工况参数跑一遍上面的循环,把结果与设备铭牌对比。系统学习看仓库文档(Web/coolprop/目录)、遇到问题去项目 issue 区提问、找现成案例翻dev/scripts/examples/目录即可。
【免费下载链接】CoolPropThermophysical properties for the masses项目地址: https://gitcode.com/gh_mirrors/co/CoolProp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考