Lernen Sie, wie Sie HEC-RAS Automatisieren – Die Monte Carlo-Methode geschrieben von Chris Goodell, 6. April 2020

Zunächst hoffe ich, dass alle HEC-RAS-Nutzer während dieser COVID19-Pandemie sicher und gesund bleiben. Ich hoffe, dass Sie inmitten all dies einige positive Ergebnisse finden werden. Vielleicht eine Re-Kalibration Ihrer Lebensprioritäten, Wiederverbindung (virtuell natürlich) mit Freunden und Familie, oder sogar eine neue Fähigkeit oder zwei zu lernen. Wenn Sie es nicht bereits haben, möchte ich Sie ermutigen, die zusätzliche Zeit zu nehmen, die Sie zu Hause haben, um zu lernen, wie HEC-RAS mit dem HECRASController zu automatisieren. Die Fähigkeit, HEC-RAS zu automatisieren, öffnet die Tür zu so vielen Dingen, die Sie mit HEC-RAS tun können, die mit der einzelnen Version einfach nicht möglich sind. Nehmen Sie zum Beispiel Monte Carlo Simulationen. Die Monte-Carlo-Methode (MCM) ist eine einfache, aber mächtige Möglichkeit, probabilistische hydraulische Modellierung zu erreichen. Tatsächlich sind MCM und der HECRASController ein großer Bestandteil meiner Software-Anwendung McBreach. Wenn Sie mit dieser Technik nicht vertraut sind, schauen Sie es auf das Web – es gibt Tonnen von Online-Ressourcen für MCM. Die MCM ist eine Möglichkeit für Sie, die Unsicherheit in den Eingangsparameter Ihres HEC-RAS-Modells zu quantisieren, um sinnvoller und nützlicher Ergebnisse zu erzielen. Zum Beispiel können Sie die Wahrscheinlichkeit der Überschwemmung bestimmen, im Gegensatz zu einem einzigen, deterministischen Überschwemmungsgrenz.

