Repository navigation
Releases: x1shang/Wetbulb-Calculator
Release list
v1.3.5 湿球计算器
v1.3.5 更新内容!
本版的桌面版没有任何数值变更。 14 条公式、系数、注册域、求解器与 24 项派生量与 v1.3.4
逐位相同,两版可以直接互换比较结果(提升版本号只是为了让发布流程的 tag == core.tag 校验通过)。
本版新增的是网页版。
新增:单文件网页版(网页版号 v2.0.0)
WetBulbCalculator-web-v1.3.5.html —— 一个约 230 KB 的 .html,双击就用,离线可用,
全部计算在本机浏览器里完成,不上传任何数据(已在真 Chromium 里验证:打开与计算过程中
非 file:// 的网络请求数为 0)。
- 数值内核与桌面版逐点对拍:
web/src/core.js是src/core.py的移植。页面上有个
「数值自检」按钮,点一下就用由真core.py生成的 351 项黄金向量就地重算并比对;
tests/test_web_parity.py另用 1035 组用例与现算的core.py逐点对拍,连显示串(4 位小数)都比。 - 覆盖:三种模式、14 条公式与"不适用"判定、单位换算(℃/K/℉ × Pa/hPa/mmHg/cmHg/bar)、
精度调节、可交互的迭代可视化(可导出 PNG)、24 项常用气象参数、公式档案、
CSV/XLSX 批量导入导出(沿用 A/B/C 列与#VALUE!规则)、结果卡片 PNG、JSON/CSV 导出、
分享链接(打开即自动填参并算出结果)、本地记忆(记住模式/单位/精度/主题)。 - 它是桌面版的子集,不是等价物。 三处已知且有意保留的不等价(都只影响导出的文件,
不影响任何计算结果):批量导出的数值截到 4 位小数、只保留 A/B/C 三列(D 列及其后会丢失)、
#VALUE!写成文本而非 Excel 错误值。另有命令行接口是桌面版独有的 ——
要脚本调用请用WetBulbCLI-*.exe。以上全部逐条写在网页版「关于」页里。
修复(均为网页版界面层,桌面版代码未动)
- 强调色取色器此前 100% 点不动。回调里读了一个不存在的变量(
g,实际声明的是g2),
'use strict'下每次拖动都抛ReferenceError: g is not defined,颜色纹丝不动。
之所以长期没被发现,是因为当时 e2e 里没有任何一条用例碰过这个控件。 - 迭代图的轴单位自相矛盾。曲线数据恒为 ℃,但轴标题跟着上方温标写、悬浮读数又按当前温标
换算 —— 切到 ℉ 后出现"轴标题说 ℉、刻度数字是 ℃、读数是 ℉"。现在轴标题与悬浮读数都写死 ℃,
与桌面版plt.ylabel('温度估计值 (°C)')的行为一致。
新增验证
tests/test_web_ui_parity.py:守数值对拍看不见的那一层 —— 单位换算的系数与区间、
批量计算的列约定与相态选择规则。这些在 Python 与 JavaScript 里各写了一遍,
系数写错时核心仍然完全正确,只有用户看到的数字是错的,core对拍永远发现不了。
同时它会断言「关于」页仍然逐条列出上面那几处有意差异 —— 修掉了没更新文档也会红。- e2e 进 CI:
tests/test_web_e2e.py此前在任何流水线上都是 skip。它是唯一覆盖界面
链路的一层,而"取色器点不动"正是这个空档的产物。新增的web-e2ejob 会装
Playwright + Chromium 并在每次 push 时真跑。 - 新增取色器与迭代图轴单位的端到端回归(两条都是先确认修前必红、修后转绿)。
文档与仓库卫生
- 网页版的有意差异、构建/验证命令、版本号对应关系写进
README.md与README.en.md。 - 版本号规则明确:git tag 只有桌面版这一套(
v1.x.y);网页版的2.x.y不单独打 tag,
写在同一次 Release 的说明里(release.yml会校验tag == core.tag,网页版的号推不上去)。 web/index.html入库是本仓库"构建产物不入库"的唯一例外,三道闸写进.gitignore
与.gitattributes:给该文件加了-text(让交付物在任何平台检出后字节一致,否则 Windows
上会变成 CRLF、dist/里的那份与 SHA256 随平台而变)、构建新鲜度断言、随发行资产上传。- 两张 README 截图由 PNG 改为 WebP(1000×625,q90,实测 PSNR 43 dB):
391,828 → 99,196 字节(−75%)。
下载与使用
| 资产 | 用途 |
|---|---|
WetBulbCalculator-v1.3.5.exe |
桌面版 GUI(Python 3.10 打包,含批量计算与截屏) |
WetBulbCLI-v1.3.5.exe |
命令行版,输出 JSON、带退出码,便于脚本集成 |
WetBulbCalculator-web-v1.3.5.html |
网页版单文件(网页版号 v2.0.0),双击即用、离线可用 |
批量样表 example.xlsx 单独提供,放在 GUI exe 同一目录使用。
SHA256SUMS.txt 覆盖本次构建的三个交付文件;LICENSE 与第三方声明/许可随包提供。
已知问题
- 网页版没有命令行接口,且批量导出与桌面版有三处不等价(见上)。需要脚本集成或
需要完整精度的批量结果时请用桌面版。 - 网页版的 XLSX 导入依赖浏览器的
DecompressionStream(Chrome/Edge 103+、
Firefox 113+、Safari 16.4+);更旧的浏览器会给出中文提示并要求改用 CSV。 - 科学计算的适用范围与定义限制见仓库
docs/精度与参考文献.md。
纪利公式的注册下界取 −10 ℃,未跟随 GB/T 50392-2016 的"0 ℃ 以下不合理"——那句话是国标
基于冷却塔工况说的,不是水汽压精度上的退化(实测冷端与 +50 ℃ 同量级)。 - 批量结果整表完成后写盘;同名结果会覆盖。构建不保证逐字节可复现。
v1.3.4 湿球计算器
v1.3.4 更新内容!
- 更正:查得「纪利公式」(原误称"吉利公式")的原始文献——周西华, 梁茵, 王小毛, 周令昌.
《饱和水蒸汽分压力经验公式的比较》,辽宁工程技术大学学报, 2007, 26(3): 331–333,公式 (7)。
该文列 7 条公式,与本站 6 条同名/同式。 - 更正:v1.3.1 对该式的根因记述是错的。真正的错是指数常数被抄成原文的 1/10
(0.00141966 vs 原文 0.0141966);前因子 980.66 本来就对(= 原文的 98066 Pa)。
v1.3.1 改掉了正确的前因子、留下了错误的常数,才造成该式在参考点给出 1016.57 hPa 的自相矛盾。 - 新增:纪利公式注册域上界 20 ℃ → 120 ℃(下界仍为 −10 ℃)。20~120 ℃ 现在会给出该式的
结果,此前一律显示"不适用"。这是本版唯一的行为变更,且是纯新增——没有任何温度失去可用性,
也没有任何数值改变。 - 未改数值:本版没有任何数值修复。已逐点对拍 v1.3.3(14 条公式 × 701 点,0 处不同),
两版可直接互换比较结果。 - 文档:精度与参考文献补全书目、证据等级与"有意偏离原文"的决策记录;编年史新增
2026-10 出处复核一节;关于窗口与界面行为未变。 - 验证:新增纪利公式与 Goff-Gratch 在各自参考点上的自洽性断言(参考点必须精确给出 1 atm);
注册域变更同步更新精度表、来源有效域表与极端温度覆盖数(45 ℃ 下可用公式 8 → 9 条)。
下载与使用
WetBulbCalculator-v1.3.4.exe 为 GUI,WetBulbCLI-v1.3.4.exe 为命令行。
批量样表 example.xlsx 单独提供,放在 GUI exe 同一目录使用。
SHA256SUMS.txt 用于核对本次构建的文件;LICENSE 与第三方声明/许可随包提供。
已知问题
科学计算的适用范围与定义限制见仓库 docs/精度与参考文献.md。本版未更改核心公式与数值。
纪利公式的注册下界取 −10 ℃,未跟随 GB/T 50392-2016 的"0 ℃ 以下不合理"——那句话是国标基于
冷却塔工况说的,不是水汽压精度上的退化(实测冷端与 +50 ℃ 同量级)。
批量结果整表完成后写盘;同名结果会覆盖。构建不保证逐字节可复现。
v1.3.3 湿球计算器
v1.3.3 更新内容!
- 新增:命令行调用计算核心,无需打开 GUI;JSON 输出支持三种计算模式。
- 修复:批量输入非法时显示 Excel 错误单元格和原因,正常行继续计算;重跑自动排除结果文件。
- 验证:CI 自动执行 GUI 三模式与批量端到端测试;发布产物从中文路径运行冒烟检查。
- 构建:exe 内置版本指纹,资产名称包含版本;固定构建工具,tag 触发测试、打包和发布。
- 界面:关于窗口恢复紧凑布局;精度、参考文献与限制集中到 docs。
下载与使用
WetBulbCalculator-v1.3.3.exe 为 GUI,WetBulbCLI-v1.3.3.exe 为命令行。
批量样表 example.xlsx 单独提供,放在 GUI exe 同一目录使用。
SHA256SUMS.txt 用于核对本次构建的文件;LICENSE 与第三方声明/许可随包提供。
已知问题
科学计算的适用范围与定义限制见仓库 docs/精度与参考文献.md;本版未更改核心公式。
批量结果整表完成后写盘;同名结果会覆盖。构建不保证逐字节可复现。
v1.3.2 数值修复版
v1.3.2 —— 数值修复版(第三轮:逐条公式对照第一性原理复算)
⚠️ v1.3.2 的数值结果与 v1.3.1 不同。 修掉了 1 处公式常数、1 处方程系数、
3 处派生量物理错误、5 处过宽的适用域,并重写了湿球求解器。请以 v1.3.2 为准。一句话影响面:湿球温度、露点(模式 1)、焓值、含湿量、声速、LCL 都会变;
模式 2 的露点不变(它只走e_sat反算,与湿球方程无关)。
⚠️ 一处行为变更:冰面公式的注册域上界收到 0 ℃ —— +5 ℃ 这类温度下冰面公式现在明确显示
「不适用」,而不再与水面公式并列展示。0 ℃ 整点两种相态都仍可用(能力表 14/14 未变)。
一、修复的缺陷(B-31 ~ B-38)
| 编号 | 现象(改前) | 根因 | 改后 |
|---|---|---|---|
| B-31 | Arden-水面 名不副实:100 ℃ 偏 +12.56%、50 ℃ +3.51%、25 ℃ +0.91% |
它的系数是 Buck (1996) 三参数式,却被塞进 magnus 两参数族,丢掉了 −T/234.5 修正项 |
新增 buck96 三参数族按原式实现,0~50 ℃ 内 ≤0.04% |
| B-32 | Gili-水面 指数里有个查不到出处的 +0.00141966,使该式在自己的参考点上给出 1016.57 而非 1013.25 hPa(自相矛盾) |
它是 lg(1013.25/980.665) = 0.0141966 的 1/10 —— 小数点错位。v1.3.1 只改了前因子、把真正的错因留在原地(于是从偏低 3.0% 变成偏高 0.17%) |
删除该常数项,参考温度按文献取 373.15 K:0.28% → 0.14% |
| B-33 | 湿度计方程 A 系数写成 0.000667(所引 FAO 附录 3 原文为 0.000660),且不分相态(0 ℃ 以下照用水面值) |
B-02 当年发现"导数项 0.00066 与 γ 的 0.000667 不一致"后,把两边统一到了错的那一个 | A 改回 0.000660,并补冰面 0.000582;A 由全局常量变成公式的元数据 a0 |
| B-34 | 湿球结果取决于迭代初值:同一输入换个初值会改变"出不出数"(实测 T=45 ℃/RH=60%:初值 0~40 出 8 条、100 出 4 条、199 出 0 条) | 裸牛顿迭代,发散即报"未收敛";v1.3.1 只把适用域判定从初值上摘了下来,求解器这一半还挂着 | 改用带括号的牛顿法(二分兜底 + 抛光步):初值只影响迭代路径(收敛图),不再影响结果 |
| B-35 | 5 处注册适用域过宽(等于替用户宣布"这里也能用"):Marti-冰面 −150 ℃ 偏 −9.93%、Buck-水面 80 ℃ +1.11%、Wexler-冰面 −150 ℃ +0.47%、Arden-水面 100 ℃ +12.56%、Goff-冰面 上界 10 ℃ |
注册域凭印象写,且验证只在 10 个离散点上取样 —— 域端点根本没人看 | 收窄到文献/实测支持的范围;新增全域 241 点扫描测试 |
| B-36 | 扩展参数面板焓值偏低 1.23%(25 ℃/RH≈54%:51.63 vs ASHRAE 52.27 kJ/kg) | h = c_pa·T + w·(L_v(T) + c_w·T) 里的 c_w 应为液态水比热 4.186,旧版用了水汽比热 1.864 |
52.25 kJ/kg(与 ASHRAE 标准式一致) |
| B-37 | 湿空气绝热指数口径混用:比热是"单位质量"的量,却用摩尔分数去混配 | 量纲口径混用(应用质量分数/比湿) | γ 1.397006 → 1.397846,声速 346.885 → 346.989 m/s |
| B-38 | 抬升凝结高度用的是"T_d − 56 代入摄氏度、ln(RH) 代替 ln(T/T_d)"的变体,与严格解最大差 +1.69 K |
未按 Bolton (1980) 原式(原式须用开尔文) | 改回原式:25 ℃/Td 15 ℃ 得 12.72 ℃(独立数值解复核 ≤0.014 K) |
另新增:水汽压 ≥ 总压(道尔顿分压定律)的非法组合现在明确判「状态不成立」,
不再试图算出一个数(典型:150 ℃ / RH=50% 要求水汽压 2380 hPa > 大气压,水早就沸腾了)。
界面层同时修掉的三处(B-39 ~ B-41)
| 编号 | 现象(改前) | 根因 | 改后 |
|---|---|---|---|
| B-39 | 输入校验**"校验的串"与"实际用的数"分家**:湿度框填 60% 会通过校验、随后抛 ValueError: could not convert string to float: '60%'(而占位符恰恰写着 0~100%);填 1e3 被过滤成 13 → 按 13 hPa 判超限并清空输入框,可 1e3 hPa 本来完全合法 |
check_input 先用 filter(isdigit…) 清洗再 float,调用方却对原文本重新 float |
解析只发生一次:check_input 返回换算到 ℃ / hPa 后的数值,调用方直接使用 |
| B-40 | mmHg/cmHg 换算系数写死 1.33322,与"1 mmHg = 133.322387415 Pa 是定义值"不符(相对差 2.9e-6);更要紧的是界面公布的区间与强制的区间打架:对话框说 375 mmHg 是下限,而 375 × 1.33322 = 499.9575 hPa < 500 被拒 |
同一个物理量在两处各写一份、口径不同 | 系数只定义一次(MMHG_HPA),界面区间由它反推 —— "公布的"与"强制的"不可能再打架 |
| B-41 | 本次改动过程中引入、发布前被拦下:check_input 改成返回数值后,调用点仍写 if not self.check_input(...),于是干球温度 0 ℃(或 32 ℉ / 273.15 K)被 not 0.0 判为失败 —— 点"计算"静默无反应、连错误条都没有 |
返回类型变了,布尔上下文没跟着变 | 调用点改 is None 判断并直接使用返回值;新增 0 ℃ 场景的 GUI 回归。未进入任何发布版 |
B-41 的失败证据(忠实还原旧写法后跑新增场景):
MODE0_ROWS 16、MODE2_ROWS 16(25 ℃ 正常),
而MODE0_ZERO_ROWS 0—— 0 ℃ 一行结果都没有,且没有错误提示。这就是"静默失败"的样子。
二、新增的验证基础设施
tests/reference_iapws.py:改用第一性原理参照 —— IAPWS-95 水面饱和线
(Wagner & Pruß 2002)与 IAPWS 2011 冰面升华压方程。为什么要换:公开气象表的常用值本身
比 IAPWS 低 0.02%~0.10%,而且只在 10 个离散点取样 —— 上一版漏掉Marti-冰面在 −150 ℃
偏 9.93%,就是因为旧取样表里根本没有那个点。公开表仍保留为第二个独立来源。tests/test_esat_domain_sweep.py:对每条公式在它自己注册的整个区间上等距取 241 点,
逐点与 IAPWS 官方方程比较,取最大偏差作为容差依据。- README 精度表自动对账:表里的数字比实测小就报红,文档不会悄悄过期。
三、这次改动是怎么被复核的
这一轮的数值改动由第三方核对并直接改码,因此在发布前做了一次独立复核
(不采信改动方新增的测试,用工具之外的方法重算):
| 复核项 | 方法 | 结果 |
|---|---|---|
| 新的 IAPWS 参照式本身可信吗 | 对 5 个公认锚点(三相点 611.657 Pa、25 ℃ 3169.9 Pa、100 ℃ 101418 Pa…)验算 | 最大差 0.004% |
Arden-水面 是否真偏 12.56% |
独立在各自域上扫描 41 点 | 改前 +12.560%、改后 −0.042%(与改动方数字吻合) |
| A 系数改动是改善还是恶化 | 自写 ASHRAE 绝热饱和方程(二分反解 t*),55 点网格 | 平均偏差 0.101→0.086 K,最大 0.333→0.278 K |
| 湿球是否真的与初值无关 | 6 个初值跑同一输入,比较出数条数与数值 | 旧版会出现"换个初值就没解",新版每个初值同一结果 |
| 焓值改动是修正还是新错 | 用热力学恒等式 dL/dT = c_pv − c_w 核对代数形式 |
旧式把温度斜率算了两遍;新式等价于 ASHRAE 的 2501 + 1.86t |
| LCL 是否真是严格 Bolton | 自写数值解(干绝热上升 + 混合比守恒 + 静力方程) | 旧版最大 +1.69 K,新版 ≤0.014 K |
四、已知限制(完整版见 README)
- +150 ℃ / +200 ℃ 时 14 条公式一条都不给结果(注册域撑得起,实际能力撑不起)。
- 湿球方程用的是湿度计近似:与 ASHRAE 绝热饱和定义式相差 0.02~0.42 K(常温段约 0.25 K)。
这是本工具最大的一项误差来源,也是唯一一项"不是实现错误、而是定义选择"的误差。 - 湿球在 0 ℃ 以下按所选公式族的相态取 A 系数:水面族 0.000660、冰面族 0.000582;
但湿球本身的饱和水汽压仍取该族的e_sat—— 选水面族而干球在 −5 ℃ 时算的是"过冷水滴湿球"。 - 相对湿度必须大于 0%:
(0, 100],RH=0会被明确拒绝(旧版在此吐出 −150 ℃ 假数值)。 - A 系数用的不是 WMO 的系数(用的是 FAO 附录 3):换成 WMO 后与 ASHRAE 的最大偏差可由
0.42 K 降到 0.29 K。之所以仍用 FAO:代码与文档引的就是 FAO,改正到引用出处是修错,
换成 WMO 是换标准,属于研究者的判断(改core.py的A0_WATER一处即可)。 - 相当位温用简化式,与 Bolton (1980) 严格解相差约 −1.4%(25 ℃/RH 54% 时 −4.5 K)—— 不同定义,非对错。
L_v(T)为四次多项式拟合:25 ℃ 给 2440.5 kJ/kg(IAPWS 2441.8,−0.05%)。- 批量计算不落盘中间结果。
- GUI 只被覆盖到"能构造 + 走一遍计算流程"(offscreen),且只在本地跑;CI 里那三条 GUI 测试必然 skip。
Buck-冰面(−80 ℃ 偏 0.83%)与Marti-冰面(−82 ℃ 偏 2.01%)是粗经验式,别拿它们与参考级公式并列比较。Gili-水面的原始文献仍未取得(只找到中文暖通/冷却塔工程文献的同族形式)。
五、产物与验证
- 文件:
WetBulbCalculator.exe - 大小:83,209,356 字节(79.35 MB)
- SHA256:
2747012297DD27F425D61688248E565012B2A60F5E5C75CC2B85A041B3668010
发布前实际跑过的验证:
python -m pytest -q # 299 passed(v1.3.1 时 254 条)
python src/core.py # 自回归 OK,tag=v1.3.2,公式数=14
python -m pyflakes main.py src/core.py # 干净
pwsh -File run_tests.ps1 # 语法 / 静态检查 / 等价性 / 299 条断言 全绿
pwsh -File build.ps1 # 打包成功 + 包内模块核对 OK(core/calculator1/unit/about 均在)
冒烟:WetBulbCalculator.exe 在 ASCII 路径与含中文路径下启动,用 Win32 全窗口枚举确认
应用只创建一个可见窗口、标题「湿球温度计」,18 秒内稳定(无异常对话框)。
三种模式的计算与批量功能请在界面里再各跑一次 —— 那两道闸脚本替不了。
版本衔接:v1.3.1 之后本仓库做过一次历史重写(清理
dist/、build/,.git498 MB → 0.8 MB),
所有 commit 哈希与 tag 均已改变;旧克隆请重新git clone。
v1.3.1 数值修复版
v1.3.1 —— 数值修复版
⚠️ v1.3.1 的数值结果与 v1.3.0 不同。 三处饱和水汽压公式缺陷与四处派生量物理错误被修正,
请一律以 v1.3.1 为准。
⚠️ 本仓库的历史在本次发布前被重写过(dist/、build/从全部提交中剔除,.git由 498 MiB 降到 0.8 MB)。
所有 commit 哈希与 tag 都已改变 —— 旧的本地克隆请重新git clone,不要硬拉。
一、修复的数值缺陷(B-17 ~ B-21)
这些缺陷是 2026-10 对照外部参考值复算时发现的。此前的"验证"是拿每一版和本项目自己的
上一版对比(等价性回归),那只证明"系数没被改过",证明不了"系数是对的"。
其中 B-17/B-18/B-19 从首版起就存在。
| 编号 | 现象 | 根因 | 修正后 |
|---|---|---|---|
| B-17 | Gili-水面 相对 WMO 参考表全区间恒定偏低 3.0%(0/10/20 ℃ 均为 −3.0%) |
前因子写成了 980.66(= 1 工程大气压的 hPa 数),应为参考温度 373.16 K 对应的 1013.25 |
偏差降到 ≤0.28% |
| B-18 | Goff2-水面(Goff-Gratch 1946)低温端偏低:0 ℃ −3.48%、10 ℃ −1.71%、20 ℃ −0.92% |
第 4 个系数写成 1.3816e-5,标准值为 1.3816e-7(差 100 倍) |
全区间 ≤0.09% |
| B-19 | 扩展参数面板四处错值:声速 295 m/s(应 ≈347)、饱和混合率 11.89 g/kg(应 20.08)、水蒸气密度用了湿球饱和水汽压、相当位温退化成位温 | Cv = Cp − R 把摩尔气体常数与比热容相减;ρv 误用 esw;饱和混合率误用实际水汽压 e;θe 把 kJ/kg 的 L_v 直接除以 J/(kg·K) 的 Cp(潜热被缩小 1000 倍) |
全部修正 |
| B-20 | 「本地重力加速度」设置不参与任何计算,却在 v1.2.0 说明里宣称"使计算结果更加准确" | 它只写入 cfg.json 并更新界面占位符 |
文档更正;本次发布把这套设置连界面一起删除了(见第三节) |
| B-21 | 程序放在含中文的目录里启动即崩(退出码 0xC0000409,Could not find the Qt platform plugin "windows") |
PySide2 把自己的包目录交给 Qt 时要过一次窄字符(ANSI)转换,非 ASCII 路径被写成 ???,QLibraryInfo 报出不存在的插件目录 |
用 QT_PLUGIN_PATH 绕开;打包产物同样已修 |
另外还修正了 goff 族解析导数的第二项:Goff2-水面 40%、Goff-水面 26%、Goff-冰面 18%
的斜率原本是错的(根不变,所以只看结果永远发现不了)。
二、引擎与工程
- 输入校验下沉到计算核心:温度、压强、相对湿度在
core.py强制校验,批量计算路径同样受保护;
不再出现 RH=0 时返回−150 ℃这种"贴着边界的假数值"。 - 公式适用域改按真正参与计算的温度判定(此前按用户填的迭代初值判定,会出现冰面公式在 15 ℃ 露点下照常出数)。
tests/外部参照回归(254 条断言):对照 WMO/Smithsonian 饱和水汽压表、ASHRAE 绝热饱和
湿球定义式、Stull (2011) 等公开参考值;配 GitHub Actions CI 与run_tests.ps1一键脚本。- 中文/非 ASCII 路径下的启动崩溃已修(B-21)。
- 仓库目录归位(
src/assets/tests/docs/legacy/examples/),删除 148 MB 本地构建产物;
calculator1.py里与core.py重复的一份配置读取代码合并到一处。 - 移除
pyuic5生成文件表头里的个人绝对路径。
三、本次打包重建追加(2026-10-08,版本号仍为 v1.3.1)
起因:发现 dist/WetBulbCalculator.exe 双击即崩,报
ModuleNotFoundError: No module named 'calculator1'。顺着这次重建,一并处理了复审清单。
- B-30 打包缺模块(致命):
build.ps1只传了--add-data(资源)而没传--paths;
而main.py里注入src/、src/ui/的sys.path是运行时行为,PyInstaller 的静态分析看不见它 ——
于是core/calculator1/unit/about四个模块一个都没进 exe。
现已补上--paths "src" --paths "src/ui",并让build.ps1打完自动核对build/*/warn-*.txt、
缺任一模块即中止打包,同时加了守卫用例。 - B-20 收尾:删除「本地重力加速度」(界面输入框 +
cfg.json的g键 + 读写函数)。
本工具用到的物理量都不含g;唯一沾边的 mmHg/cmHg 是定义值(1 mmHg = 133.322387415 Pa),
与重力加速度无关。留一个"改了也不会影响结果"的输入框,比没有这个功能更糟。 - B-22 GUI 回归测试的"假红":在中文 Windows 上,子进程按 cp936 写管道、测试按 UTF-8 读,
℃变成乱码 → 本地恒红、CI 恒绿。现改为探针把结果写成 UTF-8 JSON 文件再断言。 - B-23 CI 覆盖边界:最看重的 GUI 回归测试在 CI 里必然 skip(CI 装不上 PySide2)。
现在run_tests.ps1会显式打印被跳过的测试与原因,workflow 顶部写明覆盖边界 ——
"CI 绿"只证明计算核心与仓库卫生,不证明界面。 - B-24
rh同名两种量纲:calculate_both收百分数、derive_moist_air收小数。
已改名为rh_pct/rh_frac,docstring 写死契约,报错信息点名量纲,并加契约与行为测试。 - B-25
RH=0%被拒这一隐式决定写进 README「已知限制」。 - B-27 / B-28:注释里的本机虚拟环境绝对路径通用化;批量校验的误导性 docstring 更正。
⚠️ B-29 行为变更:批量「已知相对湿度」模式的湿球迭代初值,原来误把相对湿度当参考温度传给了
初值函数(get_initial_guess(T, rh)),现改为与界面一致的get_initial_guess(T, T)。
同一物理根的结果不变,但迭代次数/收敛情况可能与 v1.3.0 不同。- B-26 仓库历史重写:
.git498.32 MiB → 0.8 MB(剔除dist/、build/;
历史里 >1MB 的 blob 由 3 个降到 0 个),64 个提交与全部 tag 保留。
注意:这次重建没有改变任何数值结果(src/core.py 的公式与系数未动)——
唯一的数值行为变更就是上面那条 B-29。
四、已知限制(完整版见 README)
- +150 ℃ / +200 ℃ 时 14 条公式一条都不给结果(注册适用域撑得起,实际能力撑不起)。
Arden-水面高温端不可用:25 ℃ 偏 +1.0%、50 ℃ 偏 +3.6%、100 ℃ 偏 +12.7%。- 湿球方程用的是湿度计近似,与 ASHRAE 绝热饱和定义式相差 0.01~0.45 K。
- 湿球在 0 ℃ 以下仍按水面饱和(真实通风干湿表此时是"冰球")。
- 抬升凝结高度用 Bolton 式的一个摄氏度变体,与经验规则差 ≤1.2 K,未对照外部真值。
- 相对湿度必须大于 0%:校验区间是
(0, 100],RH=0会被明确拒绝而不是给假数值。 - 批量计算不落盘中间结果:整表处理完才写
result_*.xlsx。 - GUI 只被自动化覆盖到"能构造 + 完整计算流程(offscreen)"这一层,且只在本地跑;
CI 里那三条 GUI 测试必然 skip。 - 湿球方程的 A 系数取自 FAO《Frost Protection》附录 3,不是 WMO-No. 8 的 Assmann 系数(待定)。
Gili-水面指数里有一个查不到出处的项+0.00141966(去掉后偏差由 0.276% 降到 0.147%,待定)。
五、产物与验证
- 文件:
WetBulbCalculator.exe - 大小:83,203,748 字节(79.35 MB)
- SHA256:
9ECCEAEB6C7FB8B224F3A50E8AB40DF82DD0D7993B4E718BB2D6B982B959AA29
本次发布前实际跑过的验证:
python -m pytest -q # 254 passed
python src/core.py # 等价性回归 OK(14 条公式)
pwsh -File run_tests.ps1 # 语法 / pyflakes / 等价性 / 254 条断言 全部通过
pwsh -File build.ps1 # 打包成功 + 包内模块核对 OK
冒烟:dist\WetBulbCalculator.exe 在 ASCII 路径与含中文的路径下双击,窗口均正常出现
(标题「湿球温度计」)。三种模式的计算与批量功能请在界面里再各跑一次 —— 那两道闸脚本替不了。
v1.3.0
更新内容 — v1.3.0
发布日期:2026-08 · 作者:RDFZ降水相态研究性学习小组
本次更新主题:架构重构 + 注册表引擎 + 自定义主题色
v1.3.0 把原来“单文件大杂烩”的程序拆成了 两个文件,计算引擎改用
统一公式注册表 管理,界面与计算彻底分离。
一、计算引擎:注册表模式(core.py)
- 原
MAGNUS_FORMULAS/GOFF_FORMULAS/WEXLER_FORMULAS三个字典
与methods列表合并为 一张统一注册表FORMULAS。 - 每个公式只需登记一行:
register_formula('名字', '公式族', 系数, 最低温, 最高温)。 - 公式族(magnus / goff / wexler / gili / marti)在
_FAMILY_TABLE中统一注册
求值 / 求导 / 反算函数;新增公式 = 加一行注册,新增公式族 = 加一族函数。 - 计算函数通过
on_result/on_iter回调把结果写回界面的CalculatorMemory,
界面不再直接接触计算细节。
二、功能相同,代码优化
- 三种计算模式(已知露点求湿球 / 已知湿球求露点 / 已知相对湿度求两者)行为不变。
- 批量计算输出列名统一为汉字(干球℃、露点℃/湿球℃、相对湿度%、大气hPa 等)。
- 扩展参数(焓值、位温、虚温、声速、LCL 等)全部保留。
- 已做等价性验证:core.py 与 v1.2.2 引擎在全部公式、全温度网格下结果一致。
三、美观界面:自定义你的色彩
-现在可以自行修改cfg.json以设置主题色
更正与补充(v1.3.1)
本节由 v1.3.1 的修复工作追加,不改动上面的原文。
1. 上面"已做等价性验证"指的是等价性,不是正确性
原文写:"已做等价性验证:core.py 与 v1.2.2 引擎在全部公式、全温度网格下结果一致。"
这句话本身为真,但容易被读成"数值已验证正确"——它证明不了这一点:
它对照的是自己上一版的输出,构造上发现不了继承下来的偏差。
(本版本正是如此:三个缺陷都是从 v1.2.2 的引擎里搬过来的。)
v1.3.1 起,正确性由 tests/ 对照外部参照负责,共 242 项检查可复跑:
python -m pytest -q # 对 WMO/Smithsonian 饱和水汽压表、ASHRAE 绝热饱和定义式、
# Stull(2011) 湿球经验式、ASHRAE 露点换算表
python core.py # 等价性回归(对照 v1.2.2 的 Goff-水面 结果)
2. v1.3.0 的哪些结果有误
| 位置 | 问题 | 实测影响 |
|---|---|---|
Gili-水面 |
前因子 980.66(= 1 工程大气压),应为 1013.25 hPa | 全区间恒定偏低 3.0% |
Goff2-水面 |
第 4 个系数 1.3816e-5,Goff-Gratch 标准值为 1.3816e-7 |
0 ℃ 偏低 3.5%、10 ℃ 偏低 1.7% |
goff 族解析导数 |
第二项写错(C/A·log10(Tk/A)·ln10 应为 C/(Tk·ln10)) |
Goff2-水面 40%、Goff-水面 26%、Goff-冰面 18% |
上面"扩展参数(焓值、位温、虚温、声速、LCL 等)全部保留"这一条里,
声速与相当位温是错的:声速 295 m/s(正确 ≈347 m/s),相当位温因潜热项量纲问题退化成位温。
3. 结论
v1.3.0 的 Gili-水面、Goff2-水面 以及全部 goff 族的导数结果不可用。
请使用 v1.3.1 或更新版本。v1.3.1 的数值与 v1.3.0 不同,这是有意为之。
4. 同时补上的
- 引擎层(
core.py)输入校验:温度、压强、相对湿度在任何入口都被强制校验,批量计算同样受保护 - 公式适用域改按真正参与计算的温度判定(此前按用户填的迭代初值判定)
.github/workflows/tests.yml:每次 push/PR 在 Linux 干净机器上重跑全部检查- README 新增「实测能力与精度」「已知限制」「产物与授权政策」三节 ——
"覆盖 −150~200 ℃"已更正为实测能力表(+150/+200 ℃ 时 0/14 条公式给出结果) requirements.txt补 NumPy 上界:没有它,空白机器上会装到 NumPy 2.x,
而 matplotlib 3.5.3 / pandas 1.3.5 是针对 NumPy 1.x 编译的,程序连导入都过不去
v1.2.2
更新内容
修复bug:现在批量模式输出列名统一为汉字
mode0 → 干球℃, 露点温度℃, 大气hPa, 湿球℃
mode1 → 干球℃, 湿球温度℃, 大气hPa, 露点℃
mode2 → 干球℃, 相对湿度%, 大气hPa, 露点℃, 湿球℃(修复前是 D/E)
修复bug:现在使用相对湿度模式计算不会再出错了。
现在允许安装包安装
这是v1.2.x的最终稳定版。v1.3.0起我们将重构程序结构,争取为大家带来更好的体验!
What's Changed
Bug fixes
- Batch mode output column names are now consistently in Chinese:
- mode0 → 干球℃, 露点温度℃, 大气hPa, 湿球℃
- mode1 → 干球℃, 湿球温度℃, 大气hPa, 露点℃
- mode2 → 干球℃, 相对湿度%, 大气hPa, 露点℃, 湿球℃ (previously D/E)
- Fixed an error when using relative humidity mode.
- Installation via installer/package is now supported.
This is the final stable release of v1.2.x. Starting from v1.3.0, we will refactor the program architecture to provide a better experience.
v1.2.1
历史版本对应关系更正(2026-10-08)
此标签相对 v1.2.0 仅增加 LICENSE 和 requirements.txt,WetBulb_Calculator.py 的内部 tag 仍为 v1.2.0,RH 模式修复未进入该标签。原发布说明所称 RH 修复未包含在 Source code 下载中;该修复到 v1.2.2 才入库。旧编年史记录该 exe 包含未提交修复,但其精确构建源码无法由现有提交记录证明。本次未重新验证旧二进制,不能将 v1.2.2 源码冒称为该附件的精确来源。
标签源码提交:b6646c6。历史标签、附件及原始发布说明保留,以下为原文。
THIS IS A PRERELEASE VERSION, in this version, we:
1.fixed the bug that paralyzed the "已知相对湿度求二者" mode.
2.reviewed the branch, and planned on to reconstruct the main program for the reason that python3.11 does not support PySide2 anymore
v1.2.0
1.2.0更新内容!💥💥💥
- 1:现在支持批量计算!
- 2:增加了已知相对湿度模式
- 3:彻底重写了GUI界面
- 4:确定了各公式的适用区间。
- 5:可以自定义重力加速度。
更正(v1.3.1)
本条说明的第 4、5 项原文分别是
"人工验算了所有公式,确保其科学性、严谨性!"与
"可以自定义本地重力加速度(使得计算结果更加准确)"。
经 2026-10 的独立复算,这两句话都不成立,特此更正。
下方保留原始表述,是为了让这次更正本身可追溯 —— 而不是悄悄改掉。
第 4 项:这个版本的引擎带着 3 处数值缺陷
任何一次"拿公开饱和水汽压表对一下"都能发现:
| 位置 | 问题 | 实测影响 |
|---|---|---|
| Gili 族前因子 | 写成 980.66(= 1 工程大气压的 hPa 数),参考点 373.16 K 应为 1013.25 hPa | 全区间恒定偏低 3.0% |
| Goff2 族第 4 个系数 | 写成 1.3816e-5,Goff-Gratch (1946) 标准值为 1.3816e-7(差 100 倍) |
0 ℃ 偏低 3.5%、10 ℃ 偏低 1.7% |
| goff 族解析导数 | 第二项写成 C/A·log10(Tk/A)·ln10,应为 C/(Tk·ln10) |
Goff-水面 26%、Goff2-水面 40%、Goff-冰面 18% 的斜率是错的 |
另外"扩展参数"面板里也有错误:声速 295 m/s(正确 ≈347 m/s)、
饱和混合率 11.89 g/kg(正确 20.08)、水蒸气密度误用湿球饱和水汽压、相当位温因量纲问题退化成位温。
以上全部已在 v1.3.1 修正,并补上对照 WMO/Smithsonian 参考表、ASHRAE 绝热饱和定义式、
Stull (2011) 的外部参照回归(见仓库 tests/,python -m pytest -q 可复现,共 242 项检查)。
为什么旧版本发现不了:当时的"自检"对照的是自己上一版的输出,
属于等价性回归——构造上就不可能发现自己继承下来的偏差。
第 5 项:重力加速度不参与任何计算
g 只被写入 cfg.json 并更新界面占位符,不进入任何公式。
因此"自定义本地重力加速度"不会使计算结果更准确。
v1.2.0pre1
历史版本对应关系更正(2026-10-08)
标签和 Release 对应 v1.2.0pre1(批量计算预览版);该标签下 Temp_calculator.py 的内部 tag 和关于.ui 均仍显示 v1.1.3。下载包所属版本以 v1.2.0pre1 为准,界面旧号属于历史漏更新。
标签源码提交:e036756。历史标签、附件及原始发布说明保留,以下为原文。
现在支持批量计算,不过是实验性功能。
##批量计算
#如何使用
将.xlsx后缀的文件放在与temp_calculator.exe同目录下,
确保格式与test.xlsx相同,即必须有ABCD四个列标题
在A列输入干球,B列输入露点,C列输入大气压强
点击“批量计算”,自动在D列计算湿球温度,并保存至result.xlsx中
#注意事项
1,暂不支持输入湿球计算露点
2,无论你选择的单位是什么均按照℃与hPa计算
3,暂不支持输入验证
4,同目录下一定确保有且仅有一个.xlsx,否则会自动计算检索到的第一个表格文件
5,请确保.xlsx中除了ABC列以外均是空的,否则若丢失数据,后果自负
Full Changelog: v1.1.3...v1.2.0pre1
