diff --git a/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.cpp b/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.cpp index 216fa992ddf9957d10d2a652c654434cc5ee8bed..16bc85617ff595bc1f94f22ed7d9b529a174a4ae 100644 --- a/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.cpp +++ b/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.cpp @@ -114,7 +114,7 @@ bwbCalculatePolarConfig::bwbCalculatePolarConfig(const node& config) 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); + readFlightConditions(config, i); } } else if (setFlightConditionsMode.value() == "mode_1") { myRuntimeInfo->info << "Hab vergessen was hier rein sollte" << endl; @@ -122,7 +122,7 @@ bwbCalculatePolarConfig::bwbCalculatePolarConfig(const node& config) CGPositions = {"design", "forward", "aft"}; } -void bwbCalculatePolarConfig::readflightConditions(const node& config, size_t ID) { +void bwbCalculatePolarConfig::readFlightConditions(const node& config, size_t ID) { EndnodeReadOnly flightConditionExtrapolationMargin(EndnodeReadOnly<double>("program_settings/FlightConditions/FlightCondition@" + num2Str(ID) + "/extrapolation_margin")); EndnodeReadOnly flightConditionAltitude(EndnodeReadOnly<double>("program_settings/FlightConditions/FlightCondition@" + num2Str(ID) + "/Altitude")); EndnodeReadOnly flightConditionMach(EndnodeReadOnly<double>("program_settings/FlightConditions/FlightCondition@" + num2Str(ID) + "/Mach")); diff --git a/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.h b/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.h index 1f9983ca1e7f1dbeb1ba161c3d3ccfe0d7b6963e..b1186c45792016c41aab196ea53166cbf197e963 100644 --- a/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.h +++ b/aerodynamic_analysis/src/bwb/bwbCalculatePolarConfig.h @@ -82,7 +82,6 @@ class bwbCalculatePolarConfig{ EndnodeReadOnly<double> deltaTotalDragHL; EndnodeReadOnly<double> factorDragHL; - void readflightConditions(const node& config, size_t ID); explicit bwbCalculatePolarConfig(const node& config); virtual ~bwbCalculatePolarConfig() {} // explicit calculatePolarSettings(const node& configXML); @@ -130,9 +129,10 @@ class bwbCalculatePolarConfig{ */ void readPolarSettings(const node& polarNode); /** \brief Function reads flight condition settings from configuration XML and stores them in class variables - * \param &flightConditionNode aixml node that contains flight condition information from corresponding XML file + * \param &config aixml node that contains the config root + * \param ID an index value of the current flight condition */ - void readFlightConditions(const node& flightConditionNode); + void readFlightConditions(const node& config, size_t ID); /** \brief Function reads viscous drag settings from configuration XML and stores them in class variables * \param &viscousDragNode aixml node that contains flight condition information from corresponding XML file */ diff --git a/aerodynamic_analysis/src/bwb/bwbDefaultStrategy.cpp b/aerodynamic_analysis/src/bwb/bwbDefaultStrategy.cpp index 2d03ca0fcf1d086b1160b095d7517b92ce7219aa..fee01261d1318389f580371963dd4583a8c387de 100644 --- a/aerodynamic_analysis/src/bwb/bwbDefaultStrategy.cpp +++ b/aerodynamic_analysis/src/bwb/bwbDefaultStrategy.cpp @@ -123,18 +123,28 @@ void bwbDefaultStrategy::initializeLiLiPolar(LiLiPolarInitialization *myLiLiPola myLiLiPolarInit->factorDragCleanPolar = config_->factorIndDragCleanPolar.value(); myLiLiPolarInit->bestCruiseCL = data_->bestCruiseCL.value(); myLiLiPolarInit->initialMachCruise = data_->initialCruiseMachNumber; - for (size_t flightConditionID(0); flightConditionID < config_->flightConditions.size(); ++flightConditionID) { - flightCondition* aLiLiFlightCondition = new flightCondition; - aLiLiFlightCondition->Mach = config_->flightConditions.at(flightConditionID).Mach; - aLiLiFlightCondition->Altitude = config_->flightConditions.at(flightConditionID).Altitude; - aLiLiFlightCondition->extrapolationMargin = config_->flightConditions.at(flightConditionID).extrapolationMargin; - aLiLiFlightCondition->allowGridChange = config_->flightConditions.at(flightConditionID).allowGridChange; - myLiLiPolarInit->flightConditions.push_back(*aLiLiFlightCondition); - if (accuracyCheck(aLiLiFlightCondition->Mach, data_->initialCruiseMachNumber, ACCURACY_HIGH)) { - myLiLiPolarInit->cruiseMachID = flightConditionID; - } - delete aLiLiFlightCondition; + myLiLiPolarInit->flightConditions = config_->flightConditions; + std::vector<flightCondition>::iterator theCruiseFlightConditionIterator(std::find_if(myLiLiPolarInit->flightConditions.begin(), myLiLiPolarInit->flightConditions.end(), + [myLiLiPolarInit](const flightCondition& aFlightCondition) { + return accuracyCheck(aFlightCondition.Mach, myLiLiPolarInit->initialMachCruise, ACCURACY_HIGH); + })); + if (theCruiseFlightConditionIterator == myLiLiPolarInit->flightConditions.end()) { //Cruise flight condition not yet available + flightCondition* theCruiseFlightCondition = new flightCondition; + theCruiseFlightCondition->Mach = data_->initialCruiseMachNumber; + theCruiseFlightCondition->Altitude = myLiLiPolarInit->flightConditions.back().Altitude; + theCruiseFlightCondition->extrapolationMargin = myLiLiPolarInit->flightConditions.back().extrapolationMargin; + theCruiseFlightCondition->allowGridChange = myLiLiPolarInit->flightConditions.back().allowGridChange; + theCruiseFlightConditionIterator = std::find_if(myLiLiPolarInit->flightConditions.begin(), myLiLiPolarInit->flightConditions.end(), + [myLiLiPolarInit](const flightCondition& aFlightCondition) { + return myLiLiPolarInit->initialMachCruise <= aFlightCondition.Mach; + }); + theCruiseFlightConditionIterator = (myLiLiPolarInit->flightConditions).insert(theCruiseFlightConditionIterator, *theCruiseFlightCondition); + std::stringstream warnMessage; + warnMessage << "Initial Cruise Mach number of Ma = " << myLiLiPolarInit->initialMachCruise << " is not available in flight conditions given in config file. "; + warnMessage << "Inserted flight condition for Ma = " << myLiLiPolarInit->initialMachCruise << " automatically."; + myRuntimeInfo->warn << warnMessage.str() << std::endl; } + myLiLiPolarInit->cruiseMachID = static_cast<int>(theCruiseFlightConditionIterator - myLiLiPolarInit->flightConditions.begin()); myLiLiPolarInit->liftingSurfaces = liftingSurfaces; } @@ -177,7 +187,7 @@ void bwbDefaultStrategy::initializeWaveDragMason(waveDragInitialization *myWaveD } void bwbDefaultStrategy::getPolarDataFromLiftingLine(const liftingLinePolar& myLiftingLinePolar) { - for (size_t machID(0); machID < config_->flightConditions.size(); ++machID) { + for (size_t machID(0); machID < myLiftingLinePolar.theCleanPolars.size(); ++machID) { tawDefaultPolar aCleanPolar; aCleanPolar.extrapolationMargin = myLiftingLinePolar.theCleanPolars.at(machID).extrapolationMargin; aCleanPolar.allowGridChange = myLiftingLinePolar.theCleanPolars.at(machID).allowGridChange; diff --git a/aerodynamic_analysis/src/laminarTAW/laminarTAWConfig.cpp b/aerodynamic_analysis/src/laminarTAW/laminarTAWConfig.cpp index 8c55441ec18d31a8f7b3415ab9bd74a8505654ab..747e0df3cbeb1618100ee3b4a86683f510d1037d 100644 --- a/aerodynamic_analysis/src/laminarTAW/laminarTAWConfig.cpp +++ b/aerodynamic_analysis/src/laminarTAW/laminarTAWConfig.cpp @@ -135,7 +135,7 @@ laminarTAWConfig::laminarTAWConfig(const node& config) 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); + readFlightConditions(config, i); } } else if (setFlightConditionsMode.value() == "mode_1") { myRuntimeInfo->info << "Hab vergessen was hier rein sollte" << endl; @@ -143,7 +143,7 @@ laminarTAWConfig::laminarTAWConfig(const node& config) this->initializeTrimSettings(); } -void laminarTAWConfig::readflightConditions(const node& config, size_t ID) { +void laminarTAWConfig::readFlightConditions(const node& config, size_t ID) { EndnodeReadOnly flightConditionAllowExtrapolation(EndnodeReadOnly<std::string>("program_settings/FlightConditions/FlightCondition@" + num2Str(ID) + "/AllowExtrapolation")); EndnodeReadOnly flightConditionAltitude(EndnodeReadOnly<double>("program_settings/FlightConditions/FlightCondition@" + num2Str(ID) + "/Altitude")); EndnodeReadOnly flightConditionMach(EndnodeReadOnly<double>("program_settings/FlightConditions/FlightCondition@" + num2Str(ID) + "/Mach")); diff --git a/aerodynamic_analysis/src/laminarTAW/laminarTAWConfig.h b/aerodynamic_analysis/src/laminarTAW/laminarTAWConfig.h index 790883e8f312d6ff1d812825b5ac2125feb02e4a..8296ed256d6ad8ee848b9731512ad19252f318b8 100644 --- a/aerodynamic_analysis/src/laminarTAW/laminarTAWConfig.h +++ b/aerodynamic_analysis/src/laminarTAW/laminarTAWConfig.h @@ -88,7 +88,7 @@ class laminarTAWConfig{ // semi empirical high lift adaptions EndnodeReadOnly<double> deltaTotalDragHL; EndnodeReadOnly<double> factorDragHL; - void readflightConditions(const node& config, size_t ID); + void initializeTrimSettings(); explicit laminarTAWConfig(const node& config); @@ -130,9 +130,10 @@ class laminarTAWConfig{ */ void readPolarSettings(const node& polarNode); /** \brief Function reads flight condition settings from configuration XML and stores them in class variables - * \param &flightConditionNode aixml node that contains flight condition information from corresponding XML file + * \param &config aixml node that contains the config root + * \param ID an index value of the current flight condition */ - void readFlightConditions(const node& flightConditionNode); + void readFlightConditions(const node& config, size_t ID); /** \brief Function reads viscous drag settings from configuration XML and stores them in class variables * \param &viscousDragNode aixml node that contains flight condition information from corresponding XML file */ diff --git a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp index eba25fff371724f6c0ee796141e22289bcd886a8..a79dbd21fbe72db78da7d65f30cbb1fca837c721 100644 --- a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp +++ b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.cpp @@ -110,8 +110,13 @@ tawCalculatePolarConfig::tawCalculatePolarConfig(const node& config) 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); + readFlightConditions(config, i); } + //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; } @@ -119,7 +124,7 @@ tawCalculatePolarConfig::tawCalculatePolarConfig(const node& config) this->read_hl_calibration_factors(config); } -void tawCalculatePolarConfig::readflightConditions(const node& config, size_t ID) { +void tawCalculatePolarConfig::readFlightConditions(const node& config, size_t ID) { EndnodeReadOnly flightConditionExtrapolationMargin(EndnodeReadOnly<double>("program_settings/FlightConditions/FlightCondition@" + num2Str(ID) + "/extrapolation_margin")); EndnodeReadOnly flightConditionAltitude(EndnodeReadOnly<double>("program_settings/FlightConditions/FlightCondition@" + num2Str(ID) + "/Altitude")); EndnodeReadOnly flightConditionMach(EndnodeReadOnly<double>("program_settings/FlightConditions/FlightCondition@" + num2Str(ID) + "/Mach")); diff --git a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h index db29ce14784675db9d04987cfec7dbf565cf6035..049213a36de5017d1c8559856f02a98a39d95999 100644 --- a/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h +++ b/aerodynamic_analysis/src/taw/tawCalculatePolarConfig.h @@ -99,7 +99,6 @@ class tawCalculatePolarConfig{ bool apply_manual_CLmax_hl_values; //Methods - void readflightConditions(const node& config, size_t ID); void initializeTrimSettings(const node& config); void read_hl_calibration_factors(const node& config); explicit tawCalculatePolarConfig(const node& config); @@ -135,9 +134,10 @@ class tawCalculatePolarConfig{ */ void readPolarSettings(const node& polarNode); /** \brief Function reads flight condition settings from configuration XML and stores them in class variables - * \param &flightConditionNode aixml node that contains flight condition information from corresponding XML file + * \param &config aixml node that contains the config root + * \param ID an index value of the current flight condition */ - void readFlightConditions(const node& flightConditionNode); + void readFlightConditions(const node& config, size_t ID); /** \brief Function reads viscous drag settings from configuration XML and stores them in class variables * \param &viscousDragNode aixml node that contains flight condition information from corresponding XML file */ diff --git a/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp b/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp index 5893e58a861f08e65f5a5c1c4efa7ad5aee4b5a9..6663ab4146cc56f6ee005354004728bdd24bd338 100644 --- a/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp +++ b/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp @@ -212,27 +212,28 @@ void tawDefaultStrategy::initializeLiLiforTAW(LiLiforTAWInitialization *myLiLiIn myLiLiInit->bestCruiseCL = data_->bestCruiseCL; myLiLiInit->initialMachCruise = data_->initialCruiseMachNumber; myLiLiInit->engineType = data_->engineType; - myLiLiInit->cruiseMachID = 0; - for (size_t flightConditionID(0); flightConditionID < config_->flightConditions.size(); ++flightConditionID) { - flightCondition* aLiLiFlightCondition = new flightCondition; - aLiLiFlightCondition->Mach = config_->flightConditions.at(flightConditionID).Mach; - aLiLiFlightCondition->Altitude = config_->flightConditions.at(flightConditionID).Altitude; - aLiLiFlightCondition->extrapolationMargin = config_->flightConditions.at(flightConditionID).extrapolationMargin; - aLiLiFlightCondition->allowGridChange = config_->flightConditions.at(flightConditionID).allowGridChange; - myLiLiInit->flightConditions.push_back(*aLiLiFlightCondition); - if (accuracyCheck(aLiLiFlightCondition->Mach, data_->initialCruiseMachNumber, ACCURACY_HIGH)) { - myLiLiInit->cruiseMachID = flightConditionID; - } - delete aLiLiFlightCondition; - } - // Check availability of cruise Mach number in polar set - //if cruiseMachID is still 0 and this flight condition is not cruise Mach, abort program - if (!myLiLiInit->cruiseMachID - && !accuracyCheck(myLiLiInit->flightConditions.at(myLiLiInit->cruiseMachID).Mach, myLiLiInit->initialMachCruise, ACCURACY_MEDIUM)) { - std::stringstream errorMessage; - errorMessage << "Initial Cruise Mach number of Ma = " << myLiLiInit->initialMachCruise << " is not available in flight conditions given in config file. Abort program!"; - throwError(__FILE__, __func__, __LINE__, errorMessage.str()); + myLiLiInit->flightConditions = config_->flightConditions; + std::vector<flightCondition>::iterator theCruiseFlightConditionIterator(std::find_if(myLiLiInit->flightConditions.begin(), myLiLiInit->flightConditions.end(), + [myLiLiInit](const flightCondition& aFlightCondition) { + return accuracyCheck(aFlightCondition.Mach, myLiLiInit->initialMachCruise, ACCURACY_HIGH); + })); + if (theCruiseFlightConditionIterator == myLiLiInit->flightConditions.end()) { //Cruise flight condition not yet available + flightCondition* theCruiseFlightCondition = new flightCondition; + theCruiseFlightCondition->Mach = data_->initialCruiseMachNumber; + theCruiseFlightCondition->Altitude = myLiLiInit->flightConditions.back().Altitude; + theCruiseFlightCondition->extrapolationMargin = myLiLiInit->flightConditions.back().extrapolationMargin; + theCruiseFlightCondition->allowGridChange = myLiLiInit->flightConditions.back().allowGridChange; + theCruiseFlightConditionIterator = std::find_if(myLiLiInit->flightConditions.begin(), myLiLiInit->flightConditions.end(), + [myLiLiInit](const flightCondition& aFlightCondition) { + return myLiLiInit->initialMachCruise <= aFlightCondition.Mach; + }); + theCruiseFlightConditionIterator = (myLiLiInit->flightConditions).insert(theCruiseFlightConditionIterator, *theCruiseFlightCondition); + std::stringstream warnMessage; + warnMessage << "Initial Cruise Mach number of Ma = " << myLiLiInit->initialMachCruise << " is not available in flight conditions given in config file. "; + warnMessage << "Inserted flight condition for Ma = " << myLiLiInit->initialMachCruise << " automatically."; + myRuntimeInfo->warn << warnMessage.str() << std::endl; } + myLiLiInit->cruiseMachID = static_cast<int>(theCruiseFlightConditionIterator - myLiLiInit->flightConditions.begin()); myLiLiInit->liftingSurfaces = liftingSurfaces; myLiLiInit->theFuselage = fuselage; myLiLiInit->theNacelles = nacelles; @@ -295,7 +296,7 @@ void tawDefaultStrategy::initializeWaveDragMason(waveDragInitialization *myWaveD } void tawDefaultStrategy::getPolarDataFromLiftingLine(const liftingLineForTAW& liftingLineForTAW) { - for (size_t machID(0); machID < config_->flightConditions.size(); ++machID) { + for (size_t machID(0); machID < liftingLineForTAW.theCleanPolars.size(); ++machID) { tawDefaultPolar aCleanPolar; aCleanPolar.extrapolationMargin = liftingLineForTAW.theCleanPolars.at(machID).extrapolationMargin; aCleanPolar.allowGridChange = liftingLineForTAW.theCleanPolars.at(machID).allowGridChange; @@ -610,7 +611,8 @@ void tawDefaultStrategy::doTrimInterpolation() { vector<vector<trimInterpolation::interpolationPoint>> polarSet; // copy polar data into the generalized interpolation container for (size_t polarID(0); polarID < polarDataCGMap.at(CGID).at(0).cleanPolars.size(); ++polarID) { - myRuntimeInfo->out << "Interpolate trim for clean polars at " << config_->CGPositions.at(CGID) << " CoG at Ma " << config_->machNumbers.at(polarID) << "..." << endl; + myRuntimeInfo->out << "Interpolate trim for clean polars at " << config_->CGPositions.at(CGID) + << " CoG at Ma " << polarDataCGMap.at(CGID).at(0).cleanPolars.at(polarID).MachNumber << "..." << endl; for (size_t stabID(0); stabID < config_->stabAngles.size(); ++stabID) { vector<trimInterpolation::interpolationPoint> aStabPolar; for (size_t pointID(0); pointID < polarDataCGMap.at(CGID).at(stabID).cleanPolars.at(polarID).Points.size(); ++pointID) {