2010-12-08 54 views
3

Je voudrais vous demander votre aide pour appeler la fonction fortran à travers les fonctions C. Ces fonctions C seront utilisées dans le code python via Cython. Mettre les choses ensemble, j'ai ce schéma:Cython, C et Fortran

Cython Module -> fonction C -> Fortran, où -> signifie "appels".

Actuellement, j'ai réussi à appeler la fonction C de Cython, mais j'ai du mal à appeler la fonction Fortran. Pouvez-vous m'aider? (Un exemple simple serait génial).

Merci d'avance. Editer: J'utilise gcc 4.1.2. Et gfortran

+0

Une réponse plus précise nécessite probablement de connaître les compilateurs C et Fortran spécifiques dont vous avez besoin. – SingleNegationElimination

+0

Édité. Désolé j'ai oublié que :) – nunolourenco

+0

Connaissez-vous [fwrap] (https://github.com/kwmsmith/fwrap)? – ephemient

Répondre

7

Le lien dans la première réponse décrit des méthodes obsolètes. Il est devenu beaucoup plus facile d'appeler Fortran de C, ou C de Fortran avec l'ajout de la liaison ISO C à Fortran. L'utilisation de cette fonction de langage Fortran demande au compilateur Fortran d'émettre du code exécutable binaire compatible avec C. Le programmeur n'a pas besoin de "pirater" la connexion et comme il fait partie du langage, il est indépendant du compilateur et de la plate-forme. Techniquement, l'ISO C Binding fait partie de Fortran 2003 mais il est disponible depuis plusieurs années dans de nombreux compilateurs, par exemple, gfortran depuis la version 4.3 et Intel ifort.

Pour appeler une sous-routine ou une fonction Fortran à partir de C, vous déclarez la sous-routine ou la fonction Fortran avec l'option bind C et utilisez les types compatibles C dans la liaison pour les déclarations des arguments. Il y a des exemples dans le manuel de gfortran sous "Programmation en langage mixte". Puisque la liaison ISO C fait partie du langage, cette section du manuel est largement indépendante du compilateur. Il y a d'autres exemples dans les réponses précédentes sur Stack Overflow et ailleurs sur le web.

Voici un fragment de code rapide (non testé) d'une déclaration de sous-programme Fortran d'un sous-programme à appeler de C:

subroutine test (varint1, varflt2) bind (C, name="MyTest") 

    use iso_c_binding 

    integer (kind=c_int32_t), intent (in) :: varint1 
    real (kind=c_float), intent (out) :: varflt2 

Le nom de liaison C « MyTest » remplace le nom Fortran - il est le cas sensible, contrairement à Fortran. Pas besoin de s'inquiéter des underscores! Les types de variables doivent être évidents ... voir le manuel de gfortran ou ailleurs pour savoir ce qui est disponible.

+0

Hmmm, je pensais que je pouvais le faire, sans modifier le code Fortran, car il m'a été donné comme une boîte noire. J'ai juste réussi à le faire, grâce à vos idées, merci beaucoup :) – nunolourenco

0

beaucoup de Google hits sur ce (appelant Fortran de C). essayez http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html

J'avais l'habitude d'appeler Fortran-IV depuis Macro-10 il y a 35 ans, mais je n'ai pas d'expérience récente à partager.

+0

J'ai déjà essayé. N'a pas fonctionné :( – nunolourenco

+2

besoin de plus d'informations, qu'est-ce que vous avez essayé exactement et comment il a échoué –

1

Il existe un outil automatisé appelé fwrap qui génère des liaisons C, Cython et Python vers des routines Fortran. Je pense qu'il a encore le statut bêta mais vous pouvez le trouver utile, le lien est here.