A ~100 kW tractor pulls a 3-bottom mouldboard plough over a 50 × 27.5 m field. Choose depth, speed, ballast, tyre pressure and soil: the model gives draft force, wheel slip, fuel per hectare, field capacity and the stress your tyres push into the subsoil.
Holds every other setting at its current value, solves the model at each step and marks the lowest fuel per hectare and the lowest subsoil stress ratio.
Compares the code with hand-computed values, a direct numerical integration of Boussinesq's point-load solution, a force-balance residual and the painted field area.
The science
Draft force. The pull needed to drag a mouldboard plough follows the ASABE D497-type equation, with soil-class coefficients A, B, C for fine, medium and coarse soils:
D = (A + B·S + C·S²) · W · T · fm [N]
S = actual ground speed (km/h), W = working width (m; 3 bottoms × 0.40 m = 1.2 m), T = depth (cm). fm is my own simplification: the soil is easiest to work near its optimum moisture and draft rises when it is dry and hard or wet and sticky: fm = 1 + k·((θ−θopt)/θopt)² (k = 0.9 dry side, 1.2 wet side). The speed term is why ploughing twice as fast costs much more than twice the power.
Weight transfer. A drawbar pull D at hitch height h tilts load onto the rear axle: Rrear·L = ΣWi(L − xi) + D·h. Front weights (ahead of the front axle) load the front axle - needed for steering and 4WD traction - but slightly unload the rear axle, so they do little for a 2WD tractor; rear wheel weights load the rear axle directly; if the front axle goes below 3 % of the weight the tractor is unsafe.
Traction (Wismer–Luth). Wheel numeric Cn = CI·b·d / Wwheel (cone index CI, tyre width b, diameter d):
GTR = 0.75·(1 − e−0.3·Cn·s) MR = 1.2/Cn + 0.04 NTR = GTR − MR
Slip s = 1 − vactual/vtheoretical. The solver finds the slip at which the net pull of the driven wheels equals the draft (minus the rolling resistance of undriven wheels). Cone index falls as moisture rises; wetter, softer soil means higher Cn loss and more slip. Low tyre pressure enlarges the footprint (I scale b·d by (1.2 bar/p)0.3, an empirical guess).
Power, fuel and capacity. Axle power = G·vth (gross traction × theoretical speed); engine power = axle power/0.88 + 4 kW; if that exceeds 100 kW the engine lugs and ground speed is cut. Fuel (L/h) = Peng · sfc(x) with a part-load map sfc = 0.255 + 0.24(1−x)² L/kWh. Field capacity C = W·v/10 ha/h, multiplied by a field efficiency of 0.85; fuel per hectare = L/h ÷ Ceff. The sim also measures fuel and area as the tractor really drives (including headland turns) and shows both.
Compaction. Contact pressure pc ≈ inflation + 20 kPa (carcass). Contact area A = Wwheel/pc; stress under a uniform circular load (Boussinesq, on the axis):
σz = pc·[1 − (1 + (a/z)²)−3/2], a = √(A/π)
The ratio σz(0.5 m) / σpc compares it with the subsoil precompression stress (soil-class values, falling with moisture at 5 % per % water). Above 1.0 the tyre pressure exceeds what the subsoil can carry elastically, so permanent compaction is likely; the dark wheel tracks on the field show it. Heavier ballast raises wheel load (bigger a, deeper stress) even though it cuts slip: that is the trade-off.
Honest simplifications: steady-state at each operating point (no engine or tyre dynamics); one rear and one front axle; soil classes use rounded published-style coefficients and my own moisture factors, so numbers are typical, not a calibration for any real field; Boussinesq assumes an elastic half-space and ignores the interaction of four wheels, plough suction and soil strength changes with depth; no skid-steer, no slope. Educational use, not agronomic advice. The tractor is a generic design and is not affiliated with any manufacturer.
Baked 3D scene. Tractor, plough, barn and tyre/soil textures with baked normal maps and ambient occlusion come from Blender 5.2; the terrain, hedgerows, trees and a lightmap come from Unity 6 (Progressive Lightmapper); Three.js r160 runs the live simulation.