From 8463c147fa0bea6074ea2747b0ce20cfd8bcd6ec Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Thu, 11 Nov 2010 20:40:17 +0000 Subject: [PATCH 1/1] finish making it editable --- .../motorsim/fuel/PiecewiseLinearFuel.java | 120 ++++++++++++------ 1 file changed, 82 insertions(+), 38 deletions(-) diff --git a/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseLinearFuel.java b/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseLinearFuel.java index 075e7b4..fb06c38 100644 --- a/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseLinearFuel.java +++ b/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseLinearFuel.java @@ -19,13 +19,9 @@ 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 static final Amount ZERO_PRESSURE =Amount.valueOf(0, SI.PASCAL); + private static final Amount ZERO_VELOCITY =Amount.valueOf(0, SI.METERS_PER_SECOND); + private class Entry implements Comparable{ Amount pressure; Amount burnRate; @@ -36,35 +32,38 @@ public class PiecewiseLinearFuel implements Fuel{ return o.pressure.isGreaterThan(pressure)?-1:1; } } + - private SortedMap, Entry> entries = new TreeMap, Entry>(); + private String name = "New Linear Fuel"; + private URI uri; + private double combustionEfficiency = .97; + private double densityRatio = .96; + private Amount density = Amount.valueOf(1889, 0, SI.KILOGRAM.divide(SI.METER.pow(3))).to(VolumetricDensity.UNIT); + - protected void add(final Amount p, final Amount r){ - entries.put(p, new Entry(){{pressure = p; burnRate = r;}}); - } + private EditableCombustionProduct product = new EditableCombustionProduct(); + private SortedMap, Entry> entries ; 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)); + clear(); } - - @Override - public String getName() { - return name; - } - - @Override - public URI getURI() { - return uri; - } - - @Override - public Amount getIdealDensity() { - return density; + public void add(final Amount p, final Amount r){ + entries.put(p, new Entry(){{pressure = p; burnRate = r;}}); } - + @Override - public Amount burnRate(Amount pressure) { + public Amount burnRate(final Amount pressure) { + if ( pressure.isLessThan(ZERO_PRESSURE) ) + return ZERO_VELOCITY; + + if ( entries.size() == 1 ){ + return entries.get(entries.firstKey()).burnRate; + } + + if ( entries.containsKey(pressure) ){ + return entries.get(pressure).burnRate; + } + Entry low = null; low = entries.get(entries.headMap(pressure).lastKey()); Entry high = null; @@ -83,32 +82,77 @@ public class PiecewiseLinearFuel implements Fuel{ Amount vdiff = high.burnRate.minus(low.burnRate); Amount ret = low.burnRate.plus(vdiff.times(frac)); + if ( ret.isLessThan(ZERO_VELOCITY) ) + return ZERO_VELOCITY; + return ret; } + + public void clear(){ + entries = new TreeMap, Entry>(); + add(Amount.valueOf(0,SI.MEGA(SI.PASCAL)), Amount.valueOf(0, SI.METERS_PER_SECOND)); + } + + @Override + public double getCombustionEfficiency() { + return combustionEfficiency; + } + + public void setCombustionEfficiency(double combustionEfficiency) { + this.combustionEfficiency = combustionEfficiency; + } + @Override public CombustionProduct getCombustionProduct(){ - return null; + return product; } - + @Override public double getDensityRatio() { return densityRatio; } + + public void setDensityRatio(double densityRatio) { + this.densityRatio = densityRatio; + } @Override - public double getCombustionEfficiency() { - return combustionEfficiency; + public Amount getIdealDensity() { + return density; + } + + public void setIdealDensity(Amount density) { + this.density = density; } + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public URI getURI() { + return uri; + } + + + + + + 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)); + f.add(Amount.valueOf(0,SI.MEGA(SI.PASCAL)), Amount.valueOf(2, 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, -- 2.30.2