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 :

Lire un fichier de points


Sujet :

Fortran

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut Lire un fichier de points
    Bonjour à tous,

    Je suis en train d'essayer de faire un programme qui lit les fichiers txt où les points d'une courbe sont rentrées (nous avons donc 2 colonnes de points) et ces points sont affichés à l'écran.

    J'aimerais donc savoir la manière de procéder en fortran afin de lire les points qui se trouvent dans le fichier txt ?

    En vous remerciant par avance,

    Yu Cloud

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Par défaut
    Bonjour,

    Ce genre de questions a sa réponse dans la FAQ. Voici un bout de code qui te permettras de faire les choses :

    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
     
    PROGRAM LECT
    IMPLICIT NONE
    REAL(KIND=8), ALLOCATABLE,DIMENSION(:,:) :: DONNEES
    INTEGER :: ios,I
     
    OPEN(11,FILE='MON_FICHIER.txt',STATUS='old',ACTION='read',IOSTAT=ios)
     
    I=0
    DO 
    READ(11,*,IOSTAT=ios)
    IF(ios/=0) EXIT
    I=I+1
    END DO
     
    REWIND(11)
     
    ALLOCATE(DONNEES(I,2))
    READ(11,*)DONNEES
     
    PRINT'(2f15.10)', DONNEES
     
    CLOSE(11)
     
    DEALLOCATE(DONNEES)
    END PROGRAM LECT
    Le code ci-dessus part du principe que tu ne connais pas la taille de tes données (d'où le tableau dynamique). De fait, on lit d'abord le fichier à l'aide d'une variable d'erreur (ios) pour déterminer le nombre de lignes à allouer au tableau DONNEES. On alloue ensuite DONNEES avant de le lire dans le fichier puis on l'imprime à l'écran en format réel.

    En espérant avoir répondu à ta question,

    Si cela convient, n'hésites pas à cocher la case Résolu en bas à gauche du sujet,

    Marlan

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Mon programme fontionne maintenant !

    Par contre j'ai eu un petit soucis avec "real(kind=8)" car le compilateur afficher une erreur lors de la compilation du programme, j'ai donc du le remplacer par une déclaration "double precision".

    Merci pour ton aide,

    Yu Could

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Par défaut
    Cela revient au même, mais tu peux essayer avec REAL*8 sinon (sans trop m'avancer, il me semble que la syntaxe REAL(KIND=8) est réservée au FORTRAN90+)

  5. #5
    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 Yu Cloud Voir le message
    (...) Par contre j'ai eu un petit soucis avec "real(kind=8)" car le compilateur afficher une erreur lors de la compilation du programme, j'ai donc du le remplacer par une déclaration "double precision"(...)
    Tu n'indique pas le message d'erreur. Il y a 2 possibilités :
    1. Tu utilises un compilateur Fortran 77 alors que les kinds sont introduits par la norme Fortran 90.
    2. C'est le 8 qui est refusé car ton compilateur utilise les kind numbers 1, 2, 3, ... plutôt que 4, 8, 16... Il y a au moins 1 compilateur qui a adopté cette stratégie. Les chiffres 4 et 8 ne sont pas dans la norme. Pour avoir un programme respectant la norme, il faut utiliser selected_real_kind(), mais peu de personnes le font.

    Ta solution "double précision" est tout à fait correcte. La solution "real*8" est une extension Fortran 77 assez généralement supportée (mais probablement pas par le compilateur ayant adopté la numérotation des kinds 1, 2, 3...)

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    J'écris en Fortran 95 et j'utilise Silverfrost ftn95 comme compilateur Fortran.

    En effet le compilateur affichait la deuxième possibilité que tu énonçais :
    C'est le 8 qui est refusé car ton compilateur utilise les kind numbers 1, 2, 3, ... plutôt que 4, 8, 16... Il y a au moins 1 compilateur qui a adopté cette stratégie. Les chiffres 4 et 8 ne sont pas dans la norme. Pour avoir un programme respectant la norme, il faut utiliser selected_real_kind(), mais peu de personnes le font.
    Cordialement,

    Yu Cloud

  7. #7
    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
    Tu devrais donc développer le réflexe d'utiliser la stratégie suivante pour tous tes développements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    module MyKinds
       integer, parameter :: rks = selected_real_kind(6)  ! rks = real kind single
       integer, parameter :: rkd = selected_real_kind(14) ! rkd = real kind double
    end module
     
    program Exemple
      use MyKinds
      implicit none
      ...
      real(rks) :: x,y,z
      real(rkd) :: A,B,C
      real(rkd), parameter :: pi = 4.0_rkd * atan(1.0_rkd)
      ...
    Ça semble lourd, mais le bénéfice sera appréciable à long terme.

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Ok pour mes prochains développement j'essaierai d'utiliser ce module. Ce module permet bien de jouer sur la précision des réels que j'utilise ?

    Yu Cloud

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Bonjour,

    Il y a quelques temps vous m'avez conseillé d'utiliser un module (Module MyKinds) dans mes programmes.

    Est ce qu'il serait possible que vous m'expliquiez son utilité ?
    Quel est la différence entre déclarer mes variables en real ou double precision et déclarer mes variables avec le module ?

    En vous remerciant d'avance,

    Yu Cloud

  10. #10
    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
    Mieux vaut tard que jamais...

    Pourquoi les kinds plutôt que real / double precision ?

    Pour les raisons suivantes :
    • Pour accéder aux autres précisions, quads par exemple.
    • Pour développer du code générique.
    • Pour simplifier le changement éventuel de précision.
    • Pour contrôler la précision par « module » ou « objet ».


    Quads : Je ne pense pas qu'on puisse déclarer un quad autrement qu'avec les kinds.

    Code générique : Tu peux écrire une fonction de tri par exemple pour des kinds "MyKind". Au début, tu n'as qu'à définir integer, parameter :: MyKind = "mes besoins", et tout s'ajuste.

    Changement éventuel de précision : Comme le code générique, on change à un endroit et tout s'ajuste.

    Contrôle de précision : Tu peux prévoir une précision différente pour différentes sections d'un programme, et changer la précision de chaque section indépendamment. Par exemple, je travaille en finance. En pratique, on veut beaucoup de précision sur les données et calculs antérieurs à aujourd'hui (accumulation avec des données réelles) et une faible précision pour les projections / simulations futures. J'aurai donc des précisions définies comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       integer, parameter :: Single = selected_real_kind(6)
       integer, parameter :: Double = selected_real_kind(14)
       integer, parameter :: Quad = selected_real_kind(30)
    ...
       integer, parameter :: Accu_k = Double
       integer, parameter :: Proj_k = Single
    ...
    Finalement, c'est souvent une question de complexité et d'espérance de vie du code : pour un petit programme jetable, les kinds, surtout par selected_real_kind, c'est inutilement lourd. Pour un système dont on s'attend à ce qu'il nous survive, c'est plus justifié.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/03/2015, 18h07
  2. Lire un fichier CSV dont les données contiennent des points
    Par black cat747 dans le forum MATLAB
    Réponses: 16
    Dernier message: 23/02/2011, 11h51
  3. Réponses: 5
    Dernier message: 11/01/2004, 20h17
  4. Lire un fichier de 50 gb
    Par Maryves dans le forum MFC
    Réponses: 2
    Dernier message: 08/01/2004, 14h08
  5. Lire le fichier du port série
    Par saibe dans le forum Linux
    Réponses: 7
    Dernier message: 09/04/2003, 09h29

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