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 :

Lecture d'un tableau tridimentionnel par colonne


Sujet :

Fortran

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 53
    Points
    53
    Par défaut Lecture d'un tableau tridimentionnel par colonne
    Bonjour,

    je suis entrain de coder un programme qui lit un fichier texte ou sont stockées des valeurs par colonne de la manière suivante :
    x y z p1 p2
    -8.509950340E-002 8.100000024E-002 0.00E+000 0.00E+000 0.00E+000
    -8.420702815E-002 8.145157248E-002 0.00E+000 0.00E+000 0.00E+000
    -8.331453800E-002 8.190311491E-002 0.00E+000 0.00E+000 0.00E+000
    -8.242201060E-002 8.235459030E-002 0.00E+000 0.00E+000 0.00E+000
    -8.152943850E-002 8.280596882E-002 0.00E+000 0.00E+000 0.00E+000
    -8.063680679E-002 8.325722814E-002 0.00E+000 0.00E+000 0.00E+000
    -7.974408567E-002 8.370833099E-002 0.00E+000 0.00E+000 0.00E+000
    Mon nombre de lignes vient d'une information lue plus haut dans le fichier et qui est de : Nbi*Nbj*Nbk.
    Je veux qu'il assimile chaque colonne lue à une variable tridimentionnelle de taille (Nbi,Nbj,Nbk), mais je n'y arrive pas, il ne lit pas le fichier!

    Est ce que quelqu'un aurait une idée??

  2. #2
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    et bien tu ouvre ton fichier, c'est un fichier texte donc cette commande devrai suffire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open(unit=60,file="fichier",status="old",position="rewind",ierr=ios)
    60est le numéro d'unité, si tu l'utilise déjà, prends-en un autre, fichier est à remplacer par le nom de ton fichier (éventuellement avec les répertoire) old signifie que le fichier existe déjà et oblige à renvoyé une erreur si il ne le trouve pas rewind est optionnel mais force à commencer au début du fichier
    ios revoie le code d'érreur (0 si touot s'est bien passé)

    du coup, ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (ios/=0) then 
      print*,"erreur à l'ouverture du fichier"
    else !si il n'y a pas d'erreur
      read(60,*)NLigne  !on lit le nombre de ligne
      read(60,*)           !on saute une ligne qui contient les commentaires
      allocate (x(NLigne),y(NLigne),z(NLigne),p1(NLigne),p2(NLigne))
      do i=1,NLigne
        read(60,*) x(i),y(i),z(i),p1(i),p2(i)
      end do
      close(60)
    end if
    pour que cela marche bien, il faut déclarer tes variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    real(kind=8),dimension(:),allocatable :: x,y,z,p1,p2
    il faut selement pensé à déallouer tes tableau quand tu n'en a plus besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    deallocate(x,y,z,p1,p2)
    une fois que tu as lu et stocké x,y,z,p1,p2, il devient facile de faire des changement d'indices pour obtenir des tableau à plusieur dimensions... (note: en mémoire quelque soit le nombre d'indice, tout est stocké de manière linéaire!!)

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 53
    Points
    53
    Par défaut
    Bonjour, en fait, j'ai déjà réussi à faire cela, et ça marche très bien ! Merci, ça confirme la justesse de mon programme !
    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
    	READ (7,'(a3,i3,a4,i1,a4,i3)') char1, Nbi, char2, Nbj, char3, Nbk
    			PRINT *, ' --> Lecture de la sourface d integration:',Nbi,Nbj,Nbk
         !! Allocation en memoire pour les variables.....avant leur lecture!!!!!
    	 !!*********************************************************************** 
    	       d_end = Nbi*Nbj*Nbk
    	        allocate(  X_Centers(d_end),   stat=stats)
    			allocate(  Y_Centers(d_end),   stat=stats)
    			allocate(  Z_Centers(d_end),   stat=stats)
    			allocate(  ReTfP(d_end),   stat=stats)
    			allocate(  ImTfP(d_end),   stat=stats)
     
     
         !!****************************************************
    	 !!*******************
    			READ (7,*)
    			READ (7,*)
    			do il=1, d_end 
    	 		READ (7,*) X_Centers(il),Y_Centers(il ),Z_Centers(il ),ReTfP(il ),ImTfP(il )
     
    			enddo
    Est ce que tu aurais une idée par contre, de comment transformer un tableau unidimensionnel en tridimensionnel??
    par exemple je stocke tout dans x(Nbi*Nbj*Nbk) avec Nbi, Nbj,Nbk, les trois dimensions recherchée, et je veux passer à un X_nouveau(Nbi, Nbj, Nbk).

    Je n'arrive pas trop à trouver la correspondance d'indices !

    Merci bien

    Manal

  4. #4
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    alors cela dépendra de l'ordre dans lequel tes données sont rangé, mais, mettons un rangement par le dernier indice puis le second et enfin le premier
    tab_tri(1,1,1) = tab_uni(1)
    tab_tri(1,1,2) = tab_uni(2)
    ... etc...
    tab_tri(i,j,k) = tab_uni(n)
    ...

    il ne rest qu'à trouver la fonction n=f(i,j,k)

    alors tu peux faire une relation du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    forall(i=1:Nbi,j=1:Nbj,k=1:Nbk)
      n=k+(i-1)*Nbi+(j-1)*Nbj
      tab_tri(i,j,k)=tab_uni(n)
    end forall
    en fonction de l'ordre dans lequel sont rangé tes donné dans le tableau tab_uni, il te faudra changer la ligne 'n=k+(i-1)*Nbi+(j-1)*Nbj' pour avoir une bonne corespondance

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

Discussions similaires

  1. [Prototype] Trier un tableau à deux dimensions par colonnes
    Par G.D.V.L. dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 12/06/2007, 12h20
  2. Créer un tableau et le remplir par colonne
    Par tedparker dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 13/03/2007, 10h53
  3. Réponses: 18
    Dernier message: 17/01/2007, 12h49
  4. Réponses: 5
    Dernier message: 29/12/2005, 10h31
  5. [HTML] Construire un tableau colonne par colonne ?
    Par Cthulhu 22 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 11/05/2005, 15h31

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