From 43b17c6eab3bf2065e965276abfe464714183ee3 Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Wed, 22 Mar 2023 16:26:22 -0600 Subject: [PATCH 1/2] Consider points along fin root when calculating fin geometry --- .../sf/openrocket/aerodynamics/barrowman/FinSetCalc.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java b/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java index 326c73a0d..6708e645f 100644 --- a/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java +++ b/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java @@ -235,9 +235,9 @@ public class FinSetCalc extends RocketComponentCalc { finArea = component.getPlanformArea(); ar = 2 * pow2(span) / finArea; + // Check geometry; don't consider points along fin root for this + // (doing so will cause spurious jagged fin warnings) Coordinate[] points = component.getFinPoints(); - - // Check geometry geometryWarnings.clear(); boolean down = false; for (int i = 1; i < points.length; i++) { @@ -259,8 +259,9 @@ public class FinSetCalc extends RocketComponentCalc { geometryWarnings.add(Warning.THICK_FIN, component.toString()); } - // Calculate the chord lead and trail positions and length - + // Calculate the chord lead and trail positions and length. We do need the points + // along the root for this + points = component.getFinPointsWithRoot(); Arrays.fill(chordLead, Double.POSITIVE_INFINITY); Arrays.fill(chordTrail, Double.NEGATIVE_INFINITY); Arrays.fill(chordLength, 0); From 77d2a5cd5736fae240f5bd6831a4dd0c029a525a Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Thu, 23 Mar 2023 20:11:28 -0600 Subject: [PATCH 2/2] Add unit test --- .../rocketcomponent/FreeformFinSetTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java b/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java index f048a9282..c2c347f08 100644 --- a/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java +++ b/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java @@ -1557,4 +1557,49 @@ public class FreeformFinSetTest extends BaseTestCase { } } + /** + * Test that fins on transitions don't get NaN MAClength + */ + @Test + public void testFinsOnTransitions() { + // Rocket consisting of just a transition and a freeform fin set + final Rocket rocket = new Rocket(); + + final AxialStage stage = new AxialStage(); + rocket.addChild(stage); + + Transition trans = new Transition(); + stage.addChild(trans); + + FreeformFinSet fins = new FreeformFinSet(); + trans.addChild(fins); + + // set the finset at the beginning of the transition + fins.setAxialMethod(AxialMethod.TOP); + fins.setAxialOffset(0.0); + + // Test 1: transition getting smaller + trans.setForeRadius(trans.getForeRadius()*2.0); + fins.setPoints(new Coordinate[] { + new Coordinate(0, 0), + new Coordinate(trans.getLength(), 0), + new Coordinate(trans.getLength(), trans.getAftRadius() - trans.getForeRadius()) + }); + FinSetCalc calc = new FinSetCalc(fins); + + assertEquals(0.075, calc.getMACLength(), EPSILON); + + // Test 2: transition getting larger + trans.setForeRadius(trans.getAftRadius()); + trans.setAftRadius(trans.getAftRadius()*2.0); + fins.setPoints(new Coordinate[] { + new Coordinate(0, 0), + new Coordinate(0, trans.getAftRadius() - trans.getForeRadius()), + new Coordinate(trans.getLength(), trans.getAftRadius() - trans.getForeRadius()) + }); + calc = new FinSetCalc(fins); + + assertEquals(0.05053191489361704, calc.getMACLength(), EPSILON); + } + }