Quel paquet dois-je utiliser pour envelopper le code Fortran moderne avec Python?

27

Je connais et j'ai utilisé f2py2e pour envelopper un ancien code Fortran 77, mais je crois comprendre que cela ne fonctionne pas avec le code Fortran 95 plus récent. J'ai recherché ce que je devrais utiliser, et j'ai rencontré fwrap et G3 f2py, qui ne semblent pas donner d'explication sur leur état actuel, ni comment les utiliser (au-delà de l'utilisation de base).

J'ai également vu que la version de f2py a la possibilité d'utiliser la f2py de troisième génération, mais elle est commentée comme étant non fonctionnelle. Compte tenu de cela, je ne sais pas quel projet je dois utiliser pour un projet uni. Lequel dois-je utiliser pour le nouveau code?

PS C'est fondamentalement la même question que /programming/10665717/current-best-method-for-wrapping-modern-fortran-code-with-python , il a été suggéré que demander ici pourrait donner de meilleures réponses .

James Tocknell
la source
2
"Modern Fortran"
meawoppl

Réponses:

19

Vous pouvez utiliser le module ctypes intégré Python comme décrit sur fortran90.org . Il est assez simple et ne nécessite aucune dépendance externe. De plus, l' aide de type ndpointer arg est très pratique.

Matthew Emmett
la source
8
C'est vrai. Ou utilisez Cython au lieu de ctypes comme décrit sur la page fortran90.org.
Ondřej Čertík
@ OndřejČertík, excellent site Web! Il y a peu de ressources précieuses sur Fortran moderne sur Internet, mais c'est certainement l'un de mes favoris avec fortranwiki.org
astrojuanlu
6

J'utilise personnellement f2py pour cela. Cependant, le Fortran que j'écris pour f2py n'est pas vraiment un Fortran moderne, mais plutôt un F90 de forme libre avec des modules. Je n'utilise pas de formes supposées ou de types personnalisés. Cette méthode fonctionne toujours très bien pour moi.

Il y a une ressource que je veux partager concernant l'utilisation de C dans le cadre de l'emballage. Le reste de cette page est également recommandé.

AlexE
la source
1
Mise à jour 2015: depuis un bon moment, toutes mes interfaces Fortran se font via Cython et iso_c_binding. Cela permet de garder le code Fortran lui-même moderne tout en exposant uniquement ce qui est vraiment nécessaire à Cython / C.
AlexE
Mise à jour 2016: l'option iso_c_binding devient plus facile maintenant que je peux simplement compiler un fichier .pyx à l'aide de la cythoncommande, et réduire le chevauchement entre la modification de mon code fortran ou de mon code python et la mise en place rapide de tout.
cbcoutinho
5

La documentation de f2py n'est vraiment pas terrible. Je suis en train de déplacer mes propres projets de f2py vers Cython . Même si Cython peut être utilisé pour encapsuler du code C, j'ai trouvé qu'il était très utile pour créer un nouveau code haute performance. Si votre intention est d'écrire du nouveau code Fortran, de l'encapsuler et de l'appeler en Python, je vous recommande d'utiliser Cython à la place. De cette façon, vous pouvez écrire du code Python, et s'il y a des goulots d'étranglement des performances, vous transférez cela sur Cython avec des modifications mineures.

Leo Uieda
la source
Alors plutôt que d'utiliser Fortran, utiliser Cython pour les bits de code les plus lents?
James Tocknell
2
Exactement! J'ai trouvé que c'est beaucoup plus facile car votre code Cython peut interagir avec les objets Python et les tableaux Numpy naturellement (sans couche de conversion supplémentaire). Cela est particulièrement utile si vous souhaitez utiliser vos propres structures de données. Faire utiliser Fortran ou C à vos classes Python dans f2py n'est pas une tâche aussi simple.
Leo Uieda
3

f90wrap est construit au-dessus de f2py et génère automatiquement les wrappers Python pour la base de code Fortran sous-jacente, y compris l'accès aux types dérivés. Un ensemble d' exemples simples montre comment cela fonctionne.

davidovitch
la source
2

Vous pouvez utiliser FortWrap pour vous y rendre à mi-chemin. Cela créera une interface C ++ à votre code Fortran, qui pourrait ensuite être enveloppée avec SWIG pour obtenir une interface Python. Nous le faisons sur une base assez large de code Fortran et cela fonctionne assez bien (en fait, FortWrap a été développé par un membre de notre équipe dans ce but précis).

Barron
la source
1

fwrapcible spécifiquement Fortran90 / 95 et utilise une partie de la même pile logicielle que f2py.

MRocklin
la source
3
Le dernier engagement du
dépôt
1
Bien que je convienne que c'est décourageant, j'ai quand même eu un succès décent. Hors de la boîte, il est plus fonctionnel que f2pysur le F90. Il a également une barrière d'entrée très basse. J'étais content de l'avoir trouvé.
MRocklin
1

f2pyprend en charge le fortran moderne (tableaux de forme supposée, etc.), voir un exemple de script

De plus, pour des expériences avec le code fortran, je recommanderais IPython magic , qui est facile à installer et très pratique (il s'appuie également sur f2py).

Alleo
la source