Physikmodell
Diese Datei beschreibt, was der Kern rechnet, welche Annahmen dahinterstehen und wo das Modell aufhört, verlässlich zu sein. Sie ist die Referenz für alle, die Ergebnisse interpretieren oder das Modell erweitern wollen.
Jedes Kapitel nennt die Quelldatei, damit Formel und Code nebeneinanderliegen.
1. Die Kernidee: Pumpen ist Knoller-Betz
Ein Tragflügel, der sich quer zur Anströmung bewegt, sieht die Strömung nicht mehr von vorn, sondern von schräg unten oder oben. Der Auftrieb steht immer senkrecht auf der lokalen Anströmung, also kippt er mit. Beim Abwärtshub kippt er nach vorn, und diese Vorwärtskomponente ist Schub.
Abwärtshub: Anströmung von schräg unten → Auftrieb kippt nach vorn → Schub
Aufwärtshub: Anströmung von schräg oben → Auftrieb kippt nach hinten → WiderstandNetto bleibt Schub übrig, weil der Auftrieb beim Abwärtshub größer ist als beim Aufwärtshub — der effektive Anstellwinkel steigt beim Abwärtshub. Das ist der Knoller-Betz-Effekt, derselbe Mechanismus wie bei einer Fischflosse.
Im Code steht das in drei Zeilen (pump.py, PumpModel.derivative):
cos_g = speed / velocity
sin_g = w_foil / velocity
thrust = -lift_total * sin_gBewegt sich der Foil nach unten (w_foil < 0), wird thrust positiv.
2. Fluid: Wassertemperatur ist kein Kosmetikregler
fluid.py
Dichte von reinem Wasser nach Kell (1975), Salzgehaltskorrektur nach Sharqawy, Lienhard und Zubair (2010). Dynamische Viskosität ebenfalls nach Sharqawy et al.
Warum das zählt:
| Temperatur | Dichte (Süßwasser) | Kinematische Viskosität |
|---|---|---|
| 5 °C | 1000,0 kg/m³ | 1,518 · 10⁻⁶ m²/s |
| 18 °C | 998,6 kg/m³ | 1,054 · 10⁻⁶ m²/s |
| 30 °C | 995,6 kg/m³ | 0,801 · 10⁻⁶ m²/s |
Zwischen kaltem Frühjahrswasser und warmem Sommerwasser fast eine Verdopplung der Viskosität. Die Reynoldszahl halbiert sich, der Reibungsbeiwert steigt nach ITTC-57 entsprechend. Salzwasser bringt zusätzlich rund 2,5 % mehr Dichte und damit dieselbe Tragkraft bei etwas geringerer Fahrt.
Das Dichtemaximum bei 4 °C fällt aus der Kell-Gleichung heraus und wird im Test test_fluid.py geprüft — ein guter Sanity-Check für die Implementierung.
3. Profildicke aus Katalogdaten ableiten
catalog/_schema.py
Kein Hersteller veröffentlicht t/c. Fast alle veröffentlichen Fläche, mittlere Chord und Volumen. Für ein übliches Flügelprofil gilt für die Querschnittsfläche näherungsweise
A_quer ≈ 0,685 · c · t (exakt für NACA 0012)Über die Spannweite integriert folgt daraus
t/c = V / (0,685 · A · c_mittel)Für das AXIS PNGv2 1400 (A = 1786 cm², c_mittel = 12,74 cm, V = 1954 cm³):
t/c = 1954 / (0,685 · 1786 · 12,74) = 0,125Das ist der Schlüssel zur Modularität. Jede Marke, die diese drei Zahlen veröffentlicht, lässt sich ohne Code-Änderung modellieren. Fehlt das Volumen, greift ein konservativer Rückfallwert von 0,11, und der Reibungswiderstand wird entsprechend ungenauer.
Der Wert wird auf 0,05 bis 0,22 begrenzt, damit ein Tippfehler im Katalog nicht zu absurden Widerständen führt.
4. Stationäre Polare je Flügel
polar.py
Auftrieb
Zweidimensionaler Auftriebsanstieg aus der Dünnprofiltheorie, mit Dickenkorrektur nach Abbott/von Doenhoff und einem Grenzschichtfaktor:
a₀ = 2π · (1 + 0,77 · t/c) · k_visc k_visc = 0,92Endliche Streckung nach Prandtl:
a = a₀ / (1 + a₀ / (π · e · AR))Für das PNGv2 1400 (AR 10,97, t/c 0,125, e 0,94) ergibt das 5,30 pro rad. Das PNGv2 1200 mit AR 8,0 kommt nur auf rund 4,7 pro rad. Genau dieser Unterschied macht in Panel C den steileren beziehungsweise flacheren Verlauf.
Wölbung verschiebt den Nullauftriebswinkel: α₀ = −2 · Wölbungsverhältnis.
Widerstand
Cd = Cd_viskos(Re) + Cd_induziert(Cl, AR) + Cd_welle(Cl, h, U) + Cd_ablösung- Viskos: ITTC-57-Plattenreibung
Cf = 0,075 / (log₁₀Re − 2)², multipliziert mit dem Hoerner-Formfaktor1 + 2(t/c) + 60(t/c)⁴und dem Verhältnis von benetzter zu Grundrissfläche2(1 + 1,2·t/c). - Induziert:
Cl² / (π · e · AR). - Welle: siehe Abschnitt 5.
- Ablösung: Zusatzwiderstand, sobald die Cl-Sättigung greift.
Oberflächennähe
Der Spiegelwirbel an der freien Wasseroberfläche hat umgekehrtes Vorzeichen zum Bodeneffekt: Nähe zur Oberfläche kostet Auftrieb, sie bringt keinen. Näherung nach Hoerner:
Cl(h) / Cl(∞) = (16(h/c)² + 1) / (16(h/c)² + 2)Bei einer halben Chord Tiefe bleiben 83 %, bei zwei Chords 98,5 %. Deshalb wird ein Foil beim Auftauchen weich statt hart — und deshalb koppelt die Ride Height direkt an die Tragfähigkeit.
Wellenwiderstand
Aus der Lösung für einen Wirbel der Zirkulation Γ in der Tiefe h unter einer freien Oberfläche (Lamb, Hydrodynamics) folgt zweidimensional
Cd_w = 0,5 · Cl² · (g·c / U²) · exp(−2gh / U²)Ein realer Flügel hat endliche Spannweite, sein Wellensystem divergiert seitlich und trägt weniger Widerstand als der 2D-Fall. Der Faktor b / (b + 2h) bildet das ab. Praktische Folge: langsam und knapp unter der Oberfläche ist der Wellenwiderstand ein großer Einzelposten, tief und schnell verschwindet er.
Weiche Cl-Sättigung
Ein harter Stall-Knick würde die Zeitintegration unstetig machen. Stattdessen:
Cl = Cl_linear / (1 + (|Cl_linear|/Cl_max)ⁿ)^(1/n) n = 4Weit unter Cl_max praktisch linear, darüber weiche Begrenzung. Der Report meldet stalled, sobald |Cl_linear| > Cl_max im ausgewerteten Zyklus auftritt.
5. Rig-Assembly: der Trimm ist shim-getrieben
rig.py
In der Praxis stellt der Fahrer Front- und Rearwing-Shim ein, nicht die Lastverteilung. Das Modell macht es genauso:
- Frontwing-Anstellwinkel α wird gesucht (Sekantenverfahren, Toleranz 0,05 N).
- Relative zur Fuselage gilt
α_front = α_fuse + front_shimundα_rear = α_fuse + rear_shim − ε, alsoα_rear = α − front_shim + rear_shim − ε, wobei ε der Abwind des Frontwings ist. - Beide Auftriebe zusammen müssen das Gesamtgewicht tragen.
Positiver Front-Shim (Nose-up am Frontwing) kippt die Fuselage im Trimm nach unten und wirkt am Stab wie negativer Rear-Shim: mehr Abtrieb hinten, mehr Last vorn. Beide Shims liegen im Bereich ±3°.
Der Abwindwinkel folgt der Hufeisenwirbellösung:
ε(x) = ε_∞ · 0,5 · (1 + x / √(x² + (b/2)²)) ε_∞ = 2·Cl / (π·AR)Eine längere Fuselage sitzt in stärkerem Abwind. Bei gleicher relativer Inzidenz trimmt sie den Rearwing also anders — genau der Effekt, den man beim Fuselage-Wechsel im Wasser spürt.
Koordinatenräume: Board, Mast-Track und Füße
geometry.py (BoardMount, BoardStance, RiderStance), rig.py
Drei Mess- und Rechnrahmen — nicht verwechseln:
| Rahmen | Ursprung | +x zeigt nach | Typische Eingabe |
|---|---|---|---|
| Board intern | Nase | Tail | Katalog front/rear_strap_from_nose |
| UI / Strap-Messung | Tail (Mastende) | Nase | front/rear_foot_from_tail_m |
Mast-Frame Füße (RiderStance) | Mastachse | Tail (größere foot_from_nose) | abgeleitet |
Mast-Frame Flügel (rig.py) | Mastachse | Nase | aus Fuselage-Geometrie |
flowchart LR
subgraph boardNose [Board Nase x=0]
Nose["Nase"]
RearStrap["rear strap ~0,31 m"]
Mast["Mast ~0,36 m"]
FrontStrap["front strap ~0,73 m"]
Tail["Tail"]
end
subgraph mastFrameFeet [Mast-Frame Füße]
Neg["rear_foot −0,05 m → Nase"]
Pos["front_foot +0,37 m → Tail"]
end
subgraph mastFrameWings [Mast-Frame Flügel rig]
Xf["x_f +front_to_mast → Nase"]
Xr["x_r −mast_to_rear → Tail"]
endSurfer vs. Code-Feldnamen: In RiderStance heißen die Felder front_foot_from_mast_m / rear_foot_from_mast_m nach Board-Strap-Reihenfolge (Strap näher Tail vs. näher Nase), nicht wörtlich Surfer-Vorderfuß/Hinterfuß. Surfer-Vorderfuß (Richtung Boardnase) entspricht rear_foot_from_mast_m (negativ bei Referenz-Setup). Surfer-Hinterfuß (Richtung Tail) entspricht front_foot_from_mast_m (positiv, Default +0,369 m).
Transform Board → Mast (Fußpositionen):
x_foot_from_nose = board_length − x_foot_from_tail # UI Tail-Metrik
mast_from_nose = track_center_from_nose + mast_track_offset
foot_from_mast = x_foot_from_nose − mast_from_nose # RiderStance-WerteOrthogonal dazu: Fuselage-Advance (advance_20, advance_plus) verschiebt die Mastachse relativ zum Rig (front_to_mast_m) — nicht dasselbe wie Mast-Track auf dem Board.
Fußposition und Momentenbilanz
Vorder- und Hinterfuß (bzw. Straps) sind Vorgabe; der Schwerpunkt folgt daraus. Torso-/Beinanteil 86 % / 14 %, Torso bei 50 % der Stance-Breite:
x_cog = (m_torso · x_torso + ½ m_beine · x_front + ½ m_beine · x_rear) / m_fahrer
x_torso = x_rear + 0,50 · (x_front − x_rear)(x_front / x_rear = RiderStance-Felder im Mast-Frame mit +x → Tail.)
Statische Fußlasten (Hebelgesetz; weight_front_n lastet auf front_foot):
W_front = W · (x_cog − x_rear) / (x_front − x_rear)
W_rear = W − W_frontNickmoment um den Fahrer-CG (positiv = Nase hoch; Flügel-ACs in Nase-+x):
M = L_f · (x_f − x_cog) + L_r · (x_r − x_cog) + M_acmit x_f = +front_to_mast_m, x_r = −mast_to_rear_m, M_ac = q · S_f · c_f · cm_ac. x_cog aus RiderStance liegt im Fuß-Mast-Frame (+x → Tail); die Formel nutzt dieselbe numerische Achse wie die Flügel-Hebel in rig.py (Tests in test_stance.py).
trimmable: true, wenn |M| ≤ 3 N·m und die Füße plausibel auf dem Board liegen. Trim-State:
stance_offset_m— gewählter CG (x_cog)required_cog_from_mast_m— idealer CG fürM = 0weight_front_n/weight_rear_n— Fußlasten auf Strap-Feldernmoment_residual_nm— Restmoment
Im Pump-Modell (pump.py) koppelt ein Nick-Bias (Δα_moment, begrenzt ±2°) an dieses Restmoment, aber nur wenn |cog_offset| ≤ 4 cm — sonst bleibt der Trimm unverändert.
Board-Montage und Mast-Track
Board und Straps sind board-fix; nur die Mastachse gleitet auf Twin-US-Tracks:
mast_track_offset_mm ∈ [−travel/2, +travel/2] # 0 = Boxmitte, + = Richtung TailBoardMount.effective_stance() liefert mast-zentrierte RiderStance für Kraft- und Momentenbilanz. Äquivalenz: Mast +Δ Tail ≡ beide Füße −Δ im Mastframe (test_mast_aft_equals_feet_forward).
Inverse Trim-Hilfe bei fixen Füßen:
required_mast_track_offset_mm = f(cog_offset_from_required_m)trimmable prüft zusätzlich track_in_range und plausibel board-fixe Straps. Legacy-Modus stance_mode=mast: direkte Fuß-Slider in RiderStance ohne Board-Transform.
Validierung UI (Tail-Metrik): Surfer-Vorderfuß weiter vom Tail als Hinterfuß (front_from_tail > rear_from_tail; Hinterfuß typisch ~5–15 cm, Vorderfuß ~35–55 cm).
Widerstandsanteile (Panel E) für das Referenzsetup bei bester Gleitzahl (PNGv2 1400, Advance 20 Short 703, Skinny 360/45, PRO UHM 900, 100 kg Fahrer, 18 °C Süßwasser, 3,99 m/s):
| Anteil | Kraft | Anteil am Gesamtwiderstand |
|---|---|---|
| Frontwing | 41,7 N | 76 % |
| Mast | 7,0 N | 13 % |
| Interferenz | 3,1 N | 6 % |
| Rearwing | 1,9 N | 3 % |
| Fuselage | 1,1 N | 2 % |
| Spray | 0,4 N | 1 % |
| Gesamt | 55,2 N |
Der Frontwing dominiert, weil er den induzierten Widerstand für das gesamte Gewicht trägt. Bei höherer Fahrt verschiebt sich das Bild spürbar Richtung Mast, denn der Mastwiderstand wächst mit U², der induzierte Anteil fällt mit 1/U². Genau deshalb lohnt ein kurzer Mast erst oberhalb der Cruise-Zone.
Stationäre Kennzahlen (steady.py)
steady_report() liefert Take-off, Best Glide, Min-Drag, Cruise-Zone und Vmax (max_speed / maximum_trimmable_speed): höchste Geschwindigkeit, die noch trimmbar ist und mindestens 40 % des Peak-L/D hält (MAX_SPEED_LD_FRACTION). Der Speed-Sweep wird bei Bedarf adaptiv bis SPEED_SWEEP_HARD_CAP (25 m/s) erweitert, damit Vmax nicht am Default-Raster (14 m/s) klebt. Vmax ist ein stationäres Trimm-/Effizienz-Ende — kein GPS-Top-Speed und kein Pump-Leistungsbudget.
6. Instationäre Aerodynamik
unsteady.py
Quasi-stationär zu rechnen würde beim Pumpen zwei Effekte übersehen.
Nachlauf: Theodorsen und Wagner
Eine Anstellwinkeländerung wirkt sich nicht sofort voll auf die Zirkulation aus, weil der Nachlauf Wirbel abschwimmen lässt. Im Frequenzbereich beschreibt das die Theodorsen-Funktion:
C(k) = H₁⁽²⁾(k) / (H₁⁽²⁾(k) + i·H₀⁽²⁾(k))mit der reduzierten Frequenz k = π·f·c / U. Grenzwerte: C(0) = 1 (quasi-stationär), C(∞) = 0,5. Beides ist in test_unsteady.py abgesichert.
Pumpfoiling liegt typisch bei k = 0,05 bis 0,2. Das Referenzsetup bei 1,0 Hz und 14,1 km/h landet bei k = 0,102, also |C(k)| = 0,847: rund 15 % weniger Zirkulationsamplitude als quasi-stationär, plus Phasenverzug.
Für die Zeitintegration ist die Frequenzbereichsform unbrauchbar. Stattdessen läuft die Zustandsraumnäherung nach R. T. Jones mit zwei Verzögerungszuständen mit, die im Frequenzbereich C(k) reproduziert:
Φ(s) = 1 − 0,165·e^(−0,0455s) − 0,335·e^(−0,3s)theodorsen_jones() existiert nur, um beide Formulierungen gegeneinander zu prüfen.
Scheinbare Masse
Beschleunigt der Flügel vertikal, muss er Wasser mitbeschleunigen. In Luft vernachlässigbar, in Wasser nicht: für das PNGv2 1400 sind das 15,1 kg, also rund 16 % der Gesamtmasse des Systems.
m_added = ρ · π · (c/2)² · b · 0,85Der Faktor 0,85 berücksichtigt, dass ein realer Grundriss weniger mitschleppt als die 2D-Theorie vorhersagt.
Die scheinbare Masse ist implizit aufgelöst, weil die Foilbeschleunigung selbst von der gesuchten Schwerpunktbeschleunigung abhängt:
a_foil = a_cog − foil_share · a_bein
m·a_cog = F_z − W − m_added · a_foilGarrick-Schub als geschlossene Kontrolle
Für reines Heave kleiner Amplitude gilt
T = 0,25 · ρ · A · a · Re{C(k)} · (z₀·ω)²Diese Formel wird nicht in der Simulation benutzt, sondern als Prüfgröße: die Zeitintegration muss sie im Grenzfall kleiner Amplituden reproduzieren.
7. Der Pump-Zyklus in der Zeit
pump.py
Warum zwei Massen nötig sind
Ein starres System kann über einen geschlossenen Zyklus keine Netto-Energie einbringen — Trägheits- und Gewichtsarbeit heben sich exakt auf. Erst die Relativbewegung zwischen Oberkörper und Board macht Muskelarbeit möglich:
P = Beinkraft · d(Beinlänge)/dtDeshalb trennt das Modell den Oberkörper (86 % der Fahrermasse, bleibt relativ ruhig) von Beinen, Board und Foil (folgen der Pumpbewegung). Der Fahrer steuert die Beinlänge, nicht die Foilhöhe.
Zustandsvektor
[x, U, z_cog, w_cog, x₁, x₂, z_filter]x und U sind Weg und Fahrt, z_cog und w_cog die Vertikalbewegung des Schwerpunkts, x₁ und x₂ die Wagner-Zustände, z_filter der Tiefpass der Höhenregelung. Integration mit klassischem RK4.
Höhenregelung
Ein realer Fahrer hält die Flughöhe unbewusst über den Anstellwinkel. Das Modell bildet das als PD-Regler auf einen tiefpassgefilterten Höhenfehler ab:
Δα = −0,45 · z_filter − 0,10 · w_cog begrenzt auf ±7,5°Die Filterzeitkonstante beträgt 0,8 Pumpzyklen: träge genug, um den Pumpzyklus selbst nicht wegzuregeln, kräftig genug, um die mittlere Höhe zu halten.
Abbruchbedingungen
Die Simulation endet vorzeitig, wenn das Board aufsetzt (touchdown), der Foil ausbricht (breach) oder die Fahrt zusammenbricht (speed_collapse). Das ist kein Fehler, sondern das Ergebnis: diese Pumptechnik trägt dieses Setup nicht.
sustained: true verlangt kumulativ:
- reguläres Ende, mindestens 95 % der angeforderten Dauer simuliert
- Geschwindigkeitsdrift über die letzten drei Zyklen unter 0,20 m/s
- Höhendrift unter 0,05 m (früher 0,10 m — zu locker für langsame Sinker, die nach 16 s noch „tragen“ und kurz danach touchdownen; Auto-Optimum wählte sonst Scheinorbits)
- mittlere Fahrt über 1,0 m/s
Alle Kennzahlen stammen aus den letzten drei Zyklen, nicht aus der Anlaufphase. Das gilt auch für das Stall-Flag: ein Transient beim Anfahren darf nicht dauerhaft Stall melden.
Leistung
Zwei Zahlen, die man nicht verwechseln sollte:
- Mechanische Leistung
Widerstand · Bahngeschwindigkeit. Im zyklisch eingeschwungenen Zustand ist das exakt die Leistung, die ins Wasser geht — der Auftrieb steht senkrecht zur Bahn und leistet keine Arbeit. - Metabolische Leistung: mechanische Leistung plus 25 % der exzentrischen Arbeit beim Abfangen, geteilt durch einen Muskelwirkungsgrad von 0,22.
Für das Referenzsetup bei 1,0 Hz und 26 cm Beinhub: 246 W mechanisch, rund 1400 W metabolisch, 14,1 km/h, 3,91 m Distanz pro Zyklus. Der metabolische Wert erklärt, warum Pumpen in Minuten und nicht in Stunden gemessen wird.
Betriebspunktsuche
pump_optimum() fährt ein Raster aus Frequenz, Beinhub und Nickamplitude ab und liefert den Punkt mit der geringsten Dauerleistung, dazu das komplette Raster. Das beantwortet die eigentliche Frage: nicht wie schnell ein Setup sein kann, sondern wie günstig es sich halten lässt. In der Oberfläche liegt das auf dem Knopf „Optimum suchen".
minimum_pump_effort() sucht die kleinste Amplitude, mit der ein Setup überhaupt trägt. pump_envelope() fährt die Frequenz ab und zeigt das Fenster, in dem das Setup arbeitet.
8. Skalierung über die Flügelgröße
Größenabhängige Kinetik ist keine Sonderlogik, sie fällt aus der Physik heraus:
| Katalogangabe | wirkt auf |
|---|---|
| Fläche | Auftrieb bei gegebener Fahrt, Take-off-Speed |
| Streckung AR | Lift-Slope, induzierter Widerstand, Abwind am Rearwing |
| Mittlere Chord | Reynoldszahl, reduzierte Frequenz k, Oberflächennähe-Faktor |
| Spannweite | Wellenwiderstand, scheinbare Masse |
| Volumen | Profildicke, darüber Reibung und Formwiderstand |
Ein größerer Flügel bekommt dadurch automatisch die trägere, aber effizientere Pump-Charakteristik: höhere reduzierte Frequenz bei gleicher Pumpfrequenz, größere scheinbare Masse, niedrigere Take-off-Geschwindigkeit. Ein neuer Flügel im Katalog erbt dieses Verhalten ohne eine Zeile Code.
9. Validierung
backend/tests/ — derzeit ~194 Tests in 11 Dateien, Ausführung mit pytest im Backend-Verzeichnis.
Abgedeckt sind unter anderem:
- Theodorsen:
C(0) = 1,C(∞) = 0,5, Übereinstimmung mit der Jones-Näherung - Wagner: Sprungwert 0,5, asymptotischer Anstieg auf 1
- Garrick-Schub bei reinem Heave ist positiv; Regression gegen
simulate_pumpbei kleiner Amplitude - Dichtemaximum von Süßwasser bei 4 °C
- Take-off-Geschwindigkeit des Referenzsetups im Bereich 2,5 bis 3,5 m/s
- kürzere Fuselage erhöht den Gesamtwiderstand
- kälteres Wasser erhöht den Reibungswiderstand
- Fußposition / Mast-Track: Transform, Äquivalenz, Momentenbilanz
- API-Verträge aller Endpunkte
Referenzsetup (PNGv2 1400, Advance 20 Short 703, Skinny 360/45, PRO UHM 900, Frank Mini Dart 50L, 85 kg Fahrer, 18 °C Süßwasser):
| Kennzahl | Wert |
|---|---|
| Gesamtmasse | 94,9 kg |
| Take-off | 2,81 m/s (10,1 km/h) |
| Beste Gleitzahl | 16,9 bei 3,99 m/s (14,4 km/h) |
| Cruise-Zone | 3,09 bis 5,43 m/s |
| Reduzierte Frequenz bei 1 Hz | 0,102 |
| Scheinbare Masse | 15,1 kg |
Der Take-off-Wert passt zu AXIS' Einordnung des PNGv2 1400 als Leichtwind- und Dockstart-Flügel.
10. Grenzen des Modells
Ehrlich benannt, damit niemand die Zahlen überinterpretiert:
- Zweidimensionale instationäre Theorie. Theodorsen und Garrick gelten für kleine Amplituden am 2D-Profil. Bei sehr großen Pumpamplituden über 30 cm wächst der Fehler.
- Nachlauf nur am Frontwing. Im Pump-Zyklus (
pump.py) läuft Wagner/Theodorsen nur über den Frontwing; der Rearwing folgt quasi-stationär ohne Wellenwiderstand. Bei typisch 3–20 % Rear-Lastanteil ist das meist sekundär, aber asymmetrisch gegenüber dem Frontwing modelliert. - Kein dynamischer Stall. Die weiche Cl-Sättigung bildet keine Hysterese ab. Ein Zyklus mit
stalled: trueist als Warnung zu lesen, nicht als quantitative Aussage. - Kein Rollen, kein Gieren. Nur die Längsebene wird gerechnet. Kurvenfahrt, Kantendruck und Wingtip-Ventilation fehlen.
- Kein Take-off-Verlauf. Der Verdrängungswiderstand des Boards vor dem Abheben ist nicht modelliert. Die Take-off-Geschwindigkeit ist eine statische Tragfähigkeitsgrenze, keine Anfahrsimulation.
- Kein Pump-nachhaltiges Vmax. Die Kennzahl Vmax ist stationär (Trimm + L/D- Schwellwert). Ob ein Rider diese Leistung über Minuten pumpen kann, ist nicht modelliert.
- Kalibrierung nicht gegen Messdaten.
cd_viscous_scale = 0,78ist eine begründete Schätzung für glatte Carbonoberflächen, kein Schleppversuch. Die Absolutwerte für Widerstand und Leistung sind daher mit Unsicherheit behaftet. Vergleiche zwischen Setups sind deutlich belastbarer als Absolutzahlen.
Wie sich Kalibrierungsfaktoren mit echten Sessiondaten nachziehen lassen, steht in katalog-erweitern.md.
Quellen
- Kell, G. S. (1975). Density, thermal expansivity, and compressibility of liquid water. J. Chem. Eng. Data 20(1).
- Sharqawy, M. H., Lienhard, J. H., Zubair, S. M. (2010). Thermophysical properties of seawater. Desalination and Water Treatment 16.
- Theodorsen, T. (1935). General theory of aerodynamic instability and the mechanism of flutter. NACA Report 496.
- Garrick, I. E. (1936). Propulsion of a flapping and oscillating airfoil. NACA Report 567.
- Jones, R. T. (1940). The unsteady lift of a wing of finite aspect ratio. NACA Report 681.
- Hoerner, S. F. (1965). Fluid-Dynamic Drag.
- Abbott, I. H., von Doenhoff, A. E. (1959). Theory of Wing Sections.
- Lamb, H. (1932). Hydrodynamics, 6. Auflage, Kapitel zu Wellenwiderstand.
