import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
import com.billkuker.rocketry.motorsim.grain.ExtrudedGrain;\r
import com.billkuker.rocketry.motorsim.grain.GrainPanel;\r
+import com.billkuker.rocketry.motorsim.grain.MultiGrain;\r
import com.billkuker.rocketry.motorsim.visual.Chart;\r
\r
public class Burn {\r
m.setFuel(new KNSU());\r
\r
CylindricalChamber c = new CylindricalChamber();\r
- c.setLength(Amount.valueOf(100, SI.MILLIMETER));\r
+ c.setLength(Amount.valueOf(200, SI.MILLIMETER));\r
c.setID(Amount.valueOf(30, SI.MILLIMETER));\r
m.setChamber(c);\r
\r
g.setID(Amount.valueOf(10, SI.MILLIMETER));\r
m.setGrain(g);\r
\r
+ m.setGrain(new MultiGrain(g,2));\r
+ \r
//m.setGrain(new ExtrudedGrain());\r
\r
ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();\r
- n.setThroatDiameter(Amount.valueOf(6.600, SI.MILLIMETER));\r
+ n.setThroatDiameter(Amount.valueOf(8.500, SI.MILLIMETER));\r
n.setExitDiameter(Amount.valueOf(20.87, SI.MILLIMETER));\r
n.setEfficiency(.87);\r
m.setNozzle(n);\r
\r
public interface Grain {\r
\r
- public interface Graphical extends Grain{\r
- public java.awt.geom.Area getCrossSection(Amount<Length> regression);\r
- public java.awt.geom.Area getSideView(Amount<Length> regression);\r
- }\r
+ \r
+ public java.awt.geom.Area getCrossSection(Amount<Length> regression);\r
+ public java.awt.geom.Area getSideView(Amount<Length> regression);\r
\r
public interface DiscreteRegression{\r
public Amount<Length> optimalRegressionStep();\r
import com.billkuker.rocketry.motorsim.validation.Validating;\r
import com.billkuker.rocketry.motorsim.validation.ValidationException;\r
\r
-public class CoredCylindricalGrain implements Grain, Validating, Grain.Graphical {\r
+public class CoredCylindricalGrain implements Grain, Validating {\r
\r
private Amount<Length> length, oD, iD;\r
private boolean oInh = true, iInh = false, eInh = false;\r
import com.billkuker.rocketry.motorsim.Grain;\r
import com.billkuker.rocketry.motorsim.visual.Chart;\r
\r
-public class ExtrudedGrain implements Grain, Grain.Graphical {\r
+public class ExtrudedGrain implements Grain {\r
\r
Set<Shape> plus = new HashSet<Shape>();\r
\r
\r
JPanel left = new JPanel(new BorderLayout());\r
\r
- if ( grain instanceof Grain.Graphical){\r
- add(xc = new XC((Grain.Graphical)grain), BorderLayout.CENTER);\r
- left.add(xc);\r
- }\r
+ add(xc = new XC(grain), BorderLayout.CENTER);\r
+ left.add(xc);\r
+\r
left.add(l, BorderLayout.NORTH);\r
left.add( sl = new SL(), BorderLayout.SOUTH);\r
\r
\r
private class XC extends JPanel{\r
private static final long serialVersionUID = 1L;\r
- Grain.Graphical grain;\r
- public XC(Grain.Graphical g){\r
+ Grain grain;\r
+ public XC(Grain g){\r
setMinimumSize(new Dimension(440,250));\r
grain = g;\r
}\r
--- /dev/null
+package com.billkuker.rocketry.motorsim.grain;\r
+\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Rectangle2D;\r
+\r
+import javax.measure.quantity.Area;\r
+import javax.measure.quantity.Length;\r
+import javax.measure.quantity.Volume;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.Grain;\r
+\r
+public class MultiGrain implements Grain {\r
+ \r
+ private Grain grain;\r
+ private int count;\r
+ \r
+ public MultiGrain( Grain g, int c ){\r
+ grain = g;\r
+ count = c;\r
+ }\r
+\r
+ public Amount<Area> surfaceArea(Amount<Length> regression) {\r
+ return grain.surfaceArea(regression).times(count);\r
+ }\r
+\r
+ public Amount<Volume> volume(Amount<Length> regression) {\r
+ return grain.volume(regression).times(count);\r
+ }\r
+\r
+ public Amount<Length> webThickness() {\r
+ return grain.webThickness();\r
+ }\r
+\r
+ public java.awt.geom.Area getCrossSection(Amount<Length> regression) {\r
+ return grain.getCrossSection(regression);\r
+ }\r
+\r
+ public java.awt.geom.Area getSideView(Amount<Length> regression) {\r
+ java.awt.geom.Area ret = new java.awt.geom.Area();\r
+ java.awt.geom.Area g = grain.getSideView(regression);\r
+ Rectangle2D b = g.getBounds2D();\r
+ for ( int i = 0 ; i < count ; i++ ){\r
+ ret.add(g);\r
+ ret.transform(AffineTransform.getTranslateInstance(b.getWidth() + 10, 0));\r
+ }\r
+ return ret;\r
+ }\r
+\r
+}\r