Numerical design rationale

This page records numerical choices visible in audited Arrhenius.jl and Cantera source paths, the reasons available in source history, and tests identified by the audits. It is a source comparison, not a claim that the solvers produce identical solutions.

Scope. Arrhenius.jl refers to audited source snapshot 78ab438, flame mode discretization=:finite_difference, except where point APIs/reactors are named. Cantera refers to 4.0 development source at commit 726522be4e2a13454d8415b7ef799d621f665cf3, with mixture-averaged transport and no Soret/radiation by default. Cross-code survey: 2026-10-16. “Identical” means same rule/constants in the audited mode, not bitwise equality; “different” describes implementation, not merit. All comparison code references below are public.

Many original Cantera constants predate surviving issue/PR records. Where motivation cannot be established, it is stated as unknown rather than inferred. Cantera's original 1-D solver cites Kee, Coltrin, and Glarborg’s Chemically Reacting Flow (publisher record). Cantera line links are pinned to the source SHA. Tests are those identified in the audits; “none found” means no dedicated test was located.

1. Unknowns and scaling

ChoiceArrhenius.jl (mode)CanteraOther public codesWhy / sourceStatusTest that pins it
Flow unknown, temperatureFree/burner FD uses mass flux mdot; temperature is kK.Velocity u, temperature K; continuity uses rho*u.PREMIX and Zero-RK use mass flux (PREMIX, Zero-RK).Cantera continuity; native Flames.jl.Different; changes Jacobian couplings, bounds, and norm weights.Flame initial-state/residual tests; no exact parity test found.
Unknowns and row orderT, Y₁…Yₖ, mdot; no trivial components.U,V,T,Lambda,E,Uo,Y₁…Yₖ; trivial components have identity residual rows.OpenSMOKE++ implementation.Cantera offsets; native Flames.jl.Different; bandwidth, pivot order, and norm denominator differ.Layout/residual tests; no cross-code matrix test.
Fixed-temperature anchorNearest existing node to 0.75 T_in + 0.25 T_eq; no insertion.May snap or insert the target node by interpolation, then relocates after regridding.PREMIX accepts/inserts user location (source).Cantera initialization, Sim1D insertion; native Flames.jl.Different rule; same anchor on audited default grids only.Default-grid fixtures; arbitrary-grid parity not found.
Row/variable scalingSpecies rows scaled 1e-4; temperature uses kK and 1e-4 scaling.Physical-unit residuals; step weights rtol*mean(abs(x))+atol.TWOPNT family uses row scaling/componentwise tests (Zero-RK).Cantera weighted norm; native Flames.jl.Different; exact Newton step invariant, FP and residual stopping are not.Residual tests; no saved-state cross-code norm fixture.

2. Discretization

ChoiceArrhenius.jl (mode)CanteraOther public codesWhy / sourceStatusTest that pins it
Convection stencilBackward difference, assumes positive flow.First-order upwind by velocity sign for species, temperature, enthalpy.Ember sign-aware upwind (source); Zero-RK centered/upwind options (source).Cantera stencil; native Flames.jl. History records a stability rationale; origin predates GitHub.Different for nonpositive iterates; native flow bound usually keeps mdot positive.No dedicated reversed-flow stencil test found.
Diffusion divergence/conductionCentered face-flux differences.Same centered divergence; equivalent two-face conduction form.PREMIX/OpenSMOKE++ use face fluxes (PREMIX, OpenSMOKE++).Cantera energy/species rows, diffusion; native Flames.jl.Same math; FP operation order differs.Flame residual/transport tests; no global lockstep claim.
Diffusion basis/correction velocityMole-fraction gradients; correction uses left-node Y_k.Same gradient basis and left-node correction.PREMIX/OpenSMOKE++ commonly use face-averaged mass fractions (PREMIX, OpenSMOKE++).Cantera diffusion flux; native Flames.jl.Identical formula in this mode.Flame transport/flux tests; no dedicated symmetry test.

3. Property updates and Jacobian

