Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • tombrinkdenis/aircraft-design
  • unicado/aircraft-design
  • alfin.johny/aircraft-design
3 results
Select Git revision
Show changes
Commits on Source (32)
Showing
with 114 additions and 85 deletions
......@@ -477,8 +477,8 @@
<upper_boundary>1</upper_boundary>
</TransitionLocationFin>
<UseCalibration description="Switch for calibration">
<value>true</value>
<default>true</default>
<value>false</value>
<default>false</default>
</UseCalibration>
<CalibrationHighMa description="calibration values for Mach Numbers greater 0.5">
<CDSum description="description">
......@@ -607,8 +607,8 @@
<upper_boundary>1</upper_boundary>
</CustomSweepAngle>
<UseCalibration description="Switch to enable calibration method">
<value>true</value>
<default>true</default>
<value>false</value>
<default>false</default>
</UseCalibration>
<CLFact description="CLFact">
<value>1</value>
......
......@@ -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"));
......
......@@ -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
*/
......
......@@ -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;
......
......@@ -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"));
......
......@@ -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
*/
......
......@@ -106,41 +106,37 @@ void semiEmpiricalHighLiftAdaption::processHighLiftDevices() {
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
+ leadingEdgeHighLiftDevices.at(deviceID).outerRelFwdChordPosition
+ leadingEdgeHighLiftDevices.at(deviceID).outerRelAftChordPosition);
leadingEdgeHighLiftDevices.at(deviceID).c_rel_avg = 0.5 * ((leadingEdgeHighLiftDevices.at(deviceID).innerRelAftChordPosition
- leadingEdgeHighLiftDevices.at(deviceID).innerRelFwdChordPosition)
+ (leadingEdgeHighLiftDevices.at(deviceID).outerRelAftChordPosition
- leadingEdgeHighLiftDevices.at(deviceID).outerRelFwdChordPosition));
double delta_x_rel_HL = 0.02; // distance hinge line (apparently from Raymer..)
leadingEdgeHighLiftDevices.at(deviceID).x_rel_hinge = leadingEdgeHighLiftDevices.at(deviceID).c_rel_avg - delta_x_rel_HL;
leadingEdgeHighLiftDevices.at(deviceID).phiHL = getLocalSweep(theMainWing,
0.5 * (leadingEdgeHighLiftDevices.at(deviceID).innerSpan_abs + leadingEdgeHighLiftDevices.at(deviceID).outerSpan_abs),
leadingEdgeHighLiftDevices.at(deviceID).x_rel_hinge, "DEGREE");
double chordInboard = getLocalChordLength(theMainWing, leadingEdgeHighLiftDevices.at(deviceID).innerSpan_abs)
* fabs(leadingEdgeHighLiftDevices.at(deviceID).innerRelAftChordPosition - leadingEdgeHighLiftDevices.at(deviceID).innerRelFwdChordPosition);
double chordOutboard = getLocalChordLength(theMainWing, leadingEdgeHighLiftDevices.at(deviceID).outerSpan_abs)
* fabs(leadingEdgeHighLiftDevices.at(deviceID).outerRelAftChordPosition - leadingEdgeHighLiftDevices.at(deviceID).outerRelFwdChordPosition);
double chordInboardWing = getLocalChordLength(theMainWing, leadingEdgeHighLiftDevices.at(deviceID).innerSpan_abs);
double chordOutboardWing = getLocalChordLength(theMainWing, leadingEdgeHighLiftDevices.at(deviceID).outerSpan_abs);
// area is calculated for both devices, because symmetry
leadingEdgeHighLiftDevices.at(deviceID).coveredA = leadingEdgeHighLiftDevices.at(deviceID).span * (chordInboard + chordOutboard);
leadingEdgeHighLiftDevices.at(deviceID).coveredA = leadingEdgeHighLiftDevices.at(deviceID).span * (chordInboardWing + chordOutboardWing);
}
for (size_t deviceID(0); deviceID < trailingEdgeHighLiftDevices.size(); ++deviceID) {
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
+ trailingEdgeHighLiftDevices.at(deviceID).outerRelFwdChordPosition
+ trailingEdgeHighLiftDevices.at(deviceID).outerRelAftChordPosition);
trailingEdgeHighLiftDevices.at(deviceID).c_rel_avg = 0.5 * ((trailingEdgeHighLiftDevices.at(deviceID).innerRelAftChordPosition
- trailingEdgeHighLiftDevices.at(deviceID).innerRelFwdChordPosition)
+ (trailingEdgeHighLiftDevices.at(deviceID).outerRelAftChordPosition
-trailingEdgeHighLiftDevices.at(deviceID).outerRelFwdChordPosition));
double delta_x_rel_HL = 0.02; // distance hinge line (apparently from Raymer..)
trailingEdgeHighLiftDevices.at(deviceID).x_rel_hinge = 1. - trailingEdgeHighLiftDevices.at(deviceID).c_rel_avg + delta_x_rel_HL;
trailingEdgeHighLiftDevices.at(deviceID).phiHL = getLocalSweep(theMainWing,
0.5 * (trailingEdgeHighLiftDevices.at(deviceID).innerSpan_abs + trailingEdgeHighLiftDevices.at(deviceID).outerSpan_abs),
trailingEdgeHighLiftDevices.at(deviceID).x_rel_hinge, "DEGREE");
double chordInboard = getLocalChordLength(theMainWing, trailingEdgeHighLiftDevices.at(deviceID).innerSpan_abs)
* fabs(trailingEdgeHighLiftDevices.at(deviceID).innerRelAftChordPosition - trailingEdgeHighLiftDevices.at(deviceID).innerRelFwdChordPosition);
double chordOutboard = getLocalChordLength(theMainWing, trailingEdgeHighLiftDevices.at(deviceID).outerSpan_abs)
* fabs(trailingEdgeHighLiftDevices.at(deviceID).outerRelAftChordPosition - trailingEdgeHighLiftDevices.at(deviceID).outerRelFwdChordPosition);
double chordInboardWing = getLocalChordLength(theMainWing, trailingEdgeHighLiftDevices.at(deviceID).innerSpan_abs);
double chordOutboardWing = getLocalChordLength(theMainWing, trailingEdgeHighLiftDevices.at(deviceID).outerSpan_abs);
// area is calculated for both devices, because symmetry
trailingEdgeHighLiftDevices.at(deviceID).coveredA = leadingEdgeHighLiftDevices.at(deviceID).span * (chordInboard + chordOutboard);
trailingEdgeHighLiftDevices.at(deviceID).coveredA = leadingEdgeHighLiftDevices.at(deviceID).span * (chordInboardWing + chordOutboardWing);
}
}
......
......@@ -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"));
......
......@@ -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
*/
......
......@@ -235,6 +235,12 @@ void tawCalculatePolar::set_html_body() {
<< std::format("<tr><td>Optimum lift coefficient at cruise (for L/D max)</td>"
"<td>C<sub>L,opt,cruise</sub></td><td>-</td><td>{:.3f}</td></tr>\n",
data.C_L_optimumCruise.value())
<< std::format("<tr><td>Cruise L/D</td>"
"<td>L/D<sub>cruise</sub></td><td>-</td><td>{:.2f}</td></tr>\n",
data.L_over_D_averageCruise.value())
<< std::format("<tr><td>Average lift coefficient at cruise (for L/D<sub>cr</sub>)</td>"
"<td>C<sub>L,cruise</sub></td><td>-</td><td>{:.3f}</td></tr>\n",
data.C_L_averageCruise)
<< std::format("<tr><td>Total drag at optimum lift coefficient</td>"
"<td>C<sub>D,total,opt,cruise</sub></td><td>-</td><td>{:.5f}</td></tr>\n",
data.C_Dtotal_optimumCruise.value())
......
......@@ -58,12 +58,14 @@ tawDefaultData::tawDefaultData(const std::shared_ptr<RuntimeIO>& rtIO)
OME_CoG_x(EndnodeReadOnly<double>("analysis/masses_cg_inertia/operating_mass_empty/mass_properties/center_of_gravity/x").read(rtIO->acxml).value()),
OME_CoG_y(EndnodeReadOnly<double>("analysis/masses_cg_inertia/operating_mass_empty/mass_properties/center_of_gravity/y").read(rtIO->acxml).value()),
OME_CoG_z(EndnodeReadOnly<double>("analysis/masses_cg_inertia/operating_mass_empty/mass_properties/center_of_gravity/z").read(rtIO->acxml).value()),
C_L_averageCruise(EndnodeReadOnly<double>("analysis/mission/design_mission/cruise/average_lift_coefficient", 0.5).read(rtIO->acxml).value()),
C_L_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_LoptimumCruise", "C_LoptimumCruise", 0, "1")),
C_Dind_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_D_induced_optimumCruise", "C_LoptimumCruise", 0, "1")),
C_Dvisc_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_D_viscous_optimumCruise", "C_LoptimumCruise", 0, "1")),
C_Dwave_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_D_wave_optimumCruise", "C_LoptimumCruise", 0, "1")),
C_Dtotal_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_D_total_optimumCruise", "C_LoptimumCruise", 0, "1")),
C_M_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_M_optimumCruise", "C_LoptimumCruise", 0, "1")),
C_Dind_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_D_induced_optimumCruise", "C_D_induced_optimumCruise", 0, "1")),
C_Dvisc_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_D_viscous_optimumCruise", "C_D_viscous_optimumCruise", 0, "1")),
C_Dwave_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_D_wave_optimumCruise", "C_D_wave_optimumCruise", 0, "1")),
C_Dtotal_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_D_total_optimumCruise", "C_D_total_optimumCruise", 0, "1")),
C_M_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_M_optimumCruise", "C_M_optimumCruise", 0, "1")),
L_over_D_averageCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/L_over_D_averageCruise", "L_over_D_averageCruise", 0, "1")),
L_over_D_optimumCruise(Endnode<double>("analysis/aerodynamics/lift_coefficients/L_over_D_optimumCruise", "C_LoptimumCruise", 0, "1")),
CL_max_landing(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_LmaxLanding", "C_LmaxLanding", 0, "1")),
C_LmaxTO(Endnode<double>("analysis/aerodynamics/lift_coefficients/C_LmaxT-O", "C_LmaxTO", 0, "1")),
......
......@@ -67,6 +67,7 @@ class tawDefaultData {
double OME_CoG_x; /**< x Position of center of gravity at OME in [m] */
double OME_CoG_y; /**< x Position of center of gravity at OME in [m] */
double OME_CoG_z; /**< x Position of center of gravity at OME in [m] */
double C_L_averageCruise; /**< average lift coefficient flown during design mission [-] */
Point designCoG; /**< Center of gravity coordinates for design conditions at ground */
Point forwardCoG; /**< Most forward position of center of gravity coordinates */
Point aftCoG; /**< Most afterwards center of gravity coordinates */
......@@ -96,6 +97,7 @@ class tawDefaultData {
Endnode<double>C_Dwave_optimumCruise;
Endnode<double>C_M_optimumCruise;
Endnode<double>C_Dtotal_optimumCruise;
Endnode<double>L_over_D_averageCruise;
Endnode<double>L_over_D_optimumCruise;
Endnode<double>CL_max_landing;
Endnode<double>C_LmaxTO;
......
......@@ -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) {
......@@ -1023,6 +1025,7 @@ void tawDefaultStrategy::setOutputValues() {
data_->C_M_optimumCruise.set_value(optimum_cruise_values["CM,opt"]);
data_->C_Dtotal_optimumCruise.set_value(optimum_cruise_values["CDind,opt"] + optimum_cruise_values["CDvisc,opt"] +
optimum_cruise_values["CDwave,opt"]);
data_->L_over_D_averageCruise.set_value(data_->C_L_averageCruise / optimum_cruise_values["CDtotal,avg"]);
data_->L_over_D_optimumCruise.set_value(optimum_cruise_values["CL,opt"] / data_->C_Dtotal_optimumCruise.value());
data_->CL_max_landing.set_value(getMaxCL(polarDataTrimMap.at(0).highLiftPolars.at("landing")));
data_->C_LmaxTO.set_value(getMaxCL(polarDataTrimMap.at(0).highLiftPolars.at("takeoff")));
......@@ -1058,7 +1061,7 @@ void tawDefaultStrategy::update_xml_entries(std::string mode) {
std::map<std::string, double> tawDefaultStrategy::getOptimumCruiseValues() {
std::map<std::string, double> optimum_cruise_values{{"CL,opt", 0.}, {"CDind,opt", 0.}, {"CDvisc,opt", 0.},
{"CDwave,opt", 0.}, {"CM,opt", 0.}};
{"CDwave,opt", 0.}, {"CM,opt", 0.}, {"CDtotal,avg", 0.}};
double LoverDmax(0.0);
size_t optimum_point(0);
std::vector<defaultPolarPoint> theTrimmedCruisePolar(getTrimmedCruisePolar(polarDataTrimMap.at(0).cleanPolars, data_->initialCruiseMachNumber));
......@@ -1068,6 +1071,9 @@ std::map<std::string, double> tawDefaultStrategy::getOptimumCruiseValues() {
LoverDmax = LoverD;
optimum_point = pointID;
}
if (fabs(data_->C_L_averageCruise - theTrimmedCruisePolar.at(pointID).CL) <= config_->stepWidthCL.value()) { //check if current CL is avg cruise CL
optimum_cruise_values["CDtotal,avg"] = theTrimmedCruisePolar.at(pointID).CD;
}
}
optimum_cruise_values["CL,opt"] = theTrimmedCruisePolar.at(optimum_point).CL;
optimum_cruise_values["CDind,opt"] = theTrimmedCruisePolar.at(optimum_point).CD_ind;
......
......@@ -340,7 +340,8 @@ void EnergyBased::assess_constraints(std::vector<double>& W_over_S_data, Mattin
double thrust_lapse = calculate_thrust_lapse(M, 0.0);
double CL_max_L = this->aircraft_xml()->at("aircraft_exchange_file/analysis/aerodynamics/lift_coefficients/C_LmaxLanding/value");
double my_B = this->aircraft_xml()->at("aircraft_exchange_file/requirements_and_specifications/requirements/additional_requirements/landing_gear/braking_coefficient/value");
double s_G_L = this->aircraft_xml()->at("aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/takeoff_distance/value");
double s_G_L = 0.6 * this->aircraft_xml()->at("aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/landing_field_length/value");
// s_G_L as braking distance = 60% of landing field length
readPolar landing_config(this->polar(), "landing", "linear", M);
double CD_max_L = landing_config.interpCD(CL_max_L);
double max_landing_weight = this->aircraft_xml()->at("aircraft_exchange_file/analysis/masses_cg_inertia/maximum_landing_mass/mass_properties/mass/value");
......
......@@ -72,7 +72,7 @@ def data_postprocessing(paths_and_names, routing_dict, data_dict, runtime_output
'value': '0',
'unit': '1',
'lower_boundary': '0',
'upper_boundary': 'inf'
'upper_boundary': '100000'
},
'route_independent_cost_annual': {
'attributes': {'description': 'Route independent (fixed) cost per year'},
......@@ -112,7 +112,7 @@ def data_postprocessing(paths_and_names, routing_dict, data_dict, runtime_output
'value': '0',
'unit': '1',
'lower_boundary': '0',
'upper_boundary': 'inf'
'upper_boundary': '100000'
}
paths_and_names = prepare_element_tree_for_module_key_parameter(paths_and_names, module_key_parameters_dict)
......
/*
* UNICADO - UNIversity Conceptual Aircraft Design and Optimization
*
* Copyright (C) 2024 UNICADO consortium
* Copyright (C) 2025 UNICADO consortium
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......
/*
* UNICADO - UNIversity Conceptual Aircraft Design and Optimization
*
* Copyright (C) 2024 UNICADO consortium
* Copyright (C) 2025 UNICADO consortium
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......
/*
* UNICADO - UNIversity Conceptual Aircraft Design and Optimization
*
* Copyright (C) 2024 UNICADO consortium
* Copyright (C) 2025 UNICADO consortium
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......
/*
* UNICADO - UNIversity Conceptual Aircraft Design and Optimization
*
* Copyright (C) 2024 UNICADO consortium
* Copyright (C) 2025 UNICADO consortium
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......
/*
* UNICADO - UNIversity Conceptual Aircraft Design and Optimization
*
* Copyright (C) 2024 UNICADO consortium
* Copyright (C) 2025 UNICADO consortium
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......