均相混合物(如天然氣、合成氣、製冷劑混合物)的熱力學性質計算(焓、熵、逸度係數、相平衡等)通常基於**狀態方程**(PR-EOS、SRK-EOS、GERG-2008)或**過剩吉布斯自由能模型**(NRTL、UNIQUAC、Wilson)。「起始臨界條件調用」指在迭代求解(如閃蒸計算、露點/泡點計算)前,需先獲取組分臨界參數(Tc、Pc、ω)並計算初始 K 值(平衡常數)或初始相組成。以下給出工程級代碼調用路徑。
1. 組分數據準備
├─ 純組分臨界參數:Tc, Pc, ω (哺乏因子)
├─ 二元互作參數:kij (PR/SRK), aij/bij (NRTL/UNIQUAC)
└─ 可選:理想氣熱容多項式係數
2. 起始臨界條件 / 初始猜測生成
├─ Wilson 關係式估算初始 K 值:K_i = (Pc_i/P) * exp[5.373(1+ω_i)(1-Tc_i/T)]
├─ 理想溶液假設:K_i = Psat_i(T)/P
└─ 上一步驟結果 / 經驗值作為熱啟動
3. 狀態方程 / 活度係數模型計算
├─ PR/SRK: 解立方方程得 Z, 計算 φ_i^L, φ_i^V
├─ NRTL/UNIQUAC: 計算 γ_i
└─ Henry 定律組分特殊處理
4. 迭代求解
├─ 閃蒸:Rachford-Rachford 方程求解 β (氣相分率)
├─ 露點/泡點:目標函數 Σy_i=1 / Σx_i=1 牛頓迭代
└─ 相穩定性判別:Tangent Plane Distance (TPD) 最小化
5. 輸出熱力學性質
├─ 焓 H, 熵 S, 吉布斯自由能 G
├─ 逸度係數 φ, 活度係數 γ
└─ 聲速、粘度、導熱係數 (可選擴展)
#include
#include
typedef struct {
double Tc, Pc, omega; // 臨界參數
double cp_coeff[4]; // 理想氣熱容 Cp/R = a + bT + cT^2 + dT^3
double kij[MAX_COMP]; // 二元互作參數
} Component;
typedef struct {
int ncomp;
Component comp[MAX_COMP];
double kij_matrix[MAX_COMP][MAX_COMP];
} Mixture;
// Wilson 初始 K 值
void wilson_k_values(const Mixture *mix, double T, double P, double *K) {
for (int i = 0; i < mix->ncomp; ++i) {
const Component *c = &mix->comp[i];
double Tr = T / c->Tc;
double term = 5.373 * (1.0 + c->omega) * (1.0 - 1.0/Tr);
K[i] = (c->Pc / P) * exp(term);
}
}
// PR-EOS 純組分參數 a, b
void pr_pure_params(const Component *c, double T, double *a, double *b) {
double Tr = T / c->Tc;
double kappa = 0.37464 + 1.54226*c->omega - 0.26992*c->omega*c->omega;
double alpha = pow(1.0 + kappa*(1.0 - sqrt(Tr)), 2);
*a = 0.45724 * R*R * c->Tc*c->Tc / c->Pc * alpha;
*b = 0.07780 * R * c->Tc / c->Pc;
}
// 混合規則
void pr_mix_params(const Mixture *mix, double T, double *x, double *a_mix, double *b_mix) {
double a_i[MAX_COMP], b_i[MAX_COMP];
for (int i=0;incomp;++i) pr_pure_params(&mix->comp[i], T, &a_i[i], &b_i[i]);
*a_mix = 0; *b_mix = 0;
for (int i=0;incomp;++i) {
*b_mix += x[i] * b_i[i];
for (int j=0;jncomp;++j) {
double aij = sqrt(a_i[i]*a_i[j]) * (1.0 - mix->kij_matrix[i][j]);
*a_mix += x[i] * x[j] * aij;
}
}
}
// 解壓縮因子 Z (立方方程)
int solve_cubic(double a, double b, double T, double P, double *Z_roots) {
double A = a*P/(R*R*T*T);
double B = b*P/(R*T);
// Z^3 - (1-B)Z^2 + (A-3B^2-2B)Z - (AB-B^2-B^3) = 0
// 使用 Cardano 公式或數值求根,返回實根個數並填入 Z_roots
// ... 省略求根代碼 ...
return n_real_roots;
}
// 主計算入口
int flash_calculation(const Mixture *mix, double T, double P, double *z,
double *x, double *y, double *beta) {
double K[MAX_COMP];
wilson_k_values(mix, T, P, K); // ← 關鍵:起始臨界條件調用
// Rachford-Rachford 迭代求解 beta
// ... 後續迭代邏輯 ...
return 0; // 成功
}
| 庫 | 語言 | 特點 | 適用場景 |
|---|---|---|---|
| CoolProp | C++/Python/Julia/... | 高精度、HEOS/REFPROP 兼容、支援混合物 | 工程級熱力學、製冷劑、天然氣 |
| Thermo (Caleb Bell) | Python | 純 Python、模型豐富、易擴展 | 快速原型、教學、數據分析 |
| REFPROP (NIST) | Fortran/C DLL | 工業標準、最權威、需授權 | 高精度工程設計、認證計算 |
| OpenModelica / Modelica Media | Modelica | 方程式建模、組件化、支援動態仿真 | 系統級熱力學循環仿真 |
| Cantera | C++/Python/Matlab | 化學動力學+熱力學、氣相反應流 | 燃燒、催化、電化學耦合 |
總結:**「起始臨界條件調用」本質是 Wilson/理想溶液估算初始 K 值**,後續進入 EOS/活度係數模型迭代。工程實踐中強烈建議直接集成 **CoolProp** 或 **Thermo** 等驗證過的庫,僅在極特殊模型需求下自行實現核心迭代邏輯。