Skip to content

轻质气体分配组件 (Lightgas) 代码解析

lightgas.py 在代码设计上是一个典型的静态知识库驱动的插值器。它通过内置大量的 NumPy 矩阵来存储实验观测数据,并提供一个核心函数 lightgas 供引擎调用。


代码的前半部分定义了大量的私有常量矩阵(以 _ 开头),这些矩阵构成了计算的“离散坐标系”。

这些矩阵的大小均为 $12 \times 12$,每一行代表一种特定煤种在不同热解程度下的产率分布。

  • _XZ: 热解程度(Extent of Reaction)坐标轴。
  • _FH2O, _FCO2, _FCH4, _FCO: 分别对应 $H_2O, CO_2, CH_4, CO$ 的产率数据点。

为了实现二维平面插值,代码定义了三角形顶点的索引关系:

  • _XX, _YY: 定义了 12 个基准煤种在 $O/C$ 和 $H/C$ 平面上的坐标。
  • _P1, _P2, _P3: 顶点索引矩阵。例如 _P1[0], _P2[0], _P3[0] 定义了第一个计算三角形的三个顶点在 _XX/_YY 中的位置。
  • _S1, _S2, _S3: 对应 23 条边界线的索引,用于 mask_tri 的逻辑判定。

⚙️ 函数逻辑实现:lightgas(xoc, yhc, yf)

Section titled “⚙️ 函数逻辑实现:lightgas(xoc, yhc, yf)”

该函数负责将输入的化学参数转化为五种气体的质量分数数组 yygas

代码首先尝试进行三角形区域检索,这是通过向量化的一元一次方程组定义的边界判定:

# 计算点是否落在预定义的 12 个三角形区域内
z1 = (yhc - _B_LINES[_S1]) / _A_LINES[_S1]
z2 = (yhc - _B_LINES[_S2]) / _A_LINES[_S2]
z3 = _A_LINES[_S3] * xoc + _B_LINES[_S3]
mask_tri = (xoc >= z1) & (xoc <= z2) & (yhc <= z3)

当判定落入某个三角形(索引为 idx)时,代码计算重心分量 :

# 使用海伦公式计算面积占比,得出插值权重
A1 = heron(*ds_edges) # 总面积
A2 = heron(ds_edges[0], ds_pts[0], ds_pts[1]) # 子面积 1
A3 = heron(ds_edges[1], ds_pts[0], ds_pts[2]) # 子面积 2
S = A2/A1 if A1!=0 else 0
R = A3/A1 if A1!=0 else 0
T = 1-S-R

通过 np.interp 在选定的产率曲线上提取值,并应用权重:

for k, mat in enumerate([_FH2O, _FCO2, _FCH4, _FCO]):
# 对三角形的三个顶点分别进行热解程度 yf 的一维插值
v = [np.interp(yf, _XZ[p], mat[p]) for p in [_P1[idx], _P2[idx], _P3[idx]]]
# 最终结果为三点加权合成
yygas[k] = T*v[0] + R*v[1] + S*v[2]

如果煤种坐标超出了三角形覆盖范围,代码会转向 _OUT_TABLE 逻辑:

  • 区域匹配:通过 mask 检查输入落在哪个矩形边界内。
  • 特殊编码
  • ln == 13ln == 14 时,直接返回硬编码的经验常数数组。
  • 其他情况通过 ln-1 索引回溯到最接近的已知煤种产率曲线。
# yygas[4] 代表 'Others' (主要为 H2)
yygas[4] = 1.0 - np.sum(yygas[:4])

代码最后强制进行归一化处理,确保所有轻质气体的质量分数之和恒等于 。