Skip to content

ADR-0005 — Semi-implicit catalyst reaction-heat coupling

Status: Accepted

Context

A catalyst light-off releases reaction heat (HRR, pipe.q_rxn) on the washcoat, which heats the gas. Folding that HRR into the quasi-steady gas-energy solve as an explicit source is unstable at the large QS macro step: a transient HRR spike (a light-off Δθ overshoot) injected explicitly drove the gas temperature to physically absurd values (excursions on the order of ~10⁵ K were observed), diverging the steady march / EOS update.

Decision

Couple the reaction heat semi-implicitly, bounding the per-step rise by construction rather than hoping the step is small enough:

  • the gas↔solid heat-transfer term q = K·(T_s − T_g) is folded semi-implicitly in the QS steady-energy kernel (_qs_steady_energy_kernel, src/aeolus1d/solver/quasi_steady_network.py), so the gas temperature relaxes toward the solid rather than overshooting; and
  • the reaction heat can be routed onto the substrate temperature instead of straight into the gas (qs_surface_q_rxn_into_substrate, [case], default False): dT_s += q_rxn/(ρ_s·c_s) bounds the rise by the substrate heat capacity by construction, and the gas then picks it up through the already semi-implicit heat-transfer fold.

With the semi-implicit fold in place, including the HRR in the gas-energy solve (qs_surface_q_rxn_into_energy, default True) is safe.

Consequences

  • A violent light-off transient stays bounded across several macro steps instead of exploding in one — the QS driver can run aftertreatment light-off without a hand-tuned tiny step.
  • The physically-correct routing (q_rxn onto the solid, default-off for backward compatibility) is available and bounds the rise even more directly.
  • An earlier explicit per-step ΔT capacitance limiter has been superseded by the semi-implicit fold + substrate routing; some legacy comments still mention a qs_q_rxn_max_dT_per_step knob that no longer exists as a live field — do not rely on it.

References

  • src/aeolus1d/solver/quasi_steady_network.py — _qs_steady_energy_kernel.
  • qs_surface_q_rxn_into_energy, qs_surface_q_rxn_into_substrate ([case]).