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