====== std.aero — Flugleistung und Flugführung ======
→ [[lyx_-_programmiersprache:units|Zurück zur Unit-Übersicht]] · [[lyx_-_programmiersprache:guides:standardatmosphaere|Guide: Standardatmosphäre]] · [[lyx_-_programmiersprache:guides:mcdu|Guide: Flugführungsrechner bauen]] · [[lyx_-_programmiersprache:units:astro|std.astro]] · [[lyx_-_programmiersprache:units:geo|std.geo]]
Fünf Units, die das rechnen, was ein **Flugführungsrechner** (MCDU/FMS) an Bord ausrechnet: von der Standardatmosphäre bis zum Sinkflugbeginn, der dem Piloten als Symbol auf der Flugroute erscheint. Sie bauen aufeinander auf — ''std.aero.atmos'' ist das Fundament, ohne das jede Steig- und Sinkrechnung falsch wäre.
''std.aero'' selbst ist **keine Unit**, sondern ein Verzeichnis; importiert wird immer eine konkrete Unit wie ''std.aero.perf''.
**Autor:** Andreas Röne\\
**Copyright:** 2026 Andreas Röne\\
**Quelle:** ''std/aero/''
**Diese Units sind neu** (Compiler-Repo, 2026-09-04) und im ausgelieferten ''lyxc 1.1.18A'' **noch nicht enthalten**. Übersetzt wird derzeit nur gegen den Standardbibliotheks-Baum des Compiler-Repos. Prüflauf ''tests/aero_test.sh'': **20 PASS, 0 FAIL**.
----
===== Units im Überblick =====
^ Unit ^ Import ^ Beschreibung ^
| [[lyx_-_programmiersprache:units:aero:atmos|std.aero.atmos]] | ''import std.aero.atmos;'' | ICAO-Standardatmosphäre (zwei Schichten bis 20 km), Druck- und Dichtehöhe, QNH, Flugflächen, Übergangsfläche, Schallgeschwindigkeit, CAS/EAS/TAS/Mach **kompressibel**, Übergangshöhe |
| [[lyx_-_programmiersprache:units:aero:perf|std.aero.perf]] | ''import std.aero.perf;'' | Bahngeometrie, Zwangspunkte, Kurvengeometrie, Pseudo-Wegpunkte (T/C, T/D, DECEL), Steigen aus Energieüberschuss, Dienstgipfelhöhe, spezifische Reichweite, Breguet, W/δ-Optimalhöhe, Stufensteigflug, Cost Index, Wind, Punkt gleicher Zeit und ohne Wiederkehr |
| [[lyx_-_programmiersprache:units:aero:vnav|std.aero.vnav]] | ''import std.aero.vnav;'' | Segmentierte Steig- und Sinkprofile mit Geschwindigkeitsplan, Drift-Down, Notabstieg, Sauerstoffreichweite |
| [[lyx_-_programmiersprache:units:aero:fplan|std.aero.fplan]] | ''import std.aero.fplan;'' | Fortschreibbare Vorhersage entlang der Route (Zeit, Strecke, EFOB), Reserven nach europäischer Aufteilung, Ankunftszeit |
| [[lyx_-_programmiersprache:units:aero:holding|std.aero.holding]] | ''import std.aero.holding;'' | Warteschleifen: Einflugverfahren, ICAO-Zeiten und -Geschwindigkeiten, Rundenzeit und -verbrauch, Ausdehnung, Windkorrektur |
Abhängigkeiten: ''perf'', ''vnav'', ''fplan'' und ''holding'' bauen alle auf ''atmos'' auf; ''vnav'', ''fplan'' und ''holding'' zusätzlich auf ''perf''.
----
===== Fünf Entwurfsregeln, die durch alle Units gehen =====
Sie erklären, warum die API so aussieht, wie sie aussieht — und sind beim Lesen der einzelnen Seiten die halbe Miete.
==== 1. Die Einheit steht im Namen ====
''AvTasKtAusCasKt'' nimmt und liefert Knoten, ''AvIsaDruckPa'' liefert Pascal, ''AvDruckhoeheFt'' Fuß. Intern wird in SI gerechnet, nach außen in den Einheiten der Luftfahrt — aber an der Aufrufstelle ist sichtbar, was übergeben wird. **Ein Name ohne Einheit ist in diesen Units ein Fehler.**
==== 2. Der Fehlerwert ist NaN, nicht 0 ====
var tas: f64 := AvTasKtAusCasKt(casKt, hM, oatC);
if (AvIsError(tas)) { /* Eingabe außerhalb des Gültigkeitsbereichs */ }
0 und 1 sehen bei physikalischen Größen beide nach einem gültigen Ergebnis aus, und ein stiller Ersatzwert wandert unbemerkt in die nächste Rechnung. Eine Steigrate von 0 ist eine Aussage; eine Steigrate von 0, weil die Eingabe unsinnig war, ist eine Lüge. Geprüft wird mit ''AvIsError'' — NaN ist der einzige Wert, der sich selbst ungleich ist.
==== 3. Außerhalb des Gültigkeitsbereichs wird nicht extrapoliert ====
''atmos'' gilt für 0 bis 20 km geopotentielle Höhe und Unterschall bis Mach 1. Darüber hinaus liefert jede Funktion den Fehlerwert, statt eine Formel weiterzurechnen, die dort nicht mehr gilt.
==== 4. Musterabhängige Kennzahlen kommen vom Aufrufer ====
Gleitzahl, spezifischer Verbrauch, Schub- und Widerstandswerte, Verzögerungsvermögen, W/δ im Optimum: **alles aus dem Flughandbuch des jeweiligen Musters**, nichts eingebaut. Ein „typischer" Vorgabewert wäre für jedes andere Muster falsch und würde nirgends auffallen. Dasselbe gilt für die Reservevorschriften in ''fplan'' — sie stehen im Betriebshandbuch und unterscheiden sich je nach Betreiber.
==== 5. Vier Fragen, vier Funktionen ====
Ein FMS rechnet nicht „die" Sinkrate. Es beantwortet vier verschiedene Fragen, und wer sie verwechselt, bekommt eine Zahl, die plausibel aussieht und nicht zur Lage passt:
^ Frage ^ Funktion ^ Wovon sie abhängt ^
| Welche Rate hält einen 3°-Pfad? | ''AvSinkrateFpm'' | nur von der Grundgeschwindigkeit — reine Trigonometrie |
| Welche Rate erreicht „FL100 bei 30 NM"? | ''AvNoetigeSinkrateFpm'' | Geometrie mit Höhe und Strecke als Vorgabe |
| Wo muss der Sinkflug beginnen? | ''AvTodStreckeNm'' | Gleitzahl des Musters und Wind |
| Welche Geschwindigkeit ist wirtschaftlich? | ''AvGuenstigere'' | Cost Index — eine Optimierung, keine Geometrie |
Eine gemeinsame ''Sinkrate()'' wäre bequem und würde genau die Verwechslung einladen, um die es geht.
----
===== Die Fallen, gegen die diese Units gebaut sind =====
Jede hat in der Luftfahrt schon Zwischenfälle verursacht:
^ Falle ^ Was hier dagegen steht ^
| **Eine Flugfläche ist keine Höhe.** FL350 heißt: Höhenmesser auf 1013,25 hPa, Anzeige 35000 ft. Bei ISA−30 fehlen auf 10000 ft rund 1200 ft geometrische Höhe — im Winter fliegt man tiefer, als man denkt | Druckhöhe und wahre Höhe sind getrennte Größen mit getrennten Funktionen; ''AvWahreHoeheM'' verlangt die Temperaturabweichung als Argument |
| **TAS ist nicht CAS·√(ρ0/ρ)** — das ist EAS. Der Unterschied ist die Kompressibilität und wächst mit der Geschwindigkeit: bei 300 kt in FL350 über zehn Knoten | ''atmos'' rechnet durchgehend kompressibel |
| **Über der Tropopause gilt die Troposphärenformel nicht** — oberhalb 11 km ist die Temperatur konstant, der Druck fällt exponentiell | Zwei Schichten, ausdrücklich getrennt |
| **Eine Mittelung über die ganze Strecke ist bei Gegenwind auf der zweiten Hälfte gutmütig falsch** — sie sagt zu wenig Verbrauch voraus, und zwar in die gefährliche Richtung | ''fplan'' führt einen fortschreibbaren Zustand je Abschnitt, keine Formel über die Gesamtstrecke |
| **Eine mittlere Steigrate über den ganzen Höhenbereich ist zu grob** — unten 2500 ft/min, oben 500, und der Stundenverbrauch fällt dabei um ein Drittel | ''vnav'' integriert in Schritten über die Höhe |
| **Die optimale Reiseflughöhe ist keine feste Zahl** — sie folgt aus W/δ und steigt, während Treibstoff verbrennt | ''AvOptimaleHoeheM'' und ''AvStufensteigGewinnM'' |
----
===== Einstiegsbeispiel =====
unit main;
import std.aero.atmos;
import std.io;
import std.string;
fn main(): int64 {
// FL350 bei ISA−10: was zeigt der Höhenmesser, wie schnell fliegen wir wirklich?
var druckhoeheFt: f64 := AvDruckhoeheFtAusFlugflaeche(350.0);
var hM: f64 := AvFtToM(druckhoeheFt);
var oatC: f64 := AvKToC(AvIsaTemperaturK(hM)) - 10.0;
var tas: f64 := AvTasKtAusCasKt(280.0, hM, oatC);
var mach: f64 := AvMachAusCasKt(280.0, hM);
PrintLn(StrConcat("Druckhoehe (ft): ", FloatToStr(druckhoeheFt, 1)));
PrintLn(StrConcat("OAT (C): ", FloatToStr(oatC, 1)));
PrintLn(StrConcat("TAS (kt): ", FloatToStr(tas, 1)));
PrintLn(StrConcat("Mach: ", FloatToStr(mach, 1)));
return 0;
}
Druckhoehe (ft): 35000.0
OAT (C): -64.3
TAS (kt): 462.5
Mach: 0.8
----
===== Was diese Units nicht leisten =====
* **Kein Flughandbuch.** Schub- und Widerstandspolaren, V-Geschwindigkeiten, Buffet-Grenzen, Klappenpläne — alles musterabhängig und deshalb Sache des Aufrufers.
* **Keine Navigation.** Kurse und Strecken über Grund rechnet [[lyx_-_programmiersprache:units:geo|std.geo]], Bahnmechanik [[lyx_-_programmiersprache:units:astro|std.astro]].
* **Keine Zulassung.** Die Units rechnen; ob eine Rechnung in einem zulassungspflichtigen Gerät verwendet werden darf, entscheidet der DO-178C-Prozess → [[lyx_-_programmiersprache:guides:do-178c|DO-178C-Guide]].
* **Keine Zeitzonen.** ''fplan'' rechnet in Minuten seit Mitternacht, damit keine Zeitzonenlogik in die Unit gerät.
Letzte Aktualisierung: 2026-09-05 — Seite neu angelegt; erhoben aus ''std/aero/*.lyx'' im Compiler-Repo (Stand 2026-09-04), Beispiel gegen lyxc 1.1.18A übersetzt und ausgeführt.
Prüflauf 2026-09-05 mit ''doku-pruefer.py'' über den gesamten Aero-Bereich (Repo-Compiler **lyxc 1.2.2A**): 13 Vollprogramme, 13 übersetzen, 0 echte Fehler; 193 Aufrufe gegen die ''pub fn''-Signaturen in ''aurum/std'' gehalten, 0 Abweichungen.