Methods

Method

MEC — Volmer-Heyrovsky hydrogen evolution

mec-volmer-heyrovsky-v1 · cathodic_reduction · MEC

What it predicts

Volumetric H₂ production rate, cathodic hydrogen recovery and applied-voltage energy efficiency for a driven MEC.

Governing relations

Each relation is transcribed from the implementation. Where the code cites no source, the source line says so.

  1. Voltage budget solved for the current
    Vapp−∣Eeq∣=ηa(j)+ηc(j)+j Rint,∣Eeq∣=0.13 V,Rint=0.04 dV_{app} - \lvert E_{eq}\rvert = \eta_a(j) + \eta_c(j) + j\,R_{int}, \qquad \lvert E_{eq}\rvert = 0.13\ \mathrm{V}, \quad R_{int} = 0.04\, d

    Source: Voltage budget with R_int = 0.04 Ω·m² per cm; mec.ts cites no source for it.

    SymbolMeaningUnit
    VappV_{app}applied cell voltage (default 0.6)V
    EeqE_{eq}acetate-anode / H₂-cathode equilibrium voltage, −0.13V
    ηa,ηc\eta_a, \eta_canode and cathode overpotentials at current jV
    jjkinetic current densityA/m²
    RintR_{int}internal resistanceΩ·m²
    ddelectrode spacing, floor 0.1cm
  2. Anode Tafel term
    ηa=max⁡ ⁣(0, 0.045 log⁡10jj0,a),j0,a=1.0 A/m2⋅eEaR(1298.15−1T)⋅SKs+S\eta_a = \max\!\left(0,\ 0.045\,\log_{10}\frac{j}{j_{0,a}}\right), \qquad j_{0,a} = 1.0\ \mathrm{A/m^2} \cdot e^{\frac{E_a}{R}\left(\frac{1}{298.15}-\frac{1}{T}\right)} \cdot \frac{S}{K_s+S}

    Source: j₀ = 1.0 A/m² for a Geobacter biofilm on graphite brush, attributed in mec.ts to Logan 2008 Table 4.1 and not re-checked against the book (2026-10 citation audit).

    The MEC anode is a Tafel term, not the Butler-Volmer solve the MFC predictor uses; both share the Arrhenius and Monod factors from anode-kinetics.ts.

    SymbolMeaningUnit
    ηa\eta_aanode overpotentialV
    0.0450.045Geobacter anode Tafel slopeV/dec
    j0,aj_{0,a}anode exchange current density after temperature and substrate factorsA/m²
    EaE_aactivation energy, 25 000J/mol
    S,KsS, K_sinfluent COD and its half-saturation constantmg/L
  3. Cathode HER overpotential (Tafel form)
    ηc=b log⁡10jj0,c(j>j0,c),b=0.03 V/dec×m\eta_c = b\,\log_{10}\frac{j}{j_{0,c}}\quad (j > j_{0,c}), \qquad b = 0.03\ \mathrm{V/dec} \times m

    Source: Approximate HER exchange-current table and Tafel slopes; mec.ts cites no source for it.

    The j₀ table is labelled approximate in the code; the spread is wide.

    SymbolMeaningUnit
    ηc\eta_ccathode hydrogen-evolution overpotentialV
    bbTafel slopeV/dec
    mmslope multiplier: 1 for a Pt cathode, 4 for carbon, 2 otherwise1
    j0,cj_{0,c}HER exchange current density: 10 on Pt/C, 0.02 on stainless steel, 0.005 on plain carbon, 0.05 defaultA/m²
  4. Substrate-electron ceiling on the current
    j=min⁡ ⁣(jkin, S⋅24HRT⋅V⋅F8⋅86 400⋅A)j = \min\!\left(j_{kin},\ \frac{S \cdot \frac{24}{\mathrm{HRT}} \cdot V \cdot F}{8 \cdot 86\,400 \cdot A}\right)

    Source: COD stoichiometry, 1 mol O₂ = 32 g COD = 4 mol e⁻ (electron-supply.ts).

    An absolute ceiling: it assumes 100 % COD removal and 100 % coulombic efficiency, so it errs toward permitting too much current.

    SymbolMeaningUnit
    jkinj_{kin}current the voltage budget can driveA/m²
    SSinfluent COD (g/m³ equals mg/L)g/m³
    HRT\mathrm{HRT}hydraulic retention timeh
    VVchamber volume (default 28 mL)m³
    AAanode area (default 0.024)m²
    88grams COD per mole of electrons (32 g O₂ per 4 e⁻)g/mol
  5. H₂ rate from Faraday
    QH2=j A2F⋅86 400⋅Vm⋅10−3⋅rH2VQ_{H_2} = \frac{j\,A}{2F} \cdot 86\,400 \cdot V_m \cdot 10^{-3} \cdot \frac{r_{H_2}}{V}

    Source: Faraday's law; magnitude anchor Cheng & Logan 2007, PNAS 104:18871 (1.1 m³ H₂/m³·day at 0.6 V). · doi:10.1073/pnas.0706379104

    SymbolMeaningUnit
    QH2Q_{H_2}volumetric hydrogen production rate at STPm³ H₂/m³·day
    jjoperating current densityA/m²
    AAanode aream²
    VmV_mmolar gas volume at 0 °C and 1 atm, 22.414L/mol
    rH2r_{H_2}cathodic hydrogen recovery (default 0.85)1
    VVchamber volumem³
  6. Applied-voltage energy efficiency
    ηE=nH2 ΔHH2j A Vapp t=rH2 ΔHH22F Vapp\eta_E = \frac{n_{H_2}\,\Delta H_{H_2}}{j\,A\,V_{app}\,t} = \frac{r_{H_2}\,\Delta H_{H_2}}{2F\,V_{app}}

    Source: Logan et al. 2008, Environ. Sci. Technol. 42:8630. · doi:10.1021/es801553z

    With coulombic efficiency taken as 100 %, current cancels and η_E depends on V_app alone. The code flags it `appliedVoltageEfficiencyIsIdentity`: a thermodynamic ceiling, not a modelled result.

    SymbolMeaningUnit
    ηE\eta_Eelectrical energy efficiency; above 100 % is expected because the substrate supplies the balance1
    nH2n_{H_2}hydrogen recovered over time tmol
    ΔHH2\Delta H_{H_2}higher heating value of H₂, 285 800J/mol
    rH2r_{H_2}cathodic hydrogen recovery1
    VappV_{app}applied cell voltageV

    Worked example

    These inputs, passed to the predictor, return the output below. A test re-runs the example on every change, so this number is the one the code produces.

    inputvalueunit
    temperatureC25°C
    ph7pH
    electrodeSpacingCm2cm
    hrtHours24h
    codMgL1,000mg/L
    cellVoltageV0.6V

    Output · mec.appliedVoltageEfficiency = 209.8 %, within ±0.1 %

    By hand · r_H₂ = 0.85 (default). η_E = 0.85 × 285 800 / (2 × 96 485.33 × 0.6) = 242 930 / 115 782.4 = 2.098, i.e. 209.8 %. The current (0.163 A/m², substrate-limited) cancels.

    Reproduce · Pinned by libs/shared/electrochemistry/src/predictors/worked-examples.test.ts. Run it from the repository root:

    pnpm exec jest -c libs/shared/electrochemistry/jest.config.js worked-examples.test.ts -t "mec.appliedVoltageEfficiency"

