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

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

Marsh Posté le 08-03-2004 à 15:02:11    

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
Reply

Marsh Posté le 08-03-2004 à 15:02:11   

Reply

Marsh Posté le 08-03-2004 à 17:36:11    

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
Reply

Marsh Posté le 09-03-2004 à 11:20:41    

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
Reply

Marsh Posté le 10-03-2004 à 10:14:31    

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
Reply

Marsh Posté le 10-03-2004 à 10:40:26    

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
Reply

Marsh Posté le 10-03-2004 à 11:22:02    

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
Reply

Marsh Posté le 10-03-2004 à 11:37:48    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed