static public double Etot(this INBodyState state)
        {
            double ekin = Ekin(state);
            double epot = Epot(state);

            return(ekin + epot);
        }
        static public double Epot(this INBodyState state)
        {
            double epot = 0.0;

            var N    = state.N;
            var eps2 = state.eps * state.eps;

            Parallel.For(0, N, i =>
                         // for (int i = 0; i < N; i++)
            {
                var RDiff = new Vector3();
                var ri    = state.r[i];
                var mi    = state.m[i];
                for (int j = 0; j < N; j++)
                {
                    if (j != i)
                    {
                        var rj = state.r[j];
                        //var RDiff = (state.r[j] - ri);
                        RDiff.c0 = rj.c0 - ri.c0;
                        RDiff.c1 = rj.c1 - ri.c1;
                        RDiff.c2 = rj.c2 - ri.c2;
                        var R2   = RDiff * RDiff;
                        epot    += mi * state.m[j] / Math.Sqrt(R2 + eps2);
                    }
                }
            });

            epot *= -state.G;

            return(epot);
        }
Beispiel #3
0
 private static void CheckComputationOfEpot(INBodyState newState, double epot)
 {
     var revState = new LeapFrogState(newState as LeapFrogState);
     revState.position.Reverse();
     revState.velocity.Reverse();
     revState.mass.Reverse();
     var revEpot = revState.Epot();
     if (!CompareDouble(revEpot, epot))
     {
         Console.Error.WriteLine("Epot = {0}, Epot rev = {1}", epot, revEpot);
     }
 }
Beispiel #4
0
        private static void CheckComputationOfEpot(INBodyState newState, double epot)
        {
            var revState = new LeapFrogState(newState as LeapFrogState);

            revState.position.Reverse();
            revState.velocity.Reverse();
            revState.mass.Reverse();
            var revEpot = revState.Epot();

            if (!CompareDouble(revEpot, epot))
            {
                Console.Error.WriteLine("Epot = {0}, Epot rev = {1}", epot, revEpot);
            }
        }
        static public 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);
        }
        static public double Ekin(this INBodyState state)
        {
            double ekin = 0.0;
            var    N    = state.N;

            Parallel.For(0, N, i =>
                         // for (int i = 0; i < N; i++)
            {
                var v    = state.v[i];
                double m = state.m[i];
                ekin    += m * (v * v);
            });
            ekin *= 0.5;
            return(ekin);
        }
Beispiel #7
0
 public EulerState(INBodyState other)
 {
     currentTime = other.t;
     N           = other.N;
     G           = other.G;
     eps         = other.eps;
     mass        = new List <double>(other.m);
     position    = new List <Vector3>(N);
     velocity    = new List <Vector3>(N);
     for (int i = 0; i < N; i++)
     {
         position.Add(new Vector3(other.r[i]));
         velocity.Add(new Vector3(other.v[i]));
     }
 }
        static public Vector3 A_onFirstFromSecond(this INBodyState s, int first, int second)
        {
            var r1 = s.r[first];
            var r2 = s.r[second];

            var Rdiff = r2 - r1;

            double R2   = Rdiff * Rdiff;
            double R    = Math.Sqrt(R2);
            var    eps  = s.eps;
            double eps2 = eps * eps;

            double factor = s.m[second] * s.G / (R * (R2 + eps * eps));

            Rdiff *= factor;
            return(Rdiff);
        }
 public static void Serialize(this INBodyState s, double?ekin, double?epot, StringBuilder sb)
 {
     sb.AppendLine(s.t.ToString() + " # t");
     sb.AppendLine(s.N.ToString() + " # N");
     sb.AppendLine(s.G.ToString() + " # G");
     sb.AppendLine(s.eps.ToString() + " # eps");
     ekin = ekin ?? s.Ekin();
     epot = epot ?? s.Epot();
     sb.AppendLine(ekin.ToString() + " # Ekin");
     sb.AppendLine(epot.ToString() + " # Epot");
     foreach (var m in s.m)
     {
         sb.AppendLine(m.ToString());
     }
     foreach (var r in s.r)
     {
         sb.AppendLine(r.ToString());
     }
     foreach (var v in s.v)
     {
         sb.AppendLine(v.ToString());
     }
 }
        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);
        }
 public MultiStepState(INBodyState state)
     : base(state)
 {
 }
 public LeapFrogState(INBodyState state)
     : base(state)
 {
     m_timeOfAccelerationCalculated = -1.0;
     m_accelerations = null;
 }
 public EulerState(INBodyState other)
 {
     currentTime = other.t;
     N = other.N;
     G = other.G;
     eps = other.eps;
     mass = new List<double>(other.m);
     position = new List<Vector3>(N);
     velocity = new List<Vector3>(N);
     for (int i = 0; i < N; i++)
     {
         position.Add( new Vector3(other.r[i]) );
         velocity.Add( new Vector3(other.v[i]) );
     }
 }
Beispiel #14
0
 public MultiStepState(INBodyState state)
     : base(state)
 {
 }
Beispiel #15
0
 public LeapFrogState(INBodyState state)
     : base(state)
 {
     m_timeOfAccelerationCalculated = -1.0;
     m_accelerations = null;
 }