反应动力学速率组件 (Perks) 代码解析
perks.py 实现了 CPD 模型中的并行反应动力学。其代码核心特征是采用了基于正态分布(Gaussian Distribution)的变活化能模型,模拟煤这种复杂混合物在受热时的非均匀反应速率。
🧪 核心算法逻辑:变活化能模型
Section titled “🧪 核心算法逻辑:变活化能模型”在煤热解中,化学键的断裂并非单一活化能,而是一个分布。代码通过插值标准正态分布累计分布函数(CDF)的逆函数,实现了活化能的动态漂移。
1. 极速正态分布插值 _get_x_interpolated
Section titled “1. 极速正态分布插值 _get_x_interpolated”代码内置了一个小型的高斯分布表 _XX_ERF / _YY_ERF,通过 Numba 优化的二分查找实现高性能反查:
@njit(inline='always')def _get_x_interpolated(f_val): # 使用 searchsorted 实现 O(log N) 级别的快速定位 idx = np.searchsorted(_YY_ERF, yp_v) - 1 # 线性插值计算对应的标准偏差倍数 return fac * (x0 + (yp_v - y0) * (x1 - x0) / (y1 - y0))inline='always': 强制内联到调用处,消除函数调用开销,这在 ODE 求解器频繁迭代时至关重要。
2. 动态活化能计算
Section titled “2. 动态活化能计算”对于气体产出(Gas)、氮析出(Nitrogen)和可动键断裂(Labile),活化能会随着反应进度的增加而升高:
⚙️ ODE 导数构造:perks(...)
Section titled “⚙️ ODE 导数构造:perks(...)”该函数计算四个状态变量的瞬时变化率 :
1. 物理含义映射
Section titled “1. 物理含义映射”代码中的 res 数组对应以下物理过程:
res[0](dl/dt): 可动键(Labile bridges)的消耗速率。res[1](ddel/dt): 桥键断裂产生的周边界限(Del_val)的演变。res[2](dc/dt): 稳定键(Char bridges)的生成速率。res[3](dfnca/dt): 煤中非催化活性氮(Non-catalytic Nitrogen)的减少。
2. 竞争反应模型
Section titled “2. 竞争反应模型”代码体现了 CPD 模型中经典的 Bridge -> Sidechain + Char 竞争逻辑:
term_kb_l = kb * lcommon_term = term_kb_l / (rho + 1.0) # 竞争因子分配
res[0] = -term_kb_l # 全部消耗res[2] = common_term # 其中一部分转化为稳定键 (Char)⚡ 高性能优化细节
Section titled “⚡ 高性能优化细节”@njit(cache=True): 该函数在仿真过程中会被 ODE 积分器(如odeint)调用数千次,JIT 编译是系统响应速度的保证。- 公共项提取: 计算
common_term避免了重复的浮点除法运算,降低了 CPU 周期消耗。 np.empty(4): 相比np.zeros,empty不进行初始化填充,在极高频调用场景下能榨取更多性能。
📋 输入参数对照表
Section titled “📋 输入参数对照表”| 变量名 | 物理意义 | 对应动力学参数 |
|---|---|---|
Tp | 颗粒瞬时温度 (K) | 决定 Arrhenius 速率 |
l, del, c | 结构状态量 | 决定当前反应的浓度基数 |
eb0, ebsig | 可动键活化能 | 基准值 与分布标准差 |
Rg | 气体常数 | 默认采用英制或公制单位(取决于引擎配置) |