Removed URI from fuels.
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / fuel / SaintRobertFuel.java
1 package com.billkuker.rocketry.motorsim.fuel;\r
2 \r
3 import javax.measure.quantity.Pressure;\r
4 import javax.measure.quantity.Velocity;\r
5 import javax.measure.quantity.VolumetricDensity;\r
6 import javax.measure.unit.NonSI;\r
7 import javax.measure.unit.Unit;\r
8 \r
9 import org.jscience.physics.amount.Amount;\r
10 \r
11 import com.billkuker.rocketry.motorsim.Fuel;\r
12 import com.billkuker.rocketry.motorsim.RocketScience;\r
13 \r
14 public abstract class SaintRobertFuel implements Fuel {\r
15         \r
16         public static enum Type{\r
17                 SI(\r
18                                 javax.measure.unit.SI.MILLIMETER.divide(javax.measure.unit.SI.SECOND).asType(Velocity.class),\r
19                                 javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL).asType(Pressure.class)),\r
20                 NONSI(\r
21                                 NonSI.INCH.divide(javax.measure.unit.SI.SECOND).asType(Velocity.class),\r
22                                 RocketScience.PSI)\r
23                 ;\r
24                 \r
25                 private final Unit<Velocity> v;\r
26                 private final Unit<Pressure> p;\r
27                 \r
28                 Type( Unit<Velocity> v, Unit<Pressure> p){\r
29                         this.p = p;\r
30                         this.v = v;\r
31                 }\r
32         }\r
33         \r
34         private Type t = Type.SI;\r
35         \r
36         public SaintRobertFuel(Type t){\r
37                 if ( t == null )\r
38                         throw new IllegalArgumentException("Type must be non-null");\r
39                 this.t = t;\r
40         }\r
41         \r
42         public Type getType(){\r
43                 return t;\r
44         }\r
45         \r
46         protected void setType(final Type t){\r
47                 this.t = t;\r
48         }\r
49 \r
50         public Amount<Velocity> burnRate(Amount<Pressure> pressure) {\r
51 \r
52                 \r
53                 double p = pressure.doubleValue(getType().p);\r
54                 double a = burnrateCoefficient(pressure);\r
55                 double n = burnrateExponent(pressure);\r
56                 \r
57                 return burnrateConstant().plus(Amount.valueOf( a*Math.pow(p,n), getType().v ));\r
58         }\r
59         \r
60         protected abstract double burnrateCoefficient(Amount<Pressure> pressure);\r
61         \r
62         protected abstract double burnrateExponent(Amount<Pressure> pressure);\r
63         \r
64         protected Amount<Velocity> burnrateConstant(){\r
65                 return Amount.valueOf(0, Velocity.UNIT);\r
66         }\r
67 \r
68         public abstract Amount<VolumetricDensity> getIdealDensity();\r
69         \r
70         public String getName(){\r
71                 return this.getClass().getSimpleName();\r
72         }\r
73         \r
74         public String toString(){\r
75                 return getName();\r
76         }\r
77 }\r