private void Viscosity(float elapsedSeconds)
{
const float µ = 5f;
const float l = 0.5f;
const int cellRadius = (int)(GridMultiplier * l);
Parallel.For(0, ParticleCount, i =>
{
var ix = (int) (Particles[i].X*GridMultiplier);
var iy = (int) (Particles[i].Y*GridMultiplier);
var neighbors = new List<int>();
for (var dx = Math.Max(-cellRadius, -ix);
dx < Math.Min(cellRadius, _width*GridMultiplier - ix - 1);
++dx)
for (var dy = Math.Max(-cellRadius, -iy);
dy < Math.Min(cellRadius, _height*GridMultiplier - iy - 1);
++dy)
neighbors.AddRange(_grid[ix + dx, iy + dy]);
if (!neighbors.Any())
return;
var avg = neighbors.Select(ii => Velocities[ii]).Aggregate((ll, r) => ll + r);
avg /= neighbors.Count;
_velocityBuffer[i] = Velocities[i] + elapsedSeconds*µ*(avg - Velocities[i]);
});
var tmp = _velocityBuffer;
_velocityBuffer = Velocities;
Velocities = tmp;
}