diff --git a/cost_estimation/src/readlayertext.py b/cost_estimation/src/readlayertext.py index 9508bf7af623703b6fb1caf7b7ba647c6db5e6dd..e52aab3899206dbedf1985e727dd673c7daabb49 100644 --- a/cost_estimation/src/readlayertext.py +++ b/cost_estimation/src/readlayertext.py @@ -20,9 +20,9 @@ def read_energy_carrier(root_of_aircraft_exchange_tree, runtime_output): # Attempt to extract information on energy carrier from aircraft exchange file. try: - # Find all 'propulsor' nodes in aircraft exchange file. + # Find all 'energy_carrier' nodes in aircraft exchange file. energy_carrier_node_list = root_of_aircraft_exchange_tree.findall('.//energy_carrier') - # Check, if propulsor nodes exist. + # Check, if 'energy_carrier' nodes exist. if not energy_carrier_node_list: # Raise error, if no energy carrier node exists. raise ValueError('No energy carriers nodes found in the aircraft exchange file. Program aborted.') @@ -44,7 +44,7 @@ def read_energy_carrier(root_of_aircraft_exchange_tree, runtime_output): energy_carrier = 'hybrid' # Raise error, if 'energy_carrier_list' is empty. else: - raise ValueError('No energy carrier node found in propulsor nodes. Program aborted.') + raise ValueError('No energy carrier node found. Program aborted.') # Exception handling for ValueError. except ValueError as e: @@ -52,35 +52,3 @@ def read_energy_carrier(root_of_aircraft_exchange_tree, runtime_output): sys.exit(1) return energy_carrier - - -def read_engine_configuration(root_of_aircraft_exchange_tree, runtime_output): - """Read engine configuration. - - Read engine configuration from aircraft exchange file. - - :param ElementTree root_of_aircraft_exchange_tree: Root of aircraft exchange XML - :param logging.Logger runtime_output: Logging object used for capturing log messages in the module - :return str engine_configuration: Information on engine configuration - """ - - engine_configuration = 'xyz' - print(engine_configuration) - - return engine_configuration - - -def read_tank_configuration(root_of_aircraft_exchange_tree, runtime_output): - """Read tank configuration. - - Read tank configuration information from aircraft exchange file. - - :param ElementTree root_of_aircraft_exchange_tree: Root of aircraft exchange XML - :param logging.Logger runtime_output: Logging object used for capturing log messages in the module - :return str tank_configuration: Information on tank configuration - """ - - tank_configuration = 'xyz' - print(tank_configuration) - - return tank_configuration diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_00_determinerouteandclassdependentparameter.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_00_determinerouteandclassdependentparameter.py index a566a665ab2a658d30a31ddba166b76717b8254d..48ef3edf2f15687ece20accb262d7c81b0ca9b8d 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_00_determinerouteandclassdependentparameter.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_00_determinerouteandclassdependentparameter.py @@ -1,19 +1,20 @@ def determine_route_and_class_dependent_parameter(dict_ac_data, dict_operating_costs, runtime_output): """Determine parameter that depend on the route length and seating classes. - An absolute cost statement is not very meaningful. Only the reference to the revenue potential provides a good basis - for comparison. The transport work in the form of annual utilization is a significant factor. The calculation of the - DOC is often not based on the respective design range, but on standard route lengths typical for the operation. + An absolute cost statement is not very meaningful. Only the reference to the revenue potential provides a good + basis for comparison. The transport work in the form of annual utilization is a significant factor. The + calculation of the DOC is often not based on the respective design range, but on standard route lengths typical + for the operation. For Europe, the standard ranges are - regional (0 to 500 km), - short range (500 to 1000 km), - medium range (1000 km to 4000 km), - long range (4000 to 6500 km), and - ultra long range (more than 6500 km). - Both, the number of crew members and their salaries and the number of crews depend on these ranges. Since the annual - flight hours of an aircraft are far greater than the available dispatch time of a crew, a corresponding number of - crews must be provided for each aircraft. It is generally assumed that longer routes entail more crew members and - crews. + Both, the number of crew members and their salaries and the number of crews depend on these ranges. Since the + annual flight hours of an aircraft are far greater than the available dispatch time of a crew, a corresponding + number of crews must be provided for each aircraft. It is generally assumed that longer routes entail more crew + members and crews. Since the experienced (higher paid) flight attendants/pilots generally transfer to long-haul operations after a period of short-haul service, crew costs on long-haul routes are on average higher than on continental/short-haul routes. Cost differences between the operational areas are even more pronounced for flight crews than for cabin @@ -31,7 +32,7 @@ def determine_route_and_class_dependent_parameter(dict_ac_data, dict_operating_c - float salary_cockpit_crew_member: Salary of one cockpit crew member in EUR - float revenue_per_seat_and_flight: Revenue per seat and flight in EUR - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_01_calculatecapitalcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_01_calculatecapitalcosts.py index 59ba6f371f7099f00bab19bd0a0b275fbf21ad76..fcd5c4fdb1edf43fbdfe6781c31bdb3f37a83c2b 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_01_calculatecapitalcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_01_calculatecapitalcosts.py @@ -2,16 +2,16 @@ def calculate_capital_costs(dict_ac_data, dict_operating_costs, runtime_output): """Calculate capital costs. The annuity formula, which is based on a modified mortgage equation, addresses both yearly depreciation and - interest. The reason for the annuity method modification is to include the residual aircraft value at the end of the - depreciation period into the capital costs. That does assume that an operator is buying an aircraft at a constant - price per kg and spends the corresponding capital cost constantly per year all over the depreciation period. - The capital costs are a major element of the route independent cost. They can be assumed as a linear function of the - operating empty weight if the aircraft market influence is considered negligible. + interest. The reason for the annuity method modification is to include the residual aircraft value at the end of + the depreciation period into the capital costs. That does assume that an operator is buying an aircraft at a + constant price per kg and spends the corresponding capital cost constantly per year all over the depreciation + period. The capital costs are a major element of the route independent cost. They can be assumed as a linear + function of the operating empty weight if the aircraft market influence is considered negligible. This function adds the 'capital_costs' dict to the 'dict_operating_costs' that contains the following parameters: - float capital_costs: Capital costs of the aircraft in EUR - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_02_calculatecrewcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_02_calculatecrewcosts.py index f9061678dcded54888240bc2d3f2c01dd957aca3..fb0150516c7d1ac440a2a31b18960631bf56bd34 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_02_calculatecrewcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_02_calculatecrewcosts.py @@ -29,7 +29,7 @@ def calculate_crew_costs(dict_ac_data, dict_operating_costs, runtime_output): # Extract necessary variables from 'dict_ac_data'. depreciation_period = dict_ac_data['depreciation_period'] n_cabin_crew_members = dict_ac_data['n_cabin_crew_members']['n_cabin_crew_members_ID0'] - n_cockpit_crew_members = dict_ac_data['n_cockpit_crew_members'] + n_cockpit_crew_members = dict_ac_data['n_cockpit_crew_members']['n_cabin_crew_members_ID0'] salary_increase = dict_ac_data['rate_inflation'] # Extract necessary variables from 'dict_operating_costs'. cabin_crew_complement = dict_operating_costs['dependent_parameter']['cabin_crew_complement'] diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_03_calculaterouteindependentcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_03_calculaterouteindependentcosts.py index e2566040ed49b36f4692e1ee9d4d4565cd227ae2..a7b53b3e3677817ee351cbd18fba395fedf6feb6 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_03_calculaterouteindependentcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_03_calculaterouteindependentcosts.py @@ -11,7 +11,7 @@ def calculate_route_independent_costs(dict_ac_data, dict_operating_costs, runtim - float route_independent_costs_annual: Route independent costs per year in EUR - float route_independent_costs_depreciation_period: Route independent costs per depreciation period in EUR - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_04_preparepayloadrangediagramdata.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_04_preparepayloadrangediagramdata.py index a46da78b4f420966cf664b367b228b9007a52d0f..3e8fcc25617af8e98b3dc133e6ebdf169c11e58c 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_04_preparepayloadrangediagramdata.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_04_preparepayloadrangediagramdata.py @@ -22,7 +22,7 @@ def prepare_payload_range_diagram_data(dict_ac_data, dict_operating_costs, runti - array payloads_for_prd: Payload mass (running from max. payload mass to zero, range dependent) in kg - array ranges_for_prd: Range (running from 0 to ferry range) in kg - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_05_calculatefuelcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_05_calculatefuelcosts.py index 8c7d0984e9e6b71e824a36f3d2e6e4f16e50472c..27b31fcc26097206d198b3350c20df1760475a82 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_05_calculatefuelcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_05_calculatefuelcosts.py @@ -9,7 +9,7 @@ def calculate_fuel_costs(dict_ac_data, dict_operating_costs, runtime_output): - array fuel_costs: Fuel costs (range dependent) in EUR - float fuel_costs_design_point: Fuel costs at design point of current aircraft in EUR - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_06_calculatehandlingcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_06_calculatehandlingcosts.py index 38b7fb6b2ab49d98c9587be6d2a3999213e570e5..b677ede5bd880c59880d9da928420190f3329540 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_06_calculatehandlingcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_06_calculatehandlingcosts.py @@ -8,7 +8,7 @@ def calculate_handling_costs(dict_ac_data, dict_operating_costs, runtime_output) This function adds the 'handling_costs' dict to the 'dict_operating_costs' that contains the following parameters: - float handling_costs: Handling costs per year in EUR - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_07_calculatelandingcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_07_calculatelandingcosts.py index 2f737779b13061b9c0af8178d98626a79e10f7a2..7cf4edf21330f2b57e396e810771dcf1989d073f 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_07_calculatelandingcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_07_calculatelandingcosts.py @@ -6,7 +6,7 @@ def calculate_landing_costs(dict_ac_data, dict_operating_costs, runtime_output): This function adds the 'landing_costs' dict to the 'dict_operating_costs' that contains the following parameters: - float landing_costs: Landing costs per year in EUR - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_08_calculateairtrafficcontrolcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_08_calculateairtrafficcontrolcosts.py index 203851771f9d8a23c91b60c1aaf1e07b7bc508f1..df8571a395b143a4cb9256eb3180a779fe071147 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_08_calculateairtrafficcontrolcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_08_calculateairtrafficcontrolcosts.py @@ -20,7 +20,7 @@ def calculate_air_traffic_control_costs(dict_ac_data, dict_operating_costs, runt URL: https://www.eurocontrol.int/sites/default/files/2022-11/eurocontrol-customer-guide-to-charges.pdf. (Last access: 26.09.2023). - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_09_calculatemaintenancecosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_09_calculatemaintenancecosts.py index 28564458187086d6f42390123f02b2a7637c70c4..5be0e4def6ceb2f8c9bea54478e22755945b80c7 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_09_calculatemaintenancecosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_09_calculatemaintenancecosts.py @@ -7,7 +7,8 @@ def calculate_maintenance_costs(dict_ac_data, dict_operating_costs, runtime_outp - flight hour dependent costs, which consider primarily wear and the associated line maintenance work, and - calendar time dependent costs, which are a constant share reflecting for example the rectification of corrosion during overhaul, the latter being route independent and thus considered as constant. - Following the JADC-method an approximation for maintenance cost per flight cycle is given by the sum of three parts: + Following the JADC-method an approximation for maintenance cost per flight cycle is given by the sum of three + parts: - 'airframe_material': Airframe material maintenance costs (repair and replacement) - 'airframe_personnel': Airframe personnel maintenance costs (inspection and repair) - 'engine_total': Engine total maintenance costs @@ -16,7 +17,7 @@ def calculate_maintenance_costs(dict_ac_data, dict_operating_costs, runtime_outp parameters: - float maintenance_costs: Maintenance costs per year in EUR - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_10_calculateroutedependentcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_10_calculateroutedependentcosts.py index 06531f0d120cb6c07122b6ac446c72c36766536d..9ccba02b813aa112ac723f91df025c519adda35b 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_10_calculateroutedependentcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_10_calculateroutedependentcosts.py @@ -1,7 +1,8 @@ def calculate_route_dependent_costs(dict_ac_data, dict_operating_costs, runtime_output): """Calculate route dependent costs per year and depreciation period. - Route dependent costs include all cost components that are directly attributable to flight operations. These include + Route dependent costs include all cost components that are directly attributable to flight operations. These + include - fuel, - fees (handling, landing, air traffic control), and - maintenance. @@ -14,10 +15,10 @@ def calculate_route_dependent_costs(dict_ac_data, dict_operating_costs, runtime_ dependent) in EUR - float route_dependent_costs_annual_design_point: Route dependent costs per year at design point for current aircraft in EUR - - float route_dependent_costs_depreciation_period_design_point: Route dependent costs per depreciation period at - design point for current aircraft in EUR + - float route_dependent_costs_depreciation_period_design_point: Route dependent costs per depreciation period + at design point for current aircraft in EUR - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_11_calculatedirectoperatingcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_11_calculatedirectoperatingcosts.py index c92d831b10ac424bee6dbbb6d3ced2b1d6e0256a..ba2fd24389a547295d01a7915ccaedb059c11d9a 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_11_calculatedirectoperatingcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_11_calculatedirectoperatingcosts.py @@ -3,8 +3,8 @@ def calculate_direct_operating_costs(dict_ac_data, dict_operating_costs, runtime // TODO Cost per depreciation period: Check comment below The method implemented below is a simplified method based on "From Aircraft Performance to Aircraft Assessment“ by - J. Thorbeck [1]. The total operating cost are split into direct (DOC) and indirect operating cost (IOC). The DOC are - directly influenced by the parameters and the performance of the aircraft and are commonly used for aircraft + J. Thorbeck [1]. The total operating cost are split into direct (DOC) and indirect operating cost (IOC). The DOC + are directly influenced by the parameters and the performance of the aircraft and are commonly used for aircraft evaluation. Two elements are required for the simplified DOC model: Route independent (fixed) and route dependent (variable) costs. They are determined for one year and the entire depreciation period. @@ -20,7 +20,7 @@ def calculate_direct_operating_costs(dict_ac_data, dict_operating_costs, runtime [1] J. Thorbeck: "From Aircraft Performance to Aircraft Assessment“ (YEAR) - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_12_calculateflightkilometercosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_12_calculateflightkilometercosts.py index 5dff03b6d259d8963c3951ada2ab333d7843a9e2..8bcb5398668ef91725c51b6fa8184f4b308c5547 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_12_calculateflightkilometercosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_12_calculateflightkilometercosts.py @@ -1,14 +1,14 @@ def calculate_flight_kilometer_costs(dict_ac_data, dict_operating_costs, runtime_output): """Calculate flight kilometer costs. - The flight kilometer costs are very flexible and suitable for an extended consideration of changed route structures. - This parameter allows the range potential of the aircraft to be assessed. + The flight kilometer costs are very flexible and suitable for an extended consideration of changed route + structures. This parameter allows the range potential of the aircraft to be assessed. This function adds the 'flight_kilometer_costs' dict to the 'dict_operating_costs' that contains the following parameters: - array flight_kilometer_costs: Flight kilometer costs (range dependent) in EUR/km - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_13_calculateseatkilometercosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_13_calculateseatkilometercosts.py index 46eabb6e461a40d37af2b95c96d88aa0b132c299..516462994c71f76f8981112b61743d4338387a81 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_13_calculateseatkilometercosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_13_calculateseatkilometercosts.py @@ -7,14 +7,14 @@ def calculate_seat_kilometer_costs(dict_ac_data, dict_operating_costs, runtime_o The seat kilometer offered (SKO) is a measure of an aircraft's passenger carrying capacity or, in other words, its potential to generate revenue by providing available seats to passengers. They are calculated by multiplying the - number of seats available by the range. The seat kilometer costs allow the analysis of a change in seat capacity and - thus the assessment of the passenger kilometer potential. + number of seats available by the range. The seat kilometer costs allow the analysis of a change in seat capacity + and thus the assessment of the passenger kilometer potential. This function adds the 'seat_kilometer_costs' dict to the 'dict_operating_costs' that contains the following parameters: - array seat_kilometer_costs: Seat kilometer costs (range dependent) in EUR/SKO - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_15_calculatetonkilometercosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_15_calculatetonkilometercosts.py index 5fce0b06504f42d07ecd375c2c7d8ee5686a0902..974064f83f28889cb03425320c47b61cb236fd1b 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_15_calculatetonkilometercosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_15_calculatetonkilometercosts.py @@ -14,7 +14,7 @@ def calculate_ton_kilometer_costs(dict_ac_data, dict_operating_costs, runtime_ou - array ton_kilometer_costs: Ton kilometer costs (range dependent) in EUR/TKO - array ton_kilometer_offered: Ton kilometer offered (range dependent) in EUR/(kg*km) - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_16_calculaterevenuepassengerkilometercosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_16_calculaterevenuepassengerkilometercosts.py index 26286d4ba7d92141e26b0c1f1c4e1e1ea32a0401..e0777ca008f4f44d7d12da5c45a4c1437a36df97 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_16_calculaterevenuepassengerkilometercosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_16_calculaterevenuepassengerkilometercosts.py @@ -6,8 +6,8 @@ def calculate_revenue_passenger_kilometer_costs(dict_ac_data, dict_operating_cos """Calculate revenue passenger kilometer costs. Revenue passenger kilometers (RPK) are a measure of how many kilometers the aircraft has carried paying passengers. - It is often referred to as "traffic" as it represents the actual demand for air transport. The RPK are determined by - multiplying the range by the number of paying passengers. The number of revenue passengers is calculated by + It is often referred to as "traffic" as it represents the actual demand for air transport. The RPK are determined + by multiplying the range by the number of paying passengers. The number of revenue passengers is calculated by multiplying the maximum number of seats by the load factor. The DOC per revenue passenger kilometer additionally take into account the overall performance of an airline, including its seat load factors. Note that revenue is strongly dependent on market situation and therefore varying. @@ -16,7 +16,7 @@ def calculate_revenue_passenger_kilometer_costs(dict_ac_data, dict_operating_cos following parameters: - array revenue_passenger_kilometer_costs: Revenue passenger kilometer costs (range dependent) in EUR/RPK - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_17_calculateindirectoperatingcosts.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_17_calculateindirectoperatingcosts.py index 62c9373fda8146f4833de285d0f3e8bd7199683f..939ebfd605ab3e9610618328e90aee1a55699e1a 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_17_calculateindirectoperatingcosts.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/call_functions/_17_calculateindirectoperatingcosts.py @@ -7,7 +7,7 @@ def calculate_indirect_operating_costs(dict_ac_data, dict_operating_costs, runti parameters: - float indirect_operating_costs: Indirect operating costs in EUR - :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module configuration file + :param dict dict_ac_data: Dict containing parameters and values from aircraft exchange and module config file :param dict dict_operating_costs: Dict containing parameters from cost estimation calculation :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict dict_operating_costs: Dict containing parameters from cost estimation calculation diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/methodplot.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/methodplot.py index b06bd3da8e00549a82f0fe2d0aa8cd03e05f07be..e35ab6e97c3984094320d6f878bc5e6f13017b07 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/methodplot.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/methodplot.py @@ -19,28 +19,13 @@ def method_plot(paths_and_names, routing_dict, data_dict, method_specific_output :return: None """ runtime_output.print('Plots are generated and saved...') - # Check, if mission study exists. - # study_exists = 'study' in data_dict.keys() # Extract necessary values from 'data_dict'. prd_range_array = data_dict['design']['payload_range_diagram_data']['ranges_for_prd']/1000 prd_payload_array = data_dict['design']['payload_range_diagram_data']['payloads_for_prd'] seat_kilometer_costs_design = data_dict['design']['seat_kilometer_costs']['seat_kilometer_costs'] - # seat_kilometer_costs_corrected_design = 0 ton_kilometers_offered_design = data_dict['design']['ton_kilometer_costs']['ton_kilometer_offered'] ton_kilometer_costs_design = data_dict['design']['ton_kilometer_costs']['ton_kilometer_costs'] - # route_independent_costs_per_year_design = \ - # data_dict['design']['route_independent_costs']['route_independent_costs_annual'] - # route_dependent_costs_design = data_dict['design']['route_dependent_costs']['route_dependent_costs_annual'] - # route_dependent_costs_design_design_point = \ - # data_dict['design']['route_dependent_costs']['route_dependent_costs_annual_design_point'] - - # if study_exists: - # route_independent_costs_per_year_study = \ - # data_dict['study']['route_independent_costs']['route_independent_costs_annual'] - # route_dependent_costs_study = data_dict['study']['route_dependent_costs']['route_dependent_costs_annual'] - # route_dependent_costs_study_design_point = \ - # data_dict['study']['route_dependent_costs']['route_dependent_costs_annual_design_point'] """ Plot two values in the same diagram. """ create_two_axes_plot(seat_kilometer_costs_design, 300, "SKC in €/number of PAX * km * year", @@ -49,12 +34,6 @@ def method_plot(paths_and_names, routing_dict, data_dict, method_specific_output prd_range_array, "SKC and TKO for design mission", "design_mission", paths_and_names) - # create_two_axes_plot(seat_kilometer_costs_design, 300, "SKC in €/number of PAX * km for design mission", - # seat_kilometer_costs_corrected_design, 300, - # "SKC corrected in €/number of PAX * km for mission study", - # prd_range_array, "Seat kilometer costs (SKC) vs. corrected SKC", - # "mission_study", paths_and_names) - create_two_axes_plot(ton_kilometer_costs_design, 3, "DOC per ton kilometers offered in €/payload weight * km", ton_kilometers_offered_design, max(ton_kilometers_offered_design) * 1.1, "Ton kilometers offered in payload weight * km", @@ -66,12 +45,6 @@ def method_plot(paths_and_names, routing_dict, data_dict, method_specific_output prd_range_array, "Payload range diagram and SKC for design mission", "design_mission", paths_and_names) - # Create pie charts showing direct operating costs. - # if study_exists: - # design_mission = [route_independent_costs_per_year_design, route_dependent_costs_design_design_point] - # mission_study = [route_independent_costs_per_year_study, route_dependent_costs_study_design_point] - # create_pie_chart(paths_and_names, design_mission, mission_study, 'Direct operating costs per year') - def create_two_axes_plot(y_value_1, y_limit_1, y_label_1, y_value_2, y_limit_2, y_label_2, range_array, plot_title, mission_flag, paths_and_names): diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/methodxmlexport.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/methodxmlexport.py index a1600cddf13ef2285bee7b2b0a36e98a31fab12e..5789151f4cff56157bad9df3fe246f6c06d06331 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/methodxmlexport.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/general/methodxmlexport.py @@ -31,8 +31,7 @@ def method_xml_export(paths_and_names, routing_dict, data_dict, method_specific_ """ runtime_output.print("Method-specific data are written to '" + routing_dict['module_name'] + "_results.xml'...") - # Function to write data to 'cost_estimation_results.xml' - # xml_export_tree = ET.parse(path_to_results_file) + # Function to write data to 'cost_estimation_results.xml'. root_of_results_file = xml_export_tree.getroot() parent = root_of_results_file.find('calculation_results') # Add method node. @@ -48,8 +47,8 @@ def method_xml_export(paths_and_names, routing_dict, data_dict, method_specific_ specific_output_dict_design = method_specific_output_dict['specific_output_dict_design'] prepare_element_tree_for_module_specific_export(root_of_results_file, specific_output_dict_design) - # If study mission exists, extract study mission data from 'method_specific_output_dict' and prepare ElementTree for - # export to module-specific XML. + # If study mission exists, extract study mission data from 'method_specific_output_dict' and prepare ElementTree + # for export to module-specific XML. study_exists = ('specific_output_dict_study' in method_specific_output_dict.keys()) if study_exists: specific_output_dict_study = method_specific_output_dict['specific_output_dict_study'] diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/kerosene/methodkerosene.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/kerosene/methodkerosene.py index 2cd97fcaaeb58020bf9b6a348aa71e6304461a0c..9d0b2b52723fa9dd16c4531c0b86dccc6c4a0589 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/kerosene/methodkerosene.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/kerosene/methodkerosene.py @@ -1,6 +1,8 @@ """Module providing calculation functions provided by the user.""" # Import standard modules. +import os import sys +import xml.etree.ElementTree as ET # Import own modules. from src.tube_and_wing.empirical.operating_cost_estimation_tu_berlin.general.operatingcostestimationtuberlin \ @@ -33,6 +35,43 @@ def method_kerosene(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_co :param logging.Logger runtime_output: Logging object used for capturing log messages in the module :return dict kerosene_output_dict: Dictionary containing results from calculation for kerosene-powered aircraft """ + """ Add some additional values to dictionaries and merge them.""" + # Check if 'study_mission.xml' exists and try to read study mission data. + path_to_study_mission_xml = paths_and_names['project_directory'] + '/mission_data/study_mission.xml' + study_mission_exists = os.path.exists(path_to_study_mission_xml) + if study_mission_exists: + try: + # Attempt to create an ElementTree and get the root element from the XML file. + study_mission_xml_tree = ET.ElementTree(file=path_to_study_mission_xml) + root_of_study_mission_xml_tree = study_mission_xml_tree.getroot() + # Get values from 'study_mission.xml' file. + m_payload_study_mission = root_of_study_mission_xml_tree.findall('./payload/value') + # Check, if values exist. + # If the value exists, set to aircraft exchange dictionary and start further estimations. + if m_payload_study_mission is not None: + dict_ac_exchange['m_payload_study'] = round(float(m_payload_study_mission[0].text), 4) + # Else condition: The values are not given -> raise an error and abort program. + else: + runtime_output.critical( + 'Error: The required payload value for the study mission is not found in the "study_mission.xml" ' + + 'file. \n' + ' Program aborted!') + sys.exit('Exit information: Missing required parameter in the "study_mission.xml" file!') + + # Exception handling for operating system (OS) error. + except OSError: + runtime_output.critical('Error: The study mission file: "study_mission.xml' + + '" was found but could not be read. \n' + ' Program aborted!') + sys.exit('Exit information: Study mission file could not be read!') + else: + runtime_output.print('Attention! No "study_mission.xml" file found. ' + + 'Direct operating costs only calculated for design mission.') + + # Calculate payload mass for design mission and add to dictionary. + dict_ac_exchange['m_payload_design'] = ( + dict_ac_exchange['n_passengers']*(dict_ac_exchange['m_passenger'] + dict_ac_exchange['m_luggage']) + + dict_ac_exchange['m_cargo']) # Merge both data dictionaries. dict_complete_data = dict_ac_exchange | dict_mod_config @@ -44,16 +83,17 @@ def method_kerosene(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_co # Extract design mission related parameters from 'complete_data_dict' and save in 'design_data' (w/o ending). dict_design_data = {key.replace('_design', ''): value for key, value in dict_complete_data.items() if key.endswith('_design')} + # Merge design and general data dictionary. + dict_design = dict_general_data | dict_design_data # Iterate over dictionary. - for key, value in dict_design_data.items(): + for key, value in dict_design.items(): # Check, if any value is 'None'. if value is None: # If any value is 'None', the calculation of the costs is impossible and the program aborted. - runtime_output.critical('Error: Operating cost estimation not possible due to missing parameters! ' + runtime_output.critical('Error: Operating cost estimation not possible due to missing parameter (' + + key + ')! ' + 'Program aborted.') sys.exit(1) - # Merge design and general data dictionary. - dict_design = dict_general_data | dict_design_data # Calculate costs for design mission. runtime_output.print('----------------------------------------------------------') runtime_output.print('Operating cost estimation results for design mission. ') @@ -61,25 +101,32 @@ def method_kerosene(paths_and_names, routing_dict, dict_ac_exchange, dict_mod_co kerosene_output_dict_design = operating_cost_estimation(paths_and_names, routing_dict, dict_design, runtime_output) """Mission study.""" - # Extract study mission related parameters from 'complete_data_dict' and save in 'study_data' (w/o ending). - dict_study_data = {key.replace('_study', ''): value for key, value in dict_complete_data.items() - if key.endswith('_study')} - # Check, if study mission exists (Assumption: If any value is 'None', costs cannot be calculated for mission study). - mission_study_exists = not any(value is None for value in dict_study_data.values()) - if mission_study_exists: - # Merge dictionaries. - dict_study = dict_general_data | dict_study_data - # Calculate costs for mission study. - runtime_output.print('Operating cost estimation results for study mission. ') - runtime_output.print('----------------------------------------------------------') - kerosene_output_dict_study = operating_cost_estimation(paths_and_names, routing_dict, dict_study, - runtime_output) - # Save both dictionaries in 'kerosene_output_dict'. - kerosene_output_dict = {'design': kerosene_output_dict_design, 'study': kerosene_output_dict_study} - else: - runtime_output.warning('Warning: Operating cost estimation of study mission not possible due to missing data. ' - + 'No operating costs calculated.') - runtime_output.print('----------------------------------------------------------') - kerosene_output_dict = {'design': kerosene_output_dict_design} + if study_mission_exists: + # Extract study mission related parameters from 'complete_data_dict' and save in 'study_data' (w/o ending). + dict_study_data = {key.replace('_study', ''): value for key, value in dict_complete_data.items() + if key.endswith('_study')} + # Check, if study mission data complete. + # Assumption: If any value is 'None', costs cannot be calculated for mission study. + mission_study_values_complete = not any(value is None for value in dict_study_data.values()) + if mission_study_values_complete: + # Merge dictionaries. + dict_study = dict_general_data | dict_study_data + # Calculate costs for mission study. + runtime_output.print('Operating cost estimation results for study mission. ') + runtime_output.print('----------------------------------------------------------') + kerosene_output_dict_study = operating_cost_estimation(paths_and_names, routing_dict, dict_study, + runtime_output) + # Save both dictionaries in 'kerosene_output_dict'. + kerosene_output_dict = {'design': kerosene_output_dict_design, 'study': kerosene_output_dict_study} + else: + for key, value in dict_study_data.items(): + # Check, if any value is 'None'. + if value is None: + # If any value is 'None', the calculation of the costs is impossible and the program aborted. + runtime_output.warning('Warning: Operating cost estimation of study mission not possible due to ' + + 'missing parameter (' + key + ')! ' + + 'Program aborted.') + runtime_output.print('----------------------------------------------------------') + kerosene_output_dict = {'design': kerosene_output_dict_design} return kerosene_output_dict diff --git a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/usermethoddatapreparation.py b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/usermethoddatapreparation.py index 54b11405af440c824fbf6c40c4be23daf783a9a9..f56837dcefabf689d72c2ddbb84ad2c1d1c574f8 100644 --- a/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/usermethoddatapreparation.py +++ b/cost_estimation/src/tube_and_wing/empirical/operating_cost_estimation_tu_berlin/usermethoddatapreparation.py @@ -32,28 +32,24 @@ def user_method_data_input_preparation(routing_dict): data_to_extract_from_aircraft_exchange_dict = { 'altitude_cruise_design': [requirements_path + 'design_mission/initial_cruise_altitude', float], # new 'altitude_cruise_study': [requirements_path + 'study_mission/initial_cruise_altitude', float], # new - 'm_cargo_design': [mission_path + 'design_mission/cargo_mass', float], - 'm_cargo_study': [mission_path + 'study_mission/cargo_mass', float], + 'm_cargo': [transport_task_path + 'cargo_definition/additional_cargo_mass', float], 'm_luggage': [transport_task_path + 'passenger_definition/luggage_mass_per_passenger', float], 'm_operating_empty': [masses_and_cg_path + 'operating_mass_empty/mass_properties/mass', float], 'm_passenger': [transport_task_path + 'passenger_definition/mass_per_passenger', float], - 'm_payload_design': [mission_path + 'design_mission/payload_mass', float], 'm_payload_max': [masses_and_cg_path + 'maximum_payload_mass/mass_properties/mass', float], - 'm_payload_study': [mission_path + 'study_mission/payload_mass', float], 'm_payload_at_max_fuel': [assessment_path + 'performance/range/payload_maximum_fuel_at_maximum_takeoff_mass', float], 'm_takeoff_max': [masses_and_cg_path + 'maximum_takeoff_mass/mass_properties/mass', float], - 'm_takeoff_design': [mission_path + 'design_mission/takeoff_mass', float], - 'm_takeoff_study': [mission_path + 'study_mission/takeoff_mass', float], + 'm_takeoff_design': [masses_and_cg_path + 'design_mass/mass_properties/mass', float], + 'm_takeoff_study': [masses_and_cg_path + 'study_mass/mass_properties/mass', float], 'mach_cruise_design': [requirements_path + 'design_mission/initial_cruise_mach_number', float], # new 'mach_cruise_study': [requirements_path + 'study_mission/initial_cruise_mach_number', float], # new 'n_cabin_crew_members': [fuselage_path + 'specific/geometry/fuselage[@ID="0"]/number_of_required_cabin_crew', float], - 'n_cockpit_crew_members_design': [mission_path + 'design_mission/number_of_flight_crew', float], - 'n_cockpit_crew_members_study': [mission_path + 'study_mission/number_of_flight_crew', float], + 'n_cockpit_crew_members': [fuselage_path + + 'specific/geometry/fuselage[@ID="0"]/number_of_required_cockpit_crew', float], 'passenger_class_distribution': [transport_task_path + 'passenger_class_definition/class_distribution', str], # new - 'n_passengers_design': [mission_path + 'design_mission/number_of_pax', float], # new - 'n_passengers_study': [mission_path + 'study_mission/number_of_pax', float], # new + 'n_passengers': [transport_task_path + 'passenger_definition/total_number_passengers', float], 'range_at_max_fuel': [assessment_path + 'performance/range/range_max_fuel_at_maximum_take_off_mass', float], 'range_at_max_payload': [assessment_path + 'performance/range/range_max_payload_at_maximum_take_off_mass', float], @@ -171,7 +167,6 @@ def user_method_data_output_preparation(data_dict): """Key parameters output.""" doc_path = './assessment/cost_estimation/operating_cost/direct_operating_cost/' - # ioc_path = './assessment/cost_estimation/operating_cost/indirect_operating_cost/' key_output_dict = { 'flights_per_year_design_mission': @@ -312,7 +307,7 @@ def user_method_data_output_preparation(data_dict): 'parameters': { 'value': data_dict['design']['indirect_operating_costs']['indirect_operating_costs'], 'unit': 'EUR'}}, - # List + # List. 'list_of_paths': paths_to_specific_design_outputs_list }