Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Hydraulische Durchbildung einer Staustufe

Dieses Notebook im Webbrowser ausführen: Open in marimo

Der Link öffnet rechenbeispiel-staustufendurchbildung.py als interaktives marimo-Notebook, das vollständig im Webbrowser läuft, ohne dass etwas installiert werden muss.

  1. Warten Sie einen Moment, bis Python im Browser geladen ist (das dauert nur beim ersten Start länger).

  2. Klicken Sie auf den gelben Ausführen-Button (▶︎, unten rechts), um alle Zellen auszuführen.

  3. Bearbeiten Sie beliebige Code-Zellen und führen Sie sie erneut aus: marimo aktualisiert automatisch alle davon abhängigen Zellen.

  4. Ihre Änderungen bleiben nur im Browser-Tab erhalten. Um sie zu behalten, speichern Sie das Notebook über das Menü (☰, oben rechts) > Export… > Python.

Dieses Notebook fasst zwei zusammengehörige Aufgaben zusammen:

  1. Hydraulische Vorbemessung des Wehrs (Poleni, (n‑1)‑Regel)

  2. Tosbeckenbemessung (iterativer Workflow nach Bollrich / Peterka)

Lernziele:

  • Rechengänge sehen;

  • Kernannahmen verstehen;

  • Größenordnungen prüfen können;

  • Grenzen von Vereinfachungen erkennen.

import math
from scipy.optimize import brentq
from pprint import pprint

Teil 1: Hydraulische Vorbemessung

Inhalte

Es wird eine überschlägige hydraulische Vorbemessung eines vollregelnden Wehrs durchgeführt:

  • Wahl eines plausiblen Bemessungsfalls

  • Vorbemessung der erforderlichen lichten Wehrbreite

  • Aufteilung in Wehrfelder

  • Nachweis der (n‑1)‑Regel (DIN 19700)

  • Grober Check von Freibord

Gegebene Daten und Notation

Poleni-Gleichung für den freien Überfall:

Q=c⋅23⋅μ⋅beff⋅2g⋅hu¨3/2Q = c \cdot \frac{2}{3} \cdot \mu \cdot b_{\text{eff}} \cdot \sqrt{2g} \cdot h_{\text{ü}}^{3/2}

Effektive Überflussbreite (Einschnürung durch Pfeiler):

beff=n⋅(bF−2 ξpf hu¨)b_{\text{eff}} = n \cdot \left(b_F - 2\,\xi_{\text{pf}}\,h_{\text{ü}}\right)

Herleitung: beff=bges−∑bpf−2 npf ξpf hu¨b_{\text{eff}} = b_{\text{ges}} - \sum b_{\text{pf}} - 2\,n_{\text{pf}}\,\xi_{\text{pf}}\,h_{\text{ü}} mit npf=(n−1)+2⋅0,5=nn_{\text{pf}} = (n-1) + 2\cdot0{,}5 = n Pfeileräquivalenten

SymbolBedeutung
QQDurchfluss (m³/s)
beffb_{\text{eff}}wirksame Wehrbreite (m)
hu¨h_{\text{ü}}Überfallhöhe (m)
ccAbminderungsbeiwert bei unvollkommenem Überfall (–)
μ\muAbflussbeiwert (–)
hu¨,zulh_{\text{ü,zul}}zulässige Überfallhöhe bei BHQ₁ (m über Wehrkrone)
zHz_Hhöchster zulässiger Oberwasserstand bei BHQ₁ (m ü. NHN); hu¨,zul=zH−zKrh_{\text{ü,zul}} = z_H - z_{\text{Kr}}
fferforderlicher Freibord (m)
nnAnzahl Wehrfelder
bFb_FBreite eines Wehrfelds (m)
bpfb_{\text{pf}}Breite eines Pfeilers (m)
ξpf\xi_{\text{pf}}Einschnürungsbeiwert (–)

Eingangsgrößen

