diff --git a/aerodynamic_analysis/src/bwb/bwbDefaultStrategy.cpp b/aerodynamic_analysis/src/bwb/bwbDefaultStrategy.cpp index 98b7052a278b53b3d74055e8b132daf3d03ea5a6..2d03ca0fcf1d086b1160b095d7517b92ce7219aa 100644 --- a/aerodynamic_analysis/src/bwb/bwbDefaultStrategy.cpp +++ b/aerodynamic_analysis/src/bwb/bwbDefaultStrategy.cpp @@ -232,7 +232,26 @@ void bwbDefaultStrategy::calculateWaveDragMason(waveDragMason *myWaveDragMason) = myWaveDragMason->calculateWaveDrag(currentPolarSet.cleanPolars.at(polarID).Points.at(pointID), currentPolarSet.cleanPolars.at(polarID).MachNumber, 0, 0, currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).yStations, - currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).Cl_distr, true); + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).Cl_distr); + } + //calibration of wing wave drag if calibration is active + if (myWaveDragMason->doWaveDragMasonCalibration && currentPolarSet.cleanPolars.at(polarID).PointsWing.back().CD_wave > 0) { // check if polar has wave drag + for (size_t pointID(0); pointID < currentPolarSet.cleanPolars.at(polarID).Points.size(); ++pointID) { + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave += myWaveDragMason->calculateWaveDragCorrectionByCalibration( + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave, currentPolarSet.cleanPolars.at(polarID).Points.at(pointID), + currentPolarSet.cleanPolars.at(polarID).MachNumber); + } + } + //correction of wing wave drag and summation to total drag + for (size_t pointID(0); pointID < currentPolarSet.cleanPolars.at(polarID).Points.size(); ++pointID) { + //wing + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave += + myWaveDragMason->calculateWaveDragCorrectionByDragCounts(myWaveDragMason->waveDragCtCorrForCalibrationWing); + //check negative wave drag due to correction + if (currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave < 0.) { // Check if wing wave drag is negative due to calibration; if so, set to zero + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave = 0.; + } + //calculate total wave drag currentPolarSet.cleanPolars.at(polarID).Points.at(pointID).CD_wave = currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave; } } diff --git a/aerodynamic_analysis/src/methods/waveDragMason.cpp b/aerodynamic_analysis/src/methods/waveDragMason.cpp index f513b5116dcf542d2adda0918a90356b24be68e6..eabd9229117694abd4cf56d22110b979475f3bed 100644 --- a/aerodynamic_analysis/src/methods/waveDragMason.cpp +++ b/aerodynamic_analysis/src/methods/waveDragMason.cpp @@ -102,7 +102,7 @@ waveDragMason::waveDragMason(const std::shared_ptr<RuntimeIO>& rtIO, const waveD } double waveDragMason::calculateWaveDrag(const PolarPoint& aPolarPoint, const double aMachNumber, size_t liftingSurfaceIndex, const double chordWiseSweepPosition, - const std::vector<double>& spanStations, const std::vector<double>& Cl_distribution, const bool doCorrection) { + const std::vector<double>& spanStations, const std::vector<double>& Cl_distribution) { // consistency check if (spanStations.size() != Cl_distribution.size()) { stringstream errorMessage; @@ -179,22 +179,14 @@ double waveDragMason::calculateWaveDrag(const PolarPoint& aPolarPoint, const dou } // double the drag to account for the whole wing C_DWaveTotal = 2. * std::accumulate(C_DWaveSegment.begin(), C_DWaveSegment.end(), 0.0) / liftingSurfaceRefArea; - if (doCorrection) { - C_DWaveTotal += calculateWaveDragCorrectionByCalibration(C_DWaveTotal, aPolarPoint, aMachNumber); - } return C_DWaveTotal; } double waveDragMason::calculateWaveDragCorrectionByCalibration(const double& waveDragBeforeCorrection, const PolarPoint& aPolarPoint, const double& aMachNumber) { - double totalWaveDragCorrection(0.); /* Drag calibration. First introduced in commit [4eab519c2] based on experimental data in [Lam2010], 23.06.2010. After several changes, the current definition and values in config are from Risse, commit [2ec91580] on 02.08.2015. Especially for wave drag calibration, the values should be used carefully, as they usually only fit to one specific airfoil family and, thus, k-factor. */ - totalWaveDragCorrection = CLFact * pow(aMachNumber * aPolarPoint.CL, CLExp); - if (aMachNumber >= 0.5) { - totalWaveDragCorrection = CLFact * pow(aMachNumber * aPolarPoint.CL, CLExp); - } - return totalWaveDragCorrection; + return CLFact * pow(aMachNumber * aPolarPoint.CL, CLExp); } double waveDragMason::calculateWaveDragCorrectionByDragCounts(const double& waveDragCtCorrForCalibration) { diff --git a/aerodynamic_analysis/src/methods/waveDragMason.h b/aerodynamic_analysis/src/methods/waveDragMason.h index 49d3ab638acfad8a2c2c115b8ff37223c84ff5b8..a5f886d635d16a4c73cc09973635b570e97e3391 100644 --- a/aerodynamic_analysis/src/methods/waveDragMason.h +++ b/aerodynamic_analysis/src/methods/waveDragMason.h @@ -78,10 +78,9 @@ class waveDragMason{ * \param liftingSurfaceIndex the index of the lifting surface, which gets calculated * \param spanStations vector of span coordinates of the wing corresponding to the lift points * \param Cl_distribution vector of lift coefficients corresponding to the span station coordinates - * \param doCorrection switch do enable CL based calibraiton */ double calculateWaveDrag(const PolarPoint& aPolarPoint, const double machNumber, size_t liftingSurfaceIndex, const double chordWiseSweepPosition, - const std::vector<double>& spanStations, const std::vector<double>& Cl_distribution, const bool doCorrection); + const std::vector<double>& spanStations, const std::vector<double>& Cl_distribution); /** \brief Function calculates the wave drag correction for a polar point using a clibration function * \details this function should only be used for wing and not for stabilizer * \param waveDragBeforeCorrection the value of the uncorrected wave drag point diff --git a/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp b/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp index 30863d8f9c3c12e124f170617610aa90bf0deb7f..319c179644f05286334a5cb9389d61c9effb8ae5 100644 --- a/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp +++ b/aerodynamic_analysis/src/taw/tawDefaultStrategy.cpp @@ -404,30 +404,43 @@ void tawDefaultStrategy::calculateWaveDragMason(waveDragMason *myWaveDragMason) sweepPosition = 0.5; } for (size_t pointID(0); pointID < currentPolarSet.cleanPolars.at(polarID).Points.size(); ++pointID) { - // wave drag wing + // wave drag wing (uncorrected; correction will be applied afterwards) currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave = myWaveDragMason->calculateWaveDrag(currentPolarSet.cleanPolars.at(polarID).Points.at(pointID), currentPolarSet.cleanPolars.at(polarID).MachNumber, 0, sweepPosition, currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).yStations, - currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).Cl_distr, - myWaveDragMason->doWaveDragMasonCalibration) - + myWaveDragMason->calculateWaveDragCorrectionByDragCounts(myWaveDragMason->waveDragCtCorrForCalibrationWing); - if (currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave < 0.) { // Check if drag is negative due to calibration; if so, set to zero - currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave = 0.; - } - // wave drag stabilizer + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).Cl_distr); + // wave drag stabilizer (uncorrected; no calibration needed/assumed for stabilizer) currentPolarSet.cleanPolars.at(polarID).PointsStab.at(pointID).CD_wave = myWaveDragMason->calculateWaveDrag(currentPolarSet.cleanPolars.at(polarID).Points.at(pointID), currentPolarSet.cleanPolars.at(polarID).MachNumber, 1, sweepPosition, currentPolarSet.cleanPolars.at(polarID).PointsStab.at(pointID).yStations, - currentPolarSet.cleanPolars.at(polarID).PointsStab.at(pointID).Cl_distr, - false) - + myWaveDragMason->calculateWaveDragCorrectionByDragCounts(myWaveDragMason->waveDragCtCorrForCalibrationStabilizer); - if (currentPolarSet.cleanPolars.at(polarID).PointsStab.at(pointID).CD_wave < 0.) { // Check if drag is negative due to calibration; if so, set to zero + currentPolarSet.cleanPolars.at(polarID).PointsStab.at(pointID).Cl_distr); + } + //calibration of wing wave drag if calibration is active + if (myWaveDragMason->doWaveDragMasonCalibration && currentPolarSet.cleanPolars.at(polarID).PointsWing.back().CD_wave > 0) { // check if polar has wave drag + for (size_t pointID(0); pointID < currentPolarSet.cleanPolars.at(polarID).Points.size(); ++pointID) { + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave += myWaveDragMason->calculateWaveDragCorrectionByCalibration( + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave, currentPolarSet.cleanPolars.at(polarID).Points.at(pointID), + currentPolarSet.cleanPolars.at(polarID).MachNumber); + } + } + //correction of wing and stabilizer wave drag and summation to total drag + for (size_t pointID(0); pointID < currentPolarSet.cleanPolars.at(polarID).Points.size(); ++pointID) { + //wing + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave += + myWaveDragMason->calculateWaveDragCorrectionByDragCounts(myWaveDragMason->waveDragCtCorrForCalibrationWing); + //stabilizer + currentPolarSet.cleanPolars.at(polarID).PointsStab.at(pointID).CD_wave += + myWaveDragMason->calculateWaveDragCorrectionByDragCounts(myWaveDragMason->waveDragCtCorrForCalibrationStabilizer); + //check negative wave drag due to correction + if (currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave < 0.) { // Check if wing wave drag is negative due to calibration; if so, set to zero + currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave = 0.; + } + if (currentPolarSet.cleanPolars.at(polarID).PointsStab.at(pointID).CD_wave < 0.) { // Check if stabilizer wave drag is negative due to calibration; if so, set to zero currentPolarSet.cleanPolars.at(polarID).PointsStab.at(pointID).CD_wave = 0.; } - - // total wave drag + //calculate total wave drag currentPolarSet.cleanPolars.at(polarID).Points.at(pointID).CD_wave = currentPolarSet.cleanPolars.at(polarID).PointsWing.at(pointID).CD_wave + currentPolarSet.cleanPolars.at(polarID).PointsStab.at(pointID).CD_wave; }