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.

Konvergenz (Quantitative)

Dieses Kapitel verwendet die Simulationsdateien der Telemac steady 2d tutorial, mit einer geänderten Definition des Zeitschritts und der Ausgabeperioden:

/ steady2d-conv.cas
TIME STEP : 1.
NUMBER OF TIME STEPS : 10000
GRAPHIC PRINTOUT PERIOD : 50
LISTING PRINTOUT PERIOD : 50

Darüber hinaus wurde die Simulation mit der -s-Flagge neu ausgeführt, die die vollständige Auflistung an eine Datei namens [FILE-NAME].cas_YEAR-MM-DD-HHhMMminSSs.sortie im Simulationsverzeichnis schreibt:

telemac2d.py steady2d-conv.cas -s

Sowohl die Steuerung .cas als auch die .sortie Dateien können von den hydro-informatics.com Repositories heruntergeladen werden:

Daten extrahieren und überprüfen

Die TELEMAC Jupyter Notebook-Vorlagen (HOMETEL/notebooks/ > data manip/extraction/*.ipynb oder workshops/exo fluxes.ipynb) liefern Leitlinien für die Datenextraktion aus Simulationsergebnissen; die Templates stellen jedoch keinen direkt anwendbaren Rahmen für die Bewertung der Massenkonvergenz an den Grenzen in Abhängigkeit von NUMBER OF TIME STEPS. Zu diesem Zweck unterhält hydro-informatics.com das leichte Python-Paket pythomac (Version ≥ 3.0.0 wird hier beschrieben). Das Paket benötigt nur numpy, pandas und matplotlib (see the Python installation guide) und läuft außerhalb der TELEMAC Python-Umgebung. Zwei Installationsoptionen stehen zur Verfügung:

pip-install pythomac (recommended)
editable install from source

Installieren Sie das pythomac Paket aus dem Python Package Index:

pip install pythomac

Die zentrale Funktion ist pythomac.extract_fluxes(). Es ordnet die jüngste .sortie-Liste neben der Lenkdatei, parsiert die Lautstärkebilanz und den für jede Flüssigkeitsgrenze gedruckten signierten Fluss bei jedem Auflistungsdruck (beide die klassischen THERE IS n LIQUID BOUNDARIES und die TELEMAC v9 NUMBER OF LIQUID BOUNDARIES: Auflistungsformate werden erkannt) und schreibt in das Simulationsverzeichnis:

The function returns the extracted series as a pandas.DataFrame indexed by simulation time; the working directory of the calling process is not modified. The implementation can be inspected in flux_analyst.py on GitHub, and the complete API documentation is available at https://pythomac.readthedocs.io.

Um die Funktion anzuwenden, kopieren Sie den folgenden Code in ein neues Python-Skript namens z.B. example_flux_convergence.py, das sich im Verzeichnis befindet, in dem die trocken-initialisierte stationäre2d-Simulation lief (oder download example flux convergence.py):

# example_flux_convergence.py

from pathlib import Path
from pythomac import extract_fluxes

simulation_dir = str(Path(__file__).parents[1])
telemac_cas = "steady2d.cas"

fluxes_df = extract_fluxes(
    model_directory=simulation_dir,
    cas_name=telemac_cas,
    plotting=True
)

Führen Sie das Python-Skript von einem Terminal (oder Anaconda Prompt) im Simulationsverzeichnis aus:

python example_flux_convergence.py

Das Skript platziert im Simulationsordner:

python telemac flux discharge convergence pythomac

Figure 1:Fluxgrößen über die beiden Flüssigkeitsgrenzen der trocken-initialisierten stationären Telemac2d-Simulation über die simulierte Zeit, die mit der pythomac.extract fluxes()-Funktion erzeugt wird.

Konvergence identifizieren

Um zu beurteilen, ob und wann die Grenzflüsse konvergiert werden, wird die relative Flussungleichgewichte zu jeder Druckzeit tt als:

εt=Qi,tQj,tQj,t\varepsilon_{t} = \frac{\left| |Q_{i,t}| - |Q_{j,t}| \right|}{|Q_{j,t}|}

wobei Qi,tQ_{i,t} und Qj,tQ_{j,t} = der Abfluss und der Zufluss über die Modellgrenzen hinweg zum Zeitpunkt tt bzw. Die Flussgrößen |\cdot| sind erforderlich, weil TELEMAC Grenzflüsse mit einer Vorzeichenkonvention meldet (Zufluss positiv, Abflussnegativ); Massenbilanz entspricht daher Qi,t=Qj,t|Q_{i,t}| = |Q_{j,t}|, so dass εt0\varepsilon_{t} \to 0 at Konvergenz und Normalisierung durch den Zufluss Qj,t|Q_{j,t}| rendersεt\varepsilon_{t} dimensionslos. In einer stabilen stetigen Simulation nähert sich das Verhältnis aufeinanderfolgender Flussungleichgewichte einer Konvergenzkonstanten cεc_{\varepsilon} gleich der Einheit mit zunehmender Zeit:

limtεt+1εtι=cε\lim_{t\to \infty} \frac{\varepsilon_{t+1}}{\varepsilon^{\iota}_{t}} = c_{\varepsilon}

Die Kombination der Konvergenzrate (oder Bestellung) ι\iota und der Konvergenzkonstante cεc_{\varepsilon} gibt an:

Die Zeit, zu der eine stetige Simulation als stabiler Zustand betrachtet werden kann, wird durch den Beginn der sublinearen Konvergenz (ι\iota = 1 und cεc_{\varepsilon} = 1) ermittelt, d.h. die Zeit tt, über die jeder zusätzliche Schritt t+1t+1 die Modellgenauigkeit nur unwesentlich verbessert (der Begriff insignificant wird in der section below quantifiziert). Unter der Annahme, dass das Modell in irgendeiner Form konvergiert, ergibt die Einstellung cεc_{\varepsilon} = 1 ι(t)\iota(t) in Abhängigkeit von εt\varepsilon_{t} und εt+1\varepsilon_{t+1}:

\begin{align} \label{estimate convergence} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (c {\varepsilon} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ \iota(t) &= \log {\varepsilon {t}\varepsilon {t+1} & (Ausrichtung)

Diese Beziehungen werden in der pythomac.calculate_convergence()-Funktion umgesetzt, die eine pandas.DataFrame mit den Spalten "Relative imbalance" (εt+1\varepsilon_{t+1}, Equation(1)) und "Convergence rate" (ι(t)\iota(t)) zurückgibt. Sein Kern lautet:

import numpy as np
import pandas as pd


def calculate_convergence(series_1, series_2, conv_constant=1.):
    # relative flux imbalance epsilon_t = ||Q_in| - |Q_out|| / |Q_in|; the magnitudes |.|
    #   are needed because Telemac reports outflow negative, so that balance -> epsilon -> 0
    epsilon = np.abs(np.abs(series_1) - np.abs(series_2)) / np.abs(series_1)
    # derive epsilon at t and t+1
    epsilon_t0 = epsilon[:-1]  # cut off last element
    epsilon_t1 = epsilon[1:]   # cut off element zero
    # return the relative imbalance and the convergence rate iota as a pandas DataFrame
    return pd.DataFrame({
        "Relative imbalance": epsilon_t1,
        "Convergence rate": np.emath.logn(epsilon_t0, epsilon_t1) / conv_constant,
    })

Um ι(t)\iota(t) (Python variabler Name: iota_t) mit der obigen Funktion zu berechnen, ändern Sie die example flux convergence.py Python Skript wie folgt:

# example_flux_convergence.py

# ...
# add to header:
from pythomac import calculate_convergence

# calculate fluxes_df (see above code block)
fluxes_df = [...]

# back-calculate the printout spacing (in simulation seconds) from the flux index
timestep_in_cas = int(max(fluxes_df.index.values) / (len(fluxes_df.index.values) - 1))

# calculate iota (t) with the calculate_convergence function
iota_t = calculate_convergence(
    series_1=fluxes_df["Fluxes Boundary 1"][1:],  # remove first zero-entry
    series_2=fluxes_df["Fluxes Boundary 2"][1:],  # remove first zero-entry
    cas_timestep=timestep_in_cas,
    plot_dir=simulation_dir,
)

Die daraus resultierende Konvergenzrate ι(t)\iota(t) ist in Fig. 2 für die steady 2d tutorial mit den geänderten Ausdrucksperioden von 50Sek. und einer Gesamtsimulationszeit von 10000Sek. aufgetragen.

convergence rate fluxes telemac boundaries

Figure 2:Die Konvergenzrate ι\iota in Abhängigkeit von den 10000 Simulationszeitschritten der stationären 2d-Simulation.

Abwechslungsreiche Simulationszeit

Um die Rechenzeit zu berechnen, ist der Zeitschritt, zu dem die Zu- und Abflüsse zusammenfließen, von praktischem Interesse. Die in Fig. 1 und der Konvergenzrate in Fig. 2 erstellten Flußmittel legen qualitativ nahe, dass die Simulation nach ca. 6000 Sekunden stabilisiert ist (Zeitschritte). Die lokale Extrema in beiden Figuren in der Nähe von 4000 Zeitschritten markieren die Wechselwirkung der Netzfronten, die sich von den vor- und nachgelagerten Grenzen ausbreiten (siehe animation in the steady 2d tutorial); monotone Konvergenz setzt erst danach ein.

Da ein rein visuelles Konvergenzurteil subjektiv ist, wird ein objektives Kriterium angenommen: Die optimale Simulationslänge ist die kleinste Zeit tt, über die das relative Flussungleichgewicht εt\varepsilon_{t} (Equation (1)) dauerhaft unter einer Zieltoleranz εtar\varepsilon_{tar} bleibt. Toleranzen von εtar\varepsilon_{tar} = 104^{-4} sind in der Regel für Vorkalibrierungen akzeptabel, während Validierung und Hotstart-Initialisierung kleinere Werte (106^{-6} oder kleiner) garantieren. Wie Fig. 2 illustriert, kann das Ungleichgewicht vorübergehend unter die Toleranz fallen und wieder ansteigen (hier bei 4000 Zeitschritten, wenn die vorgeschaltete Front die nachgeschaltete Grenze passiert); nur die endgültige, dauerhafte Überquerung ist relevant. Die algorithmische Umsetzung erfasst daher das letzte Mal, bei dem εtεtar\varepsilon_{t} \geq \varepsilon_{tar} den nachfolgenden Ausdruck als Konvergenzzeit bezeichnet. Dieses Kriterium wird in pythomac.get_convergence_time(), die den Ausdrucksindex der Dauerüberfahrt zurückgibt, oder numpy.nan (mit Warnung) umgesetzt, wenn die Toleranz niemals erhalten bleibt. Das Skript example flux convergence.py wie folgt ändern:

# example_flux_convergence.py

# ...
# add to header:
from pythomac import get_convergence_time

# calculate fluxes_df and iota_t (see above code blocks)
fluxes_df = [...]
iota_t = [...]

# identify the printout index from which the relative flux imbalance stays
# permanently below the target tolerance (epsilon_tar)
convergence_time_iteration = get_convergence_time(
    relative_imbalance=iota_t["Relative imbalance"],
    convergence_precision=1.0E-4
)

if not str(convergence_time_iteration).lower() == "nan":
    print("The simulation converged after {0} simulation seconds ({1}th printout).".format(
            str(timestep_in_cas * convergence_time_iteration), str(convergence_time_iteration)))
The simulation converged after 6000 simulation seconds (120th printout).

Mit der festgelegten Konvergenzzeit kann das NUMBER OF TIME STEPS Schlüsselwort in der .casLenkungsdatei entsprechend reduziert werden, beispielsweise:

/ steady2d-conv.cas
TIME STEP : 1.
NUMBER OF TIME STEPS : 6000
GRAPHIC PRINTOUT PERIOD : 50
LISTING PRINTOUT PERIOD : 50

Fehlerbehebung Instabilitäten & Divergenz

Wenn eine stetige Simulation keine stabilen Flußmittel erreicht, oder wenn die Flußmittel divergieren, überprüfen Sie, ob alle Grenzen gemäß der Spotlight-Sektion auf boundary conditions robust definiert sind und konsultieren Sie den Workflow in der Rubrik mass conservation.