← Zurück zum Blog
Python

TCI-X Algorithmus: Thermik-Scoring mit Physik und Code

Der physikbasierte Thermik-Index erklärt: CAPE, LCL, W*, Sonnenfenster-Check und wie diese in einen Score von 0-100 umgewandelt werden

🎯 Was ist TCI-X?

TCI-X (Thermal Condition Index - Extended) ist ein physikbasierter Scoring-Algorithmus, der die Thermikbedingungen für Segelflieger auf einer Skala von 0 bis 100 bewertet.

Anders als einfache "Daumen hoch/runter" Vorhersagen kombiniert TCI-X mehrere meteorologische Parameter:

  • CAPE – Konvektive verfügbare potentielle Energie
  • CIN – Konvektive Hemmung (Inversion)
  • LCL – Lifting Condensation Level (Wolkenbasis)
  • W* – Maximale thermische Aufwindgeschwindigkeit
  • Sonnenfenster – Gibt es genug Sonneneinstrahlung?

Das Ergebnis: Ein klarer Score mit Label wie 🌡️ Excellent, 🟢 Good, 🟡 Marginal oder 🥶 Capped.

🔬 Die Physik hinter dem Score

CAPE – Die Energie für Thermik

CAPE (Convective Available Potential Energy) misst, wie viel Energie eine aufsteigende Luftblase hat. Je höher CAPE, desto stärker die Thermik.

  • 0-50 J/kg: Sehr schwach – kaum Thermik
  • 50-400 J/kg: Schwach bis moderat – brauchbare Thermik
  • 400-1500 J/kg: Gut bis sehr gut – starke Thermik
  • 1500+ J/kg: Excellent – sehr starke Thermik, aber Achtung: Gewittergefahr!

CIN – Der Thermik-Killer

CIN (Convective Inhibition) ist die "Sperrschicht" – eine Inversion, die Thermik verhindert. Negative CIN-Werte bedeuten: Thermik kann nicht starten, selbst wenn CAPE hoch ist.

  • CIN > -10 J/kg: Fast keine Hemmung – Thermik läuft frei
  • CIN < -50 J/kg: Starke Inversion – CAPPED, keine Thermik möglich

LCL – Die Wolkenbasis

LCL (Lifting Condensation Level) ist die Höhe, auf der aufsteigende Luft kondensiert und Wolken bildet. Das ist die "Arbeitshöhe" für Segelflieger.

  • 500-1500m AGL: Niedrige Basis – eng, aber fliegbar
  • 1500-3000m AGL: Ideal – genug Arbeitshöhe
  • 3000+ m AGL: Sehr hoch – großer Arbeitsraum, aber spät startend

W* – Maximale Steigrate

W* (W-Star) ist die theoretische maximale vertikale Geschwindigkeit in Thermikblasen. Typische Werte: 1-5 m/s.

  • < 1.0 m/s: Sehr schwach – kaum fliegbar
  • 1.5-3.0 m/s: Gut – solide Thermik
  • 3.0+ m/s: Sehr stark – schnelles Steigen

⚙️ Der TCI-X Algorithmus

So wird der TCI-X Score berechnet:

function calcTCI(dayHours) {
  // 1. Nur Tageslicht-Stunden (7-19 Uhr) verwenden
  const daylight = dayHours.filter(h => {
    const hour = new Date(h.time).getHours();
    return hour >= 7 && hour <= 19;
  });

  if (daylight.length === 0) return { score: 0, label: 'Keine Daten', level: 'capped' };

  // 2. Maximalwerte extrahieren
  let capeMax = 0, cinMin = 0, wstarMax = 0;

  daylight.forEach(h => {
    const cape = pickField(h, 'cape') || 0;
    const cin = pickField(h, 'convective_inhibition') || 0;
    const wstar = calculateWstar(h);  // Berechne W* aus BLH und Temperatur

    if (cape > capeMax) capeMax = cape;
    if (cin < cinMin) cinMin = cin;
    if (wstar > wstarMax) wstarMax = wstar;
  });

  // 3. CAPPED Check – Inversion verhindert Thermik?
  if (cinMin < -50) {
    return { score: Math.round(capeMax / 30), label: '🥶 Capped', level: 'capped' };
  }

  // 4. TCI-X Score berechnen
  let score = 0;

  // CAPE Contribution (0-50 Punkte)
  if (capeMax < 50) {
    score += capeMax * 0.2;  // Sehr schwach: 0-10 Punkte
  } else if (capeMax < 400) {
    score += 10 + (capeMax - 50) * 0.08;  // Schwach: 10-38 Punkte
  } else if (capeMax < 1500) {
    score += 38 + (capeMax - 400) * 0.011;  // Gut: 38-50 Punkte
  } else {
    score += 50;  // Excellent: 50 Punkte (cap)
  }

  // W* Contribution (0-30 Punkte)
  score += Math.min(wstarMax * 10, 30);

  // Sonnenfenster-Check (0-20 Punkte)
  const hasSun = hasSunWindow(daylight);
  if (hasSun) {
    score += 20;
  } else {
    score += 5;  // Nur 5 Punkte ohne Sonnenfenster
  }

  // 5. Finalen Score begrenzen (0-100)
  score = Math.max(0, Math.min(100, score));

  // 6. Label zuweisen
  let label, level;
  if (score >= 70) {
    label = '🌡️ Excellent';
    level = 'excellent';
  } else if (score >= 45) {
    label = '🟢 Good';
    level = 'good';
  } else if (score >= 24) {
    label = '🟡 Marginal';
    level = 'marginal';
  } else {
    label = '🔵 Poor';
    level = 'poor';
  }

  return { score: Math.round(score), label, level };
}