ChoiceArrhenius.jl (mode)CanteraOther public codesWhy / sourceStatusTest that pins it
Full residual property refreshThermo/rates at nodes, transport at nodes/faces.Same for full residual.Public implementations vary: Cantera, Zero-RK.Cantera update; native Flames.jl.Identical sequence in audited mode.Flame residual tests.
FD perturbationFull FD; positive `h=1e-7*max(x, floor)` (T in kK).One-sided `dx=1e-5x+1e-10`, divided by representable increment.
Default Jacobian modeFD path builds full FD Jacobian; analytic option is for conservative mode.auto may use analytic species columns at interior nodes if available.Zero-RK has banded FD and iterative options (source; Lapointe et al.).Cantera auto/analytic fill; native Flames.jl.Different unless caller selects Cantera FD; caller selection unknown.Jacobian tests; mode-matched comparison open.
Frozen transport in JacobianRecomputes perturbed thermo/rates, reuses base transport.Local Jacobian eval reuses transport; trial residual refreshes it.Modified Newton/Broyden vary; OpenSMOKE++.Cantera local eval; native Flames.jl.Same frozen quantities in audited FD mode.Jacobian/property tests; no lockstep test.

4. Newton: norms, bounds, damping, convergence

ChoiceArrhenius.jl (mode)CanteraOther public codesWhy / sourceStatusTest that pins it
Damping scheduleSeven trials, factor sqrt(2), accept `s1<1s1<s0`.Same schedule and predicate.TWOPNT halves ≤5 times and requires non-increasing max norm; Zero-RK may use no line search (TWOPNT, Zero-RK).MultiNewton. Constants date to 2003; original rationale did not survive. Method reference: Kee et al. (Wiley).
BoundsSmall negative Y allowed; native T and positive bounded mdot.T [200,6000] K, Y [-1e-7,1e5]; velocity unbounded.PREMIX/OPPDIF differ; OpenSMOKE++ reflects at zero (PREMIX, OpenSMOKE++).Cantera bounds, step bound; native Flames.jl.Different; Cantera bound tightened in 2016; motivation/test not found.Indirect flame coverage; no dedicated edge-bound test.
Norm weights/denominatorWeight uses component mean magnitude plus atol; denominator counts native unknowns.Same weights; denominator counts all unknowns including trivial variables.TWOPNT/Chemkin use componentwise max-like criteria (TWOPNT, Chemkin manual).Cantera norm; native Flames.jl.Different denominator; can shift decisions.No saved-step cross-code norm fixture found.
Steady convergence/capContinues Newton after small correction; exits primarily on scaled residual <1e-8 with floor fallback; cap 35.Accepted damped correction norm <1; no matching 35-step cap.Other codes use their own scales (Zero-RK, OpenSMOKE++).Cantera loop; native Flames.jl.Different; can change fallback cadence.Flame convergence tests; no single-step parity test.
TolerancesDefaults match Cantera values; residual scaling differs.rtol=1e-4; steady atol=1e-9, transient atol=1e-11.PREMIX similar relative/absolute scale (source).Cantera defaults; history says defaults loosened for typical convergence while retaining resolved results.Values identical; stopping meaning differs.Solver option and flame tests.

5. Time stepping

ChoiceArrhenius.jl (mode)CanteraOther public codesWhy / sourceStatusTest that pins it
Hybrid pathSteady Newton, backward-Euler fallback, Newton retry; most cadence defaults match.Same hybrid architecture.PREMIX uses longer batches; OpenSMOKE++/Zero-RK premixed paths may start transient-first (PREMIX, OpenSMOKE++, Zero-RK).SteadyStateSystem; hybrid lineage Grcar et al..Architecture/constants mostly same; steady-success and retry sequence differ.Time-step/flame tests; decision-trace test not found.
Step size, batches, Jacobian agedt=1e-5, batches of 10, growth 1.5 only if no new factorization, halve on failure, 500-step cap.Same cadence; Jacobian age 20 and bounded forced reevaluations.PREMIX has distinct batches/growth (source).Cantera stepping; PR #1907 refactored; PR #2074 added timestep regridding/strategies. Earlier constants predate surviving issue records.Core cadence same; regrid retry policy varies.Cantera timestep-regrid tests; native indirect coverage.
Failure recoverySeparate clipped-species retry path.Reduces dt; after repeated failures resetBadValues clips and renormalizes species.Policies differ in Zero-RK, Ember, and PREMIX.Cantera failure handling, Flow1D reset.Different sequence; relevant near negative/trace species.No dedicated native retry-sequence test found.