BHQ1 = 65.0    # m³/s  Bemessungshochwasser 1 (Regelfall)
BHQ2 = 85.0    # m³/s  Bemessungshochwasser 2 (Kontrollfall)

# h_ue_zul: zulässige Überfallhöhe über Wehrkrone bei BHQ1 (= z_H - z_Kr, relativ)
# Nicht zu verwechseln mit z_H (absolutem Oberwasserstand in m ü. NHN, vgl. Notation)
h_ue_zul = 1.10  # m
f        = 0.50  # m  Freibord (DIN 19700: f ≥ 0,5 m bei BHQ1)

mu      = 0.64  # Abflussbeiwert (bewegliches Wehr, scharfkantig)
c       = 1.0   # Abminderungsbeiwert (vollkommener Überfall, Anfangswert)
xi_pf   = 0.10  # Einschnürungsbeiwert (abgerundete Pfeilerköpfe)

b_F  = 15.0              # m  gewählte Wehrfeldbreite (technisch bedingt)
b_pf = b_F * 0.225       # m  Pfeilerbreite (Drucksegmentverschluss)

g = 9.81  # m/s²

print(f"Pfeilerbreite b_pf = {b_pf:.2f} m")
Pfeilerbreite b_pf = 3.38 m

Poleni & erforderliche Wehrbreite

Entwurfsziel (DIN 19700, (n‑1)‑Regel):
Mit (n−1)(n-1) aktiven Wehrfeldern muss BHQ₁ abgeführt werden, ohne dass hu¨>hu¨,zulh_{\text{ü}} > h_{\text{ü,zul}}.

Auflösung der Poleni-Gleichung nach beffb_{\text{eff}}:

beff,erf=QBHQ1c⋅23⋅μ⋅2g⋅hu¨,zul3/2b_{\text{eff,erf}} = \frac{Q_{\text{BHQ}_1}}{c \cdot \frac{2}{3} \cdot \mu \cdot \sqrt{2g} \cdot h_{\text{ü,zul}}^{3/2}}

Auflösung nach hu¨h_{\text{ü}} (für gegebene Breite):

hu¨=(Qc⋅23⋅μ⋅2g⋅beff)2/3h_{\text{ü}} = \left(\frac{Q}{c \cdot \frac{2}{3} \cdot \mu \cdot \sqrt{2g} \cdot b_{\text{eff}}}\right)^{2/3}

Hilfsfunktionen für Poleni-Solver

c_pol = (2/3) * mu * math.sqrt(2 * g)  # kombinierter Poleni-Koeffizient ohne b und h_ue

def b_eff_von_Q(Q, h_ue, c_abd=1.0):
    """Erforderliche effektive Wehrbreite für gegebenen Durchfluss."""
    return Q / (c_abd * c_pol * h_ue**1.5)

def h_ue_von_Q(Q, b_eff, c_abd=1.0):
    """Überfallhöhe bei gegebenem Durchfluss und effektiver Breite."""
    return (Q / (c_abd * c_pol * b_eff))**(2/3)

def b_eff_n_felder(n_aktiv, h_ue):
    """Effektive Breite für n_aktiv nebeneinanderliegende Felder (Einschnürung berücksichtigt)."""
    return n_aktiv * (b_F - 2 * xi_pf * h_ue)

Erforderliche Breite und Anzahl Wehrfelder

# Gesamte b_eff für (n-1)-Fall muss b_eff_erf >= b_eff_von_Q(BHQ1, h_ue_zul) erfüllen
b_eff_erf = b_eff_von_Q(BHQ1, h_ue_zul, c)
b_F_eff   = b_F - 2 * xi_pf * h_ue_zul     # wirksame Feldbreite je Feld

n_minus1  = math.ceil(b_eff_erf / b_F_eff)  # benötigte Anzahl (n-1)-Felder
n         = n_minus1 + 1                     # Gesamtanzahl Wehrfelder

