C++ : appels Fortran

De Wiki de Calcul Québec
Aller à : Navigation, rechercher
Autres langues :anglais 100% • ‎français 100%

Appeler du Fortran à partir du C/C++

Il est souvent pratique d'appeler des sous-routines ou des fonctions programmées en Fortran à partir d'un programme C/C++. L'exemple ci-dessous illustre bien comment on peut le faire. Il faudra cependant prendre garde à propos des tableaux. En effet, en C++ les tableaux sont ordonnés par ligne, tandis qu'en Fortran ils sont ordonnés par colonnes.

Voici un programme en C++ qui appelle une fonction et une sous-routine en Fortran calculant la somme des éléments d'un vecteur préalablement déclaré dans le programme C++ :

Fichier : appel_fortran.cpp
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
 
using namespace std;
 
extern "C" double fonction_somme_(long *fsize, double* fvec);
extern "C" void sousroutine_somme_(long *fsize, double* fvec, double *fsum);
 
int main(int argc, char ** argv)
{
    long i,size;
    double sum;
    double *vec;
 
    size = 5000;
 
    vec = new double[size];
 
    for(i=0;i<size;i++)
    {
        vec[i]=1.1234532;
    }
 
    // Appeler une fonction du fortran
    sum = fonction_somme_(&size,vec);
 
    cout << "Appeler une fonction Fortran" << endl;
    cout << "============================" << endl;
    cout << "size = " << size << endl;
    cout << "sum = " << sum << endl << endl;
 
 
    // Appeler une sous-routine du fortran
    sousroutine_somme_(&size,vec,&sum);
 
    cout << "Appeler une sousroutine Fortran" << endl;
    cout << "===============================" << endl;
    cout << "size = " << size << endl;
    cout << "sum = " << sum << endl << endl;
 
    delete[] vec;
 
}


Et le code Fortran contenant la fonction et la sous-routine appelées :

Fichier : somme.f90
real*8 function fonction_somme(fsize,fvec)
 
    integer fsize,i
    real*8 fvec(fsize)
    real*8 sum
 
    fonction_somme=0.0
 
    do i=1,fsize
      fonction_somme=fonction_somme+fvec(i)  
    end do
 
    return
 
end 
 
subroutine sousroutine_somme(fsize,fvec,sum)
 
    integer fsize,i
    real*8 fvec(fsize)
    real*8 sum
 
    sum=0.0
 
    do i=1,fsize
      sum=sum+fvec(i)
    end do
 
end


Vous pouvez compiler et exécuter ces deux fichiers via les commandes (en utilisant les compilateurs de GCC)

 
 [nom@serveur $] gfortran somme.f90 -c -o somme.o
 [nom@serveur $] g++ somme.o appel_fortran.cpp -o a.out
 [nom@serveur $] ./a.out
 


Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Ressources de Calcul Québec
Outils
Partager