From c8eaaab83fc4b683bc68ebec0df7947c86ebd535 Mon Sep 17 00:00:00 2001
From: jensviloehr <j.viloehr@tu-berlin.de>
Date: Mon, 14 Apr 2025 14:17:00 +0200
Subject: [PATCH] Refactored mass technology-factor: removed global, added
 per-stabilizer

---
 empennage_design/empennage_design_conf.xml    | 70 ++++++++++++++++---
 .../bwbVerticalTailsDesignConfig.cpp          |  2 -
 .../bwbVerticalTailsDesignConfig.h            |  1 -
 .../low/lowBwbVerticalTailsDesign.cpp         |  2 +-
 empennage_design/src/lib/io_methods/io.h      |  5 +-
 .../conventionalEmpennageDesignConfig.cpp     |  2 -
 .../conventionalEmpennageDesignConfig.h       |  1 -
 .../low/lowConventionalEmpennageDesign.cpp    |  4 +-
 .../low/low_t_tail_empennage_design.cpp       |  4 +-
 .../t_tail/t_tail_empennage_design_config.cpp |  2 -
 .../t_tail/t_tail_empennage_design_config.h   |  1 -
 11 files changed, 69 insertions(+), 25 deletions(-)

diff --git a/empennage_design/empennage_design_conf.xml b/empennage_design/empennage_design_conf.xml
index 1ca40940..a651f00f 100644
--- a/empennage_design/empennage_design_conf.xml
+++ b/empennage_design/empennage_design_conf.xml
@@ -55,16 +55,6 @@
 				<method description="Selector mode_0: flops">
 					<value>mode_0</value>
 				</method>
-				<parameters description="parameters for mass calculation methods">
-					<mode_0 description="flops">
-						<technology_factor description="technology factor applied to flops mass calculation methods">
-							<value>1.0</value>
-							<unit>1</unit>
-							<lower_boundary>0.5</lower_boundary>
-							<upper_boundary>1.5</upper_boundary>
-						</technology_factor>
-					</mode_0>
-				</parameters>
 			</mass_mode>
 		</modes>
 		<common_airfoil_data_path description="path to common airfoil data">
@@ -126,6 +116,18 @@
 								<upper_boundary>90</upper_boundary>
 							</delta_sweep>
 						</parameter>
+						<mass_mode description="mass calculation method">
+							<parameters description="parameters for mass calculation methods">
+								<mode_0 description="flops">
+									<technology_factor description="technology factor applied to flops mass calculation methods">
+										<value>1.0</value>
+										<unit>1</unit>
+										<lower_boundary>0.5</lower_boundary>
+										<upper_boundary>1.5</upper_boundary>
+									</technology_factor>
+								</mode_0>
+							</parameters>
+						</mass_mode>
 						<profiles description="tail profile for both inner and outer section">
 							<profile description="tail profile at section 0" ID="0">
 								<name description="profile name">
@@ -360,6 +362,18 @@
 								<upper_boundary>45</upper_boundary>
 							</delta_sweep>
 						</parameter>
+						<mass_mode description="mass calculation method">
+							<parameters description="parameters for mass calculation methods">
+								<mode_0 description="flops">
+									<technology_factor description="technology factor applied to flops mass calculation methods">
+										<value>1.0</value>
+										<unit>1</unit>
+										<lower_boundary>0.5</lower_boundary>
+										<upper_boundary>1.5</upper_boundary>
+									</technology_factor>
+								</mode_0>
+							</parameters>
+						</mass_mode>
 						<profiles description="tail profile for both inner and outer section">
 							<profile description="tail profile at section 0" ID="0">
 								<name description="profile name">
@@ -596,6 +610,18 @@
 								<upper_boundary>90</upper_boundary>
 							</delta_sweep>
 						</parameter>
+						<mass_mode description="mass calculation method">
+							<parameters description="parameters for mass calculation methods">
+								<mode_0 description="flops">
+									<technology_factor description="technology factor applied to flops mass calculation methods">
+										<value>1.0</value>
+										<unit>1</unit>
+										<lower_boundary>0.5</lower_boundary>
+										<upper_boundary>1.5</upper_boundary>
+									</technology_factor>
+								</mode_0>
+							</parameters>
+						</mass_mode>
 						<profiles description="tail profile for both inner and outer section">
 							<profile description="tail profile at section 0" ID="0">
 								<name description="profile name">
@@ -830,6 +856,18 @@
 								<upper_boundary>45</upper_boundary>
 							</delta_sweep>
 						</parameter>
