major optimization updates
[debian/openrocket] / src / net / sf / openrocket / optimization / rocketoptimization / parameters / MaximumAccelerationParameter.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.SimulationException;
11 import net.sf.openrocket.simulation.exception.SimulationLaunchException;
12 import net.sf.openrocket.simulation.listeners.system.ApogeeEndListener;
13 import net.sf.openrocket.startup.Application;
14 import net.sf.openrocket.unit.UnitGroup;
15
16 /**
17  * An optimization parameter that computes the maximum acceleration during a simulated flight.
18  * 
19  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
20  */
21 public class MaximumAccelerationParameter implements OptimizableParameter {
22         
23         private static final LogHelper log = Application.getLogger();
24         private static final Translator trans = Application.getTranslator();
25         
26         @Override
27         public String getName() {
28                 return trans.get("name");
29         }
30         
31         @Override
32         public double computeValue(Simulation simulation) throws OptimizationException {
33                 try {
34                         log.debug("Running simulation to evaluate maximum acceleration");
35                         simulation.simulate(new ApogeeEndListener());
36                         double value = simulation.getSimulatedData().getBranch(0).getMaximum(FlightDataType.TYPE_ACCELERATION_TOTAL);
37                         log.debug("Maximum acceleration was " + value);
38                         return value;
39                 } catch (MotorIgnitionException e) {
40                         // A problem with motor ignition will cause optimization to fail
41                         throw new OptimizationException(e);
42                 } catch (SimulationLaunchException e) {
43                         // Other launch exceptions result in zero velocity
44                         return Double.NaN;
45                 } catch (SimulationException e) {
46                         // Other exceptions fail
47                         throw new OptimizationException(e);
48                 }
49         }
50         
51         @Override
52         public UnitGroup getUnitGroup() {
53                 return UnitGroup.UNITS_ACCELERATION;
54         }
55         
56 }