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; + } }