optimization updates
[debian/openrocket] / src / net / sf / openrocket / simulation / RK4SimulationStepper.java
index a4a682207bd6aff973aff91eb54b5391ae1295d6..07020f2252c0c3eda1a3c64755c4d083a4b7206b 100644 (file)
@@ -8,6 +8,7 @@ import net.sf.openrocket.aerodynamics.FlightConditions;
 import net.sf.openrocket.aerodynamics.WarningSet;
 import net.sf.openrocket.logging.LogHelper;
 import net.sf.openrocket.models.atmosphere.AtmosphericConditions;
+import net.sf.openrocket.simulation.exception.SimulationCalculationException;
 import net.sf.openrocket.simulation.exception.SimulationException;
 import net.sf.openrocket.simulation.listeners.SimulationListenerHelper;
 import net.sf.openrocket.startup.Application;
@@ -21,6 +22,9 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
        
        private static final LogHelper log = Application.getLogger();
        
+       /** Random value with which to XOR the random seed value */
+       private static final int SEED_RANDOMIZATION = 0x23E3A01F;
+       
 
        /**
         * A recommended reasonably accurate time step.
@@ -50,8 +54,7 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
        private static final double MIN_TIME_STEP = 0.001;
        
 
-       // FIXME: Random seed
-       private final Random random = new Random(10);
+       private Random random;
        
        
 
@@ -59,8 +62,6 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
        @Override
        public RK4SimulationStatus initialize(SimulationStatus original) {
                
-               log.info("Performing RK4SimulationStepper initialization");
-               
                RK4SimulationStatus status = new RK4SimulationStatus();
                
                status.copyFrom(original);
@@ -72,6 +73,8 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
                                Math.cos(sim.getLaunchRodAngle())
                                ));
                
+               this.random = new Random(original.getSimulationConditions().getRandomSeed() ^ SEED_RANDOMIZATION);
+               
                return status;
        }
        
@@ -253,6 +256,13 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
                status.setSimulationTime(status.getSimulationTime() + store.timestep);
                
                status.setPreviousTimeStep(store.timestep);
+               
+               // Verify that values don't run out of range
+               if (status.getRocketVelocity().length2() > 1e18 ||
+                               status.getRocketPosition().length2() > 1e18 ||
+                               status.getRocketRotationVelocity().length2() > 1e18) {
+                       throw new SimulationCalculationException("Simulation values exceeded limits");
+               }
        }
        
        
@@ -358,7 +368,8 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
                        
                        // Compute acceleration in rocket coordinates
                        store.angularAcceleration = new Coordinate(momX / store.massData.getLongitudinalInertia(),
-                                               momY / store.massData.getLongitudinalInertia(), momZ / store.massData.getRotationalInertia());
+                                               momY / store.massData.getLongitudinalInertia(),
+                                               momZ / store.massData.getRotationalInertia());
                        
                        store.rollAcceleration = store.angularAcceleration.z;
                        // TODO: LOW: This should be hypot, but does it matter?