]> git.gag.com Git - sw/motorsim/commitdiff
Some performance increases
authorBill Kuker <bkuker@billkuker.com>
Tue, 21 Apr 2009 20:02:28 +0000 (20:02 +0000)
committerBill Kuker <bkuker@billkuker.com>
Tue, 21 Apr 2009 20:02:28 +0000 (20:02 +0000)
src/com/billkuker/rocketry/motorsim/Burn.java
src/com/billkuker/rocketry/motorsim/grain/BurningShape.java
src/com/billkuker/rocketry/motorsim/grain/RotatedShapeGrain.java
src/com/billkuker/rocketry/motorsim/grain/ShapeUtil.java
src/com/billkuker/rocketry/motorsim/motors/kuker/RotatedTest.java [new file with mode: 0644]

index a037881753f90489810827c2bd4edad89807eaaf..03bf47c04cf0be1abb21b719b7a0d39b404c2e7d 100644 (file)
@@ -104,16 +104,16 @@ public class Burn {
                        \r
                        next.time = prev.time.plus(dt);\r
                        \r
-                       log.debug("Vold: " + motor.getGrain().volume(prev.regression).to(SI.MILLIMETER.pow(3)));\r
+                       //log.debug("Vold: " + motor.getGrain().volume(prev.regression).to(SI.MILLIMETER.pow(3)));\r
                        \r
-                       log.debug("Vnew: " + motor.getGrain().volume(next.regression).to(SI.MILLIMETER.pow(3)));\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
-                       log.info("Volume Burnt: " + volumeBurnt.to(SI.MILLIMETER.pow(3)));\r
+                       //log.info("Volume Burnt: " + volumeBurnt.to(SI.MILLIMETER.pow(3)));\r
                        \r
                        Amount<MassFlowRate> mGenRate = volumeBurnt.times(motor.getFuel().getIdealDensity().times(motor.getFuel().getDensityRatio())).divide(dt).to(MassFlowRate.UNIT);\r
-                       log.debug("Mass Gen Rate: " + mGenRate);\r
+                       //log.debug("Mass Gen Rate: " + mGenRate);\r
                        \r
                        //Calculate specific gas constant\r
                        Amount specificGasConstant = Constants.R.divide(motor.getFuel().getCombustionProduct().getEffectiveMolarWeight());\r
@@ -128,18 +128,18 @@ public class Burn {
                        Amount<MassFlowRate> mNozzle;\r
                        {\r
                                Amount<Pressure> pDiff = prev.chamberPressure.minus(atmosphereicPressure);\r
-                               log.debug("Pdiff: " + pDiff);\r
+                               //log.debug("Pdiff: " + pDiff);\r
                                Amount<Area> aStar = motor.getNozzle().throatArea();\r
                                double k = motor.getFuel().getCombustionProduct().getRatioOfSpecificHeats();\r
                                double kSide = Math.sqrt(k) * Math.pow((2/(k+1)) , (((k+1)/2)/(k-1)));\r
                                Amount sqrtPart = specificGasConstant.times(chamberTemp).sqrt();\r
                                mNozzle = pDiff.times(aStar).times(kSide).divide(sqrtPart).to(MassFlowRate.UNIT);\r
-                               log.debug("Mass Exit Rate: " + mNozzle.to(MassFlowRate.UNIT));          \r
+                               //log.debug("Mass Exit Rate: " + mNozzle.to(MassFlowRate.UNIT));                \r
                        }\r
                        \r
                        Amount<MassFlowRate> massStorageRate = mGenRate.minus(mNozzle);\r
                        \r
-                       log.debug("Mass Storage Rate: " + massStorageRate);\r
+                       //log.debug("Mass Storage Rate: " + massStorageRate);\r
 \r
                        next.chamberProduct = prev.chamberProduct.plus(massStorageRate.times(dt));\r
                        \r
@@ -147,7 +147,7 @@ public class Burn {
                        if ( next.chamberProduct.isLessThan(Amount.valueOf(0, SI.KILOGRAM)) )\r
                                next.chamberProduct = Amount.valueOf(0, SI.KILOGRAM);\r
                        \r
-                       log.debug("Chamber Product: " + next.chamberProduct);\r
+                       //log.debug("Chamber Product: " + next.chamberProduct);\r
                        \r
                        Amount<VolumetricDensity> combustionProductDensity = next.chamberProduct.divide(motor.getChamber().chamberVolume().minus(motor.getGrain().volume(next.regression))).to(VolumetricDensity.UNIT);\r
                        \r
index 16a176470a927cf1cc692fee43d86265bbb91ae9..34eb98bcab4b3be4722ca0f3c645fa27a3bd9187 100644 (file)
@@ -1,6 +1,7 @@
 package com.billkuker.rocketry.motorsim.grain;\r
 \r
 import java.awt.Shape;\r
+import java.awt.geom.Area;\r
 import java.awt.geom.Ellipse2D;\r
 import java.awt.geom.Rectangle2D;\r
 import java.util.HashSet;\r
@@ -28,27 +29,28 @@ public class BurningShape {
                inhibited.add(s);\r
        }\r
 \r
-       public java.awt.geom.Area getShape(Amount<Length> regression) {\r
-               java.awt.geom.Area res = getPlus(regression);\r
-               res.subtract(getMinus(regression));\r
-               return res;\r
-       }\r
-       \r
+       /*\r
+        * 9 times out of 10 we get asked for the same thing\r
+        * 2x in a row, for volume and for area\r
+        */\r
+       private Amount<Length> lastRegression = null;\r
+       private Area lastArea = null;\r
        \r
-       private java.awt.geom.Area getPlus(Amount<Length> regression) {\r
+       public java.awt.geom.Area getShape(Amount<Length> regression) {\r
+               if ( regression.equals(lastRegression) ){\r
+                       return lastArea;\r
+               }\r
+               lastRegression = regression;\r
+\r
                java.awt.geom.Area a = new java.awt.geom.Area();\r
                for (Shape s : plus)\r
                        a.add(new java.awt.geom.Area(regress(s, regression\r
                                        .doubleValue(SI.MILLIMETER), true)));\r
-               return a;\r
-       }\r
-       \r
-       private java.awt.geom.Area getMinus(Amount<Length> regression) {\r
-               java.awt.geom.Area a = new java.awt.geom.Area();\r
                for (Shape s : minus)\r
-                       a.add(new java.awt.geom.Area(regress(s, regression\r
+                       a.subtract(new java.awt.geom.Area(regress(s, regression\r
                                        .doubleValue(SI.MILLIMETER), false)));\r
-               return a;\r
+               \r
+               return lastArea = a;\r
        }\r
        \r
        private Shape regress(Shape s, double mm, boolean plus) {\r
index adab40c732fcac5d5814e885c0f2a1d805d2fb9e..b6f8f85c51f7becb665fb99fd6f03b14d49f46f8 100644 (file)
@@ -30,8 +30,8 @@ public class RotatedShapeGrain implements Grain {
                                Shape outside = new Rectangle2D.Double(0,0,15,70);\r
                                shape.add( outside );\r
                                shape.inhibit( outside );\r
-                               shape.subtract( new Rectangle2D.Double(0,0,5,70));\r
-                               shape.subtract(new Rectangle2D.Double(0, -10, 15, 10));\r
+                               shape.subtract( new Rectangle2D.Double(0,50,5,70));\r
+                               //shape.subtract(new Rectangle2D.Double(0, -10, 15, 10));\r
                                shape.subtract(new Rectangle2D.Double(0, 70, 15, 10));\r
                        } catch ( Exception e ){\r
                                throw new Error(e);\r
@@ -111,11 +111,12 @@ public class RotatedShapeGrain implements Grain {
        }\r
 \r
        public Amount<Volume> volume(Amount<Length> regression) {\r
-               Area squared = new Area(square(shape.getShape(regression)));\r
+               Shape squared = square(shape.getShape(regression));\r
                Amount<javax.measure.quantity.Area> sum = Amount.valueOf(0, SI.SQUARE_METRE);\r
-               for( Area a: ShapeUtil.separate(squared) ){\r
-                       sum = sum.plus( ShapeUtil.area(a) );\r
-               }\r
+               //for( Area a: ShapeUtil.separate(squared) ){\r
+               //      sum = sum.plus( ShapeUtil.area(a) );\r
+               //}\r
+               sum = ShapeUtil.area(squared);\r
                Amount<Volume> v = sum.times(Amount.valueOf(Math.PI, SI.MILLIMETER)).to(Volume.UNIT);\r
                return v;\r
        }\r
@@ -150,7 +151,7 @@ public class RotatedShapeGrain implements Grain {
 \r
        }\r
 \r
-       private Shape square(java.awt.geom.Area a) {\r
+       private Shape square(Shape a) {\r
                PathIterator i = a.getPathIterator(new AffineTransform(), quality.squareFlatteningError);\r
                GeneralPath cur = new GeneralPath();\r
 \r
@@ -191,7 +192,7 @@ public class RotatedShapeGrain implements Grain {
                return cur;\r
        }\r
        \r
-       private double yRotatedSurfaceArea(java.awt.geom.Area a) {\r
+       private double yRotatedSurfaceArea(Shape a) {\r
                PathIterator i = a.getPathIterator(new AffineTransform(), quality.areaFlatteningError);\r
                double x = 0, y = 0;\r
                double mx = 0, my = 0;\r
index 7b2aba37881003bdf558d1581394f22bc733736b..531d83374037beb83273498a47134654ab163cd4 100644 (file)
@@ -1,4 +1,5 @@
 package com.billkuker.rocketry.motorsim.grain;\r
+import java.awt.Shape;\r
 import java.awt.geom.AffineTransform;\r
 import java.awt.geom.GeneralPath;\r
 import java.awt.geom.PathIterator;\r
@@ -22,7 +23,7 @@ public class ShapeUtil {
         * According to http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u33.html\r
         * this algorithm works OK with holes, and it seems to (see test)\r
         */\r
-       public static Amount<Area> area(java.awt.geom.Area a) {\r
+       public static Amount<Area> area(Shape a) {\r
                //if ( !a.isSingular() )\r
                        //throw new IllegalArgumentException("Can not calculate area of non-singular shape!");\r
                PathIterator i = a.getPathIterator(new AffineTransform(), .001);\r
diff --git a/src/com/billkuker/rocketry/motorsim/motors/kuker/RotatedTest.java b/src/com/billkuker/rocketry/motorsim/motors/kuker/RotatedTest.java
new file mode 100644 (file)
index 0000000..bc8550b
--- /dev/null
@@ -0,0 +1,44 @@
+package com.billkuker.rocketry.motorsim.motors.kuker;\r
+\r
+import java.beans.PropertyVetoException;\r
+\r
+import javax.measure.unit.SI;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.Burn;\r
+import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;\r
+import com.billkuker.rocketry.motorsim.CylindricalChamber;\r
+import com.billkuker.rocketry.motorsim.Motor;\r
+import com.billkuker.rocketry.motorsim.fuel.KNSU;\r
+import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
+import com.billkuker.rocketry.motorsim.grain.MultiGrain;\r
+import com.billkuker.rocketry.motorsim.grain.RotatedShapeGrain;\r
+import com.billkuker.rocketry.motorsim.visual.BurnPanel;\r
+\r
+public class RotatedTest extends Motor {\r
+       public RotatedTest(){\r
+               setName("R-Test");\r
+               setFuel(new KNSU());\r
+               \r
+               CylindricalChamber c = new CylindricalChamber();\r
+               c.setLength(Amount.valueOf(200, SI.MILLIMETER));\r
+               c.setID(Amount.valueOf(25, SI.MILLIMETER));\r
+               setChamber(c);\r
+               \r
+       \r
+               setGrain( RotatedShapeGrain.DEFAULT_GRAIN );\r
+               \r
+               ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();\r
+               n.setThroatDiameter(Amount.valueOf(5.962, SI.MILLIMETER));\r
+               n.setExitDiameter(Amount.valueOf(13.79, SI.MILLIMETER));\r
+               n.setEfficiency(.85);\r
+               setNozzle(n);\r
+       }\r
+       \r
+       public static void main(String args[]) throws Exception{\r
+               RotatedTest m = new RotatedTest();\r
+               Burn b = new Burn(m);\r
+               new BurnPanel(b).showAsWindow();\r
+       }\r
+}\r