problème de Subroutine en fortran 90
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

problème de Subroutine en fortran 90



  1. #1
    ESTERMIQUE

    problème de Subroutine en fortran 90


    ------

    Bonjour,

    J'essaie de faire tourner un code écrit en fortran90. Le code en question contient une subroutine, dès que je la met comme internal subroutine avec ( contains avant le end program) le code tourne correctement, mais une fois j'opte pour une subroutine externe (après le end program) le code perd conscience et fournit des résultats erronés. sachant que je ne change rien dans la subroutine, je ne fais que copier/coller après : end program.


    quelqu'un pourrait élucider ce problème ?
    D'avance merci.

    -----

  2. #2
    JPL
    Responsable des forums

    Re : problème de Subroutine en fortran 90

    Ce message s'était égaré à un endroit où personne ne pouvait répondre.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  3. #3
    Calvert

    Re : problème de Subroutine en fortran 90

    Salut,

    peut-être que mettre le code en question (ou un petit exemple montrant le même comportement) serait utile. En l'état, c'est difficile d'aider.

  4. #4
    ESTERMIQUE

    Re : problème de Subroutine en fortran 90

    Code:
      contains   		 
    		  subroutine thomas(k,m,a,b,c,F,V)
    		  integer m,k
    		  real, dimension(200):: a,b,c,alpha,beta,y,F,V
    
    		 alpha(k)=a(k)
    		 do i=k+1,m
    		 beta(i)=b(i)/alpha(i-1)
    		 alpha(i)=a(i)-beta(i)*c(i-1)
    		 enddo
    
    		 
    		 y(k)= F(k)
    		 do i=k+1,m
    		 y(i)= F(i)-(beta(i)*y(i-1))
    		 enddo
    		
    		V(m)=y(m)/alpha(m)
    		do i=m-1,k,-1
    		V(i)= ((y(i)-c(i)*V(i+1))/alpha(i))
    		enddo
    
    		  return 
    		 end subroutine thomas
    Dernière modification par JPL ; 03/03/2017 à 19h02. Motif: à la de mande d'ESTERMIQUE

  5. A voir en vidéo sur Futura
  6. #5
    Calvert

    Re : problème de Subroutine en fortran 90

    Re,

    alors, le problème vient de ta variable 'i' dans la sous-routine.

    Si tu mets ta routine dans le corps du programme avec un "contains", fortran comprends que le "i" de la sous-routine est le même que le "i" du corps principal du programme (une variable déclarée dans le corps principal est visible jusqu'au "end program"). Chez moi, avec gfortran, ça compile, mais ça se comporte mal: comme tu appelles ta sous-routine dans une boucle sur "i", et que tu changes "i" dans la sous-routine, c'est la panique à bord). Si je remplace ton "i" par un "i2", ça marche bien.

    Si tu mets ta routine hors du programme principal, en l'état, ça marche parfaitement bien. Mais seulement parce que tu n'as pas mis de "implicit none" dans ta sous-routine. Sinon, la variable "i" n'est pas déclarée.

    Bref :
    - Je recommanderais de mettre des "implicit none" systématiquement pour chaque sous-routine.
    - Quand tu utilises des sous-routines internes, il faut être très prudent avec les noms des variables : éviter d'employer les mêmes variables que dans le programme principal si elles ne sont pas sensées avoir le même usage.

  7. #6
    ESTERMIQUE

    Re : problème de Subroutine en fortran 90

    Effectivement, c'est exactement le problème !
    Merci infiniment Calvert

Discussions similaires

  1. probleme d'affichage des résultats en fortran
    Par invite5b8ffc78 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 26/10/2018, 17h27
  2. problème Fortran
    Par yayou921 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 13/11/2016, 17h33
  3. problème fortran
    Par invitef90a29aa dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 07/02/2010, 18h21
  4. petit problème sur fortran
    Par physicien007 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 06/05/2009, 21h38
  5. problème fortran
    Par invite5ba58655 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 05/05/2008, 18h43