print(f"Kombinierter Poleni-Koeffizient c_pol = {c_pol:.4f}")
print(f"Erforderliche b_eff (n-1-Fall) = {b_eff_erf:.2f} m")
print(f"Wirksame Feldbreite b_F_eff    = {b_F_eff:.2f} m")
print(f"Benötigte (n-1)-Felder         = {n_minus1}")
print(f"Gewählte Wehrfeldanzahl n      = {n}")
Kombinierter Poleni-Koeffizient c_pol = 1.8899
Erforderliche b_eff (n-1-Fall) = 29.81 m
Wirksame Feldbreite b_F_eff    = 14.78 m
Benötigte (n-1)-Felder         = 3
Gewählte Wehrfeldanzahl n      = 4

Wehrabmessungen und Breite

n_pfeiler  = n - 1               # Zwischenpfeiler
b_licht    = n * b_F             # lichte Gesamtbreite (nur Felder)
b_pfeiler  = n_pfeiler * b_pf    # Summe Pfeilerbreiten
b_gesamt   = b_licht + b_pfeiler # Gesamtbreite inkl. Pfeiler

print(f"Anzahl Zwischenpfeiler : {n_pfeiler}")
print(f"Lichte Gesamtbreite    : {b_licht:.1f} m")
print(f"Summe Pfeilerbreiten   : {b_pfeiler:.2f} m")
print(f"Bauwerksbreite gesamt  : {b_gesamt:.2f} m")
Anzahl Zwischenpfeiler : 3
Lichte Gesamtbreite    : 60.0 m
Summe Pfeilerbreiten   : 10.12 m
Bauwerksbreite gesamt  : 70.12 m

(n‑1) -- Nachweis

Bedingung: Mit (n−1)(n-1) aktiven Feldern muss gelten: hu¨≤hu¨,zulh_{\text{ü}} \leq h_{\text{ü,zul}}

Zusätzlich werden BHQ₁ und BHQ₂ mit allen nn Feldern geprüft.

faelle = [
    ("BHQ1, alle n Felder",   BHQ1, n),
    ("BHQ1, (n-1) Felder",    BHQ1, n - 1),
    ("BHQ2, alle n Felder",   BHQ2, n),
]

print(f"{'Fall':<28} {'n_akt':>5} {'b_eff':>8} {'h_ü':>7} {'≤ h_ü,zul?':>10}")
print("-" * 62)
for label, Q, n_akt in faelle:
    h_ue_iter = h_ue_zul
    for _ in range(20):
        beff = b_eff_n_felder(n_akt, h_ue_iter)
        h_ue_neu = h_ue_von_Q(Q, beff, c)
        if abs(h_ue_neu - h_ue_iter) < 1e-6:
            break
        h_ue_iter = h_ue_neu
    ok = "OK" if h_ue_iter <= h_ue_zul else "!!"
    print(f"{label:<28} {n_akt:>5} {beff:>8.2f} {h_ue_iter:>7.3f} {ok:>10}")

print(f"\n  h_ü,zul = {h_ue_zul:.2f} m  (max. zulässige Überfallhöhe bei BHQ1)")
Fall                         n_akt    b_eff     h_ü ≤ h_ü,zul?
--------------------------------------------------------------
BHQ1, alle n Felder              4    59.44   0.694         OK
BHQ1, (n-1) Felder               3    44.49   0.842         OK
BHQ2, alle n Felder              4    59.33   0.831         OK

  h_ü,zul = 1.10 m  (max. zulässige Überfallhöhe bei BHQ1)

Stauziel- & Freibord-Check

Nachweis: hu¨(n−1)≤hu¨,zulh_{\text{ü}}(n-1) \leq h_{\text{ü,zul}} — der höchste zulässige Oberwasserstand zHz_H wird eingehalten.

Der Freibord ff (DIN 19700: f≥0,5f \geq 0{,}5 m bei BHQ₁; u. a. für Wellen und Wind) liegt oberhalb von zHz_H und ist nicht mit der Marge bis hu¨,zulh_{\text{ü,zul}} zu verwechseln:

