Welches Paket sollte ich verwenden, um Modern Fortran Code mit Python zu verpacken?

27

Ich kenne und habe f2py2e verwendet , um alten Fortran 77-Code zu verpacken, aber ich verstehe, dass es mit neuerem Fortran 95-Code nicht funktioniert. Ich habe recherchiert, was ich verwenden soll, und bin auf fwrap und G3 f2py gestoßen, von denen keine eine Erklärung für ihren aktuellen Status oder ihre Verwendung zu geben scheint (über die grundlegende Verwendung hinaus).

Ich habe auch gesehen, dass die Version von f2py die Option hat, f2py der dritten Generation zu verwenden, aber es wird als nicht funktionsfähig kommentiert. Aus diesem Grund weiß ich nicht, welches Projekt ich für ein Uni-Projekt verwenden soll. Welchen sollte ich für neuen Code verwenden?

PS Dies ist im Grunde die gleiche Frage wie https://stackoverflow.com/questions/10665717/current-best-method-for-wrapping-modern-fortran-code-with-python . Es wurde vorgeschlagen, hier nachzufragen, um bessere Antworten zu erhalten .

James Tocknell
quelle
2
"Modern Fortran"
meawoppl

Antworten:

19

Sie können das in Python integrierte ctypes- Modul wie auf fortran90.org beschrieben verwenden . Es ist ziemlich einfach und erfordert keine externen Abhängigkeiten. Auch der ndpointer arg Typ Helfer ist sehr handlich.

Matthew Emmett
quelle
8
Korrekt. Oder verwenden Sie Cython anstelle von ctypes, wie auf der Seite fortran90.org beschrieben.
Ondřej Čertík
@ OndřejČertík, tolle Webseite! Es gibt nur wenige wertvolle Ressourcen zum modernen Fortran im Internet, aber dies ist definitiv einer meiner Favoriten zusammen mit fortranwiki.org
astrojuanlu
6

Ich persönlich benutze f2py dafür. Der Fortran, den ich für f2py schreibe, ist jedoch kein wirklich moderner Fortran, sondern ein Freiform-F90 mit Modulen. Ich verwende keine angenommenen Formen oder benutzerdefinierten Typen. Diese Methode funktioniert bei mir immer noch sehr gut.

Es gibt eine Ressource, die ich bezüglich der Verwendung von C als Teil des Wrappings teilen möchte. Der Rest dieser Seite ist ebenfalls zu empfehlen.

AlexE
quelle
1
Update 2015: Alle meine Fortran-Schnittstellen werden seit einiger Zeit über Cython und iso_c_binding hergestellt. Dies ermöglicht es, den Fortran-Code selbst auf dem neuesten Stand zu halten und gleichzeitig nur das bereitzustellen, was Cython / C wirklich benötigt.
AlexE
Update 2016: Die Option iso_c_binding wird jetzt einfacher, als dass ich mit dem cythonBefehl eine .pyx-Datei kompilieren und die Überlappung zwischen dem Ändern meines Fortran-Codes oder Python-Codes und der schnellen Ausführung verringern kann.
cbcoutinho
5

Die Dokumentation von f2py ist wirklich nicht so toll. Ich bin gerade dabei, meine eigenen Projekte von f2py nach Cython zu verlagern . Obwohl Cython zum Umbrechen von C-Code verwendet werden kann, stellte ich fest, dass es am nützlichsten ist, um neuen Hochleistungscode zu erstellen. Wenn Sie beabsichtigen, neuen Fortran-Code zu schreiben, ihn zu umbrechen und in Python aufzurufen, empfehle ich, stattdessen Cython zu verwenden. Auf diese Weise können Sie Python-Code schreiben und bei Leistungsengpässen diesen mit geringfügigen Änderungen an Cython übertragen.

Leo Uieda
quelle
Verwenden Sie Cython also nicht für Fortran, sondern für langsamere Code-Teile?
James Tocknell
2
Genau! Ich habe festgestellt, dass es viel einfacher ist, da Ihr Cython-Code auf natürliche Weise (ohne zusätzliche Konvertierungsebene) mit Python-Objekten und Numpy-Arrays interagieren kann. Dies ist besonders hilfreich, wenn Sie Ihre eigenen Datenstrukturen verwenden möchten. Fortran oder C dazu zu bringen, Python-Klassen in f2py zu verwenden, ist keine so einfache Aufgabe.
Leo Uieda
3

f90wrap baut auf f2py auf und generiert automatisch die Python-Wrapper für die zugrunde liegende Fortran-Codebasis, einschließlich des Zugriffs auf abgeleitete Typen. Eine Reihe von einfachen Beispielen zeigt, wie es funktioniert.

Davidovitch
quelle
2

Du könntest FortWrap benutzen , um dich auf halbem Weg dorthin zu bringen. Dadurch wird eine C ++ - Schnittstelle zu Ihrem Fortran-Code erstellt, die dann mit SWIG umschlossen werden kann , um eine Python-Schnittstelle zu erhalten. Wir tun dies auf einer ziemlich großen Basis von Fortran-Code und es funktioniert ziemlich gut (FortWrap wurde von einem Mitglied unseres Teams für genau diesen Zweck entwickelt).

Barron
quelle
1

fwrapzielt speziell auf Fortran90 / 95 ab und verwendet einen Teil des gleichen Software-Stacks wie f2py.

MRocklin
quelle
3
Das letzte Commit für das GitHub-Repo dieses Projekts erfolgte Ende 2010.
Geoff Oxberry,
1
Obwohl ich zustimme, dass das entmutigend ist, hatte ich immer noch ordentlichen Erfolg damit. Im Auslieferungszustand ist es funktionaler als f2pybei F90. Es hat auch eine sehr niedrige Eintrittsbarriere. Ich war froh, es gefunden zu haben.
MRocklin
1

f2py unterstützt moderne fortran (vermutet geformte Arrays und so), siehe ein Beispielskript

Für Experimente mit fortran-Code würde ich auch IPython magic empfehlen , das einfach zu installieren und sehr praktisch ist (es basiert auch auf f2py).

Alleo
quelle