From 632b48f8df7079e1095e4c36f596f67b3d06333e Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Tue, 5 Apr 2022 19:30:10 -0600 Subject: [PATCH] Create RocketComponentCalc::calculateFrictionCD() Move actual friction CD calculation code into subclasses of RocketComponentCalc() LaunchLugCalc adds so little wetted area it isn't worth bothering with, so isn't calculated (wasn't calculated before, either) TubeFinSetCalc also doesn't calculate it; that's coming next. --- .../aerodynamics/BarrowmanCalculator.java | 45 +++++++------------ .../aerodynamics/barrowman/FinSetCalc.java | 6 +++ .../aerodynamics/barrowman/LaunchLugCalc.java | 6 +++ .../barrowman/RocketComponentCalc.java | 12 ++++- .../barrowman/SymmetricComponentCalc.java | 9 +++- .../barrowman/TubeFinSetCalc.java | 6 +++ 6 files changed, 53 insertions(+), 31 deletions(-) diff --git a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java index d83d9ae83..bc1b09d29 100644 --- a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java @@ -323,7 +323,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { * @return friction drag for entire rocket */ private double calculateFrictionCD(FlightConfiguration configuration, FlightConditions conditions, - Map map, WarningSet set) { + Map map, WarningSet warningSet) { double mach = conditions.getMach(); double Re = calculateReynoldsNumber(configuration, conditions); @@ -341,8 +341,8 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { * for thickness as we go on. */ - double finFriction = 0; - double bodyFriction = 0; + double finFrictionCD = 0; + double bodyFrictionCD = 0; double maxR = 0, minX = Double.MAX_VALUE, maxX = 0; double[] roughnessLimited = new double[Finish.values().length]; @@ -351,8 +351,11 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { final InstanceMap imap = configuration.getActiveInstances(); for(Map.Entry> entry: imap.entrySet() ) { final RocketComponent c = entry.getKey(); - - //Handle Overriden CD for Whole Rocket + + if (!c.isAerodynamic()) + continue; + + // Handle Overriden CD for Whole Rocket if(c.isCDOverridden()) { continue; } @@ -389,20 +392,11 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { // iterate across component instances final ArrayList contextList = entry.getValue(); for(InstanceContext context: contextList ) { - - - // Calculate the friction drag: + double componentFrictionCD = calcMap.get(c).calculateFrictionCD(conditions, componentCf, warningSet); + if (c instanceof SymmetricComponent) { - SymmetricComponent s = (SymmetricComponent) c; - - bodyFriction += componentCf * s.getComponentWetArea(); - - if (map != null) { - // Corrected later - map.get(c).setFrictionCD(componentCf * s.getComponentWetArea() - / conditions.getRefArea()); - } + bodyFrictionCD += componentFrictionCD; final double componentMinX = context.getLocation().x; minX = Math.min(minX, componentMinX); @@ -414,16 +408,11 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { maxR = Math.max(maxR, componentMaxR); } else if (c instanceof FinSet) { - - FinSet f = (FinSet) c; - double mac = ((FinSetCalc) calcMap.get(c)).getMACLength(); - double cd = componentCf * (1 + 2 * f.getThickness() / mac) * - 2 * f.getPlanformArea(); - finFriction += cd; - - if (map != null) { - map.get(c).setFrictionCD(cd / conditions.getRefArea()); - } + finFrictionCD += componentFrictionCD; + } + + if (map != null) { + map.get(c).setFrictionCD(componentFrictionCD); } } } @@ -441,7 +430,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { } } - return (finFriction + correction * bodyFriction) / conditions.getRefArea(); + return finFrictionCD + correction * bodyFrictionCD; } diff --git a/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java b/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java index 7aaf412b3..10b0569f8 100644 --- a/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java +++ b/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java @@ -621,6 +621,12 @@ public class FinSetCalc extends RocketComponentCalc { // } // // } + + @Override + public double calculateFrictionCD(FlightConditions conditions, double componentCf, WarningSet warnings) { + double cd = componentCf * (1 + 2 * thickness / macLength) * 2; + return cd; + } @Override public double calculatePressureCD(FlightConditions conditions, diff --git a/core/src/net/sf/openrocket/aerodynamics/barrowman/LaunchLugCalc.java b/core/src/net/sf/openrocket/aerodynamics/barrowman/LaunchLugCalc.java index 7563574b6..179a4d9a0 100644 --- a/core/src/net/sf/openrocket/aerodynamics/barrowman/LaunchLugCalc.java +++ b/core/src/net/sf/openrocket/aerodynamics/barrowman/LaunchLugCalc.java @@ -30,6 +30,12 @@ public class LaunchLugCalc extends RocketComponentCalc { // Nothing to be done } + @Override + public double calculateFrictionCD(FlightConditions conditions, double componentCf, WarningSet warnings) { + // launch lug doesn't add enough area to worry about + return 0; + } + @Override public double calculatePressureCD(FlightConditions conditions, double stagnationCD, double baseCD, WarningSet warnings) { diff --git a/core/src/net/sf/openrocket/aerodynamics/barrowman/RocketComponentCalc.java b/core/src/net/sf/openrocket/aerodynamics/barrowman/RocketComponentCalc.java index e24ab8785..63d90cafd 100644 --- a/core/src/net/sf/openrocket/aerodynamics/barrowman/RocketComponentCalc.java +++ b/core/src/net/sf/openrocket/aerodynamics/barrowman/RocketComponentCalc.java @@ -28,6 +28,16 @@ public abstract class RocketComponentCalc { public abstract void calculateNonaxialForces(FlightConditions conditions, Transformation transform, AerodynamicForces forces, WarningSet warnings); + + /** + * Calculates the friction drag of the component. + * + * @param conditions the flight conditions + * @param componentCF component coefficient of friction, calculated in BarrowmanCalculator + * @param warnings set in which to to store possible warnings + * @return the friction drag coefficient of the component + */ + public abstract double calculateFrictionCD(FlightConditions conditions, double componentCf, WarningSet warnings); /** * Calculates the pressure drag of the component. This component does NOT include @@ -37,7 +47,7 @@ public abstract class RocketComponentCalc { * @param stagnationCD the current stagnation drag coefficient * @param baseCD the current base drag coefficient * @param warnings set in which to store possible warnings - * @return the pressure drag of the component + * @return the pressure drag coefficient of the component */ public abstract double calculatePressureCD(FlightConditions conditions, double stagnationCD, double baseCD, WarningSet warnings); diff --git a/core/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java b/core/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java index 679215b90..6a7e8cafc 100644 --- a/core/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java +++ b/core/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java @@ -45,6 +45,7 @@ public class SymmetricComponentCalc extends RocketComponentCalc { private final double frontalArea; private final double fullVolume; private final double planformArea, planformCenter; + private final double wetArea; private final double sinphi; public SymmetricComponentCalc(RocketComponent c) { @@ -53,7 +54,6 @@ public class SymmetricComponentCalc extends RocketComponentCalc { throw new IllegalArgumentException("Illegal component type " + c); } SymmetricComponent component = (SymmetricComponent) c; - length = component.getLength(); foreRadius = component.getForeRadius(); @@ -63,6 +63,8 @@ public class SymmetricComponentCalc extends RocketComponentCalc { fullVolume = component.getFullVolume(); planformArea = component.getComponentPlanformArea(); planformCenter = component.getComponentPlanformCenter(); + + wetArea = component.getComponentWetArea(); if (component instanceof BodyTube) { shape = null; @@ -174,7 +176,10 @@ public class SymmetricComponentCalc extends RocketComponentCalc { conditions.getSinAOA() * conditions.getSincAOA()); // sin(aoa)^2 / aoa } - + @Override + public double calculateFrictionCD(FlightConditions conditions, double componentCf, WarningSet warningSet) { + return componentCf * wetArea / conditions.getRefArea(); + } private LinearInterpolator interpolator = null; diff --git a/core/src/net/sf/openrocket/aerodynamics/barrowman/TubeFinSetCalc.java b/core/src/net/sf/openrocket/aerodynamics/barrowman/TubeFinSetCalc.java index f9a1ecf4f..261cff8e0 100644 --- a/core/src/net/sf/openrocket/aerodynamics/barrowman/TubeFinSetCalc.java +++ b/core/src/net/sf/openrocket/aerodynamics/barrowman/TubeFinSetCalc.java @@ -672,5 +672,11 @@ public class TubeFinSetCalc extends RocketComponentCalc { return 3 * component.getFinCount(); } + + @Override + public double calculateFrictionCD(FlightConditions conditions, double componentCf, WarningSet warnings) { + // launch lug doesn't add enough area to worry about + return 0; + } }