diff --git a/propulsion_design/propulsion_design_conf.xml b/propulsion_design/propulsion_design_conf.xml index 592f27398c22d3ea2f09c7cf644cc6c34bda3e91..23ff8a6e5dc2441f16d5f41d460c03d13b1ece73 100644 --- a/propulsion_design/propulsion_design_conf.xml +++ b/propulsion_design/propulsion_design_conf.xml @@ -86,7 +86,7 @@ <upper_boundary>+Inf</upper_boundary> <lower_boundary>0.0</lower_boundary> </pylon_mass> - <engine_efficiency> + <engine_efficiency description="Increase or decrease the efficiency by manipulating the fuel flow (Efficiency increase (value higher than 1) -> decreased fuelflow)."> <value>1.0</value> <unit>1</unit> <upper_boundary>+Inf</upper_boundary> diff --git a/propulsion_design/src/engine_design/engine_design.cpp b/propulsion_design/src/engine_design/engine_design.cpp index 669d088b81fa682d16030ecc98ae76a51715d9b7..8fff672fb98fa96915107f7ff512e99ff7a54c10 100644 --- a/propulsion_design/src/engine_design/engine_design.cpp +++ b/propulsion_design/src/engine_design/engine_design.cpp @@ -30,13 +30,13 @@ namespace design { - void EngineDesigner::write_deck_value(const DeckData &data) const + void EngineDesigner::write_deck_value(const DeckData &data, std::string engine_name) const { /* The deck values assume a ; as separator */ constexpr char delimiter = ';'; /* Get the file name to export to */ - const std::filesystem::path file_name = engine_directory_ / (data.name + ".csv"); + const std::filesystem::path file_name = engine_directory_ / engine_name / (data.name + ".csv"); /* Open the file */ std::ofstream file(file_name, std::ios::out | std::ios::trunc); @@ -71,4 +71,20 @@ namespace design /* Close the file */ file.close(); } + + // Scale values in DeckData + auto EngineDesigner::scale_deck_data_values(DeckData &deck_data, double efficiency_factor) -> DeckData + { + double technology_factor = 1+(1-efficiency_factor); + for (auto i = 0; i < deck_data.values.shape()[0]; ++i) { + for (auto j = 0; j < deck_data.values.shape()[1]; ++j) { + for (auto k = 0; k < deck_data.values.shape()[2]; ++k) { + if (deck_data.values[i][j][k] != -9999) { + deck_data.values[i][j][k] *= technology_factor; + } + } + } + } + return deck_data; + } }; // namespace design diff --git a/propulsion_design/src/engine_design/engine_design.h b/propulsion_design/src/engine_design/engine_design.h index 0dc4ad9cb46f9a361cfc8a9c66cc923069d14f07..73ebe444583b6785d7627f956b2c579222e67dea 100644 --- a/propulsion_design/src/engine_design/engine_design.h +++ b/propulsion_design/src/engine_design/engine_design.h @@ -147,7 +147,16 @@ namespace design * * @param data The deck data to write. */ - void write_deck_value(const DeckData &data) const; + void write_deck_value(const DeckData &data, std::string engine_name) const; + + /** + * @brief Recalculate the engine data deck with the efficiency defined in the engine.xml. + * + * @param deck_data Engine deck data values. + * @param efficiency_factor Value of the efficiency factor defined in the engine.xml. + * @return scaled deck data. + */ + auto scale_deck_data_values(DeckData &deck_data, double efficiency_factor) -> DeckData; private: /* === Properties === */ diff --git a/propulsion_design/src/engine_design/rubber/rubber_design.cpp b/propulsion_design/src/engine_design/rubber/rubber_design.cpp index 53ec38926bce57abdcf7be3ed037ef207db381e5..706c3bd19387f2a5f9b85ed691c22dd6c2fad1b1 100644 --- a/propulsion_design/src/engine_design/rubber/rubber_design.cpp +++ b/propulsion_design/src/engine_design/rubber/rubber_design.cpp @@ -37,19 +37,26 @@ namespace design { void Rubber::initialize() { + /* Initialize the EngineDesigner */ + EngineDesigner::initialize(); + /* Check whether the engine efficiency technology factor is 1.0 */ const auto efficiency_factor = static_cast<float>( this->configuration()->at( "module_configuration_file/program_settings/technology_factors/engine_efficiency/value")); if (std::abs(efficiency_factor - 1.0) > 1e-6) { - /** @todo Actually implement the change in the engine efficiency factor. */ - throw std::runtime_error("[design::Rubber::initialize()] The engine efficiency technology factor is not 1.0. Changing this factor is not yet supported!"); + std::filesystem::path path_to_csv = EngineDesigner::engine_database(); + std::string engine_name = this->configuration()->at("module_configuration_file/program_settings/propulsion/engine/Rubber/engine_model/value"); + std::string added_path = (std::filesystem::path(path_to_csv) / engine_name / engine_name).string(); + DeckData deck_data = DeckData::from_csv(added_path.append("_WF.csv")); + + DeckData deck_data_scaled = EngineDesigner::scale_deck_data_values(deck_data, EngineDesigner::technology_factor("engine_efficiency")); + EngineDesigner::write_deck_value(deck_data_scaled, engine_name); + utility::print(std::format( + "Design with engine efficiency factor = {:.2f}", efficiency_factor), Level::Info); } - /* Initialize the EngineDesigner */ - EngineDesigner::initialize(); - /* Loop through all propulsion settings */ for (const auto &propulsion : this->configuration()->getVector("module_configuration_file/program_settings/propulsion")) {