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
Branches
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 1351 additions and 15 deletions
# Software Architecture {#softwarearchitecture}
At the highest level, the `main_ecological_assessment.cpp` calls the function `execute()` of the class `EcologicalAssessment`, which inherits from the class `Module` (available in the library **moduleBasics**). `EcologicalAssessment` provides access to defined strategies. It will run the functions `initialize`, `run`, `update`, `report` and `save` of the strategy (inherited from the `Module` class in **moduleBasics**). Additionally, the `save` function will save and close the aircraft XML file, as well as close the configuration file.
Currently, only one strategy (called STANDARD) is implemented. Here you can find more information about it: @subpage standard-strategy
# Standard Strategy {#standard-strategy}
## Overview
This page provides an overview of the structure and functionalities of the standard strategy.
The architecture is (based on the parts of a Life Cycle Assessment (LCA)) structured into various submodules (see @subpage submodules). The methods of the submodules are located in subfolders called "emissionCalculation" or "impactCalculation," respectively.
- The folder **emissionCalculation** contains all methods to determine emissions.
- In one folder, you'll find the method for mission calculation. By changing the setting in the configuration file, you can choose different methods for emission calculation. Both kerosene and hydrogen-burning turbines can be calculated. The results will be saved in the _ecological\_assessment\_results.xml_.
- The other folder provides functions for life cycle emission calculation. The implemented method is based on Schaefer (2017) \cite Sch17 and determines the emissions for development, production, operation, and end-of-life phases.
- Additionally, you'll find the **ecoDatabase**, a class that offers a variety of constants to calculate the emissions in all aircraft life phases.
- The folder **impactCalculation** contains different methods to calculate the consequences of the emissions.
- The air quality index is determined according to Schaefer (2017) \cite Sch17.
- The climate impact is determined according to Dallara (2011) \cite Dal11.
For a first overview, examining the folder structure (file list) could be beneficial. For more detailed insights, exploring the collaboration diagrams or the source code is recommended. In the following, information about the coordination of the module subparts and their behavior is provided.
The corresponding class `StandardStrategy`, derived from the class `Strategy`, coordinates all calculations based on the methods chosen by the user. It contains all classes of the submodules, as well as functions for generating the plots and the output files. It handles _shared_ptr_ for collecting the HTML report body information of all submodules and the `ecological_assessment_results.xml` data exchanged between the submodules. It includes the functions `initialize`, `run`, `update`, `report`, and `save` (inherited from the `Module` class in **moduleBasics**).
- **initialize()**: The methods for the submodules are read from the config file, and the report and `ecological_assessment_results` are initialized.
- **run()**: Depending on the chosen methods, the run function of the methods is executed. Important: The emissions of the flown mission will always be calculated, as they are needed for all other methods.
- **update()**: Depending on the chosen methods, the acXML will be updated.
- **report()**: Depending on the chosen methods, the plots will be generated, and the HTML as well as TeX reports will be written.
- **save()**: The `ecological_assessment_results.xml` will be saved and closed.
## Submodule Description {#submodules}
### Submodule Routines {#submodules-routines}
All submodules have a class _IOData_, which contains all data from acXML and functions to read or write the data. Additionally, it has a member _configuration_, which provides access to configuration file data. The submodules are executed via the function `run`, which is called by the `StandardStrategy`. The `run` function shall call functions to initialize the data, perform the calculation routines, and update the `ecological_assessment_results.xml` (in case there are results that are needed by other parts of *ecological_assessment*).
### Submodule Description {#submodules-description}
The following subpages will provide you with an overview of the implemented methodologies. For every submodule, there is a brief description of the method, as well as the required inputs and outputs. To gain deeper insights into the calculation routines, you're encouraged to take a look at the source code and the cited literature.
The following submodules are available:
- @subpage mission-emissions
- @subpage lca-schaefer
- @subpage aqi-schaefer
- @subpage climate-model-dallara
\ No newline at end of file
# Basic Concepts {#basic-concepts}
This chapter introduces the definitions and theoretical concepts used in UNICADO for performing the weight and balance (w&b) analysis. The masses of the aircraft's components are calculated in the corresponding design modules. Each component has a _mass properties_ information containing the component's mass, center of gravity position and moments of inertia. All mass properties are gathered in this module and summed up to the different total aircraft's masses, CG positions and mass moments of inertia. Given the airplane design with its requirements and the mass breakdown of its components, the weight and balance of the aircraft is computed considering the mission data and transport task information from the _Aircraft Exchange File_ (acxml). Finally, the loading diagramm is plotted to show different loading cases and the CG-shift during flight.
For some calculations there are more available methods. These can be selected by the user in the w&b tool configuration file [_weight\_and\_balance\_analysis\_conf.xml_](usage.md).
> [!NOTE]
> In this beta release of UNICADO the w&b analysis module is laid out for the _tube and wing_ configuration of a look-a-like A320. This will be extended in the future to support also a blended wing body configuration.
## Masses of the Aircraft {#masses}
Let us start defining the different masses calculated by the tool and how they are determined:
- The **Manufacture Empty Mass (MEM)** is the mass of the aircraft which includes the mass of the main components, i.e. the airframe structure (wing, fuselage, landing gear, empennage, pylons), the propulsion group (nacelles and engines) mass and the fixed equipment mass like the furnishings or the navigation systems.
> [!NOTE]
> The tanks don't have an own mass as they are integrated in the main components. Only for the case of additional tanks a mass is added.
- The **Operating Empty Mass (OEM)** represents the mass of the aircraft which includes the crew, all essential operational fluids and all operator-required items and equipment for flight. It coresponds to the MEM with addition of the operator items mass.
$ OEM = MEM + operator\_items\_mass $
> [!NOTE]
> The operator items are calculated by both the fueselage design and the systems design module.
- The **Maximum Zero Fuel Mass (MZFM)** is the total mass of the aircraft without any fuel. It is calculated with
$MZFM = OEM + maximum\_payload\_mass $
- The ***maximum payload mass*** is refering to the maximum allowed payload which can be taken on board without violation of the structural limits and capacity constraints. This is defined in the TLARs.
- The **Ferry Range Mass (FRM)** is the mass at which the aircraft can reach the maximum range. For this, no payload is carried and the tanks are filled up with the maximum fuel mass.
$ FRM = OEM + maximum\_fuel\_mass $
- The ***maximum fuel mass*** is the maximum fuel that can be carried and fits in all tanks up to the maximum capacity, i.e all tanks are full. The tank design module outputs the maximum energy per each designed tank. These are transformed here with the corresponding gravimetric density to a maximum fuel mass per tank and then summed up for all tanks.
- The **Maximum Take-Off Mass (MTOM)** is the mass at which the aircraft takes off. For the design mission this corresponds to the design mass at take-off. Starting with the previously determined OEM, the calculated design fuel at takeoff and the design payload mass are added:
$ MTOM = OEM + design\_fuel\_mass\_takeoff + design\_payload\_mass $
> [!NOTE]
> The estimated MTOM is an input of the weight and balance analysis tool and is initially written by the _initial\_sizing_ module. Here, it is updated to a mass based on more exact calculation, as the components design and its mass breakdown is now known.
- The ***design payload mass*** consists of the passenger, luggage and additional cargo mass defined by the user in the transport task.
- The ***design fuel mass mission*** is the fuel mass determined from the mission information and is equal to the mission energy (including taxi and reserves) divided by the gravimetric density of the energy provider. If the energy needed to complete the mission is not available or unknown, the design fuel mass is calculated from the difference between the estimated MTOM, OEM and the design payload mass.
- The ***design fuel mass takeoff*** corresponds to the remaining fuel in the tanks after the taxi at the origin, just before the take-off. The design fuel mass at takeoff is equal to the ***design fuel mass*** written in the acxml.
- The ***design fuel mass midflight*** is calculated by substracting from the design fuel mass at takeoff the fuel consumed during the take-off segment and half of the fuel needed for the cruise segment. These data are provided by the mission module. If not, the design fuel mass midflight is approximated to be half of the design fuel mass at takeoff.
- The ***design fuel mass landing*** corresponds to the remaining fuel in the tanks just after the plane touched down. The minimum fuel mass at landing is determined by substracting from the mission fuel mass the trip fuel mass (containing all flight segments) and the taxi fuel mass before the take-off. If no mission information is available, the minimum design fuel mass at landing is calculated by multiplying the design fuel mass at takeoff with factors for the contingency fuel, alternate fuel and the final fuel reserve.
With the knowledge about the OEM, the design payload mass and the design fuel masses at different points during flight, the total design masses of the aircraft at specific times can be calculated:
- ***design mass mission*** (the mass of the aircraft in the parking position before the start) $design\_mass\_mission = OEM + design\_fuel\_mass\_mission + design\_payload\_mass. $
- ***design mass at take-off*** (equal with the MTOM and to the ***design mass*** written in the acxml)
- ***design mass at midflight***
- ***design mass at landing***
- The **Maximum Landing Mass (MLM)** is the maximum mass at which the pilot of the aircraft is allowed to attempt to land due to structural or other limits.
Two calculation modes are available:
- based on the mission information and the consumed fuel during flight (`default method`):
$MLM = OEM + design\_fuel\_mass\_landing + design\_payload\_mass $
- via the `RWTH regression method`: This calculation uses different formulas depending on whether the maximum takeoff mass exceeds a threshold value of 15,000 kg.
1. For Aircraft with *MTOM > 15,000 kg* the following empirical formula is used:
$MLM = 1.9689 \times MTOM^{0.9248}$
2. For Aircraft with *MTOM ≤ 15,000 kg* a linear approximation is used:
$MLM = 0.9009 \times MTOM + 410.85 $
Additionally, two masses are calculated for the case that the aircraft flies either with maximum payload mass or with maximum fuel mass. In both cases the difference up to MTOM is completed with fuel or payload respectively. Based on the loading diagramm, the masses at the most forward and most aft CG positions are also determined.
---
## Center of Gravity {#cg}
The knowledge of the center of gravity (CG) position and movement is necessary to ensure the static stability and controllability of the aircraft on the ground and in the air. Based on the results of the detailed mass breakdown of the components with their _mass properties_ information, the total center of gravity of the aircraft can now be determined. The position of the overall CG can generally be determined from the position of the individual centers of gravity w.r.t. a global reference point.
The calculation involves determining the weighted average of the CG positions for all components. For each axis (_x, y ,z_), the function sums the scaled masses, which are the product of a component’s mass and its CG coordinate for the respective axis. This sum is then divided by the total mass of all components to yield the final CG coordinate for that axis. The global center of gravity ($ \text{CG} $) for a specific axis ($ \text{ax} $) is calculated as:
$
\text{CG}_{\text{ax}} = \frac{\sum_{i=1}^n (m_i \cdot x_i)}{\sum_{i=1}^n m_i}
$
Where:
- $ m_i $ is the mass of the $ i $-th component.
- $ x_i $ is the coordinate of the $ i $-th component along the $ \text{ax} $.
- $ n $ is the total number of components.
> [!NOTE]
> It is often common to specify the center of gravity as %MAC.
### Center of Gravity Shift and the Loading Diagramm
The various operational centre of gravity positions must always be within a range limited by safe operation. Since different loading and mission conditions can occur, proof of admissibility must be provided independently for each one. Possible extreme variants can be found in the following matrix:
| **Loading case** | Mass | Fuel | Payload |
|---------------------------------|-----------|-----------|-----------|
| Design mission | MTOM | design | design |
| Ferry range mission | FRM | maximum | 0 |
| | MZFM | 0 | maximum |
| | MTOM | rest | maximum |
| | MTOM | maximum | rest |
The loadind diagramm is used to display the permissible range of aircraft mass and CG positions, accounting for CG migration during loading and unloading. The shift in the CG is crucial for evaluating different loading cases from which potential loading restrictions can be determined.
Below is a detailed breakdown of idealized key loading processes and their effects on the CG used to construct the loading diagramm. Given the vast number of possible loading combinations and scenarios, a pre-selection of critical cases—often configuration-dependent— has been made to reduce complexity. The following loading scenarios are considered within UNICADO:
**1. Passenger Boarding**
- Critical Scenario: Boarding passengers in a _front-to-rear_ or _rear-to-front_ sequence. These sequences represent extreme cases and can significantly affect the CG position.
- Realistic Scenario: Passengers boarding with free seat selection, typically filling _window seats first, followed by middle and aisle seats_. This simulates common boarding patterns and provides a practical estimation of CG shifts.
**2. Loading of Baggage and Cargo**
- For aircraft with similarly sized forward and aft cargo holds, the CG can be deliberately influenced by distributing containers or pallets to achieve a CG favorable for cruise flight. For rear-engine aircraft, the larger cargo hold is typically located forward of the wings. The loading scenario for cargo assumes a symmetric _front-to-rear_ or _rear-to-front_ loading sequence.
**3. Refueling**
- Low-/Mid-Wing Aircraft: Fuel is loaded in the following order: inner tank → outer tank → central or fuselage tanks.
- High-Wing Aircraft: Fuel is loaded in reverse: outer tank → inner tank → central or fuselage tanks.
> [!NOTE]
> It is assumed that the tanks are filled up symmetrically in the mentioned order up to the maximum capacity of each tank with the fuel mass calculated based on the mission information.
**4. Defueling (Fuel Consumption During Flight)**
- Low-/Mid-Wing Aircraft:
- Fuel is consumed in the order: central or fuselage tanks → inner tank → outer tank.
- High-Wing Aircraft:
- Fuel is consumed in the reverse order: central or fuselage tanks → inner tank → outer tank.
> [!NOTE]
> For the moment only the loading case 3 - 1 - 2 - 4 is implemented. The different selection of the loading scenarios can be made in the _weight\_and\_balance\_analysis\_conf.xml_ file.
Finally, the **most forward and most aft _x_-CG positions** and the corresponding masses are depicted from the resulting diagramm.
---
## Mass Moments of Inertia {#inertia}
Inertia forces arise from the tendency of mass to resist accelerations. For rotational accelerations, these forces are represented by the **mass moment of inertia** terms.These are critical parameters in the analysis and design of aircraft, as they determine the rotational dynamics about the principal axes: roll, pitch, and yaw. These values influence stability, control responsiveness, and handling qualities. The moments of inertia are calculated relative to an axis and depend on the mass distribution of the aircraft. The cross products of inertia (e.g., $ I_{xy} $) arise when the axes are not aligned with the principal axes of the mass distribution.
In this context the mass moments of inertia about the three principal axes
- $ I_{xx} $: About the roll axis
- $ I_{yy} $: About the pitch axis
- $ I_{zz} $: About the yaw axis
> [!NOTE]
> The mass moments of inertia are calculated only for the total masses.
are determined determined by means of the following ***calculation methods:***
#### 1. Using Raymer's Empirical Equations
*Raymer* provides empirical formulas to estimate the moments of inertia based on the aircraft's geometry and mass distribution. These equations are derived from historical data based on nondimensional radii of gyration ($ R_x $, $ R_y $, $ R_z $) and are suitable for early design phases where detailed component-level data may not be available. The mass moments of inertia are given as follows:
- **Roll**: $I_{xx} = \frac{b^2 M R_x^2}{4} \cdot f_{xx}$
- **Pitch**: $I_{yy} = \frac{l^2 M R_y^2}{4} \cdot f_{yy} $
- **Yaw:** $I_{zz} = \frac{\left( \frac{b + l}{2} \right)^2 M R_z^2}{4}$
Where:
- $ b $: Wingspan
- $ l $: Fuselage length
- $ M $: Aircraft mass
- $f_{xx}$ and $f_{yy}$: Technology factors set to $1.25$ respectively $1.15$
- $ R_x, R_y, R_z $: Nondimensional radii of gyration. The following values are implemented:
| **Aircraft Configuration** | $ R_x $ | $ R_y $ | $ R_z $ |
|-----------------------------------------|-----------|-----------|-----------|
| Fuselage-mounted engines | 0.24 | 0.34 | 0.42 |
| 2 wing-mounted engines | 0.23 | 0.33 | 0.45 |
| 4 wing-mounted engines | 0.24 | 0.36 | 0.44 |
| Blended wing body | 0.28 | 0.40 | 0.46 |
#### 2. Using the LTH Tables (*Luftfahrttechnisches Handbuch*)
The LTH provides tabulated values and empirical methods specific to various aircraft configurations. These tables account for typical mass distributions and structural layouts. They are more accurate than Raymer’s approach but require knowledge of the specific aircraft class and design. The `calculate_inertia_by_lth_method` function is tailored specifically for conventional tube-and-wing configurations. This method uses aircraft mass properties like the OEM, the payload mass ($m_{payload}$) and the fuel mass ($m_{fuel}$) and geometric dimensions such as wing span $b$ and fuselage length $l$. All cross-product terms ($I_{xy}$, $I_{xz}$, etc.) are set to $0$, assuming symmetry.
The mass moments of inertia around the principal axes are given as follows:
- **Roll**:
$
I_{xx} = f_{xx} \cdot K_x^2 \cdot b^2 \cdot m_m
$
- **Pitch**:
$
I_{yy} = f_{yy} \cdot K_y^2 \cdot l^2 \cdot m_m
$
- **Yaw**:
$
I_{zz} = 0.96 \cdot (I_{xx} + I_{yy})
$
Here, $f_{xx}$ and $f_{yy}$ are technology factors set to $0.8$ respectively $0.9$. The expected mass $M$ and the scaling factors $K_x$ and $K_y$, derived from empirical LTH tables, are defined as:
$ M = OME + m_{payload} + m_{fuel} $
$ K_x = \frac{1}{12} \left( \left[ - \frac{2}{3} \cdot \left(\frac{M}{OME}- 1\right) + \frac{m_{fuel}}{OME} \right] +1 \right) + 0.065 $
$ K_y = -\frac{0.065}{1.72} \left[ 0.2 \cdot \left(\frac{M}{OME}- 1\right) + \frac{m_{fuel}}{OME} \right] + 0.2025 $
#### 3. Using the Component's Inertia
This method involves calculating the total inertia tensor of the aircraft based on its components' individual mass properties. For each inertia component ($I_{xx}$, $I_{xy}$, etc.), the function adds the component's intrinsic inertia and the inertia due to its offset from the reference CG (using the Steiner theorem). The mass moments of inertia are given exemplary
- around the principal axes ($I_{xx}$, $I_{yy}$,$I_{zz}$):
$
I_{xx} = \sum (I_{xx},{\text{component}} + m_{\text{component}} \cdot (p^2 + q^2))
$
- around the deviation axes (cross-product terms $I_{xy}$, $I_{xz}$, etc.):
$
I_{xy} = \sum (I_{xy},{\text{component}} + m_{\text{component}} \cdot -(p \cdot q))
$
with $p$ and $q$ representing the relative distances between the reference center of gravity (CG) and the current component's CG along the specified axes. Specifically:
- $ p $: The distance along the first axis (e.g., x, y, or z).
- $ q $: The distance along the second axis (e.g., x, y, or z).
> [!NOTE]
> The component's moments of inertia, if available, are calculated in the component's design modules. Otherwise, these are 0.
# Introduction {#mainpage}
The aircraft’s mass plays a crucial role in determining flight performance and evaluating the design, with the ultimate goal being to minimize the operating empty mass. 🏋️‍♀️ Knowing individual masses is essential for calculating the center of gravity (CG) and determining the placement of critical components like the landing gear and wings. ✈️ The CG significantly affects the aircraft's stability and controllability. An improperly located CG can compromise flight safety, requiring careful planning to ensure it remains within allowable limits throughout the flight, including during fuel consumption and payload variations. This analysis is typically conducted through a weight and balance evaluation using a loading diagram :chart_with_upwards_trend:, which defines the permissible range for combinations of aircraft mass and CG positions. Mass considerations are also fundamental to cost estimation. As an aircraft’s mass increases, it requires more lift, which leads to higher drag, increased thrust demands, elevated fuel consumption, and ultimately greater fuel and operating costs. 💸
In UNICADO, the _weight\_and\_balance_analysis_ tool is used to compute the aircraft's masses, determine the CG positions, calculate mass moments of inertia, and generate the loading diagram. The terms "mass" and "weight" are often used interchangeably in aircraft design, though they are scientifically distinct. In this context, both terms are used to refer to the aircraft's mass.
## A User's Guide to Weight & Balance Analysis
This user documentation will guide you through all necessary steps to understand the tool as well as the necessary inputs and configurations to calculate the aircraft masses, CG positions, aircraft's moments of inertia and determine the loading diagramm with the most forward and most aft CG positions.
The following pages will guide you through the theory behind and the process of computing and analysing the weight and balance within UNICADO:
- [Basic Concepts](basic-concepts.md)
- [Usage of the Weight & Balance Analysis Tool](usage.md)
So let's get started! 💪
## 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:
- [Developer Guide](https://unicado.pages.rwth-aachen.de/unicado.gitlab.io/developer/developer-installation/)
- [Build Instructions](https://unicado.pages.rwth-aachen.de/unicado.gitlab.io/developer/build/general/)
- [How to Python in UNICADO](https://unicado.pages.rwth-aachen.de/unicado.gitlab.io/developer/style/python-modularization/)
- [Weight & Balance Analysis Tool Structure](usage.md)
We appreciate it!
# Usage of the Weight & Balance Analysis Tool {#usage}
Let's see now how the magic happens. In this guide we will go through the step-by-step process of running the weight and balance (w&b) analysis tool. The different possible execution modes and calculation methods are listed. Tool dependencies between the w&b analysis tool and other UNICADO modules are described, including necessary tool inputs and generated outputs. While we navigate through this guide we will find the answers to the following questions:
- [Requirements](#requirements) - What is necessary to get the tool running?
- [Tool Structure](#architecture) - How is the tool built and which files are relevant for me as an user?
- [Configuration File](#module-configuration-file) - What is with this _weight\_and\_balance\_analysis\_conf.xml_ file?
- [Method Selection](#method-selection) - Where to find and how to select the calculation methodes and execution modes described in the [Basic Concepts](basic-concepts.md)?
- [Tool Execution](#tool) - How to start the tool and what happens then?
- [Troubleshooting](#trouble) - What do I do if the tool is not working?
---
## Requirements {#requirements}
The following requirements are needed for the tool to run:
1. **First**, it is assumed that you have the UNICADO *package* installed including the executables, the database, and the UNICADO *libraries*.
2. As the w&b analysis tool is an analysis tool, the **second requirement** is that the ***sizing modules***, as well that the ***aerodynamic analysis*** and ***mission analysis*** tools were successfully executed beforehand and that the results are written in the Aircraft Exchange File (acXML). The following information must be available (the subcomponents of the required nodes are not listed here):
- `aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements`: `maximum_structrual_payload_mass`
- `aircraft_exchange_file/requirements_and_specifications/design_specification`: `configuration`, `transport_task`, `energy_carriers`
- `aircraft_exchange_file/component_design` : the `global_reference_point` and the components `wing`, `empennage`, `tank`, `propulsion`, `landing gear`, `systems` each at least with the nodes `position` and `mass_properties`
- `aircraft_exchange_file/analysis/aerodynamics/reference_values`: `neutral_point`
- `aircraft_exchange_file/analysis/masses_cg_inertia`: `maximum_takeoff_mass`
- `aircraft_exchange_file/analysis/mission/design_mission`: `loaded_mission_energy`, `in_flight_energy`, `taxi_energy`
> [!NOTE]
> When the UNICADO workflow is executed the tool is run automatically. In this case, all the required data should be available anyway.
3. The `aircraft_exchange_file_name` and `aircraft_exchange_file_directory` are correctly set in the `control settings` part of the _weight\_and\_balance\_analysis\_conf.xml_ file (configXML). The `console_output` should be set at least to `mode_1`.
4. The structure of the acXML remains unchanged, otherwise the paths to the nodes must be updated in the data reading functions of the tool.
___
## Tool Structure {#architecture}
<pre class='mermaid'>
graph LR;
A[W & B Analysis] -->B[Tube and Wing _datapostprocessing.py_ _datapreprocessing.py_];
B-->C[Standard];
C-->D[Basic _methodbasic.py_]
C-->E[General _methodplot.py_ _methodhtmlreport.py_]
C-->H[_usermethoddatapreparation.py_]
A-->F[Blended Wing body - _under development_]
A-->G[_weight\_and\_balance\_analysis\_conf.xml_ _main.py_ _weight_and_balance_analysis.txt_ ]
A-->I[doc]
</pre>
@important Since the documentation might be delayed to the development progress - this graph might not have all information yet.
Let's break down the tool structure and see what happens in the most relevant files:
## Configuration File {#module-configuration-file}
The _weight\_and\_balance\_analysis\_conf.xml_ 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
!!! note
If the tool is executed via the workflow, those settings are set by the workflow settings.
## Method Selection {#method-selection}
By changing the program settings im the configXML we can manipulate how the w&b analysis tool is running. The program settings are structured like this:
```xml
<program_settings description="program settings">
<tube_and_wing description="Weight and balance analysis">
<category description="Category name">
<value>standard</value>
</category>
<standard description="Standard weight and balance">
<method description="Method name">
<value>basic</value>
</method>
<basic description="Basic configuration">
<calculation_methods description="Calculation methods for basic configuration">
<inertia description="Selector for the calculation method of the mass moments of inertia. Selector: mode_0 (by_lth_table) / mode_1 (by_components) / mode_2 (by_Raymer)">
<method description="selected method">
<value>mode_0</value>
</method>
</inertia>
<aircraft_type description="Aircraft configuration for determination of the nondimensional radii of gyration by Raymer. Selector: blended_wing / jet_fuselage_eng / jet_two_wing_eng / jet_four_wing_eng">
<value>jet_two_wing_eng</value>
</aircraft_type>
<maximum_landing_mass description="Selector for the calculation method of the maximum landing mass. Selector: mode_0 (OME + Payload + Reserve_fuel) / mode_1 (by_regression_RWTH)">
<method description="selected method">
<value>mode_0</value>
</method>
</maximum_landing_mass>
<refueling_mode description="Selector to specify if refueling should be done for the design or ferry range mission. Selector: mode_0 (design mission) / mode_1 (ferry range)">
<method description="selected method">
<value>mode_0</value>
</method>
</refueling_mode>
<defueling_mode description="Selector to specify if defueling should be considered or not in the loading diagramm. Selector: mode_0: not active / mode_1: active">
<method description="selected method">
<value>mode_1</value>
</method>
</defueling_mode>
<passengers_boarding_mode description="Selector to specify the order how the passengers occupy the seats. Selector: mode_0 (each row at a time) / mode_1 (from window to aisle)">
<method description="selected method">
<value>mode_0</value>
</method>
</passengers_boarding_mode>
</calculation_methods>
</basic>
</standard>
</tube_and_wing>
</program_settings>
```
In this part of the configXML we can select the calculation methods and aircraft configuration for the inertia, the maximum landing mass and the modes for the loading scenarios. Each mode has a description and the selection is made by changing the respective `value`. Most of the default modes coming with the package are set to `mode_0`. This means that:
- the mass moments of inertia are calculated using the LTH Tables
- the maximum landing mass is calculated based on the mission information and the consumed fuel during flight
- the selected scenario for refueling is to fill up the tanks with the fuel for the design mission
- the passengers should board each row at a time from the front to back and back to front
- the cg shift due to defueling (fuel consumption during flight) should also be considered in the loading diagramm
## Tool Execution {#tool}
Once the desired methods are selected and the requirements are in place, the tool can run. In order to start the w&b analysis tool, we can execute it directly from the console if all paths are set (see [How to run a tool](howToRunATool.md)) or run the _main.py_ inside the tool folder.
Following will happen:
- First, the necessary data and paths are acquired with ***datapreprocessing.py*** and ***usermethoddatapreparation.py***
- Then the ***methodbasic.py*** is executed and you see the output in the console window: The mass properties of the components are first read, then the total masses are calculated, afterwards the cg shift due to refueling, passangers boarding, cargo loading and finally defueling is determined together with the most fwd and aft CG positions
- Next, the calculated data is postprocessed and the outputs are written to the acXML with ***datapostprocessing.py*** and ***usermethoddatapreparation.py***
- the loading cases and the loading diagram are plotted inside ***methodplot.py***
- a HTML report is created by ***methodhtmlreport.py*** in the directory of `aircraft_exchange_file_directory`. It contains a detailed mass breakdown and the generated plots.
The following results are saved in the acXML under `aircraft_exchange_file/analysis/masses_cg_inertia`:
```xml
<analysis>
<masses_cg_inertia description="Masses, Center of Gravity, Inertias." tool_level="3">
<maximum_takeoff_mass description="MTOM">
<mass_properties description="maximum takeoff mass properties">
<inertia description="Inertia with regard to the total center of gravity.">
<j_xx description="Inertia in x.">
</j_xx>
<j_yy description="Inertia in y.">
</j_yy>
<j_zz description="Inertia in z.">
</j_zz>
<j_xy description="Inertia in xy.">
</j_xy>
<j_xz description="Inertia in xz.">
</j_xz>
<j_yx description="Inertia in yx.">
</j_yx>
<j_yz description="Inertia in yz.">
</j_yz>
<j_zx description="Inertia in zx.">
</j_zx>
<j_zy description="Inertia in zy.">
</j_zy>
</inertia>
<center_of_gravity description="Center of gravity w.r.t global coordinate system.">
<x description="Center of gravity in x-direction with regard to the global reference point.">
</x>
<y description="Center of gravity in y-direction with regard to the global reference point.">
</y>
<z description="Center of gravity in z-direction with regard to the global reference point.">
</z>
</center_of_gravity>
<mass description="Mass">
</mass>
</mass_properties>
</maximum_takeoff_mass>
<operating_mass_empty description="OME">
</operating_mass_empty>
<manufacturer_mass_empty description="MME">
</manufacturer_mass_empty>
<maximum_zero_fuel_mass description="MZFM">
</maximum_zero_fuel_mass>
<maximum_payload_mass description="">
</maximum_payload_mass>
<maximum_landing_mass description="MLM">
</maximum_landing_mass>
<maximum_fuel_mass description="">
</maximum_fuel_mass>
<ferry_range_mass description="">
</ferry_range_mass>
<most_forward_mass description="">
</most_forward_mass>
<most_afterward_mass description="">
</most_afterward_mass>
<design_mass description="">
</design_mass>
<design_fuel_mass description="">
</design_fuel_mass>
</masses_cg_inertia>
```
> [!TIP]
> If you are missing some of the terms in here - take a look at [basic concepts](basic-concepts.md).
---
## Troubleshooting {#trouble}
If the tool does not run properly:
- Make sure you have all the paths set up correctly and the specified elements exist
- Go through the log file `weight_and_balance_analysis.txt` and check for warnings and critical messages.
## Soo ... Now it is your turn to carry the weight!
\ No newline at end of file
......@@ -8,7 +8,7 @@ date: 2024-11-28
glightbox: false
---
As mentioned in the [build instructions](../developer/build/general.md), we have some external dependencies to:
As mentioned in the [build instructions](../get-involved/build/general.md), we have some external dependencies to:
- :simple-cplusplus: [Eigen3 :octicons-link-external-16:](https://eigen.tuxfamily.org/index.php?title=Main_Page){:target="_blank"}
- :simple-cplusplus: [Boost :octicons-link-external-16:](https://www.boost.org/){:target="_blank"}
......@@ -17,7 +17,7 @@ As mentioned in the [build instructions](../developer/build/general.md), we have
!!! note
Currently, only `aircraftGeometry2` and `engine` are documented.
Currently, only `aircraftGeometry2` is documented.
## aerodynamics
![Icon](../assets/images/documentation/aerodynamics.svg){.overview-img align=left}
......@@ -27,7 +27,7 @@ It has helper functions to extract and interpolate data of provided airfoil pola
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link]()|-|
|2.1.0|:simple-cplusplus: |GPLv3|-|-|
---
......@@ -39,7 +39,7 @@ The modularity and flexibility is achieved by using the high performance [Comput
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link](aircraftGeometry2/index.html)| [Eigen3](https://eigen.tuxfamily.org/index.php?title=Main_Page), [CGAL](https://www.cgal.org/)|
|2.1.0|:simple-cplusplus: |GPLv3|[Link](libraries/aircraftGeometry2/index.md)| [Eigen3](https://eigen.tuxfamily.org/index.php?title=Main_Page), [CGAL](https://www.cgal.org/)|
---
......@@ -50,7 +50,7 @@ The **airfoils** libary provides a database for different airfoils.
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|1.0.0|:simple-cplusplus: |GPLv3|[Link]()|-|
|1.0.0|:simple-cplusplus: |GPLv3|-|-|
---
......@@ -62,7 +62,7 @@ It uses a simple XML library, namely *tinyxml*, to read and parse the XML files.
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link]()|-|
|2.1.0|:simple-cplusplus: |GPLv3|-|-|
---
......@@ -74,7 +74,7 @@ You can set different atmospheric conditions (e.g. *ISA+25*) and calculate the p
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link]()||
|2.1.0|:simple-cplusplus: |GPLv3|-||
---
......@@ -85,7 +85,7 @@ The **blackboxTest** library provides an interface to run a complete module with
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link]()|[googleTest](https://google.github.io/googletest/)|
|2.1.0|:simple-cplusplus: |GPLv3|-|[googleTest](https://google.github.io/googletest/)|
---
......@@ -98,7 +98,7 @@ The engine decks can originate from different softwaretools as long as they prov
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link](engine/index.html)|-|
|2.1.0|:simple-cplusplus: |GPLv3|-|-|
---
......@@ -118,7 +118,7 @@ It has helper functions to extract and interpolate data of the results from the
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link]()|-|
|2.1.0|:simple-cplusplus: |GPLv3|-|-|
---
......@@ -131,7 +131,7 @@ The library gives a template how modules should be structured and gives helpers
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link]()|-|
|2.1.0|:simple-cplusplus: |GPLv3|-|-|
---
......@@ -142,7 +142,7 @@ This library provides standardized UNICADO data preprocessing, run, and postproc
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|1.0.0|:simple-python: |GPLv3|[Link]()|-|
|1.0.0|:simple-python: |GPLv3|-|-|
---
......@@ -154,7 +154,7 @@ In provides custom output streams, which automatically handle the log files and
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link]()|-|
|2.1.0|:simple-cplusplus: |GPLv3|-|-|
---
......@@ -167,7 +167,7 @@ The library can handle *UNIX* and *Windows* systems alike.
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link]()|-|
|2.1.0|:simple-cplusplus: |GPLv3|-|-|
!!! warning
Some functions of this library are a bit outdated! When using this library, please look first at the wonderful [STL :octicons-link-external-16:](https://en.cppreference.com/w/) whether the function you are seeking is already there.
......@@ -196,4 +196,4 @@ In addition, it defines some common **constants** which are useful for calculati
|Module Version|Language|License|Documentation|Dependencies|
|:---:|:---:|:---:|---|---|
|2.1.0|:simple-cplusplus: |GPLv3|[Link]()|-|
|2.1.0|:simple-cplusplus: |GPLv3|-|-|
docs/documentation/libraries/aircraftGeometry2/figures/Tutorial/airfoil_surface.png

131 B

docs/documentation/libraries/aircraftGeometry2/figures/Tutorial/spar.png

132 B

docs/documentation/libraries/aircraftGeometry2/figures/Tutorial/step001.png

131 B

docs/documentation/libraries/aircraftGeometry2/figures/Tutorial/step003.png

131 B

docs/documentation/libraries/aircraftGeometry2/figures/Tutorial/step004.png

131 B

docs/documentation/libraries/aircraftGeometry2/figures/Tutorial/step005.png

131 B

docs/documentation/libraries/aircraftGeometry2/figures/Tutorial/step006.png

131 B

docs/documentation/libraries/aircraftGeometry2/figures/Tutorial/step007.png

131 B

docs/documentation/libraries/aircraftGeometry2/figures/class_diagram.png

131 B

@startuml class_diagram
title Class Diagram aircraftGeometry2
caption (c) 2024 UNICADO
hide empty members
entity Entity3D {
+ string name
+ Point_3 origin
+ Direction_3 normal
+ double rotation_z
}
interface Section {
# Aff_transformation_2 scale
# Aff_transformation_2 rotate
# Polygon_2 contour
+ get_contour()
+ set_contour()
+ size()
}
class PolygonSection {
+ set_width()
+ set_height()
+ set_beta_angle()
+ set_scale()
}
interface SectionBuilder <<SectionType>> {
# vector<SectionType> sections
+ get_result()
+ peek()
+ insert_back()
+ arrange()
}
class PolygonBuilder <<PolygonSection>> {
}
class AirfoilBuilder <<AirfoilSection>> {
}
annotation build {
+ ellipse()
}
class "AirfoilSection" as Airfoil {
+ set_chord_length()
+ set_dihedral_angle()
+ set_twist_angle()
+ scale_thickness()
+ get_chord_length()
+ get_thickness_scale()
}
interface MultisectionSurface <<SectionType>> {
+ vector<SectionType> sections
+ bool is_symmetric
}
class "MultisectionSurface" as tube <<PolygonSection>> {
}
class "MultisectionSurface" as lift <<Airfoil>> {
}
annotation Measure {
+ area()
+ bottom()
+ center()
+ centroid()
+ centroids()
+ height()
+ height_max()
+ inertia()
+ left()
+ length()
+ right()
+ top()
+ volume()
+ width()
+ width_max()
}
annotation "Measure" as meas_airfoil {
+ area()
+ aspect_ratio()
+ centroid()
+ centroids()
+ chord()
+ dihedral()
+ mean_aerodynamic_chord()
+ mean_aerodynamic_chord_position()
+ inertia()
+ offset_LE()
+ reference_area()
+ span()
+ sweep()
+ taper_ratio()
+ thickness()
+ thickness_max()
+ top_and_bottom()
+ volume()
}
annotation Transform {
+ to_parent()
+ to_local()
+ to_mesh()
+ get_reflection_point_top()
+ get_reflection_point_bottom()
+ outline_3d()
+ outline_2d()
+ resample()
}
annotation "Transform" as transform_sepcific {
+ to_absolute()
}
Measure -> tube
tube <- build
Section <--- Transform
Transform -> Entity3D
PolygonSection <-- transform_sepcific
Airfoil <-- transform_sepcific
lift <- meas_airfoil
Section --|> Entity3D
PolygonSection ---|> Section
Airfoil ---|> Section
tube *-- PolygonSection
MultisectionSurface --|> Entity3D
tube ----|> MultisectionSurface
lift ----|> MultisectionSurface
lift *-- Airfoil
PolygonBuilder ---|> SectionBuilder
PolygonBuilder *--- PolygonSection
AirfoilBuilder ---|> SectionBuilder
AirfoilBuilder *--- Airfoil
package convert <<frame>>
{
interface converter as "Converter" <<ReturnType>> {
+ operator()(Hull surface) -> ReturnType
+ operator()(Fuselage surface) -> ReturnType
+ operator()(AirfoilSurface surface) -> ReturnType
+ operator()(Wing surface) -> ReturnType
+ operator()(Spar surface) -> ReturnType
+ operator()(ControlDevice surface) -> ReturnType
}
class aixml_converter as "AixmlConverter" <<std::shared_ptr<node>>> {
- node* parent
- insert_string()
- insert_point()
- insert_direction()
}
MultisectionSurface --* Hull
MultisectionSurface --* Fuselage
MultisectionSurface --* AirfoilSurface
MultisectionSurface --* Wing
MultisectionSurface --* Spar
MultisectionSurface --* ControlDevice
Hull --* converter
Fuselage --* converter
AirfoilSurface --* converter
Wing --* converter
Spar --* converter
ControlDevice --* converter
converter <|- aixml_converter
}
package factory <<frame>>
{
interface Factory <<SurfaceType>> {
- unique_ptr<SurfaceBuilder> builder
+ Factory( std::shared_ptr<node> input, data_dir )
+ create( name ) -> SurfaceType = 0
}
interface SurfaceBuilder {
+ build_hull( name ) = 0
+ build_airfoil_surface( name ) = 0
+ build_fuselage( name ) = 0
+ build_spar( name ) = 0
+ build_control_device( name ) = 0
+ build_wing( name ) = 0
}
class HullFactory <<InputType>> {
+ HullFactory( InputType input, data_dir )
+ create( name ) -> MultisectionSurface<PolygonSection>
}
class FuselageFactory <<InputType>> {
+ FuselageFactory( InputType input, data_dir )
+ create( name ) -> MultisectionSurface<PolygonSection>
}
class SparFactory <<InputType>> {
+ SparFactory( InputType input, data_dir )
+ create( name ) -> MultisectionSurface<PolygonSection>
}
class ControlDeviceFactory <<InputType>> {
+ ControlDeviceFactory( InputType input, data_dir )
+ create( name ) -> MultisectionSurface<PolygonSection>
}
class WingFactory <<InputType>> {
+ WingFactory( InputType input, data_dir )
+ create( name ) -> MultisectionSurface<PolygonSection>
}
class AIXMLv2{
+ AIXMLv2( acxml, data_dir )
- shared_ptr<node> aircraft
- path data_dir
- get_point( id )
' - get_surface_description( id ) = 0
' - build_first_segment() = 0
' - build_segment() = 0
}
class AIXMLv3{
- shared_ptr<node> aircraft
- path data_dir
+ AIXMLv3( acxml, data_dir )
- get_point( id )
- get_direction( id )
}
Factory *---- MultisectionSurface
SurfaceBuilder *---- MultisectionSurface
HullFactory ---|> Factory
FuselageFactory ---|> Factory
SparFactory ---|> Factory
ControlDeviceFactory ---|> Factory
WingFactory ---|> Factory
Factory *- SurfaceBuilder
AIXMLv2 --|> SurfaceBuilder
AIXMLv3 --|> SurfaceBuilder
}
@enduml
docs/documentation/libraries/aircraftGeometry2/figures/coordinate_example.png

130 B

This diff is collapsed.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg1"
width="281.14801"
height="337.28799"
viewBox="0 0 281.14801 337.28799"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="g1">
<path
id="path1"
d="m 56.69362,0 5.66926,85.04042 22.67754,85.04044 h 28.34682 L 136.06476,85.04042 141.73404,0 Z"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path2"
d="m 62.36288,85.04042 h 73.70188"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path3"
d="m 57.6899,0 c 0,0.55023 -0.44605,0.99628 -0.99628,0.99628 -0.55025,0 -0.99628,-0.44605 -0.99628,-0.99628 0,-0.55023 0.44603,-0.99628 0.99628,-0.99628 0.55023,0 0.99628,0.44605 0.99628,0.99628 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path4"
d="m 63.35916,85.04042 c 0,0.55023 -0.44604,0.99628 -0.99628,0.99628 -0.55023,0 -0.99627,-0.44605 -0.99627,-0.99628 0,-0.55023 0.44604,-0.99628 0.99627,-0.99628 0.55024,0 0.99628,0.44605 0.99628,0.99628 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path5"
d="m 86.0367,170.08086 c 0,0.55023 -0.44605,0.99627 -0.99628,0.99627 -0.55023,0 -0.99628,-0.44604 -0.99628,-0.99627 0,-0.55025 0.44605,-0.99628 0.99628,-0.99628 0.55023,0 0.99628,0.44603 0.99628,0.99628 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path6"
d="m 142.73032,0 c 0,0.55023 -0.44605,0.99628 -0.99628,0.99628 -0.55024,0 -0.99628,-0.44605 -0.99628,-0.99628 0,-0.55023 0.44604,-0.99628 0.99628,-0.99628 0.55023,0 0.99628,0.44605 0.99628,0.99628 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path7"
d="m 137.06104,85.04042 c 0,0.55023 -0.44605,0.99628 -0.99628,0.99628 -0.55025,0 -0.99628,-0.44605 -0.99628,-0.99628 0,-0.55023 0.44603,-0.99628 0.99628,-0.99628 0.55023,0 0.99628,0.44605 0.99628,0.99628 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path8"
d="m 114.38351,170.08086 c 0,0.55023 -0.44604,0.99627 -0.99627,0.99627 -0.55025,0 -0.99628,-0.44604 -0.99628,-0.99627 0,-0.55025 0.44603,-0.99628 0.99628,-0.99628 0.55023,0 0.99627,0.44603 0.99627,0.99628 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<g
id="g8"
aria-label="p&#10;1"
transform="matrix(1.3333333,0,0,1.3333333,178.744,274.492)">
<path
id="path9"
d="m 0.44395313,1.2188906 c -0.0820313,0.3398438 -0.09375,0.4101563 -0.5390625,0.4101563 -0.1171875,0 -0.22265625,0 -0.22265625,0.1875 0,0.082031 0.046875,0.1171875 0.12890625,0.1171875 0.26953125,0 0.55078125,-0.035156 0.83203125,-0.035156 0.328125,0 0.66796872,0.035156 0.98437502,0.035156 0.058594,0 0.1875,0 0.1875,-0.1992188 0,-0.1054687 -0.1054688,-0.1054687 -0.2460938,-0.1054687 -0.4921875,0 -0.4921875,-0.070312 -0.4921875,-0.1640625 0,-0.1171875 0.421875,-1.74609378 0.4804688,-1.99218753 0.140625,0.29296875 0.4101562,0.6328125 0.9257812,0.6328125 1.1484375,0 2.4023438,-1.45312497 2.4023438,-2.91796877 0,-0.9375 -0.5742188,-1.59375 -1.3359375,-1.59375 -0.4921875,0 -0.9726563,0.3632813 -1.3007813,0.75 -0.09375,-0.5390625 -0.5273437,-0.75 -0.890625,-0.75 -0.45703122,0 -0.65624997,0.3867188 -0.73828122,0.5742188 -0.1875,0.3398437 -0.31640625,0.9375 -0.31640625,0.9609375 0,0.1054687 0.10546875,0.1054687 0.12890625,0.1054687 0.09375,0 0.10546875,-0.011719 0.1640625,-0.234375 0.1640625,-0.703125 0.36328125,-1.1835937 0.72656252,-1.1835937 0.1757812,0 0.3046875,0.082031 0.3046875,0.4570312 0,0.234375 -0.023437,0.3398438 -0.070312,0.5039063 z M 2.2017656,-3.1053281 c 0.070312,-0.2695313 0.3398438,-0.5507813 0.515625,-0.703125 0.3515625,-0.3046875 0.6328125,-0.375 0.8085938,-0.375 0.3984375,0 0.6328125,0.3515625 0.6328125,0.9375 0,0.5859375 -0.328125,1.734375 -0.5039063,2.109375 -0.3398437,0.70312497 -0.8203125,1.03124997 -1.1835937,1.03124997 -0.65625,0 -0.7851563,-0.83203125 -0.7851563,-0.890625 0,-0.0234375 0,-0.0351563 0.023437,-0.16406247 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
id="path10"
d="m 7.3462969,-2.9354063 c 0,-0.1875 -0.011719,-0.1992187 -0.2109375,-0.1992187 -0.4453125,0.4335937 -1.078125,0.4453125 -1.359375,0.4453125 v 0.2460937 c 0.1640625,0 0.6210937,0 1.0078125,-0.1875 v 3.5507813 c 0,0.234375 0,0.328125 -0.6914063,0.328125 H 5.8228594 v 0.2460937 c 0.1289062,-0.011719 0.984375,-0.023437 1.2421875,-0.023437 0.2109375,0 1.0898437,0.011719 1.2421875,0.023437 V 1.2481875 H 8.0494219 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
<path
id="path11"
d="m 100.2101,0 c 0,0.55023 -0.44605,0.99628 -0.99628,0.99628 -0.55023,0 -0.99628,-0.44605 -0.99628,-0.99628 0,-0.55023 0.44605,-0.99628 0.99628,-0.99628 0.55023,0 0.99628,0.44605 0.99628,0.99628 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<g
id="g11"
aria-label="p&#10;2"
transform="matrix(1.3333333,0,0,1.3333333,178.744,161.10667)">
<path
id="path12"
d="m 0.44395313,1.2178516 c -0.0820313,0.3398437 -0.09375,0.4101562 -0.5390625,0.4101562 -0.1171875,0 -0.22265625,0 -0.22265625,0.1875 0,0.082031 0.046875,0.1171875 0.12890625,0.1171875 0.26953125,0 0.55078125,-0.035156 0.83203125,-0.035156 0.328125,0 0.66796872,0.035156 0.98437502,0.035156 0.058594,0 0.1875,0 0.1875,-0.1992187 0,-0.1054688 -0.1054688,-0.1054688 -0.2460938,-0.1054688 -0.4921875,0 -0.4921875,-0.070312 -0.4921875,-0.1640625 0,-0.1171875 0.421875,-1.74609374 0.4804688,-1.99218749 0.140625,0.29296875 0.4101562,0.6328125 0.9257812,0.6328125 1.1484375,0 2.4023438,-1.45312501 2.4023438,-2.91796871 0,-0.9375 -0.5742188,-1.59375 -1.3359375,-1.59375 -0.4921875,0 -0.9726563,0.3632812 -1.3007813,0.75 -0.09375,-0.5390625 -0.5273437,-0.75 -0.890625,-0.75 -0.45703122,0 -0.65624997,0.3867187 -0.73828122,0.5742187 -0.1875,0.3398438 -0.31640625,0.9375 -0.31640625,0.9609375 0,0.1054688 0.10546875,0.1054688 0.12890625,0.1054688 0.09375,0 0.10546875,-0.011719 0.1640625,-0.234375 0.1640625,-0.703125 0.36328125,-1.1835938 0.72656252,-1.1835938 0.1757812,0 0.3046875,0.082031 0.3046875,0.4570313 0,0.234375 -0.023437,0.3398437 -0.070312,0.5039062 z M 2.2017656,-3.1063672 c 0.070312,-0.2695312 0.3398438,-0.5507812 0.515625,-0.703125 0.3515625,-0.3046875 0.6328125,-0.375 0.8085938,-0.375 0.3984375,0 0.6328125,0.3515625 0.6328125,0.9375 0,0.5859375 -0.328125,1.734375 -0.5039063,2.109375 -0.3398437,0.70312501 -0.8203125,1.03125001 -1.1835937,1.03125001 -0.65625,0 -0.7851563,-0.83203125 -0.7851563,-0.890625 0,-0.0234375 0,-0.0351562 0.023437,-0.16406251 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
id="path13"
d="m 8.5298906,0.22761719 h -0.234375 c -0.023437,0.15234375 -0.082031,0.5625 -0.1757812,0.6328125 -0.058594,0.0351563 -0.5976563,0.0351563 -0.6914063,0.0351563 H 6.1392656 c 0.7382813,-0.64453125 0.984375,-0.84375 1.3945313,-1.171875 0.515625,-0.41015625 0.9960937,-0.84374999 0.9960937,-1.49999999 0,-0.8437501 -0.7382812,-1.3593751 -1.6289062,-1.3593751 -0.8671875,0 -1.453125,0.609375 -1.453125,1.2421876 0,0.3632813 0.3046875,0.3984375 0.375,0.3984375 0.1640625,0 0.375,-0.1171875 0.375,-0.375 0,-0.1289062 -0.058594,-0.3632812 -0.421875,-0.3632812 0.2226562,-0.5039064 0.6914062,-0.65625 1.0195312,-0.65625 0.703125,0 1.0664063,0.5507811 1.0664063,1.1132812 0,0.609375 -0.4335938,1.08984374 -0.65625,1.33593749 l -1.6875,1.66406251 c -0.070312,0.058594 -0.070312,0.070312 -0.070312,0.2695313 h 2.8828125 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
<path
id="path14"
d="m 100.2101,85.04042 c 0,0.55023 -0.44605,0.99628 -0.99628,0.99628 -0.55023,0 -0.99628,-0.44605 -0.99628,-0.99628 0,-0.55023 0.44605,-0.99628 0.99628,-0.99628 0.55023,0 0.99628,0.44605 0.99628,0.99628 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<g
id="g14"
aria-label="p&#10;3"
transform="matrix(1.3333333,0,0,1.3333333,178.744,47.72)">
<path
id="path15"
d="m 0.44395313,1.2178125 c -0.0820313,0.3398437 -0.09375,0.4101562 -0.5390625,0.4101562 -0.1171875,0 -0.22265625,0 -0.22265625,0.1875 0,0.082031 0.046875,0.1171875 0.12890625,0.1171875 0.26953125,0 0.55078125,-0.035156 0.83203125,-0.035156 0.328125,0 0.66796872,0.035156 0.98437502,0.035156 0.058594,0 0.1875,0 0.1875,-0.1992187 0,-0.1054688 -0.1054688,-0.1054688 -0.2460938,-0.1054688 -0.4921875,0 -0.4921875,-0.070312 -0.4921875,-0.1640625 0,-0.1171875 0.421875,-1.7460937 0.4804688,-1.99218745 0.140625,0.29296875 0.4101562,0.6328125 0.9257812,0.6328125 1.1484375,0 2.4023438,-1.45312505 2.4023438,-2.91796875 0,-0.9375 -0.5742188,-1.59375 -1.3359375,-1.59375 -0.4921875,0 -0.9726563,0.3632812 -1.3007813,0.75 -0.09375,-0.5390625 -0.5273437,-0.75 -0.890625,-0.75 -0.45703122,0 -0.65624997,0.3867187 -0.73828122,0.5742187 -0.1875,0.3398438 -0.31640625,0.9375 -0.31640625,0.9609375 0,0.1054688 0.10546875,0.1054688 0.12890625,0.1054688 0.09375,0 0.10546875,-0.011719 0.1640625,-0.234375 0.1640625,-0.703125 0.36328125,-1.1835938 0.72656252,-1.1835938 0.1757812,0 0.3046875,0.082031 0.3046875,0.4570313 0,0.234375 -0.023437,0.3398437 -0.070312,0.5039062 z M 2.2017656,-3.1064063 c 0.070312,-0.2695312 0.3398438,-0.5507812 0.515625,-0.703125 0.3515625,-0.3046875 0.6328125,-0.375 0.8085938,-0.375 0.3984375,0 0.6328125,0.3515625 0.6328125,0.9375 0,0.5859375 -0.328125,1.734375 -0.5039063,2.109375 -0.3398437,0.70312505 -0.8203125,1.03125005 -1.1835937,1.03125005 -0.65625,0 -0.7851563,-0.83203125 -0.7851563,-0.890625 0,-0.0234374 0,-0.0351563 0.023437,-0.16406255 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
id="path16"
d="m 6.9127031,-0.83589844 c 0.5507813,0 0.9375,0.375 0.9375,1.125 0,0.86718754 -0.5039062,1.12500004 -0.9023437,1.12500004 -0.28125,0 -0.890625,-0.082031 -1.1835938,-0.49218754 0.328125,-0.0117188 0.3984375,-0.24609375 0.3984375,-0.38671875 0,-0.22265625 -0.1640625,-0.38671875 -0.3867187,-0.38671875 -0.1875,0 -0.3867188,0.1171875 -0.3867188,0.41015625 0,0.65624999 0.7265625,1.07812499 1.5703125,1.07812499 0.9726563,0 1.640625,-0.64453124 1.640625,-1.34765624 0,-0.5390625 -0.4453125,-1.08984375 -1.21875,-1.2421875 0.7382813,-0.26953126 0.9960938,-0.79687496 0.9960938,-1.21874996 0,-0.5507813 -0.6328125,-0.9609375 -1.40625,-0.9609375 -0.7734375,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.1523437,0.3632812 0.3632812,0.3632812 0.2109375,0 0.3515625,-0.1640625 0.3515625,-0.3515625 0,-0.1992187 -0.140625,-0.3515625 -0.3515625,-0.3632812 0.234375,-0.3046875 0.7148438,-0.3867188 0.9726563,-0.3867188 0.3164062,0 0.7617187,0.1523438 0.7617187,0.7617188 0,0.2929687 -0.1054687,0.609375 -0.28125,0.8320312 -0.234375,0.2578125 -0.421875,0.28125 -0.7734375,0.2929688 -0.1757812,0.023437 -0.1875,0.023437 -0.2226562,0.023437 -0.011719,0 -0.070312,0.011719 -0.070312,0.09375 0,0.09375 0.058594,0.09375 0.1757812,0.09375 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
<path
id="path17"
d="m 100.2101,170.08086 c 0,0.55023 -0.44605,0.99627 -0.99628,0.99627 -0.55023,0 -0.99628,-0.44604 -0.99628,-0.99627 0,-0.55025 0.44605,-0.99628 0.99628,-0.99628 0.55023,0 0.99628,0.44603 0.99628,0.99628 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path18"
d="M 0,0 H 24.76025"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path19"
d="M 3.58653,0 C 2.52383,0.19925 0.797,0.797 -0.3985,1.49438 V -1.49438 C 0.797,-0.797 2.52383,-0.19925 3.58653,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,85.796333,281.54667)" />
<path
id="path20"
d="m 2.7650313,-2.5667422 1.6640625,-2.390625 H 3.5384688 L 2.3431563,-3.1643984 1.1595625,-4.9573672 H 0.25721875 L 1.9095625,-2.5315859 0.16346875,-3.359375e-4 H 1.0540938 L 2.3197188,-1.8987734 3.5619063,-3.359375e-4 h 0.9140625 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
aria-label="x"
transform="matrix(1.3333333,0,0,1.3333333,87.422667,277.07467)" />
<path
id="path21"
d="M 0,0 V 24.76025"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path22"
d="M 3.58653,0 C 2.52383,0.19925 0.797,0.797 -0.3985,1.49438 V -1.49438 C 0.797,-0.797 2.52383,-0.19925 3.58653,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(0,-1.3333333,-1.3333333,0,52.782667,248.533)" />
<path
id="path23"
d="M 4.1947422,-4.9576641 H 0.49161719 v 0.6914063 H 3.2572422 L 0.29239844,-0.71547656 V -6.328125e-4 H 4.3236484 V -0.69203906 H 1.2533359 L 4.1947422,-4.2662578 Z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
aria-label="z"
transform="matrix(1.3333333,0,0,1.3333333,57.254667,247.036)" />
<path
id="path24"
d="M 2.98883,0 C 2.98883,1.6507 1.6507,2.98883 0,2.98883 -1.6507,2.98883 -2.98883,1.6507 -2.98883,0 c 0,-1.6507 1.33813,-2.98883 2.98883,-2.98883 1.6507,0 2.98883,1.33813 2.98883,2.98883 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path25"
d="M 3.6786875,-4.9575781 2.295875,-1.1021094 1.03025,-4.9575781 H 0.1865 L 1.8622813,0.02289062 1.5575938,0.80804687 C 1.4404063,1.1596094 1.2529063,1.2885156 0.92478125,1.2885156 c -0.1171875,0 -0.24609375,-0.023437 -0.41015625,-0.058594 v 0.7148437 c 0.15234375,0.082031 0.31640625,0.1171875 0.5273438,0.1171875 0.2578125,0 0.5273437,-0.082031 0.7382812,-0.234375 C 2.0263438,1.6517969 2.1669688,1.4408594 2.3193125,1.0424219 l 2.203125,-6 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
aria-label="y"
transform="matrix(1.3333333,0,0,1.3333333,42.001333,292.58667)" />
<path
id="path26"
d="M 2.11342,2.11342 -2.11342,-2.11342"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
<path
id="path27"
d="M -2.11342,2.11342 2.11342,-2.11342"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(1.3333333,0,0,-1.3333333,52.782667,281.54667)" />
</g>
</svg>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment