1 package com.billkuker.rocketry.motorsim.fuel;
\r
4 import java.net.URISyntaxException;
\r
6 import javax.measure.quantity.Pressure;
\r
7 import javax.measure.quantity.Velocity;
\r
8 import javax.measure.quantity.VolumetricDensity;
\r
9 import javax.measure.unit.NonSI;
\r
10 import javax.measure.unit.Unit;
\r
12 import org.jscience.physics.amount.Amount;
\r
14 import com.billkuker.rocketry.motorsim.Fuel;
\r
15 import com.billkuker.rocketry.motorsim.RocketScience;
\r
17 public abstract class SaintRobertFuel implements Fuel {
\r
21 javax.measure.unit.SI.MILLIMETER.divide(javax.measure.unit.SI.SECOND).asType(Velocity.class),
\r
22 javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL).asType(Pressure.class)),
\r
24 NonSI.INCH.divide(javax.measure.unit.SI.SECOND).asType(Velocity.class),
\r
28 private final Unit<Velocity> v;
\r
29 private final Unit<Pressure> p;
\r
31 Type( Unit<Velocity> v, Unit<Pressure> p){
\r
37 private Type t = Type.SI;
\r
39 public SaintRobertFuel(Type t){
\r
41 throw new IllegalArgumentException("Type must be non-null");
\r
45 public Type getType(){
\r
49 protected void setType(final Type t){
\r
53 public Amount<Velocity> burnRate(Amount<Pressure> pressure) {
\r
56 double p = pressure.doubleValue(getType().p);
\r
57 double a = burnrateCoefficient(pressure);
\r
58 double n = burnrateExponent(pressure);
\r
60 return burnrateConstant().plus(Amount.valueOf( a*Math.pow(p,n), getType().v ));
\r
63 protected abstract double burnrateCoefficient(Amount<Pressure> pressure);
\r
65 protected abstract double burnrateExponent(Amount<Pressure> pressure);
\r
67 protected Amount<Velocity> burnrateConstant(){
\r
68 return Amount.valueOf(0, Velocity.UNIT);
\r
71 public abstract Amount<VolumetricDensity> getIdealDensity();
\r
73 public URI getURI(){
\r
75 return new URI("motorsim:" + this.getClass().getSimpleName());
\r
76 } catch (URISyntaxException e) {
\r
77 throw new Error("Shouldn't happen", e);
\r
81 public String getName(){
\r
82 return this.getClass().getSimpleName();
\r
85 public String toString(){
\r