import org.jscience.physics.amount.Amount;\r
import org.jscience.physics.amount.Constants;\r
\r
+import com.billkuker.rocketry.motorsim.fuel.KNSB;\r
import com.billkuker.rocketry.motorsim.fuel.KNSU;\r
import com.billkuker.rocketry.motorsim.grain.CompoundGrain;\r
import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
m.setFuel(new KNSU());\r
\r
CylindricalChamber c = new CylindricalChamber();\r
- c.setLength(Amount.valueOf(200, SI.MILLIMETER));\r
+ c.setLength(Amount.valueOf(400, SI.MILLIMETER));\r
c.setID(Amount.valueOf(30, SI.MILLIMETER));\r
m.setChamber(c);\r
\r
g2.setID(Amount.valueOf(0, SI.MILLIMETER));\r
g2.inhibit(true, false, true);\r
\r
- CompoundGrain cg = new CompoundGrain(g1, g2);\r
+ CompoundGrain cg = new CompoundGrain();\r
+ cg.add(g1);\r
+ cg.add(g2);\r
\r
- m.setGrain( new MultiGrain(cg, 2) );\r
+ //m.setGrain( new MultiGrain(cg, 2) );\r
\r
- //m.setGrain(new MultiGrain(g,2));\r
+ m.setGrain(new MultiGrain(g,4));\r
\r
//m.setGrain(new ExtrudedGrain());\r
\r
ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();\r
- n.setThroatDiameter(Amount.valueOf(8.500, SI.MILLIMETER));\r
+ n.setThroatDiameter(Amount.valueOf(5.500, SI.MILLIMETER));\r
n.setExitDiameter(Amount.valueOf(20.87, SI.MILLIMETER));\r
n.setEfficiency(.87);\r
m.setNozzle(n);\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.NonSI;\r
+import javax.measure.unit.SI;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.Fuel.CombustionProduct;\r
+import com.billkuker.rocketry.motorsim.RocketScience.MolarWeight;\r
+import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type;\r
+import com.billkuker.rocketry.motorsim.visual.Chart;\r
+import com.billkuker.rocketry.motorsim.visual.Chart.IntervalDomain;\r
+\r
+public class KNSB extends PiecewiseSaintRobertFuel {\r
+\r
+ public KNSB() {\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
+ add(Amount.valueOf( 7.03, SI.MEGA(SI.PASCAL)), 3.907, 0.535);\r
+ add(Amount.valueOf( 10.67, SI.MEGA(SI.PASCAL)), 9.653, 0.064);\r
+ }\r
+\r
+ @Override\r
+ public Amount<VolumetricDensity> idealDensity() {\r
+ return Amount.valueOf(1841, 0, SI.KILOGRAM.divide(SI.METER.pow(3))).to(VolumetricDensity.UNIT);\r
+ }\r
+\r
+ @Override\r
+ public CombustionProduct getCombustionProduct() {\r
+ return new CombustionProduct(){ //TODO THIS IS THE KNSU STUFF\r
+ \r
+ @Override\r
+ public Amount<Temperature> idealCombustionTemperature() {\r
+ return Amount.valueOf(1600, SI.KELVIN);\r
+ }\r
+ \r
+ @Override\r
+ public Amount<MolarWeight> effectiveMolarWeight() {\r
+ return Amount.valueOf("39.9 kg/kmol").to(MolarWeight.UNIT);\r
+ }\r
+ \r
+ @Override\r
+ public double ratioOfSpecificHeats() {\r
+ return 1.1361;\r
+ }\r
+ \r
+ @Override\r
+ public double ratioOfSpecificHeats2Phase() {\r
+ return 1.042;\r
+ }\r
+ };\r
+ }\r
+ \r
+ public static void main( String args[]) throws Exception{\r
+ KNSB f = new KNSB();\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
+}\r
--- /dev/null
+package com.billkuker.rocketry.motorsim.fuel;\r
+\r
+import java.util.NoSuchElementException;\r
+import java.util.SortedMap;\r
+import java.util.TreeMap;\r
+\r
+import javax.measure.quantity.Pressure;\r
+import javax.measure.quantity.VolumetricDensity;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type;\r
+\r
+public abstract class PiecewiseSaintRobertFuel extends SaintRobertFuel {\r
+\r
+ private class Entry{\r
+ double a;\r
+ double n;\r
+ }\r
+ \r
+ private SortedMap<Amount<Pressure>, Entry> entries = new TreeMap<Amount<Pressure>, Entry>();\r
+ \r
+ public PiecewiseSaintRobertFuel(Type t) {\r
+ super(t);\r
+ }\r
+ \r
+ public void add(Amount<Pressure> p, final double _a, final double _n){\r
+ entries.put(p, new Entry(){{a = _a; n = _n;}});\r
+ }\r
+\r
+ @Override\r
+ protected double burnrateCoefficient(Amount<Pressure> pressure) {\r
+ try {\r
+ Amount<Pressure> samplePressure = entries.tailMap(pressure).firstKey();\r
+ Entry e = entries.get(samplePressure);\r
+ return e.a;\r
+ } catch ( NoSuchElementException e ){\r
+ return 0;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected double burnrateExponent(Amount<Pressure> pressure) {\r
+ try {\r
+ Amount<Pressure> samplePressure = entries.tailMap(pressure).firstKey();\r
+ Entry e = entries.get(samplePressure);\r
+ return e.n;\r
+ } catch ( NoSuchElementException e ){\r
+ return 0;\r
+ }\r
+ }\r
+\r
+}\r