finish making it editable
authorBill Kuker <bkuker@billkuker.com>
Thu, 11 Nov 2010 20:40:17 +0000 (20:40 +0000)
committerBill Kuker <bkuker@billkuker.com>
Thu, 11 Nov 2010 20:40:17 +0000 (20:40 +0000)
src/com/billkuker/rocketry/motorsim/fuel/PiecewiseLinearFuel.java

index 075e7b48e4d95212814dceb3c566ae86ac7a0200..fb06c3814d4d00da190a3a11eb15d0b691303284 100644 (file)
@@ -19,13 +19,9 @@ import com.billkuker.rocketry.motorsim.visual.Chart;
 \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
@@ -36,35 +32,38 @@ public class PiecewiseLinearFuel implements Fuel{
                        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
@@ -83,32 +82,77 @@ public class PiecewiseLinearFuel implements Fuel{
                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