Kronenhöhe =hu¨,zul+f= h_{\text{ü,zul}} + f (über Wehrschwelle)

# h_ue bei BHQ1, (n-1)-Felder (maßgebender Fall der (n-1)-Regel)
h_ue_n1 = h_ue_zul
for _ in range(20):
    beff_n1 = b_eff_n_felder(n - 1, h_ue_n1)
    h_ue_n1 = h_ue_von_Q(BHQ1, beff_n1, c)

stau_marge  = h_ue_zul - h_ue_n1   # > 0: zulässiger Aufstau eingehalten
kronenhoehe = h_ue_zul + f

stau_kriterium = 'OK' if stau_marge >= 0 else 'Nicht erfüllt'

print(f"h_ü bei BHQ1, (n-1)-Felder        : {h_ue_n1:.3f} m")
print(f"Marge bis h_ü,zul (Stau-Reserve)  : {stau_marge:.3f} m")
print(f"Kronenhöhe (= h_ü,zul + f)        : {kronenhoehe:.2f} m über Wehrschwelle")
print(f"Stauziel-Nachweis h_ü <= h_ü,zul  : {stau_kriterium}")
print(f"Freibordanforderung f >= 0,5 m    : {'OK' if f >= 0.5 else 'Nicht erfüllt'}")
h_ü bei BHQ1, (n-1)-Felder        : 0.842 m
Marge bis h_ü,zul (Stau-Reserve)  : 0.258 m
Kronenhöhe (= h_ü,zul + f)        : 1.60 m über Wehrschwelle
Stauziel-Nachweis h_ü <= h_ü,zul  : OK
Freibordanforderung f >= 0,5 m    : OK

Teil 2: Tosbeckenbemessung

Konzept

Ziel ist es, den Wechselsprung innerhalb des Tosbeckens zu erzwingen. Konstruktiver Freiheitsgrad: Tosbeckeneintiefung ee (in m).

Einstaugrad ε\varepsilon muss im Zielbereich liegen:

ε=hu+eh2∈[1,05;  1,15]\varepsilon = \frac{h_u + e}{h_2} \in [1{,}05;\; 1{,}15]

Iterativer Algorithmus (vgl. Vorlesungsfolie):

SchrittInhalt
Aee festlegen (Startwert)
Bh1h_1, v1v_1 aus Bernoulli-Gleichung (Energiehöhe HgesH_{\text{ges}})
CFr1=v1/g h1Fr_1 = v_1 / \sqrt{g\,h_1}
D4,5≤Fr1<9,04{,}5 \leq Fr_1 < 9{,}0? → Nein: ee anpassen
Ehuh_u aus Manning–Strickler bzw. gemessen
Fh2=h12(1+8 Fr12−1)h_2 = \dfrac{h_1}{2}\left(\sqrt{1+8\,Fr_1^2}-1\right) (Bélanger)
G1,05≤ε≤1,151{,}05 \leq \varepsilon \leq 1{,}15? → Nein: ee anpassen
+lTl_T und lKl_K berechnen

Zusätzliche Eingangsgrößen Tosbecken

Neben den Wehrparametern werden benötigt:

SymbolBedeutung
wwWehrhöhe über UW-Sohle (m)
kStk_{St}Strickler-Beiwert der UW-Strecke (m¹/³/s)
IEI_EEnergieliniengefälle der UW-Strecke (= Sohlgefälle bei Normalabfluss) (–)
BuB_uBreite der UW-Strecke (m)
hu¨,tosh_{\text{ü,tos}}Überfallhöhe im maßgebenden Lastfall (m)
HgesH_{\text{ges}}Gesamtenergielinie über Tosbeckensohle: Hges=hu¨,tos+w+eH_{\text{ges}} = h_{\text{ü,tos}} + w + e

