资讯详情

CoolProp SVDSBTL 换热器加速演示:移动边界求解器设计与 SVD 查表加速实现

📅 2026/10/14 5:22:44 | 华诺云谱 👁 阅读
CoolProp SVDSBTL 换热器加速演示:移动边界求解器设计与 SVD 查表加速实现
科学计算【免费下载链接】CoolPropThermophysical properties for the masses项目地址https://gitcode.com/gh_mirrors/co/CoolProp点击查看免费下载本文基于 CoolProp 仓库中的设计规格2026-06-01-svdsbtl-hx-demo-notebook-design.md讲清一个面向用户的 SVDSBTL 文档页如何落地一个通过可替换属性后端运行的移动边界moving-boundary逆流换热器求解器、一个复现 Bell et al. (2015) 论文 §3.2 计算效率结论的演示 notebook以及配套的 pytest 回归护栏。读完本文你将掌握hx_moving_boundary.py中PropertyProvider抽象与HeatExchanger求解器的每个关键函数、Table-3 蒸发器工况的精确构造方式、两个后端HEOS与SVDSBTLHEOS的 Q 值一致性验证方法以及该页面在 nbsphinx 文档构建管线中的执行方式。1. 设计文档的定位用换热器算例量化 SVDSBTL 的价值该规格位于 2026-06-01-svdsbtl-hx-demo-notebook-design.mdIssue: CoolProp-q00v状态 Approved其 Goal 一节给出了页面的核心命题复现 Bell, Quoilin, Georges, Braun, Groll, Horton, Lemort, A generalized moving-boundary algorithm to predict the heat transfer rate of counterflow heat exchangers for any phase configuration,Applied Thermal Engineering79 (2015) 192–201 的 §3.2「计算效率」结果对论文 Table 3 的水加热正丙烷n-Propane蒸发器分别用完整 Helmholtz 状态方程后端HEOS与 SVD 压缩查表后端SVDSBTLHEOS求解同一个移动边界换热器模型两者预测的传热率 Q 一致而 SVDSBTL 每次运行快约一个数量级——加速来源于用直接查表替换了最昂贵的p,h → T,ρ变换Water 是库中最贵的 EOS。注意文档的主次关系该规格只覆盖文档页notebook部分不重新推导移动边界数学移动边界公式的权威出处是同一 issue 下更早的 C 规格2026-05-31-svdsbtl-hx-speedup-demo-design.md对应dev/demo_hx_speedup.cpp纯 C 演示——该 C 演示及其规格在当前仓库快照中不存在本文仅按文档引用提及以及被逐字保留的论文补充脚本 dev/reference/HX.py。三者共用同一套 oracle 数值一份数字同时验证三条实现路径。1.1 概念验证PoC已先行完成规格写明在撰写本设计文档之前一个基于 provider 的HX.pyPython 移植版已经跑通。在 A 4 m²、N 1500 次运行、CoolProp 7.2.1dev 开发机上测得BackendQ [W]ε Q/Qmaxms/run一次性建表HEOS4577.24220.9990705.38—SVDSBTLHEOS4577.24310.9990700.26~7 s之后走缓存单次运行加速比 ≈20×在 N 300 与 N 1500 下保持稳定。两后端一致性|ΔQ|/Q 2.0e-7远在表格容差之内ε–面积曲线在图上重合。Python 移植对 oracle 是位忠实的HEOS路径的 Q 与 dev/reference/HX.py 的 4577.242219 W 吻合到8e-11。SVDSBTL在一次HmassP更新之后smass()可用即求解器所需的熵可以获取。规格还特别解释了 20× 为什么超过论文中的 10×论文当年是拿 TTSE 后端在 2011 年硬件上对比的而 SVDSBTL 是更激进的查表方案且 20× 这个比值是在包含共享 pybind 派发开销的前提下测出的该开销会压缩比值因此纯 C 演示报告的比值会更大。2. 成功标准四条可执行的验收线规格给出的成功标准Success criteria直接对应后文各章节可验证的依据页面在 nbsphinx 下构建成功经jupyter nbconvert --execute执行超时 3600 s无错误notebook 内置断言确认HEOS与SVDSBTLHEOS的 Q 在表格容差内一致且HEOS的 Q 与dev/reference/HX.pyoracle 一致——这就是回归护栏页面渲染一个交互式 plotly 的 ε–面积图两条后端曲线视觉重合和一张加速表ms/run、比值、|ΔQ|/Q可复用的求解器模块能从渲染后的 HTML 下载。规格同时划定了什么不是目标20× / 10× 这些数字不是「设计目标」页面只报告构建机上实测的单次运行比值并附上论文的参考数字与 C 演示的引用值作为上下文。3. 仓库落位与文档构建集成规格的 Placement build integration 一节规定了三个落点均可在当前仓库中核对NotebookWeb/coolprop/SVDSBTLHeatExchangerDemo.ipynb。规格要求把它加入 Web/coolprop/index.rst 的 toctree紧跟SVDSBTLValidation.ipynb之后注意当前快照的 toctree 尾部是SuperAncillary.ipynb、HSFlash.ipynb、IdealGas.ipynb等条目SVDSBTL.rst位于第 14 行说明该页面仍处在与 SVDSBTL 文档簇SVDSBTL.rst、SVDSBTLValidation.ipynb、SVDComponents.ipynb同目录的归属关系中。ModuleWeb/coolprop/hx_moving_boundary.py。放在 notebook 同目录有两个理由nbconvert 执行 notebook 时工作目录就是 notebook 所在目录import hx_moving_boundary可直接解析同时它也是 notebook 里:download:角色的目标文件渲染成 HTML 后用户可以下载。执行机制Web/conf.py 已经对全部.ipynb预执行jupyter nbconvert --allow-errors --ExecutePreprocessor.timeout3600 --to notebook --output file --execute fileconf.py 的注释明确说明 3600 s 超时是为了容纳冷缓存下逐流体构建 SVDSBTL 面每个面约 20–80 s的 notebook。本演示的一次性 SVDSBTL 建表成本约 7 s/流体缓存于~/.CoolProp/SVDTables/见 SVDSBTL.rst 与 SVDSurfaceSerializer.h远低于该超时构建预算充足。配套的实现计划文档见 2026-06-01-svdsbtl-hx-demo-notebook.md其中给出了「先写失败测试、再写模块、用 nbconvert 端到端执行验证、最后接入 toctree」的完整任务分解可与本文对照阅读。4. 组件设计ahx_moving_boundary.py的可复用模块规格的组件a定义了模块结构每个单元有且只有一个职责、有明确接口、可独立测试。模块头注释自述为「dev/reference/HX.py的忠实 Python 移植所有热物性调用都路由经过一个PropertyProvider使同一个求解器可以跑在HEOS或SVDSBTLHEOS上」。模块顶部定义了回归锚点hx_moving_boundary.py# Headline Q [W] for the Table-3 evaporator at A 4 m^2, from the recovered # oracle dev/reference/HX.py on CoolProp 7.x. Regression anchor for the port. ORACLE_Q 4577.2422194.1PropertyProvider求解器面对的唯一接口求解器从不直接调用PropsSI而是通过每流体一个的 provider 访问物性。接口有五个方法hx_moving_boundary.py方法输入对用途h_pT(p, T)PT_INPUTS→ hmass单相 (p,T) 更新T_ph(p, h)HmassP_INPUTS→ T计时热路径p,h → T闪蒸Tsat(p, Q)PQ_INPUTS饱和温度仅构造期hsat_TQ(T, Q)QT_INPUTS→ hmass饱和焓仅构造期psat_TQ(T, Q)QT_INPUTS→ p饱和压力仅构造期make_evaporator用两个实现子类只改一个类属性class HEOSProvider(PropertyProvider): backend HEOS class SVDSBTLProvider(PropertyProvider): backend SVDSBTLHEOS接口设计里有两处刻意的工程决策值得注意T_ph只返回 T绝不顺带读smass()。源码注释hx_moving_boundary.py解释了原因求解器根本不需要熵原HX.py计算熵只是为了画 T-s 图已不在本页面范围内而在SVDSBTL上调用smass()会触发一次独立的熵面求值——这是计时热路径里的纯开销会让测得的加速比偏低。原HX.py里svec_*的熵计算在移植版中被整体移除。饱和量只在构造期计算永不进入被计时的run()循环。SVDSBTL直接支持PQ_INPUTS/QT_INPUTS输入对内部走源后端的饱和线已验证给出与HEOS相同的数值因此不需要另建一个 HEOS ancillary 状态。规格特别说明早期草稿曾错误假设「SVDSBTL 不暴露公共的 PQ / T_sat 路径」并加了一个 ancillary state该前提被验证推翻后移除——这保证了计时时两个后端唯一的差异就是p,h ↔ T,ρ的查表替换。4.2HeatExchanger移动边界算法的忠实移植HeatExchanger类是 dev/reference/HX.py 中同名类的逐函数移植唯一变化是硬编码的CP.PropsSI(...)换成 provider 调用。核心方法与论文方程编号一一对应构造hx_moving_boundary.py接收两侧 provider、质量流量与进口 (p, h)一次性算出进口温度、两侧泡/露点温度与焓T_ph×2、Tsat×4、hsat_TQ×4全部落在构造期。外部夹点external_pinching()论文 Eq. 4–7hx_moving_boundary.pydef external_pinching(self): self.h_ho self.ph.h_pT(self.p_hi, self.T_ci) # Eq 5 Qmaxh self.mdot_h * (self.h_hi - self.h_ho) # Eq 4 self.h_co self.pc.h_pT(self.p_ci, self.T_hi) # Eq 7 Qmaxc self.mdot_c * (self.h_co - self.h_ci) # Eq 6 Qmax min(Qmaxh, Qmaxc) self.calculate_cell_boundaries(Qmax) return Qmax即让热流冷却到冷流进口温度或冷流加热到热流进口温度所能达到的最大传热率取两侧较小者。单元边界calculate_cell_boundaries(Q)hx_moving_boundary.py给定候选 Q按能量守恒推出两侧出口焓把泡点/露点焓插入各自的焓向量当它们落在进、出口之间时然后逐格补齐「互补边界」——比较第 k 格热侧焓差对应的Qcell_hk与冷侧的Qcell_ck谁更长就在谁向量里插入一个新边界直至两侧格数相等assert len(self.hvec_h) len(self.hvec_c)。最后对每个边界做T_ph闪蒸得到Tvec_h/Tvec_c并按平均焓相对泡/露点焓的位置给每格贴liquid/vapor/two-phase相位标签_phases静态方法。这一步里对每个边界的T_ph调用就是被计时的p,h → T热路径也是 SVDSBTL 加速的直接作用点。内部夹点internal_pinching(stream)Eq. 9–16hx_moving_boundary.py在内部边界中寻找「不可能的温度倒挂」热侧在露点处比冷侧冷或冷侧在泡点处比热侧热一旦命中按 Eq. 9/10/12热侧或 Eq. 13/14/16冷侧缩减 Qmax 并重建单元边界。目标函数objective_function(Q)Eq. 28hx_moving_boundary.py对每个单元用对数平均温差 LMTD 计算所需 UA与由传热系数给出的可用 UA 相比DTA self.Tvec_h[k 1] - self.Tvec_c[k 1] DTB self.Tvec_h[k] - self.Tvec_c[k] LMTD DTA if DTA DTB else (DTA - DTB) / log(abs(DTA / DTB)) UA_req self.mdot_h * (self.hvec_h[k 1] - self.hvec_h[k]) / LMTD alpha_c 100 if self.phases_c[k] in (liquid, vapor) else 1000 alpha_h 100 if self.phases_h[k] in (liquid, vapor) else 1000 UA_avail 1 / (1 / (alpha_h * self.A_h) 1 / (alpha_c * self.A_c)) w.append(UA_req / UA_avail) return 1 - sum(w)传热系数按相位硬编码两相 α 1000 W m⁻² K⁻¹单相等 100 W m⁻² K⁻¹与 oracle 一致见第 6 节A_h/A_c是热/冷侧各占的换热面积。目标函数在 Q 使传热「恰好填满全部面积」时过零。求解solve()hx_moving_boundary.pydef solve(self): self.Q scipy.optimize.brentq( self.objective_function, 1e-5, self.Qmax - 1e-10, rtol1e-14, xtol1e-10) return self.QBrent 方法的括号[1e-5, Qmax - 1e-10]与rtol1e-14, xtol1e-10与 oracle 完全一致dev/reference/HX.py 同样如此。顶层入口run()依次做外部夹点、两侧内部夹点若命中则覆盖 Qmax最后solve()。4.3make_evaporatorTable-3 工况的一键构造make_evaporator(backend, A4.0)hx_moving_boundary.py把论文 Table 3 工况固化成代码def make_evaporator(backend, A4.0): if backend HEOS: ph, pc HEOSProvider(Water), HEOSProvider(n-Propane) elif backend in (SVDSBTL, SVDSBTLHEOS): ph, pc SVDSBTLProvider(Water), SVDSBTLProvider(n-Propane) ... p_w 101325.0 h_w ph.h_pT(p_w, 330.0) # 热侧Waterp 101325 PaT_hi 330 K p_r pc.psat_TQ(300.0, 1) # 冷侧n-Propane 饱和压力 300 K / Q 1 h_r pc.h_pT(p_r, 275.0) # 冷侧进口焓 (p_r, 275 K) hx HeatExchanger(ph, pc, mdot_h0.1, p_hip_w, h_hih_w, mdot_c0.01, p_cip_r, h_cih_r) hx.A_h hx.A_c A return hx参数要点热流Waterṁ 0.1 kg/s、冷流n-Propaneṁ 0.01 kg/s两侧面积各为 Am²SVDSBTL被接受为SVDSBTLHEOS的别名。模块导入无副作用只有类/函数定义 make_evaporator因此可以直接在 REPL 或未来的 pytest 里使用而不必跑 notebook——规格将此列为测试性设计意图。5. 保真度约定与 oracle 的三处关键一致点规格的 Fidelity consistency 一节是保证「notebook、dev/reference/HX.py、C 演示三者用同一套数字」的契约读代码时务必注意质量流量是「转置」的。对照 dev/reference/HX.py 的PropaneEvaporatorPinching()局部定义mdot_h 0.01、mdot_c 0.1但构造时写的是HeatExchanger(Water, mdot_c, ..., n-Propane, mdot_h, ...)——于是热流体 Water 实际拿到 0.1 kg/s、冷流体 n-Propane 拿到 0.01 kg/s与论文印刷版 Table 3 相反。这正是产生论文图中蒸发单元结构的赋值make_evaporator忠实保留了它。传热系数两相 α 1000 W m⁻² K⁻¹、单相等 100 W m⁻² K⁻¹按原objective_function的硬编码。进口状态p_Water 101325 Pa、T_h,i 330 Kn-Propane 的 p_ref 取 T 300 K / Q 1 的饱和压力h_ref 取 (p_ref, 275 K)。这些偏差由演示页面结尾的 markdown 向读者显式说明保留它们是为了与「产出了论文蒸发工况图的原始恢复脚本」以及 C 演示和 oracle 保持一致。6. 组件设计bSVDSBTLHeatExchangerDemo.ipynb的叙述结构规格为 notebook 规定了严格的单元顺序SVDSBTLHeatExchangerDemo.ipynb 的现成内容与之逐格对应1 段导入 1 个 raw 下载格 4 个代码格 2 段 markdownIntromarkdown论文引用、§3.2 结论、SVDSBTL 一句话定义、指向 SVDSBTL.rst 的链接。下载格raw reST:doc:SVDSBTL backend reference SVDSBTL · :download:Download the solver module (hx_moving_boundary.py) hx_moving_boundary.pyraw_mimetype: text/restructuredtext使渲染后的 HTML 中直接出现指向 hx_moving_boundary.py 的下载链接成功标准 4。 3.Imports plotly 设置import os, time/ numpy /plotly.graph_objects/plotly.io并设pio.renderers.default notebook_connected与姊妹页SVDSBTLValidation.ipynb一致使 HTML 中交互渲染然后from hx_moving_boundary import make_evaporator, ORACLE_Q。 4.Build分别构造两个后端的蒸发器perf_counter计时并单独报告SVDSBTL 的首次建表成本约 7 s/流体缓存于~/.CoolProp/SVDTables/——与论文做法一致一次性成本不计入单次运行耗时t0 time.perf_counter() hx_heos make_evaporator(HEOS, A4.0) t_build_heos time.perf_counter() - t0 t0 time.perf_counter() hx_svd make_evaporator(SVDSBTLHEOS, A4.0) t_build_svd time.perf_counter() - t0Correctness回归护栏A 4 m² 下各解一次打印 Q、ε 与两个相对偏差然后断言成功标准 2assert rel 1e-5, backends disagree on Q assert abs(Q_heos - ORACLE_Q) / ORACLE_Q 1e-6, HEOS drifted from the HX.py oracleEffectiveness figureε Q/Qmax 对面积做对数扫描np.logspace(np.log10(0.1), np.log10(10.0), 25)复用已构造的 HX 对象只改A_h/A_c不重建plotly 叠加HEOS线与SVDSBTLHEOS标记两条轨迹视觉重合hover 显示 (A, ε)。TimingA 4 m² 下各后端跑N max(1, int(os.environ.get(HX_REPEATS, 200)))次可经环境变量调节默认 200在 HEOS 约 5 ms/run 下把文档构建计时压到约 2 s 内先 warmup 一次再计时输出 ms/run 与比值。Closingmarkdown引用纯 C 演示dev/demo_hx_speedup.cpp当前快照未收录的比值作为「无 Python 税」的库级数字说明绝对 ms 与论文 24.6 / 2.46 ms 不同那是 2011 年硬件上的 32 位 Python以及上文第 5 节的 Table-3 偏差说明。7. 测试与验证pytest 护栏与构建内断言双保险规格的 Testing / validation 一节定义了三层防线主护栏是 notebook 自己的 correctness 单元成功标准 2后端不一致或移植漂移会直接使文档构建失败。C 正确性闸门Catch2[SBTL]测试归 C 演示规格所有本页不重复。模块本身导入干净、无副作用可脱离 notebook 独立演练。仓库中的落地是 Web/coolprop/test_hx_moving_boundary.py三个用例需先cd Web/coolprop再运行保证import hx_moving_boundary解析成功cd Web/coolprop python3 -m pytest test_hx_moving_boundary.py -v # 或直接python3 test_hx_moving_boundary.pydef test_heos_matches_oracle(): hx make_evaporator(HEOS, A4.0) Q hx.run() assert abs(Q - ORACLE_Q) / ORACLE_Q 1e-6 # 对 dev/reference/HX.py 的 Q def test_backends_agree(): Qh make_evaporator(HEOS, A4.0).run() Qs make_evaporator(SVDSBTLHEOS, A4.0).run() assert abs(Qh - Qs) / Qh 1e-5 # 两后端一致性 def test_effectiveness_physical(): hx make_evaporator(HEOS, A4.0) Q hx.run() assert 0.0 Q / hx.Qmax 1.0 # ε 物理上界实现计划2026-06-01-svdsbtl-hx-demo-notebook.md还给出了与构建管线一致的本地端到端验证命令cd Web/coolprop HX_REPEATS50 jupyter nbconvert --to notebook --execute \ --ExecutePreprocessor.timeout600 \ --output /tmp/_hx_demo_executed.ipynb SVDSBTLHeatExchangerDemo.ipynb期望退出码 0 且无 traceback再用 nbformat 检查执行副本中没有error输出。首次运行会为 n-Propane 构建 SVDSBTL 表约 7 s后续走~/.CoolProp/SVDTables/缓存。8. 绘图选型与明确不做的部分绘图只用 plotlyplotly.graph_objectsplotly.ionotebook_connected渲染器与最近的姊妹页SVDSBTLValidation.ipynb保持一致ε–面积图叠加两后端轨迹hover 显示 (area, ε)。Out of scopeYAGNI规格逐条拒绝的选项论文 Fig. 8残差 r(Q)与 Fig. 9Brent 收敛——拒绝「完整复现论文」选项本页面只讲聚焦的加速故事仅 ε 图不为 SVDSBTL 新增公共饱和 API饱和直接走后端自身的PQ_INPUTS/QT_INPUTS已在第 4.1 节说明不支持混合物冷/热为两个独立纯流体不同时展示「修正版/论文印刷版 Table-3」与 oracle 工况拒绝 show-both 选项不做 matplotlib 路径只有 plotly。9. 相关路径速查角色路径设计规格本文主体docs/superpowers/specs/2026-06-01-svdsbtl-hx-demo-notebook-design.md实现计划docs/superpowers/plans/2026-06-01-svdsbtl-hx-demo-notebook.md可复用求解器模块Web/coolprop/hx_moving_boundary.pypytest 回归护栏Web/coolprop/test_hx_moving_boundary.py演示 notebookWeb/coolprop/SVDSBTLHeatExchangerDemo.ipynb论文 oracle 脚本逐字保留dev/reference/HX.pySVDSBTL 后端用户文档Web/coolprop/SVDSBTL.rst文档构建预执行配置Web/conf.py表缓存路径说明include/CoolProp/sbtl/SVDSurfaceSerializer.h适用前提与限制文中 ms/run、20× 加速比、|ΔQ|/Q 2.0e-7等数字均为设计文档在其开发机CoolProp 7.2.1dev上的实测/引用值不同机器与版本会不同SVDSBTL 表首次构建需要可写的~/.CoolProp/SVDTables/缓存目录可通过配置项覆盖notebook 中的import hx_moving_boundary依赖执行工作目录为该模块所在目录这也是模块与 notebook 同目录放置的原因。赞分享科学计算【免费下载链接】CoolPropThermophysical properties for the masses项目地址https://gitcode.com/gh_mirrors/co/CoolProp点击查看免费下载相关推荐CoolProp SVDSBTL 换热器加速演示用移动边界求解器复现 Bell 2015 §3.2 的 HEOS 与 SVDSBTL 性能对比CoolProp SVDSBTL 换热器加速演示用移动边界求解器复现 Bell 2015 §3.2 的 HEOS 与 SVDSBTL 性能对比 导读 本文讲解科学计算CoolProp SVDSBTL 后端SVD 压缩表格查找引擎的架构、配置与性能实战指南CoolProp SVDSBTL 后端SVD 压缩表格查找引擎的架构、配置与性能实战指南 SVDSBTLSVD Compressed Tabular Loo科学计算Godot 移动端传感器演示解析用加速度计、陀螺仪与磁力计实时估算设备姿态godot-demo-projects / mobile/sensorsGodot 移动端传感器演示解析用加速度计、陀螺仪与磁力计实时估算设备姿态godot demo projects / mobile/sensors 本篇文示例工程上一篇Learn X in Y Minutes 德语版 APL 入门指南从右到左的数组思维与核心语法实战下一篇OpenSearch 数据摄取管道Ingest Pipeline指南如何在入库前清洗、转换与富化数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