\r
public class PiecewiseLinearFuel implements Fuel{\r
private static final Logger log = Logger.getLogger(PiecewiseLinearFuel.class);\r
- \r
- private String name;\r
- private URI uri;\r
- private Amount<VolumetricDensity> density;\r
- private float densityRatio;\r
- private float combustionEfficiency;\r
- \r
+ private static final Amount<Pressure> ZERO_PRESSURE =Amount.valueOf(0, SI.PASCAL);\r
+ private static final Amount<Velocity> ZERO_VELOCITY =Amount.valueOf(0, SI.METERS_PER_SECOND);\r
+\r
private class Entry implements Comparable<Entry>{\r
Amount<Pressure> pressure;\r
Amount<Velocity> burnRate;\r
return o.pressure.isGreaterThan(pressure)?-1:1;\r
}\r
}\r
+\r
\r
- private SortedMap<Amount<Pressure>, Entry> entries = new TreeMap<Amount<Pressure>, Entry>();\r
+ private String name = "New Linear Fuel";\r
+ private URI uri;\r
+ private double combustionEfficiency = .97;\r
+ private double densityRatio = .96;\r
+ private Amount<VolumetricDensity> density = Amount.valueOf(1889, 0, SI.KILOGRAM.divide(SI.METER.pow(3))).to(VolumetricDensity.UNIT);\r
+\r
\r
- protected void add(final Amount<Pressure> p, final Amount<Velocity> r){\r
- entries.put(p, new Entry(){{pressure = p; burnRate = r;}});\r
- }\r
+ private EditableCombustionProduct product = new EditableCombustionProduct();\r
+ private SortedMap<Amount<Pressure>, Entry> entries ;\r
\r
public PiecewiseLinearFuel(){\r
- add(Amount.valueOf(-1,SI.MEGA(SI.PASCAL)), Amount.valueOf(0, SI.METERS_PER_SECOND));\r
- add(Amount.valueOf(0,SI.MEGA(SI.PASCAL)), Amount.valueOf(0, SI.METERS_PER_SECOND));\r
+ clear();\r
}\r
-\r
- @Override\r
- public String getName() {\r
- return name;\r
- }\r
-\r
- @Override\r
- public URI getURI() {\r
- return uri;\r
- }\r
-\r
- @Override\r
- public Amount<VolumetricDensity> getIdealDensity() {\r
- return density;\r
+ public void add(final Amount<Pressure> p, final Amount<Velocity> r){\r
+ entries.put(p, new Entry(){{pressure = p; burnRate = r;}});\r
}\r
-\r
+ \r
@Override\r
- public Amount<Velocity> burnRate(Amount<Pressure> pressure) {\r
+ public Amount<Velocity> burnRate(final Amount<Pressure> pressure) {\r
+ if ( pressure.isLessThan(ZERO_PRESSURE) )\r
+ return ZERO_VELOCITY;\r
+ \r
+ if ( entries.size() == 1 ){\r
+ return entries.get(entries.firstKey()).burnRate;\r
+ }\r
+ \r
+ if ( entries.containsKey(pressure) ){\r
+ return entries.get(pressure).burnRate;\r
+ }\r
+ \r
Entry low = null;\r
low = entries.get(entries.headMap(pressure).lastKey());\r
Entry high = null;\r
Amount<Velocity> vdiff = high.burnRate.minus(low.burnRate);\r
Amount<Velocity> ret = low.burnRate.plus(vdiff.times(frac));\r
\r
+ if ( ret.isLessThan(ZERO_VELOCITY) )\r
+ return ZERO_VELOCITY;\r
+ \r
return ret;\r
\r
}\r
+ \r
+ public void clear(){\r
+ entries = new TreeMap<Amount<Pressure>, Entry>();\r
+ add(Amount.valueOf(0,SI.MEGA(SI.PASCAL)), Amount.valueOf(0, SI.METERS_PER_SECOND));\r
+ }\r
+ \r
+ @Override\r
+ public double getCombustionEfficiency() {\r
+ return combustionEfficiency;\r
+ }\r
+ \r
\r
+ public void setCombustionEfficiency(double combustionEfficiency) {\r
+ this.combustionEfficiency = combustionEfficiency;\r
+ }\r
+ \r
@Override\r
public CombustionProduct getCombustionProduct(){\r
- return null;\r
+ return product;\r
}\r
-\r
+ \r
@Override\r
public double getDensityRatio() {\r
return densityRatio;\r
}\r
+ \r
+ public void setDensityRatio(double densityRatio) {\r
+ this.densityRatio = densityRatio;\r
+ }\r
\r
@Override\r
- public double getCombustionEfficiency() {\r
- return combustionEfficiency;\r
+ public Amount<VolumetricDensity> getIdealDensity() {\r
+ return density;\r
+ }\r
+ \r
+ public void setIdealDensity(Amount<VolumetricDensity> density) {\r
+ this.density = density;\r
}\r
\r
+ @Override\r
+ public String getName() {\r
+ return name;\r
+ }\r
+ \r
+ public void setName(String name) {\r
+ this.name = name;\r
+ }\r
+\r
+ @Override\r
+ public URI getURI() {\r
+ return uri;\r
+ }\r
+\r
+\r
+\r
+\r
+\r
+ \r
public static void main( String args[]) throws Exception{\r
PiecewiseLinearFuel f = new PiecewiseLinearFuel();\r
- f.add(Amount.valueOf(0,SI.MEGA(SI.PASCAL)), Amount.valueOf(0, SI.METERS_PER_SECOND));\r
- f.add(Amount.valueOf(2,SI.MEGA(SI.PASCAL)), Amount.valueOf(2, SI.METERS_PER_SECOND));\r
- f.add(Amount.valueOf(4,SI.MEGA(SI.PASCAL)), Amount.valueOf(1, SI.METERS_PER_SECOND));\r
- f.add(Amount.valueOf(10,SI.MEGA(SI.PASCAL)), Amount.valueOf(3, SI.METERS_PER_SECOND));\r
- f.add(Amount.valueOf(20,SI.MEGA(SI.PASCAL)), Amount.valueOf(4, SI.METERS_PER_SECOND));\r
+ f.add(Amount.valueOf(0,SI.MEGA(SI.PASCAL)), Amount.valueOf(2, SI.METERS_PER_SECOND));\r
+ //f.add(Amount.valueOf(2,SI.MEGA(SI.PASCAL)), Amount.valueOf(2, SI.METERS_PER_SECOND));\r
+ //f.add(Amount.valueOf(4,SI.MEGA(SI.PASCAL)), Amount.valueOf(1, SI.METERS_PER_SECOND));\r
+ //f.add(Amount.valueOf(10,SI.MEGA(SI.PASCAL)), Amount.valueOf(3, SI.METERS_PER_SECOND));\r
+ //f.add(Amount.valueOf(20,SI.MEGA(SI.PASCAL)), Amount.valueOf(4, SI.METERS_PER_SECOND));\r
Chart<Pressure, Velocity> burnRate = new Chart<Pressure, Velocity>(\r
SI.MEGA(SI.PASCAL),\r
SI.METERS_PER_SECOND,\r