using System; using System.Collections.Generic; using System.Text; using RungeKutta.Integrators; namespace RungeKutta.SimStep { class Verlet : SimStepper { public State Integrate(State oldState, float timeStep, ODEs.ODE ode) { return Integrate(oldState, timeStep, ode.EvaluateForceAtState(oldState)); } public State Integrate(State oldState, float timeStep, float acceleration) { float oldPos = oldState.position; if (oldState.prevPos == float.PositiveInfinity) { State copy = oldState; oldState = new SUVAT().Integrate(oldState, timeStep, acceleration); oldState.prevPos = copy.position; oldState.prevVel = copy.velocity; oldState.prevAccel = copy.acceleration; oldState.acceleration = acceleration; } else { //warm start oldState.prevVel = oldState.velocity; oldState.prevAccel = oldState.acceleration; oldState.acceleration = acceleration; oldState.position = VerletStep.Integrate(oldState.position, oldState.prevPos, timeStep, acceleration); oldState.velocity = Derivator.MeanValueTheoremStep.Derivate(oldState.prevPos, -timeStep, oldState.position, timeStep); oldState.prevPos = oldPos; } return oldState; } public override string ToString() { return "Verlet"; } public int ForceEvaluations { get { return 1; } } } }