Der Einheitsdurchfluss qq für die Tosbeckenbemessung wird konservativ aus dem (n−1)(n-1)-Felder-Fall berechnet (DIN 19700, (n‑1)‑Regel): Mit einem ausgefallenen Feld steigt qq je Feldbreite — das ist der maßgebende Lastfall für das Tosbecken. Die Energiehöhe HgesH_{\text{ges}} wird mit der zum Lastfall gehörenden Überfallhöhe hu¨,tosh_{\text{ü,tos}} angesetzt (nicht mit hu¨,zulh_{\text{ü,zul}}), damit qq und HgesH_{\text{ges}} konsistent sind.

w_wehr = 2.5   # m       Wehrhöhe über UW-Sohle
k_st   = 30.0  # m^1/3/s Strickler-Beiwert UW-Strecke (naturnahe Sohle)
I_E    = 0.001 # --      Energieliniengefälle UW-Strecke (= Sohlgefälle bei Normalabfluss)
b_u    = 40.0  # m       Breite UW-Strecke (Rechteckprofil)

# Einheitsdurchfluss für Tosbecken: konservativer (n-1)-Felder-Fall (DIN 19700)
n_tos    = n - 1     # aktive Felder im maßgebenden Lastfall
h_ue_tos = h_ue_zul  # Startwert für Fixpunkt-Iteration
for _ in range(20):
    beff_tos = b_eff_n_felder(n_tos, h_ue_tos)
    h_ue_tos = h_ue_von_Q(BHQ1, beff_tos, c)

q = BHQ1 / beff_tos   # m²/s – Einheitsdurchfluss im (n-1)-Felder-Fall

# h_ü bei BHQ1 mit allen n Feldern (für die Zusammenfassung)
h_ue_n = h_ue_zul
for _ in range(20):
    beff_n = b_eff_n_felder(n, h_ue_n)
    h_ue_n = h_ue_von_Q(BHQ1, beff_n, c)

print(f"Maßgebender Lastfall: {n_tos} aktive Felder, b_eff = {beff_tos:.2f} m, h_ü = {h_ue_tos:.3f} m")
print(f"Einheitsdurchfluss q = BHQ1/b_eff  = {q:.3f} m²/s")
Maßgebender Lastfall: 3 aktive Felder, b_eff = 44.49 m, h_ü = 0.842 m
Einheitsdurchfluss q = BHQ1/b_eff  = 1.461 m²/s

Unterwassertiefe huh_u durch Manning-Strickler (Vorbereitung Schritt E)

Für ein Rechteckprofil gilt:

Q=kSt⋅A⋅R2/3⋅IE1/2mit A=bu⋅hu,R=bu⋅hubu+2 huQ = k_{St} \cdot A \cdot R^{2/3} \cdot I_E^{1/2} \qquad \text{mit } A = b_u \cdot h_u,\quad R = \frac{b_u \cdot h_u}{b_u + 2\,h_u}

Ein numerischer 1D-Gleichungslöser für die Manning kann mittels folgender Funktion definiert und in der Folge aufgerufen werden:

def Q_manning(h, b, k, I):
    A = b * h
    R = (b * h) / (b + 2 * h)
    return k * A * R**(2/3) * math.sqrt(I)

# brentq sucht h in [0.01, 20] m mit Q_manning(h) = BHQ1
h_u = brentq(lambda h: Q_manning(h, b_u, k_st, I_E) - BHQ1, 0.01, 20.0)

print(f"Unterwassertiefe h_u = {h_u:.3f} m")
print(f"Probe: Q_Manning = {Q_manning(h_u, b_u, k_st, I_E):.2f} m³/s  (Soll: {BHQ1} m³/s)")
Unterwassertiefe h_u = 1.420 m
Probe: Q_Manning = 65.00 m³/s  (Soll: 65.0 m³/s)

Schritte A bis G: Iterative Tosbecken-Bemessung

Schritt B Herleitung von h1h_1 und v1v_1

