diff --git a/aerodynamic_analysis/aerodynamic_analysis_conf.xml b/aerodynamic_analysis/aerodynamic_analysis_conf.xml index 327d3d1b905403025cd142d90e7ce8d834c07ad6..0ab8dfa88671bdc5be3e8f808090547612f392e7 100644 --- a/aerodynamic_analysis/aerodynamic_analysis_conf.xml +++ b/aerodynamic_analysis/aerodynamic_analysis_conf.xml @@ -104,6 +104,23 @@ </bwbStrategies> </aeroStrategySelection> <FlightConditions description="Flight State"> + <AdaptMachNumbersToCruiseReq description="Relevant parameters in regards to automatic flight condition generation"> + <setAutomaticFlightConditions description="Switch to allow for automatic flight conditions. Switch: true (adapt flight conditions to initial cruise Mach number) / false (use flight conditions given here in config file)"> + <value>true</value> + <default>true</default> + </setAutomaticFlightConditions> + <extrapolation_margin description="Margin for extrapolation"> + <value>1</value> + <default>1</default> + <unit>1</unit> + <lower_boundary>0</lower_boundary> + <upper_boundary>1.1</upper_boundary> + </extrapolation_margin> + <allow_grid_change description="Switch to allow grid change. Switch: true (On) / false (Off)"> + <value>true</value> + <default>true</default> + </allow_grid_change> + </AdaptMachNumbersToCruiseReq> <FlightCondition ID="0" description="Description of the flight condition"> <extrapolation_margin description="Margin for extrapolation"> <value>1</value> diff --git a/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.cpp b/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.cpp index 16bc85617ff595bc1f94f22ed7d9b529a174a4ae..eb2849ec4b11518f6d49be30e7b5a48e70961d35 100644 --- a/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.cpp +++ b/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.cpp @@ -46,7 +46,7 @@ bwbCalculatePolarConfig::bwbCalculatePolarConfig(const node& config) pathToLiftingLine(EndnodeReadOnly<std::string>("program_settings/LiftingLine/FolderPath")), stepWidthCL(EndnodeReadOnly<double>("LiftingLineForTAW/stepWidthCL")), // other settings - setFlightConditionsMode(EndnodeReadOnly<std::string>("program_settings/FlightConditions/AdaptMachNumbersToCruiseReq")), + setFlightConditionsMode(EndnodeReadOnly<bool>("program_settings/FlightConditions/AdaptMachNumbersToCruiseReq/setAutomaticFlightConditions").read(config).value()), // lifting line for TAW pitching moment corrections delta_CM0(EndnodeReadOnly<double>("LiftingLineForTAW/PitchingMoment/delta_CM0")), delta_dCMdCL(EndnodeReadOnly<double>("LiftingLineForTAW/PitchingMoment/delta_dCMdCL")), @@ -80,7 +80,6 @@ bwbCalculatePolarConfig::bwbCalculatePolarConfig(const node& config) factorDragHL(EndnodeReadOnly<double>("program_settings/SemiEmpiricalHighLiftAdaptions/factorDrag")) { CLModeAirfoilSelection.read(config); stepWidthCL.read(config); - setFlightConditionsMode.read(config); pathToLiftingLine.read(config); manualTransition.read(config); manualTransitionWing.read(config); @@ -110,13 +109,13 @@ bwbCalculatePolarConfig::bwbCalculatePolarConfig(const node& config) deltaTotalDragHL.read(config); factorDragHL.read(config); myRuntimeInfo->out << "config: " << liftingLineFolderPath << endl; - if (setFlightConditionsMode.value() == "mode_0") { + if (setFlightConditionsMode == false) { myRuntimeInfo->info << "set flight conditions from config xml" << endl; size_t numberFlightConditions(config.getVector(("program_settings/FlightConditions/FlightCondition"), 2).size()); for (size_t i(0); i < numberFlightConditions; i++) { readFlightConditions(config, i); } - } else if (setFlightConditionsMode.value() == "mode_1") { + } else if (setFlightConditionsMode == true) { myRuntimeInfo->info << "Hab vergessen was hier rein sollte" << endl; } CGPositions = {"design", "forward", "aft"}; diff --git a/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.h b/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.h index b1186c45792016c41aab196ea53166cbf197e963..d57d47fc97bb6b6cd8670632251c86e465fe4b99 100644 --- a/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.h +++ b/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.h @@ -43,7 +43,7 @@ class bwbCalculatePolarConfig{ EndnodeReadOnly<std::string> CLModeAirfoilSelection; /**< Switch which sets if lift coefficient at ICA, at TOC or at average cruise is chosen for airfoil selection */ EndnodeReadOnly<double> stepWidthCL; // fligt condition parameters - EndnodeReadOnly<std::string> setFlightConditionsMode; + bool setFlightConditionsMode; // lifting line pitching moment parameters EndnodeReadOnly<double> delta_CM0; EndnodeReadOnly<double> delta_dCMdCL; diff --git a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp index a79dbd21fbe72db78da7d65f30cbb1fca837c721..8fc0fbb6246d864cc79d3459ac980b7fe1afb3f1 100644 --- a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp +++ b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp @@ -49,7 +49,7 @@ tawCalculatePolarConfig::tawCalculatePolarConfig(const node& config) stepWidthCL(EndnodeReadOnly<double>("LiftingLineForTAW/stepWidthCL").read(config)), // other settings CLModeAirfoilSelection(EndnodeReadOnly<std::string>("program_settings/CLModeAirfoilSelection").read(config)), - setFlightConditionsMode(EndnodeReadOnly<std::string>("program_settings/FlightConditions/AdaptMachNumbersToCruiseReq", "mode_0").read(config)), + setFlightConditionsMode(EndnodeReadOnly<bool>("program_settings/FlightConditions/AdaptMachNumbersToCruiseReq/setAutomaticFlightConditions").read(config).value()), 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").read(config)), @@ -102,23 +102,23 @@ tawCalculatePolarConfig::tawCalculatePolarConfig(const node& 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()) { + apply_manual_CLmax_hl_values(EndnodeReadOnly<bool>("program_settings/SemiEmpiricalHighLiftAdaptions/apply_manual_CLmax_hl_values").read(config).value()), + autoFC_allowGridChange(EndnodeReadOnly<bool>("program_settings/FlightConditions/AdaptMachNumbersToCruiseReq/allow_grid_change").read(config).value()), + autoFC_extrapolationMargin(EndnodeReadOnly<double>("program_settings/FlightConditions/AdaptMachNumbersToCruiseReq/extrapolation_margin").read(config).value()) { // Constructor liftingLineFolderPath = pathToLiftingLine.value(); - myRuntimeInfo->out << "config: " << liftingLineFolderPath << endl; - if (setFlightConditionsMode.value() == "mode_0") { + myRuntimeInfo->out << "config: " << liftingLineFolderPath << endl; + if (!setFlightConditionsMode) { myRuntimeInfo->info << "set flight conditions from config xml" << endl; size_t numberFlightConditions(config.getVector(("program_settings/FlightConditions/FlightCondition"), 2).size()); for (size_t i(0); i < numberFlightConditions; i++) { readFlightConditions(config, i); } - //Sort flight conditions asc by Mach numbers + // Sort flight conditions asc by Mach numbers std::sort(flightConditions.begin(), flightConditions.end(), [](const flightCondition& firstFC, const flightCondition& secondFC) { return firstFC.Mach <= secondFC.Mach; }); - } else if (setFlightConditionsMode.value() == "mode_1") { - myRuntimeInfo->info << "Hab vergessen was hier rein sollte" << endl; } this->initializeTrimSettings(config); this->read_hl_calibration_factors(config); diff --git a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h index 049213a36de5017d1c8559856f02a98a39d95999..5560d23857e7978f12db7e9dc7bf48fefe86849e 100644 --- a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h +++ b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h @@ -45,7 +45,9 @@ class tawCalculatePolarConfig{ EndnodeReadOnly<double> stepWidthCL; EndnodeReadOnly<std::string> CLModeAirfoilSelection; // fligt condition parameters - EndnodeReadOnly<std::string> setFlightConditionsMode; + bool setFlightConditionsMode; + bool autoFC_allowGridChange; + double autoFC_extrapolationMargin; // lifting line pitching moment parameters EndnodeReadOnly<std::string> CM_corr_fuselage_mode; EndnodeReadOnly<std::string> CM_corr_nacelle_mode; @@ -121,9 +123,9 @@ class tawCalculatePolarConfig{ /* 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 */ + double CL_max = NAN; /**< maximum CL value which should be reached */ + double delta_CD = NAN; /**< Constant delta for drag calibration */ + double factor_CD = NAN; /**< 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 */ diff --git a/aerodynamic_analysis/src/taw/tawDefaultData.cpp b/aerodynamic_analysis/src/taw/tawDefaultData.cpp index 89b07197f7cdce0a2a8b3788e30b7ee79c78bbaf..92d7b680e860e73078a9ba41452b94d3a623f0cc 100644 --- a/aerodynamic_analysis/src/taw/tawDefaultData.cpp +++ b/aerodynamic_analysis/src/taw/tawDefaultData.cpp @@ -42,6 +42,8 @@ tawDefaultData::tawDefaultData(const std::shared_ptr<RuntimeIO>& rtIO) engineType(EndnodeReadOnly<std::string>("type").read(rtIO->acxml.at("requirements_and_specifications/design_specification/propulsion/propulsor")).value()), initialCruiseMachNumber(EndnodeReadOnly<double>("initial_cruise_mach_number").read( rtIO->acxml.at("requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission")).value()), + initialCruise_Altitude( + EndnodeReadOnly<double>("requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission/initial_cruise_altitude").read(rtIO->acxml).value()), bestCruiseCL(EndnodeReadOnly<double>("analysis/aerodynamics/lift_coefficients/C_LoptimumCruise").read(rtIO->acxml).value()), designCoGX(EndnodeReadOnly<double>("analysis/masses_cg_inertia/design_mass/mass_properties/center_of_gravity/x").read(rtIO->acxml).value()), designCoGY(EndnodeReadOnly<double>("analysis/masses_cg_inertia/design_mass/mass_properties/center_of_gravity/y").read(rtIO->acxml).value()), diff --git a/aerodynamic_analysis/src/taw/tawDefaultData.h b/aerodynamic_analysis/src/taw/tawDefaultData.h index deb545803b0822a12b3e899746a5c0aee795c7d0..2fb7370f68cc38cc6b1b0848eb6824353ac864be 100644 --- a/aerodynamic_analysis/src/taw/tawDefaultData.h +++ b/aerodynamic_analysis/src/taw/tawDefaultData.h @@ -50,6 +50,7 @@ class tawDefaultData { std::string engineType; /**< Information about the propulsor type (e.g. fan) [-] */ double delta_isa; /**< temperature delta to ISA Standard Atmosphere [K] */ double initialCruiseMachNumber; /**< Mach number flown in initial cruise phase at initial cruise altitude [-] */ + double initialCruise_Altitude; /**< Initial cruise altitude [m] */ /* All EndnodeReadOnly Values are converted automatically to SI-Units/RADIAN when read in */ double bestCruiseCL; /**< optimum cruise lift coefficient */ double designCoGX; /**< x Position of design center of gravity in [m] */ diff --git a/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp b/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp index 6663ab4146cc56f6ee005354004728bdd24bd338..94a87e214a26b112654f75c15331fc1416a24d81 100644 --- a/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp +++ b/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp @@ -50,6 +50,7 @@ #include "../methods/waveDragMason.h" #include "../methods/semiEmpiricalHighLiftAdaption.h" #include "../methods/trimInterpolation.h" +#include "../flightCondition.h" using std::endl; using std::exception; @@ -86,6 +87,79 @@ void tawDefaultStrategy::run() { CoGPositions["aft"] = data_->aftCoG; } + // set individual flight conditions if enabled + if (config_->setFlightConditionsMode) { + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = 0.2; + config_->flightConditions.back().Altitude = 0; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = 0.5; + config_->flightConditions.back().Altitude = 3048; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = 0.6; + config_->flightConditions.back().Altitude = 6096; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = data_->initialCruiseMachNumber - 0.15; + config_->flightConditions.back().Altitude = data_->initialCruise_Altitude; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = data_->initialCruiseMachNumber - 0.1; + config_->flightConditions.back().Altitude = data_->initialCruise_Altitude; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = data_->initialCruiseMachNumber - 0.05; + config_->flightConditions.back().Altitude = data_->initialCruise_Altitude; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = data_->initialCruiseMachNumber - 0.02; + config_->flightConditions.back().Altitude = data_->initialCruise_Altitude; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = data_->initialCruiseMachNumber; + config_->flightConditions.back().Altitude = data_->initialCruise_Altitude; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = data_->initialCruiseMachNumber + 0.01; + config_->flightConditions.back().Altitude = data_->initialCruise_Altitude; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + + config_->flightConditions.push_back(flightCondition()); + config_->flightConditions.back().Mach = data_->initialCruiseMachNumber + 0.05; + config_->flightConditions.back().Altitude = data_->initialCruise_Altitude; + config_->flightConditions.back().extrapolationMargin = config_->autoFC_extrapolationMargin; + config_->flightConditions.back().allowGridChange = config_->autoFC_allowGridChange; + config_->machNumbers.push_back(config_->flightConditions.back().Mach); + } + // loop over all cg positions and stabilizer angles for (size_t CGID(0); CGID < config_->CGPositions.size(); ++CGID) { for (size_t stabID(0); stabID < config_->stabAngles.size(); ++stabID) {