1 package com.billkuker.rocketry.motorsim;
\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.Pressure;
\r
7 import javax.measure.unit.SI;
\r
9 import org.jscience.physics.amount.Amount;
\r
11 import com.billkuker.rocketry.motorsim.Burn.Interval;
\r
13 public class BurnSummary {
\r
15 Amount<RocketScience.Impulse> ns = Amount.valueOf(0,
\r
16 RocketScience.NEWTON_SECOND);
\r
18 Amount<Duration> thrustTime = Amount.valueOf(0, SI.SECOND);
\r
19 Amount<Force> maxThrust = Amount.valueOf(0, SI.NEWTON);
\r
20 Amount<Pressure> maxPressure = Amount.valueOf(0, SI.MEGA(SI.PASCAL));
\r
21 Amount<Duration> isp;
\r
24 public BurnSummary(Burn b) {
\r
25 for (Interval i : b.getData().values()) {
\r
26 ns = ns.plus(i.dt.times(i.thrust));
\r
27 if (i.thrust.isGreaterThan(Amount.valueOf(0.01, SI.NEWTON))) {
\r
28 thrustTime = thrustTime.plus(i.dt);
\r
30 if (i.thrust.isGreaterThan(maxThrust))
\r
31 maxThrust = i.thrust;
\r
32 if (i.chamberPressure.isGreaterThan(maxPressure))
\r
33 maxPressure = i.chamberPressure;
\r
40 .volume(Amount.valueOf(0, SI.MILLIMETER))
\r
44 .times(b.getMotor().getFuel()
\r
45 .getDensityRatio())))
\r
46 .to(SI.METERS_PER_SECOND)
\r
47 .divide(Amount.valueOf(9.81,
\r
48 SI.METERS_PER_SQUARE_SECOND)).to(SI.SECOND);
\r
50 if ( b.getMotor().getChamber().burstPressure() != null )
\r
51 saftyFactor = b.getMotor().getChamber().burstPressure().divide(maxPressure).to(Dimensionless.UNIT).doubleValue(Dimensionless.UNIT);
\r
54 public String getRating() {
\r
55 float cnf = (float) (Math.log(ns
\r
56 .doubleValue(RocketScience.NEWTON_SECOND) / 1.25) / Math
\r
59 float fraction = cnf - cn;
\r
60 int percent = (int) (100 * fraction);
\r
61 char cl = (char) ((int) 'A' + cn);
\r
63 return percent + "% "
\r
64 + new String(new char[] { cl }) + "-"
\r
65 + Math.round(averageThrust().doubleValue(SI.NEWTON));
\r
68 public Double getSaftyFactor(){
\r
72 public Amount<RocketScience.Impulse> totalImpulse() {
\r
76 public Amount<Duration> thrustTime() {
\r
80 public Amount<Force> maxThrust() {
\r
84 public Amount<Duration> specificImpulse(){
\r
88 public Amount<Force> averageThrust() {
\r
89 Amount<Force> averageThrust = Amount.valueOf(0, SI.NEWTON);
\r
90 if (thrustTime().isGreaterThan(Amount.valueOf(0, SI.SECOND)))
\r
91 averageThrust = totalImpulse().divide(thrustTime).to(SI.NEWTON);
\r
92 return averageThrust;
\r
95 public Amount<Pressure> maxPressure(){
\r