diff --git a/create_mission_xml/src/standard_mission/standard_mission/standard_mission.cpp b/create_mission_xml/src/standard_mission/standard_mission/standard_mission.cpp index 1680bf98a8551f5164ef8221ec17b87a6e7330ae..cae96ba29aad28a85dd6f7c1896549e0f7d82798 100644 --- a/create_mission_xml/src/standard_mission/standard_mission/standard_mission.cpp +++ b/create_mission_xml/src/standard_mission/standard_mission/standard_mission.cpp @@ -54,8 +54,8 @@ void standard_mission::initialize() { requirements_mission->cruise_step_segments.clear(); // Clear cruise steps for requirement mission requirements_mission->cruise_step_segments.push_back(design_mission->cruise_step_segments.front()); requirements_mission->cruise_step_segments.front().relative_segment_length = 1.; // Set the relative segment length for requirement mission - requirements_mission->cruise_step_segments.front().altitude = - requirements_mission->initial_cruise_altitude; // Set flight level for requirement mission + requirements_mission->cruise_step_segments.front().altitude = // Set flight level for requirement mission + convertUnit(HECTO, FOOT, NOPREFIX, METER, requirements_mission->initial_cruise_altitude); } void standard_mission::run() { diff --git a/mission_analysis/src/standard_mission/fuel_handling/fuel_handling.cpp b/mission_analysis/src/standard_mission/fuel_handling/fuel_handling.cpp index 4aa835a65955d325d01496c64b5b654716ce7068..067ee64e3be7ff77ff770b3cce6e9203fd726ce2 100644 --- a/mission_analysis/src/standard_mission/fuel_handling/fuel_handling.cpp +++ b/mission_analysis/src/standard_mission/fuel_handling/fuel_handling.cpp @@ -205,27 +205,29 @@ void standard_mission::set_final_reserve_fuel(double *aircraft_mass) { } void standard_mission::set_alternate_fuel(double* aircraft_mass) { - int energy_carrier_id = // TODO(Gerrit): Check if it makes senese: Assuming cruise energy carrier used for alternate fuel reserves (derived from cruise conditions) + int energy_carrier_id = // TODO(Gerrit): Check if it makes sense: Assuming cruise energy carrier used for alternate fuel reserves (derived from cruise conditions) EndnodeReadOnly<int>("energy_carrier_ID").read(rtIO->acxml.at("requirements_and_specifications/design_specification/propulsion/energy_provider/cruise")).value(); - /* Alternate fuel: Calculation of the flight altitude from alternate */ - double alternate_FL = this->mission_file->alternate_distance * 0.8 / (1. / tan(convertUnit(DEGREE, RADIAN, 5.)) + 1. / tan(convertUnit(DEGREE, RADIAN, 3.))); - if (alternate_FL > convertUnit(FOOT, METER, 30000.)) { - alternate_FL = convertUnit(FOOT, METER, 30000.); - } - double climb_mach(convertUnit(CALIBRATEDAIRSPEED, MACH, convertUnit(FOOT, METER, 10000.), this->atm, this->climb_speed_below_FL100)); - /* Alternate climbing: Estimation with the values at 10.000 ft */ - this->engine.calculate_N1_with_penalties(energy_carrier_id, convertUnit(FOOT, METER, 10000.), climb_mach, this->atm, 1., "climb", 0., 0.); + /* Alternate fuel: Calculation of the flight altitude from alternate. Climb gradient (2.5°) and decent (1.5°) estimated based on typical ROC and TAS */ + // TODO(Gerrit): Get angles e.g. from certifications or other values previously used + double alternate_FL = this->mission_file->alternate_distance * 0.8 / (1. / tan(convertUnit(DEGREE, RADIAN, 2.5)) + 1. / tan(convertUnit(DEGREE, RADIAN, 1.5))); + /* Maximum alternate at FL200 based on Schmitt and Gollnick, Air Transport System */ + if (alternate_FL > convertUnit(HECTO, FOOT, NOPREFIX, METER, 200.)) { + alternate_FL = convertUnit(HECTO, FOOT, NOPREFIX, METER, 200.); + } + double climb_mach(convertUnit(CALIBRATEDAIRSPEED, MACH, alternate_FL, this->atm, this->climb_speed_below_FL100)); + /* Alternate climbing */ + this->engine.calculate_N1_with_penalties(energy_carrier_id, alternate_FL, climb_mach, this->atm, 1., "climb", 0., 0.); /* Calculate aerodynamics */ - double L_over_D(this->aero.getCruiseLoverD(climb_mach, convertUnit(FOOT, METER, 10000.), 0., *aircraft_mass, "clean", this->atm)); + double L_over_D(this->aero.getCruiseLoverD(climb_mach, alternate_FL, 0., *aircraft_mass, "clean", this->atm)); if (sophistication_level != UNSOPHISTICATED) { double current_cg(get_current_cg()); L_over_D = this->interpolateViaCoG(current_cg, L_over_D, - getAlternativeAero(current_cg)->getCruiseLoverD(climb_mach, convertUnit(FOOT, METER, 10000.), 0., *aircraft_mass, "clean", this->atm)); + getAlternativeAero(current_cg)->getCruiseLoverD(climb_mach, alternate_FL, 0., *aircraft_mass, "clean", this->atm)); } /* Calculate the specific fuel consumption */ double SFC = this->engine.get_aircraft_fuelflow(energy_carrier_id) / this->engine.get_thrust_aircraft(energy_carrier_id); /* Alternate climbing: Estimate the climbing duration with 5 deg climb angle */ - double climb_time_altn = alternate_FL / (tan(convertUnit(DEGREE, RADIAN, 5.)) * convertUnit(MACH, CALIBRATEDAIRSPEED, convertUnit(FOOT, METER, 10000.), this->atm, climb_mach)); + double climb_time_altn = alternate_FL / (tan(convertUnit(DEGREE, RADIAN, 5.)) * convertUnit(MACH, CALIBRATEDAIRSPEED, alternate_FL, this->atm, climb_mach)); /* Calculate the alternate climbing fuel mass */ double m_climb_altn = *aircraft_mass * expm1(climb_time_altn * SFC * G_FORCE / L_over_D); /* Calculate the alternate fuel mass */ @@ -297,8 +299,7 @@ double standard_mission::calculate_holding_fuel(const double& aircraft_mass, con EndnodeReadOnly<int>("energy_carrier_ID").read(rtIO->acxml.at("requirements_and_specifications/design_specification/propulsion/energy_provider/descent")).value(); atmosphere holding_atm; //Airbus defines to calculate holding pattern at ISA-Conditions double holding_mach(EndnodeReadOnly<double>("/program_settings/general/fuel_planning/holding/holding_mach_number").read(this->rtIO->moduleConfig).value()); - double holding_altitude(convertUnit(FOOT, METER, - EndnodeReadOnly<double>("/program_settings/general/fuel_planning/holding/holding_altitude").read(this->rtIO->moduleConfig).value())); + double holding_altitude(EndnodeReadOnly<double>("/program_settings/general/fuel_planning/holding/holding_altitude").read(this->rtIO->moduleConfig).value()); if (EndnodeReadOnly<bool>("program_settings/general/fuel_planning/holding/use_economical_speed").read(this->rtIO->moduleConfig).value()) { this->calculate_econ_cruise_speed(&holding_mach, holding_altitude, 0., aircraft_mass, this->aero.cruiseConfiguration, "cruise"); } diff --git a/mission_analysis/src/standard_mission/geometry_handling/geometry_handling.cpp b/mission_analysis/src/standard_mission/geometry_handling/geometry_handling.cpp index 9bcfc4662d3d47052081d8a373a49f63151a0eed..823c6fab5df05eeddd593de7b9e6ab34e7572276 100644 --- a/mission_analysis/src/standard_mission/geometry_handling/geometry_handling.cpp +++ b/mission_analysis/src/standard_mission/geometry_handling/geometry_handling.cpp @@ -184,7 +184,7 @@ void standard_mission::initialize_geometry() { } /* read CoG x-position of wing from aircraft exchange file and check given boundary condition [m] */ - this->cg_wing = 17.1682343; //TODO(Gerrit) hier: fuselage_vector.at(0).l, true); + // this->cg_wing = 17.1682343; //TODO(Gerrit) hier: fuselage_vector.at(0).l, true); /* Tank Error catch */ // if (this->number_center_tanks == 0 && this->number_trim_tanks == 0 && this->number_wing_tanks == 0) { diff --git a/mission_analysis/src/standard_mission/output/standard_mission_output.cpp b/mission_analysis/src/standard_mission/output/standard_mission_output.cpp index 9274edd4673d5f4ea72112759b05bd99d90ec2ce..f769bff600018441a6bb828030b37db7e7396e01 100644 --- a/mission_analysis/src/standard_mission/output/standard_mission_output.cpp +++ b/mission_analysis/src/standard_mission/output/standard_mission_output.cpp @@ -33,7 +33,7 @@ standard_mission_output::standard_mission_output(standard_mission* mission_ptr) rtIO(mission_ptr->rtIO), report_(rtIO), /* Initialization of switch for requirements checked */ - requirements_cecked(false), + requirements_checked(false), /* Initialization of SAR plot altitudes */ start_altitude(0.), end_altitude(0.), @@ -45,19 +45,26 @@ standard_mission_output::standard_mission_output(standard_mission* mission_ptr) /* localize variable camber */ first_filled_position(0) { this->initialize(); - /*Write mission output csv files */ - this->generate_mission_profile_data(); - if (rtIO->plotOn) { - this->generate_mission_plots(); - if (SAR_plot_on) { - this->generate_SAR_plot_data(); - this->generate_SAR_plots(); + if (my_mission_ptr->requirement_switch) { // Requirements mission does not write a full report + if (rtIO->reportOn) { + this->generate_requirements_html_report(); + report_.generateReports(rtIO->programname + "_" + my_mission_ptr->mission_type); + } + } else { + /*Write mission output csv files */ + this->generate_mission_profile_data(); + if (rtIO->plotOn) { + this->generate_mission_plots(); + if (SAR_plot_on) { + this->generate_SAR_plot_data(); + this->generate_SAR_plots(); + } + } + if (rtIO->reportOn) { + this->generate_html_report(); + this->generate_tex_report_body(); + report_.generateReports(rtIO->programname + "_" + my_mission_ptr->mission_type); } - } - if (rtIO->reportOn) { - this->generate_html_report(); - this->generate_tex_report_body(); - report_.generateReports();//"_" + my_mission_ptr->mission_type); TODO(GErrit): Wieder rein, wenn bereit } } @@ -79,7 +86,7 @@ void standard_mission_output::initialize() { myRuntimeInfo->out << "Create directory for mission data output in project folder: " << rtIO->getMissionDataDir() << std::endl; CreateDirectory(rtIO->getMissionDataDir().c_str(), NULL); } - this->base_name_output_files = std::string(TOOL_NAME) + "_" + this->my_mission_ptr->mission_type; + this->base_name_output_files = rtIO->programname + "_" + this->my_mission_ptr->mission_type; /* Check if the calculated reserve fuel + extra fuel is negative after taxiing at destination airport. If so, warning message */ double fuelAtDestinationGate = this->my_mission_ptr->get_fuel_sum(this->my_mission_ptr->loaded_fuel_mass) - this->my_mission_ptr->get_fuel_sum(this->my_mission_ptr->trip_fuel_mass) - @@ -101,9 +108,9 @@ void standard_mission_output::initialize() { EndnodeReadOnly<bool>(subpath + "/maximum_altitude_one_engine_inoperative/checked").read(rtIO->acxml).value() && EndnodeReadOnly<bool>(subpath + "/initial_cruise_mach_number/checked").read(rtIO->acxml).value() && EndnodeReadOnly<bool>(subpath + "/design_time_to_climb/checked").read(rtIO->acxml).value()) { - this->requirements_cecked = true; + this->requirements_checked = true; } else { - this->requirements_cecked = false; + this->requirements_checked = false; } } @@ -144,8 +151,11 @@ void standard_mission_output::generate_mission_profile_data() { for (node* propulsor : rtIO->acxml.at("component_design/propulsion/specific").getVector("propulsion")) { csvStream << "Engine N1 (" << propulsor->at("engine/model/value") << ", ID = " << propulsor->getIntAttrib("ID") << ") [-]; "; } - csvStream << "Shaft power offtake [W]; " << "Bleed [kg/s]; " << "CoG aircraft [m]; " << "CoG fuel [m]; " - << "Angle of attack [deg]; " << "Glidepath angle [deg]; " << "Incidence angle (stabilizer) [deg]"; + csvStream << "Shaft power offtake [W]; " << "Bleed [kg/s]; "; + if (this->my_mission_ptr->sophistication_level != this->my_mission_ptr->UNSOPHISTICATED) { // Center of Gravity shift not needed if not calculated + csvStream << "CoG aircraft [m]; " << "CoG fuel [m]; "; + } + csvStream << "Angle of attack [deg]; " << "Glidepath angle [deg]; " << "Incidence angle (stabilizer) [deg]"; for (uint8_t k(0); k < this->my_mission_ptr->mission_profile.at(first_filled_position).end_origin_polar[0].size(); ++k) { std::string flap_setting_name("segment ID " + num2Str(this->my_mission_ptr->mission_profile.at(first_filled_position).end_origin_polar[0].at(k)) + " flap setting"); csvStream << ";(" << 32+k << ") " << flap_setting_name << " [deg]; "; @@ -195,10 +205,12 @@ void standard_mission_output::generate_mission_profile_data() { csvStream << my_mission_ptr->mission_profile.at(i).end_n1.at(propulsor->getIntAttrib("ID")) << "; "; // Add N1 for each engine } csvStream << my_mission_ptr->mission_profile.at(i).end_shaft_power << "; " - << my_mission_ptr->mission_profile.at(i).end_bleed << "; " - << my_mission_ptr->mission_profile.at(i).end_aircraft_cg << "; " - << my_mission_ptr->mission_profile.at(i).end_fuel_cg << "; " - << my_mission_ptr->mission_profile.at(i).end_angle_of_attack << "; " + << my_mission_ptr->mission_profile.at(i).end_bleed << "; "; + if (this->my_mission_ptr->sophistication_level != this->my_mission_ptr->UNSOPHISTICATED) { // Center of Gravity shift not needed if not calculated + csvStream << my_mission_ptr->mission_profile.at(i).end_aircraft_cg << "; " + << my_mission_ptr->mission_profile.at(i).end_fuel_cg << "; "; + } + csvStream << my_mission_ptr->mission_profile.at(i).end_angle_of_attack << "; " << convertUnit(RADIAN, DEGREE, my_mission_ptr->mission_profile.at(i).end_glidepath_angle) << "; " << my_mission_ptr->mission_profile.at(i).end_stabilizer_incidence; for (uint8_t k(0); k < my_mission_ptr->mission_profile.at(i).end_origin_polar[1].size(); ++k) { @@ -222,7 +234,7 @@ void standard_mission_output::generate_mission_profile_data() { this->TAS_profile.data.push_back(convertUnit(METERPERSECOND, KNOTS, my_mission_ptr->mission_profile.at(i).end_TAS)); this->bleed_air_profile.data.push_back(my_mission_ptr->mission_profile.at(i).end_bleed); this->shaft_power_profile.data.push_back(my_mission_ptr->mission_profile.at(i).end_TAS); - if (my_mission_ptr->aero_aft == nullptr && my_mission_ptr->aero_forward == nullptr) { // No alternative aerodynamics = no CoG shift! + if (my_mission_ptr->sophistication_level != my_mission_ptr->UNSOPHISTICATED) { // No CoG shift this->CoG_pos_profile.data.push_back(my_mission_ptr->mission_profile.at(i).end_aircraft_cg); this->i_stab_profile.data.push_back(my_mission_ptr->mission_profile.at(i).end_stabilizer_incidence); } @@ -523,24 +535,24 @@ void standard_mission_output::generate_html_report() { // cppcheck-suppress unus << html::table_row("Range", "", "NM", Rounding(convertUnit(METER, NAUTICALMILE, this->my_mission_ptr->mission_file->Range), 2)) << html::table_row("Payload (PL)", "Passengers + Cargo", "kg", this->my_mission_ptr->payload_mass.value()) << html::table_row("Passengers", "", "-", my_mission_ptr->mission_file->PAX) - << html::table_row("Cargo mass", "", "kg", my_mission_ptr->mission_file->cargo_mass) - << html::table_row("Cruise Mach number", "", "-", this->my_mission_ptr->mission_file->desired_cruise_speed) - << html::table_row("Cruise climb steps", "", "ft", this->my_mission_ptr->step_height_cruise) + << html::table_row("Cargo mass", "", "kg", Rounding(my_mission_ptr->mission_file->cargo_mass, 0)) + << html::table_row("Cruise Mach number", "", "-", Rounding(this->my_mission_ptr->mission_file->desired_cruise_speed, 2)) + << html::table_row("Cruise climb steps", "", "ft", Rounding(this->my_mission_ptr->step_height_cruise, 0)) << html::table_row("Climb Mach number", "above crossover altitude", "-", this->my_mission_ptr->mission_file->desired_cruise_speed + this->my_mission_ptr->delta_mach_above_crossover) - << html::table_row("Climb CAS above FL100", "", "KCAS", this->my_mission_ptr->climb_speed_above_FL100) - << html::table_row("Climb CAS below FL100", "", "KCAS", this->my_mission_ptr->climb_speed_below_FL100) - << html::table_row("Descent CAS above FL100", "", "KCAS", this->my_mission_ptr->descent_speed_above_FL100) - << html::table_row("Descent CAS below FL100", "", "KCAS", this->my_mission_ptr->descent_speed_below_FL100) - << html::table_row("Taxi-out time", "min", "", Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->mission_file->taxi_time_origin), 0)) - << html::table_row("Taxi-in time", "min", "", Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->mission_file->taxi_time_destination), 0)) - << html::table_row("Alternate distance", "NM", "", Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->mission_file->taxi_time_destination), 0)) + << html::table_row("Climb CAS above FL100", "", "KCAS", Rounding(this->my_mission_ptr->climb_speed_above_FL100, 0)) + << html::table_row("Climb CAS below FL100", "", "KCAS", Rounding(this->my_mission_ptr->climb_speed_below_FL100, 0)) + << html::table_row("Descent CAS above FL100", "", "KCAS", Rounding(this->my_mission_ptr->descent_speed_above_FL100, 0)) + << html::table_row("Descent CAS below FL100", "", "KCAS", Rounding(this->my_mission_ptr->descent_speed_below_FL100, 0)) + << html::table_row("Taxi-out time", "", "min", Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->mission_file->taxi_time_origin), 0)) + << html::table_row("Taxi-in time", "", "min", Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->mission_file->taxi_time_destination), 0)) + << html::table_row("Alternate distance", "", "NM", Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->mission_file->alternate_distance), 0)) << html::table_row("Fuel reserves method", fuelPlanning, "", "") << html::table_end << html::h2("Mission simulation results") << html::table_begin({"Parameter", "Comment", "Unit", "Value"}) - << html::table_row("Take-off mass", "TOM = OME + PL + MF - TXF<sub>out</sub>", "kg", this->my_mission_ptr->takeoff_mass.value()) - << html::table_row("Operating mass empty", "OME", "kg", this->my_mission_ptr->OME) + << html::table_row("Take-off mass", "TOM = OME + PL + MF - TXF<sub>out</sub>", "kg", Rounding(this->my_mission_ptr->takeoff_mass.value(), 0)) + << html::table_row("Operating mass empty", "OME", "kg", Rounding(this->my_mission_ptr->OME, 0)) << html::table_row("Mission (loaded) fuel", "MF = TF + RF + EF + TXF<sub>out</sub>", "kg", Rounding(this->my_mission_ptr->get_fuel_sum(this->my_mission_ptr->loaded_fuel_mass), 0)) << html::table_row("Trip fuel", "TF", "kg", Rounding(my_mission_ptr->get_fuel_sum(this->my_mission_ptr->trip_fuel_mass), 0)) @@ -550,26 +562,25 @@ void standard_mission_output::generate_html_report() { // cppcheck-suppress unus << html::table_row("Extra fuel", "EF", "kg", Rounding(this->my_mission_ptr->extra_fuel_mass.second, 0)) << html::table_row("Taxi-out fuel", "TXF<sub>out</sub>", "kg", Rounding(this->my_mission_ptr->taxi_fuel_mass_origin.second, 0)) << html::table_row("Taxi-in fuel", "TXF<sub>in</sub>", "kg", Rounding(this->my_mission_ptr->taxi_fuel_mass_destination.second, 0)) - << html::table_row("Landing mass", "MTOM - TF", "kg", this->my_mission_ptr->mission_profile.back().end_total_mass) + << html::table_row("Landing mass", "MTOM - TF", "kg", Rounding(this->my_mission_ptr->mission_profile.back().end_total_mass, 0)) << html::table_row("Block time", "", "h", blockTime) << html::table_row("Flight time", "", "h", flightTime) << html::table_end; - if (requirements_cecked) { + if (requirements_checked) { report_.htmlReportStream() << html::h2("Calculated performance values for TLARs") << html::table_begin({"Parameter", "Comment", "Unit", "Value"}) << html::table_row("Max. operating altitude", "climb with 100ft/min, ISA + " + num2Str(this->my_mission_ptr->delta_ISA) + - " *", "ft", static_cast<int>(Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->max_operating_altitude), 0))) + " *", "ft", Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->max_operating_altitude), 0)) << html::table_row("One-engine out (OEI) net ceiling", "after T/O @ MTOM, 100ft/min, ISA + "+ num2Str(this->my_mission_ptr->delta_ISA) + - " *", "ft", static_cast<int>(Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->max_altitude_one_engine_inoperative), 0))) + " *", "ft", Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->max_altitude_one_engine_inoperative), 0)) << html::table_row("Time-to-1500ft", "from break release to 1500 ft **", "min", - static_cast<int>(Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_1500ft), 0))) + Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_1500ft), 0)) << html::table_row("Time-to-climb", "from 1500 ft to ICA **", "min", - static_cast<int>(Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_1500ft_to_ICA), 0))) + Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_1500ft_to_ICA), 0)) << html::table_row("Time-to-ICA", "from break release to ICA **", "min", - static_cast<int>(Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_ICA), 0))) - << html::table_row("Range-to-ICA", "from break release to ICA **", "NM", - static_cast<int>(Rounding(convertUnit(METER, NAUTICALMILE, this->my_mission_ptr->range_start_to_ICA), 0))) - << html::table_row("Fuel-to-ICA", "from break release to ICA **", "kg", static_cast<int>(Rounding(this->my_mission_ptr->fuel_start_to_ICA, 1))) + Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_ICA), 0)) + << html::table_row("Range-to-ICA", "from break release to ICA **", "NM", Rounding(convertUnit(METER, NAUTICALMILE, this->my_mission_ptr->range_start_to_ICA), 0)) + << html::table_row("Fuel-to-ICA", "from break release to ICA **", "kg", Rounding(this->my_mission_ptr->fuel_start_to_ICA, 0)) << html::table_end << "<p style=\"text-align: right; margin-right: 3rem;\">* Engine rating: Max. Continuous<br>** Engine rating: Climb</p>" << std::endl; /* Cruise steps */ @@ -676,7 +687,7 @@ void standard_mission_output::generate_tex_report_body() { // cppcheck-suppress << " \\midrule[0.5pt]" << std::endl << " \\multicolumn{4}{l}{\\textbf{Mission simulation results}}\\\\" << std::endl << " \\midrule[0.5pt]" << std::endl - << " Take-off mass & \\tiny{$TOM = OME + PL + MF - TXF_{out}$} & $\\kilogram$ & " << my_mission_ptr->takeoff_mass.value() << " \\\\ " << std::endl + << " Take-off mass & \\tiny{$TOM = OME + PL + MF - TXF_{out}$} & $\\kilogram$ & " << Rounding(my_mission_ptr->takeoff_mass.value(), 0) << " \\\\ " << std::endl << " Mission (loaded) fuel &\\tiny{$MF = TF + RF + EF + TXF_{out}$} & $\\kilogram$ & " << Rounding(this->my_mission_ptr->get_fuel_sum(this->my_mission_ptr->loaded_fuel_mass), 0) << " \\\\ " << std::endl << " Trip fuel & \\tiny{$TF$} & $\\kilogram$ & " @@ -742,7 +753,7 @@ void standard_mission_output::generate_tex_report_body() { // cppcheck-suppress report_.texReportStream() << "\\end{frame}" << std::endl << std::endl << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" << std::endl; - if (this->requirements_cecked) { + if (this->requirements_checked) { report_.texReportStream() << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" << std::endl << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" << std::endl << "\\begin{frame}" << std::endl @@ -774,9 +785,9 @@ void standard_mission_output::generate_tex_report_body() { // cppcheck-suppress << std::setprecision(1) << std::fixed << Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_1500ft), 2) << " \\\\ " << std::endl << " Time-to-ICA & \\tiny{from break release to ICA} & $\\min$ & " << std::setprecision(1) << std::fixed << Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_ICA), 2) << " \\\\ " << std::endl - << " Range-to-ICA & \\tiny{from break release to ICA} & $\\nauticalmiles$ & " << std::setprecision(1) + << " Range-to-ICA & \\tiny{from break release to ICA} & $\\nauticalmiles$ & " << std::setprecision(0) << std::fixed << Rounding(this->my_mission_ptr->range_start_to_ICA, 2) << " \\\\ " << std::endl - << " Fuel-to-ICA & \\tiny{from break release to ICA} & $\\kilogram$ & " << std::setprecision(1) + << " Fuel-to-ICA & \\tiny{from break release to ICA} & $\\kilogram$ & " << std::setprecision(0) << std::fixed << Rounding(this->my_mission_ptr->fuel_start_to_ICA, 2) << " \\\\ " << std::endl << " \\bottomrule" << std::endl << " \\end{tabularx}" << std::endl @@ -786,6 +797,61 @@ void standard_mission_output::generate_tex_report_body() { // cppcheck-suppress } } +void standard_mission_output::generate_requirements_html_report() { + report_.htmlReportStream() << html::div_start("class=\"box\""); + /* Fill HTML */ + if (requirements_checked) { // If-catch whether requirements were really checked + /* Reference top of descent from design mission */ + std::string subpath("analysis/mission/design_mission/cruise/cruise_steps"); + double design_mission_top_of_descent_altitude = + rtIO->acxml.at(subpath +"/cruise_step@" + num2Str(rtIO->acxml.at(subpath).getVector("cruise_step").size() - 1) + "/altitude/value"); + /* Read in requirements for altitudes, time to climb and Mach number */ + subpath = "requirements_and_specifications/requirements/top_level_aircraft_requirements"; + double max_operating_altitude_required = rtIO->acxml.at(subpath + "/flight_envelope/maximum_operating_altitude/value"); + double max_altitude_one_engine_inoperative_required = rtIO->acxml.at(subpath + "/flight_envelope/maximum_altitude_one_engine_inoperative/value"); + double time_to_climb_requirement = rtIO->acxml.at(subpath + "/design_mission/time_to_climb/value"); + bool initial_mach_check(this->my_mission_ptr->initial_cruise_mach + ACCURACY_LOW >= // Added ACCURACY_LOW to catch floating point errors when the values are actually equal + this->my_mission_ptr->initial_cruise_mach_required); + bool max_altitude_check(this->my_mission_ptr->max_operating_altitude >= this->my_mission_ptr->max_operating_altitude_required && + this->my_mission_ptr->max_operating_altitude_required >= design_mission_top_of_descent_altitude); + bool max_altitude_oei_check(max_altitude_one_engine_inoperative_required <= this->my_mission_ptr->max_altitude_one_engine_inoperative); + bool climb_time_check(this->my_mission_ptr->initial_cruise_altitude_check && (time_to_climb_requirement >= this->my_mission_ptr->time_1500ft_to_ICA)); + std::string success("<span style=\"color:green;\">✔</span>"); + std::string fail("<span style=\"color:red;\">✖</span>"); + report_.htmlReportStream() << html::h2("Calculated performance values for TLARs") + << html::table_begin({"Parameter", "Comment", "Unit", "Value", "Required value", "Check"}) + << html::table_row("Initial cruise altitude (ICA)", "ISA + " + num2Str(this->my_mission_ptr->delta_ISA), + "ft", Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->initial_cruise_altitude), + -1), // precision -1 to catch floating point errors, since both values should be equal + Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->initial_cruise_altitude_required), 0), + (this->my_mission_ptr->initial_cruise_altitude_check ? success : fail)) + << html::table_row("Initial cruise Mach number", "ISA + " + num2Str(this->my_mission_ptr->delta_ISA), + "-", static_cast<double>(Rounding(this->my_mission_ptr->initial_cruise_mach, 2)), + static_cast<double>(Rounding(this->my_mission_ptr->initial_cruise_mach_required, 2)), (initial_mach_check ? success : fail)) + << html::table_row("Max. operating altitude", "climb with 100ft/min, ISA + " + num2Str(this->my_mission_ptr->delta_ISA) + + " *", "ft", Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->max_operating_altitude), 0), + Rounding(convertUnit(METER, FOOT, max_operating_altitude_required), 0), (max_altitude_check ? success : fail)) + << html::table_row("One-engine out (OEI) net ceiling", "after T/O @ MTOM, 100ft/min, ISA + "+ num2Str(this->my_mission_ptr->delta_ISA) + + " *", "ft", Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->max_altitude_one_engine_inoperative), 0), + Rounding(convertUnit(METER, FOOT, max_altitude_one_engine_inoperative_required), 0), (max_altitude_oei_check ? success : fail)) + << html::table_row("Time-to-1500ft", "from break release to 1500 ft **", "min", + Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_1500ft), 0), "Not specified", "-") + << html::table_row("Time-to-climb", "from 1500 ft to ICA **", "min", + Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_1500ft_to_ICA), 0), + Rounding(convertUnit(SECOND, MINUTE, time_to_climb_requirement), 0), + (climb_time_check ? success : (fail + (this->my_mission_ptr->initial_cruise_altitude_check ? "" : " (ICA not reached)")))) + << html::table_row("Time-to-ICA", "from break release to ICA **", "min", + Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_ICA), 0), "Not specified", "-") + << html::table_row("Range-to-ICA", "from break release to ICA **", "NM", + Rounding(convertUnit(METER, NAUTICALMILE, this->my_mission_ptr->range_start_to_ICA), 0), "Not specified", "-") + << html::table_row("Fuel-to-ICA", "from break release to ICA **", "kg", + Rounding(this->my_mission_ptr->fuel_start_to_ICA, 0), "Not specified", "-") + << html::table_end + << "<p style=\"text-align: right; margin-right: 3rem;\">* Engine rating: Max. Continuous<br>** Engine rating: Climb</p>" << std::endl; + } + report_.htmlReportStream() << html::div_end; +} + std::string standard_mission_output::timeFormater(double time) { double double_hours = convertUnit(SECOND, HOUR, time); int int_hours = double_hours; diff --git a/mission_analysis/src/standard_mission/output/standard_mission_output.h b/mission_analysis/src/standard_mission/output/standard_mission_output.h index 050565b33d7f5fba4c80273067e936e5a185dda4..e6e972ae0f321c0242af5d6ca9394bd89ca9923b 100644 --- a/mission_analysis/src/standard_mission/output/standard_mission_output.h +++ b/mission_analysis/src/standard_mission/output/standard_mission_output.h @@ -47,7 +47,7 @@ class standard_mission_output { std::string csv_file_name; /**< Name of the csv file */ std::string report_file; /**< Name of the report file */ std::string base_name_output_files; /**< Base name of the output files */ - bool requirements_cecked; /**< Switch for requirements checked */ + bool requirements_checked; /**< Switch for requirements checked */ /* SAR plot variables */ double start_altitude; /**< Altitude at the start for the plot of the Specific Air Range [ft] */ @@ -86,6 +86,9 @@ class standard_mission_output { /** \brief Function for generating a HTML report */ void generate_html_report(); + /** \brief Function for generating a HTML report for the requirements mission + */ + void generate_requirements_html_report(); /** \brief Function for generating a Tex report */ void generate_tex_report_body(); diff --git a/mission_analysis/src/standard_mission/standard_mission/standard_mission.cpp b/mission_analysis/src/standard_mission/standard_mission/standard_mission.cpp index 6edda0d785e594c5f8de59209734b2726296feef..1c09711638b803ed64e72b8af3b8776ad2745b2f 100644 --- a/mission_analysis/src/standard_mission/standard_mission/standard_mission.cpp +++ b/mission_analysis/src/standard_mission/standard_mission/standard_mission.cpp @@ -100,31 +100,31 @@ standard_mission::standard_mission(const std::shared_ptr<RuntimeIO>& rtIO) : "requirements_and_specifications/requirements/top_level_aircraft_requirements/maximum_operating_altitude").read(rtIO->acxml).value()), max_ceiling_altitude(NAN), max_altitude_one_engine_inoperative(NAN), - climb_speed_below_FL100(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirments mission get the same + climb_speed_below_FL100(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirements mission get the same EndnodeReadOnly<double>("requirements_and_specifications/requirements/top_level_aircraft_requirements/" + this->mission_type + "/climb_speed_schedule/climb_speed_below_FL100").read(rtIO->acxml).value() : EndnodeReadOnly<double>( "requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission/climb_speed_schedule/climb_speed_below_FL100").read(rtIO->acxml).value()), - climb_speed_above_FL100(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirments mission get the same + climb_speed_above_FL100(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirements mission get the same EndnodeReadOnly<double>("requirements_and_specifications/requirements/top_level_aircraft_requirements/" + mission_type + "/climb_speed_schedule/climb_speed_above_FL100").read(rtIO->acxml).value() : EndnodeReadOnly<double>( "requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission/climb_speed_schedule/climb_speed_above_FL100").read(rtIO->acxml).value()), - delta_mach_above_crossover(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirments mission get the same + delta_mach_above_crossover(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirements mission get the same EndnodeReadOnly<double>("requirements_and_specifications/requirements/top_level_aircraft_requirements/" + mission_type + "/climb_speed_schedule/delta_mach_climb_cruise").read(rtIO->acxml).value() : EndnodeReadOnly<double>( "requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission/climb_speed_schedule/delta_mach_climb_cruise").read(rtIO->acxml).value()), - descent_speed_below_FL100(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirments mission get the same + descent_speed_below_FL100(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirements mission get the same EndnodeReadOnly<double>("requirements_and_specifications/requirements/top_level_aircraft_requirements/" + mission_type + "/descent_speed_schedule/descent_speed_below_FL100").read(rtIO->acxml).value() : EndnodeReadOnly<double>("requirements_and_specifications/requirements/top_level_aircraft_requirements" + std::string("/design_mission/descent_speed_schedule/descent_speed_below_FL100")).read(rtIO->acxml).value()), - descent_speed_above_FL100(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirments mission get the same + descent_speed_above_FL100(this->mission_type == "study_mission" ? // study mission has it's own node while design and requirements mission get the same EndnodeReadOnly<double>("requirements_and_specifications/requirements/top_level_aircraft_requirements/" + mission_type + "/descent_speed_schedule/descent_speed_above_FL100").read(rtIO->acxml).value() : @@ -162,7 +162,7 @@ standard_mission::standard_mission(const std::shared_ptr<RuntimeIO>& rtIO) : /* Mission data */ auto_climb_switch(false), optimum_ROC(false), - delta_ISA(this->mission_type == "study_mission" ? // study mission has it's own delta_ISA while design and requirments mission get the same + delta_ISA(this->mission_type == "study_mission" ? // study mission has it's own delta_ISA while design and requirements mission get the same EndnodeReadOnly<double>("requirements_and_specifications/requirements/top_level_aircraft_requirements/" + this->mission_type + "/delta_ISA").read(rtIO->acxml).value() : EndnodeReadOnly<double>("requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission/delta_ISA").read(rtIO->acxml).value()), @@ -302,7 +302,9 @@ void standard_mission::initialize() { mission_file->read_departure_steps(this->max_operating_speed, energy_provider); mission_file->read_flight_steps(&this->average_shaft_bleed, &this->average_cruise_bleed, &this->auto_climb_switch, &this->step_height_cruise, this->max_operating_mach, this->max_operating_speed, energy_provider); - mission_file->read_approach_steps(this->max_operating_speed, energy_provider); + if (!(this->requirement_switch)) { // Requirements mission only flys until ceiling; no approach needed! + mission_file->read_approach_steps(this->max_operating_speed, energy_provider); + } /* Initialize mission */ bool last_segment_free_flight_switch(false); @@ -824,8 +826,8 @@ void standard_mission::requirements_mission_update() { Endnode<double> time_1500ft_to_ICA_node("design_time_to_climb", "Time needed to climb from 1500ft to ICA (ISA + deltaISA)", this->time_1500ft_to_ICA, "s", 0, 7200); Endnode<double> time_start_to_1500ft_node("time_to_1500ft_ISA", "Time needed to climb from break release to 1500ft (ISA + deltaISA)", this->time_start_to_1500ft, "s", 0, 7200); Endnode<double> time_start_to_ICA_node("time_to_ICA_ISA", "Time needed to climb from break release to ICA (ISA + deltaISA)", this->time_start_to_ICA, "s", 0, 7200); - Endnode<double> range_start_to_ICA_node("range_to_ICA_ISA", "Range needed to climb from break release to ICA (ISA + deltaISA)", this->range_start_to_ICA, "m", 0, 45000); - Endnode<double> fuel_start_to_ICA_node("fuel_to_ICA_ISA", "Fuel mass needed to climb from break release to ICA (ISA + deltaISA)", this->fuel_start_to_ICA, "kg", 0, 5000); + Endnode<double> range_start_to_ICA_node("range_to_ICA_ISA", "Range needed to climb from break release to ICA (ISA + deltaISA)", this->range_start_to_ICA, "m", 0, 500000); + Endnode<double> fuel_start_to_ICA_node("fuel_to_ICA_ISA", "Fuel mass needed to climb from break release to ICA (ISA + deltaISA)", this->fuel_start_to_ICA, "kg", 0, 10000); /* Check if compliance is already set */ // Set up compliance nodes @@ -838,7 +840,7 @@ void standard_mission::requirements_mission_update() { }; std::vector<bool> maintainable_vector { this->initial_cruise_altitude_check, - this->initial_cruise_altitude_check, + (this->initial_cruise_mach + ACCURACY_LOW >= this->initial_cruise_mach_required), // Added ACCURACY_LOW to catch floating point errors when the values are actually equal (this->max_operating_altitude >= this->max_operating_altitude_required && max_operating_altitude_required >= design_mission_top_of_descent_altitude), (max_altitude_one_engine_inoperative_required <= this->max_altitude_one_engine_inoperative), (time_to_climb_requirement >= convertUnit(SECOND, MINUTE, this->time_1500ft_to_ICA) && this->initial_cruise_altitude_check) @@ -860,12 +862,14 @@ void standard_mission::requirements_mission_update() { /* Subpath: altitudes */ subpath = "assessment/performance/altitude"; + this->check_and_add_nodes(subpath, "Assessment of altitude related values"); max_operating_altitude_node.update(rtIO->acxml.at(subpath)); max_ceiling_altitude_node.update(rtIO->acxml.at(subpath)); max_altitude_one_engine_inoperative_node.update(rtIO->acxml.at(subpath)); /* Subpath: climb */ subpath = "assessment/performance/climb"; + this->check_and_add_nodes(subpath, "Assessment of the climb segment"); time_1500ft_to_ICA_node.update(rtIO->acxml.at(subpath)); time_start_to_1500ft_node.update(rtIO->acxml.at(subpath)); time_start_to_ICA_node.update(rtIO->acxml.at(subpath)); @@ -873,4 +877,105 @@ void standard_mission::requirements_mission_update() { fuel_start_to_ICA_node.update(rtIO->acxml.at(subpath)); } +// void standard_mission::requirements_mission_report() { +// std::string flightTime(timeFormater(this->my_mission_ptr->mission_profile.back().end_time)); +// std::string blockTime(timeFormater(this->my_mission_ptr->mission_profile.back().end_time + +// this->my_mission_ptr->mission_file->taxi_time_origin + this->my_mission_ptr->mission_file->taxi_time_destination)); +// report_.htmlReportStream() << html::div_start("class=\"box\"") +// << html::h2("Mission specifications") +// << html::table_begin({"Parameter", "Comment", "Unit", "Value"}) +// << html::table_row("Range", "", "NM", Rounding(convertUnit(METER, NAUTICALMILE, this->my_mission_ptr->mission_file->Range), 2)) +// << html::table_row("Payload (PL)", "Passengers + Cargo", "kg", this->my_mission_ptr->payload_mass.value()) +// << html::table_row("Passengers", "", "-", my_mission_ptr->mission_file->PAX) +// << html::table_row("Cargo mass", "", "kg", my_mission_ptr->mission_file->cargo_mass) +// << html::table_row("Cruise Mach number", "", "-", this->my_mission_ptr->mission_file->desired_cruise_speed) +// << html::table_row("Cruise climb steps", "", "ft", this->my_mission_ptr->step_height_cruise) +// << html::table_row("Climb Mach number", "above crossover altitude", "-", +// this->my_mission_ptr->mission_file->desired_cruise_speed + this->my_mission_ptr->delta_mach_above_crossover) +// << html::table_row("Climb CAS above FL100", "", "KCAS", this->my_mission_ptr->climb_speed_above_FL100) +// << html::table_row("Climb CAS below FL100", "", "KCAS", this->my_mission_ptr->climb_speed_below_FL100) +// << html::table_row("Descent CAS above FL100", "", "KCAS", this->my_mission_ptr->descent_speed_above_FL100) +// << html::table_row("Descent CAS below FL100", "", "KCAS", this->my_mission_ptr->descent_speed_below_FL100) +// << html::table_row("Taxi-out time", "", "min", Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->mission_file->taxi_time_origin), 0)) +// << html::table_row("Taxi-in time", "", "min", Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->mission_file->taxi_time_destination), 0)) +// << html::table_row("Alternate distance", "", "NM", Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->mission_file->taxi_time_destination), 0)) +// << html::table_row("Fuel reserves method", fuelPlanning, "", "") +// << html::table_end +// << html::h2("Mission simulation results") +// << html::table_begin({"Parameter", "Comment", "Unit", "Value"}) +// << html::table_row("Take-off mass", "TOM = OME + PL + MF - TXF<sub>out</sub>", "kg", this->my_mission_ptr->takeoff_mass.value()) +// << html::table_row("Operating mass empty", "OME", "kg", this->my_mission_ptr->OME) +// << html::table_row("Mission (loaded) fuel", "MF = TF + RF + EF + TXF<sub>out</sub>", "kg", +// Rounding(this->my_mission_ptr->get_fuel_sum(this->my_mission_ptr->loaded_fuel_mass), 0)) +// << html::table_row("Trip fuel", "TF", "kg", Rounding(my_mission_ptr->get_fuel_sum(this->my_mission_ptr->trip_fuel_mass), 0)) +// << html::table_row("Reserve fuel", "RF", "kg", Rounding(this->my_mission_ptr->get_fuel_sum(this->my_mission_ptr->loaded_fuel_mass) - +// my_mission_ptr->get_fuel_sum(this->my_mission_ptr->trip_fuel_mass) - +// this->my_mission_ptr->taxi_fuel_mass_origin.second - this->my_mission_ptr->extra_fuel_mass.second, 0)) +// << html::table_row("Extra fuel", "EF", "kg", Rounding(this->my_mission_ptr->extra_fuel_mass.second, 0)) +// << html::table_row("Taxi-out fuel", "TXF<sub>out</sub>", "kg", Rounding(this->my_mission_ptr->taxi_fuel_mass_origin.second, 0)) +// << html::table_row("Taxi-in fuel", "TXF<sub>in</sub>", "kg", Rounding(this->my_mission_ptr->taxi_fuel_mass_destination.second, 0)) +// << html::table_row("Landing mass", "MTOM - TF", "kg", this->my_mission_ptr->mission_profile.back().end_total_mass) +// << html::table_row("Block time", "", "h", blockTime) +// << html::table_row("Flight time", "", "h", flightTime) +// << html::table_end; +// if (requirements_checked) { +// report_.htmlReportStream() << html::h2("Calculated performance values for TLARs") +// << html::table_begin({"Parameter", "Comment", "Unit", "Value"}) +// << html::table_row("Max. operating altitude", "climb with 100ft/min, ISA + " + num2Str(this->my_mission_ptr->delta_ISA) + +// " *", "ft", static_cast<int>(Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->max_operating_altitude), 0))) +// << html::table_row("One-engine out (OEI) net ceiling", "after T/O @ MTOM, 100ft/min, ISA + "+ num2Str(this->my_mission_ptr->delta_ISA) + +// " *", "ft", static_cast<int>(Rounding(convertUnit(METER, FOOT, this->my_mission_ptr->max_altitude_one_engine_inoperative), 0))) +// << html::table_row("Time-to-1500ft", "from break release to 1500 ft **", "min", +// static_cast<int>(Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_1500ft), 0))) +// << html::table_row("Time-to-climb", "from 1500 ft to ICA **", "min", +// static_cast<int>(Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_1500ft_to_ICA), 0))) +// << html::table_row("Time-to-ICA", "from break release to ICA **", "min", +// static_cast<int>(Rounding(convertUnit(SECOND, MINUTE, this->my_mission_ptr->time_start_to_ICA), 0))) +// << html::table_row("Range-to-ICA", "from break release to ICA **", "NM", +// static_cast<int>(Rounding(convertUnit(METER, NAUTICALMILE, this->my_mission_ptr->range_start_to_ICA), 0))) +// << html::table_row("Fuel-to-ICA", "from break release to ICA **", "kg", static_cast<int>(Rounding(this->my_mission_ptr->fuel_start_to_ICA, 1))) +// << html::table_end +// << "<p style=\"text-align: right; margin-right: 3rem;\">* Engine rating: Max. Continuous<br>** Engine rating: Climb</p>" << std::endl; +// /* Cruise steps */ +// if (!this->my_mission_ptr->cruise_profile.empty()) { +// report_.htmlReportStream() << html::h2("Estimated optimum cruise profile") +// << html::table_begin({"Cruise Step", "Flight Level [100 ft]", "Rel. Cruise Step Length [%]"}); +// for (uint16_t i(0); i < this->my_mission_ptr->cruise_profile.size(); i++) { +// report_.htmlReportStream() << html::table_row(i + 1, Rounding(this->my_mission_ptr->cruise_profile.at(i).FL, 1), +// Rounding(this->my_mission_ptr->cruise_profile.at(i).rel_step_length, 2) * 100.); +// } +// report_.htmlReportStream() << html::table_end; +// } +// } +// report_.htmlReportStream() << html::div_end; +// /* Graphics */ +// if (rtIO->plotOn) { +// report_.htmlReportStream() << html::div_start("class=\"box\"") +// << "<hr>" << std::endl +// << html::image("../plots/" + this->base_name_output_files + "_Alt-CL.svg", "alt=\"Broken Path\"") +// << "<hr>" << std::endl +// << html::image("../plots/" + this->base_name_output_files + "_speed.svg", "alt=\"Broken Path\"") +// << "<hr>" << std::endl +// << html::image("../plots/" + this->base_name_output_files + "_offtake.svg", "alt=\"Broken Path\""); +// if (std::string(rtIO->moduleConfig.at("program_settings/mode/mission_methods/center_of_gravity_method/value")) != "mode_0") { +// report_.htmlReportStream() << "<hr>" << std::endl +// << html::image("../plots/" + this->base_name_output_files + "_trim_setting.svg", "alt=\"Broken Path\""); +// } +// if (my_mission_ptr->variable_camber_switch) { +// report_.htmlReportStream() << "<hr>" << std::endl +// << html::image("../plots/" + this->base_name_output_files + "_flap_setting.svg", "alt=\"Broken Path\""); +// } +// if (SAR_plot_on) { +// report_.htmlReportStream() << "<hr>" << std::endl; +// for (uint16_t i(0); i < SAR_mach.size(); i++) { +// if (i != 0) { +// report_.htmlReportStream() << "<br>" << std::endl; +// } +// report_.htmlReportStream() << html::image("../plots/" + this->base_name_output_files + "_SAR_mach_" + num2Str(SAR_mach[i]) + ".svg", "alt=\"Broken Path\""); +// } +// } +// report_.htmlReportStream() << html::div_end; +// } +// } + } // namespace requirements_mission diff --git a/mission_analysis/src/standard_mission/standard_mission/standard_mission.h b/mission_analysis/src/standard_mission/standard_mission/standard_mission.h index 41eaad27584601a94ebba7e6ed550baf6ad26699..cc2f51c4fec06f3d54fbe34b2c9df3b7156cafd0 100644 --- a/mission_analysis/src/standard_mission/standard_mission/standard_mission.h +++ b/mission_analysis/src/standard_mission/standard_mission/standard_mission.h @@ -931,9 +931,10 @@ class standard_mission : public ::standard_mission { this->aero.switchOffReqSwitch(); requirements_mission_update(); } - void report() override {} /* Own methods to replace within/add to standard_mission methods */ + /** \brief Function to only update requirements mission values + */ void requirements_mission_update(); }; } // namespace requirements_mission