public static void ProcessDynamics(IDynamic dyn, List <GH_Point> points, List <GH_Vector> vectors, GH_Surface surface) { dyn.Process(points, vectors, surface); if (dyn.Accelerated) { // account for acceleration, if necessary var output = new List <GH_Vector>(); for (int i = 0; i < vectors.Count; i++) { output.Add(new GH_Vector()); } if (dyn.Param.Contains("accelerationVectors")) { var v0 = dyn.Param["accelerationVectors"] as List <GH_Vector>; double drag = 1.0d; if (dyn.Param.Contains("Dg")) { drag = (dyn.Param["Dg"] as GH_Number).Value; } // if vectors have been added (say via new particles) we need to // add the difference in new vectors (unset) if (v0.Count < vectors.Count) { for (int i = vectors.Count - v0.Count; i >= 0; i--) { v0.Add(new GH_Vector(Vector3d.Unset)); } } for (int i = 0; i < vectors.Count; i++) { // if v0 is unset its because we want to reset this accel vector externally if (v0[i].Value == Vector3d.Unset) { output[i] = new GH_Vector(); } else { output[i] = new GH_Vector(v0[i].Value + (vectors[i].Value * drag)); vectors[i].Value = v0[i].Value + ((vectors[i].Value * drag) / 2); } } } dyn.Param["accelerationVectors"] = output; } }