🌞 Der Sonnenfenster-Check

Ohne Sonne keine Thermik! Der Algorithmus prüft, ob es mindestens 2 aufeinanderfolgende Stunden mit ≥ 0.9h Sonnenschein gibt:

function hasSunWindow(dayHours) {
  let streak = 0;

  for (let h of dayHours) {
    const sunDuration = pickField(h, 'sunshine_duration');  // in Sekunden

    if (sunDuration != null && sunDuration >= 3240) {  // >= 0.9h (3240s)
      streak++;
      if (streak >= 2) return true;  // Mindestens 2 Stunden in Folge
    } else {
      streak = 0;  // Reset
    }
  }

  return false;
}

Warum 0.9h und nicht 1.0h? Weil API-Daten manchmal leicht unter 1h liegen können, auch bei gutem Wetter. 0.9h ist ein pragmatischer Schwellwert.

📊 W* Berechnung

W* wird aus der Boundary Layer Height (BLH) und Temperaturgradienten berechnet:

function calculateWstar(hour) {
  const blh = pickField(hour, 'boundary_layer_height');  // in Metern
  const temp2m = pickField(hour, 'temperature_2m');      // °C
  const tempBLH = pickField(hour, 'temperature_at_blh'); // °C (falls verfügbar)

  if (blh == null || temp2m == null) return 0;

  // Vereinfachte W* Formel (angenähert)
  // W* ≈ sqrt(g * BLH * ΔT / T_avg)
  const deltaT = tempBLH != null ? Math.abs(temp2m - tempBLH) : 5;  // Fallback: 5K
  const T_avg = 273.15 + temp2m;  // Kelvin

  const g = 9.81;  // Erdbeschleunigung m/s²
  const wstar = Math.sqrt((g * blh * deltaT) / T_avg);

  return wstar;  // in m/s
}

Hinweis: Dies ist eine vereinfachte Formel. In der Realität sind Faktoren wie Feuchtigkeit, Windscherung und Terrain-Effekte ebenfalls relevant.

🎨 Visualisierung: TCI-X Levels

Die TCI-X Levels werden in der UI mit Farben und Icons dargestellt:

🌡️ Excellent (70-100)

CAPE > 1000, W* > 3.0, Sonnenfenster vorhanden

🟢 Good (45-69)

CAPE 400-1000, W* 2.0-3.0, gute Bedingungen

🟡 Marginal (24-44)

CAPE 100-400, W* 1.0-2.0, schwache Thermik

🥶 Capped (< 24 oder CIN < -50)

Inversion blockiert Thermik – nicht fliegbar

🚀 Praktische Anwendung

So wird TCI-X in EDXE Thermik-X verwendet:

// Für jeden Tag den TCI-X Score berechnen
Object.keys(days).forEach(dateKey => {
  const dayData = days[dateKey];
  const tci = calcTCI(dayData.hours);

  console.log(`${dateKey}: TCI-X ${tci.score}/100 - ${tci.label}`);

  // Badge-Farbe basierend auf Level
  const badgeColor = {
    'excellent': 'var(--teal)',    // Cyan
    'good': '#66FF66',             // Grün
    'marginal': 'var(--yellow)',   // Gelb
    'poor': 'var(--grey)',         // Grau
    'capped': 'var(--coral)'       // Rot
  }[tci.level];

  // In UI rendern
  renderTCIBadge(dateKey, tci.score, tci.label, badgeColor);
});

💡 Best Practices

  • CAPE allein reicht nicht: Immer CIN checken! Hohe CAPE + starke Inversion = CAPPED
  • Sonnenfenster ist kritisch: Ohne Sonne keine Thermik, egal wie gut CAPE ist
  • W* gibt die Steigrate an: Niedrige W* = langsame, breite Thermik; hohe W* = schnell, eng
  • LCL bestimmt die Arbeitshöhe: Zu niedrig = wenig Spielraum; zu hoch = späte Thermik
  • Score-Kalibrierung: Passe die Gewichtung an deine Region und Erfahrung an

🎯 Zusammenfassung

Der TCI-X Algorithmus kombiniert:

  • Physikalische Parameter: CAPE, CIN, LCL, W*
  • Meteorologische Realität: Sonnenfenster-Check
  • Klare Kategorisierung: Excellent, Good, Marginal, Capped
  • 0-100 Score: Einfach verständlich und vergleichbar

Der vollständige Code ist im EDXE Thermik-X Projekt live zu sehen!