229df474ad3ad5be10c0a3c587685e0201ac94c2
[debian/openrocket] / src / net / sf / openrocket / optimization / rocketoptimization / parameters / MaximumVelocityParameter.java
1 package net.sf.openrocket.optimization.rocketoptimization.parameters;
2
3 import net.sf.openrocket.document.Simulation;
4 import net.sf.openrocket.l10n.Translator;
5 import net.sf.openrocket.logging.LogHelper;
6 import net.sf.openrocket.optimization.general.OptimizationException;
7 import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter;
8 import net.sf.openrocket.simulation.FlightDataType;
9 import net.sf.openrocket.simulation.exception.MotorIgnitionException;
10 import net.sf.openrocket.simulation.exception.SimulationCancelledException;
11 import net.sf.openrocket.simulation.exception.SimulationException;
12 import net.sf.openrocket.simulation.exception.SimulationLaunchException;
13 import net.sf.openrocket.simulation.listeners.system.ApogeeEndListener;
14 import net.sf.openrocket.simulation.listeners.system.InterruptListener;
15 import net.sf.openrocket.startup.Application;
16 import net.sf.openrocket.unit.UnitGroup;
17
18 /**
19  * An optimization parameter that computes the maximum velocity during a simulated flight.
20  * 
21  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
22  */
23 public class MaximumVelocityParameter implements OptimizableParameter {
24         
25         private static final LogHelper log = Application.getLogger();
26         private static final Translator trans = Application.getTranslator();
27         
28         @Override
29         public String getName() {
30                 return trans.get("name");
31         }
32         
33         @Override
34         public double computeValue(Simulation simulation) throws OptimizationException, InterruptedException {
35                 try {
36                         log.debug("Running simulation to evaluate maximum velocity");
37                         simulation.simulate(new ApogeeEndListener(), new InterruptListener());
38                         double value = simulation.getSimulatedData().getBranch(0).getMaximum(FlightDataType.TYPE_VELOCITY_TOTAL);
39                         log.debug("Maximum velocity was " + value);
40                         return value;
41                 } catch (MotorIgnitionException e) {
42                         // A problem with motor ignition will cause optimization to fail
43                         throw new OptimizationException(e);
44                 } catch (SimulationLaunchException e) {
45                         // Other launch exceptions result in zero velocity
46                         return Double.NaN;
47                 } catch (SimulationCancelledException e) {
48                         throw (InterruptedException) new InterruptedException("Optimization was interrupted").initCause(e);
49                 } catch (SimulationException e) {
50                         // Other exceptions fail
51                         throw new OptimizationException(e);
52                 }
53         }
54         
55         @Override
56         public UnitGroup getUnitGroup() {
57                 return UnitGroup.UNITS_VELOCITY;
58         }
59         
60 }