diff --git a/aerodynamic_analysis/aerodynamic_analysis_conf.xml b/aerodynamic_analysis/aerodynamic_analysis_conf.xml index bd794b28618c15648669672b0a4345587ad4a0ca..c13d8dd88c9796d498bbdd9284e2afc18185daa3 100644 --- a/aerodynamic_analysis/aerodynamic_analysis_conf.xml +++ b/aerodynamic_analysis/aerodynamic_analysis_conf.xml @@ -5,7 +5,7 @@ <value>csmr-2020.xml</value> </aircraft_exchange_file_name> <aircraft_exchange_file_directory description="Specify the direction in which the aircraft exchange file can be found"> - <value>../projects/</value> + <value>../projects/CSMR/CSMR-2020/</value> </aircraft_exchange_file_directory> <own_tool_level description="Specify the tool level of this tool"> <value>3</value> @@ -34,7 +34,7 @@ <value>true</value> </tex_report> <write_info_files description="Switch to generate info files. Switch: true (On) / false (Off)"> - <value>true</value> + <value>false</value> </write_info_files> <log_file description="Specify the name of the log file"> <value>aerodynamic_analysis.log</value> @@ -626,7 +626,7 @@ <upper_boundary>inf</upper_boundary> </deltaWaveDragWing> </WaveDragMason> - <SemiEmpiricalHighLiftAdaptions> + <SemiEmpiricalHighLiftAdaptions description="SemiEmpiricalHighLiftAdaptions"> <deltaTotalDrag description="Reduction of the total high lift drag in drag counts"> <value>0.0</value> <default>0.0</default> @@ -641,6 +641,172 @@ <lower_boundary>-1000</lower_boundary> <upper_boundary>1000</upper_boundary> </factorDrag> + <do_individual_hl_calibration description="Switch to individually calibrate the high lift polars"> + <value>false</value> + <default>false</default> + </do_individual_hl_calibration> + <apply_manual_CLmax_hl_values description="Switch if manual values for max CL from hl_polars_correction_values/hl_polar/CL_max should be used. Switch: true (on: Manual preset CL is used; if value=0, CLmax calculated from method is used) / false (off: CLmax calculated from method is used)"> + <value>false</value> + <default>false</default> + </apply_manual_CLmax_hl_values> + <hl_polars_correction_values description="High-lift polar calibration factors for lift and drag."> + <hl_polar ID="0" description="A high lift polar"> + <configuration description="A configuration"> + <value>takeoff</value> + </configuration> + <CL_max description="CL_max"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </CL_max> + <delta_CD description="delta_CD"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </delta_CD> + <factor_CD description="factor_CD"> + <value>1</value> + <default>1</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </factor_CD> + </hl_polar> + <hl_polar ID="1" description="A high lift polar"> + <configuration description="A configuration"> + <value>takeoff_landing_gear_retracted</value> + </configuration> + <CL_max description="CL_max"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </CL_max> + <delta_CD description="delta_CD"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </delta_CD> + <factor_CD description="factor_CD"> + <value>1</value> + <default>1</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </factor_CD> + </hl_polar> + <hl_polar ID="2" description="A high lift polar"> + <configuration description="A configuration"> + <value>climb</value> + </configuration> + <CL_max description="CL_max"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </CL_max> + <delta_CD description="delta_CD"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </delta_CD> + <factor_CD description="factor_CD"> + <value>1</value> + <default>1</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </factor_CD> + </hl_polar> + <hl_polar ID="3" description="A high lift polar"> + <configuration description="A configuration"> + <value>approach</value> + </configuration> + <CL_max description="CL_max"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </CL_max> + <delta_CD description="delta_CD"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </delta_CD> + <factor_CD description="factor_CD"> + <value>1</value> + <default>1</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </factor_CD> + </hl_polar> + <hl_polar ID="4" description="A high lift polar"> + <configuration description="A configuration"> + <value>approach_landing_gear_out</value> + </configuration> + <CL_max description="CL_max"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </CL_max> + <delta_CD description="delta_CD"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </delta_CD> + <factor_CD description="factor_CD"> + <value>1</value> + <default>1</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </factor_CD> + </hl_polar> + <hl_polar ID="5" description="A high lift polar"> + <configuration description="A configuration"> + <value>landing</value> + </configuration> + <CL_max description="CL_max"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </CL_max> + <delta_CD description="delta_CD"> + <value>0</value> + <default>0</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </delta_CD> + <factor_CD description="factor_CD"> + <value>1</value> + <default>1</default> + <unit>1</unit> + <lower_boundary>-inf</lower_boundary> + <upper_boundary>inf</upper_boundary> + </factor_CD> + </hl_polar> + </hl_polars_correction_values> </SemiEmpiricalHighLiftAdaptions> <DragCorrection description="drag correction"> <factorDragCleanPolars description="factor drag clean polars"> @@ -651,7 +817,7 @@ <upper_boundary>1.5</upper_boundary> </factorDragCleanPolars> <factorDragHighliftPolar description="factor drag high lift polars"> - <value>1</value> + <value>1.3</value> <default>1</default> <unit>1</unit> <lower_boundary>0.5</lower_boundary> diff --git a/aerodynamic_analysis/src/methods/semiEmpiricalHighLiftAdaption.cpp b/aerodynamic_analysis/src/methods/semiEmpiricalHighLiftAdaption.cpp index 4c7df9510a61ea41cbe5da0653a0fcc13b7390ea..d0d4808c6b7b444cff66490b5a18a0d7da6aa762 100644 --- a/aerodynamic_analysis/src/methods/semiEmpiricalHighLiftAdaption.cpp +++ b/aerodynamic_analysis/src/methods/semiEmpiricalHighLiftAdaption.cpp @@ -45,6 +45,8 @@ using std::vector; semiEmpiricalHighLiftAdaption::semiEmpiricalHighLiftAdaption(const std::shared_ptr<RuntimeIO>& rtIO, const geom2::MultisectionSurface<geom2::AirfoilSection> mainWing) : hasStabilizer(false), + do_individual_hl_calibration(false), + apply_manual_CLmax_hl_values(false), CLmaxTO_req(0.), CLmaxLDG_req(0.), stepWidthCL(0.), @@ -96,8 +98,8 @@ void semiEmpiricalHighLiftAdaption::setHighLiftDevices() { void semiEmpiricalHighLiftAdaption::processHighLiftDevices() { for (size_t deviceID(0); deviceID < leadingEdgeHighLiftDevices.size(); ++deviceID) { - leadingEdgeHighLiftDevices.at(deviceID).innerSpan_abs = getHalfSpan(theMainWing) * leadingEdgeHighLiftDevices.at(deviceID).innerSpan_rel; - leadingEdgeHighLiftDevices.at(deviceID).outerSpan_abs = getHalfSpan(theMainWing) * leadingEdgeHighLiftDevices.at(deviceID).outerSpan_rel; + leadingEdgeHighLiftDevices.at(deviceID).innerSpan_abs = getHalfSpan(theMainWing) * fabs(leadingEdgeHighLiftDevices.at(deviceID).innerSpan_rel); + leadingEdgeHighLiftDevices.at(deviceID).outerSpan_abs = getHalfSpan(theMainWing) * fabs(leadingEdgeHighLiftDevices.at(deviceID).outerSpan_rel); leadingEdgeHighLiftDevices.at(deviceID).span = fabs(leadingEdgeHighLiftDevices.at(deviceID).outerSpan_abs - leadingEdgeHighLiftDevices.at(deviceID).innerSpan_abs); leadingEdgeHighLiftDevices.at(deviceID).c_rel_avg = 0.25 * (leadingEdgeHighLiftDevices.at(deviceID).innerRelFwdChordPosition + leadingEdgeHighLiftDevices.at(deviceID).innerRelAftChordPosition @@ -116,8 +118,8 @@ void semiEmpiricalHighLiftAdaption::processHighLiftDevices() { leadingEdgeHighLiftDevices.at(deviceID).coveredA = leadingEdgeHighLiftDevices.at(deviceID).span * (chordInboard + chordOutboard); } for (size_t deviceID(0); deviceID < trailingEdgeHighLiftDevices.size(); ++deviceID) { - trailingEdgeHighLiftDevices.at(deviceID).innerSpan_abs = getHalfSpan(theMainWing) * trailingEdgeHighLiftDevices.at(deviceID).innerSpan_rel; - trailingEdgeHighLiftDevices.at(deviceID).outerSpan_abs = getHalfSpan(theMainWing) * trailingEdgeHighLiftDevices.at(deviceID).outerSpan_rel; + trailingEdgeHighLiftDevices.at(deviceID).innerSpan_abs = getHalfSpan(theMainWing) * fabs(trailingEdgeHighLiftDevices.at(deviceID).innerSpan_rel); + trailingEdgeHighLiftDevices.at(deviceID).outerSpan_abs = getHalfSpan(theMainWing) * fabs(trailingEdgeHighLiftDevices.at(deviceID).outerSpan_rel); trailingEdgeHighLiftDevices.at(deviceID).span = fabs(trailingEdgeHighLiftDevices.at(deviceID).outerSpan_abs - trailingEdgeHighLiftDevices.at(deviceID).innerSpan_abs); trailingEdgeHighLiftDevices.at(deviceID).c_rel_avg = 0.25 * (trailingEdgeHighLiftDevices.at(deviceID).innerRelFwdChordPosition + trailingEdgeHighLiftDevices.at(deviceID).innerRelAftChordPosition @@ -247,6 +249,12 @@ Polar semiEmpiricalHighLiftAdaption::calculateHighLiftPolar(std::string config, if (trailingEdgeHighLiftDevices.at(i).name == "special") { specialDevice = true; } + } + // apply manual CL_max values if enabled + if (apply_manual_CLmax_hl_values ) { + if (!(accuracyCheck(hl_polar_calibration_data.at(config).CL_max, 0.0, ACCURACY_HIGH))) { + CLmax = hl_polar_calibration_data.at(config).CL_max; + } } if (specialDevice == true) { if (CLmaxTO_req <= 0.5) { @@ -309,7 +317,8 @@ Polar semiEmpiricalHighLiftAdaption::calculateHighLiftPolar(std::string config, // Summation of the wing area or span influenced by TE double totalCoveredATE = 0.0; for (size_t j = 0; j < trailingEdgeHighLiftDevices.size(); j++) { - totalCoveredATE += trailingEdgeHighLiftDevices.at(j).coveredA / geom2::measure::reference_area(theMainWing) * cos(trailingEdgeHighLiftDevices.at(j).phiHL); + totalCoveredATE += trailingEdgeHighLiftDevices.at(j).coveredA / geom2::measure::reference_area(theMainWing) + * cos(convertUnit(DEGREE, RADIAN, trailingEdgeHighLiftDevices.at(j).phiHL)); } double deltaAOAMaxTE = -6.0 * factorTE * totalCoveredATE; // Determine AlphaMax of Clean Polar @@ -347,7 +356,12 @@ Polar semiEmpiricalHighLiftAdaption::calculateHighLiftPolar(std::string config, aHighLiftPolar.PolarPoints.back().CL = Rounding(i, 4); aHighLiftPolar.PolarPoints.back().CD = CDmin_inc + deltaCDmin + deltaCDgear + kFactor_inc * pow((i - CLatCDmin_inc + deltaCLatCDmin), 2); - // drag correction + // individual drag correction + if (do_individual_hl_calibration) { + aHighLiftPolar.PolarPoints.back().CD = aHighLiftPolar.PolarPoints.back().CD * hl_polar_calibration_data.at(config).factor_CD; + aHighLiftPolar.PolarPoints.back().CD += hl_polar_calibration_data.at(config).delta_CD; + } + // overall drag correction aHighLiftPolar.PolarPoints.back().CD = (aHighLiftPolar.PolarPoints.back().CD + reductionDragCountsHighLift * 0.0001) * factorDragHighLift; double deltaHighLift; @@ -454,18 +468,32 @@ double semiEmpiricalHighLiftAdaption::getAlphaAtCL(Polar aPolar, double aCL) { double AOAatACL = 0.0; size_t pointID(0); for (size_t i(0); i < aPolar.PolarPoints.size() - 1; ++i) { + pointID = i; if (aPolar.PolarPoints.at(i).CL >= aCL) { - AOAatACL = aPolar.PolarPoints.at(i).AoA; - pointID = i; + //AOAatACL = aPolar.PolarPoints.at(i).AoA; break; } } - if (pointID != 0 && pointID != (aPolar.PolarPoints.size() - 1)) { - // If required CL value is within the bounds and not at the edge --> Interpolate + if (accuracyCheck(aPolar.PolarPoints.at(pointID).CL, aCL, ACCURACY_HIGH)) { + AOAatACL = aPolar.PolarPoints.at(pointID).AoA; + // If required CL value is within the bounds and not at the edge --> Interpolate + } else if (pointID > 0 && pointID < (aPolar.PolarPoints.size() - 1)) { AOAatACL = aPolar.PolarPoints.at(pointID-1).AoA + (aPolar.PolarPoints.at(pointID).AoA - aPolar.PolarPoints.at(pointID - 1).AoA) / (aPolar.PolarPoints.at(pointID).CL - aPolar.PolarPoints.at(pointID - 1).CL) * (aCL - aPolar.PolarPoints.at(pointID - 1).CL); + // extrapolate at lower end + } else if (pointID == 0) { + AOAatACL = aPolar.PolarPoints.at(0).AoA + (aPolar.PolarPoints.at(1).AoA + - aPolar.PolarPoints.at(0).AoA) + / (aPolar.PolarPoints.at(1).CL - aPolar.PolarPoints.at(0).CL) + * (aCL - aPolar.PolarPoints.at(0).CL); + // extrapolate at upper end + } else if (pointID == aPolar.PolarPoints.size()) { + AOAatACL = aPolar.PolarPoints.at(pointID).AoA + (aPolar.PolarPoints.at(pointID).AoA + - aPolar.PolarPoints.at(pointID - 1).AoA) + / (aPolar.PolarPoints.at(pointID).CL - aPolar.PolarPoints.at(pointID - 1).CL) + * (aCL - aPolar.PolarPoints.at(pointID).CL); } return AOAatACL; } diff --git a/aerodynamic_analysis/src/methods/semiEmpiricalHighLiftAdaption.h b/aerodynamic_analysis/src/methods/semiEmpiricalHighLiftAdaption.h index 16fe7faeb23147bf2ebdc0d3572b86ecc3d81582..4f4c9d71f9afd761275cf45588dad8b45e9c0b95 100644 --- a/aerodynamic_analysis/src/methods/semiEmpiricalHighLiftAdaption.h +++ b/aerodynamic_analysis/src/methods/semiEmpiricalHighLiftAdaption.h @@ -30,6 +30,8 @@ class semiEmpiricalHighLiftAdaption{ public: bool hasStabilizer; + bool do_individual_hl_calibration; + bool apply_manual_CLmax_hl_values; geom2::MultisectionSurface<geom2::AirfoilSection> theStabilizer; double CLmaxTO_req; //TBA double CLmaxLDG_req; //TBA @@ -84,9 +86,16 @@ class semiEmpiricalHighLiftAdaption{ double deltaCDgear; /**< Delta drag coefficient (gear) [-] */ double deltaCLatCDmin; /**< Delta lift coefficient at minimum drag [-] */ }; - std::unordered_map<std::string, highLiftAdaption> theHighliftAdaption; std::vector <WingDevice> leadingEdgeHighLiftDevices; std::vector <WingDevice> trailingEdgeHighLiftDevices; + std::unordered_map<std::string, highLiftAdaption> theHighliftAdaption; + struct hl_polar_calibration_values { + double CL_max; /**< maximum CL value which should be reached */ + double delta_CD; /**< Constant delta for drag calibration */ + double factor_CD; /**< Factor for drag calibration */ + }; + hl_polar_calibration_values aHLPolarCalibrationContainer; + std::unordered_map<std::string, hl_polar_calibration_values> hl_polar_calibration_data; /**< Container for storing all high lift polar calibration and correction values */ void runHighLiftAdaption(); void setHighLiftDevices(); void processHighLiftDevices(); diff --git a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp index ce29551897fb05ecd661d3677fb241ef0fec141d..4e10d4119c18032bf2c67338100f02c96e2e7776 100644 --- a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp +++ b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp @@ -37,108 +37,65 @@ using std::endl; tawCalculatePolarConfig::tawCalculatePolarConfig(const node& config) : // execution mode - execution_mode(EndnodeReadOnly<std::string>("program_settings/execution_mode")), + execution_mode(EndnodeReadOnly<std::string>("program_settings/execution_mode").read(config)), // lifting line settings - stepWidthCL(EndnodeReadOnly<double>("LiftingLineForTAW/stepWidthCL")), + stepWidthCL(EndnodeReadOnly<double>("LiftingLineForTAW/stepWidthCL").read(config)), // other settings - CLModeAirfoilSelection(EndnodeReadOnly<std::string>("program_settings/CLModeAirfoilSelection")), - setFlightConditionsMode(EndnodeReadOnly<std::string>("program_settings/FlightConditions/AdaptMachNumbersToCruiseReq")), - extrapolationMargin(EndnodeReadOnly<double>("program_settings/FlightConditions/PolarAttributes/extrapolation_margin")), - allowGrideChange(EndnodeReadOnly<bool>("program_settings/FlightConditions/PolarAttributes/allow_grid_change")), - numberFlightConditions(EndnodeReadOnly<int>("program_settings/FlightConditions/numberFlightConditions")), - pathToLiftingLine(EndnodeReadOnly<std::string>("program_settings/LiftingLine/FolderPath")), + CLModeAirfoilSelection(EndnodeReadOnly<std::string>("program_settings/CLModeAirfoilSelection").read(config)), + setFlightConditionsMode(EndnodeReadOnly<std::string>("program_settings/FlightConditions/AdaptMachNumbersToCruiseReq").read(config)), + extrapolationMargin(EndnodeReadOnly<double>("program_settings/FlightConditions/PolarAttributes/extrapolation_margin").read(config)), + allowGrideChange(EndnodeReadOnly<bool>("program_settings/FlightConditions/PolarAttributes/allow_grid_change").read(config)), + numberFlightConditions(EndnodeReadOnly<int>("program_settings/FlightConditions/numberFlightConditions").read(config)), + pathToLiftingLine(EndnodeReadOnly<std::string>("program_settings/LiftingLine/FolderPath").read(config)), // lifting line for TAW pitching moment corrections - CM_corr_fuselage_mode(EndnodeReadOnly<std::string>("program_settings/LiftingLineForTAW/PitchingMoment/CM_corr_fuselage")), - CM_corr_nacelle_mode(EndnodeReadOnly<std::string>("program_settings/LiftingLineForTAW/PitchingMoment/CM_corr_nacelle")), - delta_CM0(EndnodeReadOnly<double>("LiftingLineForTAW/PitchingMoment/delta_CM0")), - delta_dCMdCL(EndnodeReadOnly<double>("LiftingLineForTAW/PitchingMoment/delta_dCMdCL")), + CM_corr_fuselage_mode(EndnodeReadOnly<std::string>("program_settings/LiftingLineForTAW/PitchingMoment/CM_corr_fuselage").read(config)), + CM_corr_nacelle_mode(EndnodeReadOnly<std::string>("program_settings/LiftingLineForTAW/PitchingMoment/CM_corr_nacelle").read(config)), + delta_CM0(EndnodeReadOnly<double>("LiftingLineForTAW/PitchingMoment/delta_CM0").read(config)), + delta_dCMdCL(EndnodeReadOnly<double>("LiftingLineForTAW/PitchingMoment/delta_dCMdCL").read(config)), // lifiting line for TAW induced drag corrections - indDragCtCorrForCalibration(EndnodeReadOnly<double>("LiftingLineForTAW/InducedDragCorrection/indDragCtCorrForCalibration")), - factorIndDragCleanPolar(EndnodeReadOnly<double>("LiftingLineForTAW/InducedDragCorrection/factorIndDragCleanPolar")), + indDragCtCorrForCalibration(EndnodeReadOnly<double>("LiftingLineForTAW/InducedDragCorrection/indDragCtCorrForCalibration").read(config)), + factorIndDragCleanPolar(EndnodeReadOnly<double>("LiftingLineForTAW/InducedDragCorrection/factorIndDragCleanPolar").read(config)), // visc drag raymer transition parameters - manualTransition(EndnodeReadOnly<bool>("program_settings/ViscDragRaymer/ManualTransition")), - manualTransitionWing(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/TransitionLocationWing")), - manualTransitionStabilizer(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/TransitionLocationStabilizer")), - manualTransitionFin(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/TransitionLocationFin")), + manualTransition(EndnodeReadOnly<bool>("program_settings/ViscDragRaymer/ManualTransition").read(config)), + manualTransitionWing(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/TransitionLocationWing").read(config)), + manualTransitionStabilizer(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/TransitionLocationStabilizer").read(config)), + manualTransitionFin(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/TransitionLocationFin").read(config)), // visc drag raymer calibration parameters - doViscDragCalibration(EndnodeReadOnly<bool>("program_settings/ViscDragRaymer/UseCalibration")), - CDvisc_CDsum(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationHighMa/CDSum")), - CDvisc_CLfact(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationHighMa/CLFact")), - CDvisc_CLexp(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationHighMa/CLExp")), - CDvisc_CDsum_lowMa(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationLowMa/CDSum")), - CDvisc_CLfact_lowMa(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationLowMa/CLFact")), - CDvisc_CLexp_lowMa(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationLowMa/CLExp")), + doViscDragCalibration(EndnodeReadOnly<bool>("program_settings/ViscDragRaymer/UseCalibration").read(config)), + CDvisc_CDsum(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationHighMa/CDSum").read(config)), + CDvisc_CLfact(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationHighMa/CLFact").read(config)), + CDvisc_CLexp(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationHighMa/CLExp").read(config)), + CDvisc_CDsum_lowMa(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationLowMa/CDSum").read(config)), + CDvisc_CLfact_lowMa(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationLowMa/CLFact").read(config)), + CDvisc_CLexp_lowMa(EndnodeReadOnly<double>("program_settings/ViscDragRaymer/CalibrationLowMa/CLExp").read(config)), // wave drag mason - numberWingStrips(EndnodeReadOnly<int>("program_settings/WaveDragMason/NumberWingStrips")), - useCostomReferenceAngleForSweep(EndnodeReadOnly<bool>("program_settings/WaveDragMason/UseCostomReferenceAngleForSweep")), - doWaveDragMasonCalibration(EndnodeReadOnly<bool>("program_settings/WaveDragMason/UseCalibration")), - doWaveDragMasonDragCountCorrection(EndnodeReadOnly<bool>("program_settings/WaveDragMason/DoDragCountCorrection")), - Ka(EndnodeReadOnly<double>("program_settings/WaveDragMason/Ka")), - maximumSegmentSweep(EndnodeReadOnly<double>("program_settings/WaveDragMason/MaximumSegmentSweep")), - customSweepPosition(EndnodeReadOnly<double>("program_settings/WaveDragMason/CustomSweepAngle")), - CDwave_CLFact(EndnodeReadOnly<double>("program_settings/WaveDragMason/CLFact")), - CDwave_CLExp(EndnodeReadOnly<double>("program_settings/WaveDragMason/CLExp")), - deltaWaveDragCountWing(EndnodeReadOnly<double>("program_settings/WaveDragMason/deltaWaveDragWing")), + numberWingStrips(EndnodeReadOnly<int>("program_settings/WaveDragMason/NumberWingStrips").read(config)), + useCostomReferenceAngleForSweep(EndnodeReadOnly<bool>("program_settings/WaveDragMason/UseCostomReferenceAngleForSweep").read(config)), + doWaveDragMasonCalibration(EndnodeReadOnly<bool>("program_settings/WaveDragMason/UseCalibration").read(config)), + doWaveDragMasonDragCountCorrection(EndnodeReadOnly<bool>("program_settings/WaveDragMason/DoDragCountCorrection").read(config)), + Ka(EndnodeReadOnly<double>("program_settings/WaveDragMason/Ka").read(config)), + maximumSegmentSweep(EndnodeReadOnly<double>("program_settings/WaveDragMason/MaximumSegmentSweep").read(config)), + customSweepPosition(EndnodeReadOnly<double>("program_settings/WaveDragMason/CustomSweepAngle").read(config)), + CDwave_CLFact(EndnodeReadOnly<double>("program_settings/WaveDragMason/CLFact").read(config)), + CDwave_CLExp(EndnodeReadOnly<double>("program_settings/WaveDragMason/CLExp").read(config)), + deltaWaveDragCountWing(EndnodeReadOnly<double>("program_settings/WaveDragMason/deltaWaveDragWing").read(config)), // trim settings - doTrim(EndnodeReadOnly<bool>("program_settings/Trim/DoTrim")), - trimAdditionalCGPositions(EndnodeReadOnly<bool>("program_settings/Trim/TrimWithAdditionalCoGPositions")), - trimHighLiftPolars(EndnodeReadOnly<bool>("program_settings/Trim/TrimHighLift")), - stabAngleGridMode(EndnodeReadOnly<std::string>("program_settings/Trim/StabAngleGrid")), - customStabAngleGrid(EndnodeReadOnly<std::string>("program_settings/Trim/customStabAngleGrid")), - deltaTotalDragHL(EndnodeReadOnly<double>("program_settings/SemiEmpiricalHighLiftAdaptions/deltaTotalDrag")), - factorDragHL(EndnodeReadOnly<double>("program_settings/SemiEmpiricalHighLiftAdaptions/factorDrag")), + doTrim(EndnodeReadOnly<bool>("program_settings/Trim/DoTrim").read(config)), + trimAdditionalCGPositions(EndnodeReadOnly<bool>("program_settings/Trim/TrimWithAdditionalCoGPositions").read(config)), + trimHighLiftPolars(EndnodeReadOnly<bool>("program_settings/Trim/TrimHighLift").read(config)), + stabAngleGridMode(EndnodeReadOnly<std::string>("program_settings/Trim/StabAngleGrid").read(config)), + customStabAngleGrid(EndnodeReadOnly<std::string>("program_settings/Trim/customStabAngleGrid").read(config)), + deltaTotalDragHL(EndnodeReadOnly<double>("program_settings/SemiEmpiricalHighLiftAdaptions/deltaTotalDrag").read(config)), + factorDragHL(EndnodeReadOnly<double>("program_settings/SemiEmpiricalHighLiftAdaptions/factorDrag").read(config)), + // high lift polars settings + do_individual_hl_calibration(EndnodeReadOnly<bool>("program_settings/SemiEmpiricalHighLiftAdaptions/do_individual_hl_calibration").read(config).value()), + apply_manual_CLmax_hl_values(EndnodeReadOnly<bool>("program_settings/SemiEmpiricalHighLiftAdaptions/apply_manual_CLmax_hl_values").read(config).value()), // calibration settings - factorDragCleanPolar(EndnodeReadOnly<double>("program_settings/DragCorrection/factorDragCleanPolars")), - factorDragHighLiftPolar(EndnodeReadOnly<double>("program_settings/DragCorrection/factorDragHighliftPolar")), - deltaTotalDragCleanPolar(EndnodeReadOnly<double>("program_settings/DragCorrection/deltaTotalDragCleanPolars")), - deltaTotalDragHighLift(EndnodeReadOnly<double>("program_settings/DragCorrection/deltaTotalDragHighLift")) { - execution_mode.read(config); - CLModeAirfoilSelection.read(config); - stepWidthCL.read(config); - setFlightConditionsMode.read(config); - extrapolationMargin.read(config); - allowGrideChange.read(config); - numberFlightConditions.read(config); - pathToLiftingLine.read(config); - manualTransition.read(config); - manualTransitionWing.read(config); - manualTransitionStabilizer.read(config); - manualTransitionFin.read(config); - doViscDragCalibration.read(config); - CDvisc_CDsum.read(config); - CDvisc_CLfact.read(config); - CDvisc_CLexp.read(config); - CDvisc_CDsum_lowMa.read(config); - CDvisc_CLfact_lowMa.read(config); - CDvisc_CLexp_lowMa.read(config); - useCostomReferenceAngleForSweep.read(config); - doWaveDragMasonCalibration.read(config); - doWaveDragMasonDragCountCorrection.read(config); - Ka.read(config); - numberWingStrips.read(config); - maximumSegmentSweep.read(config); - customSweepPosition.read(config); - CDwave_CLFact.read(config); - CDwave_CLExp.read(config); - deltaWaveDragCountWing.read(config); - doTrim.read(config); - trimAdditionalCGPositions.read(config); - trimHighLiftPolars.read(config); - stabAngleGridMode.read(config); - customStabAngleGrid.read(config); - deltaTotalDragHL.read(config); - factorDragHL.read(config); - CM_corr_fuselage_mode.read(config); - CM_corr_nacelle_mode.read(config); - delta_CM0.read(config); - delta_dCMdCL.read(config); - indDragCtCorrForCalibration.read(config); - factorIndDragCleanPolar.read(config); + factorDragCleanPolar(EndnodeReadOnly<double>("program_settings/DragCorrection/factorDragCleanPolars").read(config)), + factorDragHighLiftPolar(EndnodeReadOnly<double>("program_settings/DragCorrection/factorDragHighliftPolar").read(config)), + deltaTotalDragCleanPolar(EndnodeReadOnly<double>("program_settings/DragCorrection/deltaTotalDragCleanPolars").read(config)), + deltaTotalDragHighLift(EndnodeReadOnly<double>("program_settings/DragCorrection/deltaTotalDragHighLift").read(config)) { liftingLineFolderPath = pathToLiftingLine.value(); - factorDragCleanPolar.read(config); - factorDragHighLiftPolar.read(config); - deltaTotalDragCleanPolar.read(config); - deltaTotalDragHighLift.read(config); myRuntimeInfo->out << "config: " << liftingLineFolderPath << endl; if (setFlightConditionsMode.value() == "mode_0") { myRuntimeInfo->info << "set flight conditions from config xml" << endl; @@ -149,6 +106,7 @@ tawCalculatePolarConfig::tawCalculatePolarConfig(const node& config) myRuntimeInfo->info << "Hab vergessen was hier rein sollte" << endl; } this->initializeTrimSettings(); + this->read_hl_calibration_factors(config); } void tawCalculatePolarConfig::readflightConditions(const node& config, size_t ID) { @@ -190,3 +148,22 @@ void tawCalculatePolarConfig::initializeTrimSettings() { CGPositions = {"design"}; } } + +void tawCalculatePolarConfig::read_hl_calibration_factors(const node& config) { + size_t numberHLPolars = config.getVector(("program_settings/SemiEmpiricalHighLiftAdaptions/hl_polars_correction_values/hl_polar"), 2).size(); + for (size_t HLPolarID(0); HLPolarID < numberHLPolars ; ++HLPolarID) { + EndnodeReadOnly configurationNode(EndnodeReadOnly<std::string>("SemiEmpiricalHighLiftAdaptions/hl_polars_correction_values/hl_polar@" + + num2Str(HLPolarID) + "/configuration").read(config)); + EndnodeReadOnly CLMaxNode(EndnodeReadOnly<double>("SemiEmpiricalHighLiftAdaptions/hl_polars_correction_values/hl_polar@" + + num2Str(HLPolarID) + "/CL_max").read(config)); + EndnodeReadOnly delta_CDNode(EndnodeReadOnly<double>("SemiEmpiricalHighLiftAdaptions/hl_polars_correction_values/hl_polar@" + + num2Str(HLPolarID) + "/delta_CD").read(config)); + EndnodeReadOnly factor_CDNode(EndnodeReadOnly<double>("SemiEmpiricalHighLiftAdaptions/hl_polars_correction_values/hl_polar@" + + num2Str(HLPolarID) + "/factor_CD").read(config)); + hl_polar_calibration_values aHLPolarCalibrationContainer; + hl_polar_calibration_data[configurationNode.value()] = aHLPolarCalibrationContainer; + hl_polar_calibration_data.at(configurationNode.value()).CL_max = CLMaxNode.value(); + hl_polar_calibration_data.at(configurationNode.value()).delta_CD = delta_CDNode.value(); + hl_polar_calibration_data.at(configurationNode.value()).factor_CD = factor_CDNode.value(); + } +} \ No newline at end of file diff --git a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h index d568601660ad54b753b18b7fc0fcb87a1886ffcf..e2baf8d9130492ef45414d7f62fb26692d81f308 100644 --- a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h +++ b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h @@ -85,6 +85,8 @@ class tawCalculatePolarConfig{ // semi empirical high lift adaptions EndnodeReadOnly<double> deltaTotalDragHL; EndnodeReadOnly<double> factorDragHL; + bool do_individual_hl_calibration; + bool apply_manual_CLmax_hl_values; // calibration settings EndnodeReadOnly<double> factorDragCleanPolar; EndnodeReadOnly<double> factorDragHighLiftPolar; @@ -92,6 +94,7 @@ class tawCalculatePolarConfig{ EndnodeReadOnly<double> deltaTotalDragHighLift; void readflightConditions(const node& config, size_t ID); void initializeTrimSettings(); + void read_hl_calibration_factors(const node& config); explicit tawCalculatePolarConfig(const node& config); virtual ~tawCalculatePolarConfig() {} // explicit calculatePolarSettings(const node& configXML); @@ -100,34 +103,24 @@ class tawCalculatePolarConfig{ // virtual ~calculatePolarSettings(); /* Member Variables */ std::string liftingLineFolderPath; /**< Path to LiftingLine folder */ - bool deleteLLfolder; /**< Switch which sets if liftingLine folder in project folder is deleted after execution */ - std::string aeroDatabaseFolderPath; /**< Path to AeroDatabase folder */ - bool getAlternativeDragComponentsFromDB; /**< Switch if also the friction and pressure drag should be read from DB and plotted */ - std::string stabtoolFolderPath; /**< Path to Stabtool folder */ // trim settings std::vector<double> stabAngles; /**< vector of stabilizer angles in [deg] */ std::vector<std::string> CGPositions; /**< vector of CG positions, order: design, fwd, aft*/ size_t neutralStabAngleID; - /* Polar Configuration */ - /** \brief Class which contains configurations for the polar calculations - */ - uint8_t plottingIncrement; /**< variable within database method */ - /* Flight Conditions */ - bool adaptMachDistribution; /**< Switch to either use the list of flight conditions from the config file or to distribute them reasonably with respect to design mach number */ - double cruiseMach; /**< Cruise mach number [-] */ - double designAltitude; /**< Design altitude [ft] */ - bool useAverageCruiseAltitude; /**< Switch to either use the given design altitude or to calculate the average from the flown cruise steps set in aricraft xml */ - int numberOfCruiseSteps; /**< Number of cruise steps in design mission*/ - int numberOfFlightConditions; /**< Number of flight conditions [-] */ - std::vector <double> lowSpeed_Mach; /**< Vector of low speed mach numbers. Only used if adaptMachDistribution is set to true */ - std::vector <double> highSpeed_Mach_Deltas; /**< Vector of high speed mach number deviations. Used to distribute mach numbers around cruise mach number */ - std::vector <double> FreestreamMachNumbers; /**< Vector of Freestream Mach numbers */ std::vector<flightCondition> flightConditions; /**< Vector of flightCondition objects representing the mission data */ std::vector<double> machNumbers; /**< Vector with mach numbers corrsponding to their mach ID */ + /* High lift calibration data */ + struct hl_polar_calibration_values { + double CL_max; /**< maximum CL value which should be reached */ + double delta_CD; /**< Constant delta for drag calibration */ + double factor_CD; /**< Factor for drag calibration */ + }; + std::unordered_map<std::string, hl_polar_calibration_values> hl_polar_calibration_data; /**< Container for storing all high lift polar calibration and correction values */ + private: /* Member functions */ /** \brief Function reads polar settings from configuration XML and stores them in polarConfig object diff --git a/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp b/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp index 485273d3d17e4a9661e9b5cda4da85213fb1b6bb..0475e105b9d3234fdb7679a7cb51433fe5a35ae1 100644 --- a/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp +++ b/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp @@ -176,6 +176,7 @@ void tawDefaultStrategy::runAeroCalculations(const Point CoGPosition, const doub // high lift calculation semiEmpiricalHighLiftAdaption* mySemiEmpHLAdaption = new semiEmpiricalHighLiftAdaption(rtIO_, liftingSurfaces.front()); this->copyWingDevicesAndStabilizer(mySemiEmpHLAdaption); + this->copyHLPolarCalibrationData(mySemiEmpHLAdaption); this->copyCleanPolarForHLCalculation(mySemiEmpHLAdaption, myLiftingLineForTAW); mySemiEmpHLAdaption->runHighLiftAdaption(); this->calculateHighLiftPolars(mySemiEmpHLAdaption, CoGPosition.xCoordinate, currentIStabAngle); @@ -353,7 +354,7 @@ void tawDefaultStrategy::sumUpDragComponents() { } void tawDefaultStrategy::copyWingDevicesAndStabilizer(semiEmpiricalHighLiftAdaption *mySemiEmpHLAdaption) { - myRuntimeInfo->out << "Copy wing devices" << endl; + myRuntimeInfo->debug << "Copy wing devices" << endl; for (size_t deviceID(0); deviceID < data_->numberDevices; ++deviceID) { semiEmpiricalHighLiftAdaption::WingDevice* aWingDevice = new semiEmpiricalHighLiftAdaption::WingDevice; aWingDevice->name = data_->wingDevices.at(deviceID).type; @@ -373,6 +374,16 @@ void tawDefaultStrategy::copyWingDevicesAndStabilizer(semiEmpiricalHighLiftAdapt } } +void tawDefaultStrategy::copyHLPolarCalibrationData(semiEmpiricalHighLiftAdaption *mySemiEmpHLAdaption) { + myRuntimeInfo->debug << "Copy high lift polar calibration data" << endl; + for (size_t configID(0); configID < HLconfigs.size(); ++configID) { + mySemiEmpHLAdaption->hl_polar_calibration_data[HLconfigs.at(configID)] = mySemiEmpHLAdaption->aHLPolarCalibrationContainer; + mySemiEmpHLAdaption->hl_polar_calibration_data.at(HLconfigs.at(configID)).CL_max = config_->hl_polar_calibration_data.at(HLconfigs.at(configID)).CL_max; + mySemiEmpHLAdaption->hl_polar_calibration_data.at(HLconfigs.at(configID)).delta_CD = config_->hl_polar_calibration_data.at(HLconfigs.at(configID)).delta_CD; + mySemiEmpHLAdaption->hl_polar_calibration_data.at(HLconfigs.at(configID)).factor_CD = config_->hl_polar_calibration_data.at(HLconfigs.at(configID)).factor_CD; + } +} + void tawDefaultStrategy::copyCleanPolarForHLCalculation(semiEmpiricalHighLiftAdaption *mySemiEmpHLAdaption, liftingLineForTAW *myLiftingLineForTAW) { // find polar with minimum mach number double minMachNumber(1.0); @@ -399,6 +410,8 @@ void tawDefaultStrategy::copyCleanPolarForHLCalculation(semiEmpiricalHighLiftAda mySemiEmpHLAdaption->theCleanPolar.PolarPoints.back().iStabPolar = currentPolarSet.cleanPolars.at(minMachID).Points.at(pointID).iStabPolar; } // copy other neccesary values from lifting line calculation + mySemiEmpHLAdaption->do_individual_hl_calibration = config_->do_individual_hl_calibration; + mySemiEmpHLAdaption->apply_manual_CLmax_hl_values = config_->apply_manual_CLmax_hl_values; mySemiEmpHLAdaption->CLmaxTO_req = 1.0; mySemiEmpHLAdaption->CLmaxLDG_req = 1.0; mySemiEmpHLAdaption->stepWidthCL = config_->stepWidthCL.value(); diff --git a/aerodynamic_analysis/src/taw/tawDefaultStrategy.h b/aerodynamic_analysis/src/taw/tawDefaultStrategy.h index 125ff91cf569485cd751ac4e506d594ee2ace5db..7c3ad1a018f5b82c4be2cf09f16ce1b92b103b9a 100644 --- a/aerodynamic_analysis/src/taw/tawDefaultStrategy.h +++ b/aerodynamic_analysis/src/taw/tawDefaultStrategy.h @@ -107,6 +107,7 @@ class tawDefaultStrategy { void calculateWaveDragMason(waveDragMason *myWaveDragMason); void sumUpDragComponents(); void copyWingDevicesAndStabilizer(semiEmpiricalHighLiftAdaption *mySemiEmpHLAdaption); + void copyHLPolarCalibrationData(semiEmpiricalHighLiftAdaption *mySemiEmpHLAdaption); void copyCleanPolarForHLCalculation(semiEmpiricalHighLiftAdaption *mySemiEmpHLAdaption, liftingLineForTAW *myLiftingLineForTAW); void calculateHighLiftPolars(semiEmpiricalHighLiftAdaption *mySemiEmpHLAdaption, const double CoG_X_Position, const double currentIStabAngle); /** \brief Copy the temporary current polar set to the permanent polarDataCGMap