From eb3a129e67363eebea86563207709b576cf91a30 Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Mon, 11 Feb 2019 15:37:21 -0700 Subject: [PATCH] Modify FinSetCalc to only produce result for one fin, to be summed in BarrowmanCalculator Modify BarrowmanCalculator to actually sum fin nonaxial forces Modify FinSetCalcTest to sum fins in test3Fin() and test4Fin() Extra bonus: if at some point we allow fins to be other than radially symmetrical, this code should still work (not tested) --- .../aerodynamics/AerodynamicForces.java | 1 - .../aerodynamics/BarrowmanCalculator.java | 35 +++++------- .../aerodynamics/barrowman/FinSetCalc.java | 13 +---- .../aerodynamics/FinSetCalcTest.java | 53 ++++++++++--------- 4 files changed, 43 insertions(+), 59 deletions(-) diff --git a/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java b/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java index 904098a9d..ff40734ca 100644 --- a/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java +++ b/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java @@ -392,7 +392,6 @@ public class AerodynamicForces implements Cloneable, Monitorable { } public AerodynamicForces merge(AerodynamicForces other) { - this.cp = cp.average(other.getCP()); this.CNa = CNa + other.getCNa(); this.CN = CN + other.getCN(); diff --git a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java index 5e7942360..4667476c8 100644 --- a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java @@ -194,27 +194,20 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { final ArrayList contextList = entry.getValue(); for(InstanceContext context: contextList ) { - // since FinSetCalc calculates forces for entire FinSet - // only consider first fin in each set (happily, - // in each instance of a PodSet or similar - // instanceable RocketComponent with childre, the - // child FinSets all start numbering with 0 - if (!(comp instanceof FinSet) || (context.instanceNumber == 0)) { - AerodynamicForces instanceForces = new AerodynamicForces().zero(); - - calcObj.calculateNonaxialForces(conditions, context.transform, instanceForces, warnings); - Coordinate cp_comp = instanceForces.getCP(); - - Coordinate cp_abs = context.transform.transform(cp_comp); - if ((comp instanceof FinSet) && (((FinSet)comp).getFinCount() > 2)) - cp_abs = cp_abs.setY(0.0).setZ(0.0); - - instanceForces.setCP(cp_abs); - double CN_instanced = instanceForces.getCN(); - instanceForces.setCm(CN_instanced * instanceForces.getCP().x / conditions.getRefLength()); - // System.err.println("instanceForces=" + instanceForces); - assemblyForces.merge(instanceForces); - } + AerodynamicForces instanceForces = new AerodynamicForces().zero(); + + calcObj.calculateNonaxialForces(conditions, context.transform, instanceForces, warnings); + Coordinate cp_comp = instanceForces.getCP(); + + Coordinate cp_abs = context.transform.transform(cp_comp); + if ((comp instanceof FinSet) && (((FinSet)comp).getFinCount() > 2)) + cp_abs = cp_abs.setY(0.0).setZ(0.0); + + instanceForces.setCP(cp_abs); + double CN_instanced = instanceForces.getCN(); + instanceForces.setCm(CN_instanced * instanceForces.getCP().x / conditions.getRefLength()); + // System.err.println("instanceForces=" + instanceForces); + assemblyForces.merge(instanceForces); } } } diff --git a/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java b/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java index 66e193de5..4e97a8300 100644 --- a/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java +++ b/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java @@ -117,18 +117,7 @@ public class FinSetCalc extends RocketComponentCalc { double angle = baseRotation + transform.getXrotation(); // Compute basic CNa without interference effects - if (finCount == 1 || finCount == 2) { - // Basic CNa from geometry - double mul = 0; - for (int i = 0; i < finCount; i++) { - mul += MathUtil.pow2(Math.sin(theta - angle)); - angle += 2 * Math.PI / finCount; - } - cna = cna1 * mul; - } else { - // Basic CNa assuming full efficiency - cna = cna1 * finCount / 2.0; - } + cna = cna1 * MathUtil.pow2(Math.sin(theta - angle)); // logger.debug("Component cna = {}", cna); diff --git a/core/test/net/sf/openrocket/aerodynamics/FinSetCalcTest.java b/core/test/net/sf/openrocket/aerodynamics/FinSetCalcTest.java index ab677fb32..bfdefe084 100644 --- a/core/test/net/sf/openrocket/aerodynamics/FinSetCalcTest.java +++ b/core/test/net/sf/openrocket/aerodynamics/FinSetCalcTest.java @@ -38,6 +38,27 @@ public class FinSetCalcTest { // } } + private AerodynamicForces sumFins(TrapezoidFinSet fins, Rocket rocket) + { + FlightConfiguration config = rocket.getSelectedConfiguration(); + FlightConditions conditions = new FlightConditions(config); + WarningSet warnings = new WarningSet(); + AerodynamicForces assemblyForces = new AerodynamicForces().zero(); + AerodynamicForces componentForces = new AerodynamicForces(); + + FinSetCalc calcObj = new FinSetCalc( fins ); + + // Need to sum forces for fins + for (Integer i = 0; i < fins.getFinCount(); i++) { + calcObj.calculateNonaxialForces(conditions, + Transformation.rotate_x(Math.PI * i / fins.getFinCount()), + componentForces, warnings); + assemblyForces.merge(componentForces); + } + + return assemblyForces; + } + @Test public void test3Fin() { Rocket rocket = TestRockets.makeEstesAlphaIII(); @@ -49,19 +70,10 @@ public class FinSetCalcTest { assertEquals(" Estes Alpha III fins have wrong tip chord:", 0.03, fins.getTipChord(), EPSILON); assertEquals(" Estes Alpha III fins have wrong sweep: ", 0.02, fins.getSweep(), EPSILON); assertEquals(" Estes Alpha III fins have wrong height: ", 0.05, fins.getHeight(), EPSILON); - - FlightConfiguration config = rocket.getSelectedConfiguration(); - Transformation transform = Transformation.IDENTITY; - FlightConditions conditions = new FlightConditions(config); - WarningSet warnings = new WarningSet(); - AerodynamicForces forces = new AerodynamicForces(); - FinSetCalc calcObj = new FinSetCalc( fins ); - - - // vvv TEST MEH! vvv - calcObj.calculateNonaxialForces(conditions, transform, forces, warnings); - // ^^^ - + + // get the forces for the three fins + AerodynamicForces forces = sumFins(fins, rocket); + double exp_cna_fins = 24.146933; double exp_cpx_fins = 0.0193484; @@ -84,18 +96,9 @@ public class FinSetCalcTest { assertEquals(" Estes Alpha III fins have wrong tip chord:", 0.03, fins.getTipChord(), EPSILON); assertEquals(" Estes Alpha III fins have wrong sweep: ", 0.02, fins.getSweep(), EPSILON); assertEquals(" Estes Alpha III fins have wrong height: ", 0.05, fins.getHeight(), EPSILON); - - FlightConfiguration config = rocket.getSelectedConfiguration(); - Transformation transform = Transformation.IDENTITY; - FlightConditions conditions = new FlightConditions(config); - WarningSet warnings = new WarningSet(); - AerodynamicForces forces = new AerodynamicForces(); - FinSetCalc calcObj = new FinSetCalc( fins ); - - - // vvv TEST MEH! vvv - calcObj.calculateNonaxialForces(conditions, transform, forces, warnings); - // ^^^ + + // get the forces for the four fins + AerodynamicForces forces = sumFins(fins, rocket); double exp_cna_fins = 32.195911; double exp_cpx_fins = 0.0193484;