轻质气体分配组件 (Lightgas) 代码解析
lightgas.py 在代码设计上是一个典型的静态知识库驱动的插值器。它通过内置大量的 NumPy 矩阵来存储实验观测数据,并提供一个核心函数 lightgas 供引擎调用。
💾 静态数据组织
Section titled “💾 静态数据组织”代码的前半部分定义了大量的私有常量矩阵(以 _ 开头),这些矩阵构成了计算的“离散坐标系”。
1. 气体产率曲线矩阵
Section titled “1. 气体产率曲线矩阵”这些矩阵的大小均为 $12 \times 12$,每一行代表一种特定煤种在不同热解程度下的产率分布。
_XZ: 热解程度(Extent of Reaction)坐标轴。_FH2O,_FCO2,_FCH4,_FCO: 分别对应 $H_2O, CO_2, CH_4, CO$ 的产率数据点。
2. 几何拓扑定义
Section titled “2. 几何拓扑定义”为了实现二维平面插值,代码定义了三角形顶点的索引关系:
_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。
1. 区域判定逻辑
Section titled “1. 区域判定逻辑”代码首先尝试进行三角形区域检索,这是通过向量化的一元一次方程组定义的边界判定:
# 计算点是否落在预定义的 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)2. 重心坐标插值实现
Section titled “2. 重心坐标插值实现”当判定落入某个三角形(索引为 idx)时,代码计算重心分量 :
# 使用海伦公式计算面积占比,得出插值权重A1 = heron(*ds_edges) # 总面积A2 = heron(ds_edges[0], ds_pts[0], ds_pts[1]) # 子面积 1A3 = heron(ds_edges[1], ds_pts[0], ds_pts[2]) # 子面积 2S = A2/A1 if A1!=0 else 0R = A3/A1 if A1!=0 else 0T = 1-S-R3. 多维线性插值
Section titled “3. 多维线性插值”通过 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]🛡️ 边界处理与兜底机制
Section titled “🛡️ 边界处理与兜底机制”边界表查找 (_OUT_TABLE)
Section titled “边界表查找 (_OUT_TABLE)”如果煤种坐标超出了三角形覆盖范围,代码会转向 _OUT_TABLE 逻辑:
- 区域匹配:通过
mask检查输入落在哪个矩形边界内。 - 特殊编码:
ln == 13或ln == 14时,直接返回硬编码的经验常数数组。- 其他情况通过
ln-1索引回溯到最接近的已知煤种产率曲线。
质量守恒补齐
Section titled “质量守恒补齐”# yygas[4] 代表 'Others' (主要为 H2)yygas[4] = 1.0 - np.sum(yygas[:4])代码最后强制进行归一化处理,确保所有轻质气体的质量分数之和恒等于 。