Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2020 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  [Fortran] Lire un fichier non formaté (résolu)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Fortran] Lire un fichier non formaté (résolu)

n°667348
Marnie
Posté le 08-03-2004 à 15:02:11  profilanswer
 

Je fais des simulations numériques d'écoulement d'air avec un code fortran dont je connais le source. Les résultats qui m'intéressent sont écrits dans un fichier non formaté :
dans le code, le fichier est d'abord ouvert :
      OPEN(LUSF,FILE=FNSF,FORM='UNFORMATTED',STATUS='REPLACE')
un certain nombre de données d'entête sont écrites tout de suite :
      WRITE(LUSF) CDATA(M%INDSP(N))
      WRITE(LUSF) SDATA(M%INDSP(N))
      WRITE(LUSF) UDATA(M%INDSP(N))
      WRITE(LUSF) I1,I2,J1,J2,K1,K2
puis, à chaque pas de temps, le fichier est complété par la valeur du temps (T) et la vitesse (U) dans la maille (I,J,K) :
      WRITE(LUSF) T
      WRITE(LUSF) (((U(I,J,K),I=I1,I2),J=J1,J2),K=K1,K2)
quand le calcul est terminé, on flush le buffer (mais pas de fermeture de fichier avec un "close(LUSF)" ).
 
Je voudrais lire ce fichier et récupérer les valeurs de temps et de vitesse dans des tableaux. Je connais précisément le nombre de pas de temps (une chance), donc la taille de mes tableaux :
T(1:nombre_pas_de_temps) et U(1:nombre_pas_de_temps,1:Imax,1:Jmax,1:Kmax)
 
Voilà mon code :
      PROGRAM lecture
 
      IMPLICIT NONE
 
      integer,parameter:: dp=selected_real_kind(12)
      integer::n,J,K,err
      real(dp), dimension(5)::T           ! pour commencer je m'arrête à 5 pas de temps
      real(dp), dimension(5,30,30)::U     ! en fait il n'y a qu'une seule valeur de I
 
      open(8,file="tunnel_02.sf",form='unformatted',status='old')
 
      DO n=1,5
         read(8,iostat=err) T(n)
         write(*,*) err
         read(8,iostat=err) ((U(n,J,K),J=1,30),K=1,30)
         write(*,*) err
      ENDDO
 
      close(8)
 
      END PROGRAM lecture
 
Comme l'entête me gêne, j'ai édité le fichier à traiter et j'ai viré le début (c'est cochon, oui).
 
L'exécution revoie une erreur de type SIGSEGV (segmentation exception) liée à la ligne où je lis U.
Mais je ne vois pas l'erreur. Quelqu'un a une idée ?
(Et désolée pour le pavé, je tenais à donner toutes les clefs)
 
Edit : j'ai modifié ma suppression de l'entête : je n'ai plus d'erreur, mais la fin du fichier est atteinte tout de suite : err vaut 0 la première fois, et -1 toutes les autres.
Comment séparer les enregistrements ?


Message édité par Marnie le 10-03-2004 à 10:31:40

---------------
Prison d'été, prison d'hiver, prison d'automne et de printemps, bagne pour petits et grands - Prévert, Le Roi et l'Oiseau
mood
Publicité
Posté le 08-03-2004 à 15:02:11  profilanswer
 

n°667565
Marnie
Posté le 08-03-2004 à 17:36:11  profilanswer
 

Up du soir : j'ai fait quelques modifs.
 
Voilà la nouvelle boucle DO :
 
      n=1
      open(8,file="tunnel_02.sf",form='unformatted',status='old')
      open(9,file="tunnel_02.csv",form='formatted',status='new')
 
      DO
         read(8,iostat=err) T(n)
         write(9,'(e13.5)',advance='no') T(n)
         read(8,iostat=err) ((U(n,J,K),J=1,30),K=1,30)
         write(9,'(e13.5,2x)',advance='no') ((U(n,J,K),J=1,30),K=1,30)
         n=n+1
      ENDDO
 
      close(8)
      close(9)
 
