diff --git a/empennage_design/empennage_design_conf.xml b/empennage_design/empennage_design_conf.xml index 7d2cd15ae3bbc65e14f3ad97851d620866535e42..2935449b81c4dfd78f0848609ab8b1b70e58759b 100644 --- a/empennage_design/empennage_design_conf.xml +++ b/empennage_design/empennage_design_conf.xml @@ -51,8 +51,20 @@ <design_mode description="selector mode_0: design, mode_1: redesign (axml must hold a tail)"> <value>mode_0</value> </design_mode> - <mass_mode description="Selector mode_0: flops, mode_1: ... "> - <value>mode_0</value> + <mass_mode description="mass calculation method"> + <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"> @@ -776,4 +788,4 @@ </low_fidelity> </blended_wing_body> </program_settings> -</module_configuration_file> \ No newline at end of file +</module_configuration_file> diff --git a/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsConfig.cpp b/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsConfig.cpp index 1f861e8d26e00e692dec12d8cbb2d52daaeb5be4..8e0c5ceb2f235329dcf1739339b4194bbabfff52 100644 --- a/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsConfig.cpp +++ b/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsConfig.cpp @@ -17,11 +17,13 @@ namespace bwb { 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")) {} + 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")) {} void VerticalTailsConfig::read(const node& xml) { design_mode.read(xml); mass_mode.read(xml); + mass_mode_flops_technology_factor.read(xml); /* List all tail elements */ std::string path_to_tail_elements = diff --git a/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsConfig.h b/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsConfig.h index 4b85b8ba72f1acc46700048d92d2f98e7c4e5bdf..b398aa8d1c50526cfd609aaaa7d7ccbedfe709c3 100644 --- a/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsConfig.h +++ b/empennage_design/src/bwb/vertical_tails/bwbVerticalTailsConfig.h @@ -24,11 +24,12 @@ class VerticalTailsConfig { public: VerticalTailsConfig(); ~VerticalTailsConfig() = default; - + void read(const node& xml); 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/LowVerticalTailsBwb.cpp b/empennage_design/src/bwb/vertical_tails/low/LowVerticalTailsBwb.cpp index d8326c7e9bb6e761de59b8d1ae1d49362a7cc5f5..46e7c4c80de5e6f3f4c7285689ca609453c7a5a1 100644 --- a/empennage_design/src/bwb/vertical_tails/low/LowVerticalTailsBwb.cpp +++ b/empennage_design/src/bwb/vertical_tails/low/LowVerticalTailsBwb.cpp @@ -47,7 +47,7 @@ void VerticalTails::update() { // update myRuntimeInfo->out << "Updating empennage -> vertical tails" << std::endl; data->update(rtIO->acxml); - + } void VerticalTails::report() { @@ -115,14 +115,14 @@ void VerticalTails::design() { data->tails.back().origin = geom2::Point_3(0, data->tails.front().origin.y(), data->tails.front().origin.z()); data->tails.back().name = vertical_tail.name.value() + "_positive"; - + /* Vertical tail (mirrored) */ data->tails.push_back(data->tails.back()); data->tails.back().origin = geom2::Point_3(0, -data->tails.front().origin.y(), data->tails.front().origin.z()); data->tails.back().name = vertical_tail.name.value() + "_negative"; // set empennage position - + data->empennage_position.y = 0; data->empennage_position.z = 0; } @@ -166,14 +166,14 @@ void VerticalTails::flops_mass() { /* Iterate mass over tails as vertical stabilizers */ double overall_empennage_mass = 0.0; for (size_t i = 0; i < data->tails.size(); ++i) { - data->tails_mass.push_back( + data->tails_mass.push_back( MassPropertiesIO(std::format("component_design/empennage/specific/geometry/aerodynamic_surface@{}/", i), std::format("vertical_tail_{}", i))); data->tails_mass.back().data["mass"] = - flops::vertical_stabilizer_mass(1, geom2::measure::reference_area(data->tails[i]), + flops::vertical_stabilizer_mass(config->mass_mode_flops_technology_factor.value(), 1, geom2::measure::reference_area(data->tails[i]), geom2::measure::taper_ratio(data->tails[i]), maximum_takeoff_mass); geom2::Point_3 cg = geom2::measure::centroid(data->tails[i]); - + data->tails_mass.back().data["x"] = cg.x() + data->empennage_position.x.value() + data->tails[i].origin.x(); data->tails_mass.back().data["y"] = cg.y() + data->empennage_position.y.value() + data->tails[i].origin.y(); data->tails_mass.back().data["z"] = -cg.z() + data->empennage_position.z.value() + data->tails[i].origin.z(); @@ -199,4 +199,4 @@ void VerticalTails::flops_mass() { } } // namespace low -} // namespace bwb \ No newline at end of file +} // namespace bwb diff --git a/empennage_design/src/lib/IO_methods/io.h b/empennage_design/src/lib/IO_methods/io.h index be28aadbc251c3f8f073ede3189376ca2a994721..4a9205e97e4af68edbb92d0684a8803be7d87c90 100644 --- a/empennage_design/src/lib/IO_methods/io.h +++ b/empennage_design/src/lib/IO_methods/io.h @@ -43,14 +43,14 @@ class RelativePosition { class Spar { public: Spar() = default; - Spar(const std::string& origin) + Spar(const std::string& origin) : position(RelativePosition(origin)), name(EndnodeReadOnly<std::string>(origin + "name")) {} EndnodeReadOnly<std::string> name; RelativePosition position; - void read(const node& xml) { + void read(const node& xml) { name.read(xml); position.read(xml); } @@ -104,10 +104,10 @@ class TailElement { EndnodeReadOnly<double> delta_sweep; EndnodeReadOnly<std::string> inner_profile; EndnodeReadOnly<std::string> outer_profile; - + std::vector<Spar> spars; std::vector<ControlDevice> control_devices; - + void read(const node& xml) { name.read(xml); rear_x_offset.read(xml); @@ -119,15 +119,15 @@ class TailElement { delta_sweep.read(xml); inner_profile.read(xml); outer_profile.read(xml); - + size_t spars_available = xml.getVector(origin + "spars/spar", 1).size(); - for (int i = 0; i < spars_available; ++i) { + for (size_t i = 0; i < spars_available; ++i) { spars.push_back(Spar(origin + "spars/spar@" + std::to_string(i) + "/")); spars.back().read(xml); } size_t control_devices_available = xml.getVector(origin + "control_devices/control_device", 1).size(); - for (int i = 0; i < control_devices_available; ++i) { + for (size_t i = 0; i < control_devices_available; ++i) { control_devices.push_back(ControlDevice(origin + "control_devices/control_device@" + std::to_string(i) + "/")); control_devices.back().read(xml); } @@ -135,4 +135,4 @@ class TailElement { } }; -#endif // EMPENNAGEDESIGN_SRC_LIB_IOMETHODS_IO_H_ \ No newline at end of file +#endif // EMPENNAGEDESIGN_SRC_LIB_IOMETHODS_IO_H_ diff --git a/empennage_design/src/lib/mass_methods/flopsMassMethod.cpp b/empennage_design/src/lib/mass_methods/flopsMassMethod.cpp index 8f597ec96412e29b9a8787fe440ca93b8c2d05cd..ae76ed5d987c6b3d5b9e53717469d591934dcf1d 100644 --- a/empennage_design/src/lib/mass_methods/flopsMassMethod.cpp +++ b/empennage_design/src/lib/mass_methods/flopsMassMethod.cpp @@ -17,24 +17,24 @@ namespace flops { -double fin_mass(int number_of_fins, double area, double taper_ratio, double design_gross_weight) { +double fin_mass(double technology_factor, int number_of_fins, double area, double taper_ratio, double design_gross_weight) { const double dg_lb = convertUnit(KILO, GRAM, NOPREFIX, POUND, design_gross_weight); const double area_sqft = convertUnit(AREA, NOPREFIX, METER, NOPREFIX, FOOT, area); const double mass = 0.32 * pow(dg_lb, 0.3) * (taper_ratio + 0.5) * area_sqft; - return convertUnit(NOPREFIX, POUND, KILO, GRAM, mass); + return technology_factor * convertUnit(NOPREFIX, POUND, KILO, GRAM, mass); } -double horizontal_stabilizer_mass(double area, double taper_ratio, double design_gross_weight) { +double horizontal_stabilizer_mass(double technology_factor, double area, double taper_ratio, double design_gross_weight) { const double dg_lb = convertUnit(KILO, GRAM, NOPREFIX, POUND, design_gross_weight); const double area_sqft = convertUnit(AREA, NOPREFIX, METER, NOPREFIX, FOOT, area); const double mass = 0.53 * pow(dg_lb, 0.2) * (taper_ratio + 0.5) * area_sqft; - return convertUnit(NOPREFIX, POUND, KILO, GRAM, mass); + return technology_factor * convertUnit(NOPREFIX, POUND, KILO, GRAM, mass); } -double vertical_stabilizer_mass(int number_of_tails, double area, double taper_ratio, double design_gross_weight) { +double vertical_stabilizer_mass(double technology_factor, int number_of_tails, double area, double taper_ratio, double design_gross_weight) { const double dg_lb = convertUnit(KILO, GRAM, NOPREFIX, POUND, design_gross_weight); const double area_sqft = convertUnit(AREA, NOPREFIX, METER, NOPREFIX, FOOT, area); const double mass = 0.32 * pow(dg_lb, 0.3) * (taper_ratio + 0.5) * pow(number_of_tails, 0.7) * pow(area_sqft, 0.85); - return convertUnit(NOPREFIX, POUND, KILO, GRAM, mass); + return technology_factor * convertUnit(NOPREFIX, POUND, KILO, GRAM, mass); } -} // namespace flops \ No newline at end of file +} // namespace flops diff --git a/empennage_design/src/lib/mass_methods/flopsMassMethod.h b/empennage_design/src/lib/mass_methods/flopsMassMethod.h index 2056d6caa9180f345d858647e47b2d03f9de29a6..3cdff57813ea193d80a2c6b2980fed7e47439953 100644 --- a/empennage_design/src/lib/mass_methods/flopsMassMethod.h +++ b/empennage_design/src/lib/mass_methods/flopsMassMethod.h @@ -12,11 +12,11 @@ #define FLOPS_MASS_METHODS_H_ namespace flops { -double fin_mass(int number_of_fins, double area, double taper_ratio, double design_gross_weight); +double fin_mass(double technology_factor, int number_of_fins, double area, double taper_ratio, double design_gross_weight); -double horizontal_stabilizer_mass(double area, double taper_ratio, double design_gross_weight); +double horizontal_stabilizer_mass(double technology_factor, double area, double taper_ratio, double design_gross_weight); -double vertical_stabilizer_mass(int number_of_tails, double area, double taper_ratio, double design_gross_weight); +double vertical_stabilizer_mass(double technology_factor, int number_of_tails, double area, double taper_ratio, double design_gross_weight); } // namespace flops -#endif // FLOPS_MASS_METHODS_H_ \ No newline at end of file +#endif // FLOPS_MASS_METHODS_H_ diff --git a/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.cpp b/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.cpp index 8246e59678bdb7fcc8efab7779ebb5d55e4d61ac..3a9256a956ee74ba2a491b7ec0ed9eaca97c4f21 100644 --- a/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.cpp +++ b/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.cpp @@ -16,7 +16,8 @@ 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")), + 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( @@ -26,10 +27,11 @@ 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); } } // namespace low -} // namespace taw \ No newline at end of file +} // namespace taw diff --git a/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.h b/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.h index cd0a7f9f02f6d17925d67aef71eba6771a7b5299..bf4e2f55f6098b5e653b98200709a7f4f6a85560 100644 --- a/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.h +++ b/empennage_design/src/taw/conventional/conventionalEmpennageDesignConfig.h @@ -27,6 +27,7 @@ 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 625950f4d31e12e748bcc290c485ef05d43b6d5f..8e149015186882cc1c66f8425495619ac095bff1 100644 --- a/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesign.cpp +++ b/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesign.cpp @@ -49,13 +49,13 @@ void Conventional::initialize() { /* Read configuration data */ config->read(rtIO->moduleConfig); - + /* Create airfoils directory in project path (only if non-existing -> e.g. if standalone usage)*/ rtIO->createAirfoilDataDir(); /* Read acxml data - non aircraftgeometry2 */ data->read(rtIO->acxml); - + /* Read acxml data - aircraftgeometry2 */ data->read_wing(rtIO->acxmlAccess, rtIO->getAirfoilDataDir()); data->read_fuselage(rtIO->acxmlAccess, rtIO->getGeometryDir()); @@ -67,11 +67,11 @@ void Conventional::initialize() { /* Create airfoils library */ airfoils_library = std::make_shared<Airfoils>(static_cast<std::filesystem::path>(config->common_airfoil_data_path.value())); - + /* Append runtimeIO airfoils data directory */ airfoils_library->add_directory_airfoils(rtIO->getAirfoilDataDir()); - - + + } void Conventional::run() { @@ -79,7 +79,7 @@ void Conventional::run() { myRuntimeInfo->out << "Running empennage -> conventional tail" << std::endl; /* Run design method */ design_mode_runner[selected_design_mode](); - + /* Run mass method */ mass_mode_runner[selected_mass_mode](); } @@ -93,13 +93,13 @@ void Conventional::update() { void Conventional::report() { /* Create reports */ myRuntimeInfo->out << "Reporting empennage -> conventional tail" << std::endl; - + /* Set html report data and plots */ set_html_body(); /* Generate reports */ reporter.generateReports(); - + /* Create STL file (only for debugging reasons) */ data->vertical_stabilizer.origin = geom2::Point_3(data->empennage_position.x.value() + data->vertical_stabilizer.origin.x(), @@ -394,7 +394,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(1, geom2::measure::reference_area(data->vertical_stabilizer), + flops::vertical_stabilizer_mass(config->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()) @@ -412,7 +412,7 @@ void Conventional::flops_mass() { /* Horizontal stabilizer mass and cog */ data->horizontal_stabilizer_mass.data["mass"] = - flops::horizontal_stabilizer_mass(geom2::measure::reference_area(data->horizontal_stabilizer), + flops::horizontal_stabilizer_mass(config->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()) @@ -433,19 +433,19 @@ void Conventional::flops_mass() { data->empennage_position.z.value() + data->horizontal_stabilizer.origin.z() + -hs_position_mac.z(); data->empennage_mass.data["mass"] = data->horizontal_stabilizer_mass.data["mass"].value() + data->vertical_stabilizer_mass.data["mass"].value(); - + /* Compute x direction overall COG_x */ data->empennage_mass.data["x"] = (data->vertical_stabilizer_mass.data["mass"].value() * data->vertical_stabilizer_mass.data["x"].value() + data->horizontal_stabilizer_mass.data["mass"].value() * data->horizontal_stabilizer_mass.data["x"].value()) / data->empennage_mass.data["mass"].value(); - + /* Compute y direction overall COG_y */ data->empennage_mass.data["y"] = (data->vertical_stabilizer_mass.data["mass"].value() * data->vertical_stabilizer_mass.data["y"].value() + data->horizontal_stabilizer_mass.data["mass"].value() * data->horizontal_stabilizer_mass.data["y"].value()) / data->empennage_mass.data["mass"].value(); - + /* Compute z direction overall COG_z */ data->empennage_mass.data["z"] = (data->vertical_stabilizer_mass.data["mass"].value() * data->vertical_stabilizer_mass.data["z"].value() + @@ -463,4 +463,4 @@ void Conventional::raymer_mass() { } } // namespace low -} // namespace taw \ No newline at end of file +} // namespace taw diff --git a/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesignReport.cpp b/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesignReport.cpp index 8b11a9c8ec9ff5eeba11e05f531501af0566f14e..f1c9ddf8eee18cfbca6a4d4acf80a3e6f3d6dd79 100644 --- a/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesignReport.cpp +++ b/empennage_design/src/taw/conventional/low/lowConventionalEmpennageDesignReport.cpp @@ -161,7 +161,7 @@ void Conventional::set_html_body() { /* Table 3 - Spar parameters*/ std::vector<geom2::MultisectionSurface<geom2::PolygonSection>> vertical_stabilizer_spars = data->vertical_stabilizer_spars; - for (int spar_id = 0; spar_id < vertical_stabilizer_spars.size(); ++spar_id) { + for (size_t spar_id = 0; spar_id < vertical_stabilizer_spars.size(); ++spar_id) { reporter.htmlReportStream() << "<table class=\"content-table\">\n"; if (spar_id == 0) { reporter.htmlReportStream() << "<caption>Spar parameters</caption>\n"; @@ -174,7 +174,7 @@ void Conventional::set_html_body() { << "</thead>\n" << "<tbody>\n"; /* Spar name - eta, x/c*/ - for (int i = 0; i < vertical_stabilizer_spars.at(spar_id).sections.size(); ++i) { + for (size_t i = 0; i < vertical_stabilizer_spars.at(spar_id).sections.size(); ++i) { reporter.htmlReportStream() << "<tr>\n"; std::string tag = ""; if (i == 0) { @@ -315,7 +315,7 @@ void Conventional::set_html_body() { << "<thead>\n" << "<tr>\n" << "<th>parameter</th><th>symbol</th><th>unit</th>"; - for (int i = 0; i < data->horizontal_stabilizer.sections.size(); ++i) { + for (size_t i = 0; i < data->horizontal_stabilizer.sections.size(); ++i) { reporter.htmlReportStream() << std::format("<th>S<sub>{:02d}</sub></th>", i); } reporter.htmlReportStream() << "\n</tr>\n" @@ -406,7 +406,7 @@ void Conventional::set_html_body() { /* Table 3 - Spar parameters*/ std::vector<geom2::MultisectionSurface<geom2::PolygonSection>> horizontal_stabilizer_spars = data->horizontal_stabilizer_spars; - for (int spar_id = 0; spar_id < horizontal_stabilizer_spars.size(); ++spar_id) { + for (size_t spar_id = 0; spar_id < horizontal_stabilizer_spars.size(); ++spar_id) { reporter.htmlReportStream() << "<table class=\"content-table\">\n"; if (spar_id == 0) { reporter.htmlReportStream() << "<caption>Spar parameters</caption>\n"; @@ -419,7 +419,7 @@ void Conventional::set_html_body() { << "</thead>\n" << "<tbody>\n"; /* Spar name - eta, x/c*/ - for (int i = 0; i < horizontal_stabilizer_spars.at(spar_id).sections.size(); ++i) { + for (size_t i = 0; i < horizontal_stabilizer_spars.at(spar_id).sections.size(); ++i) { reporter.htmlReportStream() << "<tr>\n"; std::string tag = ""; if (i == 0) { @@ -494,11 +494,11 @@ void Conventional::set_html_body() { << "\n<tr>\n" << "</tbody>\n" << "</table>\n"; - - + + /* close box data div */ reporter.htmlReportStream() << "</div>\n"; - + if (rtIO->plotOn) { /* open box plot div */ reporter.htmlReportStream() << "<div class=\"box plot\">\n"; @@ -524,7 +524,7 @@ void Conventional::set_html_body() { auto vertical_stabilizer_thickness_and_twist_plot_path = plot_thickness_and_twist_distribution(data->vertical_stabilizer); reporter.htmlReportStream() << std::format("<img class=\"image-plot\" src=\"{}\"/>\n", vertical_stabilizer_thickness_and_twist_plot_path.string()); - + /* Horizontal Stabilizer planform plot */ auto planform_horizontal_stabilizer_plot_path = plot_stabilizer_planform( @@ -542,10 +542,10 @@ void Conventional::set_html_body() { auto horizontal_stabilizer_thickness_and_twist_plot_path = plot_thickness_and_twist_distribution(data->horizontal_stabilizer); reporter.htmlReportStream() << std::format("<img class=\"image-plot\" src=\"{}\"/>\n", horizontal_stabilizer_thickness_and_twist_plot_path.string()); - + // /* close box plot */ reporter.htmlReportStream() << "</div>\n"; } } } // namespace low -} // namespace taw \ No newline at end of file +} // namespace taw