From: Bill Kuker Date: Mon, 13 Apr 2009 12:20:27 +0000 (+0000) Subject: New fuel type X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=02d7cb233b200b4dab60302538d412028456bda9;p=sw%2Fmotorsim New fuel type --- diff --git a/src/com/billkuker/rocketry/motorsim/Burn.java b/src/com/billkuker/rocketry/motorsim/Burn.java index 64f8b53..e2ea10d 100644 --- a/src/com/billkuker/rocketry/motorsim/Burn.java +++ b/src/com/billkuker/rocketry/motorsim/Burn.java @@ -23,6 +23,7 @@ import org.apache.log4j.Logger; import org.jscience.physics.amount.Amount; import org.jscience.physics.amount.Constants; +import com.billkuker.rocketry.motorsim.fuel.KNSB; import com.billkuker.rocketry.motorsim.fuel.KNSU; import com.billkuker.rocketry.motorsim.grain.CompoundGrain; import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain; @@ -219,7 +220,7 @@ public class Burn { m.setFuel(new KNSU()); CylindricalChamber c = new CylindricalChamber(); - c.setLength(Amount.valueOf(200, SI.MILLIMETER)); + c.setLength(Amount.valueOf(400, SI.MILLIMETER)); c.setID(Amount.valueOf(30, SI.MILLIMETER)); m.setChamber(c); @@ -241,16 +242,18 @@ public class Burn { g2.setID(Amount.valueOf(0, SI.MILLIMETER)); g2.inhibit(true, false, true); - CompoundGrain cg = new CompoundGrain(g1, g2); + CompoundGrain cg = new CompoundGrain(); + cg.add(g1); + cg.add(g2); - m.setGrain( new MultiGrain(cg, 2) ); + //m.setGrain( new MultiGrain(cg, 2) ); - //m.setGrain(new MultiGrain(g,2)); + m.setGrain(new MultiGrain(g,4)); //m.setGrain(new ExtrudedGrain()); ConvergentDivergentNozzle n = new ConvergentDivergentNozzle(); - n.setThroatDiameter(Amount.valueOf(8.500, SI.MILLIMETER)); + n.setThroatDiameter(Amount.valueOf(5.500, SI.MILLIMETER)); n.setExitDiameter(Amount.valueOf(20.87, SI.MILLIMETER)); n.setEfficiency(.87); m.setNozzle(n); diff --git a/src/com/billkuker/rocketry/motorsim/fuel/KNSB.java b/src/com/billkuker/rocketry/motorsim/fuel/KNSB.java new file mode 100644 index 0000000..0f0ed52 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/fuel/KNSB.java @@ -0,0 +1,78 @@ +package com.billkuker.rocketry.motorsim.fuel; + +import javax.measure.quantity.Pressure; +import javax.measure.quantity.Temperature; +import javax.measure.quantity.Velocity; +import javax.measure.quantity.VolumetricDensity; +import javax.measure.unit.NonSI; +import javax.measure.unit.SI; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Fuel.CombustionProduct; +import com.billkuker.rocketry.motorsim.RocketScience.MolarWeight; +import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type; +import com.billkuker.rocketry.motorsim.visual.Chart; +import com.billkuker.rocketry.motorsim.visual.Chart.IntervalDomain; + +public class KNSB extends PiecewiseSaintRobertFuel { + + public KNSB() { + super(SaintRobertFuel.Type.Si); + add(Amount.valueOf( .807, SI.MEGA(SI.PASCAL)), 10.71, 0.625); + add(Amount.valueOf( 1.5, SI.MEGA(SI.PASCAL)), 8.763, -0.314); + add(Amount.valueOf( 3.79, SI.MEGA(SI.PASCAL)), 7.852, -0.013); + add(Amount.valueOf( 7.03, SI.MEGA(SI.PASCAL)), 3.907, 0.535); + add(Amount.valueOf( 10.67, SI.MEGA(SI.PASCAL)), 9.653, 0.064); + } + + @Override + public Amount idealDensity() { + return Amount.valueOf(1841, 0, SI.KILOGRAM.divide(SI.METER.pow(3))).to(VolumetricDensity.UNIT); + } + + @Override + public CombustionProduct getCombustionProduct() { + return new CombustionProduct(){ //TODO THIS IS THE KNSU STUFF + + @Override + public Amount idealCombustionTemperature() { + return Amount.valueOf(1600, SI.KELVIN); + } + + @Override + public Amount effectiveMolarWeight() { + return Amount.valueOf("39.9 kg/kmol").to(MolarWeight.UNIT); + } + + @Override + public double ratioOfSpecificHeats() { + return 1.1361; + } + + @Override + public double ratioOfSpecificHeats2Phase() { + return 1.042; + } + }; + } + + public static void main( String args[]) throws Exception{ + KNSB f = new KNSB(); + + Chart burnRate = new Chart( + SI.MEGA(SI.PASCAL), + SI.METERS_PER_SECOND, + f, + "burnRate"); + burnRate.setDomain( + burnRate.new IntervalDomain( + Amount.valueOf(0, SI.MEGA(SI.PASCAL)), + Amount.valueOf(11, SI.MEGA(SI.PASCAL)), + 20 + )); + + burnRate.show(); + } + +} diff --git a/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseSaintRobertFuel.java b/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseSaintRobertFuel.java new file mode 100644 index 0000000..8ff4837 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseSaintRobertFuel.java @@ -0,0 +1,53 @@ +package com.billkuker.rocketry.motorsim.fuel; + +import java.util.NoSuchElementException; +import java.util.SortedMap; +import java.util.TreeMap; + +import javax.measure.quantity.Pressure; +import javax.measure.quantity.VolumetricDensity; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type; + +public abstract class PiecewiseSaintRobertFuel extends SaintRobertFuel { + + private class Entry{ + double a; + double n; + } + + private SortedMap, Entry> entries = new TreeMap, Entry>(); + + public PiecewiseSaintRobertFuel(Type t) { + super(t); + } + + public void add(Amount p, final double _a, final double _n){ + entries.put(p, new Entry(){{a = _a; n = _n;}}); + } + + @Override + protected double burnrateCoefficient(Amount pressure) { + try { + Amount samplePressure = entries.tailMap(pressure).firstKey(); + Entry e = entries.get(samplePressure); + return e.a; + } catch ( NoSuchElementException e ){ + return 0; + } + } + + @Override + protected double burnrateExponent(Amount pressure) { + try { + Amount samplePressure = entries.tailMap(pressure).firstKey(); + Entry e = entries.get(samplePressure); + return e.n; + } catch ( NoSuchElementException e ){ + return 0; + } + } + +}