Ich habe begonnen, Python als Programmiersprache für alle meine Aufgaben in CFD zu verwenden. Ich habe sehr wenig Erfahrung in der Programmierung. Ich komme aus dem Maschinenbau und studiere Luft- und Raumfahrttechnik.
Manchmal wird der Rechenaspekt von CFD langwieriger als das Manipulieren der Gleichungen oder das Berechnen.
Welche allgemeinen Richtlinien beschleunigen die Ausführung unseres Programms? Was sind die Tricks, um Dinge parallel zu machen? Wie schreibe ich die Codes, die schneller laufen?
Woher bekomme ich Ressourcen (für einen Laien wie mich leicht verständlich), die die obigen Fragen beantworten?
algorithms
python
fluid-dynamics
Subodh
quelle
quelle
Antworten:
Ich werde versuchen, Ihre Frage zu beantworten, da Sie speziell nach Python fragen. Ich werde meine eigene Methode zur Lösung eines Simulationsproblems beschreiben. Strategien für schnellere Simulationen werden in dieser Beschreibung angegeben.
Zuerst habe ich neue Simulationen in Python erstellt. Natürlich versuche ich, NumPy und SciPy so weit wie möglich zu nutzen. Während NumPy einen geeigneten Array-Datentyp für numerische Simulationen bietet, bietet SciPy umfangreiche numerische Routinen, die mit NumPy-Arrays arbeiten.
Sobald die Prototypen mehr oder weniger funktionieren, versuche ich herauszufinden, welche Teile des Programms oder Skripts den Engpass darstellen. Dafür gibt es typische Kandidaten:
Ich benutze eine einfache Profilierungsstrategie, um zu erfahren, wo die gesamte Laufzeit verbracht wird. Mit der IPython- Shell (die ich nicht genug empfehlen kann) starte ich mein Skript mit
Dieser "magische Befehl" führt die Profilerstellung (unter Verwendung von timeit ) für Sie durch und zeigt Ihnen eine Liste mit Zeiten an, zu denen Ihr Skript beendet wurde. Verwenden Sie diese Liste, um herauszufinden, wo Ihr Code zu langsam ist.
Sobald Sie die Teile festgelegt haben, die beschleunigt werden müssen, können Sie die Verwendung kompilierter Sprachen in Betracht ziehen. Ich werde auf zwei Lösungen hinweisen.
Zunächst gibt es die Cython- Sprache. Cython ist eine Programmiersprache, die Python sehr ähnlich ist (tatsächlich ist Python-Code oft auch gültiger Python-Code). Der Cython-Compiler konvertiert die Cython-Dateien jedoch in C-Code, der dann in ein von Python verwendbares Modul kompiliert werden kann. Cython versteht NumPy-Arrays. Cython kann Ihnen auf zwei Arten helfen: Erstens können Sie Datentypen einführen. Dadurch werden Funktionsaufrufe beschleunigt. Wenn Sie über Arrays iterieren, wird Ihre Schleife schneller ausgeführt (wenn Sie sowohl die Dummy-Variable als auch das Array eingeben, erhalten Sie eine einfache C-Schleife!). Zweitens laufen in meinen Experimenten sogar die untypisierten Skripte etwas schneller, da sie kompiliert und nicht interpretiert werden.
Die andere kompilierte Sprache, die für Sie nützlich sein wird, ist Fortran. Es gibt verschiedene Möglichkeiten, Fortran mit Python zu verwenden ( f2py , fortwrap , Cython ). Da f2py für mich persönlich der einfachste Weg zu sein scheint, beschreibe ich kurz, was es tut. f2py kann Fortran-Code für Python-Module kompilieren. Damit können Sie NumPy-Arrays als Eingabe- und Ausgabevariablen aus dem Python-Raum verwenden. Im Fortran-Raum sind dies gewöhnliche Fortran-Arrays. Sie können diese mit voller Fortran-Geschwindigkeit bedienen.
Ich persönlich benutze Cython eher dort, wo die Anzahl der Funktionsaufrufe der Engpass ist. Für schleifenlastige Sachen bevorzuge ich f2py (vielleicht weil ich einen starken Fortran-Hintergrund habe).
Ein weiterer Hinweis zu Fortran: Das moderne Fortran liest und schreibt sehr ähnlich wie NumPy - die Syntax ist sehr eng. Dies macht es einfach, NumPy-Code in Fortran-Code zu konvertieren.
Beachten Sie, dass sowohl Cython als auch f2py in gewisser Weise Paralleismus unterstützen. Für Cython, finden Sie Hilfe finden hier , während für Fortran, da die Standardtechniken wie sind OpenMP oder MPI. Darüber hinaus gibt es auch P ython-Wrapper für MPI . Ich persönlich benutze mpi4py auf Python-Ebene sowie OpenMP in Fortran.
Lassen Sie mich ein bisschen Literatur empfehlen: das Buch Python Scripting For Computational Science von H.-P. Langtangen ist eine großartige Ressource für Python im Allgemeinen sowie für Strategien, um Python ein bisschen schneller zu machen. Leider erwähnt AFAIR nichts über Cython. Als zweite Ressource können Sie sich diese Folien ansehen . Diese geben Beispiele für alles, was ich in diesem Beitrag erwähnt habe (siehe auch den Code und die Quellen hier ). Es gibt viele andere gute Folien im Internet.
Wenn Sie spezielle Fragen haben, helfen wir Ihnen gerne weiter!
quelle
Für CFD + Python gibt es eine Lösung: http://pythonflu.wikidot.com/ Dies sind Python-Bindungen über OpenFOAM (die bereits in den Kommentaren zu den Fragen erwähnt wurden). Diese Bindungen ermöglichen die Programmierung auf "Löserebene" (es gibt Beispiele, bei denen ursprüngliche OpenFOAM-Löser in Python repliziert werden und nicht langsamer als die Originale sind - die in einer anderen Antwort erwähnten langsamen Schleifen sind hier kein Problem, da die "inneren Schleifen" auftreten im C ++ - Code von OpenFOAM).
Der Vorteil dieser Bindungen ist auch, dass die gesamte Parallelisierung in OpenFOAM unterhalb der Solver-Ebene stattfindet, sodass Sie sich nicht damit befassen müssen (ebenso wie mit den anderen Dingen, die der OpenFOAM-Kern erledigt: Eingabe / Ausgabe, linearer Löser, Operator-Diskretisierung)
Wenn Sie also nur einen neuen Solver schreiben möchten und keine neuen Funktionen zum OF-Core hinzufügen möchten (Randbedingungen, linearer Solver usw.), ist PythonFlu möglicherweise ausreichend für Sie und Sie können C ++ vermeiden (das eine viel höhere Lernheilung aufweist als C ++) Python)
PS: wollte dies ursprünglich als Kommentar zur Diskussion der ursprünglichen Frage hinzufügen, aber mein Ruf lässt dies nicht zu
quelle