Skip to content
Snippets Groups Projects

only 1 mission per run

Merged gPauls-TUHH requested to merge fix/mission_XML_overwrite into develop
1 unresolved thread
6 files
+ 423
484
Compare changes
  • Side-by-side
  • Inline
Files
6
@@ -18,9 +18,49 @@
*/
standard_mission::standard_mission(const std::shared_ptr<RuntimeIO>& rtIO) :
rtIO(rtIO),
design_mission(nullptr),
study_mission(nullptr),
requirements_mission(nullptr),
mission_type(),
mission_xml_name(),
auto_select_initial_cruise_altitude(),
auto_select_flight_level(),
round_to_regular_flight_level(),
no_steps(),
/* Mission values */
range("range", "Mission range", 0, "m", 0, 100000000),
payload("payload", "Payload mass", 0, "kg", 0, 100000),
pax_number("number_of_pax", "Number of passenger (Mass per PAX = " + num2Str(
EndnodeReadOnly<double>("requirements_and_specifications/design_specification/transport_task/passenger_definition/mass_per_passenger").read(rtIO->acxml).value() +
EndnodeReadOnly<double>("requirements_and_specifications/design_specification/transport_task/passenger_definition/luggage_mass_per_passenger").read(rtIO->acxml).value()) +
" kg)", 0, "1", 0, 1000),
cargo_mass("cargo_mass", "Cargo mass", 0, "kg", 0, 100000),
initial_cruise_mach("desired_cruise_speed", "Planned cruise Mach number for fuel calculation", 0, "1", 0, 1),
alternate_distance("alternate_distance", "Distance from destination to alternate aerodrome", 0, "m", 0, 10000000),
taxi_time_origin("taxi_time_origin", "Taxi time at departure airport", 0, "s", 0, 10000),
taxi_time_destination("taxi_time_destination", "Taxi time at destination", 0, "s", 0, 10000),
taxiing_procedure("taxiing_procedure", "Taxiing procedure for start and landing."),
engine_warmup_time("engine_warmup_time", "Running time of the engines before take-off", 0, "s", 0, 10000),
terminal_operation_time("terminal_operation_time", "Time at the terminal for stopovers", 0, "s", 0, 10000),
origin_airport("origin_airport", "ICAO code of origin"),
destination_airport("destination_airport", "ICAO code of destination"),
auto_climb_altitude_steps(),
auto_rate_of_climb_steps(),
cruise_step_number(),
CAS_ATC_limit_climb(),
CAS_ATC_limit_descent(),
CAS_over_flight_level_100_climb(),
CAS_over_flight_level_100_descent(),
mach_climb(),
initial_cruise_altitude(),
delta_temperature_ISA(),
delta_mach_climb_to_mach_cruise(),
maximum_rate_of_climb(),
approach_speed(),
cruise_step_segments(),
departure_steps(),
cruise_steps(),
approach_steps(),
takeoff_procedure(),
approach_procedure(),
climb_thrust_setting(),
use_delta_max_operating_mach(EndnodeReadOnly<bool>("program_settings/maximum_operating_mach_number/delta").read(rtIO->moduleConfig).value()),
adapt_climb_speed(EndnodeReadOnly<bool>("program_settings/adapt_climb_speed_schedule/enable").read(rtIO->moduleConfig).value()),
use_design_mission_mach(EndnodeReadOnly<bool>("program_settings/study_mission/copy_mach_number").read(rtIO->moduleConfig).value()),
@@ -31,81 +71,13 @@ standard_mission::standard_mission(const std::shared_ptr<RuntimeIO>& rtIO) :
void standard_mission::initialize() {
myRuntimeInfo->info << "Initialize Mission Parameters ..." << std::endl;
std::string subpath("requirements_and_specifications/design_specification/transport_task/passenger_definition/");
double single_PAX_mass = EndnodeReadOnly<double>(subpath + "mass_per_passenger").read(rtIO->acxml).value();
single_PAX_mass += EndnodeReadOnly<double>(subpath + "luggage_mass_per_passenger").read(rtIO->acxml).value();
design_mission = new mission_parameters("design_mission", single_PAX_mass);
this->initialize_mission(design_mission);
this->write_shell_output(design_mission);
study_mission = new mission_parameters("study_mission", single_PAX_mass);
this->initialize_mission(study_mission);
this->write_shell_output(study_mission);
/* Copy design mission for requirements mission and alter paths, name and cruise segment */
requirements_mission = new mission_parameters("design_mission", single_PAX_mass);
this->initialize_mission(requirements_mission);
requirements_mission->mission_type = "requirements_mission";
requirements_mission->mission_xml_name =
EndnodeReadOnly<std::string>("requirements_and_specifications/mission_files/requirements_mission_file").read(rtIO->acxml).value();
requirements_mission->write_mission_file =
EndnodeReadOnly<bool>("program_settings/write_requirement_mission").read(rtIO->moduleConfig).value();
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 = // Set flight level for requirement mission
convertUnit(HECTO, FOOT, NOPREFIX, METER, requirements_mission->initial_cruise_altitude);
}
void standard_mission::run() {
if (design_mission->write_mission_file == true) {
set_mission_profiles(design_mission);
}
if (study_mission->write_mission_file == true) {
set_mission_profiles(study_mission);
}
if (requirements_mission->write_mission_file == true) {
set_mission_profiles(requirements_mission);
}
}
void standard_mission::update() {
this->setup_mission_file(design_mission);
this->fill_mission_file(design_mission);
this->setup_mission_file(study_mission);
this->fill_mission_file(study_mission);
this->setup_mission_file(requirements_mission);
this->fill_mission_file(requirements_mission);
// std::string subPath("AcftExchangeFile/Performance/RequirementsChecks/TLARs/"); // TODO(Gerrit): Check if still needed!
// /* Mission type: requirement mission */
// if (myRequirementMissionSettingsPt->getWriteMissionFile() &&
// (!this->myMissionXMLPt->acXML.at(subPath + "h_initialCruise_Design").getIntAttrib("Checked") ||
// !this->myMissionXMLPt->acXML.at(subPath + "h_maxOperating").getIntAttrib("Checked") ||
// !this->myMissionXMLPt->acXML.at(subPath + "h_maxOEI").getIntAttrib("Checked") ||
// !this->myMissionXMLPt->acXML.at(subPath + "M_initialCruise_Design").getIntAttrib("Checked") ||
// !this->myMissionXMLPt->acXML.at(subPath + "TTC_Design").getIntAttrib("Checked"))) {
// this->myMissionXMLPt->acXML.at("AcftExchangeFile/Performance/RequirementsChecks/MissionFile").setAttrib("OfftakesWritten", 0);
// this->generateMissionXMLFile(myRequirementMissionProfilePt, myRequirementMissionSettingsPt, myRequirementMissionPt);
// }
}
void standard_mission::report() {
}
void standard_mission::save() {
}
void standard_mission::initialize_mission(standard_mission::mission_parameters* mission) {
this->set_module_settings(mission);
this->set_range_and_payload(mission);
this->set_cruise(mission);
this->set_climb_and_descent(mission);
this->set_start_and_landing(mission);
this->set_performance_limits(mission);
// TODO(GERRIT): Soll das nochmal rein?
this->set_module_settings();
this->set_range_and_payload();
this->set_cruise();
this->set_climb_and_descent();
this->set_start_and_landing();
this->set_performance_limits();
// TODO(GERRIT): Still needed?
/* Adjust maximum operating Mach number by delta to Mach_Cruise if necessary (for parameter studies with Mach variation) */
// if (mySettingsPt->getUseDeltaMaxOperatingMachNumber()) {
// double maxOperatingMachNumber(designMission->getMachInitialCruise() + mySettingsPt->getDeltaMaxOperatingMachNumber());
@@ -113,43 +85,41 @@ void standard_mission::initialize_mission(standard_mission::mission_parameters*
// }
}
/* Write the shell output */
void standard_mission::write_shell_output(standard_mission::mission_parameters* mission) {
void standard_mission::run() {
/* Shell output */
myRuntimeInfo->out << "***************** Gathered input *****************" << std::endl;
myRuntimeInfo->out << "* Mission type: " + mission->mission_type << std::endl;
myRuntimeInfo->out << "* Mission type: " + this->mission_type << std::endl;
/* Range */
myRuntimeInfo->out << "* Range = " << convertUnit(METER, NAUTICALMILE, mission->range.value()) << " NM" << std::endl;
myRuntimeInfo->out << "* Range = " << convertUnit(METER, NAUTICALMILE, this->range.value()) << " NM" << std::endl;
/* Payload */
myRuntimeInfo->out << "* Payload = " << mission->payload.value() << " kg" << std::endl;
myRuntimeInfo->out << "* Payload = " << this->payload.value() << " kg" << std::endl;
/* Initial cruise parameters */
myRuntimeInfo->out << "* Cruise Mach number = " << mission->initial_cruise_mach.value() << std::endl; // Mach number
myRuntimeInfo->out << "* Initial cruise altitude = " << mission->initial_cruise_altitude << " FL" << std::endl; // Altitude
myRuntimeInfo->out << "* Cruise Mach number = " << this->initial_cruise_mach.value() << std::endl; // Mach number
myRuntimeInfo->out << "* Initial cruise altitude = " << this->initial_cruise_altitude << " FL" << std::endl; // Altitude
/* Speed schedule */
myRuntimeInfo->out << "* Climb speed under FL100 = " << mission->CAS_ATC_limit_climb << " m/s" << std::endl;
myRuntimeInfo->out << "* Climb speed above FL100 = " << mission->CAS_over_flight_level_100_climb << " m/s" << std::endl;
myRuntimeInfo->out << "* Climb Mach number = " << mission->mach_climb << std::endl;
myRuntimeInfo->out << "* Climb speed under FL100 = " << this->CAS_ATC_limit_climb << " m/s" << std::endl;
myRuntimeInfo->out << "* Climb speed above FL100 = " << this->CAS_over_flight_level_100_climb << " m/s" << std::endl;
myRuntimeInfo->out << "* Climb Mach number = " << this->mach_climb << std::endl;
myRuntimeInfo->out << "**************************************************" << std::endl;
myRuntimeInfo->out << std::endl;
}
void standard_mission::set_mission_profiles(standard_mission::mission_parameters* mission) {
this->set_departure_profile(mission);
this->set_cruise_profile(mission);
this->set_approach_profile(mission);
/* Set mission profiles */
this->set_departure_profile();
this->set_cruise_profile();
this->set_approach_profile();
}
void standard_mission::setup_mission_file(standard_mission::mission_parameters* mission) {
myRuntimeInfo->out << "Create " << mission->mission_xml_name << "..." << std::endl;
void standard_mission::update() {
myRuntimeInfo->out << "Create " << this->mission_xml_name << "..." << std::endl;
/* Open file */
std::ofstream outstream;
outstream.open(rtIO->getMissionDataDir() + "/" + mission->mission_xml_name.c_str());
outstream.open(rtIO->getMissionDataDir() + "/" + this->mission_xml_name.c_str());
/* Check if the file can be opened */
if (!outstream) { // File can not be opened -> create directory
rtIO->createMissionDataDir();
outstream.open(rtIO->getMissionDataDir() + "/" + mission->mission_xml_name.c_str());
outstream.open(rtIO->getMissionDataDir() + "/" + this->mission_xml_name.c_str());
}
if (!outstream) { // File can still not be opened, error message
myRuntimeInfo->err << "Could not open " << rtIO->getMissionDataDir() + "/" + mission->mission_xml_name << ". Abort progrm." << std::endl;
myRuntimeInfo->err << "Could not open " << rtIO->getMissionDataDir() + "/" + this->mission_xml_name << ". Abort progrm." << std::endl;
exit(1);
} else { // File can be opened, the generate mission XML output is created
/* Version and encoding */
@@ -158,24 +128,22 @@ void standard_mission::setup_mission_file(standard_mission::mission_parameters*
outstream << "</mission>" << std::endl;
outstream.close();
}
}
void standard_mission::fill_mission_file(standard_mission::mission_parameters* mission) {
node& file(aixml::openDocument(rtIO->getMissionDataDir() + "/" + mission->mission_xml_name));
mission->range.update(file.at("mission"));
mission->payload.update(file.at("mission"));
mission->pax_number.update(file.at("mission"));
mission->cargo_mass.update(file.at("mission"));
mission->initial_cruise_mach.update(file.at("mission"));
mission->alternate_distance.update(file.at("mission"));
mission->taxi_time_origin.update(file.at("mission"));
mission->taxi_time_destination.update(file.at("mission"));
mission->engine_warmup_time.update(file.at("mission"));
mission->terminal_operation_time.update(file.at("mission"));
mission->taxiing_procedure.update(file.at("mission"));
if (!mission->origin_airport.value().empty() && !mission->origin_airport.value().empty()) {
mission->origin_airport.update(file.at("mission"));
mission->destination_airport.update(file.at("mission"));
node& file(aixml::openDocument(rtIO->getMissionDataDir() + "/" + this->mission_xml_name));
this->range.update(file.at("mission"));
this->payload.update(file.at("mission"));
this->pax_number.update(file.at("mission"));
this->cargo_mass.update(file.at("mission"));
this->initial_cruise_mach.update(file.at("mission"));
this->alternate_distance.update(file.at("mission"));
this->taxi_time_origin.update(file.at("mission"));
this->taxi_time_destination.update(file.at("mission"));
this->engine_warmup_time.update(file.at("mission"));
this->terminal_operation_time.update(file.at("mission"));
this->taxiing_procedure.update(file.at("mission"));
if (!this->origin_airport.value().empty() && !this->origin_airport.value().empty()) {
this->origin_airport.update(file.at("mission"));
this->destination_airport.update(file.at("mission"));
}
/* Setup departure blocks */
@@ -189,10 +157,10 @@ void standard_mission::fill_mission_file(standard_mission::mission_parameters* m
file.at(subpath).addAttrib("description", description);
subpath += "/departure_step@";
for (uint16_t i(0); i < mission->departure_steps.size(); i++) {
for (uint16_t i(0); i < this->departure_steps.size(); i++) {
file[(subpath + num2Str(i))];
file.at(subpath + num2Str(i)).addAttrib("description", "Single departure step");
mission->departure_steps.at(i).write_departure_steps(subpath + num2Str(i), &file);
this->departure_steps.at(i).write_departure_steps(subpath + num2Str(i), &file);
}
/* Setup cruise blocks */
@@ -208,10 +176,10 @@ void standard_mission::fill_mission_file(standard_mission::mission_parameters* m
file.at(subpath).addAttrib("description", description);
subpath += "/cruise_step@";
for (uint16_t i(0); i < mission->cruise_steps.size(); i++) {
for (uint16_t i(0); i < this->cruise_steps.size(); i++) {
file[(subpath + num2Str(i))];
file.at(subpath + num2Str(i)).addAttrib("description", "Single cruise step");
mission->cruise_steps.at(i).write_cruise_steps(subpath + num2Str(i), &file);
this->cruise_steps.at(i).write_cruise_steps(subpath + num2Str(i), &file);
}
/* Setup approach blocks */
@@ -224,12 +192,29 @@ void standard_mission::fill_mission_file(standard_mission::mission_parameters* m
file.at(subpath).addAttrib("description", description);
subpath += "/approach_step@";
for (uint16_t i(0); i < mission->approach_steps.size(); i++) {
for (uint16_t i(0); i < this->approach_steps.size(); i++) {
file[(subpath + num2Str(i))];
file.at(subpath + num2Str(i)).addAttrib("description", "Single approach step");
mission->approach_steps.at(i).write_approach_steps(subpath + num2Str(i), &file);
this->approach_steps.at(i).write_approach_steps(subpath + num2Str(i), &file);
}
aixml::saveDocument(file);
aixml::closeDocument(file);
// std::string subPath("AcftExchangeFile/Performance/RequirementsChecks/TLARs/"); // TODO(Gerrit): Check if still needed!
// /* Mission type: requirement mission */
// if (myRequirementMissionSettingsPt->getWriteMissionFile() &&
// (!this->myMissionXMLPt->acXML.at(subPath + "h_initialCruise_Design").getIntAttrib("Checked") ||
// !this->myMissionXMLPt->acXML.at(subPath + "h_maxOperating").getIntAttrib("Checked") ||
// !this->myMissionXMLPt->acXML.at(subPath + "h_maxOEI").getIntAttrib("Checked") ||
// !this->myMissionXMLPt->acXML.at(subPath + "M_initialCruise_Design").getIntAttrib("Checked") ||
// !this->myMissionXMLPt->acXML.at(subPath + "TTC_Design").getIntAttrib("Checked"))) {
// this->myMissionXMLPt->acXML.at("AcftExchangeFile/Performance/RequirementsChecks/MissionFile").setAttrib("OfftakesWritten", 0);
// this->generateMissionXMLFile(myRequirementMissionProfilePt, myRequirementMissionSettingsPt, myRequirementMissionPt);
// }
}
void standard_mission::report() {
}
void standard_mission::save() {
}
Loading