Energiehöhe über Tosbeckensohle (Bernoulli; v0v_0 vernachlässigt unter der Annahme v0<1,0v_0 < 1{,}0 m/s — im Anwendungsfall prüfen):

Hges=hu¨,tos+w+eH_{\text{ges}} = h_{\text{ü,tos}} + w + e

Am schießenden Querschnitt 1 (Tosbeckeneinlauf):

Hges=h1+v122g=h1+q22g h12H_{\text{ges}} = h_1 + \frac{v_1^2}{2g} = h_1 + \frac{q^2}{2g\,h_1^2}

Kodieren des Arbeitsablaufs

Der Arbeitsablauf (Workflow) der Tosbeckenbemessung sowie die Ermittlung des k-Faktor in Abhängigkeit der Froude-Zahl wird in zwei Funktionen definiert, mit ee als Eingangsvariable:

def tosbecken_check(e):
    """
    Führt Schritte A-G des Tosbecken-Workflows für gegebene Eintiefung e durch.
    Gibt (Fr1, epsilon, h1, h2, ok_Fr, ok_eps) zurück.
    """
    # Schritt B: h1 aus Bernoulli (kleine, schießende Wurzel);
    # Energiehöhe konsistent mit dem Lastfall des Einheitsdurchflusses q
    H_ges = h_ue_tos + w_wehr + e
    # Suche h1 < h_grenz (kritische Tiefe) = (q**2/g)^(1/3)
    h_krit = (q**2 / g)**(1/3)
    h1 = brentq(lambda h: h + q**2 / (2 * g * h**2) - H_ges, 1e-4, h_krit)
    v1 = q / h1

    # Schritt C: Froude-Zahl
    Fr1 = v1 / math.sqrt(g * h1)

    # Schritt D: Fr1-Check
    ok_Fr = 4.5 <= Fr1 < 9.0

    # Schritt F: konjugierte Tiefe h2 (Belanger)
    h2 = (h1 / 2) * (math.sqrt(1 + 8 * Fr1**2) - 1)

    # Schritt G: Einstaugrad
    eps = (h_u + e) / h2
    ok_eps = 1.05 <= eps <= 1.15

    return Fr1, eps, h1, h2, ok_Fr, ok_eps


# k-Faktor für Tosbeckenlänge (vgl. Peterka 1984 / USBR)
def k_faktor(Fr1):
    if   Fr1 < 2.4:  return 4.8
    elif Fr1 < 4.0:  return 4.8 + (Fr1 - 2.4) / (4.0 - 2.4) * (5.8 - 4.8)
    elif Fr1 < 5.0:  return 5.8 + (Fr1 - 4.0) * (6.0 - 5.8)
    elif Fr1 < 6.0:  return 6.0 + (Fr1 - 5.0) * (6.13 - 6.0)
    elif Fr1 <= 11.0: return 6.13
    else:            return 6.0

Iterieren über ee

Die Eintiefung kann nun mittels der zuvor definierten Funktionen berechnet werden, basierend auf einem Startwert und einem Wertebereich:

e_test   = 1.0   # m Startwert (Schritt A)
e_min    = 0.0   # m Suchbereich untere Grenze
e_max    = 3.0   # m Suchbereich obere Grenze
iterationen = []

print(f"{'Iter':>4}  {'e [m]':>7}  {'Fr1':>6}  {'Fr-OK':>6}  {'h1 [m]':>8}  {'h2 [m]':>8}  {'ε':>6}  {'ε-OK':>6}")
print("-" * 65)

