Added motor rating, Impulse quantity
authorBill Kuker <bkuker@billkuker.com>
Fri, 17 Apr 2009 13:04:16 +0000 (13:04 +0000)
committerBill Kuker <bkuker@billkuker.com>
Fri, 17 Apr 2009 13:04:16 +0000 (13:04 +0000)
src/com/billkuker/rocketry/motorsim/RocketScience.java
src/com/billkuker/rocketry/motorsim/visual/BurnPanel.java

index 03009236daedbfb22e7870dc8e105669732fa1f4..e52c049572777ce0c7c2d7e041fa48e61d7c6ff2 100644 (file)
@@ -6,11 +6,16 @@ import javax.measure.unit.SI;
 import javax.measure.unit.Unit;\r
 \r
 public class RocketScience {\r
+       public static Unit<Impulse> NEWTON_SECOND = new ProductUnit<Impulse>(SI.NEWTON.times(SI.SECOND));\r
 \r
        public interface MolarWeight extends Quantity {\r
                public static final Unit<MolarWeight> UNIT = new ProductUnit<MolarWeight>(\r
                                SI.KILOGRAM.divide(SI.MOLE));\r
        }\r
        \r
+       public interface Impulse extends Quantity {\r
+               public static Unit<Impulse> UNIT = NEWTON_SECOND;\r
+       }\r
+\r
 \r
 }\r
index 0e8eeb16d4ef2cae3f014e4973054daa95646e65..1bf938c9e5790405daa5b6d1b18ff8344cfe7498 100644 (file)
@@ -1,6 +1,8 @@
 package com.billkuker.rocketry.motorsim.visual;\r
 \r
 import java.awt.BorderLayout;\r
+import java.awt.Dimension;\r
+import java.awt.GridLayout;\r
 import java.text.NumberFormat;\r
 \r
 import javax.measure.quantity.Duration;\r
@@ -10,6 +12,7 @@ import javax.measure.quantity.Velocity;
 import javax.measure.unit.NonSI;\r
 import javax.measure.unit.SI;\r
 import javax.swing.JFrame;\r
+import javax.swing.JLabel;\r
 import javax.swing.JPanel;\r
 import javax.swing.JSlider;\r
 import javax.swing.JSplitPane;\r
@@ -20,6 +23,8 @@ import javax.swing.event.ChangeListener;
 import org.jscience.physics.amount.Amount;\r
 \r
 import com.billkuker.rocketry.motorsim.Burn;\r
+import com.billkuker.rocketry.motorsim.RocketScience;\r
+import com.billkuker.rocketry.motorsim.Burn.Interval;\r
 \r
 public class BurnPanel extends JPanel {\r
        private static final long serialVersionUID = 1L;\r
@@ -73,6 +78,9 @@ public class BurnPanel extends JPanel {
                        grains.setResizeWeight(.5);\r
                        \r
                        JSplitPane main = new JSplitPane(JSplitPane.VERTICAL_SPLIT, grains, tp);\r
+                       Dimension minimumSize = new Dimension(800, 200);\r
+                       grains.setMinimumSize(minimumSize);\r
+                       tp.setMinimumSize(minimumSize);\r
                        main.setDividerLocation(.5);\r
                        main.setResizeWeight(.5);\r
                        \r
@@ -80,6 +88,48 @@ public class BurnPanel extends JPanel {
                        \r
                        add( new SL(), BorderLayout.SOUTH);\r
                        \r
+                       \r
+\r
+                               Amount<RocketScience.Impulse> ns = Amount.valueOf(0, RocketScience.NEWTON_SECOND);\r
+                               Amount<Force> averageThrust = Amount.valueOf(0, SI.NEWTON);\r
+                               Amount<Force> maxThrust = Amount.valueOf(0, SI.NEWTON);\r
+                               Amount<Pressure> maxPressure = Amount.valueOf(0, SI.MEGA(SI.PASCAL));\r
+                               int thrustCount = 0;\r
+                               \r
+                               for( Interval i: burn.getData().values() ){\r
+                                       ns = ns.plus(i.dt.times(i.thrust));\r
+                                       if ( i.thrust.isGreaterThan(Amount.valueOf(0.01, SI.NEWTON))){\r
+                                               thrustCount++;\r
+                                               averageThrust = averageThrust.plus(i.thrust);\r
+                                       }\r
+                                       if ( i.thrust.isGreaterThan(maxThrust))\r
+                                               maxThrust = i.thrust;\r
+                                       if ( i.chamberPressure.isGreaterThan(maxPressure))\r
+                                               maxPressure = i.chamberPressure;\r
+                               }\r
+                               averageThrust = averageThrust.divide(thrustCount);\r
+\r
+                               int cn = (int)(Math.log(ns.doubleValue(RocketScience.NEWTON_SECOND)/1.25) / Math.log(2));\r
+                               char cl = (char)((int)'A' + cn);\r
+\r
+                       \r
+                       JPanel text = new JPanel(new GridLayout(2,5));\r
+\r
+                       text.add(new JLabel("Rating"));\r
+                       text.add(new JLabel("Total Impulse"));\r
+                       text.add(new JLabel("Max Thrust"));\r
+                       text.add(new JLabel("Average Thust"));\r
+                       text.add(new JLabel("Max Pressure"));\r
+                       \r
+                       text.add(new JLabel(new String(new char[]{cl}) + "-" +Math.round(averageThrust.doubleValue(SI.NEWTON))));\r
+                       text.add(new JLabel(approx(ns)));\r
+                       text.add(new JLabel(approx(maxThrust)));\r
+                       text.add(new JLabel(approx(averageThrust)));\r
+                       text.add(new JLabel(approx(maxPressure)));\r
+                       \r
+                       add(text, BorderLayout.NORTH);\r
+                       \r
+                       \r
                } catch (NoSuchMethodException e){\r
                        throw new Error(e);\r
                }\r
@@ -87,9 +137,15 @@ public class BurnPanel extends JPanel {
 \r
        }\r
        \r
+       private String approx(Amount a){\r
+               double d = a.doubleValue(a.getUnit());\r
+               long i = Math.round(d);\r
+               return i + " " + a.getUnit().toString();\r
+       }\r
+       \r
        private class SL extends JSlider implements ChangeListener{\r
                private static final long serialVersionUID = 1L;\r
-               private static final int STEPS = 300;\r
+               private static final int STEPS = 80;\r
                public SL(){\r
                        addChangeListener(this);\r
                        setMinimum(0);\r