From 677791f871582a33d9f85f7a5b0cd3582d73b342 Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Tue, 9 Nov 2010 13:18:20 +0000 Subject: [PATCH] Made editable combustion product an object of it's own. First version of piecewise linear fuel --- .../visual/workbench/SRFuelEditor.java | 2 +- .../fuel/EditableCombustionProduct.java | 41 ++++++ .../rocketry/motorsim/fuel/EditableFuel.java | 35 ----- .../motorsim/fuel/PiecewiseLinearFuel.java | 127 ++++++++++++++++++ 4 files changed, 169 insertions(+), 36 deletions(-) create mode 100644 src/com/billkuker/rocketry/motorsim/fuel/EditableCombustionProduct.java create mode 100644 src/com/billkuker/rocketry/motorsim/fuel/PiecewiseLinearFuel.java diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java index 05b18ea..6856da7 100644 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java +++ b/gui/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java @@ -31,7 +31,7 @@ import org.jscience.physics.amount.Amount; import com.billkuker.rocketry.motorsim.Fuel; import com.billkuker.rocketry.motorsim.RocketScience; -import com.billkuker.rocketry.motorsim.fuel.EditableFuel.EditableCombustionProduct; +import com.billkuker.rocketry.motorsim.fuel.EditableCombustionProduct; import com.billkuker.rocketry.motorsim.fuel.PiecewiseSaintRobertFuel; import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel; import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type; diff --git a/src/com/billkuker/rocketry/motorsim/fuel/EditableCombustionProduct.java b/src/com/billkuker/rocketry/motorsim/fuel/EditableCombustionProduct.java new file mode 100644 index 0000000..eb938f0 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/fuel/EditableCombustionProduct.java @@ -0,0 +1,41 @@ +package com.billkuker.rocketry.motorsim.fuel; + +import javax.measure.quantity.Temperature; +import javax.measure.unit.SI; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Fuel; +import com.billkuker.rocketry.motorsim.RocketScience.MolarWeight; + +public class EditableCombustionProduct implements Fuel.CombustionProduct{ + private Amount effectiveMolarWeight = Amount.valueOf("41.98 kg/kmol").to(MolarWeight.UNIT);; + private Amount idealCombustionTemperature = Amount.valueOf(1720, SI.KELVIN);; + private double ratioOfSpecificHeats = 1.133; + private double ratioOfSpecificHeats2Phase = 1.044; + public Amount getEffectiveMolarWeight() { + return effectiveMolarWeight; + } + public void setEffectiveMolarWeight(Amount effectiveMolarWeight) { + this.effectiveMolarWeight = effectiveMolarWeight; + } + public Amount getIdealCombustionTemperature() { + return idealCombustionTemperature; + } + public void setIdealCombustionTemperature( + Amount idealCombustionTemperature) { + this.idealCombustionTemperature = idealCombustionTemperature; + } + public double getRatioOfSpecificHeats() { + return ratioOfSpecificHeats; + } + public void setRatioOfSpecificHeats(double ratioOfSpecificHeats) { + this.ratioOfSpecificHeats = ratioOfSpecificHeats; + } + public double getRatioOfSpecificHeats2Phase() { + return ratioOfSpecificHeats2Phase; + } + public void setRatioOfSpecificHeats2Phase(double ratioOfSpecificHeats2Phase) { + this.ratioOfSpecificHeats2Phase = ratioOfSpecificHeats2Phase; + } +} \ No newline at end of file diff --git a/src/com/billkuker/rocketry/motorsim/fuel/EditableFuel.java b/src/com/billkuker/rocketry/motorsim/fuel/EditableFuel.java index 834b4dd..4973903 100644 --- a/src/com/billkuker/rocketry/motorsim/fuel/EditableFuel.java +++ b/src/com/billkuker/rocketry/motorsim/fuel/EditableFuel.java @@ -1,14 +1,11 @@ package com.billkuker.rocketry.motorsim.fuel; import javax.measure.quantity.Pressure; -import javax.measure.quantity.Temperature; import javax.measure.quantity.VolumetricDensity; import javax.measure.unit.SI; import org.jscience.physics.amount.Amount; -import com.billkuker.rocketry.motorsim.Fuel; -import com.billkuker.rocketry.motorsim.RocketScience.MolarWeight; //TODO Implement MotorPart public class EditableFuel extends SaintRobertFuel { @@ -21,38 +18,6 @@ public class EditableFuel extends SaintRobertFuel { CombustionProduct combustionProduct = new EditableCombustionProduct(); private SaintRobertFuel.Type type = SaintRobertFuel.Type.NONSI; - public static class EditableCombustionProduct implements Fuel.CombustionProduct{ - private Amount effectiveMolarWeight = Amount.valueOf("41.98 kg/kmol").to(MolarWeight.UNIT);; - private Amount idealCombustionTemperature = Amount.valueOf(1720, SI.KELVIN);; - private double ratioOfSpecificHeats = 1.133; - private double ratioOfSpecificHeats2Phase = 1.044; - public Amount getEffectiveMolarWeight() { - return effectiveMolarWeight; - } - public void setEffectiveMolarWeight(Amount effectiveMolarWeight) { - this.effectiveMolarWeight = effectiveMolarWeight; - } - public Amount getIdealCombustionTemperature() { - return idealCombustionTemperature; - } - public void setIdealCombustionTemperature( - Amount idealCombustionTemperature) { - this.idealCombustionTemperature = idealCombustionTemperature; - } - public double getRatioOfSpecificHeats() { - return ratioOfSpecificHeats; - } - public void setRatioOfSpecificHeats(double ratioOfSpecificHeats) { - this.ratioOfSpecificHeats = ratioOfSpecificHeats; - } - public double getRatioOfSpecificHeats2Phase() { - return ratioOfSpecificHeats2Phase; - } - public void setRatioOfSpecificHeats2Phase(double ratioOfSpecificHeats2Phase) { - this.ratioOfSpecificHeats2Phase = ratioOfSpecificHeats2Phase; - } - } - public EditableFuel() { super(SaintRobertFuel.Type.NONSI); } diff --git a/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseLinearFuel.java b/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseLinearFuel.java new file mode 100644 index 0000000..890f821 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseLinearFuel.java @@ -0,0 +1,127 @@ +package com.billkuker.rocketry.motorsim.fuel; + +import java.net.URI; +import java.util.NoSuchElementException; +import java.util.SortedMap; +import java.util.TreeMap; + + +import javax.measure.quantity.Dimensionless; +import javax.measure.quantity.Pressure; +import javax.measure.quantity.Velocity; +import javax.measure.quantity.VolumetricDensity; +import javax.measure.unit.SI; + +import org.apache.log4j.Logger; +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Fuel; +import com.billkuker.rocketry.motorsim.visual.Chart; + +public class PiecewiseLinearFuel implements Fuel{ + private static final Logger log = Logger.getLogger(PiecewiseLinearFuel.class); + + private String name; + private URI uri; + private Amount density; + private float densityRatio; + private float combustionEfficiency; + + private class Entry implements Comparable{ + Amount pressure; + Amount burnRate; + @Override + public int compareTo(Entry o) { + if ( o.pressure.approximates(pressure) ) + return 0; + return o.pressure.isGreaterThan(pressure)?-1:1; + } + } + + private SortedMap, Entry> entries = new TreeMap, Entry>(); + + protected void add(final Amount p, final Amount r){ + entries.put(p, new Entry(){{pressure = p; burnRate = r;}}); + } + + public PiecewiseLinearFuel(){ + add(Amount.valueOf(-1,SI.MEGA(SI.PASCAL)), Amount.valueOf(0, SI.METERS_PER_SECOND)); + add(Amount.valueOf(0,SI.MEGA(SI.PASCAL)), Amount.valueOf(0, SI.METERS_PER_SECOND)); + } + + @Override + public String getName() { + return name; + } + + @Override + public URI getURI() { + return uri; + } + + @Override + public Amount getIdealDensity() { + return density; + } + + @Override + public Amount burnRate(Amount pressure) { + Entry low = null; + low = entries.get(entries.headMap(pressure).lastKey()); + Entry high = null; + try { + high = entries.get(entries.tailMap(pressure).firstKey()); + } catch ( NoSuchElementException e ){ + log.warn("Pressure " + pressure + " is outside of expiermental range for " + this.getName()); + high = low; + low = entries.get(entries.headMap(low.pressure).lastKey()); + } + + Amount lowToHigh = high.pressure.minus(low.pressure); + Amount lowToTarget = pressure.minus(low.pressure); + Amount frac = lowToTarget.divide(lowToHigh).to(Dimensionless.UNIT); + + Amount vdiff = high.burnRate.minus(low.burnRate); + Amount ret = low.burnRate.plus(vdiff.times(frac)); + + return ret; + + } + + @Override + public CombustionProduct getCombustionProduct(){ + return null; + } + + @Override + public double getDensityRatio() { + return densityRatio; + } + + @Override + public double getCombustionEfficiency() { + return combustionEfficiency; + } + + public static void main( String args[]) throws Exception{ + PiecewiseLinearFuel f = new PiecewiseLinearFuel(); + f.add(Amount.valueOf(0,SI.MEGA(SI.PASCAL)), Amount.valueOf(0, SI.METERS_PER_SECOND)); + f.add(Amount.valueOf(2,SI.MEGA(SI.PASCAL)), Amount.valueOf(2, SI.METERS_PER_SECOND)); + f.add(Amount.valueOf(4,SI.MEGA(SI.PASCAL)), Amount.valueOf(1, SI.METERS_PER_SECOND)); + f.add(Amount.valueOf(10,SI.MEGA(SI.PASCAL)), Amount.valueOf(3, SI.METERS_PER_SECOND)); + f.add(Amount.valueOf(20,SI.MEGA(SI.PASCAL)), Amount.valueOf(4, SI.METERS_PER_SECOND)); + 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)), + 200 + )); + + burnRate.show(); + } +} -- 2.47.2