上一篇结尾把 Part2 的清单按优先级列了八条,前两条就是建符号转换表和全模型换 SI 摩尔基准。真到写实施规格的时候,这两条占掉的篇幅比预想多得多,干脆从原计划的第二篇里分出来单独成篇。原计划第二篇直接写脚本框架和离散化,动笔才发现那部分内容每一步都踩在符号和单位上,先把地基打实,网格留到下一篇。

分出来的理由不体面也不复杂。逐式核对时留下的那些坑,量纲冲突、单位混用、正负号不明,没有一样能靠求解器兜住。$EW$ 印作 1100 $\mathrm{kg/kmol}$,配上 $F=96487\ \mathrm{C/mol}$ 直接代进去,误差一千倍,程序不报错,曲线照画。符号反向更隐蔽,曲线形状大体还在,物理早就反了。

  1. 燃料电池冷启动复现札记(一)· 解构 Huo 2019 的水热机理与公式
  2. 燃料电池冷启动复现札记(二)· 符号转换表与 SI 摩尔基准

一、三套正负号,一张转换表

上一篇第二节记过这笔账。式(1)把 Nernst 电压、活化、欧姆三项当带符号的加数,式(9)又明确 $V_{\rm ohm}\le0$,到了热源那边,式(35)要求耗散非负。三个地方三套隐含约定,单看每处都能自圆,合在一起写程序就要出事。式(7)、(8)把两极过电位写成相反符号的相电势差,还没说明是否扣掉了平衡电位参考。这种账,光靠小心防不住,程序里换一套从第一步就自洽的约定,再建表把原文逐条接进来。

程序内部只认一套。定义体积法拉第电流 $j_F$,阳极氧化为正,阴极还原为负,电子与质子电流沿全局 $+x$ 方向为正

$$ \partial_x i_s=-j_F,\qquad \partial_x i_H=j_F, $$$$ i_s=-\sigma_e^{\rm eff}\partial_x\phi_s,\qquad i_H=-\sigma_H^{\rm eff}\partial_x\phi_m. $$

每个 CL 控制体的两个电流散度使用同一个 $j_F$,两式相加直接得到 $i_s+i_H=I$ 逐点成立。恒流加载求解完,回头检查阳极端电流是否等于给定值,这是不花钱的正确性检查。原文式(7)、(8)里那些容易混淆的正负号,从此不再进入程序。

过电位只认常规定义

$$ \eta_e=\phi_s-\phi_m-U_e. $$

配合阳极 $j_F\ge0$、阴极 $j_F\le0$,乘积 $j_F\eta_e$ 天然非负,活化热 $Q_{\rm act}=j_F\eta_e$ 直接可写。端电压取两端电子电势之差,端面值由半单元通量外推,CL 活化损失和各层欧姆损失都已经含在电势解里,不能再减一次 $IR$。各层损失照样可以输出,但只做诊断分解,不进电压公式。

反应若出现明显反向,程序报告超出冷启动单向反应协议,不取绝对值硬跑。指数项用双曲正弦形式计算,大过电位下的指数溢出触发代数失败重试,不被当成物理停机。

转换表本身不长,贴在这里。

原文表达程序内约定
式(1) 三项带符号相加端电压取两端电子电势差,损失只做诊断
式(3)、(4) $J_i$ 分别作源同一个 $j_F$ 驱动两相散度,逐点闭合
式(7)、(8) 相电势差过电位$\eta=\phi_s-\phi_m-U_e$,$U_e$ 有明确参考
式(9) $V_{\rm ohm}\le0$耗散 $\sigma\|\nabla\phi\|^2$ 天然非负,不进电压

这张表往后比正文更常用。任何时候和原文对不上,先查表,别凭记忆翻译符号。

二、无量纲的对数与液态水参考态

式(2)的对数把分压以 Pa 直接放进比值,上一篇算过,压力不归一化在 253.15 K 能引入约 0.063 V 的偏差,初始干流道的水活度取零还会让对数发散。这一篇把这笔账了结。

