1 package net.sf.openrocket.simulation;
3 import java.util.HashMap;
4 import java.util.Locale;
7 import net.sf.openrocket.l10n.Translator;
8 import net.sf.openrocket.startup.Application;
9 import net.sf.openrocket.unit.UnitGroup;
12 * A class defining a storable simulation variable type. This class defined numerous ready
13 * types, and allows also creating new types with any name. When retrieving types based on
14 * a name, you should use {@link #getType(String, UnitGroup)} to return the default unit type,
15 * or a new type if the name does not currently exist.
17 * Each type has a type name (description), a unit group and a priority. The type is identified
18 * purely by its name case-insensitively. The unit group provides the units for the type.
19 * The priority is used to order the types. The pre-existing types are defined specific priority
20 * numbers, and other types have a default priority number that is after all other types.
22 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
24 public class FlightDataType implements Comparable<FlightDataType> {
25 private static final Translator trans = Application.getTranslator();
27 /** Priority of custom-created variables */
28 private static final int DEFAULT_PRIORITY = 999;
30 /** List of existing types. MUST BE DEFINED BEFORE ANY TYPES!! */
31 private static final Map<String, FlightDataType> EXISTING_TYPES = new HashMap<String, FlightDataType>();
36 public static final FlightDataType TYPE_TIME = newType("TYPE_TIME", "t", UnitGroup.UNITS_FLIGHT_TIME, 1);
38 //// Vertical position and motion
40 public static final FlightDataType TYPE_ALTITUDE = newType("TYPE_ALTITUDE", "h", UnitGroup.UNITS_DISTANCE, 10);
41 //// Vertical velocity
42 public static final FlightDataType TYPE_VELOCITY_Z = newType("TYPE_VELOCITY_Z", "Vz", UnitGroup.UNITS_VELOCITY, 11);
43 //// Vertical acceleration
44 public static final FlightDataType TYPE_ACCELERATION_Z = newType("TYPE_ACCELERATION_Z", "Az", UnitGroup.UNITS_ACCELERATION, 12);
49 public static final FlightDataType TYPE_VELOCITY_TOTAL = newType("TYPE_VELOCITY_TOTAL", "Vt", UnitGroup.UNITS_VELOCITY, 20);
50 //// Total acceleration
51 public static final FlightDataType TYPE_ACCELERATION_TOTAL = newType("TYPE_ACCELERATION_TOTAL", "At", UnitGroup.UNITS_ACCELERATION, 21);
54 //// Lateral position and motion
56 public static final FlightDataType TYPE_POSITION_X = newType("TYPE_POSITION_X", "Px", UnitGroup.UNITS_DISTANCE, 30);
57 //// Position parallel to wind
58 public static final FlightDataType TYPE_POSITION_Y = newType("TYPE_POSITION_Y", "Py", UnitGroup.UNITS_DISTANCE, 31);
60 public static final FlightDataType TYPE_POSITION_XY = newType("TYPE_POSITION_XY", "Pl", UnitGroup.UNITS_DISTANCE, 32);
61 //// Lateral direction
62 public static final FlightDataType TYPE_POSITION_DIRECTION = newType("TYPE_POSITION_DIRECTION", "\u03b8l", UnitGroup.UNITS_ANGLE, 33);
64 public static final FlightDataType TYPE_VELOCITY_XY = newType("TYPE_VELOCITY_XY", "Vl", UnitGroup.UNITS_VELOCITY, 34);
65 //// Lateral acceleration
66 public static final FlightDataType TYPE_ACCELERATION_XY = newType("TYPE_ACCELERATION_XY", "Al", UnitGroup.UNITS_ACCELERATION, 35);
68 public static final FlightDataType TYPE_LATITUDE = newType("TYPE_LATITUDE", "\u03c6", UnitGroup.UNITS_ANGLE, 36);
70 public static final FlightDataType TYPE_LONGITUDE = newType("TYPE_LONGITUDE", "\u03bb", UnitGroup.UNITS_ANGLE, 37);
74 public static final FlightDataType TYPE_AOA = newType("TYPE_AOA", "\u03b1", UnitGroup.UNITS_ANGLE, 40);
76 public static final FlightDataType TYPE_ROLL_RATE = newType("TYPE_ROLL_RATE", "d\u03a6", UnitGroup.UNITS_ROLL, 41);
78 public static final FlightDataType TYPE_PITCH_RATE = newType("TYPE_PITCH_RATE", "d\u03b8", UnitGroup.UNITS_ROLL, 42);
80 public static final FlightDataType TYPE_YAW_RATE = newType("TYPE_YAW_RATE", "d\u03a8", UnitGroup.UNITS_ROLL, 43);
83 //// Stability information
85 public static final FlightDataType TYPE_MASS = newType("TYPE_MASS", "m", UnitGroup.UNITS_MASS, 50);
86 //// Longitudinal moment of inertia
87 public static final FlightDataType TYPE_LONGITUDINAL_INERTIA = newType("TYPE_LONGITUDINAL_INERTIA", "Il", UnitGroup.UNITS_INERTIA, 51);
88 //// Rotational moment of inertia
89 public static final FlightDataType TYPE_ROTATIONAL_INERTIA = newType("TYPE_ROTATIONAL_INERTIA", "Ir", UnitGroup.UNITS_INERTIA, 52);
91 public static final FlightDataType TYPE_CP_LOCATION = newType("TYPE_CP_LOCATION", "Cp", UnitGroup.UNITS_LENGTH, 53);
93 public static final FlightDataType TYPE_CG_LOCATION = newType("TYPE_CG_LOCATION", "Cg", UnitGroup.UNITS_LENGTH, 54);
94 //// Stability margin calibers
95 public static final FlightDataType TYPE_STABILITY = newType("TYPE_STABILITY", "S", UnitGroup.UNITS_COEFFICIENT, 55);
98 //// Characteristic numbers
100 public static final FlightDataType TYPE_MACH_NUMBER = newType("TYPE_MACH_NUMBER", "M", UnitGroup.UNITS_COEFFICIENT, 60);
102 public static final FlightDataType TYPE_REYNOLDS_NUMBER = newType("TYPE_REYNOLDS_NUMBER", "R", UnitGroup.UNITS_COEFFICIENT, 61);
107 public static final FlightDataType TYPE_THRUST_FORCE = newType("TYPE_THRUST_FORCE", "Ft", UnitGroup.UNITS_FORCE, 70);
109 public static final FlightDataType TYPE_DRAG_FORCE = newType("TYPE_DRAG_FORCE", "Fd", UnitGroup.UNITS_FORCE, 71);
110 //// Drag coefficient
111 public static final FlightDataType TYPE_DRAG_COEFF = newType("TYPE_DRAG_COEFF", "Cd", UnitGroup.UNITS_COEFFICIENT, 72);
112 //// Axial drag coefficient
113 public static final FlightDataType TYPE_AXIAL_DRAG_COEFF = newType("TYPE_AXIAL_DRAG_COEFF", "Cda", UnitGroup.UNITS_COEFFICIENT, 73);
116 //// Component drag coefficients
117 //// Friction drag coefficient
118 public static final FlightDataType TYPE_FRICTION_DRAG_COEFF = newType("TYPE_FRICTION_DRAG_COEFF", "Cdf", UnitGroup.UNITS_COEFFICIENT, 80);
119 //// Pressure drag coefficient
120 public static final FlightDataType TYPE_PRESSURE_DRAG_COEFF = newType("TYPE_PRESSURE_DRAG_COEFF", "Cdp", UnitGroup.UNITS_COEFFICIENT, 81);
121 //// Base drag coefficient
122 public static final FlightDataType TYPE_BASE_DRAG_COEFF = newType("TYPE_BASE_DRAG_COEFF", "Cdb", UnitGroup.UNITS_COEFFICIENT, 82);
125 //// Other coefficients
126 //// Normal force coefficient
127 public static final FlightDataType TYPE_NORMAL_FORCE_COEFF = newType("TYPE_NORMAL_FORCE_COEFF", "Cn", UnitGroup.UNITS_COEFFICIENT, 90);
128 //// Pitch moment coefficient
129 public static final FlightDataType TYPE_PITCH_MOMENT_COEFF = newType("TYPE_PITCH_MOMENT_COEFF", "C\u03b8", UnitGroup.UNITS_COEFFICIENT, 91);
130 //// Yaw moment coefficient
131 public static final FlightDataType TYPE_YAW_MOMENT_COEFF = newType("TYPE_YAW_MOMENT_COEFF", "C\u03c4\u03a8", UnitGroup.UNITS_COEFFICIENT, 92);
132 //// Side force coefficient
133 public static final FlightDataType TYPE_SIDE_FORCE_COEFF = newType("TYPE_SIDE_FORCE_COEFF", "C\u03c4s", UnitGroup.UNITS_COEFFICIENT, 93);
134 //// Roll moment coefficient
135 public static final FlightDataType TYPE_ROLL_MOMENT_COEFF = newType("TYPE_ROLL_MOMENT_COEFF", "C\u03c4\u03a6", UnitGroup.UNITS_COEFFICIENT, 94);
136 //// Roll forcing coefficient
137 public static final FlightDataType TYPE_ROLL_FORCING_COEFF = newType("TYPE_ROLL_FORCING_COEFF", "Cf\u03a6", UnitGroup.UNITS_COEFFICIENT, 95);
138 //// Roll damping coefficient
139 public static final FlightDataType TYPE_ROLL_DAMPING_COEFF = newType("TYPE_ROLL_DAMPING_COEFF", "C\u03b6\u03a6", UnitGroup.UNITS_COEFFICIENT, 96);
141 //// Pitch damping coefficient
142 public static final FlightDataType TYPE_PITCH_DAMPING_MOMENT_COEFF = newType("TYPE_PITCH_DAMPING_MOMENT_COEFF", "C\u03b6\u03b8", UnitGroup.UNITS_COEFFICIENT, 97);
143 //// Yaw damping coefficient
144 public static final FlightDataType TYPE_YAW_DAMPING_MOMENT_COEFF = newType("TYPE_YAW_DAMPING_MOMENT_COEFF", "C\u03b6\u03a8", UnitGroup.UNITS_COEFFICIENT, 98);
146 //// Coriolis acceleration
147 public static final FlightDataType TYPE_CORIOLIS_ACCELERATION = newType("TYPE_CORIOLIS_ACCELERATION", "Ac", UnitGroup.UNITS_ACCELERATION, 99);
150 //// Reference length + area
151 //// Reference length
152 public static final FlightDataType TYPE_REFERENCE_LENGTH = newType("TYPE_REFERENCE_LENGTH", "Lr", UnitGroup.UNITS_LENGTH, 100);
154 public static final FlightDataType TYPE_REFERENCE_AREA = newType("TYPE_REFERENCE_AREA", "Ar", UnitGroup.UNITS_AREA, 101);
158 //// Vertical orientation (zenith)
159 public static final FlightDataType TYPE_ORIENTATION_THETA = newType("TYPE_ORIENTATION_THETA", "\u0398", UnitGroup.UNITS_ANGLE, 106);
160 //// Lateral orientation (azimuth)
161 public static final FlightDataType TYPE_ORIENTATION_PHI = newType("TYPE_ORIENTATION_PHI", "\u03a6", UnitGroup.UNITS_ANGLE, 107);
164 //// Atmospheric conditions
166 public static final FlightDataType TYPE_WIND_VELOCITY = newType("TYPE_WIND_VELOCITY", "Vw", UnitGroup.UNITS_VELOCITY, 110);
168 public static final FlightDataType TYPE_AIR_TEMPERATURE = newType("TYPE_AIR_TEMPERATURE", "T", UnitGroup.UNITS_TEMPERATURE, 111);
170 public static final FlightDataType TYPE_AIR_PRESSURE = newType("TYPE_AIR_PRESSURE", "p", UnitGroup.UNITS_PRESSURE, 112);
172 public static final FlightDataType TYPE_SPEED_OF_SOUND = newType("TYPE_SPEED_OF_SOUND", "Vs", UnitGroup.UNITS_VELOCITY, 113);
174 //// Simulation information
175 //// Simulation time step
176 public static final FlightDataType TYPE_TIME_STEP = newType("TYPE_TIME_STEP", "dt", UnitGroup.UNITS_TIME_STEP, 200);
177 //// Computation time
178 public static final FlightDataType TYPE_COMPUTATION_TIME = newType("TYPE_COMPUTATION_TIME", "tc", UnitGroup.UNITS_SHORT_TIME, 201);
180 // An array of all the built in types
181 public static final FlightDataType[] ALL_TYPES = {
187 TYPE_ACCELERATION_TOTAL,
191 TYPE_POSITION_DIRECTION,
193 TYPE_ACCELERATION_XY,
201 TYPE_LONGITUDINAL_INERTIA,
202 TYPE_ROTATIONAL_INERTIA,
207 TYPE_REYNOLDS_NUMBER,
211 TYPE_AXIAL_DRAG_COEFF,
212 TYPE_FRICTION_DRAG_COEFF,
213 TYPE_PRESSURE_DRAG_COEFF,
214 TYPE_BASE_DRAG_COEFF,
215 TYPE_NORMAL_FORCE_COEFF,
216 TYPE_PITCH_MOMENT_COEFF,
217 TYPE_YAW_MOMENT_COEFF,
218 TYPE_SIDE_FORCE_COEFF,
219 TYPE_ROLL_MOMENT_COEFF,
220 TYPE_ROLL_FORCING_COEFF,
221 TYPE_ROLL_DAMPING_COEFF,
222 TYPE_PITCH_DAMPING_MOMENT_COEFF,
223 TYPE_YAW_DAMPING_MOMENT_COEFF,
224 TYPE_CORIOLIS_ACCELERATION,
225 TYPE_REFERENCE_LENGTH,
227 TYPE_ORIENTATION_THETA,
228 TYPE_ORIENTATION_PHI,
230 TYPE_AIR_TEMPERATURE,
234 TYPE_COMPUTATION_TIME
238 * Return a {@link FlightDataType} based on a string description. This returns known data types
239 * if possible, or a new type otherwise.
241 * @param s the string description of the type.
242 * @param u the unit group the new type should belong to if a new group is created.
243 * @return a data type.
245 public static synchronized FlightDataType getType(String s, String symbol, UnitGroup u) {
246 // modified to include the unit
247 FlightDataType type = EXISTING_TYPES.get(s.toLowerCase(Locale.ENGLISH));
249 // added this for backward compatibility. Will update type if symbol undefined
250 //if (type != null && type.getSymbol() != symbol){
251 // EXISTING_TYPES.remove(type);
258 type = newType("UserDefined." + s, s, symbol, u, DEFAULT_PRIORITY);
263 * Used while initializing the class.
266 private static FlightDataType newType( String key , String symbol, UnitGroup u, int priority ) {
267 String name = trans.get("FlightDataType." + key );
268 return newType( key, name, symbol, u, priority );
271 private static synchronized FlightDataType newType(String key, String s, String symbol, UnitGroup u, int priority) {
272 FlightDataType type = new FlightDataType(key, s, symbol, u, priority);
273 EXISTING_TYPES.put(s.toLowerCase(Locale.ENGLISH), type);
277 private final String key;
278 private final String name;
279 private final String symbol;
280 private final UnitGroup units;
281 private final int priority;
282 private final int hashCode;
285 private FlightDataType(String key, String typeName, String symbol, UnitGroup units, int priority) {
287 if (typeName == null)
288 throw new IllegalArgumentException("typeName is null");
290 throw new IllegalArgumentException("units is null");
291 this.name = typeName;
292 this.symbol = symbol;
294 this.priority = priority;
295 this.hashCode = this.key.hashCode();
299 public void setPriority(int p){
304 public String getKey() {
308 public String getName() {
312 public String getSymbol(){
316 public UnitGroup getUnitGroup() {
321 public String toString() {
322 return name; //+" ("+symbol+") "+units.getDefaultUnit().toString();
326 public boolean equals(Object other) {
327 if (!(other instanceof FlightDataType))
329 return this.hashCode == other.hashCode();
333 public int hashCode() {
338 public int compareTo(FlightDataType o) {
339 if (this.priority != o.priority)
340 return this.priority - o.priority;
341 return this.name.compareToIgnoreCase(o.name);