/// <inheritdoc /> protected override void Calculate(ReadOnlyArrayView <Body> bodies, ReadOnlyArrayView <int> indices, ArrayView <Vector3d> deltas) { if (_grid == null) { _grid = new HashGrid3d <Vector3d>(indices.Count); } // update grid _grid.Scale = Radius * _radiusToGridScale; // insert body positions for (int i = 0; i < indices.Count; i++) { var p = bodies[indices[i]].Position.Current; _grid.Insert(p, p); } // search from each body position if (_parallel) { ForEach(Partitioner.Create(0, indices.Count), range => { var i = range.Item1; var n = range.Item2 - i; CalculateImpl(bodies, indices.Subview(i, n), deltas.Subview(i, n)); }); } else { CalculateImpl(bodies, indices, deltas); } _grid.Clear(); }