for i in range(1, 15):
    Fr1, eps, h1, h2, ok_Fr, ok_eps = tosbecken_check(e_test)
    iterationen.append((e_test, Fr1, eps, h1, h2, ok_Fr, ok_eps))

    fr_sym  = "OK" if ok_Fr  else "Nicht erfüllt"
    eps_sym = "OK" if ok_eps else "Nicht erfüllt"
    print(f"{i:>4}  {e_test:>7.3f}  {Fr1:>6.2f}  {fr_sym:>6}  {h1:>8.4f}  {h2:>8.4f}  {eps:>6.3f}  {eps_sym:>6}")

    if ok_Fr and ok_eps:
        print("\n >>> Kriterien erfüllt: Iteration beendet.")
        break

    # Anpassungsstrategie (Bisektionslogik, vgl. Vorlesungsfolie):
    # größeres e -> größere Energiehöhe -> kleineres h1 -> größeres Fr1
    if not ok_Fr:
        # Fr1 < 4.5 >>> e zu klein (e erhöhen); Fr1 >= 9.0 >>> e zu groß (e verringern)
        if Fr1 < 4.5:
            e_min = e_test
        else:  # Fr1 >= 9.0
            e_max = e_test
    else:
        # ok_Fr = True, aber ok_eps = False
        if eps > 1.15:   # zu viel Einstau >>> e verringern
            e_max = e_test
        else:            # eps < 1.05 >>> zu wenig Einstau >>> e erhöhen
            e_min = e_test

    e_test = 0.5 * (e_min + e_max)  # Bisektion

# Endwerte speichern
e_opt = e_test
Fr1_opt, eps_opt, h1_opt, h2_opt, ok_Fr_opt, ok_eps_opt = tosbecken_check(e_opt)
if not (ok_Fr_opt and ok_eps_opt):
    print("\n >>> Keine Lösung im Suchbereich [e_min, e_max]: Kriterien nicht gleichzeitig erfüllbar.")
    print("     Abhilfe: Schikanen (Blöcke, Zähne, Endschwelle) oder Randbedingungen prüfen (vgl. Vorlesung).")
Iter    e [m]     Fr1   Fr-OK    h1 [m]    h2 [m]       ε    ε-OK
-----------------------------------------------------------------
   1    1.000    7.20      OK    0.1613    1.5637   1.547  Nicht erfüllt
   2    0.500    6.53      OK    0.1722    1.5060   1.275  Nicht erfüllt
   3    0.250    6.18      OK    0.1785    1.4745   1.132      OK

 >>> Kriterien erfüllt: Iteration beendet.

Tosbeckenlänge lTl_T und Kolkschutzlänge lKl_K

Nach Peterka (1958/1984):

lT=k⋅h2lK=3,5⋅lTl_T = k \cdot h_2 \qquad l_K = 3{,}5 \cdot l_T
Fr1Fr_12,4456–1114
kk4,85,866,136

Tosbecken- und Kolkschutzlänge können durch Aufrufen der oben definierten Funktion für die Abschätzung des k-Faktors berechnet werden:

k   = k_faktor(Fr1_opt)
l_T = k * h2_opt
l_K = 3.5 * l_T

print(f"Optimierte Eintiefung   e   = {e_opt:.3f} m")
print(f"Schießende Tiefe        h1  = {h1_opt:.4f} m")
print(f"Froude-Zahl             Fr1 = {Fr1_opt:.2f}")
print(f"Konjugierte Tiefe       h2  = {h2_opt:.3f} m")
print(f"Unterwassertiefe        h_u = {h_u:.3f} m")
print(f"Einstaugrad             ε   = {eps_opt:.3f}  (Ziel: 1,05-1,15)")
print()
print(f"k-Faktor (Fr1={Fr1_opt:.1f})  k   = {k:.2f}")
print(f"Tosbeckenlänge          l_T = {l_T:.2f} m")
print(f"Kolkschutzlänge         l_K = {l_K:.2f} m")
Optimierte Eintiefung   e   = 0.250 m
Schießende Tiefe        h1  = 0.1785 m
Froude-Zahl             Fr1 = 6.18
Konjugierte Tiefe       h2  = 1.475 m
Unterwassertiefe        h_u = 1.420 m
Einstaugrad             ε   = 1.132  (Ziel: 1,05-1,15)

