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, aber mit einer etwas anderen Definition von Zeitschritten und Ausdruckzeiten:

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

Zusätzlich wurde die Simulation mit der -s-Flagge wiederholt, die den Simulationszustand in einer Datei speichert, die ähnlich [FILE-NAME].cas_YEAR-MM-DD-HHhMMminSSs.sortie aufgerufen wird.

telemac2d.py steady2d-conv.cas -s

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

Daten extrahieren und überprüfen

The Telemac jupyter notebook templates (HOMETEL/notebooks/ > data_manip/extraction/*.ipynb or workshops/exo_fluxes.ipynb) provide some guidance for extracting data from simulation results, which can be tweaked into a generally applicable framework for observing mass convergence at the boundaries as a function of the defined NUMBER OF TIME STEPS. However, the notebook templates do not work straightforwardly, which is why the following paragraphs describe a simple, minimalist Python tweak called pythomac, developed by hydro-informatics.com. There are three options for working with our codes, and all of them require having an installation of Python along with the numpy, pandas, and matplotlib libraries (see the Python installation guide):

pip-install pythomac
clone pythomac
download pythomac as zip

Pip-installieren Sie das pythomac Paket:

pip install pythomac

Detailed instructions for using the extract_fluxes() function through pythomac and its dependencies (numpy, pandas, and matplotlib) can be found at https://pythomac.readthedocs.io.

Um die in pythomac definierten Funktionen zu nutzen, kopieren Sie den folgenden Code in ein neues Python-Skript, das z.B. example_flux_convergence.py im Verzeichnis aufgerufen wird, 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 Terminal (oder Anaconda Prompt) wie folgt aus (vergewissern Sie sich an cd in das Simulationsverzeichnis):

python example_flux_convergence.py

Das Skript wird im Simulationsordner platziert:

python telemac flux discharge convergence pythomac

Figure 1:Flux Konvergenzdiagramm über die beiden Grenzen der trocken-initialisierten stationären Telemac2d-Simulation mit einer Gesamtsimulationszeit von Zeitschritten Sekunden, erstellt mit der pythomac.extract fluxes() Funktion.

Konvergence identifizieren

Um zu testen, ob und wann die Flußmittel konvergiert werden, verfolgen wir das relative Flussungleichgewicht für jeden Zeitschritt tt als:

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

where Qi,tQ_{i,t} and Qj,tQ_{j,t} are the outflow and inflow fluxes across the model boundaries at timestep tt, respectively. The flux magnitudes |\cdot| are used because Telemac reports boundary fluxes with a sign (inflow positive, outflow negative); mass balance then corresponds to Qi,t=Qj,t|Q_{i,t}| = |Q_{j,t}|, so that εt0\varepsilon_{t} \to 0 at convergence, and normalizing by the inflow Qj,t|Q_{j,t}| makes εt\varepsilon_{t} dimensionless. In a stable steady simulation, the ratio of consecutive flux imbalances should converge toward a convergence constant cεc_{\varepsilon} equal to unity with increasing time:

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}:

Um den Zeitschritt zu bestimmen, bei dem eine stetige Simulation als stabiler Zustand betrachtet werden kann, möchten wir beobachten, wann ι\iota = 1 und cεc_{\varepsilon} = 1 die sublineare Konvergenz angeben. Das heißt, wir suchen den Zeitschritt tt, über den jeder zusätzliche Zeitschritt t+1t+1 nur unwesentlich die Modellpräzision verbessert (lesen Sie mehr über den Begriff insignificant in der below section). Unter der Annahme, dass die Modellkonvergenz in jeder Form vorliegt, können wir cεc_{\varepsilon} = 1 setzen, um ι(t)\iota (t) in Abhängigkeit von εt\varepsilon_{t} und εt+1\varepsilon_{t+1} zu berechnen:

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

Diese Gleichung kann in einer Python-Funktion wie folgt implementiert werden:

import numpy as np
import pandas as pd


def calculate_convergence(Q_in, Q_out, 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(Q_in) - np.abs(Q_out)) / np.abs(Q_in)
    # 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 Script:

# example_flux_convergence.py

# ...
# add to header (alternatively copy-paste the above function into this script):
from pythomac import calculate_convergence

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

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

The resulting convergence rate ι(t)\iota (t) is plotted in Fig. 2 for the steady 2d tutorial, with the modified printout periods of 50 seconds and a total simulation time of 10000 seconds.

convergence rate fluxes telemac boundaries

Figure 2:Die Konvergenzrate ι\iota als Funktion 10000 Simulations-Zeitschritte der stationären 2d-Simulation.

Abwechslungsreiche Simulationszeit

Um die Rechenzeit zu sparen, interessieren wir uns für den Zeitschritt, in dem die Zu- und Abflussströme konvergiert werden. Die in Fig. 1 aufgetragenen Flußmittel und die Konvergenzrate in Fig. 2 deuten qualitativ darauf hin, dass die Simulation nach etwa 6000 Sekunden stabil war (Zeitschritte). Die Stöße in beiden Figuren nach 4000 Zeitschritten geben gut an, dass der Fluss “Wellen” aus den vor- und nachgelagerten Grenzen kommt (siehe animation in the steady 2d tutorial). Erst danach hat sich die Konvergenz gesetzt.

Die Definition der Konvergenz kann subjektiv sein. Um die Rechenzeit zu sparen, suchen wir nach dem kleinsten Zeitschritt tt, über den das relative Flussungleichgewicht εt\varepsilon_{t} (Equation (1)) dauerhaft unter einer Zieltoleranz εtar\varepsilon_{tar} bleibt. Toleranzen von εtar\varepsilon_{tar} = 104^{-4} sind für die Vorabkalibrierung in der Regel zulässig, während Validierung und Hotstart-Initialisierung kleinere Werte (106^{-6} oder kleiner) garantieren. Wie Fig. 2 illustriert, kann das Ungleichgewicht kurz unter die Toleranz fallen und nach etwa 4000 Zeitschritten wieder ansteigen, wenn die vorgeschaltete “Welle” über die nachgeschaltete Grenze rollt; nur die letzte Dauerüberschreitung zählt. Deshalb wollen wir eine algorithmische Umsetzung, die den letzten Zeitschritt erkennt, an dem εtεtar\varepsilon_{t} \geq \varepsilon_{tar} den nächsten als Konvergenzzeit nimmt. Zu diesem Zweck können wir die oben gestartete example flux convergence.py hinzufügen. Python Script der folgende Code:

# example_flux_convergence.py

# ...

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

# calculate iota_t with calculate_convergence (also returns a "Relative imbalance" column)
iota_t = [...]

# define a desired target tolerance (epsilon_tar) for the relative flux imbalance
target_convergence_precision = 1.0E-4

# get the relative flux imbalance epsilon_t (Delta_Q) from calculate_convergence
relative_imbalance = iota_t["Relative imbalance"].to_numpy()

# find the index of the last element that still exceeds the target tolerance and add +1
#   (i.e., the first element from which the imbalance stays permanently below the tolerance)
below_tolerance = relative_imbalance < target_convergence_precision
idx = np.flatnonzero(~below_tolerance)[-1] + 1

# print the timestep at which the desired convergence was achieved to the console
printout_period_in_cas = 50  # the printout period defined in the cas file
print("The simulation converged after {0} simulation seconds ({1}th printout).".format(
        str(printout_period_in_cas * idx), str(idx)))
The simulation converged after 6000 simulation seconds (120th printout).

Nun, da Sie wissen, wann Ihre Telemac-Simulation zufriedenstellend konvergiert, können Sie den NUMBER OF TIME STEPS-Parameter in der .casLenkdatei reduzieren, zum Beispiel:

/ 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 niemals die Stabilität von Flußmitteln oder sogar Flussdivergenz erreicht, stellen Sie sicher, dass alle Grenzen nach dem Spotlight-Bereich auf boundary conditions robust definiert sind und einen Blick auf den Workflow im nächsten Abschnitt auf mass conservation haben.