Example #1
0
        /// <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();
        }