\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
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
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
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
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
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
}\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
\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
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
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
* 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
--- /dev/null
+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