Assumptions and constants

  • Anode: Tafel term with a 45 mV/dec slope and j₀ = 1 A/m² at 25 °C and saturating substrate, scaled by the shared Arrhenius and Monod factors (anode-kinetics.ts).
  • b_HER = 30 mV/dec on Pt, ×4 on carbon, ×2 otherwise; j₀_HER = 10 A/m² on Pt/C, 0.02 on stainless steel, 0.005 on plain carbon, 0.05 by default.
  • Coulombic-to-hydrogen recovery r_H₂ defaults to 0.85 (range 0.6–0.95; lower with active methanogens).
  • Defaults when not supplied: V_app = 0.6 V, chamber 28 mL, anode area 0.024 m².
  • H₂ volume reported at STP (0 °C, 1 atm).

Corrections applied

  • Substrate-limited current cap from the COD supply (`substrateLimited`).

Not modelled

  • COD removal and coulombic efficiency: both need a substrate mass balance the snapshot solver does not have, so they are returned as not computed.

Literature anchors in the source

  • Liu, Grot & Logan 2005, Environ. Sci. Technol. 39:4317
  • Cheng & Logan 2007, PNAS 104:18871 · doi:10.1073/pnas.0706379104
  • Call & Logan 2008, Environ. Sci. Technol. 42:3401
  • Logan et al. 2008, Environ. Sci. Technol. 42:8630 · doi:10.1021/es801553z
  • Logan & Rabaey 2012

Implementation

libs/shared/electrochemistry/src/predictors/mec.ts

Interval the predictor ships

heuristic_fixed_fraction — A fixed ±25 % placeholder band. It is NOT a calibrated interval; when served through /api/ml/predict it is replaced by the benchmark band below, or withheld. How served intervals are built

Calibration artifacts used when served

  • Benchmark out-of-fold residual quantiles: bes-benchmark-v1 · gkf5 · generated 2026-09-09
  • Split-conformal calibration: split-conformal · generated 2026-05-21
  • Hierarchical-priors v2 trust snapshot: populated · generated 2026-05-16

Benchmark cells for this predictor’s systems

Each row is a stratum with n ≥ 30 residuals at nominal level 90%. Coverage is the cross-validated share of held-out points inside the band.

targetstratumnpaperscoverageCV
cod_removalMEC1223085.2%
cod_removalMEC|wastewater_treatment651483.1%
coulombic_efficiencyMEC1072488.8%
coulombic_efficiencyMEC|resource_recovery661084.8%
current_density_arealMEC1072386.0%
current_density_arealMEC|resource_recovery308100.0%
current_density_arealMEC|wastewater_treatment56976.8%

Prior trust by served parameter

The state the lab badge shows for each served parameter and system, from the v2 priors fit.

parametersystemstatepapersprior
current_density_arealMECmodeled21weakly_informative
coulombic_efficiencyMECcurated23literature
cod_removalMECcurated29weakly_informative

Scientific-rigor gates

pnpm verify:science runs these rules over the committed priors and validation artifacts in pre-commit. Known violations are baselined per rule and slug; a new one blocks the commit. Baseline from hierarchical-priors-v2.json@2026-10-26T00:10:47.721880+00:00.

rulebaselined
gate-honestyNo parameter may pass a rounded-threshold gate read while converged=false1
support-containmentBounded quantities must have ci95 inside physical support, width <= range3
magnitude-sanityNo ci95 bound may exceed the plausibility ceiling (1.0e+6)0
slug-uniquenessNo two slugs may share a spelling-independent identity; scale must agree2
secondary-source-purityNo fitted prior may carry a REVIEW (secondary-source) stratum0
artifact-pairingEach fit must have its own coverage evidence; the served fit must have some0
coverage-sharpnessAny coverage figure must ship its interval width alongside0
interval-calibrationHeld-out interval coverage per parameter may not newly degrade128
effects-gap-completenesseffects.json is schema 2.0; every non-high effect has a gap per archetype; no gap is "high"0