From 0302130c119d9ad637e0edc0c215bd8cd757174b Mon Sep 17 00:00:00 2001 From: Kevin Ruland Date: Wed, 23 May 2012 14:23:01 +0000 Subject: [PATCH] My assessment of why IntegrationTest was failing was incorrect. After perusing the history I found that in repository revision 599, I introduced changes to the computation of Transition volume which accounted for the volume of the shoulders as well as the body of the transition. This change broke the computation of CG. This commit reverts IntegrationTest and adds some cg tests to SymmetricComponentVolumeTest which contains the values produced by the old code. A future commit will correct SymmetricComponent.getCG and all these tests will work again. --- .../net/sf/openrocket/IntegrationTest.java | 49 ++++++------ .../SymmetricComponentVolumeTest.java | 79 +++++++++++++++---- 2 files changed, 89 insertions(+), 39 deletions(-) diff --git a/core/test/net/sf/openrocket/IntegrationTest.java b/core/test/net/sf/openrocket/IntegrationTest.java index ef41c0cad..b06a6c34c 100644 --- a/core/test/net/sf/openrocket/IntegrationTest.java +++ b/core/test/net/sf/openrocket/IntegrationTest.java @@ -105,8 +105,8 @@ public class IntegrationTest extends BaseTestCase { // Compute cg+cp + altitude - checkCgCp(0.238, 0.0678, 0.320, 12.0); - checkAlt(44.2); + checkCgCp(0.248, 0.0645, 0.320, 12.0); + checkAlt(48.2); // Mass modification @@ -117,8 +117,8 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.223, 0.0778, 0.320, 12.0); - checkAlt(34.2); + checkCgCp(0.230, 0.0745, 0.320, 12.0); + checkAlt(37.2); // Non-change @@ -134,7 +134,7 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp - checkCgCp(0.223, 0.0778, 0.320, 12.0); + checkCgCp(0.230, 0.0745, 0.320, 12.0); // Aerodynamic modification @@ -156,8 +156,8 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.223, 0.0778, 0.320, 12.0); - checkAlt(34.0); + checkCgCp(0.230, 0.0745, 0.320, 12.0); + checkAlt(37.2); // Undo "Name change" change @@ -167,7 +167,7 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp - checkCgCp(0.223, 0.0778, 0.320, 12.0); + checkCgCp(0.230, 0.0745, 0.320, 12.0); // Undo "Modify mass" change @@ -177,8 +177,8 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.238, 0.0678, 0.320, 12.0); - checkAlt(44.3); + checkCgCp(0.248, 0.0645, 0.320, 12.0); + checkAlt(48.2); // Redo "Modify mass" change @@ -188,8 +188,8 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.223, 0.0778, 0.320, 12.0); - checkAlt(34.3); + checkCgCp(0.230, 0.0745, 0.320, 12.0); + checkAlt(37.2); // Mass modification @@ -200,8 +200,8 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.216, 0.0828, 0.320, 12.0); - checkAlt(30.2); + checkCgCp(0.223, 0.0795, 0.320, 12.0); + checkAlt(32.7); // Perform component movement @@ -219,8 +219,9 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.215, 0.0830, 0.320, 12.0); - checkAlt(30.2); + checkCgCp(0.221, 0.0797, 0.320, 12.0); + checkAlt(32.7); + // Modify mass without setting undo description massComponent().setComponentMass(0.020); @@ -228,8 +229,8 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.209, 0.088, 0.320, 12.0); - checkAlt(26.8); + checkCgCp(0.215, 0.0847, 0.320, 12.0); + checkAlt(29.0); // Undo "Modify mass2" change @@ -239,8 +240,8 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.215, 0.0830, 0.320, 12.0); - checkAlt(30.2); + checkCgCp(0.221, 0.0797, 0.320, 12.0); + checkAlt(32.7); // Undo "Move component" change @@ -250,8 +251,8 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.216, 0.0828, 0.320, 12.0); - checkAlt(30.4); + checkCgCp(0.223, 0.0795, 0.320, 12.0); + checkAlt(32.7); // Redo "Move component" change @@ -261,8 +262,8 @@ public class IntegrationTest extends BaseTestCase { // Check cg+cp + altitude - checkCgCp(0.215, 0.0830, 0.320, 12.0); - checkAlt(30.2); + checkCgCp(0.221, 0.0797, 0.320, 12.0); + checkAlt(32.7); } diff --git a/core/test/net/sf/openrocket/rocketcomponent/SymmetricComponentVolumeTest.java b/core/test/net/sf/openrocket/rocketcomponent/SymmetricComponentVolumeTest.java index e539a84ea..b14445486 100644 --- a/core/test/net/sf/openrocket/rocketcomponent/SymmetricComponentVolumeTest.java +++ b/core/test/net/sf/openrocket/rocketcomponent/SymmetricComponentVolumeTest.java @@ -2,6 +2,7 @@ package net.sf.openrocket.rocketcomponent; import static org.junit.Assert.assertEquals; import net.sf.openrocket.material.Material; +import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.BaseTestCase.BaseTestCase; import org.junit.Test; @@ -21,7 +22,8 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setAftRadius(1.0); nc.setMaterial( new Material.Bulk("test",density,true)); - System.out.println( nc.getComponentVolume() ); + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); double volume = Math.PI / 3.0; @@ -31,6 +33,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 0.75, cg.x, epsilonPercent * 0.75 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } @Test @@ -49,8 +55,8 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setAftShoulderThickness(1.0); nc.setMaterial( new Material.Bulk("test",density,true)); - - System.out.println( nc.getComponentVolume() + "\t" + nc.getMass() ); + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); double volume = Math.PI / 3.0; volume += Math.PI; @@ -61,6 +67,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 1.312, cg.x, epsilonPercent * 1.071 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } @Test @@ -76,8 +86,9 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setType( Transition.Shape.CONICAL ); nc.setMaterial( new Material.Bulk("test",density,true)); - System.out.println( nc.getComponentVolume() ); - + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); + double volume = Math.PI / 3.0; // outer volume // manually projected Thickness of 0.5 on to radius to determine @@ -94,6 +105,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 0.7454, cg.x, epsilonPercent * 0.7454 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } @Test @@ -112,8 +127,8 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setAftShoulderThickness(0.5); nc.setMaterial( new Material.Bulk("test",density,true)); - - System.out.println( nc.getComponentVolume() ); + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); double volume = Math.PI / 3.0; // outer volume @@ -134,6 +149,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 1.2719, cg.x, epsilonPercent * 1.2719 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } @Test @@ -150,8 +169,9 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setAftRadius(2.0); nc.setMaterial( new Material.Bulk("test",density,true)); - System.out.println( nc.getComponentVolume() ); - + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); + double volume = Math.PI / 3.0 * (2.0*2.0 + 2.0 * 1.0 + 1.0 * 1.0) * 4.0; double mass = density * volume; @@ -160,6 +180,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 2.4285, cg.x, epsilonPercent * 2.4285 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } @Test @@ -182,8 +206,9 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setForeShoulderThickness(1.0); nc.setMaterial( new Material.Bulk("test",density,true)); - System.out.println( nc.getComponentVolume() ); - + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); + double volume = Math.PI / 3.0 * (2.0*2.0 + 2.0 * 1.0 + 1.0 * 1.0) * 4.0; // plus aft shoulder: volume += Math.PI * 1.0 * 2.0 * 2.0; @@ -196,6 +221,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 2.8023, cg.x, epsilonPercent * 2.8023 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } @Test @@ -212,7 +241,8 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setThickness(0.5); nc.setMaterial( new Material.Bulk("test",density,true)); - System.out.println( nc.getComponentVolume() ); + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); // Volume of filled transition = double filledVolume = Math.PI /3.0 * ( 1.0*1.0 + 1.0 * 0.5 + 0.5 * 0.5 ) * 1.0; @@ -237,6 +267,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 0.5884, cg.x, epsilonPercent * 0.5884 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } @Test @@ -259,7 +293,8 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setForeShoulderThickness(0.5); // note this means fore shoulder is filled. nc.setMaterial( new Material.Bulk("test",density,true)); - System.out.println( nc.getComponentVolume() ); + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); // Volume of filled transition = double filledVolume = Math.PI /3.0 * ( 1.0*1.0 + 1.0 * 0.5 + 0.5 * 0.5 ) * 1.0; @@ -289,6 +324,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 0.8581, cg.x, epsilonPercent * 0.8581 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } @Test @@ -305,7 +344,8 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setThickness(0.25); nc.setMaterial( new Material.Bulk("test",density,true)); - System.out.println( nc.getComponentVolume() ); + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); // Volume of filled transition = double filledVolume = Math.PI /3.0 * ( 1.0*1.0 + 1.0 * 0.5 + 0.5 * 0.5 ) * 1.0; @@ -330,6 +370,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 0.56827, cg.x, epsilonPercent * 0.56827 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } @Test @@ -353,7 +397,8 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { nc.setMaterial( new Material.Bulk("test",density,true)); - System.out.println( nc.getComponentVolume() ); + System.out.println( nc.getComponentVolume() + "\t" + nc.getMass()); + System.out.println(nc.getCG()); // Volume of filled transition = double filledVolume = Math.PI /3.0 * ( 1.0*1.0 + 1.0 * 0.5 + 0.5 * 0.5 ) * 1.0; @@ -384,6 +429,10 @@ public class SymmetricComponentVolumeTest extends BaseTestCase { assertEquals( volume, nc.getComponentVolume(), epsilonPercent * volume); assertEquals( mass, nc.getMass(), epsilonPercent * mass ); + Coordinate cg = nc.getCG(); + + assertEquals( 0.7829, cg.x, epsilonPercent * 0.7829 ); + assertEquals( mass, cg.weight, epsilonPercent * mass); } }