Move burn settings into a class
authorBill Kuker <bkuker@billkuker.com>
Thu, 2 Dec 2010 01:55:49 +0000 (01:55 +0000)
committerBill Kuker <bkuker@billkuker.com>
Thu, 2 Dec 2010 01:55:49 +0000 (01:55 +0000)
src/com/billkuker/rocketry/motorsim/Burn.java

index e101d8154b7edb12858277f4d9533ac783a2fad9..a3c5ee14c13339aa2c5bfb131c81d1fc377093bf 100644 (file)
@@ -30,14 +30,58 @@ import org.jscience.physics.amount.Constants;
 import com.billkuker.rocketry.motorsim.Validating.ValidationException;\r
 \r
 public class Burn {\r
-       //Some constants to tune adaptive regression step\r
-       private static final double regStepIncreaseFactor = 1.01;\r
-       private static final double regStepDecreaseFactor = .5;\r
-       private static final Amount<Pressure> chamberPressureMaxDelta = Amount.valueOf(.5, SI.MEGA(SI.PASCAL));\r
+       private static Logger log = Logger.getLogger(Burn.class);\r
        \r
-       private static final Amount<Pressure> endPressure = Amount.valueOf(.1, RocketScience.PSI);\r
+       /**\r
+        * A class representing all the settigns one can change on a burn\r
+        * @author bkuker\r
+        */\r
+       public static class BurnSettings {\r
+               private BurnSettings(){};\r
+\r
+               public enum BurnVolumeMethod {\r
+                       DeltaVolume,\r
+                       SurfaceTimesRegression;\r
+               }\r
+               \r
+               private BurnVolumeMethod volumeMethod = BurnVolumeMethod.SurfaceTimesRegression;\r
+               private double regStepIncreaseFactor = 1.01;\r
+               private double regStepDecreaseFactor = .5;\r
+               private Amount<Pressure> chamberPressureMaxDelta = Amount.valueOf(.5, SI.MEGA(SI.PASCAL));\r
+               private Amount<Pressure> endPressure = Amount.valueOf(.1, RocketScience.PSI);\r
+               \r
+               public void setVolumeMethod(BurnVolumeMethod volumeMethod) {\r
+                       this.volumeMethod = volumeMethod;\r
+               }\r
+               public BurnVolumeMethod getVolumeMethod() {\r
+                       return volumeMethod;\r
+               }\r
+               public double getRegStepIncreaseFactor() {\r
+                       return regStepIncreaseFactor;\r
+               }\r
+               public void setRegStepIncreaseFactor(double regStepIncreaseFactor) {\r
+                       this.regStepIncreaseFactor = regStepIncreaseFactor;\r
+               }\r
+               public double getRegStepDecreaseFactor() {\r
+                       return regStepDecreaseFactor;\r
+               }\r
+               public void setRegStepDecreaseFactor(double regStepDecreaseFactor) {\r
+                       this.regStepDecreaseFactor = regStepDecreaseFactor;\r
+               }\r
+               public Amount<Pressure> getChamberPressureMaxDelta() {\r
+                       return chamberPressureMaxDelta;\r
+               }\r
+               public void setChamberPressureMaxDelta(Amount<Pressure> chamberPressureMaxDelta) {\r
+                       this.chamberPressureMaxDelta = chamberPressureMaxDelta;\r
+               }\r
+               public Amount<Pressure> getEndPressure() {\r
+                       return endPressure;\r
+               }\r
+               public void setEndPressure(Amount<Pressure> endPressure) {\r
+                       this.endPressure = endPressure;\r
+               }\r
+       }\r
        \r
-       private static Logger log = Logger.getLogger(Burn.class);\r
        protected final Motor motor;\r
        \r
        private boolean burning = false;\r
@@ -48,6 +92,10 @@ public class Burn {
                public void burnComplete();\r
        }\r
        \r
+\r
+       \r
+       public static final BurnSettings settings = new BurnSettings();\r
+       \r
        private Set<BurnProgressListener> bpls = new HashSet<Burn.BurnProgressListener>();\r
        \r
        private static final Amount<Pressure> atmosphereicPressure = Amount.valueOf(101000, SI.PASCAL);\r
@@ -125,7 +173,7 @@ public class Burn {
                step:\r
                for ( int i = 0; i < 5000; i++ ) {\r
                        assert(positive(regStep));\r
-                       regStep = regStep.times(regStepIncreaseFactor);\r
+                       regStep = regStep.times(settings.getRegStepIncreaseFactor());\r
                        \r
                        Interval prev = data.get(data.lastKey());\r
                        log.debug(prev);\r
@@ -163,8 +211,12 @@ public class Burn {
                        \r
                        //log.debug("Vnew: " + motor.getGrain().volume(next.regression).to(SI.MILLIMETER.pow(3)));\r
                        \r
-                       //TODO Amount<Volume> volumeBurnt = motor.getGrain().volume(prev.regression).minus(motor.getGrain().volume(next.regression));\r
-                       Amount<Volume> volumeBurnt = motor.getGrain().surfaceArea(prev.regression).times(regStep).to(Volume.UNIT);\r
+                       Amount<Volume> volumeBurnt;\r
+                       if ( settings.getVolumeMethod() == BurnSettings.BurnVolumeMethod.DeltaVolume ){\r
+                               volumeBurnt = motor.getGrain().volume(prev.regression).minus(motor.getGrain().volume(next.regression));\r
+                       } else {\r
+                               volumeBurnt = motor.getGrain().surfaceArea(prev.regression).times(regStep).to(Volume.UNIT);\r
+                       }\r
                        assert(positive(volumeBurnt));\r
                        //log.info("Volume Burnt: " + volumeBurnt.to(SI.MILLIMETER.pow(3)));\r
                        \r
@@ -205,7 +257,7 @@ public class Burn {
                        //Product can not go negative!\r
                        if ( !positive(next.chamberProduct) ){\r
                                log.warn("ChamberProduct Negative on step " + i + "!, Adjusting regstep down and repeating step!");\r
-                               regStep = regStep.times(regStepDecreaseFactor);\r
+                               regStep = regStep.times(settings.getRegStepDecreaseFactor());\r
                                continue step;\r
                        }\r
                        assert(positive(next.chamberProduct));\r
@@ -226,16 +278,16 @@ public class Burn {
                                        SI.PASCAL);\r
                        \r
                        Amount<Pressure> dp = next.chamberPressure.minus(prev.chamberPressure);\r
-                       if ( dp.abs().isGreaterThan(chamberPressureMaxDelta)){\r
+                       if ( dp.abs().isGreaterThan(settings.getChamberPressureMaxDelta())){\r
                                log.warn("DP " + dp + " too big!, Adjusting regstep down and repeating step!");\r
-                               regStep = regStep.times(regStepDecreaseFactor);\r
+                               regStep = regStep.times(settings.getRegStepDecreaseFactor());\r
                                continue step;\r
                        }\r
                        \r
                        next.thrust = motor.getNozzle().thrust(next.chamberPressure, atmosphereicPressure, atmosphereicPressure, motor.getFuel().getCombustionProduct().getRatioOfSpecificHeats2Phase());\r
                        assert(positive(next.thrust));\r
                        \r
-                       if ( i > 100 && next.chamberPressure.minus(atmosphereicPressure).abs().isLessThan(endPressure)){\r
+                       if ( i > 100 && next.chamberPressure.minus(atmosphereicPressure).abs().isLessThan(settings.getEndPressure())){\r
                                log.info("Pressure at ~Patm on step " + i);\r
                                endPressureSteps++;\r
                                if ( endPressureSteps > 5 )\r