Skip to content

Aftertreatment thermal & catalytic blocks

Reference for three TOML blocks on the thermal path that had no documentation before 2026-08-01:

  • [pipe.filter.thermal] — solid-phase thermal mass for a DPF (cake + substrate wall + canning loss)
  • [pipe.filter.csf] — catalysed-soot-filter CO / HC oxidation
  • [[coolant_coupling]] — pairs a gas pipe to a coolant pipe through a dynamic wall

They belong together because each one moves heat out of the gas and into something with a heat capacity, which is what makes an aftertreatment model lag rather than track. Every field defaults to the pre-feature behaviour, so adding any of these blocks to an existing case and leaving its values at their defaults is bit-identical — see the "off by default" note on each table.

For the filter model itself ([pipe.filter], [pipe.filter.regen]) see closures-reference; for the physics see theory §7. tests/unit/test_aftertreatment_thermal_doc_coverage.py asserts every field of every spec below appears on this page.

[pipe.filter.thermal] — DPF solid-phase thermal mass

Routes regeneration heat release through a per-cell cake temperature T_cake (mirroring the catalyst's T_solid path) instead of depositing it straight into the gas energy residual, and optionally adds a second, much larger thermal mass for the substrate wall itself.

Omit the block entirely to keep heat release on the original direct-to-gas path.

Field Type Default Meaning
Omega_cake float 1500000.0 Volumetric heat capacity of the soot cake, \(\rho_s c_{p,s}\) [J/(m³·K)]. The default is soot at 1500 kg/m³ × 1000 J/(kg·K) = 1.5 MJ/(m³·K).
h_eff float 10000.0 Volumetric cake↔gas heat-transfer coefficient \(h \cdot a_v\) [W/(m³·K)].
T_cake_init float 300.0 Initial uniform cake temperature [K].
Omega_wall float 0.0 Volumetric heat capacity of the substrate monolith [J/(m³·K)]; cordierite is ≈ 2.0 MJ/(m³·K) (1800 kg/m³ × 1100 J/(kg·K)) scaled by the solid fraction. 0 = off, and off means the substrate stays in equilibrium with the gas. This is the thermal-inertia element a WHTC or cold-start case needs.
h_wall float 0.0 Volumetric substrate↔gas coefficient [W/(m³·K)]. 0 = off. The wall temperature is seeded from FilterSpec.T_solid_init.
h_canning float 0.0 Lumped volumetric substrate↔ambient coefficient through shell + insulation [W/(m³·K)]. 0 = adiabatic canning. Build it from the series resistance \(1/h = 1/h_{conv} + \Delta x_{ins}/k_{ins} + \Delta x_{shell}/k_{shell}\), then convert per-area to per-volume with \(h_{vol} = h_{area}\cdot 4/D_{brick}\).
T_ambient float 298.15 Ambient temperature outside the canning [K]. Only read when h_canning > 0.
T_cake_max float 0.0 Clip applied to T_cake at the end of each macro step [K]. 0 = no clip. A stand-in for the O₂ mass-transfer limit the pure-Arrhenius regen rate does not have: without it a localised ignition can drive one cell past 2000 K and the burn-down rate stops being physical.

[pipe.filter.csf] — catalysed soot filter (CO + HC oxidation)

A wall-flow catalysed DPF carries a washcoat that oxidises CO and unburnt hydrocarbons on the cake and wall, in parallel with the soot-O₂ regeneration. Rates are Arrhenius in the substrate temperature and first order in the gas-phase concentration.

Omit [pipe.filter.csf] to leave the brick passive — and note that both pre-exponentials default to 0.0, so the block is inert until you set them.

Field Type Default Meaning
A_co float 0.0 CO–O₂ catalytic pre-exponential [1/(s·(mol/m³))]. 0 = off.
Ea_co float 50000.0 CO oxidation activation energy [J/mol]; ≈ 50 kJ/mol is typical for Pt/Pd.
A_c3h6 float 0.0 C₃H₆–O₂ catalytic pre-exponential [1/(s·(mol/m³))]. 0 = off.
Ea_c3h6 float 65000.0 HC oxidation activation energy [J/mol]; ≈ 65 kJ/mol typical for Pt/Pd.
dH_co float 10000000.0 Heat of reaction [J per kg CO], from CO + ½O₂ → CO₂.
dH_c3h6 float 46000000.0 Heat of reaction [J per kg C₃H₆], from C₃H₆ + 9/2 O₂ → 3CO₂ + 3H₂O.
k_mt_co float 0.0 CO mass-transfer rate constant [1/s]. 0 = off (unbounded Arrhenius).
k_mt_c3h6 float 0.0 C₃H₆ mass-transfer rate constant [1/s]. 0 = off.

The two k_mt_* caps use the same serial-resistance composition as the soot side's RegenSpec.k_mt:

\[\frac{1}{r_{\text{eff}}} = \frac{1}{r_{\text{Arrhenius}}} + \frac{1}{r_{\text{mt}}}, \qquad r_{\text{mt}} = k_{mt}\, c_{\text{species}}\]

Above light-off the bare Arrhenius rate grows without bound while a real washcoat plateaus at the rate species can reach the surface. Setting these is what lets literature-scale A values run without destabilising the quasi-steady energy solve.

Reference magnitudes, from AVL Cruise-M's cake_regeneration_models for C02006: A ≈ 1.11e10 kmol/(m³·s), 1.5e8 m^1.5/(kmol^0.5·s) and 0.003736 kmol/(m³·s); T_act = 5000–7998 K, i.e. Ea ≈ 42–66 kJ/mol.

[[coolant_coupling]] — gas pipe ↔ coolant pipe

A top-level list block. Each entry pairs one gas pipe with one coolant pipe; the two exchange heat through the gas pipe's dynamic wall.

Field Type Default Meaning
gas_pipe str required id of the gas-side pipe. It must carry [pipe.thermal_wall] with kind = "dynamic" — a static-wall pipe has no wall state for the coolant to reach.
coolant_pipe str required id of the coolant-side pipe.

The coupling is cell-aligned: cell i of the gas pipe exchanges with cell i of the coolant pipe through wall cell i. Both pipes must therefore declare the same n_cells; they need not have the same length or area, so a counter-flow jacket of a different physical size is expressed by choosing the cell count to match, not the geometry.

[[coolant_coupling]]
gas_pipe     = "egr_cooler_gas"
coolant_pipe = "egr_cooler_water"