major optimization updates
[debian/openrocket] / src / net / sf / openrocket / gui / main / SimulationRunDialog.java
index 50b3f2c5b101b21a25ca1f8d9d3202118edddf3f..1788515e78f62b0a16beb18e43d9145cd4994d8b 100644 (file)
@@ -25,6 +25,8 @@ import javax.swing.JProgressBar;
 import net.miginfocom.swing.MigLayout;
 import net.sf.openrocket.document.Simulation;
 import net.sf.openrocket.gui.dialogs.DetailDialog;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.logging.LogHelper;
 import net.sf.openrocket.rocketcomponent.Configuration;
 import net.sf.openrocket.rocketcomponent.MotorMount;
 import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
@@ -35,6 +37,7 @@ import net.sf.openrocket.simulation.exception.SimulationException;
 import net.sf.openrocket.simulation.exception.SimulationLaunchException;
 import net.sf.openrocket.simulation.listeners.AbstractSimulationListener;
 import net.sf.openrocket.simulation.listeners.SimulationListener;
+import net.sf.openrocket.startup.Application;
 import net.sf.openrocket.unit.Unit;
 import net.sf.openrocket.unit.UnitGroup;
 import net.sf.openrocket.util.GUIUtil;
@@ -43,6 +46,10 @@ import net.sf.openrocket.util.Prefs;
 
 
 public class SimulationRunDialog extends JDialog {
+       private static final LogHelper log = Application.getLogger();
+       private static final Translator trans = Application.getTranslator();
+       
+
        /** Update the dialog status every this many ms */
        private static final long UPDATE_MS = 200;
        
@@ -65,7 +72,13 @@ public class SimulationRunDialog extends JDialog {
        private final JProgressBar progressBar;
        
 
+       /*
+        * NOTE:  Care must be used when accessing the simulation parameters, since they
+        * are being run in another thread.  Mutexes are used to avoid concurrent usage, which
+        * will result in an exception being thrown!
+        */
        private final Simulation[] simulations;
+       private final String[] simulationNames;
        private final SimulationWorker[] simulationWorkers;
        private final SimulationStatus[] simulationStatuses;
        private final double[] simulationMaxAltitude;
@@ -73,7 +86,8 @@ public class SimulationRunDialog extends JDialog {
        private final boolean[] simulationDone;
        
        public SimulationRunDialog(Window window, Simulation... simulations) {
-               super(window, "Running simulations...", Dialog.ModalityType.DOCUMENT_MODAL);
+               //// Running simulations...
+               super(window, trans.get("SimuRunDlg.title.RunSim"), Dialog.ModalityType.DOCUMENT_MODAL);
                
                if (simulations.length == 0) {
                        throw new IllegalArgumentException("Called with no simulations to run");
@@ -81,8 +95,15 @@ public class SimulationRunDialog extends JDialog {
                
                this.simulations = simulations;
                
+
+               // Randomize the simulation random seeds
+               for (Simulation sim : simulations) {
+                       sim.getOptions().randomizeSeed();
+               }
+               
                // Initialize the simulations
                int n = simulations.length;
+               simulationNames = new String[n];
                simulationWorkers = new SimulationWorker[n];
                simulationStatuses = new SimulationStatus[n];
                simulationMaxAltitude = new double[n];
@@ -90,6 +111,7 @@ public class SimulationRunDialog extends JDialog {
                simulationDone = new boolean[n];
                
                for (int i = 0; i < n; i++) {
+                       simulationNames[i] = simulations[i].getName();
                        simulationWorkers[i] = new InteractiveSimulationWorker(simulations[i], i);
                        executor.execute(simulationWorkers[i]);
                }
@@ -97,18 +119,21 @@ public class SimulationRunDialog extends JDialog {
                // Build the dialog
                JPanel panel = new JPanel(new MigLayout("fill", "[][grow]"));
                
-               simLabel = new JLabel("Running ...");
+               //// Running ...
+               simLabel = new JLabel(trans.get("SimuRunDlg.lbl.Running"));
                panel.add(simLabel, "spanx, wrap para");
-               
-               panel.add(new JLabel("Simulation time: "), "gapright para");
+               //// Simulation time: 
+               panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Simutime") + " "), "gapright para");
                timeLabel = new JLabel("");
                panel.add(timeLabel, "growx, wrap rel");
                
-               panel.add(new JLabel("Altitude: "));
+               //// Altitude:
+               panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Altitude") + " "));
                altLabel = new JLabel("");
                panel.add(altLabel, "growx, wrap rel");
                
-               panel.add(new JLabel("Velocity: "));
+               //// Velocity:
+               panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Velocity") + " "));
                velLabel = new JLabel("");
                panel.add(velLabel, "growx, wrap para");
                
@@ -117,7 +142,7 @@ public class SimulationRunDialog extends JDialog {
                
 
                // Add cancel button
-               JButton cancel = new JButton("Cancel");
+               JButton cancel = new JButton(trans.get("dlg.but.cancel"));
                cancel.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
@@ -174,7 +199,6 @@ public class SimulationRunDialog extends JDialog {
 
 
        private void updateProgress() {
-               System.out.println("updateProgress() called");
                int index;
                for (index = 0; index < simulations.length; index++) {
                        if (!simulationDone[index])
@@ -183,7 +207,7 @@ public class SimulationRunDialog extends JDialog {
                
                if (index >= simulations.length) {
                        // Everything is done, close the dialog
-                       System.out.println("Everything done.");
+                       log.debug("Everything done.");
                        this.dispose();
                        return;
                }
@@ -195,15 +219,15 @@ public class SimulationRunDialog extends JDialog {
                }
                progress /= simulationWorkers.length;
                progressBar.setValue(progress);
-               System.out.println("Progressbar value " + progress);
+               log.debug("Progressbar value " + progress);
                
                // Update the simulation fields
-               simLabel.setText("Running " + simulations[index].getName());
+               simLabel.setText("Running " + simulationNames[index]);
                if (simulationStatuses[index] == null) {
+                       log.debug("No simulation status data available, setting empty labels");
                        timeLabel.setText("");
                        altLabel.setText("");
                        velLabel.setText("");
-                       System.out.println("Empty labels, how sad.");
                        return;
                }
                
@@ -217,7 +241,6 @@ public class SimulationRunDialog extends JDialog {
                u = UnitGroup.UNITS_VELOCITY.getDefaultUnit();
                velLabel.setText(u.toStringUnit(simulationStatuses[index].getRocketVelocity().z) + " (max. " +
                                u.toStringUnit(simulationMaxVelocity[index]) + ")");
-               System.out.println("Set interesting labels.");
        }
        
        
@@ -255,7 +278,7 @@ public class SimulationRunDialog extends JDialog {
                        double launchBurn = 0;
                        double otherBurn = 0;
                        Configuration config = simulation.getConfiguration();
-                       String id = simulation.getConditions().getMotorConfigurationID();
+                       String id = simulation.getOptions().getMotorConfigurationID();
                        Iterator<MotorMount> iterator = config.motorIterator();
                        while (iterator.hasNext()) {
                                MotorMount m = iterator.next();
@@ -299,7 +322,7 @@ public class SimulationRunDialog extends JDialog {
                        
                        // 1. time = 0 ... burnoutTimeEstimate
                        if (simulationStage == -2 && status.getSimulationTime() < burnoutTimeEstimate) {
-                               System.out.println("Method 1:  t=" + status.getSimulationTime() + "  est=" + burnoutTimeEstimate);
+                               log.debug("Method 1:  t=" + status.getSimulationTime() + "  est=" + burnoutTimeEstimate);
                                setSimulationProgress(MathUtil.map(status.getSimulationTime(), 0, burnoutTimeEstimate,
                                                0.0, BURNOUT_PROGRESS));
                                updateProgress();
@@ -309,13 +332,12 @@ public class SimulationRunDialog extends JDialog {
                        if (simulationStage == -2) {
                                simulationStage++;
                                burnoutVelocity = MathUtil.max(status.getRocketVelocity().z, 0.1);
-                               System.out.println("CHANGING to Method 2, vel=" + burnoutVelocity);
+                               log.debug("CHANGING to Method 2, vel=" + burnoutVelocity);
                        }
                        
                        // 2. z-velocity from burnout velocity to zero
                        if (simulationStage == -1 && status.getRocketVelocity().z >= 0) {
-                               System.out.println("Method 2:  vel=" + status.getRocketVelocity().z + " burnout=" +
-                                               burnoutVelocity);
+                               log.debug("Method 2:  vel=" + status.getRocketVelocity().z + " burnout=" + burnoutVelocity);
                                setSimulationProgress(MathUtil.map(status.getRocketVelocity().z, burnoutVelocity, 0,
                                                BURNOUT_PROGRESS, APOGEE_PROGRESS));
                                updateProgress();
@@ -325,11 +347,12 @@ public class SimulationRunDialog extends JDialog {
                        if (simulationStage == -1 && status.getRocketVelocity().z < 0) {
                                simulationStage++;
                                apogeeAltitude = MathUtil.max(status.getRocketPosition().z, 1);
+                               log.debug("CHANGING to Method 3, apogee=" + apogeeAltitude);
                        }
                        
                        // 3. z-position from apogee to zero
                        // TODO: MEDIUM: several stages
-                       System.out.println("Method 3:  alt=" + status.getRocketPosition().z + "  apogee=" + apogeeAltitude);
+                       log.debug("Method 3:  alt=" + status.getRocketPosition().z + "  apogee=" + apogeeAltitude);
                        setSimulationProgress(MathUtil.map(status.getRocketPosition().z,
                                        apogeeAltitude, 0, APOGEE_PROGRESS, 1.0));
                        updateProgress();
@@ -341,7 +364,7 @@ public class SimulationRunDialog extends JDialog {
                @Override
                protected void simulationDone() {
                        simulationDone[index] = true;
-                       System.out.println("DONE, setting progress");
+                       log.debug("Simulation done");
                        setSimulationProgress(1.0);
                        updateProgress();
                }
@@ -370,7 +393,8 @@ public class SimulationRunDialog extends JDialog {
                                
                                DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
                                                new Object[] {
-                                                               "Unable to simulate:",
+                                                               //// Unable to simulate:
+                                                               trans.get("SimuRunDlg.msg.Unabletosim"),
                                                                t.getMessage()
                                                },
                                                null, simulation.getName(), JOptionPane.ERROR_MESSAGE);
@@ -379,7 +403,8 @@ public class SimulationRunDialog extends JDialog {
                                
                                DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
                                                new Object[] {
-                                                               "A error occurred during the simulation:",
+                                                               //// A error occurred during the simulation:
+                                                               trans.get("SimuRunDlg.msg.errorOccurred"),
                                                                t.getMessage()
                                                },
                                                stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE);
@@ -390,10 +415,11 @@ public class SimulationRunDialog extends JDialog {
                                t.printStackTrace();
                                DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
                                                new Object[] {
-                                                               "An exception occurred during the simulation:",
+                                                               //// An exception occurred during the simulation:
+                                                               trans.get("SimuRunDlg.msg.AnException1"),
                                                                t.getMessage(),
                                                                simulation.getSimulationListeners().isEmpty() ?
-                                                                               "Please report this as a bug along with the details below." : ""
+                                                                               trans.get("SimuRunDlg.msg.AnException2") : ""
                                                },
                                                stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE);
                                
@@ -402,8 +428,10 @@ public class SimulationRunDialog extends JDialog {
                                t.printStackTrace();
                                DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
                                                new Object[] {
-                                                               "A computation error occurred during the simulation.",
-                                                               "Please report this as a bug along with the details below."
+                                                               //// A computation error occurred during the simulation.
+                                                               trans.get("SimuRunDlg.msg.AssertionError1"),
+                                                               //// Please report this as a bug along with the details below.
+                                                               trans.get("SimuRunDlg.msg.AssertionError2")
                                                },
                                                stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE);
                                
@@ -412,9 +440,10 @@ public class SimulationRunDialog extends JDialog {
                                // Probably an Error
                                DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
                                                new Object[] {
-                                                               "An unknown error was encountered during the simulation.",
-                                                               "The program may be unstable, you should save all your designs " +
-                                                                               "and restart OpenRocket now!"
+                                                               //// An unknown error was encountered during the simulation.
+                                                               trans.get("SimuRunDlg.msg.unknownerror1"),
+                                                               //// The program may be unstable, you should save all your designs and restart OpenRocket now!
+                                                               trans.get("SimuRunDlg.msg.unknownerror2")
                                                },
                                                stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE);
                                
@@ -425,10 +454,9 @@ public class SimulationRunDialog extends JDialog {
                
 
                private void setSimulationProgress(double p) {
-                       progress = Math.max(progress, (int) (100 * p + 0.5));
-                       progress = MathUtil.clamp(progress, 0, 100);
-                       System.out.println("Setting progress to " + progress + " (real " +
-                                       ((int) (100 * p + 0.5)) + ")");
+                       int exact = Math.max(progress, (int) (100 * p + 0.5));
+                       progress = MathUtil.clamp(exact, 0, 100);
+                       log.debug("Setting progress to " + progress + " (real " + exact + ")");
                        super.setProgress(progress);
                }
                
@@ -448,7 +476,7 @@ public class SimulationRunDialog extends JDialog {
                                case APOGEE:
                                        simulationStage = 0;
                                        apogeeAltitude = status.getRocketPosition().z;
-                                       System.out.println("APOGEE, setting progress");
+                                       log.debug("APOGEE, setting progress");
                                        setSimulationProgress(APOGEE_PROGRESS);
                                        publish(status);
                                        break;
@@ -458,7 +486,7 @@ public class SimulationRunDialog extends JDialog {
                                        break;
                                
                                case SIMULATION_END:
-                                       System.out.println("END, setting progress");
+                                       log.debug("END, setting progress");
                                        setSimulationProgress(1.0);
                                        break;
                                }