(no commit message)
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / fuel / PiecewiseSaintRobertFuel.java
1 package com.billkuker.rocketry.motorsim.fuel;\r
2 \r
3 import java.util.NoSuchElementException;\r
4 import java.util.SortedMap;\r
5 import java.util.TreeMap;\r
6 \r
7 import javax.measure.quantity.Pressure;\r
8 \r
9 import org.apache.log4j.Logger;\r
10 import org.jscience.physics.amount.Amount;\r
11 \r
12 public abstract class PiecewiseSaintRobertFuel extends SaintRobertFuel {\r
13         \r
14         private static final Logger log = Logger.getLogger(PiecewiseSaintRobertFuel.class);\r
15 \r
16         private class Entry{\r
17                 double a;\r
18                 double n;\r
19         }\r
20         \r
21         private SortedMap<Amount<Pressure>, Entry> entries = new TreeMap<Amount<Pressure>, Entry>();\r
22         \r
23         protected PiecewiseSaintRobertFuel(Type t) {\r
24                 super(t);\r
25         }\r
26         \r
27         protected void add(Amount<Pressure> p, final double _a, final double _n){\r
28                 entries.put(p, new Entry(){{a = _a; n = _n;}});\r
29         }\r
30         \r
31         protected void clear(){\r
32                 entries.clear();\r
33         }\r
34 \r
35         @Override\r
36         protected double burnrateCoefficient(Amount<Pressure> pressure) {\r
37                 try {\r
38                         Amount<Pressure> samplePressure = entries.tailMap(pressure).firstKey();\r
39                         Entry e = entries.get(samplePressure);\r
40                         return e.a;\r
41                 } catch ( NoSuchElementException e ){\r
42                         log.warn("Pressure " + pressure + " is outside of expiermental range for " + this.getClass().getSimpleName());\r
43                         try {\r
44                                 return entries.get(entries.lastKey()).a;\r
45                         } catch ( NoSuchElementException ee ){\r
46                                 log.error("No data to return!");\r
47                                 return 0;\r
48                         }\r
49                 }\r
50         }\r
51 \r
52         @Override\r
53         protected double burnrateExponent(Amount<Pressure> pressure) {\r
54                 try {\r
55                         Amount<Pressure> samplePressure = entries.tailMap(pressure).firstKey();\r
56                         Entry e = entries.get(samplePressure);\r
57                         return e.n;\r
58                 } catch ( NoSuchElementException e ){\r
59                         log.warn("Pressure " + pressure + " is outside of expiermental range for " + this.getClass().getSimpleName());\r
60                         try{\r
61                                 return entries.get(entries.lastKey()).n;\r
62                         } catch ( NoSuchElementException ee ){\r
63                                 log.error("No data to return!");\r
64                                 return 0;\r
65                         }\r
66                 }\r
67         }\r
68 \r
69 }\r