Lire un fichier non formaté (résolu) [Fortran] - Divers - Programmation
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.
Marsh Posté le 09-03-2004 à 11:20:41
Bon, je continue mon topic-blog .
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.
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é
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
desolé, j'ai pas vu le topic passer...
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é ?)
Marsh Posté le 10-03-2004 à 11:37:48
franchement, de visu comme ca, je pense pas que j'aurais trouvé facilement...
(mais c'est pas moi qui faisait monter les vues)
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