In diesem Beitrag werde ich Ihnen zeigen, wie man ein VBA (Visual Basic for Applications) Programm bauen kann, um HEC-RAS in einer Monte Carlo-Simulation durchzuführen (Ich möchte die Automatisierung von HEC-RAS mit VBA demonstrieren, weil es mit Excel kommt und gerade jeder hat Excel und ist damit vertraut. Mit einigen kleinen Syntax-Veränderungen können Sie diese Technik auf jede Programmiersprache wie Python, R, VB.Net anwenden, die sich auf eine Application Programming Interface (API) beziehen kann.

Dieser Automatisierungskode sammelt zufällig Manning’s n Werte über eine normale Verteilung und gilt diese n Werte für den Hauptkanal jedes Kreuzteil. Das HEC-RAS-Projekt wird nach jeder Prüfung neu ausgeführt. Die Wasseroberflächenhöhungen werden beim Abschluss jeder Iteration gespeichert und schließlich sortiert, um die Wahrscheinlichkeit der Wasseroberflächenhöhung an der River Station 6 von Critical Creek zu bestimmen. Geben Sie es einen Versuch und sehen stlb-bau Sie, wie mächtig (und einfach!) Automatisierung HEC-RAS sein kann. Hier ist, was Sie brauchen:

1 HEC-RAS Version 5.0.7 (Jede Version über 5.0 wird es jedoch tun).

2 und Microsoft Excel.

3 Die HEC-RAS Example Data Projekte. Diese kommen mit HEC-RAS, wenn Sie es installieren. Oder Sie können es von der HEC-Website herunterladen.

4 (Optional) Das Buch, „Breaking the HEC-RAS Code“. Während Sie dieses Beispiel ohne ihn tun können, ist dieses Buch eine großartige Ressource für die Automatisierung von HEC-RAS mit dem HECRASController.

Schritt 1: Stellen Sie sicher, dass Sie HEC-RAS 5.0.7 auf Ihrem Computer installiert haben. Stellen Sie auch sicher, dass Sie die HEC-RAS Example Data-Projekte installiert haben. Wenn Sie es nicht wissen oder nicht sicher sind, gehen Sie zum Help-Menü-Eintrag in HEC-RAS und klicken Sie auf “Install Example Projects…”

Standardmäßig möchte RAS diese Projekte hier installieren: C:\Users\[ein Benutzername]\Documents\HEC Data\HEC-RAS, aber Sie können sie wo immer Sie möchten auf Ihrem Computer speichern. Wenn Sie nicht die komprimierte Datei der Beispiele-Projekte haben, die mit der Installation von HEC-RAS kommen, erhalten Sie einen Fehler, wenn Sie versuchen, sie aus dem Menüelement zu installieren. Sie müssen diese komprimierte Datei von Beispieleprojekten direkt von der HEC-Website erhalten.

Schritt 2: Öffnen Sie das Critical Creek HEC-RAS Beispielprojekt. Wenn Sie Ihre Beispiele-Projekte im Standard-Dokument installiert haben, wird es hier sein: C:\Users\[ein Benutzername]\Documents\HEC Data\HEC-RAS\Example Data\Applications Guide\Chapter 1 – Critical Creek. Sie werden sehen, dass dies ein sehr einfaches 1D-Stabilstrom-Projekt ist. Stellen Sie einen Hinweis auf den Weg und den Filennamen des Critical Creek-Projekts auf Ihrem Computer. Zum Beispiel ist die Mine C:\HEC-RAS Examples\Applications Guide\Chapter 1 – Critical Creek\CRITCREK.prj. Sie werden den Dateinamen und den Weg später im Code verwenden. Sobald Sie bestätigt haben, können Sie das Projekt Critical Creek in HEC-RAS öffnen und Sie haben einige Zeit damit vertraut, gehen Sie voran und HEC-RAS schließen.

Schritt 3: Öffnen Sie Excel. In Excel verwenden wir den Visual Basic Editor, um unseren Automationskode zu schreiben. Aus dem Entwicklermenüelement in Excel wählen Sie „Visual Basic“ aus. Hier ist ein Link, der zeigt, wie Sie die Developer-Tab hinzufügen, wenn Sie es nicht bereits auf Ihrem Ribbon haben. Alternativ können Sie die Schlüssel Alt F11 verwenden. Der Visual Basic Editor öffnet sich und sieht so aus:

Jetzt fügen wir es in die HECRASController API als Verweis auf dieses Projekt hinzu. Dies gibt uns Zugang zu den HECRASController-Programmbibliotheken für den Einsatz in unserem Code. Dies ermöglicht es, Dinge wie automatische Öffnung von HEC-RAS, Ausführung von HEC-RAS, Änderung von n-Werte usw. Die HECRASController API kommt mit der Installation von HEC-RAS. So, wenn Sie HEC-RAS auf Ihrem Computer haben, haben Sie bereits die HEC-RAS API. Hinzufügen Sie im HECRASController als Referenz im Menüelement „Tools“ indem Sie „Referenzen“ auswählen, das Referenzfenster wird wie folgt angezeigt:

Klicken Sie unten, bis Sie “HEC River Analysis System” sehen. Wenn Sie mehrere Versionen von HEC-RAS auf Ihrem Computer installiert haben, sehen Sie hier eine Referenz für jeden. Stellen Sie sicher, dass Sie nur die Box für die Version von HEC-RAS überprüfen, die Sie verwenden möchten. Ich werde Version 5.0.7 verwenden, so dass das die ich ausgewählt habe. Klicken Sie auf OK, und jetzt haben Sie Zugriff auf die HECRASController API. Wenn Sie das HEC River Analysis System nicht in alphabetischer Reihenfolge sehen, überprüfen Sie die obere Liste. Wenn Excel erkennt, dass Sie es zuvor verwendet haben, wird es manchmal auf die Spitze der Liste bewegen.

Schritt 4 Geben Sie den Code ein. Im Registerbaum (in der Regel ist dies in der oberen linken Seite gedockt), klicken Sie rechts auf VBAProject und wählen Sie Insert…Module. Dies wird einen Platz für uns hinzufügen, um Programmierungskode zu schreiben und/oder einzufügen. Jetzt kopieren Sie den Code am unteren Teil dieses Posts und fügen Sie es in den Modul. Kopieren Sie alles im roten Font. Ihr Visual Basic Editor sollte jetzt so aussehen:

Bitte beachten Sie, dass der Text in grünem Font Kommentare sind. Sie werden Kommentare gemacht, indem sie eine Apostrophie (‘) vor ihm legen. Die Kommentare sind nicht wirklich Teil des Programmiers, sondern sind da, um zu erklären, was jedes Codeblock tut. Der Code selbst ist in blauer und schwarzer Schrift.

*Wenn Sie einen roten Schriftwort im Visual Basic Editor haben, ist es wahrscheinlich, dass die Apostrophen (‘) vor den Kommentaren als Akzente (`) festgelegt wurden. Visual Basic erkennt den Accent nicht. So können Sie entweder durch den Code gehen und alle Akzente (`) mit Apostrophen (‘) ersetzen oder einfach versuchen, den Code aus diesem Textdatei zu kopieren. https://drive.google.com/file/d/1I5oDfs6wIQnu_shwosGW0inSZRmbhWxE/view?usp=sharing

Sie werden feststellen, dass der Code eine Subroutine enthält, die „MonteCarloNValues“ genannt wird, und wenn Sie nach unten springen, werden Sie eine Funktion sehen, die „GetRandomNormal“ genannt wird. Die Subroutine ist das Fleisch des Programms. Die Funktion wird genannt, um gewöhnlich verteilte zufällige Zahlen zu berechnen. Sobald Sie den Code eingegeben haben, schauen Sie nach unten, bis Sie die folgende Zeile des Codes sehen:

strRASProj = „C:\HEC-RAS Beispiele\Applications Guide\Chapter 1 – Critical Creek\CRITCREK.prj“ Ändern Sie den Text innerhalb der Zitate, um den Weg und den Dateinamen für den Ort, an dem Ihr Projekt auf Ihrem Computer gespeichert wird, zu entsprechen (diese Code-Linie sollte auf der Linie 43 etwa 1/5 des Weges von oben absteigen. Schauen Sie sich oben im Fenster für die Zeilennummer an. Wenn es nicht auf der Linie 43 ist, ist es wahrscheinlich, dass Ihr Code ohne Räume zwischen Codeblocks gepastet wurde, in dem Fall wird es die Linie 34 sein. Alternativ können Sie das Edit…Find-Tool verwenden, um Ihnen zu helfen, diese Code-Linie zu finden).

Bitte beachten Sie auch die Code-Linie, die Ihre Realisierungen nimmt. intNumRealizations = 100 (Linie 63, Linie 51 ohne Räume). Hier ist, wo Sie die Anzahl der Realisierungen (Iterationen) festlegen, die Sie für Ihre Monte Carlo Analyse ausführen möchten. Mit anderen Worten, wie oft HEC-RAS öffnet und läuft. Sie können diese Zahl an alles ändern, was Sie mögen. Je mehr Realisierungen Sie durchführen, desto besser wird Ihre statistische Konvergenz. Es dauerte etwa 7 Stunden, um 10.000 Realisierungen durchzuführen. Aber ich schlage vor, mit 100 oder weniger zu beginnen, wenn Sie dies zum ersten Mal durchführen, was ungefähr 4 Minuten oder weniger dauern sollte.

Auch, wenn Sie eine Version von HEC-RAS neben 5.0.7 verwenden und beziehen, stellen Sie sicher, dass diese Änderung in der folgenden Code-Linie durchgeführt wird: Dim RC As New RAS507.HECRASController (Linie 35, Linie 28 ohne Räume). Wenn Sie HEC-RAS Version 5.0.7 verwenden, müssen Sie sich darüber keine Sorgen machen.

Schritt 5 Stellen Sie sicher, dass HEC-RAS geschlossen ist und dann die Monte Carlo-Simulation durchführen. Um das Programm durchzuführen, klicken Sie überall innerhalb der Subroutine MonteCarloNValues und klicken Sie dann auf den grünen “Play” -Taste an der Spitze des Fensters. Alternativ können Sie den F5-Schlüssel drücken, um die Simulation zu starten.

Wenn Sie einen Compile Error in dieser Code-Linie erhalten: Dim RC As New RAS507.HECRASController, stellen Sie sicher, dass Sie die Checkbox neben der Version von RAS, die Sie im Referenzfenster verwenden möchten, ausgewählt haben (siehe Schritt 3 oben).

Während es laufen wird, werden Sie sehen, dass das HEC-RAS Computations-Fenster etwa alle 2 Sekunden oder so aufsteht. Jeder dieser repräsentiert eine Realisierung, eine einzige HEC-RAS-Simulation innerhalb der Monte Carlo-Analyse. Wenn die Monte Carlo Simulation abgeschlossen ist, sollten Sie eine Nachrichtbox sehen, die Ihnen erzählt, wann die Simulation dauert, um zu laufen. Es dauerte 4,4 Minuten auf meinem Computer, um 100 Realisierungen durchzuführen. Die Nachrichtbox zeigt Ihnen auch die 99%,90%, 50%, 10%, und 1% Überwahrscheinlichkeit Wasseroberflächenhöhen für Node ID # 7 (siehe Linie 107 des Codes). Dies ist River Station 6 im Modell. Sie können die Node-ID für jede Kreuzung unter Tabellen…Namen…Noten im Geometriefenster von HEC-RAS bestimmen. Schließlich wird ein berechnetes Medium für den gezeigten n-Wert angezeigt. Sie können die statistische Konvergenz überprüfen, indem Sie dieses Programm mehrmals ausführen und sehen, ob die berechneten Veränderungen und wie gut es mit der Eingabeveränderung vergleicht. Hier können Sie meinen berechneten Durchschnitt n-Wert 0.0418 sehen, während mein Eingabe-Wert 0.04. Wenn es sich signifikant mit verschiedenen MCM-Simulationen ändert, oder sich signifikant von der Eingabe-Mittel unterscheidet, dann bedeutet das, dass Sie mehr Realisierungen (was größer als 100) durchführen müssen. Als ich diese Monte Carlo-Übung mit 10.000 Realisierungen durchführte, war mein berechneter Durchschnitt bei 0.0399 viel besser. Ich würde sagen, dass es nah genug ist.

Gute Glück. Du kannst das tun. Sobald Sie mit diesem Code komfortabel sind, sollten Sie gut auf Ihrem Weg sein, um jede Reihe anderer Arten von HEC-RAS Automation-Anwendungen zu versuchen. Versuchen Sie, diesen Code hinzufügen. Vielleicht möchten Sie die überschüssige Wahrscheinlichkeit der Wasseroberfläche für jeden Kreuzteil ausdrucken. Oder vielleicht möchten Sie eine andere Metrik neben der Wasseroberfläche erhöhen. Und wenn Sie dies weit in dem Post gemacht haben, wette ich, Sie haben ein Interesse an der Automatisierung von HEC-RAS. Ich ermutige Sie dringend, das Buch „Breaking the HEC-RAS Code“ und das mitgeführte Excel HECRASController-Workbook zu überprüfen. Sie sind wertvolle Ressourcen für die Automatisierung von HEC-RAS und erklären all dies in viel detaillierter Weise als dieses einzelne Beitrag kann.

Und schließlich, schauen Sie sich diesen Video-Webinar an, den ich durch die Australian Water School auf dem HECRASController gegeben habe:

Unter MonteCarloNValues()

*******************

Demonstranten führen HEC-RAS in einem Monte Carlo Experiment.

Geschrieben von Christopher Goodell

» März 29, 2020

“Diese Subroutine zeigt zufällig N-Werte über eine normale

Verteilung und Anwendung dieser n-Werte auf die Haupt-

Kanal für jede Kreuzung. Das Projekt HEC-RAS

Es wird nach jedem Sampling wieder ausgeführt. Wasseroberfläche –

Höhen werden beim Abschluss jedes

Realisierung und schließlich sortiert, um die Höhe zu bestimmen _

Überschreitende Wahrscheinlichkeit.

„Testiert mit dem CRITCREK.prj Daten-Set. Der Code hätte

leicht modifiziert werden, um mit anderen Datensätzen zusammenzuarbeiten.

*******************

»Halten Sie die Spur der Zeit

Dim timStartTime als Variant, timNowTime als Variant, _

Zeit als Variante

Startzeit = Timer

„Definieren Sie die normale Verteilung von n Werte zu verwenden.

Dim sngMeanN als Single

Dim sngStdDevN als Single

sngMeanN = 0.04 ‘mean, oder erwartete Wert.

sngStdDevN = 0.015 ‘Dies stellt 2 Standardabweichungen auf _

plus und minus 0,03 (50%), oder _

Manning n Werte von 0.01 bis 0.07.

Öffnen des HEC-RAS-Projekts

Dim RC als neuer RAS507.HECRASController

Dim StrRASProj als String ‘HEC-RAS-Projekt

Dim sngWSElev() als Single

„Die Reihe von berechneten Wasseroberflächenhöhen für _

jede Verwirklichung.

„Spazieren Sie den Weg und den Namen Ihres Projekts hier zwischen den Zitatmarken

strRASProj = „C:\HEC-RAS Beispiele\Anwendungsguide\Kapitel 1 – Critical Creek\CRITCREK.prj“

Öffnen des HEC-RAS-Projekts Critical Creek – Beispiel 1

RC.Project_Open (StrRASProj)

»Definierte Variablen, die in der For-Next Loop verwendet werden

Dim lngNumMessages so lange

Dim strMessages() Als String

Dim blnDidItCompute als Boolean

Dim strRiv als String, strRch als String, strRS als String

Dim lngRiv Wie Lange, lngRch Wie Lange, lngRS Wie Lange

Dim sngNL als Single, sngNCh als Single, sngNR als Single

Dim StrErrMsg als String

Dim sngSumMean als Single, sngCompMean als Single

Dim sngAllRandN() als Single

Dim nNodes so lange

Dim Nodes() als String

» Durch jede Verwirklichung

Dim intNumRealisierungen als Ganzes

intNumRealizations = 100 ‘Diese Zahl sollte groß sein _

ausreichend, um eine statistische Konvergenz auf der

berechneten mittleren und standardischen Abweichungen von sampled n _

Die Werte.

ReDim sngAllRandN(1 To intNumRealizations)

Dim i As Long, j As Long, k As Long, l As Long

Für i = 1 zu intNumRealizations

„Get n value to use by random sampling about the _

Normale Verteilung

sngNL = 0,1

sngNCh = CSng(GetRandomNormal(sngMeanN, sngStdDevN))

sngNR = 0,1

»Halten Sie die Laufkarte des berechneten Mittels

sngAllRandN(i) = sngNCh

sngSumMean = sngSumMean + sngNCh

sngCompMean = Runde(sngSumMean / i), 4)

