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], defaultFalse):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_rxnonto 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_stepknob 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]).