Weakened references to static listener types for unit pref change and fuel change.
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / BurnSummary.java
1 package com.billkuker.rocketry.motorsim;\r
2 \r
3 import javax.measure.quantity.Dimensionless;\r
4 import javax.measure.quantity.Duration;\r
5 import javax.measure.quantity.Force;\r
6 import javax.measure.quantity.Mass;\r
7 import javax.measure.quantity.Pressure;\r
8 import javax.measure.quantity.Volume;\r
9 import javax.measure.quantity.VolumetricDensity;\r
10 import javax.measure.unit.SI;\r
11 \r
12 import org.jscience.physics.amount.Amount;\r
13 \r
14 import com.billkuker.rocketry.motorsim.Burn.Interval;\r
15 \r
16 public class BurnSummary {\r
17 \r
18         Amount<RocketScience.Impulse> ns = Amount.valueOf(0,\r
19                         RocketScience.NEWTON_SECOND);\r
20 \r
21         Amount<Duration> thrustTime = Amount.valueOf(0, SI.SECOND);\r
22         Amount<Force> maxThrust = Amount.valueOf(0, SI.NEWTON);\r
23         Amount<Pressure> maxPressure = Amount.valueOf(0, SI.MEGA(SI.PASCAL));\r
24         Amount<Duration> isp;\r
25         Amount<Mass> propellantMass;\r
26         Double saftyFactor;\r
27         \r
28         public BurnSummary(Burn b) {\r
29                 for (Interval i : b.getData().values()) {\r
30                         ns = ns.plus(i.dt.times(i.thrust));\r
31                         if (i.thrust.isGreaterThan(Amount.valueOf(0.01, SI.NEWTON))) {\r
32                                 thrustTime = thrustTime.plus(i.dt);\r
33                         }\r
34                         if (i.thrust.isGreaterThan(maxThrust))\r
35                                 maxThrust = i.thrust;\r
36                         if (i.chamberPressure.isGreaterThan(maxPressure))\r
37                                 maxPressure = i.chamberPressure;\r
38                 }\r
39                 \r
40                 isp = ns\r
41                 .divide(b\r
42                                 .getMotor()\r
43                                 .getGrain()\r
44                                 .volume(Amount.valueOf(0, SI.MILLIMETER))\r
45                                 .times(b.getMotor()\r
46                                                 .getFuel()\r
47                                                 .getIdealDensity()\r
48                                                 .times(b.getMotor().getFuel()\r
49                                                                 .getDensityRatio())))\r
50                 .to(SI.METERS_PER_SECOND)\r
51                 .divide(Amount.valueOf(9.81,\r
52                                 SI.METERS_PER_SQUARE_SECOND)).to(SI.SECOND);\r
53 \r
54                 if ( b.getMotor().getChamber().getBurstPressure() != null )\r
55                         saftyFactor = b.getMotor().getChamber().getBurstPressure().divide(maxPressure).to(Dimensionless.UNIT).doubleValue(Dimensionless.UNIT);\r
56 \r
57                 Amount<Volume> vol = b.getMotor().getGrain().volume(Amount.valueOf(0, SI.MILLIMETER));\r
58                 Amount<VolumetricDensity> ideal = b.getMotor().getFuel().getIdealDensity();\r
59                 Amount<VolumetricDensity> actual = ideal.times(b.getMotor().getFuel().getDensityRatio());\r
60                 propellantMass = vol.times(actual).to(SI.GRAM);\r
61         }\r
62 \r
63         public String getRating() {\r
64                 float cnf = (float) (Math.log(ns\r
65                                 .doubleValue(RocketScience.NEWTON_SECOND) / 1.25) / Math\r
66                                 .log(2));\r
67                 int cn = (int) cnf;\r
68                 float fraction = cnf - cn;\r
69                 int percent = (int) (100 * fraction);\r
70                 char cl = (char) ((int) 'A' + cn);\r
71                 \r
72                 return percent + "% "\r
73                 + new String(new char[] { cl }) + "-"\r
74                 + Math.round(averageThrust().doubleValue(SI.NEWTON));\r
75         }\r
76 \r
77         public Double getSaftyFactor(){\r
78                 return saftyFactor;\r
79         }\r
80         \r
81         public Amount<RocketScience.Impulse> totalImpulse() {\r
82                 return ns;\r
83         }\r
84 \r
85         public Amount<Duration> thrustTime() {\r
86                 return thrustTime;\r
87         }\r
88 \r
89         public Amount<Force> maxThrust() {\r
90                 return maxThrust;\r
91         }\r
92         \r
93         public Amount<Duration> specificImpulse(){\r
94                 return isp;\r
95         }\r
96 \r
97         public Amount<Force> averageThrust() {\r
98                 Amount<Force> averageThrust = Amount.valueOf(0, SI.NEWTON);\r
99                 if (thrustTime().isGreaterThan(Amount.valueOf(0, SI.SECOND)))\r
100                         averageThrust = totalImpulse().divide(thrustTime).to(SI.NEWTON);\r
101                 return averageThrust;\r
102         }\r
103 \r
104         public Amount<Pressure> maxPressure(){\r
105                 return maxPressure;\r
106         }\r
107         \r
108         public Amount<Mass> getPropellantMass() {\r
109                 return propellantMass;\r
110         }\r
111 \r
112 }\r