„Definieren Sie den Fluss, die Reichweite und die Anzahl der Knoten für dieses Projekt

StrRiv = „Critical Cr“

StrRch = „Upper Reach“

LngRiv = 1

lngRch = 1

nNodes = RC.Geometry.nNode(1, 1)

Neue N-Werte an die Geometrie anzuwenden

Für j = 1 zu nNodes

strRS = RC.Geometry.NodeRS(lngRiv, lngRch, j)

RC.Geometrie_SetMann_LChR strRiv, _

strRch, strRS, sngNL, sngNCh, _

sngNR, strErrMsg

Nächster J

“Save the project with the new Manning’s n values” (Spar das Projekt mit den neuen Manning’s n values)

RC.Projekt_Speicher

„Vorbereitung des HEC-RAS Projekts

BlnDidItCompute = RC.Compute_CurrentPlan _

(LingNumMessages, strMessages())

„Wasseroberflächenheizungsergebnis auf River 1, Reach“

1, River Station 6, für Profil 1. Der Output ID

Für die Wasseroberfläche beträgt die Höhe 2. River Station 6 hat eine Node-ID von 7.

ReDim Preserve sngWSElev(i)

sngWSElev(i) = RC.Output_NodeOutput(1, 1, 7, 0, 1, 2)

„Show Progress“

