public void AddNBody(int bodyNum, NBody nbody, Vector3 position, Vector3 velocity) { if (numBodies > maxBodies) { Debug.LogError("Added more than maximum allocated bodies! max=" + maxBodies); return; } if (bodyNum != numBodies) { Debug.LogError("Body numbers are out of sync integrator=" + numBodies + " GE=" + bodyNum); return; } active[numBodies] = true; // r,m already in GravityEngine vel[numBodies, 0] = velocity.x; vel[numBodies, 1] = velocity.y; vel[numBodies, 2] = velocity.z; // check for engine GEExternalAcceleration ext_accel = nbody.GetComponent <GEExternalAcceleration>(); if (ext_accel != null) { externalAccel[numBodies] = ext_accel; #pragma warning disable 162 // disable unreachable code warning if (GravityEngine.DEBUG) { Debug.Log("Added GEExternalAcceleration engine for " + nbody.gameObject); } #pragma warning restore 162 } // Debug.Log ("add object at r=" + gameObject.transform.position + " v=" + ubody.vel + " size2=" + size2[numBodies] // + " mass=" + ubody.mass); numBodies++; }
public void GrowArrays(int growBy) { double[,] v_copy = new double[maxBodies, GravityState.NDIM]; double[,] a_copy = new double[maxBodies, GravityState.NDIM]; GEExternalAcceleration[] externalAccelerations_copy = new GEExternalAcceleration[maxBodies]; for (int j = 0; j < numBodies; j++) { for (int k = 0; k < GravityState.NDIM; k++) { v_copy[j, k] = v[j, k]; a_copy[j, k] = a[j, k]; } externalAccelerations_copy[j] = externalAccel[j]; } v = new double[maxBodies + growBy, GravityState.NDIM]; a = new double[maxBodies + growBy, GravityState.NDIM]; externalAccel = new GEExternalAcceleration[maxBodies + growBy]; for (int j = 0; j < numBodies; j++) { for (int k = 0; k < GravityState.NDIM; k++) { v[j, k] = v_copy[j, k]; } externalAccel[j] = externalAccelerations_copy[j]; } maxBodies += growBy; }
public void AddBody(GameObject gameObject, float physToWorldFactor) { if (numBodies + 1 >= arraySize) { GrowArrays(GROW_ARRAY); } bodies[numBodies] = gameObject; NBody nbody = bodies[numBodies].GetComponent <NBody>(); nbody.engineRef = new GravityEngine.EngineRef(GravityEngine.BodyType.MASSLESS, numBodies); // check for engine GEExternalAcceleration rocket = bodies[numBodies].GetComponent <GEExternalAcceleration>(); if (rocket != null) { externalAccel[numBodies] = rocket; #pragma warning disable 162 // disable unreachable code warning if (GravityEngine.DEBUG) { Debug.Log("Added rocket engine for " + gameObject); } #pragma warning restore 162 } Vector3 physicsPosition = nbody.initialPhysPosition / physToWorldFactor; r[numBodies, 0] = physicsPosition.x; r[numBodies, 1] = physicsPosition.y; r[numBodies, 2] = physicsPosition.z; v[numBodies, 0] = nbody.vel_phys.x; v[numBodies, 1] = nbody.vel_phys.y; v[numBodies, 2] = nbody.vel_phys.z; info[numBodies] = 0; for (int childNum = 0; childNum < nbody.transform.childCount; childNum++) { Trajectory trajectory = nbody.transform.GetChild(childNum).GetComponent <Trajectory>(); if (trajectory != null) { trajectories[numBodies] = trajectory; break; } } #pragma warning disable 162 // disable unreachable code warning if (GravityEngine.DEBUG) { Debug.Log(string.Format("Added {0} at phys=({1} {2} {3})", gameObject.name, r[numBodies, 0], r[numBodies, 1], r[numBodies, 2])); } #pragma warning restore 162 numBodies++; }
private void GrowArrays(int growBy) { double[,] r_copy = new double[arraySize, GravityState.NDIM]; double[,] v_copy = new double[arraySize, GravityState.NDIM]; GameObject[] bodies_copy = new GameObject[arraySize]; byte[] info_copy = new byte[arraySize]; GEExternalAcceleration[] rockets_copy = new GEExternalAcceleration[arraySize]; Trajectory[] traj_copy = new Trajectory[arraySize]; for (int j = 0; j < numBodies; j++) { for (int k = 0; k < GravityState.NDIM; k++) { r_copy[j, k] = r[j, k]; v_copy[j, k] = v[j, k]; } info_copy[j] = info[j]; bodies_copy[j] = bodies[j]; traj_copy[j] = trajectories[j]; rockets_copy[j] = externalAccel[j]; } r = new double[arraySize + growBy, GravityState.NDIM]; v = new double[arraySize + growBy, GravityState.NDIM]; a = new double[arraySize + growBy, GravityState.NDIM]; info = new byte[arraySize + growBy]; bodies = new GameObject[arraySize + growBy]; trajectories = new Trajectory[arraySize + growBy]; externalAccel = new GEExternalAcceleration[arraySize + growBy]; for (int j = 0; j < numBodies; j++) { for (int k = 0; k < GravityState.NDIM; k++) { r[j, k] = r_copy[j, k]; v[j, k] = v_copy[j, k]; } info[j] = info_copy[j]; bodies[j] = bodies_copy[j]; trajectories[j] = traj_copy[j]; externalAccel[j] = rockets_copy[j]; } arraySize += growBy; }
public void GrowArrays(int growBy) { int newSize = maxBodies + growBy; double[,] vel_copy = new double[maxBodies, NDIM]; double[,] acc_copy = new double[maxBodies, NDIM]; double[,] jerk_copy = new double[maxBodies, NDIM]; double[,] old_pos_copy = new double[maxBodies, NDIM]; double[,] old_vel_copy = new double[maxBodies, NDIM]; double[,] old_acc_copy = new double[maxBodies, NDIM]; double[,] old_jerk_copy = new double[maxBodies, NDIM]; double[] size_copy = new double[maxBodies]; bool[] active_copy = new bool[maxBodies]; GEExternalAcceleration[] externalAccelerations_copy = new GEExternalAcceleration[maxBodies]; for (int j = 0; j < maxBodies; j++) { for (int k = 0; k < NDIM; k++) { vel_copy[j, k] = vel[j, k]; acc_copy[j, k] = acc[j, k]; jerk_copy[j, k] = jerk[j, k]; old_pos_copy[j, k] = old_pos[j, k]; old_vel_copy[j, k] = old_vel[j, k]; old_acc_copy[j, k] = old_acc[j, k]; old_jerk_copy[j, k] = old_jerk[j, k]; } active_copy[j] = active[j]; size_copy[j] = size[j]; externalAccelerations_copy[j] = externalAccel[j]; } size = new double[newSize]; vel = new double[newSize, NDIM]; acc = new double[newSize, NDIM]; jerk = new double[newSize, NDIM]; old_pos = new double[newSize, NDIM]; old_vel = new double[newSize, NDIM]; old_acc = new double[newSize, NDIM]; old_jerk = new double[newSize, NDIM]; active = new bool[newSize]; size = new double[newSize]; externalAccel = new GEExternalAcceleration[newSize]; for (int j = 0; j < maxBodies; j++) { for (int k = 0; k < NDIM; k++) { vel[j, k] = vel_copy[j, k]; acc[j, k] = acc_copy[j, k]; jerk[j, k] = jerk_copy[j, k]; old_pos[j, k] = old_pos_copy[j, k]; old_vel[j, k] = old_vel_copy[j, k]; old_acc[j, k] = old_acc_copy[j, k]; old_jerk[j, k] = old_jerk_copy[j, k]; } active[j] = active_copy[j]; size[j] = size_copy[j]; externalAccel[j] = externalAccelerations_copy[j]; } maxBodies = newSize; }