2013-05-02 3 views
3

J'écris un code avec Fortran 90 et maintenant je dois utiliser les fonctions spéciales dans la bibliothèque * amos Fotran 77 (http://www.netlib.org/amos/). Maintenant, j'ai trouvé une interface de module pour ces routines (https://github.com/certik/fortran-utils/blob/master/src/amos.f90).Comment utiliser Fortran 77 sous-programmes dans Fortran 90/95?

Ma question est: comment puis-je les combiner et les utiliser dans mon programme Fortran 90 et comment les compiler correctement?

J'ai lutté pour cela pendant une journée entière et je ne pouvais toujours pas comprendre.

Ce qui suit est mon code de test:

PROGRAM TEST_ZBESI 
USE set_precisions 
USE amos 
IMPLICIT NONE 
INTEGER :: n, i, nz, ierr 
!double precision :: zr,zi, cyr(5), cyi(5) 
REAL(kind=DBL) :: zr, zi, cyr(5), cyi(5) 

n=5 
zr=1.0_DBL 
zi=2.0_DBL 

call ZBESI(zr,zi,0.0_DBL,1,n,cyr,cyi,nz,ierr) 
print *,' ' 
do i=1, n 
    write(*,10) i-1, cyr(i) 
    write(*,11) i-1, cyi(i) 
end do 
print *,' NZ=', NZ 
print *,' Error code:', ierr 
print *,' ' 

10 format(' zr(',I1,') = ',F10.6) 
11 format(' zi(',I1,') = ',F10.6) 

END PROGRAM TEST_ZBESI 

Le résultat je suis arrivé est la suivante:

zr(0) = 0.000000 
    zi(0) = 0.000000 
    zr(1) = 0.000000 
    zi(1) = 0.000000 
    zr(2) = 0.000000 
    zi(2) = 0.000000 
    zr(3) = 0.000000 
    zi(3) = 0.000000 
    zr(4) = 0.000000 
    zi(4) = 0.000000 
    NZ=   0 
    Error code:   4 

Il semble que je ne pouvais pas obtenir la bonne réponse, peu importe comment.

J'ai essayé de convertir manuellement le code ZBESI.f Fortran 77 en code Fortran 90. Mais le code est si long et c'était un désastre.

+3

S'il vous plaît montrer un échantillon du code que vous luttez avec. Expliquez aussi exactement ce qui ne fonctionne pas: Erreur de compilation? Relier le problème? – wallyk

+0

Cela devrait être très simple. Quelque chose ne va pas au-delà du FORTRAN. Plus de détails vous aideront. –

+0

il devrait être facile de jeter quelques instructions d'écriture de débogage dans ZBESI pour voir pourquoi il lance cette erreur. – agentp

Répondre

3

À de très rares exceptions près, FORTRAN 77 est un sous-ensemble de Fortran 90/95/2003/2008. Et en pratique, les compilateurs supportent toujours les fonctionnalités obsolètes. La compilation de la source FORTRAN 77 et Fortran 90/59/2003/2008 avec le même compilateur devrait produire des modules objets compatibles. Vous devrez probablement compiler les versions en deux langues séparément, car différentes options de compilateur seront probablement nécessaires, par exemple pour la mise en page source fixe et de forme libre. Avec les interfaces dans votre code Fortan 90/95/2003/2008, le compilateur utilisera des conventions d'appel compatibles.

Quels sont les problèmes spécifiques que vous rencontrez? Avez-vous besoin de connaître les options du compilateur pour FORTRAN 77? Quel compilateur utilisez-vous?

EDIT: Vous devez compiler le module avant le code source qui l'utilise. Il est pratique de compiler d'abord le FORTRAN 77, dans un fichier objet, puis d'utiliser la commande fortran qui compile le Fortran 95 pour lier tout. Essayez donc:

ifort -c -fixed ZBESI.f 
ifort ZBESI.o set_precisions.f90 amos.f90 test_ZBESI.f90. 
+0

J'utilise le compilateur Intel. Maintenant mon code compile bien par quelque chose comme: ifort set_precisions.f90 ZBESI.f amos.f90 test_ZBESI.f90. Tant que je mets les fichiers dans le bon ordre, tout se compile bien. Mais le résultat de sortie semble être faux. Je ne suis pas sûr si cela est dû au code lui-même ou au problème de compilation. J'ai mis à jour mon code de test dans ma question initiale. Merci! – user1746066