电极平衡电势改写成活度形式

$$ U_a=-\frac{RT}{2F}\ln\frac{p_{\rm H_2}}{p_0},\qquad U_c=E^0(T)+\frac{RT}{4F}\ln\frac{p_{\rm O_2}}{p_0}. $$

水按液态标准态处理,活度取 1,零蒸气分压进对数的问题随之消失。$E^0(T)$ 不用原文的线性温度项,由反应焓与熵沿同一条参考链推出来,保证可逆热、反应焓和平衡电势讲的是同一件事。具体的焓熵账属于物性那篇,这里只登记结论。

这两处都改变了原文的字面用法,来源身份记为补充文献加项目解释。复现报告里原样列出,不宣称为原文公式的直接照搬。

三、整套账搬到 SI 摩尔基准

上一篇把五种水折算成每单位总体积的摩尔库存,$q_k$ 统一 $\mathrm{mol/m^3}$。这一步把整套模型都搬过去,不只是水。

搬运的动力来自三笔旧账。$EW$ 表1印作 1100 $\mathrm{kg/kmol}$,SI 摩尔基准下是 1.1 $\mathrm{kg/mol}$,$\rho_m=1980\ \mathrm{kg/m^3}$ 时位点浓度 1800 $\mathrm{mol/m^3}$,配着以 mol 计的法拉第常数,字面直代就是一千倍。表5的熵变印作 $-163110\ \mathrm{J/(kmol\,K)}$,换成 $-163.110\ \mathrm{J/(mol\,K)}$ 才能与摩尔基准的反应速率配套。表4里液冰转换那条边原文按质量源给出,进程序前除以 $M_w$,六条转换边的速率统一成 $\mathrm{mol/(m^3\,s)}$。同一套模型里 kmol 和 mol 混住,错不响,只偏。

反应计量的 $n$ 也要拆身份。原文的 $n$ 在动力学式里对应电子转移数,阳极 2、阴极 4,产水的电子计量是另一个数,2。三种产水机制共用同一套法拉第计量

$$ r_{\rm H_2}=\frac{j_{F,a}}{2F},\qquad r_{\rm O_2}=-\frac{j_{F,c}}{4F},\qquad r_w=-\frac{j_{F,c}}{2F}. $$

$0.1\ \mathrm{A/cm^2}$ 下面积产水速率 $I/(2F)\approx5.182\times10^{-3}\ \mathrm{mol/(m^2\,s)}$,积分后消耗的氢、消耗的氧、生成的水按 2、1、2 成比例。这条不用解方程就该满足,上一篇列为验收第一条,这一篇把它写进运行时预算。

六类相变走计量矩阵。按状态顺序 $(n,f,v,l,i)$,六条转换边依次是 $n\to v$、$n\to l$、$n\to f$、$v\to l$、$v\to i$、$l\to i$

$$ S_w=B\Gamma+S_{\rm reaction},\qquad B=\begin{pmatrix} -1&-1&-1&0&0&0\\ 0&0&1&0&0&0\\ 1&0&0&-1&-1&0\\ 0&1&0&1&0&-1\\ 0&0&0&0&1&1 \end{pmatrix}. $$

每条转换只写一次速率,供体减、受体加,由矩阵统一分配。$\mathbf 1^TB=0$,数学上就是内部交换不改变总水的离散表述。往后要加升华、加吸附,只需添一条边和一列,五个库存方程不用手工重写。这条设计直接来自上一篇踩过的坑,蒸发支供体乘错库存,能把液水推成负值。

四、符号拆名与参数的来源身份

原文的符号复用不少。$r_i$ 是式(5)的浓度反应级数,式(28)的 $r$ 却是孔半径;$\sigma$ 一处是表面张力,另一处是电导率;$I$ 是面电流密度,$J_i$ 是体积量。程序里全部拆成不重名的标识,不留任何靠上下文区分的符号。

