The algorithm being used right now, computes for every cell, sum the pressure of all adjacent cells and itself, divided by the number of applicable cells (obstructions are excluded). Cells that have previously been computed for, are noted, and ignored, to prevent overlap. It's all just being averaged.

That all works reasonable enough, eh? But here's the problem, as you might notice from the second image after I explain it:

Say you have a source cell with a value of 256 flowing into an empty hallway. The next one becomes 128. The next, 64, 32, 16, and so on. My math might be off, but you should notice that periodically averaging the pressures each step doesn't "flow" down hallways very well. It stagnants.

I'll end up with a large room with 124, and then a hallway with 110, 95, 80, 66, 52, 39, ... 25. Even after say, 100 iterations, those far away tiles are never going to change much.

-----sig:“Programs should be written for people to read, and only incidentally for machines to execute.” - Structure and Interpretation of Computer Programs"Political Correctness is fascism disguised as manners" --George Carlin

Averaging the values of the cells to get the new value is just a special case of diffusion, which obeys Fick's law. In particular, it is straightforward to show that the 'wavefront' spreads as a square root of iteration.

That said, without sinks your environment should eventually get filled to the value of the source. It happens in my example program: