For water simulation, look towards learning compute shaders.
Eulerian (grid-based) simulation is one of the classic examples.