IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

[Fortran 77][Débutante] Tirage au sort des énergies d'un spectre


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut [Fortran 77][Débutante] Tirage au sort des énergies d'un spectre
    Bonjour,
    je suis en train de faire un programme sur Fortran 77 de tirage au sort des énergies d'un spectre.
    Donc voici les codes du programme; j'en ai deux : un avec une fonction rando et un avec la fonction rando_number mais j'ai un probleme à l'éxécution, il me dit que la routine, ligne et source sont inconnues si vous pouvez m'aider. Merci d'avance
    Ps: debutante en fortran
    Code1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
      IMPLICIT REAL*8(A-H,O-Z)
          OPEN(1,FILE='ENERGIE',STATUS='UNKNOWN')
          OPEN(2,FILE='COORDONNEES',STATUS='UNKNOWN')
          a0=0.016599426877692d0
          a1=0.312787459557518d0
          a2=-0.16081183620725d0
          a3=0.0284109792835631d0
          a4=-0.00171760856320689d0
          NE=(a4/5.)*(E**5)+(a3/4.)*(E**4)+(a2/3.)*(E**3)+(a1/2.)*(E**2)
         &+a0*EErreurs:
    Image
     
          NE1=0.684
          do 1 i=1,10000
          E=i*10.
          fE=NE/NE1
      1   continue
          i=1
          do 2 j=1,100000
            R=rando(ii)
            do while(fE.lt.R)
              i=i+1
              write(1,*) 'E'
            enddo
      2    continue
          a=0.5d01
          b=a
          x=0.
          y=0.
          R1=rando(ii)
          if(R1 .gt. 0. .and. R1 .lt. 1.) then
            x=x-a+(R1*2.*a)
            y=y-b+(R1*2.*b)
          endif
          write(2,*) 'x,y'  
          STOP
          END
     
    ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
    c     fonction de générationErreurs:
    Image
     
          doubleprecision function rando(ii)
          IMPLICIT REAL*8(A-H,O-Z)
     
          common/zufall/iy
          data ib,m,iq,ir/16807,2147483647,127773,2836/
          ii=0
      100 continue 
            k=iy/iq
            l=mod(iy,iq)
            n=ib*l-ir*k
            if(n.gt.0) then
            iy=n
            else
            iy=n+m
            end if
            rando=iy/float(m)
            if(rando.eq.1.d0.or.rando.eq.0.d0) goto 100
            end
    ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
    code2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    IMPLICIT REAL*8(A-H,O-Z)
          OPEN(1,FILE='ENERGIE',STATUS='UNKNOWN')
          OPEN(2,FILE='COORDONNEES',STATUS='UNKNOWN')
          a0=0.016599426877692d0
          a1=0.312787459557518d0
          a2=-0.16081183620725d0
          a3=0.0284109792835631d0
          a4=-0.00171760856320689d0
          NE=(a4/5.)*(E**5)+(a3/4.)*(E**4)+(a2/3.)*(E**3)+(a1/2.)*(E**2)
         &+a0*E
          NE1=0.684
          do 1 i=1,10000
          E=i*10.
          fE=NE/NE1
      1   continue
          i=1
          do 2 j=1,100000
          call random_number(plop)
            R=plop
            do while(fE.lt.R)
              i=i+1
              write(1,10) E
      10   format('E = ',D12.6)
            enddo
      2    continue
          a=0.5d01
          b=a
          x=0.
          y=0.
          R1=plop
          if(R1 .gt. 0. .and. R1 .lt. 1.) then
            x=x-a+(R1*2.*a)
            y=y-b+(R1*2.*b)
          endif
          write(2,11) x,y 
     11   format('x,y = ',2D12.6) 
          STOP
          END

  2. #2
    Membre expérimenté Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    En exécutant ces 2 codes, j'ai une erreur
    Floating point exception mais pas l'erreur que tu signales.
    De fait, ta variable E n'est pas initialisée.

    Par ailleurs, la construction do while... endo ne fait pas
    partie de la norme ANSI FORTRAN 77.

    Quel message d'erreur as tu exactement ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut
    Ben pour la construction do while... end do j'avais mis dans un premier temps une instruction while mais j'ai eu un message d'erreur à la compilation et donc j'ai essayé l'instruction do while et ça a marché.
    Pour ce qui est du message d'erreur, comme je l'ai dit, j'ai eu trois messages d'erreur : un qui me met routine status:"unknown", l'autre met lines status:"unknown et source status:"unknown" et comme c'est la première fois que je programme en Fortran je n'y comprends pas grand chose

  4. #4
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Qu'est ce que ça veut dire le EErreurs:image ?

    Si le do while pose un probleme tu peux le remplacer par un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Do ....
      ...
      IF( .... ) Then
         exit
      Endif
    Enddo
    ou plus simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Do ....
      ...
      IF( .... ) exit
    Enddo
    Si je compile tes codes il trouve une erreur dans le premier pour EErreurs;Image mais il compile bien pour le second.

    Peut être que tu n'as pas la subroutine random_number dans tes librairies car je crois qu'elle a été ajoutée pour F90. Moi j'ai compilé avec gfortran. Essaye de l'installer. Sous linux c'est facile.

    PS: une petite remarque essaye de prendre l'habitude de remplacer les continue par des Enddo

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut
    le Erreur image ça doit etre une erreur en ajoutant le code c'est juste un commentaire : fonction de génération de nombres aléatoires et aussi pour le end do j'ai essayé mais il le reconnait pas ça doit etre la version de fortran ke j'utilise mais merci kan meme.
    Donc J'ai changé klk trucs ds le programme il le compile mais à l'éxécution ça prend un temps fou et aprés j'arrive pas à ouvrir les fichiers énergies et coordonnées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
          IMPLICIT REAL*8(A-H,O-Z)
     
          OPEN(1,FILE='ENERGIE',STATUS='UNKNOWN')
     
          OPEN(2,FILE='COORDONNEES',STATUS='UNKNOWN')
     
          a0=0.016599426877692d0
     
          a1=0.312787459557518d0
     
          a2=-0.16081183620725d0
     
          a3=0.0284109792835631d0
     
          a4=-0.00171760856320689d0
     
          xE1=0.684d0
     
          do 1 i=1,10000
     
          E=i*10.d0
     
          xE=(a4/5.)*(E**5.d0)+(a3/4.)*(E**4.d0)+(a2/3.)*(E**3.d0)
     
         &+(a1/2.)*(E**2.d0)+a0*E
     
          fE=xE/xE1
     
      1   continue
     
          i=1
     
          do 2 j=1,100000
     
            R=rando
     
            do while(fE.lt.R)
     
              i=i+1
     
              write(1,*) 'E'
     
            enddo
     
      2   continue
     
          a=0.5d01
     
          b=a
     
          x=0.
     
          y=0.
     
          R1=rando
     
          if(R1 .gt. 0. .and. R1 .lt. 1.) then
     
            x=x-a+(R1*2.*a)
     
            y=y-b+(R1*2.*b)
     
          endif
     
          write(2,*) 'x,y'  
     
          STOP
     
          END
     
     
     
    ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
     
    c     fonction de génération de nombre aléatoire
     
          doubleprecision function rando(ii)
     
          IMPLICIT REAL*8(A-H,O-Z)
     
     
     
          common/zufall/iy
     
          data ib,m,iq,ir/16807,2147483647,127773,2836/
     
          ii=0
     
      100 continue 
     
            k=iy/iq
     
            l=mod(iy,iq)
     
            n=ib*l-ir*k
     
            if(n.gt.0) then
     
            iy=n
     
            else
     
            iy=n+m
     
            end if
     
            rando=iy/float(m)
     
            if(rando.eq.1.d0.or.rando.eq.0.d0) goto 100
     
            end
     
    ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    Quel est l'intérêt de cette boucle ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          do 1 i=1,10000
          E=i*10.d0
          xE=(a4/5.)*(E**5.d0)+(a3/4.)*(E**4.d0)+(a2/3.)*(E**3.d0)
         &+(a1/2.)*(E**2.d0)+a0*E
          fE=xE/xE1
      1   continue
    Au final, fE et xE auront les valeurs obtenues pour la 10000ème itération, et les 9999 itérations précédentes n'auront servi qu'à perdre du temps...

    Sinon, cette boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            do while(fE.lt.R)
              i=i+1
              write(1,*) 'E'
            enddo
    est potentiellement infinie (lorsque fE.lt.R)...

    Je ne vois pas trop ce que tu cherches à faire mais il faudrait visiblement remettre ton algorithme à plat pour t'assurer que tu fais bien ce que tu voudrais faire.

    Bon courage.

Discussions similaires

  1. [MySQL] Affichage tirage au sort des données puis copiage dans une table
    Par legrandse dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/02/2012, 13h04
  2. Les Règles des concours ou tirage au sort
    Par actuarch dans le forum Droit
    Réponses: 0
    Dernier message: 04/03/2011, 10h48
  3. Réponses: 5
    Dernier message: 19/08/2004, 11h11
  4. Réponses: 3
    Dernier message: 14/02/2004, 10h10
  5. Réponses: 3
    Dernier message: 09/01/2004, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo