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