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][Novice] Write dans un fichier


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut [Fortran][Novice] Write dans un fichier
    Bonjour,

    j'ai un problème avec une modification de code que j'ai à faire en Fortran pour mon labo et le Fortran est en quelque sorte ma bête noire...

    Je dois récupérer des valeurs de variables dans un fichier texte, qui doit se compléter à chaque tour de boucle. Voici la source (modif en bleu) :

    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
    subroutine bond (nb,   ib,    jb,      icb, &
          rk,   req,   ntb,     x, &
          f,    omega, eb,      ndrv,  nbel,   natsys)
       
       !     ----- routine to get bond energy and forces for the potential
       !           of cb*(b-b0)**2
       
       implicit double precision (a-h,o-z)
       dimension ib(nb),jb(nb),icb(nb),rk(2),req(2),x(2), &
             f(2),omega(2),nbel(2)
       dimension xij(3)
       
       !***********
       open(30,  file = "bond.log",  iostat = ios)   
       !-- Si le fichier ne peut etre cree, Alors Signaler une erreur.
       if (IOS.ne.0) THEN WRITE(* , *) "Could not create bond.log"
       !-- Ecriture de l'en-tete
       write(30 ,* ) "BOND.LOG : enregistrement de  i3, j3, ipc, req(ipc), rk(ipc) "
       write(30, *) "newline"
       !***********
       
       eb = 0.0d+00
       do 40 n = 1,nb
          i3 = ib(n)
          j3 = jb(n)
          ipc = icb(n)
          rij2 = 0.e0
          do 10 m = 1,3
             xij(m) = x(i3+m)-x(j3+m)
             rij2 = rij2+xij(m)**2
          10 continue
          if(ntb /= 0) call percon(rij2,xij)
          rij = sqrt(rij2)
          db = rij-req(ipc)
          df = rk(ipc)*db
          ebh = df*db
          if (ebh > 100.0) then
             write(6,101) i3/3+1,j3/3+1,rij,req(ipc),rk(ipc),ebh
             101 format('Bad bond:',2i5,4e12.5)
          end if
          eb = eb+ebh
          if(ndrv == 2) then
             dv1 = 2.0e0*df
             dv2 = 2.0e0*rk(ipc)
             call difbon(omega,dv1,dv2,xij,rij,i3,j3,nbel)
          end if
          df = 2.0e0*df/rij
          do 20 m = 1,3
             xh = xij(m)*df
             f(i3+m) = f(i3+m)-xh
             f(j3+m) = f(j3+m)+xh
          20 continue
          
          
          !*********
          write(30, *) n " ieme Passage de la boucle :  "
          write(30,*) "i3 = " i3
                  & ", j3= " j3
                  & ", ipc= " ipc
                  & ", req("ipc")= " req(ipc)
                  & ", rk("ipc")= " rk(ipc)
          write(30,*) "newline"
          write(30,*) "***"
          write(30,*) "newline"
          !*********
       40 continue
       return
    end subroutine bond
    J'obtiens des erreurs à la compilation (normal... c'est la loi de Murphy !) :

    /lib/cpp -P -I/usr/local/motion/amber
    /amber8/src/include bond.f > _bond.f
    f90 -c -O2 -free -o bond.o _bond.f

    if (IOS.ne.0) THEN WRITE(* , *) "Could not create bond.log"
    ^
    "_bond.f", Line = 69, Column = 26: ERROR: Unknown statement. Expected
    assignment statement but found "W" instead of "=" or "=>".

    enregistrement de i3, j3, ipc, req(ipc), rk(ipc) "
    ^
    "_bond.f", Line = 71, Column = 7: ERROR: Continuation of character context in
    free source form requires an "&" as the first nonblank character of the next
    line.

    write(30, *) n " ieme Passage de la boucle : "
    ^
    "_bond.f", Line = 73, Column = 22: ERROR: Unexpected syntax: "EOS" was expected
    but found """.

    write(30,*) "i3 = " i3
    ^
    "_bond.f", Line = 74, Column = 27: ERROR: Unexpected syntax: "EOS" was expected
    but found "I".

    & ", j3= " j3
    ^
    "_bond.f", Line = 75, Column = 15: ERROR: A continuation line can only follow a
    line continued with the "&" symbol.

    & ", ipc= " ipc
    ^
    "_bond.f", Line = 76, Column = 15: ERROR: A continuation line can only follow a
    line continued with the "&" symbol.

    & ", req("ipc")= " req(ipc)
    ^
    "_bond.f", Line = 77, Column = 15: ERROR: A continuation line can only follow a
    line continued with the "&" symbol.

    & ", rk("ipc")= " rk(ipc)
    ^
    "_bond.f", Line = 78, Column = 15: ERROR: A continuation line can only follow a
    line continued with the "&" symbol.

    f90comp: 85 SOURCE LINES
    f90comp: 8 ERRORS, 0 WARNINGS, 0 OTHER MESSAGES, 0 ANSI
    *** Error code 1
    make: Fatal error: Command failed for target `bond.o'

    Je suis mauvais en Fortran que c'en est abhérant ! J'ai beau lire des docs sur Internet, j'y pompe rien. Corrigez-moi si je me trompe mais, un write s'écrit bien WRITE(unit, fmt) ?

    Merci pour votre aide. En plus, c'est assez urgent vu que je finis mon stage bientôt. Mon maître de stage fait du Fortran fréquemment (même s'il n'a rien codé depuis 4 mois) mais il ne voit pas l'erreur ?! Alors moi...

    Meric d'avance
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  2. #2
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    J'ai relu les docs de cours Fortran et j'ai modifié l'unité de stockage du fichier 30 => 15 (doit être inférieur à 20)

    Cela donne :

    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
    subroutine bond (nb,   ib,    jb,      icb, &
          rk,   req,   ntb,     x, &
          f,    omega, eb,      ndrv,  nbel,   natsys)
       
       !     ----- routine to get bond energy and forces for the potential
       !           of cb*(b-b0)**2
       
       implicit double precision (a-h,o-z)
       dimension ib(nb),jb(nb),icb(nb),rk(2),req(2),x(2), &
             f(2),omega(2),nbel(2)
       dimension xij(3)
       
       !***********
       open(15,  file = "bond.log", ACCESS='SEQUENTIAL', STATUS='NEW' )   
       !-- Ecriture de l'en-tete
       write(15 ,* ) "BOND.LOG : enregistrement de  i3, j3, ipc, req(ipc), rk(ipc) "
       write(15, *) "newline"
       close(15)
       !***********
       
       eb = 0.0d+00
       do 40 n = 1,nb
          i3 = ib(n)
          j3 = jb(n)
          ipc = icb(n)
          rij2 = 0.e0
          do 10 m = 1,3
             xij(m) = x(i3+m)-x(j3+m)
             rij2 = rij2+xij(m)**2
          10 continue
          if(ntb /= 0) call percon(rij2,xij)
          rij = sqrt(rij2)
          db = rij-req(ipc)
          df = rk(ipc)*db
          ebh = df*db
          if (ebh > 100.0) then
             write(6,101) i3/3+1,j3/3+1,rij,req(ipc),rk(ipc),ebh
             101 format('Bad bond:',2i5,4e12.5)
          end if
          eb = eb+ebh
          if(ndrv == 2) then
             dv1 = 2.0e0*df
             dv2 = 2.0e0*rk(ipc)
             call difbon(omega,dv1,dv2,xij,rij,i3,j3,nbel)
          end if
          df = 2.0e0*df/rij
          do 20 m = 1,3
             xh = xij(m)*df
             f(i3+m) = f(i3+m)-xh
             f(j3+m) = f(j3+m)+xh
          20 continue
          
          
          !*********
          open(15, file = "bond.log", ACCESS='APPEND')
          write(15, *) n " ieme Passage de la boucle :  "
          write(15,*) "i3 = " i3
                  & ", j3= " j3
                  & ", ipc= " ipc
                  & ", req("ipc")= " req(ipc)
                  & ", rk("ipc")= " rk(ipc)
          write(15,*) "newline"
          write(15,*) "***"
          write(15,*) "newline"
          close(15)
          !*********
       40 continue
       return
    end subroutine bond
    Mais cela ne fonctionne toujours pas...
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 79
    Par défaut
    Il manque une virgule avant chacun des différents éléments que tu veux écrire dans ton instruction write.
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    write(15,*) "i3 = ", i3,", j3= ", j3,", ipc= ", ipc, ", req("ipc")= ",req(ipc), ", rk("ipc")= " ,rk(ipc)
    Ton compilateur devrait préférer, d'ailleurs en regardant bien le code que tu n'as pas changé, c'est de cette manière que l'instruction write s'ecrit
    En espérant que ça te permettra de compiler

  4. #4
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Par défaut
    Concernant ta première erreur (sur le IF), le problème vient de la construction. Tu as 2 solutions mais ce que tu as écris est un mélange des 2 qui ne fonctionne pas.

    Première solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IF(ios .NE. 0) THEN
       WRITE(*,*) "Could not create bond.log"
    ENDIF
    Deuxième solution (sur 1 seule ligne, sans le THEN et le ENDIF):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF(ios .NE. 0) WRITE(*,*) "Could not create bond.log"
    Même si tu as ajouté des options dans ta commande OPEN, tu devrais conserver ce contrôle.


    Les autres erreurs viennent de ton caractère de continuation de ligne.
    Comme le dit le compilateur:
    ERROR: Continuation of character context in free source form requires an "&" as the first nonblank character of the next line.
    En format libre, lorsqu'un code est écrit sur deux lignes, il faut placer le caractère "&" à la fin de la première ligne.

    Il faut donc aussi corriger le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          write(15,*) "i3 = "          , i3       ,        &
                      ", j3= "         , j3       ,        &
                      ", ipc= "        , ipc      ,        &
                      ", req("ipc")= " , req(ipc) ,        &
                      ", rk("ipc")= "  , rk(ipc)

  5. #5
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Merci à tous, avec tous vos conseils, cela marche !!!
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 07/03/2011, 17h02
  2. Réponses: 5
    Dernier message: 05/04/2008, 12h49
  3. [Fortran 77] Subroutine dans un fichier
    Par Guega dans le forum Fortran
    Réponses: 2
    Dernier message: 23/07/2007, 12h55
  4. (Write #1, string) sans guillemets dans le fichier
    Par numfard dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/05/2007, 08h35
  5. [Fortran 90] Ecriture dans fichier
    Par panda31 dans le forum Fortran
    Réponses: 9
    Dernier message: 12/06/2006, 16h53

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