TimNowTime = Timer

Zeitraum = _

Runde(timNowTime – TimStartTime) / 60, 2)

Application.StatusBar = „Finished Computing“ & _

“Realisierung #” & i & ” von ” & intNumRealizations _

und » Sampled N Value = ” & Round(sngNCh, 4) & _

» » Alle Proben bedeuten N = ” & sngCompMean & _

» » Elapsed Time: „ & timElapseTime & „Minute“.

Nächster I

Schließung HEC-RAS

Rz. Quitras

»Sorten Sie die Wasseroberflächen von niedriger auf hoher

Dim blnSorted als Boolean

Dim sngTemp als Single

Dim intx als Ganzes

BlnSorted = falsch

Obwohl nicht blnSorted

BlnSorted = wahr

Für intX = 0 zu UBound(sngWSElev) – 1

Wenn sngWSElev(intX) > sngWSElev(intX + 1) Dann

sngTemp = sngWSElev(intX + 1)

sngWSElev(intX + 1) = sngWSElev(intX)

sngWSElev(intX) = sngTemp

BlnSorted = falsch

Endlich wenn

Nächster ArtikelIntX

Lauf

„Bestimmung der Überwahrscheinlichkeit der Wasseroberfläche _

und Aufstieg.

Dim sngWSEl99 als Single, sngWSEL90 als Single, _