Ca me crée un fichier formaté qui contient essentiellement des valeurs nulles (ou alors de l'ordre de 10^(-400), et fausses, cela va sans dire). Et l'erreur SIGSEGV est revenue.
De plus je m'attendais à avoir des nombres alignés (à cause du advance='no') mais j'obtient une longue colonne, avec, à intervalle régulier, 3 nombres sur une même ligne. J'aurais voulu avoir sur une même ligne le temps et les vitesses à ce temps-là. Ensuite on revient à la ligne pour le pas de temps suivant.
 
 
 :pt1cable:


---------------
Prison d'été, prison d'hiver, prison d'automne et de printemps, bagne pour petits et grands - Prévert, Le Roi et l'Oiseau
n°668324
Marnie
Posté le 09-03-2004 à 11:20:41  profilanswer
 

Bon, je continue mon topic-blog :D.
 
Je n'ai plus d'erreur, sauf que ... les valeurs récupérées sont fausses. Et même carrément bizarres pour le temps.
Voilà d'abord la nouvelle version du programme :
 
      PROGRAM conversion
 
C***************************************************************************
C Conversion d'un fichier slice binaire écrit par FDS en fichier formaté.
C
C Variables : dp : valeur de la variante double précision                  
C             n  : indice de boucle (numéro du pas de temps)
C             J,K : indices des mailles suivant y et z
C             err : indicateur de la manière dont s'est déroulée la lecture
C             I1,I2,J1,J2,K1,K2 : mailles délimitant le domaine de
C                                 sauvegarde de U
C             T(n) : temps de la simulation
C             U(n,J,K) : vitesse de l'écoulement
C             CDATA, SDATA, UDATA : nom de la variable sauvegardée
C                                   (ici : vitesse) et unité
C             TCFORM : format d'écriture
C***************************************************************************
 
      IMPLICIT NONE
 
      integer,parameter:: dp=selected_real_kind(12)
      integer::n,J,K,err,I1,I2,J1,J2,K1,K2
      real(dp), dimension(18793)::T
      real(dp), dimension(18793,30,30)::U
      character(30)::CDATA,SDATA,UDATA
      character(50)::TCFORM
 
      open(8,file="tunnel_02.sf",form='unformatted',status='old')
      open(9,file="tunnel_02.csv",form='formatted',status='new')
 
C     Lecture et écriture de l'entête
 
      read(8,iostat=err) CDATA
      read(8,iostat=err) SDATA
      read(8,iostat=err) UDATA
      read(8,iostat=err) I1,I2,J1,J2,K1,K2
 
      write(9,*) "Temps, ",CDATA
      write(9,*) "s, ",UDATA
      write(9,'(6i3)') I1,I2,J1,J2,K1,K2
 
C     Définition du format d'écriture
 
      write(TCFORM,'(A,I4.4,A)') "(",30,"(ES13.5,','),ES13.5)"
 
C     Boucle de lecture/écriture
 
      n=1
 
      DO
         read(8,iostat=err) T(n)
         IF(err<0) EXIT             ! sortie de la boucle à la fin du fichier
         read(8,iostat=err) ((U(n,J,K),J=1,30),K=1,30)
         IF(err<0) EXIT
         write(9,TCFORM) T(n),(U(n,15,K),K=1,30)   ! sélection d'une verticale
         n=n+1                                     ! pour la vitesse
      ENDDO
 
C     Fermeture des fichiers
 
      close(8)
      close(9)
 
      END PROGRAM conversion
 
 
Et un extrait du fichier de résultats :
 Temps, U-VELOCITY                    
 s, m/s                            
 60 60  0 30  0 30
  5.08545-315,  1.27964E-07,  1.17307E-07, ...,  0.00000E+00,  0.00000E+00
  5.26400-315,  8.02294E-08,  1.22609E-07, ...,  0.00000E+00,  0.00000E+00
  ...
 
A noter, les valeurs nulles qui n'ont pas de raison d'être, l'écriture du temps en xxxx-315 (c'est quoi ce truc ?). Les autres valeurs de vitesse sont fausses aussi.
 
Si quelqu'un a une idée, je prends. :)


Message édité par Marnie le 09-03-2004 à 11:24:34

---------------
Prison d'été, prison d'hiver, prison d'automne et de printemps, bagne pour petits et grands - Prévert, Le Roi et l'Oiseau
n°669295
Marnie
Posté le 10-03-2004 à 10:14:31  profilanswer
 

Pour ceux que ça intéresse, c'était un problème de type de variables : T et U sont en double précision pour le calcul dans le code que j'utilise, mais ils sont convertis en simple précision au dernier moment pour la sauvegarde.
Et c'est mon chef qui a trouvé :cry:


---------------
Prison d'été, prison d'hiver, prison d'automne et de printemps, bagne pour petits et grands - Prévert, Le Roi et l'Oiseau
n°669323
uriel
blood pt.2
Posté le 10-03-2004 à 10:40:26  profilanswer
 

mince, je l'avais pas vu ce topic, je croyais etre le dernier humain à faire du Fortran [:mlc]
desolé, j'ai pas vu le topic passer...:/
http://www.posterville.com/library/xiwant.jpg


---------------
IVG en france
n°669374
Marnie
Posté le 10-03-2004 à 11:22:02  profilanswer
 

Ben mince, je croyais que c'était toi qui faisait grimper le nombre de vue. C'était qui alors ? On est plus de 2 ?
 
(Et à part ça, t'aurais trouvé ?)


---------------
Prison d'été, prison d'hiver, prison d'automne et de printemps, bagne pour petits et grands - Prévert, Le Roi et l'Oiseau
n°669395
uriel
blood pt.2
Posté le 10-03-2004 à 11:37:48  profilanswer
 

franchement, de visu comme ca, je pense pas que j'aurais trouvé facilement... :jap:
(mais c'est pas moi qui faisait monter les vues)


---------------
IVG en france

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  [Fortran] Lire un fichier non formaté (résolu)

 

Sujets relatifs
effacer un fichier sur le serveur...[SQL] Algèbre relationnelle, arbres algèbriques et SQL [resolu]
Renommer "un" fichier avec un .batPHP-MySQL : insert encrypt password ... Décrypter ? [Résolu]
Renommer plusier meme fichier se trouvant dans different repertoireLister les occurences d'un terme dans un fichier ?
Comment lire un fichier avec Mozilla et XPCOM[Shell] Merger 2 lignes d'un fichier sur la base d'un ID commun
[Résolu] Pb image de fond avec image superposée en avant-plan 
Plus de sujets relatifs à : [Fortran] Lire un fichier non formaté (résolu)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR