Cache was not threadsafe
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / grain / CompoundGrain.java
1 package com.billkuker.rocketry.motorsim.grain;\r
2 \r
3 import java.awt.geom.Area;\r
4 import java.beans.PropertyChangeListener;\r
5 import java.util.HashSet;\r
6 import java.util.Set;\r
7 \r
8 import javax.measure.quantity.Length;\r
9 import javax.measure.quantity.Volume;\r
10 import javax.measure.unit.SI;\r
11 \r
12 import org.jscience.physics.amount.Amount;\r
13 \r
14 import com.billkuker.rocketry.motorsim.Grain;\r
15 import com.billkuker.rocketry.motorsim.MotorPart;\r
16 \r
17 public class CompoundGrain extends MotorPart implements Grain {\r
18         \r
19         private Set<Grain> grains = new HashSet<Grain>();\r
20         \r
21         public CompoundGrain(){\r
22 \r
23         }\r
24         \r
25         public void add( Grain g ){\r
26                 grains.add(g);\r
27         }\r
28         \r
29         public void addPropertyChangeListener(PropertyChangeListener listener) {\r
30                 for ( Grain g : grains )\r
31                         if ( g instanceof MotorPart )\r
32                                 ((MotorPart)g).addPropertyChangeListener(listener);\r
33         }\r
34 \r
35         public void removePropertyChangeListener(PropertyChangeListener listener) {\r
36                 for ( Grain g : grains )\r
37                         if ( g instanceof MotorPart )\r
38                                 ((MotorPart)g).removePropertyChangeListener(listener);\r
39         }\r
40 \r
41         public Area getCrossSection(Amount<Length> regression) {\r
42                 Area a = new Area();\r
43                 for ( Grain g : grains )\r
44                         a.add( g.getCrossSection(regression) );\r
45                 return a;\r
46         }\r
47 \r
48         public Area getSideView(Amount<Length> regression) {\r
49                 Area a = new Area();\r
50                 for ( Grain g : grains )\r
51                         a.add( g.getSideView(regression) );\r
52                 return a;\r
53         }\r
54 \r
55         public Amount<javax.measure.quantity.Area> surfaceArea(\r
56                         Amount<Length> regression) {\r
57                 Amount<javax.measure.quantity.Area> a = Amount.valueOf(0, SI.SQUARE_METRE);\r
58                 for ( Grain g : grains )\r
59                         a = a.plus(g.surfaceArea(regression));\r
60                 return a;\r
61         }\r
62 \r
63         public Amount<Volume> volume(Amount<Length> regression) {\r
64                 Amount<Volume> v = Amount.valueOf(0, SI.CUBIC_METRE);\r
65                 for ( Grain g : grains )\r
66                         v = v.plus(g.volume(regression));\r
67                 return v;\r
68         }\r
69 \r
70         public Amount<Length> webThickness() {\r
71                 Amount<Length> l = Amount.valueOf(0, SI.MILLIMETER);\r
72                 for ( Grain g : grains ){\r
73                         Amount<Length> gl = g.webThickness();\r
74                         if ( gl.isGreaterThan(l) )\r
75                                 l = gl;\r
76                 }\r
77                 return l;\r
78         }\r
79 \r
80 }\r