diff --git a/aerodynamic_analysis/CMakeLists.txt b/aerodynamic_analysis/CMakeLists.txt index 54b457e0237cc071ffd4e6747d200ccf28da6372..6a0eb1ef3e54a8215f261df8984330daa9d73c5e 100644 --- a/aerodynamic_analysis/CMakeLists.txt +++ b/aerodynamic_analysis/CMakeLists.txt @@ -23,7 +23,7 @@ set(MODULE_SOURCES src/laminarTAW/HLFCStrategy.cpp src/bwb/bwbCalculatePolar.cpp src/bwb/bwbDefaultData.cpp - src/bwb/bwbcalculatePolarConfig.cpp + src/bwb/bwbCalculatePolarConfig.cpp src/bwb/bwbDefaultStrategy.cpp src/methods/viscDragRaymer.cpp src/methods/liftingLinePolar.cpp 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 diff --git a/initial_sizing/initial_sizing_conf.xml b/initial_sizing/initial_sizing_conf.xml index 94b24756fa28370fa6ed81936ab7c3ca36cc6a56..896dd1d245d056804f185a9c03473b14701b4b90 100644 --- a/initial_sizing/initial_sizing_conf.xml +++ b/initial_sizing/initial_sizing_conf.xml @@ -1,164 +1,164 @@ -<?xml version="1.0" encoding="utf-8" ?> -<module_configuration_file name="initial_sizing_conf.xml"> - <control_settings description="General control settings for this tool"> - <aircraft_exchange_file_name description="Specify the name of the exchange file"> - <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> - </aircraft_exchange_file_directory> - <own_tool_level description="Specify the tool level of this tool"> - <value>1</value> - </own_tool_level> - <console_output description="Selector to specify the console output. Selector: mode_0 (Off) / mode_1 (only out/err/warn) / mode_2 (1 + info) / mode_3 (2 + debug)"> - <value>mode_1</value> - </console_output> - <log_file_output description="Selector to specify the log file output. Selector: mode_0 (Off) / mode_1 (only out/err/warn) / mode_2 (1 + info) / mode_3 (2 + debug)"> - <value>mode_1</value> - </log_file_output> - <plot_output description="Specify the way plotting shall be handled"> - <enable description="Switch to enable plotting. Switch: true (On) / false (Off)"> - <value>true</value> - </enable> - <copy_plotting_files description="Switch if plotting files shall be copied. Switch: true (On) / false (Off)"> - <value>true</value> - </copy_plotting_files> - <delete_plotting_files_from_tool_folder description="Switch if plotting files shall be deleted from folder. Switch: true (On) / false (Off)"> - <value>true</value> - </delete_plotting_files_from_tool_folder> - </plot_output> - <report_output description="Switch to generate an HTML report. Switch: true (On) / false (Off)"> - <value>true</value> - </report_output> - <tex_report description="Switch to generate a Tex report. Switch: true (On) / false (Off)"> - <value>true</value> - </tex_report> - <write_info_files description="Switch to generate info files. Switch: true (On) / false (Off)"> - <value>true</value> - </write_info_files> - <log_file description="Specify the name of the log file"> - <value>initial_sizing.log</value> - </log_file> - <inkscape_path description="Path to the inkscape application (DEFAULT: Use inkscape from the UNICADO repo structure)"> - <value>DEFAULT</value> - </inkscape_path> - <gnuplot_path description="Path to the gnuplot application (DEFAULT: Use gnuplot from the UNICADO repo structure)"> - <value>DEFAULT</value> - </gnuplot_path> - </control_settings> - <program_settings description="program settings"> - <design_case description="Switch for system sizing. 1: Sizing, 0: ONLY determination of a load profile for a specific mission"> - <value>1</value> - <default>1</default> - </design_case> - <tube_and_wing description="settings for tube and wing (TAW)"> - <approach_selection description="selection of approach level"> - <value>analytical</value> - </approach_selection> - <analytical_approach> - <General> - <OswaldFactor description="Oswald factor in clean configuration" Unit="-"> - <value>0.85</value> - <default>0.85</default> - </OswaldFactor> - <AspectRatio description="aspect ratio" Unit="count"> - <value>9.5</value> - <default>9.5</default> - </AspectRatio> - <n_pilots description="Number of Pilots" Unit="count"> - <value>2</value> - <default>2</default> - </n_pilots> - <n_engines description="Number of engines" Unit="count"> - <value>2</value> - <default>2</default> - </n_engines> - <Cf description="friction coefficient" Unit="count"> - <value>0.002</value> - <default>0.002</default> - </Cf> - </General> - <Constants> - <SFC_kerosene description="Specific Fuel Consumption Factor for Kerosene"> - <value>0.0001389</value> - <default>0.0001389</default> - </SFC_kerosene> - </Constants> - <TOFL description="takeoff distance requirement"> - <CLmax_TO description="Maximum lift coefficient at takeoff" Unit="-"> - <value>2.28</value> - <default>2.28</default> - </CLmax_TO> - </TOFL> - <LDN description="landing distance requirement"> - <CLmax_L description="Maximum lift coefficient at landing" Unit="-"> - <value>2.85</value> - <default>2.85</default> - </CLmax_L> - <mlmo description="ratio between maximum landing mass and takeoff mass" Unit="-"> - <value>0.82</value> - <default>0.82</default> - </mlmo> - </LDN> - <Climb description="climb performance requirement"> - <deltaCD_HL description="Delta CD0 with TO-Flaps" Unit="-"> - <value>0.07</value> - <default>0.07</default> - </deltaCD_HL> - </Climb> - <Cruise description="maximum cruise speed requirement"> - <mcr_mto description="ratio between cruise mass and takeoff mass - default for mid- and short-range: 0.956, default for long range: 0.924"> - <value>0.956</value> - <default>0.956</default> - </mcr_mto> - <optimalCL description="maximum CL at initial cruise"> - <value>0.57</value> - <default>0.57</default> - </optimalCL> - </Cruise> - <LiftToDragRatios description="initial cruise and loiter lift to drag ratios "> - <LD_initial_cruise description="cruise requirements"> - <value>15</value> - <default>15</default> - </LD_initial_cruise> - <LD_initial_loiter description="loiter requirements"> - <value>16</value> - <default>16</default> - </LD_initial_loiter> - </LiftToDragRatios> - <Masses description="mass estimation methodology"> - <Fractions description="mass fractions"> - <mf_warmup description="Warmup (according to Raymer: 0.97(A340)-0.99(A320))" Unit="-" Default="0.99"> - <value>0.99</value> - <default>0.99</default> - </mf_warmup> - <mf_taxi description="Warmup (according to Raymer: 0.97(A340)-0.99(A320))" Unit="-" Default="0.99"> - <value>0.99</value> - <default>0.99</default> - </mf_taxi> - <mf_to description="Taxi and Takeoff (according to Raymer: 0.97(A340)-0.99(A320))" Unit="-" Default="0.995"> - <value>0.995</value> - <default>0.995</default> - </mf_to> - <mf_climb description="Climb (according to Raymer: 0.97(A340)-0.99(A320))" Unit="-" Default="0.98"> - <value>0.98</value> - <default>0.98</default> - </mf_climb> - <mf_descent description="Descent (according to Raymer: 0.99(A340)-0.995(A320))" Unit="-" Default="0.99"> - <value>0.99</value> - <default>0.99</default> - </mf_descent> - <mf_missedandclimb description="Landing and Taxi Back (according to Raymer: 0.992(A340)-0.997(A320))" Unit="-" Default="0.988"> - <value>0.988</value> - <default>0.988</default> - </mf_missedandclimb> - <mf_land description="Landing and Taxi Back (according to Raymer: 0.992(A340)-0.997(A320))" Unit="-" Default="0.995"> - <value>0.995</value> - <default>0.995</default> - </mf_land> - </Fractions> - </Masses> - </analytical_approach> - </tube_and_wing> - </program_settings> +<?xml version="1.0" encoding="utf-8" ?> +<module_configuration_file name="initial_sizing_conf.xml"> + <control_settings description="General control settings for this tool"> + <aircraft_exchange_file_name description="Specify the name of the exchange file"> + <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> + </aircraft_exchange_file_directory> + <own_tool_level description="Specify the tool level of this tool"> + <value>1</value> + </own_tool_level> + <console_output description="Selector to specify the console output. Selector: mode_0 (Off) / mode_1 (only out/err/warn) / mode_2 (1 + info) / mode_3 (2 + debug)"> + <value>mode_1</value> + </console_output> + <log_file_output description="Selector to specify the log file output. Selector: mode_0 (Off) / mode_1 (only out/err/warn) / mode_2 (1 + info) / mode_3 (2 + debug)"> + <value>mode_1</value> + </log_file_output> + <plot_output description="Specify the way plotting shall be handled"> + <enable description="Switch to enable plotting. Switch: true (On) / false (Off)"> + <value>true</value> + </enable> + <copy_plotting_files description="Switch if plotting files shall be copied. Switch: true (On) / false (Off)"> + <value>true</value> + </copy_plotting_files> + <delete_plotting_files_from_tool_folder description="Switch if plotting files shall be deleted from folder. Switch: true (On) / false (Off)"> + <value>true</value> + </delete_plotting_files_from_tool_folder> + </plot_output> + <report_output description="Switch to generate an HTML report. Switch: true (On) / false (Off)"> + <value>true</value> + </report_output> + <tex_report description="Switch to generate a Tex report. Switch: true (On) / false (Off)"> + <value>true</value> + </tex_report> + <write_info_files description="Switch to generate info files. Switch: true (On) / false (Off)"> + <value>false</value> + </write_info_files> + <log_file description="Specify the name of the log file"> + <value>initial_sizing.log</value> + </log_file> + <inkscape_path description="Path to the inkscape application (DEFAULT: Use inkscape from the UNICADO repo structure)"> + <value>../inkscape/</value> + </inkscape_path> + <gnuplot_path description="Path to the gnuplot application (DEFAULT: Use gnuplot from the UNICADO repo structure)"> + <value>../gnuplot/</value> + </gnuplot_path> + </control_settings> + <program_settings description="program settings"> + <design_case description="Switch for system sizing. 1: Sizing, 0: ONLY determination of a load profile for a specific mission"> + <value>1</value> + <default>1</default> + </design_case> + <tube_and_wing description="settings for tube and wing (TAW)"> + <approach_selection description="selection of approach level"> + <value>analytical</value> + </approach_selection> + <analytical_approach> + <General> + <OswaldFactor description="Oswald factor in clean configuration" Unit="-"> + <value>0.85</value> + <default>0.85</default> + </OswaldFactor> + <AspectRatio description="aspect ratio" Unit="count"> + <value>9.5</value> + <default>9.5</default> + </AspectRatio> + <n_pilots description="Number of Pilots" Unit="count"> + <value>2</value> + <default>2</default> + </n_pilots> + <n_engines description="Number of engines" Unit="count"> + <value>2</value> + <default>2</default> + </n_engines> + <Cf description="friction coefficient" Unit="count"> + <value>0.002</value> + <default>0.002</default> + </Cf> + </General> + <Constants> + <SFC_kerosene description="Specific Fuel Consumption Factor for Kerosene"> + <value>0.0001389</value> + <default>0.0001389</default> + </SFC_kerosene> + </Constants> + <TOFL description="takeoff distance requirement"> + <CLmax_TO description="Maximum lift coefficient at takeoff" Unit="-"> + <value>2.55</value> + <default>2.28</default> + </CLmax_TO> + </TOFL> + <LDN description="landing distance requirement"> + <CLmax_L description="Maximum lift coefficient at landing" Unit="-"> + <value>2.9</value> + <default>2.85</default> + </CLmax_L> + <mlmo description="ratio between maximum landing mass and takeoff mass" Unit="-"> + <value>0.82</value> + <default>0.82</default> + </mlmo> + </LDN> + <Climb description="climb performance requirement"> + <deltaCD_HL description="Delta CD0 with TO-Flaps" Unit="-"> + <value>0.07</value> + <default>0.07</default> + </deltaCD_HL> + </Climb> + <Cruise description="maximum cruise speed requirement"> + <mcr_mto description="ratio between cruise mass and takeoff mass - default for mid- and short-range: 0.956, default for long range: 0.924"> + <value>0.956</value> + <default>0.956</default> + </mcr_mto> + <optimalCL description="maximum CL at initial cruise"> + <value>0.57</value> + <default>0.57</default> + </optimalCL> + </Cruise> + <LiftToDragRatios description="initial cruise and loiter lift to drag ratios "> + <LD_initial_cruise description="cruise requirements"> + <value>15</value> + <default>15</default> + </LD_initial_cruise> + <LD_initial_loiter description="loiter requirements"> + <value>16</value> + <default>16</default> + </LD_initial_loiter> + </LiftToDragRatios> + <Masses description="mass estimation methodology"> + <Fractions description="mass fractions"> + <mf_warmup description="Warmup (according to Raymer: 0.97(A340)-0.99(A320))" Unit="-" Default="0.99"> + <value>0.99</value> + <default>0.99</default> + </mf_warmup> + <mf_taxi description="Warmup (according to Raymer: 0.97(A340)-0.99(A320))" Unit="-" Default="0.99"> + <value>0.99</value> + <default>0.99</default> + </mf_taxi> + <mf_to description="Taxi and Takeoff (according to Raymer: 0.97(A340)-0.99(A320))" Unit="-" Default="0.995"> + <value>0.995</value> + <default>0.995</default> + </mf_to> + <mf_climb description="Climb (according to Raymer: 0.97(A340)-0.99(A320))" Unit="-" Default="0.98"> + <value>0.98</value> + <default>0.98</default> + </mf_climb> + <mf_descent description="Descent (according to Raymer: 0.99(A340)-0.995(A320))" Unit="-" Default="0.99"> + <value>0.99</value> + <default>0.99</default> + </mf_descent> + <mf_missedandclimb description="Landing and Taxi Back (according to Raymer: 0.992(A340)-0.997(A320))" Unit="-" Default="0.988"> + <value>0.988</value> + <default>0.988</default> + </mf_missedandclimb> + <mf_land description="Landing and Taxi Back (according to Raymer: 0.992(A340)-0.997(A320))" Unit="-" Default="0.995"> + <value>0.995</value> + <default>0.995</default> + </mf_land> + </Fractions> + </Masses> + </analytical_approach> + </tube_and_wing> + </program_settings> </module_configuration_file> \ No newline at end of file diff --git a/landing_gear_design/src/wing_mounted/empirical/landing_gear_design_tu_berlin/general/call_functions/prepareexternaldata.py b/landing_gear_design/src/wing_mounted/empirical/landing_gear_design_tu_berlin/general/call_functions/prepareexternaldata.py index 5c8838caa768f3063f77cda800cc00ed660e516e..1815313efde5ef3115d708ba3ca5b8e360b967e8 100644 --- a/landing_gear_design/src/wing_mounted/empirical/landing_gear_design_tu_berlin/general/call_functions/prepareexternaldata.py +++ b/landing_gear_design/src/wing_mounted/empirical/landing_gear_design_tu_berlin/general/call_functions/prepareexternaldata.py @@ -22,7 +22,7 @@ def prepare_external_data(paths_and_names, routing_dict, dict_ac_exchange, dict_ if dict_ac_exchange['center_of_gravity_in_x'] is not None \ and dict_ac_exchange['wing_reference_point_global_in_x'] is not None: # Create the factory - airfoil_data_dir = f'{paths_and_names["project_directory"]}/geometryData/airfoilData' + airfoil_data_dir = f'{paths_and_names["project_directory"]}/geometry_data/airfoil_data' aircraft_exchange_file = aixml.openDocument(paths_and_names['path_to_aircraft_exchange_file']) factory = geom2.factory.WingFactory(aircraft_exchange_file, airfoil_data_dir) # Create the surface diff --git a/libs b/libs index 1494d2d52a4736cca657f4f93d30be2bf1f0b3f8..4bc808018f2d8aff32ab6c7a445cfbcafb0d3187 160000 --- a/libs +++ b/libs @@ -1 +1 @@ -Subproject commit 1494d2d52a4736cca657f4f93d30be2bf1f0b3f8 +Subproject commit 4bc808018f2d8aff32ab6c7a445cfbcafb0d3187 diff --git a/performance_assessment/CMakeLists.txt b/performance_assessment/CMakeLists.txt index 9b3e7a8835b087e7f1ef7e9a89fe17ae4f0fcaf6..ce8e303a701ca1fe0a80e340e11ca54edf239cb1 100644 --- a/performance_assessment/CMakeLists.txt +++ b/performance_assessment/CMakeLists.txt @@ -11,7 +11,7 @@ set(MODULE_NAME performance_assessment) # ============================================== set(MODULE_SOURCES src/${MODULE_NAME}.cpp - src/taw/defaultmethods/performance_assessment_factory.cpp + src/taw/defaultMethods/performance_assessment_factory.cpp src/taw/defaultMethods/missionDefinition.cpp src/taw/defaultMethods/performance_assessment_settings.cpp src/taw/defaultMethods/performance_assessment_output.cpp diff --git a/systems_design/src/standardSystemsDesign.cpp b/systems_design/src/standardSystemsDesign.cpp index 3a3a781282842a24a3291a775fccb206c336c0b0..125a1669de622ab0cadca52913b00e3b57a70d45 100644 --- a/systems_design/src/standardSystemsDesign.cpp +++ b/systems_design/src/standardSystemsDesign.cpp @@ -40,10 +40,10 @@ void standardSystemsDesign::initialize() { /* Initializing IOData */ data_ = std::make_shared<systemsIOData>(*rtIO_, config, rtIO_->getMissionDataDir()); /* Read geometry components from aircraft xml */ - data_->readFuselages(rtIO_->acxml, rtIO_->getIODir()+"/"); - data_->readNacelles(rtIO_->acxml, rtIO_->getIODir()+"/"); - data_->readWing(rtIO_->acxml, rtIO_->getIODir()+"/"); - data_->readEmpennage(rtIO_->acxml, rtIO_->getIODir()+"/"); + data_->readFuselages(rtIO_->acxml, rtIO_->getGeometryDir()); + data_->readNacelles(rtIO_->acxml, rtIO_->getGeometryDir()); + data_->readWing(rtIO_->acxml, rtIO_->getAirfoilDataDir()); + data_->readEmpennage(rtIO_->acxml, rtIO_->getAirfoilDataDir()); /* Initializing values with data from the aircraft xml */ data_->readPropulsion(rtIO_->acxml, rtIO_->getEngineDataDir()); diff --git a/systems_design/src/systemsIOData.cpp b/systems_design/src/systemsIOData.cpp index 5ccde8b96d78005942988e3c55d21bf7e54eeabc..bbad4a8fa15c5f91884e6bda9460bdf2c79dc3c9 100644 --- a/systems_design/src/systemsIOData.cpp +++ b/systems_design/src/systemsIOData.cpp @@ -63,18 +63,19 @@ std::string systemsIOData::getMissionFile(std::string mission_data_dir) { } if (!fileExists(mission_data_dir + "/" + missionFile)) { std::stringstream errorMsg; - errorMsg << "Mission file \"" << missionFile << "\" for the " << missionType << " does not exist. Please activate switch in createMissionXML. Abort program."; + errorMsg << "Mission file \"" << mission_data_dir << "/" << missionFile << "\" for the " << missionType + << " does not exist. Please activate switch in createMissionXML. Abort program."; throwError(__FILE__, __func__, __LINE__, errorMsg.str()); } return missionFile; } -void systemsIOData::readWing(const node& acxml, const std::string& ioDir) { +void systemsIOData::readWing(const node& acxml, const std::string& airfoilDir) { std::vector<node*> wingVector = acxml.getVector("aircraft_exchange_file/component_design/wing/specific/geometry/aerodynamic_surface"); std::shared_ptr<node> ACXML = std::make_shared<node>(acxml); // wing factory requires this format node aircraftXML = acxml; std::shared_ptr<node> AcXML = std::make_shared<node>(aircraftXML); - geom2::WingFactory theWingfactory{ACXML, ioDir + "geometryData/airfoilData"}; // wing factory + geom2::WingFactory theWingfactory{ACXML, airfoilDir}; // wing factory for (size_t i = 0; i < wingVector.size(); i++) { Wing newWing; newWing.aerodynamicSurface = theWingfactory.create("wing/specific/geometry/aerodynamic_surface@0"); @@ -85,7 +86,7 @@ void systemsIOData::readWing(const node& acxml, const std::string& ioDir) { try { std::vector<node*> controlDeviceVector = acxml.getVector("aircraft_exchange_file/component_design/wing/specific/geometry/aerodynamic_surface/parameters/control_devices/control_device"); - geom2::ControlDeviceFactory theControlDevicefactory{ACXML, "./geometryData/airfoilData"}; // control device factory + geom2::ControlDeviceFactory theControlDevicefactory{ACXML, airfoilDir}; // control device factory for (size_t j = 0; j < controlDeviceVector.size(); j++) { theWing.at(i).controlSurface.push_back(theControlDevicefactory.create("wing/specific/geometry/aerodynamic_surface@" + num2Str(i) + "/control_devices/control_device@" + num2Str(j))); @@ -111,7 +112,7 @@ void systemsIOData::readWing(const node& acxml, const std::string& ioDir) { } } -void systemsIOData::readEmpennage(const node& acxml, const std::string& ioDir) { +void systemsIOData::readEmpennage(const node& acxml, const std::string& airfoilDir) { std::vector<node*> empennageVector = acxml.getVector("aircraft_exchange_file/component_design/empennage/specific/geometry/aerodynamic_surface"); std::shared_ptr<node> ACXML = std::make_shared<node>(acxml); // factory requires this format for (size_t i = 0; i < empennageVector.size(); i++) { @@ -119,7 +120,7 @@ void systemsIOData::readEmpennage(const node& acxml, const std::string& ioDir) { myRuntimeInfo->out << "Create: Empennage " << tmp_name << " ..." << std::endl; if (tmp_name == "vertical_stabiliser" || tmp_name == "horizontal_stabiliser" || tmp_name == "vertical_stabilizer" || tmp_name == "horizontal_stabilizer") { - geom2::WingFactory Finfactory{ACXML, ioDir + "geometryData/airfoilData"}; + geom2::WingFactory Finfactory{ACXML, airfoilDir}; Empennage newEmpennage; newEmpennage.aerodynamicSurface = Finfactory.create("empennage/specific/geometry/aerodynamic_surface@" + num2Str(i)); theEmpennage.push_back(newEmpennage); @@ -131,7 +132,7 @@ void systemsIOData::readEmpennage(const node& acxml, const std::string& ioDir) { acxml.getVector("aircraft_exchange_file/component_design/empennage/specific/geometry/aerodynamic_surface@" + num2Str(i) + "/parameters/control_devices"); for (size_t j = 0; j < EmpennageControlDeviceVector.size(); j++) { - geom2::ControlDeviceFactory theControlDevicefactory{ACXML, "./geometryData/airfoilData"}; // control device factory + geom2::ControlDeviceFactory theControlDevicefactory{ACXML, airfoilDir}; // control device factory theEmpennage.at(i).controlSurface.push_back(theControlDevicefactory.create("empennage/specific/geometry/aerodynamic_surface@" + num2Str(i) + "/control_devices/control_device@" + num2Str(j))); theEmpennage.at(i).controlSurface.back().name = acxml.at("aircraft_exchange_file/component_design/empennage/specific/geometry/aerodynamic_surface@" + num2Str(i) + @@ -144,11 +145,11 @@ void systemsIOData::readEmpennage(const node& acxml, const std::string& ioDir) { } } -void systemsIOData::readFuselages(const node& acxml, const std::string& ioDir) { +void systemsIOData::readFuselages(const node& acxml, const std::string& geometryDir) { std::shared_ptr<node> ACXML = std::make_shared<node>(acxml); //fuselage factory requires this format std::vector<node*> fuselageVector = acxml.getVector("aircraft_exchange_file/component_design/fuselage/specific/geometry/fuselage"); std::string path_to_fuselage = "aircraft_exchange_file/component_design/fuselage"; - geom2::FuselageFactory fuselageFactory{ACXML, ioDir + "geometryData"}; + geom2::FuselageFactory fuselageFactory{ACXML, geometryDir}; for (size_t i(0); i < fuselageVector.size(); ++i) { theFuselage.push_back(fuselageFactory.create("fuselage/specific/geometry/fuselage@" + num2Str(i))); myRuntimeInfo->out << "Create: " << theFuselage.at(i).name << " ..." << std::endl; @@ -158,10 +159,10 @@ void systemsIOData::readFuselages(const node& acxml, const std::string& ioDir) { } } -void systemsIOData::readNacelles(const node& acxml, const std::string& ioDir) { +void systemsIOData::readNacelles(const node& acxml, const std::string& geometryDir) { std::shared_ptr<node> ACXML = std::make_shared<node>(acxml); // hull factory requires this format std::vector<node*> propulsorVector = acxml.getVector("aircraft_exchange_file/requirements_and_specifications/design_specification/propulsion/propulsor/"); - geom2::HullFactory nacelleFactory(ACXML, ioDir + "geometryData"); + geom2::HullFactory nacelleFactory(ACXML, geometryDir); for (size_t j(0); j < propulsorVector.size(); j++) { std::vector<node*> nacelleVector = acxml.getVector("aircraft_exchange_file/component_design/propulsion/specific/propulsion@" + num2Str(j) + "/nacelle"); diff --git a/systems_design/src/systemsIOData.h b/systems_design/src/systemsIOData.h index 799dbba2325ce51a0400ba1a461aa768f659e7d3..6f833006c95f5d32909b4139a3c93fc60b4f3fca 100644 --- a/systems_design/src/systemsIOData.h +++ b/systems_design/src/systemsIOData.h @@ -206,36 +206,36 @@ class systemsIOData { * \brief Reads all wing surface geometry and the wings control surfaces and spars from * the acxml. * \param acxml aircraft xml - * \param ioDir IO directory (needed for geometry files) + * \param airfoilDir airfoil directory * \return void */ - void readWing(const node& acxml, const std::string& ioDir); + void readWing(const node& acxml, const std::string& airfoilDir); /** * \brief Reads all empennage surfaces and their control devices from the acxml. * \note current implementation checks for fin and horizontal tail since aircraft systems * do not yet have methods for v-tail or other unconventional tails. * \param acxml aircraft xml - * \param ioDir IO directory (needed for geometry files) + * \param airfoilDir airfoil directory * \return void */ - void readEmpennage(const node& acxml, const std::string& ioDir); + void readEmpennage(const node& acxml, const std::string& airfoilDir); /** * \brief Reads all fuselages from the acxml. * \param acxml aircraft xml - * \param ioDir IO directory (needed for geometry files) + * \param geometryDir geometry directory (needed for geometry files) * \return void */ - void readFuselages(const node& acxml, const std::string& ioDir); + void readFuselages(const node& acxml, const std::string& geometryDir); /** * \brief Reads all nacelles from acxml (for all propulsors) * \param acxml aircraft xml - * \param ioDir IO directory (needed for geometry files) + * \param geometryDir geometry directory (needed for geometry files) * \return void */ - void readNacelles(const node& acxml, const std::string& ioDir); + void readNacelles(const node& acxml, const std::string& geometryDir); /** * \brief Reads strut length and landing gear name of each gear from the acxml. diff --git a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/tankdesigntuberlin.py b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/tankdesigntuberlin.py index 9ed9201281e6fbe07c32708bf7018dfc05198954..01485ca847ffd81aaf8cd0a251f92a565cdcec32 100644 --- a/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/tankdesigntuberlin.py +++ b/tank_design/src/tube_and_wing/empirical/tank_design_tu_berlin/general/tankdesigntuberlin.py @@ -36,7 +36,7 @@ def tank_design_tu_berlin(paths_and_names, routing_dict, dict_ac_data, runtime_o """ """ Extract aerodynamic surfaces values using the aircraftGeometry2 library.""" # Create the factory - airfoil_data_dir = f'{paths_and_names["project_directory"]}/geometryData/airfoilData' + airfoil_data_dir = f'{paths_and_names["project_directory"]}/geometry_data/airfoil_data' aircraft_exchange_file = aixml.openDocument(paths_and_names['path_to_aircraft_exchange_file']) factory = geom2.factory.WingFactory(aircraft_exchange_file, airfoil_data_dir) # Create the surface