Ejemplo n.º 1
0
        private static void Progress_ms2(MultiStepState state, double dt)
        {
            var N = state.N;

            if (!state.memory.Keys.Contains("prev_acc"))
            {
                RungeKuttaIntegrator.Progress_rk2(new LeapFrogState(state), dt);
                state.memory["prev_acc"] = (Vector3[])
                                           state.EulerState_ComputeAccelerationVectorDirect();
            }
            else
            {
                var       prev_acc = (Vector3[])state.memory["prev_acc"];
                Vector3[] old_acc  = state.EulerState_ComputeAccelerationVectorDirect();

                var jdt = new Vector3[N];
                Parallel.For(0, N, i =>
                             //for (int i = 0; i < N; i++)
                {
                    jdt[i]      = old_acc[i] - prev_acc[i];
                    state.r[i] += state.v[i] * dt + old_acc[i] * 0.5 * dt * dt;
                    state.v[i] += old_acc[i] * dt + jdt[i] * 0.5 * dt;
                });
                state.memory["prev_acc"] = old_acc;

                state.currentTime += dt;
            }
        }