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 :

Format écriture et "advance='no'"


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Par défaut Format écriture et "advance='no'"
    Bonjour

    Voila, je suis en train d'écrire une subroutine me permettant d'exporter des résultats au format VTk.

    Le format est un format ASCII dont la structure est la suivante:

    DATASET RECTILINEAR_GRID
    DIMENSIONS nx ny nz
    X_COORDINATES nx [dataType]
    x0 x1...x(n-1)
    Y_COORDINATES ny [dataType]
    y0 y1...y(n-1)
    Z_COORDINATES nz [dataType]
    z0 z1...z(n-1)



    Voici un extrait de mon code:

    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
    		write(file,'(a)')"# vtk DataFile Version 4.2"
    		write(file,'(a)')"Fichier vtk"
    		write(file,'(a)')"ASCII"
    		write(file,'(a)')"DATASET RECTILINEAR_GRID"
    		write(file,'(a,3i4)')"DIMENSIONS",nx,ny,nz
    		write(file,'(a,i4)')"X_COORDINATES",nx
    		write(file,'(f5.3)')(R(I),I=1,nx)
    		write(file,'(a,i4)')"Y_COORDINATES",ny
    		write(file,"(f5.3)")(Z(I),I=1,ny)
    		write(file,'(a,i4)')"Z_COORDINATES",nz
    		write(file,"(f5.3)")(1._8,I=1,nz)
    		write(file,'(3a)')"SCALARS","TEST","type float"
    		do I=1,nx
    		do J=1,ny
    		do K=1,nz
    		write(file,'(f10.2)')Conc_sol(I,J,K)
    		enddo
    		enddo
    		enddo
    Mon problème vient des lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(file,"(f5.3)")(Z(I),I=1,ny)
    Je voudrais éviter le retour charriot mais conserver le controle sur le format d'écriture. Or, si j'utilise "advance='no'", j'ai un retour à la ligne.

    Si j'abandonne l'idée du format et utilise une étoile *, j'ai un retour à la ligne même avec le advance no...

    Une idée

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Je ne sais pas pour advance=no. Je ne l'utilise presque jamais.

    Il y a quelques techniques antérieures à l'introduction du advance=no. Ce sont les suivantes :

    Format plus grand

    Rien n'oblige le format à prévoir le nombre exacte de variables de la liste. Si le format est trop court, il y a boucle et changement de ligne (c'est ce que tu observes). Si le format est trop long, l'écriture arrête quand un masque du format n'a pas de variable correspondante (par exemple, write(,'(i2,"=",i0)')12 imprimera 12=

    Donc, tu peux faire write(file,"(9999f5.3)")(Z(I),I=1,ny)

    Cette technique requiert évidemment que tu aies une idée du nombre maximale d'élément à imprimer.

    Pour les puristes

    character (20) MonFmt
    ...
    write(MonFmt,'("(",i0,"f5.3)")') ny
    write(file,MonFmt)(Z(I),I=1,ny)

    À éviter

    Les formats variables de type <n> qui sont des extensions.

  3. #3
    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,

    Pour complèter la réponse de Sylvain (la solution "pour puristes" est parfaite; j'y adhère à 100%):
    - Le 'advance=no' fonctionne sans problème mais il ne peut pas être utilisé conjointement à un format libre '*'
    - Une autre technique pour supprimer le retour à la ligne est de mettre un '$' en fin de format:
    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
     
    program ecriture
     
    implicit none
     
    character(len=10) :: phrase1="premier"
    character(len=10) :: phrase2="deuxieme"
    integer :: nombre=7
     
    write(*,*) "Utilisation du  $ pour supprimer le retour a la ligne:"
    write(*,'(a,i2,$)') trim(phrase1),nombre
    write(*,*) trim(phrase2)
     
    write(*,*) 'Utilisation de advance="no" pour supprimer le retour a la ligne:'
    write(*,'(a,i2)',advance="no") trim(phrase1),nombre
    write(*,*) trim(phrase2)
     
    end program ecriture
    Bonne continuation.

  4. #4
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Par défaut
    Merci beaucoup.

  5. #5
    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
    Bonsoir

    - Une autre technique pour supprimer le retour à la ligne est de mettre un '$' en fin de format:
    Le problème est que l'utilisation du $ ne fait pas partie de la norme Fortran 90 et n'est donc pas portable.
    Ainsi, sous linux avec gfortran, la compilation de ton code me renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      write(*,'(a,i2,$)') trim(phrase1),nombre
              1
    Error: Extension: $ descriptor at (1)
    Je vais peut-être passer pour un intégriste (j'ai l'habitude ) mais je ne pense pas qu'il faille s'affranchir de la norme, car des années plus tard, on peut se retrouver obligé de reprendre tout un code ou poser de gros problèmes à quelqu'un qui doit le reprendre.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Citation Envoyé par Grame Voir le message
    ...Je vais peut-être passer pour un intégriste (j'ai l'habitude ) mais je ne pense pas qu'il faille s'affranchir de la norme, car des années plus tard, on peut se retrouver obligé de reprendre tout un code ou poser de gros problèmes à quelqu'un qui doit le reprendre.
    Je seconde !

    Est-ce qu'il y a plus frustrant que de devoir comprendre le programme d'un autre et le corriger uniquement parce qu'il contient des extensions non portable ? Si on est obligé parce qu'il n'y a pas de solution dans la norme, ça peut être acceptable (la situation était fréquente avec les normes F66 et F77), mais quand une solution existe dans la norme, c'est inacceptable.

  7. #7
    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,

    Entièrement d'accord avec le fait qu'il faut éviter de sortir de la norme (en ce qui concerne la programmation en tout cas...).
    Je ne savais pas que le '$' n'était pas dans la norme Fortran 90; j'emploie habituellement advance="no" .
    Ainsi, sous linux avec gfortran, la compilation de ton code me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      write(*,'(a,i2,$)') trim(phrase1),nombre
              1
    Error: Extension: $ descriptor at (1)
    Ca c'est très surprenant... chez moi, sous linux avec gfortran (version 4.1.2), ça compile sans problème...

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

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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