sngWSEL50 als Single, sngWSEL10 als Single, _

sngWSEL1 als Single

sngWSEl99 = sngWSElev(CInt(0.01 * UBound(sngWSElev)))

sngWSEL90 = sngWSElev(CInt(0.1 * UBound(sngWSElev)))

sngWSEL50 = sngWSElev(CInt(0.5 * UBound(sngWSElev)))

sngWSEL10 = sngWSElev(CInt(0.9 * UBound(sngWSElev)))

sngWSEL1 = sngWSElev(CInt(0.99 * UBound(sngWSElev)))

„Senden Sie die Überwahrscheinlichkeit der Wasseroberflächenhöhungen _

und berechnet bedeutet zu einer Nachrichtbox.

Dim StrOutput als String

strOutput = “99% Überfluss Wasseroberfläche Erhöhung = ” & _

Runde(sngWSEl99, 2) & Chr(13)

strOutput = strOutput & „90% Wasseroberfläche“ & _

„Elevation =“ & Round(sngWSEL90, 2) & Chr(13)

strOutput = strOutput & „50% Wasseroberfläche Überschreitung“ & _

„Elevation =“ & Round(sngWSEL50, 2) & Chr(13)

strOutput = strOutput & „10% Wasseroberfläche Überschreitung“ & _