+						<mass_mode description="mass calculation method">
+							<parameters description="parameters for mass calculation methods">
+								<mode_0 description="flops">
+									<technology_factor description="technology factor applied to flops mass calculation methods">
+										<value>3.0</value>
+										<unit>1</unit>
+										<lower_boundary>0.5</lower_boundary>
+										<upper_boundary>1.5</upper_boundary>
+									</technology_factor>
+								</mode_0>
+							</parameters>
+						</mass_mode>
 						<profiles description="tail profile for both inner and outer section">
 							<profile description="tail profile at section 0" ID="0">
 								<name description="profile name">
@@ -1073,6 +1111,18 @@
 								<upper_boundary>90</upper_boundary>
 							</delta_sweep>
 						</parameter>
+						<mass_mode description="mass calculation method">
+							<parameters description="parameters for mass calculation methods">
+								<mode_0 description="flops">
+									<technology_factor description="technology factor applied to flops mass calculation methods">
+										<value>1.0</value>
+										<unit>1</unit>
+										<lower_boundary>0.5</lower_boundary>
+										<upper_boundary>1.5</upper_boundary>
+									</technology_factor>
+								</mode_0>
+							</parameters>
+						</mass_mode>
 						<profiles description="tail profile for both inner and outer section">
 							<profile description="tail profile at section 0" ID="0">
 								<name description="profile name">