6. Refinement and domain

ChoiceArrhenius.jl (mode)CanteraOther public codesWhy / sourceStatusTest that pins it
Refinement defaultsRatio 3, slope .06, curve .12.Ratio 10, slope .8, curve .8, value-range gate and midpoint insertion.PREMIX/Zero-RK commonly use tighter gradient/curvature (PREMIX, Zero-RK).Cantera criteria, defaults; native Flames.jl.Different; grids/accuracy need separate comparison.Cantera refine tests and native refinement tests.
Point changes and limitsMay re-solve prune-only passes; checks proposed grid against max.Stops when no additions; checks current count against limit.PREMIX/OpenSMOKE++ surveyed paths are add-only (PREMIX, OpenSMOKE++).Cantera refine loop; native Flames.jl.Different termination/check timing; prune cases differ.Cantera refine/max-grid tests; native refine tests.
Auto stages/domainNative retry/final stages; free flame can expand domain outside auto.Auto staged retries; free-flame edge-gradient check doubles domain in auto mode.Ember adjusts domain for transient flame solution (source).Cantera auto solve, domain check; native Flames.jl.Different solve paths; comparisons must match driver.Cantera auto/domain tests; native free-flame tests.

7. Trace and negative species

ChoiceArrhenius.jl (mode)CanteraOther public codesWhy / sourceStatusTest that pins it
Flame bounds/recoverySigned species in ordinary residual; clipping only on retry.Newton allows Y to -1e-7; repeated timestep failure triggers clip/renormalize.Zero-RK signed residual with Jacobian floors; OpenSMOKE++ reflects at zero (Zero-RK, OpenSMOKE++).Cantera bounds, recovery; native Flames.jl.Ordinary residual similar; recovery/bounds differ.Edge tests should include 0, 1e-25, -1e-25, -1e-7; missing-species restart parity not found.
Point transport/thermo floorsTransport X floor 1e-20; thermo log floor 1e-300.Same floors in audited ideal-gas paths.Cantera transport source public.MixTransport, IdealGasPhase; native Transport.jl, Thermo.jl.Identical floors in these point paths.Point tests; exact-zero tests not found.
Reactor kinetics compositionIdeal-gas reactor clips negative Y before concentrations; flame RHS stays signed.Signed, unnormalized composition reaches thermo/kinetics.Cantera reactor source public.Cantera reactor; native Reactors.jl.Different; creates a kink at zero and changes trace rates.Reactor RHS tests; signed-state cross-code fixture not found.

8. Kinetics, thermo, and transport point evaluation

ChoiceArrhenius.jl (mode)CanteraOther public codesWhy / sourceStatusTest that pins it
Rate coverage/arithmeticExported Arrhenius, falloff, PLOG, Blowers–Masel, LinearBurke; some reverse/negative-state handling differs.Broader native rate implementation.OpenSMOKE++ detailed-kinetics framework (paper, code).Cantera kinetics; native Kinetics.jl.Different for unsupported formats, negative-state rules, arithmetic order.Point tests by rate family; chemically activated/negative-input gaps remain.
Thermo polynomials/reference pressureNASA7/NASA9/Shomate; arithmetic may differ; entropy reference shifted to 1 atm on load.NASA polynomials and standard-state evaluation in thermo classes.OpenSMOKE++ thermo code public.Cantera NASA7, IdealGasPhase; native IdealGasThermo.jl.Mostly equivalent equations; arithmetic, region, and reference-pressure details differ.Thermo point tests; no blanket parity claim.
Mixture transport/pure stateWilke rules and mixture-averaged diffusion; some pure-state fallback/sum details differ.Same broad model with pure-species guards.Zero-RK alternative source.Cantera MixTransport, GasTransport; native Transport.jl.Different pure-dominant fallback/floored sums; ordinary cases mostly same formulas.Transport tests; pure/trace edge parity tests not found.

