Since I had already implemented a GPU volume renderer during my medical physics studies, I went ahead later (in 2015) to build myself a fluid simulator. The goal was to get a working knowledge of the famous Navier-Stokes equations and how to solve them. This project only ever got as far as simulating smoke, however. The video below shows the simplest case of smoke emitted into an open volume.
The approach is laid out in the SIGGRAPH 2007 Course Notes on Fluid Animation. In brief, this is a Semi-Lagrangian advection scheme, where my demo runs on a 128^3 grid. The single-threaded CPU implementation was very slow, the next step would be to parallelize and off-load computations onto the GPU.