1 package net.sf.openrocket.rocketcomponent;
3 import static org.junit.Assert.assertEquals;
4 import net.sf.openrocket.material.Material;
5 import net.sf.openrocket.util.Coordinate;
6 import net.sf.openrocket.util.BaseTestCase.BaseTestCase;
10 public class SymmetricComponentVolumeTest extends BaseTestCase {
13 public void simpleConeFilled() {
14 NoseCone nc = new NoseCone();
16 final double epsilonPercent = 0.001;
17 final double density = 2.0;
21 nc.setType( Transition.Shape.CONICAL );
23 nc.setMaterial( new Material.Bulk("test",density,true));
25 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
26 System.out.println(nc.getCG());
28 double volume = Math.PI / 3.0;
30 double mass = density * volume;
32 System.out.println( volume );
34 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
35 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
36 Coordinate cg = nc.getCG();
38 assertEquals( 0.75, cg.x, epsilonPercent * 0.75 );
39 assertEquals( mass, cg.weight, epsilonPercent * mass);
43 public void simpleConeWithShoulderFilled() {
44 NoseCone nc = new NoseCone();
46 final double epsilonPercent = 0.001;
47 final double density = 2.0;
51 nc.setType( Transition.Shape.CONICAL );
53 nc.setAftShoulderRadius(1.0);
54 nc.setAftShoulderLength(1.0);
55 nc.setAftShoulderThickness(1.0);
56 nc.setMaterial( new Material.Bulk("test",density,true));
58 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
59 System.out.println(nc.getCG());
61 double volume = Math.PI / 3.0;
64 double mass = density * volume;
66 System.out.println( volume + "\t" + mass );
68 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
69 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
70 Coordinate cg = nc.getCG();
72 assertEquals( 1.312, cg.x, epsilonPercent * 1.071 );
73 assertEquals( mass, cg.weight, epsilonPercent * mass);
77 public void simpleConeHollow() {
78 NoseCone nc = new NoseCone();
80 final double epsilonPercent = 0.001;
81 final double density = 2.0;
86 nc.setType( Transition.Shape.CONICAL );
87 nc.setMaterial( new Material.Bulk("test",density,true));
89 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
90 System.out.println(nc.getCG());
92 double volume = Math.PI / 3.0; // outer volume
94 // manually projected Thickness of 0.5 on to radius to determine
95 // the innerConeDimen. Since the outer cone is "square" (height = radius),
96 // we only need to compute this one dimension in order to compute the
97 // volume of the inner cone.
98 double innerConeDimen = 1.0 - Math.sqrt(2.0) / 2.0;
99 double innerVolume = Math.PI / 3.0 * innerConeDimen * innerConeDimen * innerConeDimen;
100 volume -= innerVolume;
102 double mass = density * volume;
104 System.out.println( volume );
106 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
107 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
108 Coordinate cg = nc.getCG();
110 assertEquals( 0.7454, cg.x, epsilonPercent * 0.7454 );
111 assertEquals( mass, cg.weight, epsilonPercent * mass);
115 public void simpleConeWithShoulderHollow() {
116 NoseCone nc = new NoseCone();
118 final double epsilonPercent = 0.001;
119 final double density = 2.0;
122 nc.setType( Transition.Shape.CONICAL );
123 nc.setAftRadius(1.0);
124 nc.setThickness(0.5);
125 nc.setAftShoulderRadius(1.0);
126 nc.setAftShoulderLength(1.0);
127 nc.setAftShoulderThickness(0.5);
128 nc.setMaterial( new Material.Bulk("test",density,true));
130 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
131 System.out.println(nc.getCG());
133 double volume = Math.PI / 3.0; // outer volume
135 // manually projected Thickness of 0.5 on to radius to determine
136 // the innerConeDimen. Since the outer cone is "square" (height = radius),
137 // we only need to compute this one dimension in order to compute the
138 // volume of the inner cone.
139 double innerConeDimen = 1.0 - Math.sqrt(2.0) / 2.0;
140 double innerVolume = Math.PI / 3.0 * innerConeDimen * innerConeDimen * innerConeDimen;
141 volume -= innerVolume;
143 volume += Math.PI - Math.PI * 0.5 * 0.5;
146 double mass = density * volume;
148 System.out.println( volume );
150 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
151 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
152 Coordinate cg = nc.getCG();
154 assertEquals( 1.2719, cg.x, epsilonPercent * 1.2719 );
155 assertEquals( mass, cg.weight, epsilonPercent * mass);
159 public void simpleTransitionFilled() {
160 Transition nc = new Transition();
162 final double epsilonPercent = 0.001;
163 final double density = 2.0;
167 nc.setType( Transition.Shape.CONICAL );
168 nc.setForeRadius(1.0);
169 nc.setAftRadius(2.0);
170 nc.setMaterial( new Material.Bulk("test",density,true));
172 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
173 System.out.println(nc.getCG());
175 double volume = Math.PI / 3.0 * (2.0*2.0 + 2.0 * 1.0 + 1.0 * 1.0) * 4.0;
177 double mass = density * volume;
179 System.out.println( volume );
181 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
182 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
183 Coordinate cg = nc.getCG();
185 assertEquals( 2.4285, cg.x, epsilonPercent * 2.4285 );
186 assertEquals( mass, cg.weight, epsilonPercent * mass);
190 public void simpleTransitionWithShouldersFilled() {
191 Transition nc = new Transition();
193 final double epsilonPercent = 0.001;
194 final double density = 2.0;
198 nc.setType( Transition.Shape.CONICAL );
199 nc.setForeRadius(1.0);
200 nc.setAftRadius(2.0);
201 nc.setAftShoulderLength(1.0);
202 nc.setAftShoulderRadius(2.0);
203 nc.setAftShoulderThickness(2.0);
204 nc.setForeShoulderLength(1.0);
205 nc.setForeShoulderRadius(1.0);
206 nc.setForeShoulderThickness(1.0);
207 nc.setMaterial( new Material.Bulk("test",density,true));
209 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
210 System.out.println(nc.getCG());
212 double volume = Math.PI / 3.0 * (2.0*2.0 + 2.0 * 1.0 + 1.0 * 1.0) * 4.0;
213 // plus aft shoulder:
214 volume += Math.PI * 1.0 * 2.0 * 2.0;
215 // plus fore shoulder:
216 volume += Math.PI * 1.0 * 1.0 * 1.0;
218 double mass = density * volume;
220 System.out.println( volume );
222 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
223 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
224 Coordinate cg = nc.getCG();
226 assertEquals( 2.8023, cg.x, epsilonPercent * 2.8023 );
227 assertEquals( mass, cg.weight, epsilonPercent * mass);
231 public void simpleTransitionHollow1() {
232 Transition nc = new Transition();
234 final double epsilonPercent = 0.001;
235 final double density = 2.0;
238 nc.setType( Transition.Shape.CONICAL );
239 nc.setForeRadius(0.5);
240 nc.setAftRadius(1.0);
241 nc.setThickness(0.5);
242 nc.setMaterial( new Material.Bulk("test",density,true));
244 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
245 System.out.println(nc.getCG());
247 // Volume of filled transition =
248 double filledVolume = Math.PI /3.0 * ( 1.0*1.0 + 1.0 * 0.5 + 0.5 * 0.5 ) * 1.0;
250 // magic 2D cad drawing...
252 // Since the thickness >= fore radius, the
253 // hollowed out portion of the transition
255 // the dimensions of this cone were determined
256 // using a 2d cad tool.
258 double innerConeRadius = 0.441;
259 double innerConeLength = 0.882;
260 double innerVolume = Math.PI /3.0 * innerConeLength * innerConeRadius * innerConeRadius;
262 double volume = filledVolume - innerVolume;
264 double mass = density * volume;
266 System.out.println( volume );
268 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
269 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
270 Coordinate cg = nc.getCG();
272 assertEquals( 0.5884, cg.x, epsilonPercent * 0.5884 );
273 assertEquals( mass, cg.weight, epsilonPercent * mass);
277 public void simpleTransitionWithShouldersHollow1() {
278 Transition nc = new Transition();
280 final double epsilonPercent = 0.001;
281 final double density = 2.0;
284 nc.setType( Transition.Shape.CONICAL );
285 nc.setForeRadius(0.5);
286 nc.setAftRadius(1.0);
287 nc.setThickness(0.5);
288 nc.setAftShoulderLength(1.0);
289 nc.setAftShoulderRadius(1.0);
290 nc.setAftShoulderThickness(0.5);
291 nc.setForeShoulderLength(1.0);
292 nc.setForeShoulderRadius(0.5);
293 nc.setForeShoulderThickness(0.5); // note this means fore shoulder is filled.
294 nc.setMaterial( new Material.Bulk("test",density,true));
296 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
297 System.out.println(nc.getCG());
299 // Volume of filled transition =
300 double filledVolume = Math.PI /3.0 * ( 1.0*1.0 + 1.0 * 0.5 + 0.5 * 0.5 ) * 1.0;
302 // magic 2D cad drawing...
304 // Since the thickness >= fore radius, the
305 // hollowed out portion of the transition
307 // the dimensions of this cone were determined
308 // using a 2d cad tool.
310 double innerConeRadius = 0.441;
311 double innerConeLength = 0.882;
312 double innerVolume = Math.PI /3.0 * innerConeLength * innerConeRadius * innerConeRadius;
314 double volume = filledVolume - innerVolume;
316 // Now add aft shoulder
317 volume += Math.PI * 1.0 * 1.0 * 1.0 - Math.PI * 1.0 * 0.5 * 0.5;
318 // Now add fore shoulder
319 volume += Math.PI * 1.0 * 0.5 * 0.5;
321 double mass = density * volume;
323 System.out.println( volume );
325 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
326 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
327 Coordinate cg = nc.getCG();
329 assertEquals( 0.8581, cg.x, epsilonPercent * 0.8581 );
330 assertEquals( mass, cg.weight, epsilonPercent * mass);
334 public void simpleTransitionHollow2() {
335 Transition nc = new Transition();
337 final double epsilonPercent = 0.001;
338 final double density = 2.0;
341 nc.setType( Transition.Shape.CONICAL );
342 nc.setForeRadius(0.5);
343 nc.setAftRadius(1.0);
344 nc.setThickness(0.25);
345 nc.setMaterial( new Material.Bulk("test",density,true));
347 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
348 System.out.println(nc.getCG());
350 // Volume of filled transition =
351 double filledVolume = Math.PI /3.0 * ( 1.0*1.0 + 1.0 * 0.5 + 0.5 * 0.5 ) * 1.0;
353 // magic 2D cad drawing...
355 // Since the thickness < fore radius, the
356 // hollowed out portion of the transition
357 // forms a transition.
358 // the dimensions of this transition were determined
359 // using a 2d cad tool.
361 double innerTransitionAftRadius = 0.7205;
362 double innerTransitionForeRadius = 0.2205;
363 double innerVolume = Math.PI /3.0 * ( innerTransitionAftRadius * innerTransitionAftRadius + innerTransitionAftRadius * innerTransitionForeRadius + innerTransitionForeRadius * innerTransitionForeRadius);
365 double volume = filledVolume - innerVolume;
367 double mass = density * volume;
369 System.out.println( volume );
371 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
372 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
373 Coordinate cg = nc.getCG();
375 assertEquals( 0.56827, cg.x, epsilonPercent * 0.56827 );
376 assertEquals( mass, cg.weight, epsilonPercent * mass);
380 public void simpleTransitionWithShouldersHollow2() {
381 Transition nc = new Transition();
383 final double epsilonPercent = 0.001;
384 final double density = 2.0;
387 nc.setType( Transition.Shape.CONICAL );
388 nc.setForeRadius(0.5);
389 nc.setAftRadius(1.0);
390 nc.setThickness(0.25);
391 nc.setAftShoulderLength(1.0);
392 nc.setAftShoulderRadius(1.0);
393 nc.setAftShoulderThickness(0.25);
394 nc.setForeShoulderLength(1.0);
395 nc.setForeShoulderRadius(0.5);
396 nc.setForeShoulderThickness(0.25);
398 nc.setMaterial( new Material.Bulk("test",density,true));
400 System.out.println( nc.getComponentVolume() + "\t" + nc.getMass());
401 System.out.println(nc.getCG());
403 // Volume of filled transition =
404 double filledVolume = Math.PI /3.0 * ( 1.0*1.0 + 1.0 * 0.5 + 0.5 * 0.5 ) * 1.0;
406 // magic 2D cad drawing...
408 // Since the thickness < fore radius, the
409 // hollowed out portion of the transition
410 // forms a transition.
411 // the dimensions of this transition were determined
412 // using a 2d cad tool.
414 double innerTransitionAftRadius = 0.7205;
415 double innerTransitionForeRadius = 0.2205;
416 double innerVolume = Math.PI /3.0 * ( innerTransitionAftRadius * innerTransitionAftRadius + innerTransitionAftRadius * innerTransitionForeRadius + innerTransitionForeRadius * innerTransitionForeRadius);
418 double volume = filledVolume - innerVolume;
420 // now add aft shoulder
421 volume += Math.PI * 1.0 * 1.0 * 1.0 - Math.PI * 1.0 * 0.75 * 0.75;
422 // now add fore shoulder
423 volume += Math.PI * 1.0 * 0.5 * 0.5 - Math.PI * 1.0 * 0.25 * 0.25;
426 double mass = density * volume;
428 System.out.println( volume );
430 assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume);
431 assertEquals( mass, nc.getMass(), epsilonPercent * mass );
432 Coordinate cg = nc.getCG();
434 assertEquals( 0.7829, cg.x, epsilonPercent * 0.7829 );
435 assertEquals( mass, cg.weight, epsilonPercent * mass);