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