From: Bill Kuker Date: Sun, 31 Oct 2010 15:56:51 +0000 (+0000) Subject: Moved burn summary math out of GUI X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=4341597f204f3fbb1a49a7ccb2347093112f602b;p=sw%2Fmotorsim Moved burn summary math out of GUI --- diff --git a/gui/com/billkuker/rocketry/motorsim/visual/BurnPanel.java b/gui/com/billkuker/rocketry/motorsim/visual/BurnPanel.java index dad56f5..29f8f1e 100644 --- a/gui/com/billkuker/rocketry/motorsim/visual/BurnPanel.java +++ b/gui/com/billkuker/rocketry/motorsim/visual/BurnPanel.java @@ -22,7 +22,7 @@ import javax.swing.event.ChangeListener; import org.jscience.physics.amount.Amount; import com.billkuker.rocketry.motorsim.Burn; -import com.billkuker.rocketry.motorsim.Burn.Interval; +import com.billkuker.rocketry.motorsim.BurnSummary; import com.billkuker.rocketry.motorsim.RocketScience; public class BurnPanel extends JPanel { @@ -95,57 +95,30 @@ public class BurnPanel extends JPanel { add( new SL(), BorderLayout.SOUTH); + + { + BurnSummary bi = new BurnSummary(burn); + JPanel text = new JPanel(new GridLayout(2, 5)); - Amount ns = Amount.valueOf(0, RocketScience.NEWTON_SECOND); - - Amount thrustTime = Amount.valueOf(0, SI.SECOND); - Amount maxThrust = Amount.valueOf(0, SI.NEWTON); - Amount maxPressure = Amount.valueOf(0, SI.MEGA(SI.PASCAL)); - - for( Interval i: burn.getData().values() ){ - ns = ns.plus(i.dt.times(i.thrust)); - if ( i.thrust.isGreaterThan(Amount.valueOf(0.01, SI.NEWTON))){ - thrustTime = thrustTime.plus(i.dt); - } - if ( i.thrust.isGreaterThan(maxThrust)) - maxThrust = i.thrust; - if ( i.chamberPressure.isGreaterThan(maxPressure)) - maxPressure = i.chamberPressure; - } - - Amount averageThrust = Amount.valueOf(0, SI.NEWTON); - if ( thrustTime.isGreaterThan(Amount.valueOf(0, SI.SECOND))) - averageThrust = ns.divide(thrustTime).to(SI.NEWTON); - - float cnf = (float)(Math.log(ns.doubleValue(RocketScience.NEWTON_SECOND)/1.25) / Math.log(2)); - int cn = (int)cnf; - float fraction = cnf - cn; - int percent = (int)(100 * fraction); - char cl = (char)((int)'A' + cn); + text.add(new JLabel("Rating")); + text.add(new JLabel("Total Impulse")); + text.add(new JLabel("ISP")); + text.add(new JLabel("Max Thrust")); + text.add(new JLabel("Average Thust")); + text.add(new JLabel("Max Pressure")); - - Amount isp = ns.divide( - b.getMotor().getGrain().volume(Amount.valueOf(0, SI.MILLIMETER)) - .times(b.getMotor().getFuel().getIdealDensity().times(b.getMotor().getFuel().getDensityRatio())) - ).to(SI.METERS_PER_SECOND).divide(Amount.valueOf(9.81, SI.METERS_PER_SQUARE_SECOND)).to(SI.SECOND); - - JPanel text = new JPanel(new GridLayout(2,5)); + text.add(new JLabel(bi.getRating())); + text.add(new JLabel(RocketScience.ammountToRoundedString(bi.totalImpulse()))); + text.add(new JLabel(RocketScience.ammountToRoundedString(bi.specificImpulse()))); + text.add(new JLabel(RocketScience + .ammountToRoundedString(bi.maxThrust()))); + text.add(new JLabel(RocketScience + .ammountToRoundedString(bi.averageThrust()))); + text.add(new JLabel(RocketScience + .ammountToRoundedString(bi.maxPressure()))); - text.add(new JLabel("Rating")); - text.add(new JLabel("Total Impulse")); - text.add(new JLabel("ISP")); - text.add(new JLabel("Max Thrust")); - text.add(new JLabel("Average Thust")); - text.add(new JLabel("Max Pressure")); - - text.add(new JLabel(percent + "% " + new String(new char[]{cl}) + "-" +Math.round(averageThrust.doubleValue(SI.NEWTON)))); - text.add(new JLabel(RocketScience.ammountToRoundedString(ns))); - text.add(new JLabel(RocketScience.ammountToRoundedString(isp))); - text.add(new JLabel(RocketScience.ammountToRoundedString(maxThrust))); - text.add(new JLabel(RocketScience.ammountToRoundedString(averageThrust))); - text.add(new JLabel(RocketScience.ammountToRoundedString(maxPressure))); - - add(text, BorderLayout.NORTH); + add(text, BorderLayout.NORTH); + } } catch (NoSuchMethodException e){ diff --git a/src/com/billkuker/rocketry/motorsim/BurnSummary.java b/src/com/billkuker/rocketry/motorsim/BurnSummary.java new file mode 100644 index 0000000..4d19a0e --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/BurnSummary.java @@ -0,0 +1,91 @@ +package com.billkuker.rocketry.motorsim; + +import javax.measure.quantity.Duration; +import javax.measure.quantity.Force; +import javax.measure.quantity.Pressure; +import javax.measure.unit.SI; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Burn.Interval; + +public class BurnSummary { + + Amount ns = Amount.valueOf(0, + RocketScience.NEWTON_SECOND); + + Amount thrustTime = Amount.valueOf(0, SI.SECOND); + Amount maxThrust = Amount.valueOf(0, SI.NEWTON); + Amount maxPressure = Amount.valueOf(0, SI.MEGA(SI.PASCAL)); + Amount isp; + + public BurnSummary(Burn b) { + for (Interval i : b.getData().values()) { + ns = ns.plus(i.dt.times(i.thrust)); + if (i.thrust.isGreaterThan(Amount.valueOf(0.01, SI.NEWTON))) { + thrustTime = thrustTime.plus(i.dt); + } + if (i.thrust.isGreaterThan(maxThrust)) + maxThrust = i.thrust; + if (i.chamberPressure.isGreaterThan(maxPressure)) + maxPressure = i.chamberPressure; + } + + isp = ns + .divide(b + .getMotor() + .getGrain() + .volume(Amount.valueOf(0, SI.MILLIMETER)) + .times(b.getMotor() + .getFuel() + .getIdealDensity() + .times(b.getMotor().getFuel() + .getDensityRatio()))) + .to(SI.METERS_PER_SECOND) + .divide(Amount.valueOf(9.81, + SI.METERS_PER_SQUARE_SECOND)).to(SI.SECOND); + + } + + public String getRating() { + float cnf = (float) (Math.log(ns + .doubleValue(RocketScience.NEWTON_SECOND) / 1.25) / Math + .log(2)); + int cn = (int) cnf; + float fraction = cnf - cn; + int percent = (int) (100 * fraction); + char cl = (char) ((int) 'A' + cn); + + return percent + "% " + + new String(new char[] { cl }) + "-" + + Math.round(averageThrust().doubleValue(SI.NEWTON)); + } + + public Amount totalImpulse() { + return ns; + } + + public Amount thrustTime() { + return thrustTime; + } + + public Amount maxThrust() { + return maxThrust; + } + + public Amount specificImpulse(){ + return isp; + } + + public Amount averageThrust() { + Amount averageThrust = Amount.valueOf(0, SI.NEWTON); + if (thrustTime().isGreaterThan(Amount.valueOf(0, SI.SECOND))) + averageThrust = totalImpulse().divide(thrustTime).to(SI.NEWTON); + return averageThrust; + } + + public Amount maxPressure(){ + return maxPressure; + } + +}