1 package net.sf.openrocket.optimization.rocketoptimization.parameters;
3 import net.sf.openrocket.aerodynamics.AerodynamicCalculator;
4 import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
5 import net.sf.openrocket.aerodynamics.FlightConditions;
6 import net.sf.openrocket.document.Simulation;
7 import net.sf.openrocket.l10n.Translator;
8 import net.sf.openrocket.logging.LogHelper;
9 import net.sf.openrocket.masscalc.BasicMassCalculator;
10 import net.sf.openrocket.masscalc.MassCalculator;
11 import net.sf.openrocket.masscalc.MassCalculator.MassCalcType;
12 import net.sf.openrocket.optimization.general.OptimizationException;
13 import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter;
14 import net.sf.openrocket.rocketcomponent.Configuration;
15 import net.sf.openrocket.rocketcomponent.RocketComponent;
16 import net.sf.openrocket.rocketcomponent.SymmetricComponent;
17 import net.sf.openrocket.startup.Application;
18 import net.sf.openrocket.unit.UnitGroup;
19 import net.sf.openrocket.util.Coordinate;
20 import net.sf.openrocket.util.MathUtil;
23 * An optimization parameter that computes either the absolute or relative stability of a rocket.
25 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
27 public class StabilityParameter implements OptimizableParameter {
29 private static final LogHelper log = Application.getLogger();
30 private static final Translator trans = Application.getTranslator();
33 private final boolean absolute;
35 public StabilityParameter(boolean absolute) {
36 this.absolute = absolute;
41 public String getName() {
42 return trans.get("name") + " (" + getUnitGroup().getDefaultUnit().getUnit() + ")";
46 public double computeValue(Simulation simulation) throws OptimizationException {
51 log.debug("Calculating stability of simulation, absolute=" + absolute);
54 * These are instantiated each time because this class must be thread-safe.
55 * Caching would in any case be inefficient since the rocket changes all the time.
57 AerodynamicCalculator aerodynamicCalculator = new BarrowmanCalculator();
58 MassCalculator massCalculator = new BasicMassCalculator();
61 Configuration configuration = simulation.getConfiguration();
62 FlightConditions conditions = new FlightConditions(configuration);
63 conditions.setMach(Application.getPreferences().getDefaultMach());
65 conditions.setRollRate(0);
67 cp = aerodynamicCalculator.getWorstCP(configuration, conditions, null);
68 cg = massCalculator.getCG(configuration, MassCalcType.LAUNCH_MASS);
70 if (cp.weight > 0.000001)
75 if (cg.weight > 0.000001)
81 // Calculate the reference (absolute or relative)
82 stability = cpx - cgx;
86 for (RocketComponent c : configuration) {
87 if (c instanceof SymmetricComponent) {
88 double d1 = ((SymmetricComponent) c).getForeRadius() * 2;
89 double d2 = ((SymmetricComponent) c).getAftRadius() * 2;
90 diameter = MathUtil.max(diameter, d1, d2);
93 stability = stability / diameter;
96 log.debug("Resulting stability is " + stability + ", absolute=" + absolute);
102 public UnitGroup getUnitGroup() {
104 return UnitGroup.UNITS_LENGTH;
106 return UnitGroup.UNITS_STABILITY_CALIBERS;