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; } }