Skip to content
Snippets Groups Projects
Commit 41d15729 authored by Kristina Mazur's avatar Kristina Mazur
Browse files

Merge branch 'documentation/webpage-content' into 'develop'

Integrate mkdoxy in CI pipeline

See merge request !17
parents 7431af43 b6e67594
No related branches found
No related tags found
3 merge requests!76Draft: Updated Python code example,!73Initial open source version,!17Integrate mkdoxy in CI pipeline
Pipeline #1601398 failed
Showing
with 2047 additions and 58 deletions
# Ignore generated Doxygen docs in modules folder
docs/documentation/**/
# Ignore the local docs of the AcXML
docs/aircraft-xml/
......@@ -15,71 +15,72 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# === Configure pipeline ===
# This section defines the stages of the pipeline: build and deploy
stages:
- build
- deploy
- build # The 'build' stage is where documents are copied to the PROJECT_DIR
- deploy # The 'deploy' stage generates and deploys the generated documentation.
# === Build the doxygen documentation ===
doxygen:
# === Clone the repositories / copy documentation to the PROJECT_DIR ===
clone:
image: alpine:latest
stage: build
stage: build # This job is part of the build stage
tags:
- documentation
- documentation # Label for the job to be picked up by appropriate runners
before_script:
# Install necessary packages, including git, doxygen, and other dependencies
- apk update && apk --no-cache add git doxygen graphviz ttf-freefont texmf-dist texmf-dist-latexextra texlive texlive-dvi
script:
# clone repos
- git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@git.rwth-aachen.de/unicado/aircraft-design
- cd aircraft-design
- git clone --recurse-submodules https://gitlab-ci-token:${CI_JOB_TOKEN}@git.rwth-aachen.de/unicado/libraries libs/
# create aircraft design documentation
- cd propulsion_design/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../wing_design/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../empennage_design/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../ecological_assessment/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../cost_estimation/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../fuselage_design/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../initial_sizing/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../landing_gear_design/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../systems_design/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../tank_design/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../weight_and_balance_analysis/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
# create libraries documentation
- cd ../../libs/aircraftGeometry2/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd ../../engine/doc/ && ( cat Doxyfile ; echo "OUTPUT_DIRECTORY = $CI_PROJECT_DIR/docs/documentation/" ) | doxygen -
- cd $CI_PROJECT_DIR
# clone repos
- git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@git.rwth-aachen.de/unicado/aircraft-design
- cd aircraft-design
- git clone --recurse-submodules https://gitlab-ci-token:${CI_JOB_TOKEN}@git.rwth-aachen.de/unicado/libraries libs/
# Change to the project directory (useful for multi-directory repositories)
- cd $CI_PROJECT_DIR
- ls -la $CI_PROJECT_DIR
artifacts:
# Save the generated documentation as artifacts so they can be accessed later in the pipeline
paths:
- $CI_PROJECT_DIR/aircraft-design
- $CI_PROJECT_DIR/libraries
- $CI_PROJECT_DIR/docs/documentation
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: on_success
- if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: manual
- if: '$CI_PIPELINE_SOURCE == "trigger"'
when: on_success
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # Run when the commit is on the default branch
when: on_success # Only run if the previous jobs are successful
- if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH' # Allow manual triggers on non-default branches
when: manual # Run only when triggered manually
- if: '$CI_PIPELINE_SOURCE == "trigger"' # Triggered by another pipeline
when: on_success # Run if the source pipeline was successful
# === Build and deploy the website ===
pages:
image: python:latest
stage: deploy
stage: deploy # This job is part of the deploy stage
tags:
- documentation
- documentation # Label for the job to be picked up by appropriate runners
before_script:
# Install pipenv to manage Python dependencies
- apk update && apk --no-cache add graphviz
- pip install pipenv
- pipenv install
- pipenv install # Install the dependencies from the Pipfile
- pipenv run pip install mkdoxy # Install the mkdoxy plugin if needed
- apt-get update
- apt-get install -y doxygen
- export DOXYGEN_BIN=/usr/bin/doxygen
- pipenv install --dev # Install all necessary dependencies
script:
- pipenv run mkdocs build --site-dir $CI_PROJECT_DIR/public
# Build the MkDocs documentation site
- cp -r $CI_PROJECT_DIR/aircraft-design $CI_PROJECT_DIR/docs/documentation # Copy aircraft-design to the docs/documentation folder
- pipenv run mkdocs build --verbose --site-dir $CI_PROJECT_DIR/public
needs:
- doxygen
- clone # This job depends on the successful completion of the clone job
artifacts:
# Save the generated static website files as artifacts
paths:
- $CI_PROJECT_DIR/public
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
when: on_success
- if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
when: manual
- if: '$CI_PIPELINE_SOURCE == "trigger"'
when: on_success
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # Run when the commit is on the default branch
when: on_success # Only run if the previous jobs are successful
- if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH' # Allow manual triggers on non-default branches
when: manual # Run only when triggered manually
- if: '$CI_PIPELINE_SOURCE == "trigger"' # Triggered by another pipeline
when: on_success # Run if the source pipeline was successful
\ No newline at end of file
......@@ -9,6 +9,7 @@ mkdocs-material = "*"
mkdocs-glightbox = "*"
[dev-packages]
mkdocs = "*"
[requires]
python_version = "3.11"
......@@ -7,7 +7,7 @@ We are using `mkdocs` as the static site generator to generate the website from
You can preview the website after cloning it. First you need to install `mkdocs` and the used theme by:
```sh
pip install mkdocs mkdocs-material mkdocs-glightbox
pip install mkdocs mkdocs-material mkdocs-glightbox mkdoxy
```
Then you can change the directory to the repository and run
......
......@@ -2,4 +2,4 @@
You want to get in touch with us to clarify your questions or share your feedback about UNICADO? Awesome! Feel free to write us a mail, and we'll respond to your inquiry as soon as possible.
:email: **E-Mail:** [contact@unicado.io](mailto:contact@unicado.io)
:email: **E-Mail:** [contacts@unicado.io](mailto:contacts@unicado.io)
......@@ -22,7 +22,7 @@ lift mach numbers.
|Module Version|Language|License|Documentation|
|:---:|:---:|:---:|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link](aerodynamic_analysis/index.html)|
|2.1.0|:simple-cplusplus: |GPLv3|-|
---
......@@ -39,7 +39,7 @@ For the user, possible changes in the module run configuration can be made in th
|Module Version|Language|License|Documentation|
|:---:|:---:|:---:|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link](mission_analysis/index.html)|
|2.1.0|:simple-cplusplus: |GPLv3|-|
---
......@@ -50,7 +50,7 @@ The `weight_and_balance_analysis` module calculates sub-masses and total masses
|Module Version|Language|License|Documentation|
|:---:|:---:|:---:|---|
|2.1.0|:simple-python: |GPLv3|[Link](weight_and_balance_analysis/index.html)|
|2.1.0|:simple-python: |GPLv3|[Link](analysis/weight_and_balance_analysis/index.md)|
---
......@@ -61,7 +61,7 @@ The `constraint_analysis` module updates the performance criteria wing loading a
|Module Version|Language|License|Documentation|
|:---:|:---:|:---:|---|
|1.0.0|:simple-cplusplus: |GPLv3|[Link](constraint_analysis/index.html)|
|1.0.0|:simple-cplusplus: |GPLv3|-|
---
......@@ -78,7 +78,7 @@ The parameters comprised in this XML file can have different attributes as e.g.
|Module Version|Language|License|Documentation|
|:---:|:---:|:---:|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link](ecological_assessment/index.html)|
|2.1.0|:simple-cplusplus: |GPLv3|[Link](analysis/ecological_assessment/index.md)|
---
......@@ -89,7 +89,7 @@ The module `calculatePerformance` is used to evaluate the mission performance of
|Module Version|Language|License|Documentation|
|:---:|:---:|:---:|---|
|2.1.0|:simple-cplusplus:| GPLv3 |[Link](performance_assessment/index.html)|
|2.1.0|:simple-cplusplus:| GPLv3 |-|
---
......@@ -105,6 +105,6 @@ Direct costs include all expenses incurred in operating and financing the aircra
|Module Version|Language|License|Documentation|
|:---:|:---:|:---:|---|
|2.1.0|:simple-python: |GPLv3|[Link](cost_estimation/index.html)|
|2.1.0|:simple-python: |GPLv3|[Link](analysis/cost_estimation/index.md)|
---
# Getting started
This section will guide you through the necessary steps to get the _cost\_estimation_ module up and running. It contains information on tool requirements and design parameters.
- [Aircraft exchange file](#aircraft-exchange-file) - Get information on necessary parameters from the _acXML_.
- [Module configuration file](#module-configuration-file) - Dive into cost estimation specific parameters.
- [Additional requirements](#additional-requirements) - Is anything else necessary to get the module running?
- [Next steps](#next-steps) - How to proceed?
!!! note
It is assumed that you have the `UNICADO package` installed including the executables and UNICADO libraries.
Generally, we use two files to set or configure modules in UNICADO:
- The aircraft exchange file (or _acXML_) includes
- data related inputs (e.g., aircraft configuration, transport task) and
- data related outputs (e.g., annual direct operating costs).
- The module configuration file `cost_estimation_conf.xml` (also _configXML_) includes
- control settings (e.g., enable/disable generating plots) and
- program settings (e.g., fees, usage information).
In the following sections you will find more information on how to configure these files to suit your needs.
## Aircraft exchange file requirements {#aircraft-exchange-file}
Since the _cost\_estimation_ module is an assessment tool, it is assumed that a converged aircraft design and therefore all the necessary data are already available.
The following information is needed from the _acXML_:
1. Design specification
- Configuration information: Configuration type
- Transport task: Passenger definition, passenger class definition, and cargo definition
- Energy carrier(s)
2. Top level aircraft requirements (for design and study mission - if desired)
- Initial cruise mach number
- Initial cruise altitude
- Payload fractions (seat load factor, only required for study mission assessment)
3. Component design
- Fuselage: Number of required cabin crew, number of required flight crew
- Propulsion: Sea level static thrust per engine
4. Analysis
- Masses: Maximum takeoff mass (certified), takeoff mass (for design and study - if desired), operating mass empty, maximum payload mass
- Mission (for design and study mission - if desired)
- Stage length
- Flight time
5. Assessment (aka. payload range data)
- Range at maximum payload and fuel mass till maximum take off mass limit
- Range at full tanks and payload till maximum take off mass limit
- Range for no payload and full tanks (ferry range)
- Payload at full tanks and payload till maximum take off mass limit
## Module configuration file {#module-configuration-file}
The _configXML_ is structured into two blocks: the control and program settings.
The control settings are standardized in UNICADO and will not be described in detail here. But to get started, you have to change at least
- the `aircraft_exchange_file_name` and `aircraft_exchange_file_directory` to your respective settings,
- the `console_output` at least to `mode_1`, and
- the `plot_output` to false (or define `inkscape_path` and `gnuplot_path`).
!!! note
If the tool is executed via the workflow, those settings are set by the workflow settings.
The program settings are structured like this (descriptions can be found in the `cost_estimation_conf.xml`):
```plaintext
Program Settings
|- Configuration (ID="tube_and_wing")
| |- Fidelity name
| |- Method name
| |- Fidelity (ID="empirical")
| | |- Operating cost estimation tu berlin
| | | |- General direct operating costs parameter
| | | | | - Capital
| | | | | | - Depreciation period
| | | | | | - Price per operating empty mass
| | | | | | - Rate insurance
| | | | | | - Rate interest
| | | | | | - Residual value factor
| | | | | - Crew
| | | | | | - Salary variation
| | | | | - Flight cycles
| | | | | | - Block time per flight
| | | | | | - Daily night curfew time
| | | | | | - Potential annual operation time
| | | | | | - Annual lay days overhaul
| | | | | | - Annual lay days reserve
| | | | | | - Annual lay days maintenance
| | | | | - Handling
| | | | | | - Fees handling
| | | | | - Landing
| | | | | | - Fees landing
| | | | | - Air traffic control
| | | | | | - Air traffic control price factor design
| | | | | | - Air traffic control price factor study
| | | | | - Maintenance
| | | | | | - Airframe repair cost per flight
| | | | | | - Cost burden
| | | | | | - Rate labor
| | | | | - Related direct operating costs
| | | | | | - Revenue per freight km design
| | | | | | - Revenue per freight km study
| | | | | - Miscellaneous
| | | | | | - Rate inflation
| | | |- Fuel type (ID="kerosene")
| | | | | - Factor engine maintenance
| | | | | - Fuel price
| | | | | - Ratio operating empty mass
| | | |- Fuel type (ID="liquid_hydrogen")
| | | | | - Factor engine maintenance
| | | | | - Fuel price
| | | | | - Ratio operating empty mass
```
## Additional requirements {#additional-requirements}
The tool requires mission-dependent data. Please make sure that the `mission_data` folder, located in the directory of the aircraft exchange file, contains at least the `design_mission.xml` file (this should be the case if the design is valid). If data for an off-design analysis is available and you wish to calculate the associated costs, the `study_mission.xml` file must also be provided.
## Next steps {#next-steps}
The next step is to [run the _cost\_estimation_ module](run_your_first_cost_estimation.md).
\ No newline at end of file
# Introduction {#mainpage}
Welcome to the _cost\_estimation_ module in UNICADO – where we take your aircraft operating costs from “hmm… probably a lot?” to laser-accurate precision! This tool is like a financial :crystal_ball for your aircraft, crunching numbers on fuel, maintenance, crew costs, and just about (almost) every other expense you can imagine. Think of it as your budgeting co-pilot, always ready to calculate so you can focus on the skies instead of spreadsheets. With _cost\_estimation_, you stay in control, keep the accountants happy, and land at your bottom line without any turbulence. So buckle up, and let’s start calculating!
## Summary of features
Here’s a quick rundown of what the tool currently does, along with a sneak peek at what's planned:
Configuration | Energy carrier |Cost share | Status |
------------------|-----------------|-------------------------|:------------------------------------:|
Tube-and-wing |Kerosene |Direct operating cost |running :white_check_mark: |
Tube-and-wing |Kerosene |Indirect operating cost |under development :construction:|
Tube-and-wing |Liquid hydrogen |Direct operating cost |running :white_check_mark: |
Tube-and-wing |Liquid hydrogen |Indirect operating cost |under development :construction:|
Blended-wing-body |... |... |under development :construction:|
## A user's guide to cost calculation
The _cost\_estimation_ tool is your key to accurately calculating the operating costs of an aircraft. In this user documentation, you’ll find all the information you need to understand the tool, as well as the necessary inputs and configurations to run a cost analysis from the ground up.
The following sections will walk you through the cost estimation process in UNICADO:
- [Getting started](getting_started.md)
- [Run your first cost estimation](run_your_first_cost_estimation.md)
For a comprehensive understanding of the tool’s functionality, the documentation is structured into two distinct sections:
- A [method description](operating_cost_method.md) and
- a [software architecture](software_architecture.md)
section.
Ready to dive in? Let’s get started! :money_with_wings:
<!-- ## You are a Developer?
If you are familiar with these concepts and want to contribute - head over to the developers guide to get your own method running in UNICADO!
The following pages will help you understand the code structure:
- [Prerequisites](prerequisites.md)
- [Build the code](build-the-code.md)
- [Cost estimation module structure](wing-module-structure.md)
- [Available methods](available-methods.md)
- [Method template](method-template.md)
We appreciate it! -->
\ No newline at end of file
# Calculation method
The total operating costs of an aircraft are split into direct operating costs (DOC) and indirect operating costs (IOC).
$
TOC = DOC + IOC
$
!!! note
Unless explicitly stated, all values are in SI units and all costs in EUR.
## Direct operating costs (calculate_direct_operating_costs function)
The Direct Operating Costs (DOC) are directly influenced by the parameters and the aircraft's performance and are commonly used for aircraft evaluation. Therefore, a simplified method for DOC estimation, based on „From Aircraft Performance to Aircraft Assessment“ by J. Thorbeck <sup>[1]</sup>, is provided. The DOC are determined for one year and the entire depreciation period.
Two elements are required for the simplified DOC model: The route independent (fixed) costs $C_1$ and route dependent (variable) costs $C_2$:
$
DOC = C_1 + C_2
$
### Route independent costs (calculate_route_independent_costs function)
Route-independent costs include all cost components apart from the operation of the aircraft.
Hence, the route-independent costs are the sum of the capital costs and the crew costs:
$
C_1 = C_{CAP} + C_{crew}
$
Those are calculated both, for one year and for the depreciation period.
#### Capital costs (calculate_capital_costs function)
The capital costs can be assumed to be a linear function of the operating empty mass if the influence of the aircraft market is considered negligible:
$
C_{CAP} = P_{OE} \cdot m_{OE} \cdot (a+f_I)
$
In which
- $P_{OE}$ - price per kg operating empty mass
- $m_{OE}$ - operating empty mass
- $a$ - annuity factor in percent
- $f_I$ - insurance rate in percent
The annuity formula, which is based on a modified mortgage equation, addresses both yearly depreciation and interest:
$
a = f_{IR} \cdot \frac{1-f_{RV} \cdot \left(\frac{1}{1+f_{IR}}\right)^{t_{DEP}}}{1-\left(\frac{1}{1+f_{IR}}\right)^{t_{DEP}}}
$
In which
- $f_{IR}$ - interest rate in percent
- $f_{RV}$ - residual value factor in percent
- $t_{DEP}$ - depreciation period in years
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, which is occasionally relevant. This assumes that an operator is purchasing an aircraft at a constant price per kilogram and spends the corresponding capital cost consistently per year throughout the depreciation period.
#### Crew costs (calculate_crew_costs function)
This method is based on the lecture "J Flugzeugbewertung" by A. Bardenhagen <sup>[2]</sup>.
The annual crew costs are assumed to be the sum of the flight and cabin crew costs:
$
C_{crew} = C_{FC} + C_{CC}
$
both of which are of different levels. There are different approaches here, which must be adapted to the respective cost structure of the airline:
- Some airlines (mainly low-cost carriers) employ and pay pilots and flight attendants on a time basis (block hours).
- Other airlines hire their personnel permanently and must pay them irrespective of the time they are deployed.
In the first case, the personnel costs belong to the variable in the second case to the fixed direct operating costs. Here, crew costs are assumed to be fixed (route independent) because an airline must provide enough crews to ensure flight operations over the entire service time and therefore are proportional to the payload. 50 passengers per flight attendant are assumed based on certification requirements. Crew costs are constant per year. To calculate the crew cost for several years, the expected salary increase should be considered by an escalation factor. Accordingly, past price levels can be extrapolated to the current level changed according to inflation, price, or salary increase.
Both cost shares are determined by the same variables:
- The flight/cabin crew complement (the number of crews per aircraft, dependent on the stage length): $n_{FCC}$/$n_{CCC}$,
- The number of flight/cabin crew members: $n_{FC}$/$n_{CC}$,
- The annual salary of a flight/cabin crew member (dependent on the stage length): $S_{FC}$/$S_{CC}$, and
- The escalation factor in percent: $f_{ESC}$.
<!-- NOTE: The values of these drivers depend on the stage length. Two modes are implemented. Mode 1 (salary_variation = False, default): To ensure that the values of the above-mentioned parameters are the same for the design mission and mission study, the stage length of the design mission is used to determine the values for the study mission as well. Mode 2 (salary_variation = True): The above-mentioned values are obtained for different stage lengths for the design mission and mission study. -->
That results in the following calculations:
$
C_{FC} = n_{FCC} \cdot n_{FC} \cdot S_{FC} \cdot f_{ESC}
$
$
C_{CC} = n_{CCC} \cdot n_{CC} \cdot S_{CC} \cdot f_{ESC}
$
The escalation factor
$
f_{ESC} = (1+r_{INF})^{y}
$
incorporates the inflation rate ($r_{INF}$), which encompasses both price and salary adjustments, and the number of years elapsed between the calculation year and the base year for salaries ($y$).
If the depreciation period is used as the time difference, resulting costs are related to the whole depreciation period, whereas a time difference of one year solely results in the costs for the base year.
The crew complements as well as the average annual salaries are dependent on the stage length:
- Regional: ranges less than 500 km
- Short haul: ranges between 500 km and 1000 km
- Medium haul: ranges between 1000 km and 4000 km
- Long haul: ranges between 4000 km and 6500 km
- Ultra-long haul: ranges above 6500 km
and can be taken from the following tables:
Segment | Crew complement | $S_{FC}$ in EUR/y | $S_{CC}$ in EUR/y |
----------------|:---------------:|:-----------------:|:-----------------:|
Regional | 5 | 70 000 | 30 000 |
Short haul | 5 | 120 000 | 30 000 |
Medium haul | 5 | 160 000 | 30 000 |
Long haul | 8 | 200 000 | 45 000 |
Ultra-long haul | 8 | 200 000 | 45 000 |
### Route dependent costs (calculate_route_dependent_costs function)
Route dependent costs $C_2$ include all cost components that are directly attributable to flight operations. These include
- fuel $C_F$,
- fees (handling $C_H$, landing $C_L$, air traffic control (ATC) $C_{ATC}$), and
- maintenance $C_{MRO}$.
Thus, the **annual** route dependent costs can be calculated by
$
C_2 = C_F + C_H + C_{LDG} + C_{ATC} + C_{MRO}
$
#### Flights per year
Knowing the number of annual flights is mandatory to calculate the above-mentioned cost shares.
A reliable approximation of the number of annual flights can be found using the following analytical basis:
- Potential flight hours per year: $365 \cdot 24 = 8760$
- Maintenance lay days per year (C-Check every 15 months for 4 days): $4 \cdot 12/15 = 3.2$
- Overhaul lay days per year (D-Check every 5 years for 4 weeks): $4 \cdot 7/5 = 5.6$
- Lay days for repairs, technical and operational reserve: $2.6$
- Lay hours per year: $(3.2+5.6+2.6) \cdot 24 = 273.6$
- Potential operation days per year: $365-(3.2+5.6+2.6) = 353.6$
- Daily night curfew hours: $7$
- Yearly night curfew hours: $354 \cdot 7 = 2475$
- Yearly operation time in hours: $OT = 8760-2475-273.6 = 6011.4$
Knowing the time for one flight $FT$ and the block time supplement $BT$ (turn around time) per flight, the number of flight cycles $FC$ can be calculated:
$
FC = \frac{OT}{(FT + BT)}
$
It is assumed that one flight cycle consists of an outbound flight, a turnaround time and a return flight. Consequently, the number of annual flights is calculated as follows:
$
n_{flights} = 2 \cdot FC
$
#### Fuel costs (calculate_fuel_costs function)
The fuel costs depend on the fuel price $P_F$, the trip fuel mass $m_{TF}$ (which can be obtained from the payload range diagram (PRD)), and the number of yearly flights $n_{flights}$:
$
C_F = P_{F} \cdot m_{TF} \cdot n_{flights}
$
#### Handling costs (calculate_handling_costs function)
Handling charges $F_H$ include charges for loading and unloading, use of terminals and passenger boarding bridges, security checks, and ground energy supply.
The annual handling fees are charged based on the payload mass $m_{PL}$ and the number of flights per year. The resulting handling costs are calculated as follows:
$
C_H = m_{PL} \cdot F_{H} \cdot n_{flights}
$
#### Landing costs (calcutale_landing_costs function)
The annual landing fees $F_{LDG}$ are charged based on the maximum (certified) takeoff mass $m_{TO}$ and number of flights per year. The resulting landing costs are calculated as follows:
$
C_{LDG} = m_{TO} \cdot F_L \cdot n_{flights}
$
#### Air traffic control costs (calculate_air_traffic_control_costs function)
The calculation of the ATC costs is based on the EUROCONTROL route charge formula <sup>[3]</sup>, more precisely the aircraft weight factor.
> "The weight factor (expressed to two decimals) is determined by dividing, by fifty (50), the certificated Maximum Take-Off Weight (MTOW) of the aircraft (in metric tonnes, to one decimal) and subsequently taking the square root of the result rounded to the second decimal [...]".
The ATC price factor $f_{ATC}$ considers the fact that the price scenarios are varying strongly for each continent (or even region):
- $f_{ATC} = 1.0$ for domestic europe
- $f_{ATC} = 0.7$ for transatlantic flights
- $f_{ATC} = 0.6$ for far east flights (only half of the landings at european airports)
The ATC costs are calculated as follows:
$
C_{ATC} = R \cdot f_{ATC} \cdot \sqrt{\frac{m_{TO}[\text t]}{50}} \cdot n_{flights}
$
with
- $R$ - range in km
- $m_{TO}$ - maximum takeoff mass (in tonnes)
#### Maintenance costs (calculate_maintenance_costs function)
Maintenance costs are categorized into three components:
- Flight cycle dependent cost: This component primarily accounts for structural fatigue and overhaul burdens.
- Flight hour dependent cost: This component primarily reflects wear and the associated line maintenance work.
- Calendar time dependent cost: This component represents a constant share, such as the rectification of corrosion during overhaul.
In the following, only the maintenance costs per flight cycle are considered. Following the JADC method, an approximation for those costs is given by the sum of three parts:
- Airframe material maintenance cost (repair and replacement): $C_{MRO,AF,MAT}$
- Airframe personnel maintenance cost (inspection and repair): $C_{MRO,AF,PER}$
- Engine total maintenance cost: $C_{MRO,ENG}$
In which
$
C_{MRO,AF,MAT} = m_{OE}[\text t] \cdot (0.2 \cdot t_{flight} + 13.7) + C_{MRO,AF,REP}
$
$
C_{MRO,AF,PER} = f_{LR} \cdot (1+C_B) \cdot \left[ (0.655 + 0.01 \cdot m_{OE}[\text t]) \cdot t_{flight} + 0.254 + 0.01 \cdot m_{OE}[\text t] \right]
$
$
C_{MRO,ENG} = n_{ENG} \cdot \left( 1.5 \cdot \frac{T_{0} [\text t]}{n_{ENG}} + 30.5 \cdot t_{flight} + 10.6 \cdot f_{MRO,ENG}\right)
$
with
- $C_{MRO,AF,REP}$ - airframe repair cost per flight
- $f_{LR}$ - labor rate in EUR/h
- $C_B$ - cost burden
- $n_{ENG}$ - number of engines
- $T_{0}$ - sea level static thrust per engine
- $f_{MRO,ENG}$ - engine maintenance factor
The airframe repair cost per flight $C_{MRO,AF,REP}$ equal 57.5 for kerosene-powered aircraft. For hydrogen-powered aircraft, this value is multiplied by the operating empty mass factor $f_{OEM} = 1.1$ to account for an approx. 10% higher operating empty mass.
The engine maintenance factor is considered $f_{ENG} = 1$ for kerosene-powered aircraft and $f_{ENG} = 0.7$ for hydrogen-powered aircraft.
Thus, the annual maintenance costs result in
$
C_{MRO} = (C_{MRO,AF,MAT} + C_{MRO,AF,PER} + C_{MRO,ENG}) \cdot n_{flights}
$
## Related direct operating costs
Absolute DOC are generally unsuitable as an assessment measure because aircraft size and technology strongly influence this figure. They are therefore expressed in differently related quantities, depending on the purpose of the evaluation:
- DOC/Range (Flight Kilometer): Flight Kilometer Costs (FKC)
- DOC/Seat Kilometer Offered (SKO): Seat Kilometer Costs (SKC)
- DOC/Seat Kilometer Offered Corrected: Corrected SKC to take account of any freight revenue
- DOC/Ton Kilometers Offered (TKO): Ton Kilometer Costs (TKC)
- DOC/Revenue Passenger Kilometer (RPK): Revenue Seat Kilometer Costs (RSKC)
These are described below.
### Flight kilometer costs (calculate_flight_kilometer_costs function)
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:
$
FKC = \frac{DOC}{R}.
$
### Seat kilometer costs (calculate_seat_kilometer_costs function)
The seat kilometer offered (SKO) (or available) 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 $n_{seats}$ by the range:
$
SKO = n_{seats} \cdot R.
$
The seat kilometer costs allow the analysis of a change in seat capacity and thus the assessment of the passenger kilometer potential:
$
SKC = \frac{DOC}{SKO}
$
### Corrected seat kilometer costs (calculate_corrected_seat_kilometer_costs function)
!!! note
The calculation of this cost share is not implemented at the moment and set to `0` instead.
A method of freight equivalent passenger seats is applied.
Cargo revenue from residual cargo payload at maximum zero fuel mass ($m_{PL,max} - m_{PL}$) can be calculated using
$
I_{cargo} = I_{FR} \cdot (W_{PL,max} - W_{PAX})
$
with
- $I_{FR}$ - revenue per freight kilometer
- $W_{PL,max}$ - maximum payload weight
- $W_{PAX}$ - pax weight
The equivalent seat revenue can be derived using the following formula:
$
n_{PAX,cargo} = \frac{I_{cargo}}{I_{PAX}}
$
with $I_{PAX}$ as revenue per seat and flight (see following table).
Segment | $I_{PAX,multi-class}$ in EUR/SO | $I_{PAX,all-economy}$ in EUR/SO |
----------------|:-------------------------------:|:-------------------------------:|
Short haul | 400 | 250 |
Medium haul | 450 | 300 |
Long haul | 550 | 400 |
Ultra long haul | 700 | 550 |
Finally, the SKC correction can be determined as follows:
$
SKC_{cor} = SKC \cdot \frac{n_{PAX}}{n_{PAX} + n_{PAX,cargo}}
$
### Ton kilometer costs (calculate_ton_kilometer_costs function)
The ton kilometer costs (TKC) allow the analysis of a change in payload capacity and thus the assessment of the payload kilometer potential. The Ton Kilometers Offered (TKO) are the product of the payload and the range:
$
TKO = m_{PL} \cdot R
$
The Ton Kilometer Costs (TKC) are the DOC related to the TKO:
$
TKC = \frac{DOC}{TKO}
$
### Revenue seat kilometer costs (calculate_revenue_seat_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 revenue passenger kilometers are calculated by multiplying the number of revenue passengers with the maximum number of seats and the seat load factor $f_{PL}$:
$
RPK = n_{PAX} \cdot f_{SL} \cdot R
$
The DOC per revenue passenger kilometer additionally take into account the overall performance of an airline. Note that revenue is strongly dependent on market situation and therefore varying.
$
RSKC = \frac{DOC}{RPK}
$
## Indirect operating costs (IOC)
tbd. :construction:
---
<sup>[1]</sup> J. Thorbeck, 2007. *From Aircraft Performance to Aircraft Assessment*. DLR.<br>
<sup>[2]</sup> A. Bardenhagen, 2017. *J Flugzeugbewertung*. Technische Universität Berlin.<br>
<sup>[3]</sup> EUROCONTROL Central Route Charge Office (CRCO), 2022. *Customer Guide to Charges*. URL: https://www.eurocontrol.int/sites/default/files/2022-11/eurocontrol-customer-guide-to-charges.pdf.
\ No newline at end of file
# Run your first cost estimation
Let's dive into the fun part and crunch some numbers! :moneybag:
## Tool single execution
The tool can be executed from the console directly if all paths are set. The following will happen:
- [Console output](#console-output)
- [Generation of reports and plots](#reporting)
- [Writing output to aircraft exchange file](#write-data-to-acxml)
Some of the above mentioned steps did not work? Check out the [troubleshooting](#troubleshooting) section for advices. Also, if you need some additional information on the underlying methodology, check out the page on the [cost estimation method](operating_cost_method.md).
So, feel free to open the terminal and run `cost_estimation.exe` to see what happens...
### Console output {#console-output}
Firstly, you see output in the console window. Let's go through it step by step...
```
2024-12-06 11:37:30,205 - PRINT - Cost estimation started...
2024-12-06 11:37:30,224 - PRINT - ----------------------------------------------------------
2024-12-06 11:37:30,224 - PRINT - Operating cost estimation results for design mission.
2024-12-06 11:37:30,224 - PRINT - ----------------------------------------------------------
2024-12-06 11:37:30,226 - PRINT - Capital costs: 5,852,515 €
2024-12-06 11:37:30,226 - PRINT - Crew costs (per year): 4,779,200 €
2024-12-06 11:37:30,227 - PRINT - ROUTE INDEPENDENT COSTS (per year): 10,631,715 €
2024-12-06 11:37:30,227 - PRINT - *
2024-12-06 11:37:30,319 - PRINT - Fuel costs (per year): 22,744,718 €
2024-12-06 11:37:30,322 - PRINT - Handling costs (per year): 3,119,900 €
2024-12-06 11:37:30,322 - PRINT - Landing costs (per year): 1,290,968 €
2024-12-06 11:37:30,348 - PRINT - Air traffic control costs (per year): 9,271,834 €
2024-12-06 11:37:30,351 - PRINT - Maintenance costs (per year): 8,038,461 €
2024-12-06 11:37:30,377 - PRINT - ROUTE DEPENDENT COSTS (per year): 44,465,883 €
2024-12-06 11:37:30,377 - PRINT - *
2024-12-06 11:37:30,420 - PRINT - DIRECT OPERATING COSTS (per year): 55,097,598 €
2024-12-06 11:37:30,420 - PRINT - ----------------------------------------------------------
2024-12-06 11:37:30,607 - WARNING - No calculation method for indirect operating costs (IOC) implemented. IOC set to 0.
```
To this point, the module started and calculated the operating costs for the design mission.
There is also a warning that the indirect operating cost method is not implemented yet.
```
2024-12-06 11:37:30,607 - WARNING - Warning: Operating cost estimation of study mission not possible due to missing data. No operating costs calculated.
2024-12-06 11:37:30,608 - PRINT - ----------------------------------------------------------
```
The tool continues to check if an off-design study exists and tries to calculate the respective costs. In this example, there is no off-design data available and thus, the direct operating costs cannot be determined for the study mission.
```
2024-12-06 11:37:30,641 - PRINT - Plots are generated and saved...
2024-12-06 11:37:38,187 - WARNING - Warning: "html_output" switch in module configuration file set to "False". No HTML report generated.
2024-12-06 11:37:38,188 - PRINT - Method-specific data are written to 'cost_estimation_results.xml'...
2024-12-06 11:37:38,192 - WARNING - Warning: "tex_output" switch in module configuration file set to "False". No TeX report file generated.
2024-12-06 11:37:38,192 - PRINT - Cost estimation finished.
```
Finally, you receive information about the reports and plots created (depending on your settings, see next section) and the tool is successfully completed.
### Reporting {#reporting}
In the following, a short overview is given on the generated reports:
- A `cost_estimation.log` file is written within the directory of the executable
- Depending on your settings, the following output is generated and saved in the `reporting` folder, located in the directory of the aircraft exchange file:
- an HTML report in the `report_html` folder (not implemented yet)
- a TeX report in the `report_tex` folder (not implemented yet)
- an XML file with additional output data in the `report_xml` folder
- plots in the `plots` folder
### Write data to the aircraft exchange file {#write-data-to-acxml}
!!! note
The _acXML_ is an exchange file - we agreed on that only data will be saved as output that is needed by another tool!
Results are saved in the aircraft exchange file at the `aircraft_exchange_file/assessment/cost_estimation/operating_cost` node. The following information is written to the _acXML_:
```
Direct operating cost
|- Flights per year (design mission)
|- Flights per year (study mission) - only if off-design analysis available
|- Route independent cost annual
|- Route dependent cost annual
|- Direct operating cost annual
```
When implemented, the indirect operating costs are going to be saved at `aircraft_exchange_file/assessment/cost_estimation/operating_cost/indirect_operating_cost`.
## Troubleshooting {#troubleshooting}
- The tool does not run properly? *Make sure you have all the paths set up correctly and the specified elements exist.*
# air_quality_index_schaefer {#aqi-schaefer}
This method provides a single indicator (called the Air Quality Index (AQI)) for the assessment of air quality. The AQI can take values between 0 and 1, with 1 indicating that the allowable limits defined by ICAO are reached by all species. Therefore, low values are preferable.
## General principles {#aqi-schaefer-generalprinciples}
The calculation method, including all required inputs, is described in Schaefer (2017) \cite Sch17. It is:
$ AQI = 1/n \cdot \sum x_i/x_{i,max}$
where:
- $ x_i $: emission mass [g] ( for CO, HC, NOx) or maximum concentration [mg/m^3] ( for soot) during the landing and takeoff cycle,
- $ x_{i,max}$: regulatory value defined by ICAO, the ratio of emission mass Dp [g] emitted during LTO and the rated thrust F00 [kN],
- $ n $: number of emission species.
## Input-Data {#aqi-schaefer-input}
Only engine and emission data are needed. To construct the engine object, the following is required from acXML:
```xml
<engine description="Description of engine">
<engine_model description="Name of selected engine model">
<value>V2527-A5</value>
</engine_model>
<scale_factor description="Scale factor">
<value>1.168175939</value>
<unit>1</unit>
<lower_boundary>0</lower_boundary>
<upper_boundary>5</upper_boundary>
</scale_factor>
</engine>
```
From `ecological_assessment_results` following parameter will be read:
```xml
<calculation_results description="Results of calculation method">
<mission_emissions description="Results of mission emission calculation">
<study_mission description="Results of study mission calculation">
<emissions description="Emissions of study mission">
<LTO_cycle description="Emissions of landing and takeoff cycle">
<HC description="LTO HC emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</HC>
<CO description="LTO CO emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</CO>
<NOx description="LTO NOx emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</NOx>
<c_soot_LTO_max description="Maximum soot concentration during study mission LTO">
<value>0</value>
<unit>1</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</c_soot_LTO_max>
</LTO_cycle>
</emissions>
</study_mission>
</mission_emissions>
</calculation_results>
```
## Output-Data {#aqi-schaefer-output}
The submodule writes its calculation results into the HTML report located in `aircraft_exchange_file_directory/reporting/reportHTML`.
\ No newline at end of file
# Changelog {#changelog}
## v3.0.0
The *v3.0.0* release is a **major** release with many changes including the *modularization*.
### Changes
The following changes have been introduced:
- The software architecture has been completely refactored.
- Cost calculation methods have been integrated to be independent of cost modules.
### Bugfixes
During the development of this release the following bugs were found and fixed:
- SFCContThrustSL was used before calculated
# climate_model_dallara {#climate-model-dallara}
The climate model, referred to here as the "Dallara" model, calculates key climate impact metrics: Radiative Forcing (RF), Absolute Global Warming Potential (AGWP), Absolute Global Temperature Potential (AGTP), and Average Temperature Response (ATR). The calculation methodology is derived from Dallara's work in 2011 \cite Dal11, providing a systematic approach to assess the environmental effects of various emissions.
Key Metrics:
- **RF**: quantifies the change in energy flux in the Earth's atmosphere due to emissions, specifically related to greenhouse gases, aerosols, and other components like soot or water vapor.
- **AGWP**: measures the cumulative impact of an emission over a specific time horizon (typically 20, 100, or 500 years), comparing it to CO₂'s effect.
- **AGTP**: calculates the temperature change due to emissions at a given point in time, typically looking at how gases contribute to warming.
- **ATR**: ATR evaluates the mean temperature change over time.
## General principles {#climate-model-generalprinciples}
The model assesses the climate impact of following emissions:
- CO₂ (Carbon dioxide)
- H₂O (Water vapor)
- Soot (Black carbon)
- Ozone (O₃) (both long-lived and short-lived forms) and CH₄ (Methane), which are influenced by NOₓ emissions
A particular feature of the method is the usage of forcing factors, which are unitless parameters. These factors modify the radiative forcing for emissions at different altitudes by normalizing the RF values to a fleetwide average. The altitude is the only flight trajectory parameter considered, meaning the geographic location is not factored into the calculations. This altitude dependency recognizes that emissions at higher altitudes (such as those from aviation) have a different forcing impact compared to emissions at ground level, as atmospheric processes and the distribution of pollutants vary with height.
In the model, you can explore how the influence of time affects climate impact by adjusting the rate of devaluation for temperature response. A value of zero indicates that the temperature changes occurring after operations are given equal weight compared to changes during the operational period. Higher values of the rate, however, signify that postoperation impacts become progressively less important over time, with each subsequent year's temperature change being less significant than that of the previous year.
## Input-Data {#climate-model-input}
From the acxml following parameter are needed:
```xml
<aircraft_exchange_file>
<requirements_and_specifications>
<design_specification>
<assessment_scenario>
<flights_per_year>
<unit>1</unit>
<value>2227</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>4000</upper_boundary>
</flights_per_year>
</assessment_scenario>
</design_specification>
</requirements_and_specifications>
<anlysis>
<study_mission>
<range>
<unit>m</unit>
<value>927191.902</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>5000000</upper_boundary>
</range>
<top_of_climb_range>
<unit>m</unit>
<value>140079.6691</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>5000000</upper_boundary>
</top_of_climb_range>
<top_of_descent_range>
<unit>m</unit>
<value>741036.0403</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>5000000</upper_boundary>
</top_of_descent_range>
<cruise_steps>
<cruise_step ID="0">
<relative_end_of_cruise_step>
<unit>1</unit>
<value>1</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>1</upper_boundary>
</relative_end_of_cruise_step>
<altitude>
<unit>m</unit>
<value>10668</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>15000</upper_boundary>
</altitude>
</cruise_step>
</cruise_steps>
</study_mission>
</anlysis>
</aircraft_exchange_file>
```
The Submodel reads following data from the path `module_configuration_file/program_settings/standard_strategy/impact_calculation`in the configuration file:
```xml
<climate_model_methods>
<method>
<value>DALLARA</value>
</method>
<dallara>
<fuel_factor_AIC>
<unit>1</unit>
<value>0.6</value>
<lower_boundary>0.3</lower_boundary>
<upper_boundary>1</upper_boundary>
</fuel_factor_AIC>
<max_integration_period>
<unit>a</unit>
<value>200</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>1000</upper_boundary>
</max_integration_period>
<devaluation_rate>
<unit>1</unit>
<value>0.03</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>10^10</upper_boundary>
</devaluation_rate>
<forcing_factors>
<variations>
<aircraft_induced_cloudiness>
<unit>1</unit>
<value>1</value>
<lower_boundary>0.67</lower_boundary>
<upper_boundary>1.33</upper_boundary>
</aircraft_induced_cloudiness>
<short_lived_ozone>
<unit>1</unit>
<value>1</value>
<lower_boundary>0.67</lower_boundary>
<upper_boundary>1.33</upper_boundary>
</short_lived_ozone>
<methan_and_long_lived_ozone>
<unit>1</unit>
<value>1</value>
<lower_boundary>0.67</lower_boundary>
<upper_boundary>1.33</upper_boundary>
</methan_and_long_lived_ozone>
</variations>
<data_set_selector>
<value>mode_0</value>
</data_set_selector>
</forcing_factors>
</dallara>
</climate_model_methods>
```
Additionally, the emission masses of the study missions are needed:
```xml
<calculation_results description="Results of calculation method">
<mission_emissions description="Results of mission emission calculation">
<study_mission description="Results of study mission calculation">
<emissions description="Emissions of study mission">
<LTO_cycle description="Emissions of landing and takeoff cycle">
<CO2 description="LTO CO2 emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</CO2>
<H2O description="LTO H2O emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</H2O>
<SO4 description="LTO SO4 emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</SO4>
<NOx description="LTO NOx emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</NOx>
<soot description="LTO Soot emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</soot>
</LTO_cycle>
<cruise description="Emissions of cruise phase">
<CO2 description="Cruise CO2 emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</CO2>
<H2O description="Cruise H2O emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</H2O>
<SO4 description="Cruise SO4 emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</SO4>
<NOx description="Cruise NOx emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</NOx>
<soot description="Cruise Soot emissions of one study mission">
<value>0</value>
<unit>kg</unit>
<lower_boundary>-1.797693135e+308</lower_boundary>
<upper_boundary>1.797693135e+308</upper_boundary>
</soot>
</cruise>
</emissions>
</study_mission>
</mission_emissions>
</calculation_results>
```
## Output-Data {#climate-model-output}
The results are saved within the following files:
- acXML parameter: `/aircraft_exchange_file/assessment/ecological_assessment/average_temperature_response`
- html report: `aircraft_exchange_file_directory/reporting/reportHTML/ecological_assessment_report.html`
- tex report: `aircraft_exchange_file_directory/reporting/reportTeX/ecological_assessment_report.tex`
- csv file: `aircraft_exchange_file_directory/reporting/plots/csv_files/ecological_assessment_climateImpact.csv`
\ No newline at end of file
docs/documentation/analysis/ecological_assessment/figures/lifeCyclePhases.png

130 B

# Getting Started {#getting-started}
## Tool execution
This guide will show you the basic usage of the _ecological\_assessment_ tool.
!!! note
It is assumed that you have the `UNICADO Package` installed, including the executables and UNICADO libraries. If you are a developer, you need to build the tool first (see [build instructions on the UNICADO website](../../../get-involved/build/cpp/)).
The following steps are necessary:
1. Create a dummy `aircraft_exchange_file` and provide all other required inputs (for submodule-dependent minimal required inputs see [here](#submodules)).
2. Fill out the configuration file:
- change at least in `control_settings`:
- `aircraft_exchange_file_name` and `aircraft_exchange_file_directory` to your respective settings
- set `console_output` at least to `mode_1`
- set `plot_output` to false (or define `inkscape_path` and `gnuplot_path`)
- all other parameters can be left at default values.
3. Open the terminal and run _ecological\_assessment.exe_
The following will happen:
- you will see output in the console window
- a `.log` file is written within the directory of the executable
- an HTML report is created in the directory of `aircraft_exchange_file_directory/reporting/reportHTML`
- depending on your chosen methods, results are saved in
- `/aircraft_exchange_file/assessment/average_temperature_response`
- and/or in the files you'll find in the `aircraft_exchange_file_directory/reporting/plots/` directory
- and/or in the files you'll find in the `aircraft_exchange_file_directory/reporting/plots/csv_files` directory.
Be aware of the files' timestemp as there could be leftovers of earlier programm executions!
## Changing user input
If you want to adapt the tool's execution, you can modify the parameters within the configuration file. There, you can enable or disable specific aspects of the ecological assessment and select the methods to be used for the calculations. At the [submodule pages](#submodules), you can check which parameters are available.
# Introduction {#mainpage}
The tool _ecological\_assessment_ is one of the last modules in the UNICADO toolchain, serving as an assessment module executed after the aircraft sizing loop. As its name suggests, it is specifically designed to evaluate the ecological performance of your aircraft design. By using this tool, you gain the opportunity to contribute to the development of environmentally friendly aircraft, playing a part in shaping a sustainable future for aviation. ✈️🌱🌎
This module enables you to assess various ecological factors, including aircraft emission masses and their broader environmental impacts. These impacts are analyzed, for example, in terms of their contributions to climate change and air quality, helping you understand the environmental footprint of your design in a comprehensive way.
The _ecological\_assessment_ tool offers flexibility in how you approach these evaluations. You can choose to perform a complete life cycle assessment (LCA), which evaluates the environmental impact across the entire lifespan of the aircraft — from development and production through operation to end-of-life, including eventual disposal. Alternatively, if you're focusing on the operational phase, you can limit the analysis to the impact of the flown mission alone.
If you want to explore the details of the _ecological\_assessment_ module and discover how to optimize your aircraft designs for environmental sustainability, check out the next section of this documentation. The @subpage getting-started gives you a first insight into how to execute the tool. To understand how the tool works, the documentation is split into a @subpage softwarearchitecture section, where the structure of the module is described.
So let's get started! ✈️
This diff is collapsed.
%%% BOOKS %%%
%%% JOURNAL ARTICLES %%%
@article{Dal11,
Author = "Dallara, E. S. ; Kroo, I. M. and Waitz, I.A.",
Title = {{Metric for Comparing Lifetime Average Climate Impact of Aircraft}},
Journal = "IAAA Journal",
Year = "2011",
Volume = "49",
Number = "8",
Pages = "1600-1613"
}
@article{Kug05,
title = {Aircraft particulate matter estimation through all phases of flight},
author = {Kugele, A. and Jelinek, F. and Gaffal, R.},
journal = {Eurocontrol Experimenal Centre, Br{\'e}tigny sur Orge, France},
year = {2005}
}
%%% CONFERENCE PAPERS %%%
@inbook{Koss22,
author = {Kristina Kossarev and Anna E. Scholz and Patrick Egerer and Mirko Hornung},
title = {Comparison of Environmental Life Cycle Impact Assessment Methods for Future Aircraft Designs},
booktitle = {AIAA AVIATION 2022 Forum},
chapter = {},
pages = {},
doi = {10.2514/6.2022-3659},
URL = {https://arc.aiaa.org/doi/abs/10.2514/6.2022-3659},
eprint = {https://arc.aiaa.org/doi/pdf/10.2514/6.2022-3659},
abstract = { View Video Presentation: https://doi.org/10.2514/6.2022-3659.vidThe environmental impact of aviation has gained increasing interest in the last two decades, resulting in investigations of novel aircraft concepts involving advanced propulsion technologies. For a holistic evaluation of the environmental footprint of these new aircraft concepts in comparison to state-of-the-art kerosene-burning aircraft, the framework of environmental life cycle assessment plays a central role. It allows compiling and analyzing the environmental impacts of a product system from "cradle-to-grave". In this work, the environmental life cycle assessment method for aircraft developed by [1] has been bug-fixed, enhanced with a new climate model, and updated from ReCiPe 2008 to ReCiPe 2016. For several future aircraft concepts, the results with the updated method were compared with the results presented by Johanning. The comparison shows that the updated ReCiPe method results in a highly increased absolute environmental impact (between +193\% and +441\%), while the relative impact of the future, alternative energy-powered aircraft concepts compared to the kerosene-powered aircraft has changed between -17.1\% and +152\% for all considered alternative energy aircraft concepts. These results demonstrate that to assess whether a future concept is more or less environmentally friendly than a reference concept, it is preferable to rely on relative results in an attempt to reduce the inherent model and parameter uncertainties. }
}
%%% THESES %%%
@misc{Ste13,
author = {Steinbrunn, V.},
year = {2013},
title = {{Bewertung von Flugzeugeentw{\"u}rfen hinsichtlich ihrer Klimawirkung}},
howpublished = {Diplomarbeit, RWTH Aachen, Aachen, Germany}
}
@misc{Sch17,
author = {Schaefer, K.},
year = {2017},
title = {{Conceptual Aircraft Design for Sustainability - Nachhaltigkeitsorientierter Flugzeugvorentwurf}},
howpublished = {Dissertation, RWTH Aachen, Aachen, Germany}
}
%%% TECHNICAL REPORTS %%%
@techreport{Eye04,
author = {C.J. Eyers and P. Norman and J. Middel and M. Plohr and S. Michot and K. Atkinson and R.A. Christou},
institution = {QinetiQ},
year = {2004},
title = {AERO2K Global Aviation Emissions Inventories for 2002 and 2025},
series = {QinetiQ Report},
note = { LIDO-Berichtsjahr=2005,},
url = {https://elib.dlr.de/1328/},
keywords = {AERO2K Global Aviation Emissions Inventories}
}
@techreport{Nor03,
author = {Norman, P. D., Lister, D. H., Lecht, M., Madden, P., Park, K., Penanhoat, O., et al.},
institution = {QinetiQ},
year = {2003},
title = { \verb|Development of the technical basis for a New Emissions Parameter covering the whole AIRcraft operation: NEPAIR: Final Technical Report|},
note = {Tech. Rep. NEPAIR/WP4/WPR/01 Report},
}
@techreport{Sch13,
author = {Schaefer, Martin and Bartosch, Sebastian},
institution = {DLR},
year = {2013},
month = {07},
title = {Overview on fuel flow correlation methods for the calculation of NOx, CO and HC emissions and their implementation into aircraft performance software}
}
@misc{Pet05,
author = {Petzhold, A.},
institution = {DLR, Institut für Physik der Atmosphäre},
year = {2005},
title = {Particle Emissions from Aviation: Microphysics, Chemistry, and Climate Impact },
howpublished = {Forschungsbericht 2006-02}
}
%%% OTHER %%%
@inproceedings{Mar05,
title={Low emission hydrogen combustors for gas turbines using lean direct injection},
author={Marek, Cecil and Smith, Timothy and Kundu, Krishna},
booktitle={41st AIAA/ASME/SAE/ASEE joint propulsion conference \& exhibit},
pages={3776},
year={2005}
}
@inproceedings{Lam12,
title={Aircraft cost model for preliminary design synthesis},
author={Lammering, Tim and Franz, Katharina and Risse, Kristof and Hoernschemeyer, Ralf and Stumpf, Eike},
booktitle={50th AIAA Aerospace Sciences Meeting including the New Horizons Forum and Aerospace Exposition},
pages={686},
year={2012}
}
# mission_emissions {#mission-emissions}
The submodule _mission_emissions_ is the only part of _ecological\_assessment_ that will always be executed. It is handled via the class `Mission` and provides various options to calculate the emissions of kerosene or hydrogen-burning engines during a mission.
## General principles {#mission-emissions-generalprinciples}
The following steps are executed within the mission class:
- `get_mission_data`, `write_emissions_path_csv`, and `get_engine_thermodynamics_LTO`: Data from the `mission.csv` file is imported, engine data for every mission step is determined and saved in a CSV file, and the engine thermodynamics during the landing and takeoff phase according to ICAO definition are calculated.
- Emission calculation: Depending on the defined engine carrier, the emissions will be calculated for every mission step.
- Kerosene:
- The emissions of CO2, H2O, SO2, and SO4 are considered to be proportional to the fuel flow. Therefore, they are calculated via $ m_{emission} = EI * m_{fuel}$, with
- $ m_{emission}$: emission mass $[kg]$
- $ EI $: emission index $[\frac{kg_{emission}}{kg_{fuel}}]$
- $ m_{fuel} $: fuel mass $[kg]$
- All other emissions are considered to be non-proportional. For NOx emissions, there are a P3T3 Method \cite Nor03, Boeing Fuel Flow Method 2 \cite Sch13, and the calculation based on data generated by GasTurb available. For HC as well as CO emissions, the DLR Omega method and Boeing Fuel Flow Method 2 \cite Sch13 are implemented. Additionally, there is the option to calculate the landing and takeoff cycle emissions based on constants provided by ICAO. Soot emissions can be determined via a DLR correlation based on ICAO smoke numbers or a correlation by R.B. Whyte \cite Kug05. Alternatively, it can be assumed to be proportional to the consumed fuel.
- Hydrogen: Only H2O and NOx emissions are produced.
- H2O is assumed to be proportional to the fuel flow.
- For NOx emissions, the emissions of kerosene-burning engines are calculated via the P3T3 method, and a correction factor is used to derive the hydrogen-burning emissions \cite Koss22. You can choose between the calculation of the correction factor and the use of constant emission indices, which were determined in \cite Koss22 for one engine type. As the determination of NOx emissions during hydrogen burning is subject to great uncertainty, the low-fidelity method of using constants is both used as the default method and also implemented as a fallback method if the calculation of a correction factor fails.
## Input Data {#mission-emissions-input}
For the mission emission calculation, the following parameters are needed in the `aircraft_exchange_file`:
```xml
<aircraft_exchange_file>
<requirements_and_specifications>
<general>
<type>
<value>CeRAS</value>
</type>
<model>
<value>SMR-2020</value>
</model>
</general>
<design_specification>
<configuration>
<configuration_type>
<value>tube_and_wing</value>
</configuration_type>
<aerodynamic_technologies>
<value>false</value>
</aerodynamic_technologies>
</configuration>
<energy_carriers>
<energy_carrier ID="0">
<type>
<value>kerosene</value>
</type>
</energy_carrier>
</energy_carriers>
<assessment_scenario>
<flights_per_year>
<unit>1</unit>
<value>2227</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>4000</upper_boundary>
</flights_per_year>
</assessment_scenario>
</design_specification>
<requirements_and_specifications>
<aircraft_exchange_file>
```
In the `ecological_assessment_conf.xml`, next to the control settings block, the following program settings are needed:
```xml
<program_settings>
<strategy_selector>
<value>STANDARD</value>
</strategy_selector>
<standard_strategy>
<emission_calculation>
<mission_emissions>
<emission_methods>
<kerosene>
<HC_method_selector>
<value>mode_0</value>
</HC_method_selector>
<CO_method_selector>
<value>mode_0</value>
</CO_method_selector>
<NOx_method_selector>
<value>mode_0</value>
</NOx_method_selector>
<soot_method_selector>
<value>mode_0</value>
</soot_method_selector>
</kerosene>
<hydrogen_combustion>
<NOx_method_selector>
<value>mode_0</value>
</NOx_method_selector>
</hydrogen_combustion>
</emission_methods>
<relative_humidity>
<unit>1</unit>
<value>0.6</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>1</upper_boundary>
</relative_humidity>
</mission_emissions>
</emission_calculation>
<duration_operation>
<unit>a</unit>
<value>25</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>50</upper_boundary>
</duration_operation>
</standard_strategy>
</program_settings>
```
As the engine library will be used, you can check the documentation page of the library to get information about input files. From the `engine_data_file`, the following parameters are needed:
```xml
<EngineDataFile>
<EngineDesignCondition>
<flightAltitude>35000</flightAltitude>
<flightMachNumber>0.8</flightMachNumber>
</EngineDesignCondition>
<Deck>
<WFToP3min>45</WFToP3min>
<WFToP3max_MTO>101.83</WFToP3max_MTO>
<WFToP3max_MCT>98.74</WFToP3max_MCT>
<TempMax_MTO>848.69</TempMax_MTO>
<TempMax_MCT>772.35</TempMax_MCT>
<N2max>1.034</N2max>
<NfractionClimbRating>0.97</NfractionClimbRating>
<NfractionCruiseRating>0.875</NfractionCruiseRating>
<RelBleedMax>0.3</RelBleedMax>
<ShaftPowerExtractionMax>150</ShaftPowerExtractionMax>
<UnscaledSLST>110.3126953</UnscaledSLST>
</Deck>
<EmissionFactors>
<NOxFactor>32</NOxFactor>
</EmissionFactors>
<ICAOEngineData>
<LTOFuelFlow>
<Taxi>0.128</Taxi>
<Takeoff>1.053</Takeoff>
<ClimbOut>0.88</ClimbOut>
<Approach>0.319</Approach>
</LTOFuelFlow>
<LTOEmissions>
<HCFactor>
<Taxi>0.105e-3</Taxi>
<Approach>0.061e-3</Approach>
<ClimbOut>0.041e-3</ClimbOut>
<Takeoff>0.041e-3</Takeoff>
</HCFactor>
<COFactor>
<Taxi>12.43e-3</Taxi>
<Approach>2.44e-3</Approach>
<ClimbOut>0.62e-3</ClimbOut>
<Takeoff>0.53e-3</Takeoff>
</COFactor>
<NOxFactor>
<Taxi>4.7e-3</Taxi>
<Approach>8.9e-3</Approach>
<ClimbOut>22.3e-3</ClimbOut>
<Takeoff>26.5e-3</Takeoff>
</NOxFactor>
<SNFactor>
<Taxi>2.6</Taxi>
<Takeoff>5.2</Takeoff>
<ClimbOut>7.2</ClimbOut>
<Approach>4.2</Approach>
</SNFactor>
</LTOEmissions>
</ICAOEngineData>
</EngineDataFile>
```
Also, some data from `mission.xml` will be read:
```xml
<mission>
<taxi_time_origin>
<unit>s</unit>
<value>540</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>10000</upper_boundary>
</taxi_time_origin>
<taxi_time_destination>
<unit>s</unit>
<value>300</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>10000</upper_boundary>
</taxi_time_destination>
<range>
<unit>m</unit>
<value>4630000</value>
<lower_boundary>0</lower_boundary>
<upper_boundary>100000000</upper_boundary>
</range>
</mission>
```
And last but not least, you need to provide the `mission.csv` file written by the UNICADO mission module and located in _aircraft\_exchange\_file\_directory/missionData_.
## Output-Data {#mission-emissions-output}
The central output of the mission submodule is the `ecological_assessment_results_file.xml` which you will find in the *aircraft\_exchange\_file\_directory/reporting/report_xml*. It contains all calculated emission masses. Additionally, there is a CSV file in the folder *aircraft_exchange_file_directory/reporting/plots/csv_files/* with mission and engine data for every mission step. As described in [getting started](#getting-started), an HTML report including some plots will be generated.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment