fixed approx
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / RocketScience.java
1 package com.billkuker.rocketry.motorsim;\r
2 \r
3 import java.text.DecimalFormat;\r
4 import java.util.HashSet;\r
5 import java.util.Set;\r
6 \r
7 import javax.measure.quantity.Pressure;\r
8 import javax.measure.quantity.Quantity;\r
9 import javax.measure.unit.NonSI;\r
10 import javax.measure.unit.ProductUnit;\r
11 import javax.measure.unit.SI;\r
12 import javax.measure.unit.Unit;\r
13 import javax.measure.unit.UnitFormat;\r
14 \r
15 import org.jscience.physics.amount.Amount;\r
16 \r
17 public class RocketScience {\r
18         public static Unit<Pressure> PSI = new ProductUnit<Pressure>(NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2)));\r
19         public static Unit<Impulse> NEWTON_SECOND = new ProductUnit<Impulse>(SI.NEWTON.times(SI.SECOND));\r
20         static{\r
21                 UnitFormat.getInstance().label(PSI, "psi");\r
22                 UnitFormat.getInstance().label(NEWTON_SECOND, "Ns");\r
23         }\r
24 \r
25         public interface MolarWeight extends Quantity {\r
26                 public static final Unit<MolarWeight> UNIT = new ProductUnit<MolarWeight>(\r
27                                 SI.KILOGRAM.divide(SI.MOLE));\r
28         }\r
29         \r
30         public interface Impulse extends Quantity {\r
31                 public static Unit<Impulse> UNIT = NEWTON_SECOND;\r
32         }\r
33 \r
34         public static enum UnitPreference{\r
35                 SI(new Unit[]{\r
36                                 javax.measure.unit.SI.MILLIMETER,\r
37                                 javax.measure.unit.SI.MILLIMETER.divide(javax.measure.unit.SI.SECOND),\r
38                                 javax.measure.unit.SI.NEWTON,\r
39                                 javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL),\r
40                                 NEWTON_SECOND\r
41                 }),\r
42                 NONSI(new Unit[]{\r
43                                 javax.measure.unit.NonSI.INCH,\r
44                                 javax.measure.unit.NonSI.POUND_FORCE,\r
45                                 javax.measure.unit.NonSI.INCH.divide(javax.measure.unit.SI.SECOND),\r
46                                 PSI,\r
47                                 NEWTON_SECOND\r
48                 });\r
49                 \r
50                 public static UnitPreference preference = SI;\r
51                 \r
52                 protected Set<Unit<?>> units = new HashSet<Unit<?>>();\r
53                 \r
54                 @SuppressWarnings("unchecked")\r
55                 UnitPreference( Unit u[] ){\r
56                         for ( Unit uu : u )\r
57                                 units.add(uu);\r
58                 }\r
59                 \r
60                 @SuppressWarnings("unchecked")\r
61                 public Unit getPreferredUnit(Unit u){\r
62                         if ( units.contains(u) )\r
63                                 return u;\r
64                         for( Unit ret : units ){\r
65                                 if ( ret.isCompatible(u) ){\r
66                                         return ret;\r
67                                 }\r
68                         }\r
69                         return u;\r
70                 }\r
71         }\r
72 \r
73         @SuppressWarnings("unchecked")\r
74         public static <T extends Quantity> String approx(Amount<T> a) {\r
75                 if (a == null)\r
76                         return "NULL";\r
77                 Unit<T> u = RocketScience.UnitPreference.preference.getPreferredUnit(a\r
78                                 .getUnit());\r
79                 double d = a.doubleValue(u);\r
80 \r
81                 DecimalFormat df;\r
82 \r
83                 if (Math.abs(d) < 10.0) {\r
84                         df = new DecimalFormat("#.##");\r
85                 } else if (Math.abs(d) < 100.0) {\r
86                         df = new DecimalFormat("#.#");\r
87                 } else {\r
88                         df = new DecimalFormat("#");\r
89                 }\r
90 \r
91                 return df.format(d) + " " + u.toString();\r
92         }\r
93 \r
94 }\r