2D variation of the recent "Cascade" series I've been experimenting with. I've combined two different techniques and managed to loop it.
1) Replacement looping. Learned from @bleuje a few years ago, and have used probably hundreds of times since In this case, the loop is ~3 seconds. However, if you time how long it takes a particle to fall, it's more than 2x that time. So each particle ends (after ~3 seconds) at a point where a new identical particle begins. This is the "replacement" that is going on.
2) Particle system. Motion is dictated by forces. In this case, a downward gravity-like force, and the repulsive force of the spheres/circles. Each new particle position is determined by previous position + net forces.
These experiments are the first time I've managed to use replacement looping with particles whose position is determined by their previous position (as opposed to equations that determine a particle position for any time during the loop).
