Skip to content
SHD Sim
Menu

Validation/Premixed combustion

Laminar premixed flame

Weller’s model does not predict a flame speed — it is given one, so that comparison is the product’s own input read back out, and the page says so. What is independent is the burnt-gas temperature and the expansion ratio.

VerificationBurnt gas within 0.334 % of the adiabatic flame temperature; expansion ratio within 0.314 %

Why this case

Premixed combustion — XiFoam and the two solvers built on the same regress-variable equation — had no reference of any kind behind it. This case gives it one, and the honest version of what that reference is takes a section of its own, immediately below, because the obvious reading of “a flame travelling at the right speed” is not what is being shown.

The case itself is the simplest flame the model describes: a planar, unstretched front in a one-dimensional duct, closed at the unburnt end and open at the burnt end, with the wrinkling factor held at one. A spherical kernel in a box would be stretched, and stretch is the one thing the exact statement excludes.

PhysicsPremixed combustion on Weller’s regress variable b, laminar, unstretched
SolverXiFoam, heheuPsiThermo, homogeneousMixture, absoluteEnthalpy
Duct0.12 m long, one cell across in both thin directions, 480 cells — 2.5 × 10⁻⁴ m
Endsx = 0 an open outlet at the staged pressure; x = 0.12 m a wall, on the unburnt side
MixturePropane, unburnt at 293.15 K and 101 325 Pa; W 29.4649 unburnt, 28.3233 burnt
Time11 250 steps of 8 × 10⁻⁶ s to 0.09 s, 45 written states
ReferenceThe adiabatic flame temperature and expansion ratio derived from the case’s janaf polynomials; the declared Su read back out of the case
AgreementBurnt gas 0.334 % from the adiabatic flame temperature the case’s janaf data implies, and the expansion ratio 0.314 % from it

The flame speed reference is the product’s own input

Weller’s model does not predict a laminar flame speed. It is given one: constant/combustionProperties names a laminar flame speed correlation, and the product stages

    laminarFlameSpeedCorrelation constant;
    Su   [0 1 -1 0 0 0 0]   0.434;      fuel Propane

The regress-variable equation then propagates the front at Su·Xi relative to the unburnt gas. So when this page reports a flame speed of 0.4315 m/s against 0.434 m/s, the 0.434 is not somebody else’s answer — it is this case’s own input, read back out of the dictionary it was written into. The benchmark has no opinion about what propane’s flame speed actually is. Change the dictionary and the reference changes with it.

The measurement is a mass budget, not a front position

The equation being solved is

    d(rho b)/dt + div(rho U b) = div(alphaEff grad b) - rho_u Su Xi |grad b|

Integrate it over the whole duct. The diffusive term contributes only its boundary flux, which is zero because b is zero-gradient on both patches. The gradient term integrates to the range of b across the duct, which is exactly 1 for as long as the flame is clear of both ends. What is left has nothing approximate in it:

    d/dt INT(rho b dV) = -(b carried out of the outlet) - rho_u Su Xi A

    with   rho_u = p W_u / (RR Tu)   from the perfectGas the case declares

The unburnt mass in the duct falls at exactly ρu·Su per unit area, whatever the front looks like. That is the point: the smear the front is drawn through cancels out of the integral entirely. The two guards that make the integrated form apply are measured rather than assumed — b at the closed end is exactly 1, so the range really is the full 1, and b at the outlet reaches 6.02 × 10⁻³, which is what the outlet term corrects for and is 0.249 % of the budget.

Two further quantities come out of the same case rather than out of a table. The adiabatic flame temperature solves h of the burnt products at Tb equal to h of the reactants at Tu — both absolute enthalpies, because the case says so — by bisection on the polynomials in the staged thermo file, giving 2387.765 K. The expansion ratio is then σ = (Wu/Wb)(Tb/Tu) = 8.4735. Nothing is quoted: swap the coefficients and both move.

Result

Measured against the four references, on the 480-cell duct
QuantityReferenceMeasuredDifferenceIndependent of the run?
Adiabatic flame temperature (K)2387.7654512379.7828−0.334 %Yes — janaf data
Expansion ratio ρᵤ/ρ_b8.47350108.4468945−0.314 %Yes — janaf data
Unburnt density (kg/m³)1.22489121.2253365+0.036 %Yes — pW/(RT)
Flame speed from the mass budget (m/s)0.4340.4314756−0.582 %No — the case’s own input
The reference column for the first three is derived from the case’s thermo before the solver runs; for the fourth it is the Su in the case’s own combustion properties. Measured consumption is 0.5285106 kg/m²/s. Without the outlet correction the budget gives 0.4325498 m/s, −0.334 %.

