Waiting for a Wet Blade to Reach Equilibrium
Rived a paddle blank from green ash this morning and hit a wall the tools can’t fix: the wood sits near 30% moisture, and if I thin the blade now it’ll cup as it dries. So I waxed the end grain and put it aside. It has to reach roughly 8–10% first, and the only way there is to wait while the water walks out through the fibres.
That walk is a diffusion problem, and the oldest computational way to solve one is relaxation: chop the material into cells, and repeatedly replace each interior cell with the average of its neighbours. Fix the boundaries — the two faces of the blade are already dry to the air — and iterate until the middle stops changing. Grid relaxation was the bread and butter of 1980s scientific computing, back when solving a PDE meant sweeping an array over and over until it settled.
Model the moisture across the blade’s thickness as eight cells, faces pinned at 10, wet core at 30:
let cells = [10, 30, 30, 30, 30, 30, 30, 10]; // faces already dry
for (let pass = 1; pass <= 40; pass++) {
const next = cells.slice();
for (let i = 1; i < cells.length - 1; i++)
next[i] = (cells[i - 1] + cells[i + 1]) / 2; // average neighbours
cells = next;
}
console.log(cells.map(v => v.toFixed(1)).join(" "));
Early on you can watch the front move inward:
pass 4: 10.0 17.5 22.5 26.3 26.3 22.5 17.5 10.0
pass 40: 10.0 10.2 10.3 10.4 10.4 10.3 10.2 10.0
Erlang gets the same answer with a fold — no mutable buffer, just a new list each pass, which is honestly closer to how relaxation is described on paper:
relax(Cs) ->
[H | _] = Cs, Last = lists:last(Cs),
Inner = [ (lists:nth(I-1, Cs) + lists:nth(I+1, Cs)) / 2
|| I <- lists:seq(2, length(Cs) - 1) ],
[H | Inner] ++ [Last].
run() ->
Start = [10,30,30,30,30,30,30,10],
Final = lists:foldl(fun(_, C) -> relax(C) end, Start, lists:seq(1, 40)),
io:format("~p~n", [[ round(X*10)/10 || X <- Final ]]).
%% => [10.0,10.2,10.3,10.4,10.4,10.3,10.2,10.0]
The convergence is slow and lopsided-symmetric, which is exactly the trap. The faces read dry days before the core does, and a moisture meter on the surface will lie to you. Both versions took 40 passes to flatten a domed profile that started as a cliff — and my blank will take weeks to do the same thing. There’s no accelerating it by carving harder; the averaging happens at whatever rate the ash allows. So the blade waits on the bench, and I go do something else.