javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL),\r
NEWTON_SECOND\r
}),\r
- NonSI(new Unit[]{\r
+ NONSI(new Unit[]{\r
javax.measure.unit.NonSI.INCH,\r
javax.measure.unit.NonSI.POUND_FORCE,\r
PSI,\r
NEWTON_SECOND\r
});\r
\r
- public static UnitPreference preference = NonSI;\r
+ public static UnitPreference preference = NONSI;\r
\r
protected Set<Unit<?>> units = new HashSet<Unit<?>>();\r
\r
--- /dev/null
+package com.billkuker.rocketry.motorsim.fuel;\r
+\r
+import javax.measure.quantity.Pressure;\r
+import javax.measure.quantity.Temperature;\r
+import javax.measure.quantity.VolumetricDensity;\r
+import javax.measure.unit.SI;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.Fuel;\r
+import com.billkuker.rocketry.motorsim.RocketScience.MolarWeight;\r
+import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type;\r
+\r
+public class EditableFuel extends SaintRobertFuel {\r
+ private double a = 0.0665;\r
+ private double n = 0.319;\r
+ private double combustionEfficiency = .97;\r
+ private double densityRatio = .96;\r
+ private Amount<VolumetricDensity> idealDensity = Amount.valueOf(1889, 0, SI.KILOGRAM.divide(SI.METER.pow(3))).to(VolumetricDensity.UNIT);\r
+ CombustionProduct combustionProduct = new EditableCombustionProduct();\r
+ private SaintRobertFuel.Type type = SaintRobertFuel.Type.NONSI;\r
+ \r
+ public static class EditableCombustionProduct implements Fuel.CombustionProduct{\r
+ private Amount<MolarWeight> effectiveMolarWeight = Amount.valueOf("41.98 kg/kmol").to(MolarWeight.UNIT);;\r
+ private Amount<Temperature> idealCombustionTemperature = Amount.valueOf(1720, SI.KELVIN);;\r
+ private double ratioOfSpecificHeats = 1.133;\r
+ private double ratioOfSpecificHeats2Phase = 1.044;\r
+ public Amount<MolarWeight> getEffectiveMolarWeight() {\r
+ return effectiveMolarWeight;\r
+ }\r
+ public void setEffectiveMolarWeight(Amount<MolarWeight> effectiveMolarWeight) {\r
+ this.effectiveMolarWeight = effectiveMolarWeight;\r
+ }\r
+ public Amount<Temperature> getIdealCombustionTemperature() {\r
+ return idealCombustionTemperature;\r
+ }\r
+ public void setIdealCombustionTemperature(\r
+ Amount<Temperature> idealCombustionTemperature) {\r
+ this.idealCombustionTemperature = idealCombustionTemperature;\r
+ }\r
+ public double getRatioOfSpecificHeats() {\r
+ return ratioOfSpecificHeats;\r
+ }\r
+ public void setRatioOfSpecificHeats(double ratioOfSpecificHeats) {\r
+ this.ratioOfSpecificHeats = ratioOfSpecificHeats;\r
+ }\r
+ public double getRatioOfSpecificHeats2Phase() {\r
+ return ratioOfSpecificHeats2Phase;\r
+ }\r
+ public void setRatioOfSpecificHeats2Phase(double ratioOfSpecificHeats2Phase) {\r
+ this.ratioOfSpecificHeats2Phase = ratioOfSpecificHeats2Phase;\r
+ }\r
+ }\r
+ \r
+ public EditableFuel() {\r
+ super(SaintRobertFuel.Type.NONSI);\r
+ }\r
+\r
+ @Override\r
+ protected double burnrateCoefficient(Amount<Pressure> pressure) {\r
+ return a;\r
+ }\r
+\r
+ @Override\r
+ protected double burnrateExponent(Amount<Pressure> pressure) {\r
+ return n;\r
+ }\r
+\r
+\r
+ public double getA() {\r
+ return a;\r
+ }\r
+\r
+ public void setA(double a) {\r
+ this.a = a;\r
+ }\r
+\r
+ public double getCombustionEfficiency() {\r
+ return combustionEfficiency;\r
+ }\r
+\r
+ public void setCombustionEfficiency(double combustionEfficiency) {\r
+ this.combustionEfficiency = combustionEfficiency;\r
+ }\r
+\r
+ public double getDensityRatio() {\r
+ return densityRatio;\r
+ }\r
+\r
+ public void setDensityRatio(double densityRatio) {\r
+ this.densityRatio = densityRatio;\r
+ }\r
+\r
+ public Amount<VolumetricDensity> getIdealDensity() {\r
+ return idealDensity;\r
+ }\r
+\r
+ public void setIdealDensity(Amount<VolumetricDensity> idealDensity) {\r
+ this.idealDensity = idealDensity;\r
+ }\r
+\r
+ public double getN() {\r
+ return n;\r
+ }\r
+\r
+ public void setN(double n) {\r
+ this.n = n;\r
+ }\r
+\r
+ public CombustionProduct getCombustionProduct() {\r
+ return combustionProduct;\r
+ }\r
+\r
+ public void setCombustionProduct(CombustionProduct combustionProduct) {\r
+ this.combustionProduct = combustionProduct;\r
+ }\r
+\r
+ public SaintRobertFuel.Type getType() {\r
+ return type;\r
+ }\r
+\r
+ public void setType(SaintRobertFuel.Type type) {\r
+ this.type = type;\r
+ }\r
+\r
+\r
+}\r
--- /dev/null
+package com.billkuker.rocketry.motorsim.fuel;\r
+\r
+import javax.measure.quantity.Pressure;\r
+import javax.measure.quantity.Temperature;\r
+import javax.measure.quantity.Velocity;\r
+import javax.measure.quantity.VolumetricDensity;\r
+import javax.measure.unit.SI;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.RocketScience.MolarWeight;\r
+import com.billkuker.rocketry.motorsim.visual.Chart;\r
+\r
+public class KNDX extends PiecewiseSaintRobertFuel {\r
+\r
+ public KNDX() {\r
+ super(SaintRobertFuel.Type.SI);\r
+ add(Amount.valueOf( .779, SI.MEGA(SI.PASCAL)), 8.875, 0.619);\r
+ add(Amount.valueOf( 2.572, SI.MEGA(SI.PASCAL)), 7.553, -0.009);\r
+ add(Amount.valueOf( 5.93, SI.MEGA(SI.PASCAL)), 3.841, 0.688);\r
+ add(Amount.valueOf( 8.502, SI.MEGA(SI.PASCAL)), 17.20, -0.148);\r
+ add(Amount.valueOf( 11.2, SI.MEGA(SI.PASCAL)), 4.775, 0.442);\r
+ }\r
+\r
+ @Override\r
+ public Amount<VolumetricDensity> getIdealDensity() {\r
+ return Amount.valueOf(1879, 0, SI.KILOGRAM.divide(SI.METER.pow(3))).to(VolumetricDensity.UNIT);\r
+ }\r
+\r
+ public CombustionProduct getCombustionProduct() {\r
+ return new CombustionProduct(){\r
+ \r
+ public Amount<Temperature> getIdealCombustionTemperature() {\r
+ return Amount.valueOf(1710, SI.KELVIN);\r
+ }\r
+ \r
+ public Amount<MolarWeight> getEffectiveMolarWeight() {\r
+ return Amount.valueOf("42.39 kg/kmol").to(MolarWeight.UNIT);\r
+ }\r
+ \r
+ public double getRatioOfSpecificHeats() {\r
+ return 1.1308;\r
+ }\r
+ \r
+ public double getRatioOfSpecificHeats2Phase() {\r
+ return 1.043;\r
+ }\r
+ };\r
+ }\r
+ \r
+ public static void main( String args[]) throws Exception{\r
+ KNDX f = new KNDX();\r
+ \r
+ Chart<Pressure, Velocity> burnRate = new Chart<Pressure, Velocity>(\r
+ SI.MEGA(SI.PASCAL),\r
+ SI.METERS_PER_SECOND,\r
+ f,\r
+ "burnRate");\r
+ burnRate.setDomain(\r
+ burnRate.new IntervalDomain(\r
+ Amount.valueOf(0, SI.MEGA(SI.PASCAL)),\r
+ Amount.valueOf(11, SI.MEGA(SI.PASCAL)),\r
+ 20\r
+ ));\r
+ \r
+ burnRate.show();\r
+ }\r
+\r
+ public double getCombustionEfficiency() {\r
+ return .97;\r
+ }\r
+\r
+ public double getDensityRatio() {\r
+ return .96;\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.billkuker.rocketry.motorsim.fuel;\r
+\r
+import javax.measure.quantity.Pressure;\r
+import javax.measure.quantity.Temperature;\r
+import javax.measure.quantity.Velocity;\r
+import javax.measure.quantity.VolumetricDensity;\r
+import javax.measure.unit.SI;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.RocketScience.MolarWeight;\r
+import com.billkuker.rocketry.motorsim.visual.Chart;\r
+\r
+public class KNER extends SaintRobertFuel {\r
+\r
+ public KNER() {\r
+ super(SaintRobertFuel.Type.NONSI);\r
+ }\r
+ \r
+\r
+ @Override\r
+ protected double burnrateCoefficient(Amount<Pressure> pressure) {\r
+ return .0037;\r
+ }\r
+\r
+ @Override\r
+ protected double burnrateExponent(Amount<Pressure> pressure) {\r
+ return .64;\r
+ }\r
+\r
+ @Override\r
+ public Amount<VolumetricDensity> getIdealDensity() {\r
+ return Amount.valueOf(1819.9, 0, SI.KILOGRAM.divide(SI.METER.pow(3))).to(VolumetricDensity.UNIT);\r
+ }\r
+\r
+ public CombustionProduct getCombustionProduct() {\r
+ return new CombustionProduct(){\r
+ \r
+ public Amount<Temperature> getIdealCombustionTemperature() {\r
+ return Amount.valueOf(1600, SI.KELVIN);\r
+ }\r
+ \r
+ public Amount<MolarWeight> getEffectiveMolarWeight() {\r
+ return Amount.valueOf("38.78 kg/kmol").to(MolarWeight.UNIT);\r
+ }\r
+ \r
+ public double getRatioOfSpecificHeats() {\r
+ return 1.1391;\r
+ }\r
+ \r
+ public double getRatioOfSpecificHeats2Phase() {\r
+ return 1.0426;\r
+ }\r
+ };\r
+ }\r
+ \r
+ public static void main( String args[]) throws Exception{\r
+ KNER f = new KNER();\r
+ \r
+ Chart<Pressure, Velocity> burnRate = new Chart<Pressure, Velocity>(\r
+ SI.MEGA(SI.PASCAL),\r
+ SI.METERS_PER_SECOND,\r
+ f,\r
+ "burnRate");\r
+ burnRate.setDomain(\r
+ burnRate.new IntervalDomain(\r
+ Amount.valueOf(0, SI.MEGA(SI.PASCAL)),\r
+ Amount.valueOf(11, SI.MEGA(SI.PASCAL)),\r
+ 20\r
+ ));\r
+ \r
+ burnRate.show();\r
+ }\r
+\r
+ public double getCombustionEfficiency() {\r
+ return .97;\r
+ }\r
+\r
+ public double getDensityRatio() {\r
+ return .96;\r
+ }\r
+\r
+\r
+}\r
public class KNSB extends PiecewiseSaintRobertFuel {\r
\r
public KNSB() {\r
- super(SaintRobertFuel.Type.Si);\r
+ super(SaintRobertFuel.Type.SI);\r
add(Amount.valueOf( .807, SI.MEGA(SI.PASCAL)), 10.71, 0.625);\r
add(Amount.valueOf( 1.5, SI.MEGA(SI.PASCAL)), 8.763, -0.314);\r
add(Amount.valueOf( 3.79, SI.MEGA(SI.PASCAL)), 7.852, -0.013);\r
public class KNSU extends SaintRobertFuel {\r
\r
public KNSU(){\r
- super(Type.English);\r
+ super(Type.NONSI);\r
}\r
\r
//@Override \r
public abstract class SaintRobertFuel implements Fuel {\r
\r
protected enum Type{\r
- Si(\r
- SI.MILLIMETER.divide(SI.SECOND).asType(Velocity.class),\r
- SI.MEGA(SI.PASCAL).asType(Pressure.class)),\r
- English(\r
- NonSI.INCH.divide(SI.SECOND).asType(Velocity.class),\r
+ SI(\r
+ javax.measure.unit.SI.MILLIMETER.divide(javax.measure.unit.SI.SECOND).asType(Velocity.class),\r
+ javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL).asType(Pressure.class)),\r
+ NONSI(\r
+ NonSI.INCH.divide(javax.measure.unit.SI.SECOND).asType(Velocity.class),\r
RocketScience.PSI)\r
;\r
\r
}\r
}\r
\r
- private Type t = Type.Si;\r
+ private Type t = Type.SI;\r
\r
public SaintRobertFuel(Type t){\r
this.t = t;\r
}\r
+ \r
+ protected Type getType(){\r
+ return t;\r
+ }\r
\r
public Amount<Velocity> burnRate(Amount<Pressure> pressure) {\r
\r
\r
- double p = pressure.doubleValue(t.p);\r
+ double p = pressure.doubleValue(getType().p);\r
double a = burnrateCoefficient(pressure);\r
double n = burnrateExponent(pressure);\r
\r
- return burnrateConstant().plus(Amount.valueOf( a*Math.pow(p,n), t.v ));\r
+ return burnrateConstant().plus(Amount.valueOf( a*Math.pow(p,n), getType().v ));\r
}\r
\r
protected abstract double burnrateCoefficient(Amount<Pressure> pressure);\r
import com.billkuker.rocketry.motorsim.RocketScience;\r
import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;\r
import com.billkuker.rocketry.motorsim.fuel.KNSU;\r
+import com.billkuker.rocketry.motorsim.fuel.EditableFuel;\r
import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
import com.billkuker.rocketry.motorsim.grain.MultiGrain;\r
import com.billkuker.rocketry.motorsim.io.MotorIO;\r
});\r
n.addActionListener(new ActionListener(){\r
public void actionPerformed(ActionEvent arg0) {\r
- UnitPreference.preference = UnitPreference.NonSI; \r
+ UnitPreference.preference = UnitPreference.NONSI; \r
}\r
});\r
}\r