16612275387695724c640155f88c19a7e7afc2f9
[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 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                 this.t = t;\r
38         }\r
39         \r
40         protected Type getType(){\r
41                 return t;\r
42         }\r
43         \r
44         protected void setType(final Type t){\r
45                 this.t = t;\r
46         }\r
47 \r
48         public Amount<Velocity> burnRate(Amount<Pressure> pressure) {\r
49 \r
50                 \r
51                 double p = pressure.doubleValue(getType().p);\r
52                 double a = burnrateCoefficient(pressure);\r
53                 double n = burnrateExponent(pressure);\r
54                 \r
55                 return burnrateConstant().plus(Amount.valueOf( a*Math.pow(p,n), getType().v ));\r
56         }\r
57         \r
58         protected abstract double burnrateCoefficient(Amount<Pressure> pressure);\r
59         \r
60         protected abstract double burnrateExponent(Amount<Pressure> pressure);\r
61         \r
62         protected Amount<Velocity> burnrateConstant(){\r
63                 return Amount.valueOf(0, Velocity.UNIT);\r
64         }\r
65 \r
66         public abstract Amount<VolumetricDensity> getIdealDensity();\r
67 \r
68         public String getName(){\r
69                 return this.getClass().getSimpleName();\r
70         }\r
71 }\r