eea84dde568097948457201cb71bf6dfdd4d83da
[debian/openrocket] / src / net / sf / openrocket / simulation / FlightDataType.java
1 package net.sf.openrocket.simulation;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import net.sf.openrocket.l10n.Translator;
7 import net.sf.openrocket.startup.Application;
8 import net.sf.openrocket.unit.UnitGroup;
9
10 /**
11  * A class defining a storable simulation variable type.  This class defined numerous ready
12  * types, and allows also creating new types with any name.  When retrieving types based on
13  * a name, you should use {@link #getType(String, UnitGroup)} to return the default unit type,
14  * or a new type if the name does not currently exist.
15  * <p>
16  * Each type has a type name (description), a unit group and a priority.  The type is identified
17  * purely by its name case-insensitively.  The unit group provides the units for the type.
18  * The priority is used to order the types.  The pre-existing types are defined specific priority
19  * numbers, and other types have a default priority number that is after all other types.
20  * 
21  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
22  */
23 public class FlightDataType implements Comparable<FlightDataType> {
24         private static final Translator trans = Application.getTranslator();
25
26         /** Priority of custom-created variables */
27         private static final int DEFAULT_PRIORITY = 999;
28         
29         /** List of existing types.  MUST BE DEFINED BEFORE ANY TYPES!! */
30         private static final Map<String, FlightDataType> EXISTING_TYPES = new HashMap<String, FlightDataType>();
31         
32
33
34         //// Time
35         public static final FlightDataType TYPE_TIME = newType(trans.get("FlightDataType.TYPE_TIME"), UnitGroup.UNITS_FLIGHT_TIME, 1);
36         
37
38         //// Vertical position and motion
39         //// Altitude
40         public static final FlightDataType TYPE_ALTITUDE = newType(trans.get("FlightDataType.TYPE_ALTITUDE"), UnitGroup.UNITS_DISTANCE, 10);
41         //// Vertical velocity
42         public static final FlightDataType TYPE_VELOCITY_Z = newType(trans.get("FlightDataType.TYPE_VELOCITY_Z"), UnitGroup.UNITS_VELOCITY, 11);
43         //// Vertical acceleration
44         public static final FlightDataType TYPE_ACCELERATION_Z = newType(trans.get("FlightDataType.TYPE_ACCELERATION_Z"), UnitGroup.UNITS_ACCELERATION, 12);
45         
46
47         //// Total motion
48         //// Total velocity
49         public static final FlightDataType TYPE_VELOCITY_TOTAL = newType(trans.get("FlightDataType.TYPE_VELOCITY_TOTAL"), UnitGroup.UNITS_VELOCITY, 20);
50         //// Total acceleration
51         public static final FlightDataType TYPE_ACCELERATION_TOTAL = newType(trans.get("FlightDataType.TYPE_ACCELERATION_TOTAL"), UnitGroup.UNITS_ACCELERATION, 21);
52         
53
54         //// Lateral position and motion
55         //// Position upwind
56         public static final FlightDataType TYPE_POSITION_X = newType(trans.get("FlightDataType.TYPE_POSITION_X"), UnitGroup.UNITS_DISTANCE, 30);
57         //// Position parallel to wind
58         public static final FlightDataType TYPE_POSITION_Y = newType(trans.get("FlightDataType.TYPE_POSITION_Y"), UnitGroup.UNITS_DISTANCE, 31);
59         //// Lateral distance
60         public static final FlightDataType TYPE_POSITION_XY = newType(trans.get("FlightDataType.TYPE_POSITION_XY"), UnitGroup.UNITS_DISTANCE, 32);
61         //// Lateral direction
62         public static final FlightDataType TYPE_POSITION_DIRECTION = newType(trans.get("FlightDataType.TYPE_POSITION_DIRECTION"), UnitGroup.UNITS_ANGLE, 33);
63         //// Lateral velocity
64         public static final FlightDataType TYPE_VELOCITY_XY = newType(trans.get("FlightDataType.TYPE_VELOCITY_XY"), UnitGroup.UNITS_VELOCITY, 34);
65         //// Lateral acceleration
66         public static final FlightDataType TYPE_ACCELERATION_XY = newType(trans.get("FlightDataType.TYPE_ACCELERATION_XY"), UnitGroup.UNITS_ACCELERATION, 35);
67         
68
69         //// Angular motion
70         //// Angle of attack
71         public static final FlightDataType TYPE_AOA = newType(trans.get("FlightDataType.TYPE_AOA"), UnitGroup.UNITS_ANGLE, 40);
72         //// Roll rate
73         public static final FlightDataType TYPE_ROLL_RATE = newType(trans.get("FlightDataType.TYPE_ROLL_RATE"), UnitGroup.UNITS_ROLL, 41);
74         //// Pitch rate
75         public static final FlightDataType TYPE_PITCH_RATE = newType(trans.get("FlightDataType.TYPE_PITCH_RATE"), UnitGroup.UNITS_ROLL, 42);
76         //// Yaw rate
77         public static final FlightDataType TYPE_YAW_RATE = newType(trans.get("FlightDataType.TYPE_YAW_RATE"), UnitGroup.UNITS_ROLL, 43);
78         
79
80         //// Stability information
81         //// Mass
82         public static final FlightDataType TYPE_MASS = newType(trans.get("FlightDataType.TYPE_MASS"), UnitGroup.UNITS_MASS, 50);
83         //// Longitudinal moment of inertia
84         public static final FlightDataType TYPE_LONGITUDINAL_INERTIA = newType(trans.get("FlightDataType.TYPE_LONGITUDINAL_INERTIA"), UnitGroup.UNITS_INERTIA, 51);
85         //// Rotational moment of inertia
86         public static final FlightDataType TYPE_ROTATIONAL_INERTIA = newType(trans.get("FlightDataType.TYPE_ROTATIONAL_INERTIA"), UnitGroup.UNITS_INERTIA, 52);
87         //// CP location
88         public static final FlightDataType TYPE_CP_LOCATION = newType(trans.get("FlightDataType.TYPE_CP_LOCATION"), UnitGroup.UNITS_LENGTH, 53);
89         //// CG location
90         public static final FlightDataType TYPE_CG_LOCATION = newType(trans.get("FlightDataType.TYPE_CG_LOCATION"), UnitGroup.UNITS_LENGTH, 54);
91         //// Stability margin calibers
92         public static final FlightDataType TYPE_STABILITY = newType(trans.get("FlightDataType.TYPE_STABILITY"), UnitGroup.UNITS_COEFFICIENT, 55);
93         
94
95         //// Characteristic numbers
96         //// Mach number
97         public static final FlightDataType TYPE_MACH_NUMBER = newType(trans.get("FlightDataType.TYPE_MACH_NUMBER"), UnitGroup.UNITS_COEFFICIENT, 60);
98         //// Reynolds number
99         public static final FlightDataType TYPE_REYNOLDS_NUMBER = newType(trans.get("FlightDataType.TYPE_REYNOLDS_NUMBER"), UnitGroup.UNITS_COEFFICIENT, 61);
100         
101
102         //// Thrust and drag
103         //// Thrust
104         public static final FlightDataType TYPE_THRUST_FORCE = newType(trans.get("FlightDataType.TYPE_THRUST_FORCE"), UnitGroup.UNITS_FORCE, 70);
105         //// Drag force
106         public static final FlightDataType TYPE_DRAG_FORCE = newType(trans.get("FlightDataType.TYPE_DRAG_FORCE"), UnitGroup.UNITS_FORCE, 71);
107         //// Drag coefficient
108         public static final FlightDataType TYPE_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 72);
109         //// Axial drag coefficient
110         public static final FlightDataType TYPE_AXIAL_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_AXIAL_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 73);
111         
112
113         ////  Component drag coefficients
114         //// Friction drag coefficient
115         public static final FlightDataType TYPE_FRICTION_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_FRICTION_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 80);
116         //// Pressure drag coefficient
117         public static final FlightDataType TYPE_PRESSURE_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_PRESSURE_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 81);
118         //// Base drag coefficient
119         public static final FlightDataType TYPE_BASE_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_BASE_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 82);
120         
121
122         ////  Other coefficients
123         //// Normal force coefficient
124         public static final FlightDataType TYPE_NORMAL_FORCE_COEFF = newType(trans.get("FlightDataType.TYPE_NORMAL_FORCE_COEFF"), UnitGroup.UNITS_COEFFICIENT, 90);
125         //// Pitch moment coefficient
126         public static final FlightDataType TYPE_PITCH_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_PITCH_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 91);
127         //// Yaw moment coefficient
128         public static final FlightDataType TYPE_YAW_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_YAW_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 92);
129         //// Side force coefficient
130         public static final FlightDataType TYPE_SIDE_FORCE_COEFF = newType(trans.get("FlightDataType.TYPE_SIDE_FORCE_COEFF"), UnitGroup.UNITS_COEFFICIENT, 93);
131         //// Roll moment coefficient
132         public static final FlightDataType TYPE_ROLL_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_ROLL_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 94);
133         //// Roll forcing coefficient
134         public static final FlightDataType TYPE_ROLL_FORCING_COEFF = newType(trans.get("FlightDataType.TYPE_ROLL_FORCING_COEFF"), UnitGroup.UNITS_COEFFICIENT, 95);
135         //// Roll damping coefficient
136         public static final FlightDataType TYPE_ROLL_DAMPING_COEFF = newType(trans.get("FlightDataType.TYPE_ROLL_DAMPING_COEFF"), UnitGroup.UNITS_COEFFICIENT, 96);
137         
138         //// Pitch damping coefficient
139         public static final FlightDataType TYPE_PITCH_DAMPING_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_PITCH_DAMPING_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 97);
140         //// Yaw damping coefficient
141         public static final FlightDataType TYPE_YAW_DAMPING_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_YAW_DAMPING_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 98);
142         
143
144         ////  Reference length + area
145         //// Reference length
146         public static final FlightDataType TYPE_REFERENCE_LENGTH = newType(trans.get("FlightDataType.TYPE_REFERENCE_LENGTH"), UnitGroup.UNITS_LENGTH, 100);
147         //// Reference area
148         public static final FlightDataType TYPE_REFERENCE_AREA = newType(trans.get("FlightDataType.TYPE_REFERENCE_AREA"), UnitGroup.UNITS_AREA, 101);
149         
150
151         ////  Orientation
152         //// Vertical orientation (zenith)
153         public static final FlightDataType TYPE_ORIENTATION_THETA = newType(trans.get("FlightDataType.TYPE_ORIENTATION_THETA"), UnitGroup.UNITS_ANGLE, 106);
154         //// Lateral orientation (azimuth)
155         public static final FlightDataType TYPE_ORIENTATION_PHI = newType(trans.get("FlightDataType.TYPE_ORIENTATION_PHI"), UnitGroup.UNITS_ANGLE, 107);
156         
157
158         ////  Atmospheric conditions
159         //// Wind velocity
160         public static final FlightDataType TYPE_WIND_VELOCITY = newType(trans.get("FlightDataType.TYPE_WIND_VELOCITY"), UnitGroup.UNITS_VELOCITY, 110);
161         //// Air temperature
162         public static final FlightDataType TYPE_AIR_TEMPERATURE = newType(trans.get("FlightDataType.TYPE_AIR_TEMPERATURE"), UnitGroup.UNITS_TEMPERATURE, 111);
163         //// Air pressure
164         public static final FlightDataType TYPE_AIR_PRESSURE = newType(trans.get("FlightDataType.TYPE_AIR_PRESSURE"), UnitGroup.UNITS_PRESSURE, 112);
165         //// Speed of sound
166         public static final FlightDataType TYPE_SPEED_OF_SOUND = newType(trans.get("FlightDataType.TYPE_SPEED_OF_SOUND"), UnitGroup.UNITS_VELOCITY, 113);
167         
168
169         ////  Simulation information
170         //// Simulation time step
171         public static final FlightDataType TYPE_TIME_STEP = newType(trans.get("FlightDataType.TYPE_TIME_STEP"), UnitGroup.UNITS_TIME_STEP, 200);
172         //// Computation time
173         public static final FlightDataType TYPE_COMPUTATION_TIME = newType(trans.get("FlightDataType.TYPE_COMPUTATION_TIME"), UnitGroup.UNITS_SHORT_TIME, 201);
174         
175         
176
177         /**
178          * Return a {@link FlightDataType} based on a string description.  This returns known data types
179          * if possible, or a new type otherwise.
180          * 
181          * @param s             the string description of the type.
182          * @param u             the unit group the new type should belong to if a new group is created.
183          * @return              a data type.
184          */
185         public static synchronized FlightDataType getType(String s, UnitGroup u) {
186                 FlightDataType type = EXISTING_TYPES.get(s.toLowerCase());
187                 if (type != null) {
188                         return type;
189                 }
190                 type = newType(s, u, DEFAULT_PRIORITY);
191                 return type;
192         }
193         
194         /**
195          * Used while initializing the class.
196          */
197         private static synchronized FlightDataType newType(String s, UnitGroup u, int priority) {
198                 FlightDataType type = new FlightDataType(s, u, priority);
199                 EXISTING_TYPES.put(s.toLowerCase(), type);
200                 return type;
201         }
202         
203         
204         private final String name;
205         private final UnitGroup units;
206         private final int priority;
207         private final int hashCode;
208         
209         
210         private FlightDataType(String typeName, UnitGroup units, int priority) {
211                 if (typeName == null)
212                         throw new IllegalArgumentException("typeName is null");
213                 if (units == null)
214                         throw new IllegalArgumentException("units is null");
215                 this.name = typeName;
216                 this.units = units;
217                 this.priority = priority;
218                 this.hashCode = this.name.toLowerCase().hashCode();
219         }
220         
221         
222
223
224         public String getName() {
225                 return name;
226         }
227         
228         public UnitGroup getUnitGroup() {
229                 return units;
230         }
231         
232         @Override
233         public String toString() {
234                 return name;
235         }
236         
237         @Override
238         public boolean equals(Object other) {
239                 if (!(other instanceof FlightDataType))
240                         return false;
241                 return this.name.equalsIgnoreCase(((FlightDataType) other).name);
242         }
243         
244         @Override
245         public int hashCode() {
246                 return hashCode;
247         }
248         
249         @Override
250         public int compareTo(FlightDataType o) {
251                 if (this.priority != o.priority)
252                         return this.priority - o.priority;
253                 return this.name.compareToIgnoreCase(o.name);
254         }
255 }