private void Progress_ms4pc(MultiStepState state, double dt) { if (!state.memory.ContainsKey("ap3")) { state.memory["ap3"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_rk4(state, dt); } else if (!state.memory.ContainsKey("ap2")) { state.memory["ap2"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_rk4(state, dt); } else if (!state.memory.ContainsKey("ap1")) { state.memory["ap1"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_rk4(state, dt); } else { var N = state.N; var ap0 = state.EulerState_ComputeAccelerationVectorDirect(); Vector3[] ap1 = (Vector3[])state.memory["ap1"]; Vector3[] ap2 = (Vector3[])state.memory["ap2"]; Vector3[] ap3 = (Vector3[])state.memory["ap3"]; var jdt = new Vector3[N]; var sdt2 = new Vector3[N]; var cdt3 = new Vector3[N]; Parallel.For(0, N, i => //for (int i = 0; i < N; i++) { jdt[i] = ap0[i] * (11.0 / 6.0) - ap1[i] * 3.0 + ap2[i] * 1.5 - ap3[i] / 3.0; sdt2[i] = ap0[i] * 2.0 - ap1[i] * 5.0 + ap2[i] * 4.0 - ap3[i]; cdt3[i] = ap0[i] - ap1[i] * 3.0 + ap2[i] * 3.0 - ap3[i]; state.r[i] += state.v[i] * dt + (ap0[i] / 2.0 + jdt[i] / 6.0 + sdt2[i] / 24.0) * dt * dt; // we only need the predicted //state.v[i] += ap0[i] * dt + (jdt[i] / 2.0 + sdt2[i] / 6.0 + cdt3[i] / 24.0) * dt; }); state.memory["ap3"] = ap3 = ap2; state.memory["ap2"] = ap2 = ap1; state.memory["ap1"] = ap1 = ap0; ap0 = state.EulerState_ComputeAccelerationVectorDirect(); Parallel.For(0, N, i => //for (int i = 0; i < N; i++) { jdt[i] = ap0[i] * (11.0 / 6.0) - ap1[i] * 3.0 + ap2[i] * 1.5 - ap3[i] / 3.0; sdt2[i] = ap0[i] * 2.0 - ap1[i] * 5.0 + ap2[i] * 4.0 - ap3[i]; cdt3[i] = ap0[i] - ap1[i] * 3.0 + ap2[i] * 3.0 - ap3[i]; state.r[i] += state.v[i] * dt + (ap0[i] / 2.0 + jdt[i] / 6.0 + sdt2[i] / 24.0) * dt * dt; state.v[i] += ap0[i] * dt + (jdt[i] / 2.0 + sdt2[i] / 6.0 + cdt3[i] / 24.0) * dt; }); state.currentTime += dt; } }
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; } }
private void Progress_ms8(MultiStepState state, double dt) { if (!state.memory.ContainsKey("ap7")) { state.memory["ap7"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo8(state, dt); } else if (!state.memory.ContainsKey("ap6")) { state.memory["ap6"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo8(state, dt); } else if (!state.memory.ContainsKey("ap5")) { state.memory["ap5"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo8(state, dt); } else if (!state.memory.ContainsKey("ap4")) { state.memory["ap4"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo8(state, dt); } else if (!state.memory.ContainsKey("ap3")) { state.memory["ap3"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo8(state, dt); } else if (!state.memory.ContainsKey("ap2")) { state.memory["ap2"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo8(state, dt); } else if (!state.memory.ContainsKey("ap1")) { state.memory["ap1"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo8(state, dt); } else { var N = state.N; var ap0 = state.EulerState_ComputeAccelerationVectorDirect(); Vector3[] ap1 = (Vector3[])state.memory["ap1"]; Vector3[] ap2 = (Vector3[])state.memory["ap2"]; Vector3[] ap3 = (Vector3[])state.memory["ap3"]; Vector3[] ap4 = (Vector3[])state.memory["ap4"]; Vector3[] ap5 = (Vector3[])state.memory["ap5"]; Vector3[] ap6 = (Vector3[])state.memory["ap6"]; Vector3[] ap7 = (Vector3[])state.memory["ap7"]; var jdt = new Vector3[N]; var sdt2 = new Vector3[N]; var cdt3 = new Vector3[N]; var pdt4 = new Vector3[N]; var xdt5 = new Vector3[N]; var ydt6 = new Vector3[N]; var zdt7 = new Vector3[N]; Parallel.For(0, N, i => //for (int i = 0; i < N; i++) { jdt[i] = (ap0[i] * 1089 - ap1[i] * 2940 + ap2[i] * 4410 - ap3[i] * 4900 + ap4[i] * 3675 - ap5[i] * 1764 + ap6[i] * 490 - ap7[i] * 60) / 420; sdt2[i] = (ap0[i] * 938 - ap1[i] * 4014 + ap2[i] * 7911 - ap3[i] * 9490 + ap4[i] * 7380 - ap5[i] * 3618 + ap6[i] * 1019 - ap7[i] * 126) / 180; cdt3[i] = (ap0[i] * 967 - ap1[i] * 5104 + ap2[i] * 11787 - ap3[i] * 15560 + ap4[i] * 12725 - ap5[i] * 6432 + ap6[i] * 1849 - ap7[i] * 232) / 120; pdt4[i] = (ap0[i] * 56 - ap1[i] * 333 + ap2[i] * 852 - ap3[i] * 1219 + ap4[i] * 1056 - ap5[i] * 555 + ap6[i] * 164 - ap7[i] * 21) / 6; xdt5[i] = (ap0[i] * 46 - ap1[i] * 295 + ap2[i] * 810 - ap3[i] * 1235 + ap4[i] * 1130 - ap5[i] * 621 + ap6[i] * 190 - ap7[i] * 25) / 6; ydt6[i] = ap0[i] * 4 - ap1[i] * 27 + ap2[i] * 78 - ap3[i] * 125 + ap4[i] * 120 - ap5[i] * 69 + ap6[i] * 22 - ap7[i] * 3; zdt7[i] = ap0[i] - ap1[i] * 7 + ap2[i] * 21 - ap3[i] * 35 + ap4[i] * 35 - ap5[i] * 21 + ap6[i] * 7 - ap7[i]; state.r[i] += (state.v[i] + (ap0[i] + (jdt[i] + (sdt2[i] + (cdt3[i] + (pdt4[i] + (xdt5[i] + ydt6[i] / 8) / 7) / 6) / 5) / 4) / 3) * dt / 2) * dt; state.v[i] += (ap0[i] + (jdt[i] + (sdt2[i] + (cdt3[i] + (pdt4[i] + (xdt5[i] + (ydt6[i] + zdt7[i] / 8) / 7) / 6) / 5) / 4) / 3) / 2) * dt; }); state.memory["ap7"] = ap6; state.memory["ap6"] = ap5; state.memory["ap5"] = ap4; state.memory["ap4"] = ap3; state.memory["ap3"] = ap2; state.memory["ap2"] = ap1; state.memory["ap1"] = ap0; state.currentTime += dt; } }
private void Progress_ms6(MultiStepState state, double dt) { if (!state.memory.ContainsKey("ap5")) { state.memory["ap5"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo6(state, dt); } else if (!state.memory.ContainsKey("ap4")) { state.memory["ap4"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo6(state, dt); } else if (!state.memory.ContainsKey("ap3")) { state.memory["ap3"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo6(state, dt); } else if (!state.memory.ContainsKey("ap2")) { state.memory["ap2"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo6(state, dt); } else if (!state.memory.ContainsKey("ap1")) { state.memory["ap1"] = (Vector3[]) state.EulerState_ComputeAccelerationVectorDirect(); RungeKuttaIntegrator.Progress_yo6(state, dt); } else { var N = state.N; var ap0 = state.EulerState_ComputeAccelerationVectorDirect(); Vector3[] ap1 = (Vector3[])state.memory["ap1"]; Vector3[] ap2 = (Vector3[])state.memory["ap2"]; Vector3[] ap3 = (Vector3[])state.memory["ap3"]; Vector3[] ap4 = (Vector3[])state.memory["ap4"]; Vector3[] ap5 = (Vector3[])state.memory["ap5"]; var jdt = new Vector3[N]; var sdt2 = new Vector3[N]; var cdt3 = new Vector3[N]; var pdt4 = new Vector3[N]; var xdt5 = new Vector3[N]; Parallel.For(0, N, i => //for (int i = 0; i < N; i++) { jdt[i] = (ap0[i] * 137 - ap1[i] * 300 + ap2[i] * 300 - ap3[i] * 200 + ap4[i] * 75 - ap5[i] * 12) / 60; sdt2[i] = (ap0[i] * 45 - ap1[i] * 154 + ap2[i] * 214 - ap3[i] * 156 + ap4[i] * 61 - ap5[i] * 10) / 12; cdt3[i] = (ap0[i] * 17 - ap1[i] * 71 + ap2[i] * 118 - ap3[i] * 98 + ap4[i] * 41 - ap5[i] * 7) / 4; pdt4[i] = ap0[i] * 3 - ap1[i] * 14 + ap2[i] * 26 - ap3[i] * 24 + ap4[i] * 11 - ap5[i] * 2; xdt5[i] = ap0[i] - ap1[i] * 5 + ap2[i] * 10 - ap3[i] * 10 + ap4[i] * 5 - ap5[i]; state.r[i] += (state.v[i] + (ap0[i] + (jdt[i] + (sdt2[i] + (cdt3[i] + pdt4[i] / 6) / 5) / 4) / 3) * dt / 2) * dt; state.v[i] += (ap0[i] + (jdt[i] + (sdt2[i] + (cdt3[i] + (pdt4[i] + xdt5[i] / 6) / 5) / 4) / 3) / 2) * dt; }); state.memory["ap5"] = ap4; state.memory["ap4"] = ap3; state.memory["ap3"] = ap2; state.memory["ap2"] = ap1; state.memory["ap1"] = ap0; state.currentTime += dt; } }