Another option would be to consider a mass of water to be a single object rather than a mass of distinct squares. This has the distinct advantage that it would cut down on the general calculation load of working with water. Each square would not need to have its flow determined each clock, rather only when the boundary of the water object is changed will any water calculations be needed. In this case the water expands into a void left by removed material at a rate determined by the height of the body of water and the cross sectional area of the void.
such a body of water could have 3 effective zones. The surface layer, from where water is drawn during flow. The main body that is a homogenous and non-moving volume below the surface. And the flow area where volume is added to the water object.
When the surface zone drains all its volume it vanishes and a new full surface zone is designated on the layer beneath it.
When a flow zone reaches a depth of 7 units of water in a given tile, it is absorbed by the body of the water.
The rate of water flow is determined by the z-level difference between the flow boundaries and each boundary produces adjacent flow. As water moves into the flow areas, these flow areas also flow int adjacent areas creating sloping effect. and allow dwarves to move/swim out of the area more so than filling with water.