The evidence

Sixty-three checks against things that existed before the code did — and the two largest pieces of work I did on this project, neither of which is in it.

1What a check has to be

A test that compares a program against itself proves the program is consistent, which is not the claim I am making.

So: a derivative against finite differences. A burn rate against its own integral. A cylinder head against a flow bench. A firing order against the casting. A shock tube against its exact solution. And the thesis against a Fourier transform. Nothing in the model was fitted to any of it, which is the only reason agreement means anything.


windsor — inspection
  every number this project quotes, checked against something outside it

                                              measured        expected       

THE LINKAGE
  dV/dtheta against central differences       rel 6.6e-11     < 1.0e-08       ok
  piston acceleration, likewise               rel 3.4e-10     < 1.0e-08       ok
  piston travel at BDC is the stroke          rel 0.0e+00     < 1.0e-12       ok
  V(BDC)/V(TDC) is the compression ratio      rel 1.9e-16     < 1.0e-12       ok
  eight bores of it come to a 302             301.6 ci        301 to 302      ok

THE FIRE
  burn rate integrates to its burn fraction   rel 3.9e-07     < 1.0e-05       ok
  and that fraction is the stated efficiency  rel 0.0e+00     < 1.0e-06       ok
  nothing burns before the spark              so                              ok
  gamma sags from cold charge to flame        1.246           1.2 to 1.28     ok
  sound travels faster in hot exhaust         592.3 m/s       560 to 620      ok
./windsor verify

2The engine, against Ford

modelFord, 1968 302-2V (gross)
peak torque307 lb-ft @ 1985295 lb-ft @ 2400
peak power206 hp @ 4994210 hp @ 4400
./windsor dyno

Within four percent and two, with nothing fitted. The magnitudes are close and the curve is too broad — torque peaks 400 rpm low, power 600 high — which is the intake runner tuning that is still missing, and which I will come back to at the bottom of this page.

It was ten percent optimistic with the power peak a thousand rpm high until the carburettor’s venturis went in. A two-barrel engine breathes through a hole that cannot be opened, and that is most of why the 2V made its power at 4400 where the 4V made more at 4800. I had been modelling a throttle. The throttle was never the limit.

3The cylinder head, against a flow bench

Curtain area, a discharge coefficient, a throat cap. How fast that coefficient sags past its peak is the only number in the port model fitted to anything at all, and this is the thing it is fitted to.

liftmodelpublished, stock C8OE-F
0.400 in153.5 cfm~150 cfm
0.426 in — the cam’s peak149.9 cfm
./windsor verify

The head is already past its best at the lift the camshaft actually reaches. That is not a defect in the model. It is what a stock 302 head does, and it is why peak effective area lands exactly where Ford put the lobe.

4The indicator card

Watt’s diagram, wide open and throttled, drawn to the same scale so the two can be compared honestly. Pressure is logarithmic here, so the area enclosed is not the work — the work is printed underneath it.

  THROTTLE CLOSED
   59.4 |                                                            
   42.5 |                                                            
   30.4 |                                                            
   21.7 |                                                            
   15.5 |                                                            
   11.1 |                                                            
    8.0 |.##                                                         
    5.7 |. ###                                                       
    4.1 | .  #####                                                   
    2.9 | ...    #####                                               
    2.1 |   ..       ######                                          
    1.5 |   ................................                         
    1.1 |....  .....             ##########......................... 
    0.8 |.         ......                 ############             . 
    0.5 |..             .......                      ############### 
    0.4 | ..                  ........                               
    0.3 |  ..                        ...........                     
    0.2 |   ........................................................ 
    bar +------------------------------------------------------------
         TDC                        volume                        BDC

         gross  0.97 bar   pumping -0.93 bar   net  0.03 bar   peak 7.3 bar

  # power   . exhaust   . intake   . compression

  Throttled, the engine spends 96% of everything it makes on
  breathing. Wide open it spends 1%. That is the whole cost of
  controlling a petrol engine by making it difficult to breathe, and it
  is why a diesel, which throttles on fuel alone, is more efficient at
  part load and barely more efficient at full.
./windsor card

Ninety-six percent of everything it makes, spent on suffocating itself. The throttle is the most wasteful control mechanism nobody has replaced, and this is the number that says so.

5The fuel, which is what stops the engine

Livengood–Wu over Douaud–Eyzat: the end gas spends dt/τ of its patience each instant and goes off when the account reaches one.

0tigndtτ(p,T)=1
τ is the ignition delay at the pressure and temperature of that instant, so the end gas spends a little of its patience at every one of them.

It reports an index and not a verdict — the threshold belongs to the CFR engine Douaud and Eyzat fitted the delay on, and a value of 1 means autoignition in that chamber, not in a Ford wedge. Dividing by five to make the stock engine read 1.0 would be fitting the model to flatter itself, so the constant stays as published and the number is reported raw. What survives the recalibration is every comparison, and the comparisons are what compression ratio and advance are actually chosen by.

WHAT STOPS THE ENGINE
  knock is an index and not a verdict; these are all comparisons
  worse at low rpm: more time to cook         so                              ok
  worse with sixteen more degrees of advance  so                              ok
  worse on 87 octane than on 94               so                              ok
  worse at 11.5:1 than at 9.5:1               so                              ok
  quieter on a rich mixture than on stoich    so                              ok
  so compression ratio, advance and octane are one decision, not three
./windsor verify

Which makes 9.5:1, 34° of advance and whatever was in the tank in 1968 one decision instead of three.

6The thesis, against a Fourier transform

Half-order energy is the signature of a train that repeats every two revolutions instead of one, which is exactly what a lopsided bank does and an even one does not. I stated the thesis before I wrote the transform. The transform did not care, and agreed.

THE THESIS
  half-order energy is the signature of a pulse train that repeats
  every two revolutions instead of one. one bank, at idle:
  cross-plane bank, half-order share          0.6983          at least 0.3    ok
  flat-plane bank, half-order share           0.0009409       0 to 0.1        ok
  the cross-plane bank carries far more of it 742x                            ok
  that ratio is the entire project, and it came out of four throw angles

  63 checks, all of them true.
./windsor verify

Ninety-nine percent of the energy sits below 90 Hz, where the burble lives, and there is nothing measurable at all above 1.4 kHz.

7The solver I built, measured and took out

The exhaust is two delay lines per pipe, which is exact for a linear wave and wrong for a blowdown, so its source is clamped at Mach 1. Rather than leave that as an apology in a comment, I wrote the solver that would have fixed it: a second-order MUSCL-Hancock finite-volume Euler solver with an HLL flux, verified against Sod’s shock tube to one part in 10⁵.

Wired in place of the delay lines it worked. No clamp anywhere, pipe pressures physically correct, and header length finally became worth 14% of torque with a peak at 1.2 m — where the old builder’s rule predicts 1.10 m. It agreed with sixty years of exhaust shops.

Then I took it out. It cost seven times the runtime, and it collapsed the one measurement this project exists to make: the ratio between the two crankshafts went from 118× to 1×. An engine that cannot tell the two cranks apart is of no use to me, however good its shocks are.

A delay line has no numerical dissipation. It is the exact solution to the linear problem, not an approximation to it, while any finite-volume scheme is diffusive everywhere. For a problem that is mostly linear propagation with occasional violence, the cruder-looking model is the more faithful one.

What survives is a measurement. riemann.hpp is still in the tree, still verified, and its job now is to say precisely what the shipped model cannot do.

WHAT THE PIPES ARE NOT
  exhaust.hpp models a pipe as two delay lines, which is exact for a
  LINEAR wave and clamps its source at Mach 1 because a blowdown is not
  one. riemann.hpp is the nonlinear solver that says what that costs.
  shock tube, against the exact solution      rel 1.0e-05     < 2.0e-03       ok
  and it invented no mass doing it            rel 1.5e-14     < 1.0e-12       ok
  and destroyed no energy either              rel 7.7e-15     < 1.0e-12       ok
  the blowdown front's speed down the pipe    1409 m/s        580 to 2500     ok
  which is FASTER than sound ahead of it      137% over                       ok
  sound in 900 K exhaust is 586 m/s, and a linear wave travels at exactly
  that. this one does not, because it is a shock: its crest is hotter than
  the gas ahead and is carried forward by the flow behind, so it outruns
  its own front. it is why the crack of an exhaust is sharper at the pipe
  than it was at the valve, and the engine here cannot reproduce it.
./windsor verify

8The runners, three times

Intake runner tuning I built three times and shipped none. As a waveguide it tuned correctly and put peak torque within 90 rpm of Ford’s, and could not be held below 2000 rpm at any damping. As a Helmholtz resonator it was perfectly stable and moved the torque peak the wrong way. As eight runners sharing one junction it found two things worth more than the feature.

The junction was not the blocker. Sharing redistributes energy between runners; it does not dissipate any. Eight low-loss pipes passing a wave around still have it afterwards.

Length mattered more. At 0.30 m the ram gain came out at 34% where a stock log manifold is worth a few percent — and that is what made the engine unholdable, for a reason I had not expected to learn from a program I wrote myself.

A torque-controlled brake sitting on a rising torque curve is an unstable equilibrium. Speed up a little, make more torque, speed up more. Ram tuning is precisely the thing that makes a torque curve locally rise, so the dyno slid into the resonance instead of holding short of it.

That is real engine-and-dynamometer physics and not a defect in either, which is why modern cells are speed-controlled. The dyno was not broken. It was doing exactly what a dyno does, at me.

Shortened to 0.18 m the gain falls to 4% and the curve comes out smooth — and it still could not be held between 1000 and 1500 rpm. Not at any controller gain from 0.6 to 12 N·m per rpm, not with a fresh engine per point, not with the load lagged. I do not know why. It is written at the bottom of induction.hpp as the next thing to find out, because it is more useful than the explanation I would have had to invent in order not to write it down.

9What a failing check means

Several of the sixty-three belong to this engine — the flow bench, the cam card, the firing orders. Build a different one and they will fail honestly. That is the check working, not breaking. How to build a different one →