With the help from OpenGL it is possible to simulate particle systems on the GPU. I'm using the method of rendering to 2D textures on the gpu which holds the attributes accelerations, velocities and positions. Then I can sample from the textures to "render" the next time step and to three more textures and solving an ODE to get the particles positions depending on the forces applied to them. Then these textures are swapped and the process repeats (the process is called ping ponging). This requires one shader program for each attribute (acceleration, velocity and position) and one shader program to actually render the particles.
This is an individual project, partly made for the course "TNM084 - Procedural Methods for Images" at Linköping University. I implemented curl noise to control the movement of the particles and get the flowing motions often associated with fire or smoke or advection through fluids.
Below is a video showing the result of the project simulating 200.000 particles. The report I wrote to the project can be found here.
Curl Noise demo.
Here the particles are simulated using gravitational forces between each particle. This is a O(n^2) time complexity algotithm and not optimized.
N-body gravity simulation.