The frame the budget is written in is measured too. The wall sits on the unburnt side deliberately, because gas between the front and a closed end cannot move, so the budget is in the unburnt gas’s own frame. Mean velocity ahead of the flame is 2.24 × 10⁻³ m/s, 0.52 % of Su. Its peak is 7.14 %, which is the acoustic ripple the ignition step leaves behind; it averages to nothing but it is reported rather than smoothed away.

And the consumption is constant, not merely right on average. Fitted across 45 written states from 0.002 s to 0.09 s, the largest departure from the straight line is 4.90 × 10⁻⁴ of the total change. The regress variable stays inside its bounds throughout: b spans [8.94 × 10⁻⁷⁵, 1], and the solver’s own flame speed field is exactly the declared 0.434 everywhere, with Xi exactly 1.

The mass budget on three meshes, against the front position on the same runs
CellsCell size (m)Budget Su (m/s)vs declaredFront-position Su (m/s)vs declaredFront width (m)
2405.0 × 10⁻⁴0.4318089−0.505 %0.3632289−16.31 %0.0312
4802.5 × 10⁻⁴0.4314756−0.582 %0.3782334−12.85 %0.0243
9601.25 × 10⁻⁴0.4311590−0.655 %0.3874543−10.72 %0.0199
The time step is refined with the mesh so every level runs at the same Courant number. Front position is the b = 0.5 crossing; front width is the measured width of the b profile. Both columns are in the results file; only the budget is judged.

Why the front position was rejected as the measurement

The obvious way to measure a flame speed is to track where the flame is. That method reads 10.7 % to 16.3 % low here, and the reason is not the solver.

The laminar flame this model describes is αeff/(ρ Su) = 3.5 × 10⁻⁵ m thick. The cell on the 480-cell duct is 2.5 × 10⁻⁴ m — seven times that — and the b profile the run actually produces is 97 cells wide, 0.0243 m. So the b = 0.5 crossing is a position tracked through a numerical smear roughly two hundred times wider than the physical flame. A duct long enough for a flame to travel through would need of the order of a hundred thousand cells before the front was resolved, and no run this benchmark can afford is anywhere near that.

The behaviour under refinement says the same thing: the front-position speed improves from −16.31 % to −10.72 % over a factor of four in mesh, converging steadily towards something, but not towards 0.434 at any rate that would reach it. The mass budget over the same three meshes stays inside 0.7 % and moves by 0.15 percentage points across the whole sweep. That is the whole argument for measuring the integral and reporting the position beside it.

Thickening the flame so that it would be resolved was tried, because it is the obvious thing to try, and it is worse rather than better. At a hundred times the viscosity the front comes down to 33 cells and the flame quenches: the late maximum temperature falls to 1614.3 K, 32.4 % below the adiabatic value, the expansion ratio collapses to 5.641, and there is no b = 0.5 crossing left at all. That run is kept as a fixture rather than discarded.

What this page does not establish

  • The laminar flame speed itself is unverified. Stated once more because it is the number a reader will remember: 0.434 m/s is an input to this case, not a result, and this page contains no evidence about whether it is right for propane at these conditions.
  • Two of the three solvers in this family are not run. PDRFoam and XiEngineFoam share the b equation, but PDRFoam needs an obstacle field this build has no model for and XiEngineFoam needs a moving piston mesh. What is verified is XiFoam.
  • The turbulence model is switched off rather than absent. Asking for simulationType laminar aborts XiFoam on the first time step with exit code 3 and no output at all, so this case runs a RAS model with turbulence off and k at the model’s own floor. That the two are the same physics is measured rather than asserted: the laminar case run with the floating-point trap disabled gives 0.431475599 m/s against 0.431475599 — ten significant figures. Leaving the switch off but k as staged instead builds the model with a frozen eddy viscosity a hundred times the molecular value and moves the budget to +0.323 %; leaving the turbulence model running entirely gives −0.558 %. Both are recorded as fixtures.
  • The case as the product stages it does not run. The staged case is a 0.1 m cube at 40 × 40 × 40 with XiModel transport, and it dies on the second time step: the Xi solve returns nan, and with the default floating-point trap the process aborts with exit code 3 having printed nothing — no fatal error, no stack trace, no last line. Changing one word to XiModel fixed, using the coefficients the product already writes two lines further down, runs the identical case to completion. That is the control which says it is the Xi model and not the mesh, the thermo or the schemes; it was isolated four ways. On this duct the transport model runs perfectly well, which is why the fixture recording the failure is the staged cube itself.

Repeat this yourself

Every case here is set up from the worked examples in the product, with no hand-editing of solver files — so you can run it, and get the same numbers. The free tier runs real cases up to 250,000 cells of fluids, or 100,000 nodes of solid, with no account needed to download and no time limit.

All validation cases · Written by the team building SHD Sim.