# 热力学数据来源、方向和适用范围

数据集：`phreeqc-3.8.6-subset-25C-v1`。原始数据库来自 [PHREEQC v3.8.6 固定提交](https://raw.githubusercontent.com/phreeqc-dev/phreeqc3/74cdaf00f90b15b7a5bbc03f405eb2f8129aacf1/database/phreeqc.dat)，原文、SHA-256 和许可通知保存在 `data/upstream/`。选择固定版本是为了避免混用 master 中已更新的 CaHCO3+、CaSO4、Calcite 或 Gypsum 常数。

## 反应表

下表中的反应按所写方向使用，`logK` 均为以 10 为底的无量纲活度常数。省略的水活度为 1；主物种的恒等式 logK=0 是模型定义。来源行号指保留的原始文件。

| 记录 ID | 反应 | logK (298.15 K) | 原始行 / 推导 |
|---|---|---:|---|
| identity | 主物种 = 自身 | 0 | 主组分定义，无实验拟合 |
| water | H2O = H+ + OH− | -13.994751542208071 | 212–213，六项解析式求值 |
| bicarbonate | H+ + CO3²− = HCO3− | 10.329 | 233–234 |
| carbon-dioxide | 2 H+ + CO3²− = CO2(aq) + H2O | **16.681** | 240–241；生成方向为正值 |
| calcium-bicarbonate | Ca²+ + H+ + CO3²− = CaHCO3+ | **10.91** | 375–376，直接使用该版本的表列值 |
| calcium-carbonate | Ca²+ + CO3²− = CaCO3(aq) | 3.224 | 370–371 |
| calcium-hydrolysis | Ca²+ + H2O = CaOH+ + H+ | -12.78 | 368–369；H+ 的质量作用指数为 -1 |
| bisulfate | H+ + SO4²− = HSO4− | 1.988 | 259–260 |
| calcium-sulfate | Ca²+ + SO4²− = CaSO4(aq) | 2.25 | 381–383 |
| calcium-bisulfate | Ca²+ + H+ + SO4²− = CaHSO4+ | 3.068 | 386–387 与 259–260 相加：1.08 + 1.988 |
| zinc-oh-1 | Zn²+ + H2O = ZnOH+ + H+ | -8.96 | 781–783 |
| zinc-oh-2 | Zn²+ + 2 H2O = Zn(OH)2(aq) + 2 H+ | -16.9 | 784–785；累计常数 |
| zinc-oh-3 | Zn²+ + 3 H2O = Zn(OH)3− + 3 H+ | -28.4 | 786–787；累计常数 |
| zinc-oh-4 | Zn²+ + 4 H2O = Zn(OH)4²− + 4 H+ | -41.2 | 788–789；累计常数 |
| calcite | CaCO3(s) = Ca²+ + CO3²− | -8.48 | 956–960；溶解常数 |
| gypsum | CaSO4:2H2O(s) = Ca²+ + SO4²− + 2 H2O | -4.58 | 996–1001；溶解常数，水活度为 1 |
| zinc-hydroxide-solid | Zn(OH)2(s) + 2 H+ = Zn²+ + 2 H2O | 11.5 | 1288–1290；酸溶解常数，**不是** `[Zn][OH]²` 的 logKsp |

水的源解析式为 `A1 + A2*T + A3/T + A4*log10(T) + A5/T² + A6*T²`，系数依次为 `293.29227, 0.1360833, -10576.913, -123.73158, 0, -6.996455e-5`，T 使用 K。

本项目选择表中固定的 25°C 常数；没有同时应用源文件内其他温度解析拟合，因此不能声称所有输出与 PHREEQC 默认设置完全一致。CaHCO3+ 若换成 `Ca²+ + HCO3− = CaHCO3+`，本版本对应 logK 为 `10.91 − 10.329 = 0.581`。旧代码把质子化常数减错方向且混入来源不明确的 1.11，本次采用直接可追溯的 10.91 代替。

## 标准态与范围

源常数使用质量摩尔浓度（mol/kg water）标准态，活度无量纲。本程序的 API 使用 `mol/L`，明确采用稀溶液近似 `m ≈ c`：

```text
a_i = gamma_i * c_i / (1 mol/L)
pH = -log10(a_H+)
I = 0.5 * sum(c_i*z_i^2), mol/L
SI = sum(nu_i*log10(a_i)) - logK_dissolution
```

这不是精确的标准态转换。没有输入密度、溶剂质量、压力修正或水活度修正；约束为 **298.15 K、约 1 atm**。Davies 的项目保守上限为 `I <= 0.1 mol/L`，极限定律 Debye–Hückel 为 `I <= 0.01 mol/L`；满足上限也不等于对任意水样获得实验精度。A 固定为 0.5092，忽略离子尺寸和离子专属相互作用，结果用于有限体系教学和初步筛选。

没有引入气相、氧化还原、有机配体、完整金属络合数据库或沉淀量求解。三个场景是明确指定的有限组分体系；真实水样存在其他组分时应补齐模型并重新验证，或转用成熟地球化学工具。`SI > 0` 表示该固定溶解组成下的过饱和候选，不表示稳定平衡、不表示已经析出。

## 数据一致性与独立验证

核心校验主组分定义、反应元素/电荷/碱度守恒、source 记录与 logK 一致、数据版本、温压及元数据是否齐全。它不能仅凭一个 URL 证明任意用户数据库的科学正确性或授权真实性。

另一个 Python 程序从固定原始文件提取常数，通过解析消元和区间二分独立求解，逐物种比较浓度、活度、gamma，并比较 pH、I、碱度、电荷与 SI。它与 MoonBit 共享同一选定数据口径，证明限定方程的实现一致性；不构成独立实验、PHREEQC 可执行程序对照或热力学模型准确度认证。
