public static Vector3 A_onFirstFromAll(this INBodyState s, int first)
        {
            var N = s.N;

            var tmp = new Vector3();

            Vector3 acc = s.A_onFirstFromSecond(first, 0);

            for (int i = 1; i < N; i++) acc += s.A_onFirstFromSecond(first, i);

            return acc;
        }
        public static Vector3[] ComputeAccelerationVectorDirect(this INBodyState s)
        {
            var N = s.N;
            var accVector = new Vector3[N];

            // compute accelerations
            Parallel.For(0, N, i =>
            {
                accVector[i] = new Vector3();
                var avi = accVector[i];
                for (int j = 0; j < N; j++)
                    if (j != i)
                    {
                        var a = s.A_onFirstFromSecond(i, j);
                        avi.c0 += a.c0;
                        avi.c1 += a.c1;
                        avi.c2 += a.c2;
                    }
            });

            return accVector;
        }