9. Reactors

ChoiceArrhenius.jl (mode)CanteraOther public codesWhy / sourceStatusTest that pins it
Reactor state and integratorIdeal-gas state [Y;T]; example uses OrdinaryDiffEq QNDF; core accepts integrators.Constant-volume state [m,V,T,Y]; CVODES BDF in audited network path.OpenSMOKE++ framework (paper, code); Ember transient splitting (paper, code).Cantera state, network integrator; native Reactors.jl, example.Different state/integrator; error norms and counts are not directly comparable.Validation uses nominal common tolerances; no same-integrator test.
RHS, energy, negative speciesSpecies/energy equations algebraically equivalent for nonnegative ideal-gas states; negative Y clipped before kinetics.Signed composition reaches kinetics; mass/volume variables are part of state.OpenSMOKE++ framework paper (DOI).Cantera RHS; native Reactors.jl.Same algebra in ordinary states; negative species and integrated variables differ.Reactor RHS/case tests; no negative-state cross-code fixture.
Equilibrium algorithmOne native method with its own initialization and bounded outer temperature solve.auto dispatch tries ChemEquil, then VCS, then Gibbs minimization.Cross-code equilibrium was outside the 1-D survey.Cantera dispatch; native Equilibrium.jl.Different algorithms/stopping criteria; no general equivalence claim.Native equilibrium tests; Cantera's multiple paths complicate comparison.

References

Publication records below are linked to DOI/publisher records and transcribed from DOI metadata. Code and PR links above evidence implementation; these papers provide algorithm lineage or software context.

@article{Grcar1988,
 author={Grcar, Joseph F. and Kee, Robert J. and Smooke, Mitchell D. and Miller, James A.},
 title={A hybrid {Newton}/time-integration procedure for the solution of steady, laminar, one-dimensional, premixed flames},
 journal={Symposium (International) on Combustion}, publisher={Elsevier BV}, year={1988},
 volume={21}, number={1}, pages={1773--1782}, doi={10.1016/S0082-0784(88)80411-9},
 url={https://doi.org/10.1016/S0082-0784%2888%2980411-9}
}
@article{Cuoci2015,
 author={Cuoci, A. and Frassoldati, A. and Faravelli, T. and Ranzi, E.},
 title={{OpenSMOKE++}: An object-oriented framework for the numerical modeling of reactive systems with detailed kinetic mechanisms},
 journal={Computer Physics Communications}, publisher={Elsevier BV}, year={2015}, volume={192}, pages={237--264},
 doi={10.1016/j.cpc.2015.02.014}, url={https://doi.org/10.1016/j.cpc.2015.02.014}
}
@article{Long2018,
 author={Long, Alan E. and Speth, Raymond L. and Green, William H.},
 title={Ember: An open-source, transient solver for {1D} reacting flow using large kinetic models, applied to strained extinction},
 journal={Combustion and Flame}, publisher={Elsevier BV}, year={2018}, volume={195}, pages={105--116},
 doi={10.1016/j.combustflame.2018.05.001}, url={https://doi.org/10.1016/j.combustflame.2018.05.001}
}
@article{Lapointe2019,
 author={Lapointe, Simon and Whitesides, Russell A. and McNenly, Matthew J.},
 title={Sparse, iterative simulation methods for one-dimensional laminar flames},
 journal={Combustion and Flame}, publisher={Elsevier BV}, year={2019}, volume={204}, pages={23--32},
 doi={10.1016/j.combustflame.2019.02.030}, url={https://doi.org/10.1016/j.combustflame.2019.02.030}
}
@book{Kee2003,
 author={Kee, Robert J. and Coltrin, Michael E. and Glarborg, Peter},
 title={Chemically Reacting Flow: Theory and Practice}, publisher={Wiley}, year={2003},
 isbn={9780471461296}, doi={10.1002/0471461296}, url={https://doi.org/10.1002/0471461296}
}