diff --git a/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsDesignConfig.cpp b/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsDesignConfig.cpp
index bd940ed9..3e7a34cd 100644
--- a/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsDesignConfig.cpp
+++ b/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsDesignConfig.cpp
@@ -29,13 +29,11 @@ namespace low {
 VerticalTailsConfig::VerticalTailsConfig()
     : design_mode(EndnodeReadOnly<std::string>("module_configuration_file/program_settings/modes/design_mode")),
       mass_mode(EndnodeReadOnly<std::string>("module_configuration_file/program_settings/modes/mass_mode/method")),
-      mass_mode_flops_technology_factor(EndnodeReadOnly<double>("module_configuration_file/program_settings/modes/mass_mode/parameters/mode_0/technology_factor")),
       common_airfoil_data_path(EndnodeReadOnly<std::string>("module_configuration_file/program_settings/common_airfoil_data_path")) {}
 
 void VerticalTailsConfig::read(const node& xml) {
   design_mode.read(xml);
   mass_mode.read(xml);
-  mass_mode_flops_technology_factor.read(xml);
   common_airfoil_data_path.read(xml);
 
   /* List all tail elements */
diff --git a/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsDesignConfig.h b/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsDesignConfig.h
index 0a3c44fe..8d366dce 100644
--- a/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsDesignConfig.h
+++ b/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsDesignConfig.h
@@ -42,7 +42,6 @@ class VerticalTailsConfig {
   EndnodeReadOnly<std::string> common_airfoil_data_path;
   EndnodeReadOnly<std::string> design_mode;
   EndnodeReadOnly<std::string> mass_mode;
-  EndnodeReadOnly<double> mass_mode_flops_technology_factor;
   std::vector<TailElement> vertical_tails;
 
 };
diff --git a/empennage_design/src/bwb/vertical_tails/low/lowBwbVerticalTailsDesign.cpp b/empennage_design/src/bwb/vertical_tails/low/lowBwbVerticalTailsDesign.cpp
index f42e6bc5..2c377d74 100644
--- a/empennage_design/src/bwb/vertical_tails/low/lowBwbVerticalTailsDesign.cpp
+++ b/empennage_design/src/bwb/vertical_tails/low/lowBwbVerticalTailsDesign.cpp
@@ -275,7 +275,7 @@ void VerticalTails::flops_mass() {
         MassPropertiesIO(std::format("component_design/empennage/specific/geometry/aerodynamic_surface@{}/", id),
                          std::format("vertical_tail_{}", id)));
     data->tails_mass.back().data["mass"] =
-        flops::vertical_stabilizer_mass(config->mass_mode_flops_technology_factor.value(), 1, geom2::measure::reference_area(data->tails[id]),
+        flops::vertical_stabilizer_mass(config->vertical_tails[id].mass_mode_flops_technology_factor.value(), 1, geom2::measure::reference_area(data->tails[id]),
                                         geom2::measure::taper_ratio(data->tails[id]), maximum_takeoff_mass);
     geom2::Point_3 cg = geom2::measure::centroid(data->tails[id]);
 
diff --git a/empennage_design/src/lib/io_methods/io.h b/empennage_design/src/lib/io_methods/io.h
index 420c146f..dc635a18 100644
--- a/empennage_design/src/lib/io_methods/io.h
+++ b/empennage_design/src/lib/io_methods/io.h
@@ -102,7 +102,8 @@ class TailElement {
         factor_taper_ratio(EndnodeReadOnly<double>(origin + "parameter/factor_taper_ratio")),
         delta_sweep(EndnodeReadOnly<double>(origin + "parameter/delta_sweep")),
         inner_profile(EndnodeReadOnly<std::string>(origin + "profiles/profile@0/name")),
-        outer_profile(EndnodeReadOnly<std::string>(origin + "profiles/profile@1/name")) {}
+        outer_profile(EndnodeReadOnly<std::string>(origin + "profiles/profile@1/name")),
+        mass_mode_flops_technology_factor(EndnodeReadOnly<double>(origin + "mass_mode/parameters/mode_0/technology_factor")) {}
   ~TailElement() = default;
 
   const std::string origin;
@@ -116,6 +117,7 @@ class TailElement {
   EndnodeReadOnly<double> delta_sweep;
   EndnodeReadOnly<std::string> inner_profile;
   EndnodeReadOnly<std::string> outer_profile;
+  EndnodeReadOnly<double> mass_mode_flops_technology_factor;
 
   std::vector<Spar> spars;
   std::vector<ControlDevice> control_devices;
@@ -131,6 +133,7 @@ class TailElement {
     delta_sweep.read(xml);
     inner_profile.read(xml);
     outer_profile.read(xml);
+    mass_mode_flops_technology_factor.read(xml);
 
     size_t spars_available = xml.getVector(origin + "spars/spar", 1).size();
     for (size_t i = 0; i < spars_available; ++i) {
diff --git a/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.cpp b/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.cpp
index d659ebb6..9eafe8cf 100644
--- a/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.cpp
+++ b/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.cpp
@@ -28,7 +28,6 @@ namespace low {
 ConventionalConfig::ConventionalConfig()
     : design_mode(EndnodeReadOnly<std::string>("module_configuration_file/program_settings/modes/design_mode")),
       mass_mode(EndnodeReadOnly<std::string>("module_configuration_file/program_settings/modes/mass_mode/method")),
-      mass_mode_flops_technology_factor(EndnodeReadOnly<double>("module_configuration_file/program_settings/modes/mass_mode/parameters/mode_0/technology_factor")),
       vertical_stabilizer(TailElement(
           "module_configuration_file/program_settings/tube_and_wing/low_fidelity/conventional/tail_element@0/")),
       horizontal_stabilizer(TailElement(
@@ -38,7 +37,6 @@ ConventionalConfig::ConventionalConfig()
 void ConventionalConfig::read(const node& xml) {
   design_mode.read(xml);
   mass_mode.read(xml);
-  mass_mode_flops_technology_factor.read(xml);
   common_airfoil_data_path.read(xml);
   vertical_stabilizer.read(xml);
   horizontal_stabilizer.read(xml);
diff --git a/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.h b/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.h
index e79d36d0..3c8d0d4b 100644
--- a/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.h
+++ b/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.h
@@ -39,7 +39,6 @@ class ConventionalConfig {
   EndnodeReadOnly<std::string> common_airfoil_data_path;
   EndnodeReadOnly<std::string> design_mode;
   EndnodeReadOnly<std::string> mass_mode;
-  EndnodeReadOnly<double> mass_mode_flops_technology_factor;
   TailElement vertical_stabilizer;
   TailElement horizontal_stabilizer;
 };
diff --git a/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesign.cpp b/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesign.cpp
index c4a031e0..d36940ae 100644
--- a/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesign.cpp
+++ b/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesign.cpp
@@ -405,7 +405,7 @@ void Conventional::flops_mass() {
   const double maximum_takeoff_mass = data->maximum_takeoff_mass.value();
 
   data->vertical_stabilizer_mass.data["mass"] =
-      flops::vertical_stabilizer_mass(config->mass_mode_flops_technology_factor.value(), 1, geom2::measure::reference_area(data->vertical_stabilizer),
+      flops::vertical_stabilizer_mass(config->vertical_stabilizer.mass_mode_flops_technology_factor.value(), 1, geom2::measure::reference_area(data->vertical_stabilizer),
                                       geom2::measure::taper_ratio(data->vertical_stabilizer), maximum_takeoff_mass);
   myRuntimeInfo->out << std::format("Vertical stabilizer mass ... {}",
                                     data->vertical_stabilizer_mass.data["mass"].value())
@@ -423,7 +423,7 @@ void Conventional::flops_mass() {
 
   /* Horizontal stabilizer mass and cog */
   data->horizontal_stabilizer_mass.data["mass"] =
-      flops::horizontal_stabilizer_mass(config->mass_mode_flops_technology_factor.value(), geom2::measure::reference_area(data->horizontal_stabilizer),
+      flops::horizontal_stabilizer_mass(config->horizontal_stabilizer.mass_mode_flops_technology_factor.value(), geom2::measure::reference_area(data->horizontal_stabilizer),
                                         geom2::measure::taper_ratio(data->horizontal_stabilizer), maximum_takeoff_mass);
   myRuntimeInfo->out << std::format("Horizontal stabilizer mass ... {:.2f}",
                                     data->horizontal_stabilizer_mass.data["mass"].value())
diff --git a/empennage_design/src/taw/t_tail/low/low_t_tail_empennage_design.cpp b/empennage_design/src/taw/t_tail/low/low_t_tail_empennage_design.cpp
index 10664758..52eb4c16 100755
--- a/empennage_design/src/taw/t_tail/low/low_t_tail_empennage_design.cpp
+++ b/empennage_design/src/taw/t_tail/low/low_t_tail_empennage_design.cpp
@@ -402,7 +402,7 @@ void T_Tail::flops_mass() {
   const double maximum_takeoff_mass = data->maximum_takeoff_mass.value();
 
   data->vertical_stabilizer_mass.data["mass"] =
-      flops::vertical_stabilizer_mass(config->mass_mode_flops_technology_factor.value(), 1, geom2::measure::reference_area(data->vertical_stabilizer),
+      flops::vertical_stabilizer_mass(config->vertical_stabilizer.mass_mode_flops_technology_factor.value(), 1, geom2::measure::reference_area(data->vertical_stabilizer),
                                       geom2::measure::taper_ratio(data->vertical_stabilizer), maximum_takeoff_mass);
   myRuntimeInfo->out << std::format("Vertical stabilizer mass ... {}",
                                     data->vertical_stabilizer_mass.data["mass"].value())
@@ -420,7 +420,7 @@ void T_Tail::flops_mass() {
 
   /* Horizontal stabilizer mass and cog */
   data->horizontal_stabilizer_mass.data["mass"] =
-      flops::horizontal_stabilizer_mass(config->mass_mode_flops_technology_factor.value(), geom2::measure::reference_area(data->horizontal_stabilizer),
+      flops::horizontal_stabilizer_mass(config->horizontal_stabilizer.mass_mode_flops_technology_factor.value(), geom2::measure::reference_area(data->horizontal_stabilizer),
                                         geom2::measure::taper_ratio(data->horizontal_stabilizer), maximum_takeoff_mass);
   myRuntimeInfo->out << std::format("Horizontal stabilizer mass ... {:.2f}",
                                     data->horizontal_stabilizer_mass.data["mass"].value())
diff --git a/empennage_design/src/taw/t_tail/t_tail_empennage_design_config.cpp b/empennage_design/src/taw/t_tail/t_tail_empennage_design_config.cpp
index 1e1255d8..1aa82274 100755
--- a/empennage_design/src/taw/t_tail/t_tail_empennage_design_config.cpp
+++ b/empennage_design/src/taw/t_tail/t_tail_empennage_design_config.cpp
@@ -28,7 +28,6 @@ namespace low {
 T_Tail_Config::T_Tail_Config()
     : design_mode(EndnodeReadOnly<std::string>("module_configuration_file/program_settings/modes/design_mode")),
       mass_mode(EndnodeReadOnly<std::string>("module_configuration_file/program_settings/modes/mass_mode")),
-      mass_mode_flops_technology_factor(EndnodeReadOnly<double>("module_configuration_file/program_settings/modes/mass_mode/parameters/mode_0/technology_factor")),
       vertical_stabilizer(TailElement(
           "module_configuration_file/program_settings/tube_and_wing/low_fidelity/t_tail/tail_element@0/")),
       horizontal_stabilizer(TailElement(
@@ -38,7 +37,6 @@ T_Tail_Config::T_Tail_Config()
 void T_Tail_Config::read(const node& xml) {
   design_mode.read(xml);
   mass_mode.read(xml);
-  mass_mode_flops_technology_factor.read(xml);
   common_airfoil_data_path.read(xml);
   vertical_stabilizer.read(xml);
   horizontal_stabilizer.read(xml);
diff --git a/empennage_design/src/taw/t_tail/t_tail_empennage_design_config.h b/empennage_design/src/taw/t_tail/t_tail_empennage_design_config.h
index a09da17e..43b77e88 100755
--- a/empennage_design/src/taw/t_tail/t_tail_empennage_design_config.h
+++ b/empennage_design/src/taw/t_tail/t_tail_empennage_design_config.h
@@ -39,7 +39,6 @@ class T_Tail_Config {
   EndnodeReadOnly<std::string> common_airfoil_data_path;
   EndnodeReadOnly<std::string> design_mode;
   EndnodeReadOnly<std::string> mass_mode;
-  EndnodeReadOnly<double> mass_mode_flops_technology_factor;
   TailElement vertical_stabilizer;
   TailElement horizontal_stabilizer;
 };
-- 
GitLab