参数侧立五个类。物理常数、材料参数、工况配置、状态布局、派生状态各归各的类,求解器容差单列,不和物理参数共用一个字典。参数对象不可变,敏感性分析生成新配置和新哈希,动态量只活在状态向量里。每个参数带六个字段,数值、单位、来源类别、来源定位、适用域、中文说明,命名直接带单位后缀。water_kg_per_mol 这种写法笨,但永远不会错。

来源类别就四种。P 是论文给定,比如表3的 $\alpha=0.5$。S 是已核查的补充文献,比如动力学候选值取自作者团队的博士论文附录。A 是项目假设,流道肋投影占比首版取 0.5 就属于这一类。N 是数值控制,比如相变门控的平滑宽度 0.05 K。饱和蒸气压二次项那处 $10^{-5}$ 指数修正属于 S,作者博士论文印刷 61 页摆在那里。这四个字母比任何备注都诚实,读者一眼能分清哪个数是作者的,哪个数是我的。

五、规矩落地后的第一批数字

规格阶段不跑求解器,规矩本身可以先用代数和手算验一遍。

修正指数后的 $-20\ ^\circ\mathrm{C}$ 饱和蒸气压是 157.6977 Pa,除以 $RT$ 得饱和浓度 0.07492 $\mathrm{mol/m^3}$,和上一篇 $\lambda_{\rm sat}\approx7.306$ 那组手算放到一起,低温端能互查的数字又多了两个。计量矩阵六列的列和在浮点舍入内严格为零。这些是对规格的独立代数检查,不是模拟结果,两者分得清,后面才谈得上验证。

两个小误差值得记。一个是我用 NumPy 复算饱和浓度,与上一篇的手算差了约 $5.6\times10^{-5}$ 的相对量,追了一圈,是两次取的气体常数精度不同。连 $R$ 都没统一,恰好证明常数入口只能有一个,所有物性从同一处取值,入口处留转换记录。另一个是自由度计数,我最初把阳极端的电势参考当成了单元中心未知量,写出 147,校对时改回 148。端面 Dirichlet 是边界条件,不占内部自由度。顺带把整本账摆出来,非平衡热耦合有 422 个物质库存自由度加 108 个能量自由度,共 530 个动态变量,等温分支 422,电势未知量电子 88 加质子 60。这种数字单看无趣,调试时它们是状态向量长度的第一道对账。

全局水预算把这套规矩收拢成一个运行时检查

$$ \mathcal W(t)=\sum_j\Delta x_j\sum_{k\in\rm water}q_{k,j}, $$$$ R_W=\mathcal W(t)-\mathcal W(0) -\int_0^t\left(N_{W,\rm left}-N_{W,\rm right}+\frac{I}{2F}\right)dt. $$

$R_W$ 的量纲是 $\mathrm{mol/m^2}$。总量变化只能由边界通量和电化学产水解释,产水项就是 $I/(2F)$。内部相变、膜水扩散、电渗拖曳都只搬水,不产水也不耗水,哪一项出现在外源里,哪一项就是 bug。上一篇说过,这条检查不依赖任何拟合参数,比曲线长得像更基础。

六、下一篇要动工的地方

符号与单位的账到这里理清。下一篇铺网格,三张互相连接的网格怎么搭,面通量守恒形式怎么避免变系数二阶导数的虚假驱动力,液水在干湿界面怎么不被零渗透率锁死。物性数值和加载协议的坑更多,留给第四篇。

把书面的账理清,比写代码更接近复现的一半。这句在上一篇结尾说过,这一篇是把前一半真的做完。

来源

  1. Huo S, Jiao K, Park J W. On the water transport behavior and phase transition mechanisms in cold start operation of PEM fuel cell. Applied Energy, 2019, 233-234, 776-788. doi.org/10.1016/j.apenergy.2018.10.068
  2. Jiao K. Experimental and Modelling Studies of Cold Start Processes in Proton Exchange Membrane Fuel Cells. PhD thesis, University of Waterloo, 2011. 大学资料库