c17f47100b5da744aa11a7d2c6d589ba6c3101cb
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / RocketScience.java
1 package com.billkuker.rocketry.motorsim;\r
2 \r
3 import java.util.HashSet;\r
4 import java.util.Set;\r
5 \r
6 import javax.measure.quantity.Pressure;\r
7 import javax.measure.quantity.Quantity;\r
8 import javax.measure.unit.NonSI;\r
9 import javax.measure.unit.ProductUnit;\r
10 import javax.measure.unit.SI;\r
11 import javax.measure.unit.Unit;\r
12 import javax.measure.unit.UnitFormat;\r
13 \r
14 public class RocketScience {\r
15         public static Unit<Pressure> PSI = new ProductUnit<Pressure>(NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2)));\r
16         public static Unit<Impulse> NEWTON_SECOND = new ProductUnit<Impulse>(SI.NEWTON.times(SI.SECOND));\r
17         static{\r
18                 UnitFormat.getInstance().label(PSI, "psi");\r
19                 UnitFormat.getInstance().label(NEWTON_SECOND, "Ns");\r
20         }\r
21 \r
22         public interface MolarWeight extends Quantity {\r
23                 public static final Unit<MolarWeight> UNIT = new ProductUnit<MolarWeight>(\r
24                                 SI.KILOGRAM.divide(SI.MOLE));\r
25         }\r
26         \r
27         public interface Impulse extends Quantity {\r
28                 public static Unit<Impulse> UNIT = NEWTON_SECOND;\r
29         }\r
30 \r
31         public static enum UnitPreference{\r
32                 SI(new Unit[]{\r
33                                 javax.measure.unit.SI.MILLIMETER,\r
34                                 javax.measure.unit.SI.MILLIMETER.divide(javax.measure.unit.SI.SECOND),\r
35                                 javax.measure.unit.SI.NEWTON,\r
36                                 javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL),\r
37                                 NEWTON_SECOND\r
38                 }),\r
39                 NONSI(new Unit[]{\r
40                                 javax.measure.unit.NonSI.INCH,\r
41                                 javax.measure.unit.NonSI.POUND_FORCE,\r
42                                 javax.measure.unit.NonSI.INCH.divide(javax.measure.unit.SI.SECOND),\r
43                                 PSI,\r
44                                 NEWTON_SECOND\r
45                 });\r
46                 \r
47                 public static UnitPreference preference = SI;\r
48                 \r
49                 protected Set<Unit<?>> units = new HashSet<Unit<?>>();\r
50                 \r
51                 @SuppressWarnings("unchecked")\r
52                 UnitPreference( Unit u[] ){\r
53                         for ( Unit uu : u )\r
54                                 units.add(uu);\r
55                 }\r
56                 \r
57                 @SuppressWarnings("unchecked")\r
58                 public Unit getPreferredUnit(Unit u){\r
59                         if ( units.contains(u) )\r
60                                 return u;\r
61                         for( Unit ret : units ){\r
62                                 if ( ret.isCompatible(u) ){\r
63                                         return ret;\r
64                                 }\r
65                         }\r
66                         return u;\r
67                 }\r
68         }\r
69 \r
70 }\r