k-Faktor (Fr1=6.2)  k   = 6.13
Tosbeckenlänge          l_T = 9.04 m
Kolkschutzlänge         l_K = 31.64 m

Zusammenfassung der hydraulischen Durchbildung inkl. Tosbeckenbemessung

summary = {
    "Hydraulik_Wehr": {
        "BHQ1 (m3/s)":                       BHQ1,
        "BHQ2 (m3/s)":                       BHQ2,
        "h_ue_zul (m)":                      h_ue_zul,
        "Freibord (m)":                       f,
        "n (Wehrfelder)":                     n,
        "bF (m)":                            b_F,
        "Lichte Breite (m)":                  round(b_licht, 2),
        "Gesamtbreite (m)":                   round(b_gesamt, 2),
        "hü bei BHQ1 mit n Feldern (m)":      round(h_ue_n, 3),
        "hü bei BHQ1 mit (n-1) Feldern (m)":  round(h_ue_n1, 3),
        "Stau-Marge (n-1)-Fall (m)":          round(stau_marge, 3),
        "Nachweis h_ü <= h_ü,zul":            stau_kriterium,
        "Kronenhöhe (m)":                     round(kronenhoehe, 2),
    },
    "Tosbecken": {
        "Wehrhöhe w (m)":                w_wehr,
        "Abfluss je Meter Wehrbreite (m²/s)":  round(q, 3),
        "hu (m)":      round(h_u, 3),
        "eopt (m)":    round(e_opt, 3),
        "h1 (m)":      round(h1_opt, 4),
        "h2 (m)":      round(h2_opt, 3),
        "Fr1":         round(Fr1_opt, 2),
        "epsilon":     round(eps_opt, 3),
        "k":           round(k, 2),
        "lT (m)":      round(l_T, 2),
        "lK (m)":      round(l_K, 2),
        "Energieumwandlung im Tosbecken": 'OK' if (ok_Fr_opt and ok_eps_opt) else 'Nicht erfüllt',
    },
}
pprint(summary)
{'Hydraulik_Wehr': {'BHQ1 (m3/s)': 65.0,
                    'BHQ2 (m3/s)': 85.0,
                    'Freibord (m)': 0.5,
                    'Gesamtbreite (m)': 70.12,
                    'Kronenhöhe (m)': 1.6,
                    'Lichte Breite (m)': 60.0,
                    'Nachweis h_ü <= h_ü,zul': 'OK',
                    'Stau-Marge (n-1)-Fall (m)': 0.258,
                    'bF (m)': 15.0,
                    'h_ue_zul (m)': 1.1,
                    'hü bei BHQ1 mit (n-1) Feldern (m)': 0.842,
                    'hü bei BHQ1 mit n Feldern (m)': 0.694,
                    'n (Wehrfelder)': 4},
 'Tosbecken': {'Abfluss je Meter Wehrbreite (m²/s)': 1.461,
               'Energieumwandlung im Tosbecken': 'OK',
               'Fr1': 6.18,
               'Wehrhöhe w (m)': 2.5,
               'eopt (m)': 0.25,
               'epsilon': 1.132,
               'h1 (m)': 0.1785,
               'h2 (m)': 1.475,
               'hu (m)': 1.42,
               'k': 6.13,
               'lK (m)': 31.64,
               'lT (m)': 9.04}}

Grenzen der Vereinfachung

Dieses Notebook ersetzt nicht:

  • standortbezogene Hydrologie (BHQ-Bestimmung)

  • 1D/2D-Wasserstandsberechnungen für mehrere Abflüsse

  • die Rechteckannahme für das Unterwasser ist schwach und sollte durch genauere hydraulische und Geländedaten ersetzt werden

  • Nachweise für mehrere Last- und Ausfallfälle (a > 1, BHQ₂, ...)

  • geotechnische Nachweise

  • konstruktive Bemessung nach den jeweils einschlägigen Regeln

  • Nachweise für Fischdurchgängigkeit, Sedimentmanagement und Betriebssicherheit