Skip to content

渗流理论核心组件 (Perkp) 代码解析

perkp.py 是整个仿真系统的“动力引擎”。它根据化学键断裂状态(配位数、桥键概率等),通过组合数学计算出煤结构的崩溃程度及产物分布。


该代码实现了基于 Bethe 晶格(Bethe Lattice)的渗流统计:

  • $p$ ($l + c$):桥键存活的总概率。
  • $p^*$:无穷集群(Infinite Network)存在的临界概率解。
  • $Q_n$:大小为 $n$ 的片段在统计意义上的出现频率。

这是一个高性能的数值求解函数,涵盖了从非线性迭代到组合数学计算的全过程。

当系统超过渗流阈值时,代码通过牛顿迭代法求解非线性方程,以确定可溶物(Sol fraction)的比例。

# 核心修复:高精度牛顿迭代
const_term = p * (1.0 - p) ** sig_minus_1
for _ in range(25):
om_ps = 1.0 - pstar
f = pstar * om_ps ** sig_minus_1 - const_term
fp = om_ps ** sig_minus_1 - pstar * sig_minus_1 * om_ps ** sig_minus_2
ppstar = pstar - f / fp # 更新迭代值
if abs(1.0 - ppstar / pstar) <= 1e-4: break

代码严格遵循质量守恒定律,将煤的总量划分为:

  • fgas:桥键断裂产生的轻质气体。
  • ftart_out:理论上可转化为焦油的单体总量。
  • fchar:保持在交联网络中的焦炭部分。

为了计算焦油的分子量分布,代码使用 lgamma 函数处理组合数 ,避免了大数阶乘导致的溢出:

# 使用对数 Gamma 避免大数溢出
ln_fgam = lgamma(xm + 1.0) - lgamma(yk + 1.0) - lgamma(xm - yk + 1.0)
qn = (sig_plus_1 / xm * exp(ln_fgam)) * (p ** yk) * (one_minus_p ** tn) / n
  • ft_raw: 存储了从单体到 阶齐聚物的产率分布。
  • mt_raw: 计算每一阶片段对应的物理分子量。

  • @njit(cache=True): 由于涉及大量的指数运算和 lgamma 调用,JIT 编译将此函数的运行速度提升了数十倍。
  • reshape(-1, 1): 输出结果自动转化为列向量,无缝对接后端的 NumPy 矩阵运算,避免了维度坍缩产生的 Bug。
  • 预计算常数: 如 sig_minus_1, sig_plus_1 等在循环外计算,减少冗余浮点运算。

变量名代码实现物理/数学意义
sig ()sig晶格配位数 (Coordination Number)
y[0] ()l_val桥键 (Bridges) 比例
y[2] ()c_val侧链 (Cobs) 比例
ma ()ma单体单元分子量
rbarba桥键与单体的质量比参数