„Elevation =“ & Round(sngWSEL10, 2) & Chr(13)

strOutput = strOutput & „1% Wasseroberfläche Überschreitung“ & _

„Elevation =“ & Round(sngWSEL1, 2) & Chr(13)

TimElapseTime = Runde(timNowTime – TimStartTime) / 60, 1)

MsgBox “Total time: ” & timeElapseTime & ” Minuten.” & _

Chr(13) & strOutput & „Computed Mean =“ & _

CSTR (SngCompMean)

End unter

Funktion GetRandomNormal(ByVal Mean As Double, ByVal StdDev _

als doppelt) als doppelt

*******************

“Demonstriert, wie man eine Random-Nummer über eine _ berechnet

Normale statistische Verteilung

Geschrieben von Christopher Goodell

» November 7, 2013

“Es berechnet eine zufällige Zahl aus einer normalen Verteilung.

Verwenden Sie die Box-Muller Transformation Basic Form zum

Handeln Sie mit der Transformation.

*******************

»Starten Sie den Random-Nummer-Generator

Randomierung

Box-Muller verwendet 2 zufällige Zahlen (x1, x2) zur Erzeugung von 2 _

Random normalerweise verteilte Zahlen (y1, y2). Wir werden

Vernachlässigen Sie die zweite Zahl (y2).

Dim x1 als Doppel, x2 als Doppel, y1 als Doppel, y2 als Doppel

x1 = Rnd()

x2 = Rnd()

y1 = (-2 * Math.Log(x1)) ^ 0.5 * _

Math.Cos(2 * 3.141592 * x2)

y2 = (-2 * Math.Log(x1)) ^ 0.5 * _

Math.Sin(2 * 3.141592 * x2)

‘Transform y1 über die Eingangsmittel- und Standardabweichung

GetRandomNormal = (y1) * StdDev + Mean

Endfunktion

Copyright © 2020 Die RAS Lösung. Alle Rechte vorbehalten.

By admin

Leave a Reply

Your email address will not be published.