Add area
[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.text.NumberFormat;\r
5 import java.util.HashSet;\r
6 import java.util.Set;\r
7 import java.util.prefs.Preferences;\r
8 \r
9 import javax.measure.quantity.Pressure;\r
10 import javax.measure.quantity.Quantity;\r
11 import javax.measure.unit.NonSI;\r
12 import javax.measure.unit.ProductUnit;\r
13 import javax.measure.unit.SI;\r
14 import javax.measure.unit.Unit;\r
15 import javax.measure.unit.UnitFormat;\r
16 \r
17 import org.jscience.physics.amount.Amount;\r
18 \r
19 public class RocketScience {\r
20         public static Unit<Pressure> PSI = new ProductUnit<Pressure>(NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2)));\r
21         public static Unit<Impulse> NEWTON_SECOND = new ProductUnit<Impulse>(SI.NEWTON.times(SI.SECOND));\r
22         static{\r
23                 UnitFormat.getInstance().label(PSI, "psi");\r
24                 UnitFormat.getInstance().label(NEWTON_SECOND, "Ns");\r
25         }\r
26 \r
27         public interface MolarWeight extends Quantity {\r
28                 public static final Unit<MolarWeight> UNIT = new ProductUnit<MolarWeight>(\r
29                                 SI.KILOGRAM.divide(SI.MOLE));\r
30         }\r
31         \r
32         public interface Impulse extends Quantity {\r
33                 public static Unit<Impulse> UNIT = NEWTON_SECOND;\r
34         }\r
35 \r
36         public static enum UnitPreference{\r
37                 SI(new Unit[]{\r
38                                 javax.measure.unit.SI.MILLIMETER.pow(2),\r
39                                 javax.measure.unit.SI.MILLIMETER,\r
40                                 javax.measure.unit.SI.MILLIMETER.divide(javax.measure.unit.SI.SECOND),\r
41                                 javax.measure.unit.SI.NEWTON,\r
42                                 javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL),\r
43                                 NEWTON_SECOND\r
44                 }),\r
45                 NONSI(new Unit[]{\r
46                                 javax.measure.unit.NonSI.INCH.pow(2),\r
47                                 javax.measure.unit.NonSI.INCH,\r
48                                 javax.measure.unit.NonSI.POUND_FORCE,\r
49                                 javax.measure.unit.NonSI.INCH.divide(javax.measure.unit.SI.SECOND),\r
50                                 PSI,\r
51                                 NEWTON_SECOND\r
52                 });\r
53                 \r
54                 private static UnitPreference preference = SI;\r
55 \r
56                 static {\r
57                         Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);\r
58                         String p = prefs.get("PreferedUnits", "SI");\r
59                         preference = UnitPreference.valueOf(p);\r
60                 }\r
61                 \r
62                 public static UnitPreference getUnitPreference(){\r
63                         return preference;\r
64                 }\r
65                 \r
66                 public static void setUnitPreference( final UnitPreference up ){\r
67                         preference = up;\r
68                         Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);\r
69                         prefs.put("PreferedUnits", up.toString());\r
70                 }\r
71                 \r
72                 protected Set<Unit<?>> units = new HashSet<Unit<?>>();\r
73                 \r
74                 UnitPreference( Unit<?> u[] ){\r
75                         for ( Unit<?> uu : u )\r
76                                 units.add(uu);\r
77                 }\r
78                 \r
79                 @SuppressWarnings("unchecked")\r
80                 public <T extends Quantity> Unit<T> getPreferredUnit(Unit<T> u){\r
81                         if ( units.contains(u) )\r
82                                 return u;\r
83                         for( Unit<?> ret : units ){\r
84                                 if ( ret.isCompatible(u) ){\r
85                                         return (Unit<T>) ret;\r
86                                 }\r
87                         }\r
88                         return u;\r
89                 }\r
90         }\r
91 \r
92         public static <T extends Quantity> String ammountToString(Amount<T> a) {\r
93                 final NumberFormat nf = new DecimalFormat("##########.###");\r
94                 return nf.format(a.doubleValue(a.getUnit())) + " " + a.getUnit();\r
95         }\r
96         \r
97         public static <T extends Quantity> String ammountToRoundedString(Amount<T> a) {\r
98                 if (a == null)\r
99                         return "NULL";\r
100                 Unit<T> u = RocketScience.UnitPreference.preference.getPreferredUnit(a\r
101                                 .getUnit());\r
102                 double d = a.doubleValue(u);\r
103 \r
104                 DecimalFormat df;\r
105 \r
106                 if (Math.abs(d) < 10.0) {\r
107                         df = new DecimalFormat("#.##");\r
108                 } else if (Math.abs(d) < 100.0) {\r
109                         df = new DecimalFormat("#.#");\r
110                 } else {\r
111                         df = new DecimalFormat("#");\r
112                 }\r
113 \r
114                 return df.format(d) + " " + u.toString();\r
115         }\r
116 \r
117 }\r