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