Bonjour,
je programme actuellement en fortran et en c je dois comparer les deux langages.
Je ne suis malheureusement pas une experte en fortran y a encore des choses qui m'échapper.
Premier petit soucis :
-> je dois récupérer des paramètres entiers passer dans ligne de commande (monprog.f90 100 100) pour définir par exemple les dimensions d'une matrice. J'ai fais des recherche et la seule chose que j'ai toruvé c'est la fonction getarg(entier,char) le problème c'est qu'elle renvoie des arguments de type "string", je ne vois pas comment contourner le problème.
Deuxième gros soucis :
-> j'ai fais dans mon programme deux fonction qui prennent en parametres des matrices et je voudrais qu'elle puisse prendre aussi bien des matrices d'entiers que des matrices de réels. ex mafonction(T** A) T pouvant etre entier ou reel. J'ai beau chercher sur internet je vois rien du tout.
Merci.
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"
Bonjour,
Sur le site ils ont écrit ceci :
Syntax:
CALL GETARG(POS, VALUE)
"POS Shall be of type INTEGER and not wider than the default integer kind; POS \geq 0
VALUE Shall be of type CHARACTER and of default kind. "
et justement c'est tout le probleme c'est que value est du type CHARACTERE et que moi je voudras pouvoir récuperer un entier. POS donne le nombre d'arguments. Maisl'arrgument est du type CHARACTERE.
Est-ce que quelqu'un aurait une solution, aurait déjà rencontré ce problème?
Bien coridalement
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"
13/07/2012 - 10h39
bbdoll
Date d'inscription
décembre 2005
Âge
25
Messages
410
Re : Aide fortran
Sinon j'ai avec un script (en bash) rempli un fichier.txt qui contenait les dimensions des matrice il est de la forme :
10 10 carree
20 20 carree
30 30 carree
...
Donc les deux premiers entiers sont les dimensions de ma matrice.
dans le programme fortran j'essaie de lire les donnes je vous donne ci-dessous le bout du code qui correspond :
!LECTURE DES CARACTERISTIQUE DE LA MATRICE DAN SLE FICHIER TST.TXT
OPEN (UNIT=13,FILE="test.txt",FORM="FORMATTED",ACTION="READ",STATUS="OLD") READ(13)DIM1,DIM2,FORME
avec dim1 et dim2 declarer en INTEGER et forme en CHARACTERE*15,
Ca compile sans erreur mais au moment d'executer ca me renvoie le message d'erreur suivant : At line 24 of file prog_princ.f90 (unit = 13, file = 'test.txt')
Fortran runtime error: Missing format for FORMATTED data transfer
quelqu'un aurait uen solution pour ce problème ?
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"
13/07/2012 - 10h42
Calvert
Date d'inscription
février 2007
Âge
30
Messages
1 982
Re : Aide fortran
Oui, ajouter le format qu'il demande !
Si ta ligne est simple, tu peux essayer un simple
Oui, ajouter le format qu'il demande !
Si ta ligne est simple, tu peux essayer un simple
Code:
read(13,*)
Si ça ne fonctionne pas bien, il faut détailler:
Code:
read(13,'(i2,1x,i2,1x,a15)')
Bonjour merci,
effectivement c'est ce que j'ai fini par faire :
!LECTURE DES CARACTERISTIQUE DE LA MATRICE DANS LE FICHIER TEST.TXT
OPEN (UNIT=13,FILE="test.txt",FORM= "FORMATTED",STATUS="UNKNOW N")
READ(13,45)DIM1,DIM2,FORME
45 FORMAT(I3,I3,A15)
toujours pas de problème a la compilation,
maintenant à l'execution j'ai une erreur de segmentation j'imagine que c'est du au fait que je ne parcours pas toutes les lignes de mon fichier.
10 10 carree
20 20 carree
...
L'algo serait :
1-> lit la ligne 1 du fichier et affecte la valeur 10 a dim1, la valeur 10 a dim2 et la valeur carre a forme
2-> ensuite allouer une matrice 10 10
3-> ecrire dans un fichier les dimensions de la matrice plus la forme et le temps d'execution d'une fonction
4-> lit la ligne 2 du fichier et affecte la valeur 20 a dim1, la valeur 20 a dim2 et la valeur carre a forme
5-> ensuite allouer une matrice 20 20
6-> ecrire dans un fichier les dimensions de la matrice plus la forme et le temps d'execution d'une fonction
...
indépendamment de 1->, 2-> jusqu'à 3-> marchent bien (mais dans ce cas je defini directement dim1,dim2 et forme ds le programme)
en gros mon probleme c'est de faire une boucle de lecture
Cordialement
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"
13/07/2012 - 13h25
Calvert
Date d'inscription
février 2007
Âge
30
Messages
1 982
Re : Aide fortran
Pour le moment, je ne vois pas de boucles. A priori, tu vas lire seulement la première ligne de ton fichier.
Première chose : si tu affiches dim1, dim2 et forme juste après leur lecture, est-ce que cela fonctionne ?
13/07/2012 - 13h46
bbdoll
Date d'inscription
décembre 2005
Âge
25
Messages
410
Re : Aide fortran
Envoyé par Calvert
Pour le moment, je ne vois pas de boucles. A priori, tu vas lire seulement la première ligne de ton fichier.
Première chose : si tu affiches dim1, dim2 et forme juste après leur lecture, est-ce que cela fonctionne ?
Voila ce qu'il maffiche :
10 10carree
toujours avec le format 45 : WRITE(*,45)DIM1,DIM2,FORME
ensuite il me met erreur segmentation;
j'imagine que ca vient du fait que 10 et carree sont collee a la fin je ne sais pas pourquoi c'est bizzare.
Pourtant mon texte est bien de la forme : (c'est bien un copier/coller)
10 10 carree
20 20 carree
30 30 carree
40 40 carree
et dans mon script j'utilise la commande : echo -e "$k $k carree" >> test.txt
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"
13/07/2012 - 13h52
bbdoll
Date d'inscription
décembre 2005
Âge
25
Messages
410
Re : Aide fortran
Quand je lui dit de m'afficher un a un DIM1, DIM et FORME, il m'affiche bien les bonnes valeurs, mais juste après il me met erreur de segmentation je sais pas pourquoi
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"
13/07/2012 - 13h57
bbdoll
Date d'inscription
décembre 2005
Âge
25
Messages
410
Re : Aide fortran
Je pense que le mieux c'est que je vous montre mon code :
Code:
PROGRAM PROG_PRINC
!
IMPLICIT NONE
!DECLARATION DES PARAMETRES
! LA TAILLE DES MATRICE EST PRECISE DANS UN FICHIER TEXTE (TEST.TXT)
INTEGER :: DIM1
INTEGER :: DIM2
INTEGER :: I,J
INTEGER :: K
CHARACTER*15 :: FORME
!POUR LE STOCKAGE CLASSIQUE DE MATRICE CREUSE
INTEGER,DIMENSION(:),ALLOCATABLE :: VALUES !TABLEAU DE VALEURS
INTEGER,DIMENSION(:,:),ALLOCATABLE :: INDICES
!POUR LA MATRICE PLEINE
INTEGER,DIMENSION(:),ALLOCATABLE :: U
INTEGER, DIMENSION (:,:), ALLOCATABLE :: A
INTEGER :: IERR
!DO WHILE (OK == 0) !BOUCLE POUR
! !LECTURE DES CARACTERISTIQUES DE LA MATRICE DANS LE FICHIER TEST.TXT
OPEN (UNIT=13,FILE="test.txt",FORM="FORMATTED",STATUS="UNKNOWN")
READ(13,45)DIM1,DIM2,FORME
WRITE(*,45)DIM1,DIM2,FORME
45 FORMAT(I3,I3,A15)
!ALLOCATION DYNAMIQUE DE LA MEMOIRE ALLOCATE (A(DIM1,DIM2),STAT=IERR)
ALLOCATE (U(DIM2))
ALLOCATE (INDICES(DIM1,2),STAT=IERR)
ALLOCATE(VALUES(DIM1))
IF(IERR.NE.0) STOP 'ERREUR!'
! PRENONS A LA MATRICE UNITE POUR A ET VALUES
DO I=1,DIM1
DO J=1,DIM2
A(I,J)=0
U(J)=j;
END DO
INDICES(I,1)=I
INDICES(I,2)=I
VALUES(I)=1
A(I,I)=1;
END DO
!!!AFFICHONS LA MATRICE I
! DO I=1,DIM1
! WRITE(*,*) (INDICES(I,J),J=1,2)
! END DO
!APPEL DES SUBROUTINES
CALL GEMV(A,U,DIM1,DIM2,FORME)
! CALL SPMV_CLASSIQUE(INDICES,VALUES,U,DIM1)
! CALL SPMV(A,U,DIM1)
!----------------------ESPACE SUBROUTINES
CONTAINS
!SUBROUTINES MATRICE DENSE
SUBROUTINE GEMV(A,U,DIM1,DIM2,FORME)
!DECLARATIONS PARAMETRES
REAL :: T1,T2,TEMPS_MOY=0.0
INTEGER, INTENT (IN) :: DIM1,DIM2
CHARACTER*15, INTENT (IN) :: FORME
INTEGER :: I,K,COMPTEUR=0,F_COMPTEUR=100
INTEGER,DIMENSION(:), INTENT (IN) :: U
INTEGER, DIMENSION (:,:), INTENT (IN) :: A
INTEGER,DIMENSION(:),ALLOCATABLE :: V
INTEGER :: IERR
ALLOCATE (V(DIM1))
IF(IERR.NE.0) STOP 'ERREUR!'
!CALCUL PRODUIT
DO COMPTEUR=1,F_COMPTEUR
!TOP CHRONO
CALL CPU_TIME(T1)
DO I=1,DIM1
V(I)=0
END DO
DO I=1,DIM1
DO K=1,DIM2
V(I)=V(I)+A(I,K)*U(K)
END DO
END DO
!STOP CHRONO
CALL CPU_TIME(T2)
TEMPS_MOY=T2 -T1+TEMPS_MOY
END DO
TEMPS_MOY=TEMPS_MOY/F_COMPTEUR
WRITE (6,*) 'TEMPS TOTAL POUR GEMV= ',TEMPS_MOY
! ECRITURE DES RESULTATS DANS UN FICHIER (ECRITURE SEULE)
OPEN(12,FILE='Dense_F.csv',FORM='FORMATTED',ACTION="WRITE",POSITION="APPEND")
WRITE(12,'(I3,A3,I3,A3,F8.8)') DIM1,';',DIM2,';',TEMPS_MOY
!FERMETURE DU FICHIER
CLOSE(12)
END SUBROUTINE GEMV
!SUBROUTINES MATRICE CREUSE CLASSIQUE
SUBROUTINE SPMV(INDICES,VALUES,U,DIM1)
!DECLARATIONS PARAMETRES
REAL :: T1,T2,TEMPS_MOY=0.0
INTEGER :: I,K,DIM1,COMPTEUR=0,F_COMPTEUR=100
INTEGER,DIMENSION(:), INTENT (IN) :: VALUES
INTEGER,DIMENSION(:), INTENT (IN) :: U
INTEGER, DIMENSION (:,:), INTENT (IN) :: INDICES
INTEGER,DIMENSION(:),ALLOCATABLE :: V
INTEGER :: IERR
ALLOCATE (V(DIM2))
IF(IERR.NE.0) STOP 'ERREUR!'
!CALCUL PRODUIT
DO COMPTEUR=1,F_COMPTEUR
!TOP CHRONO
CALL CPU_TIME(T1)
DO I=1,DIM1
V(I)=0
END DO
DO I=1,DIM1
V(INDICES(I,1))=V(INDICES(I,1))+VALUES(I)*U(INDICES(I,2))
! WRITE (6,*) V(I)
END DO
!STOP CHRONO
CALL CPU_TIME(T2)
TEMPS_MOY=T2 -T1+TEMPS_MOY
END DO
TEMPS_MOY=TEMPS_MOY/F_COMPTEUR
WRITE (6,*) 'TEMPS TOTAL POUR SPMV_CLASSIQUE= ',TEMPS_MOY
!ECRITURE DES RESULTATS DANS UN FICHIER (ECRITURE SEULE)
OPEN(11,FILE='Creuse_F.csv',FORM='FORMATTED',ACTION="WRITE",POSITION="APPEND")
WRITE(11,'(I3,A3,F8.5)') DIM1,';',TEMPS_MOY
!FERMETURE DU FICHIER
CLOSE(11)
END SUBROUTINE SPMV
END PROGRAM PROG_PRINC
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"
13/07/2012 - 14h07
Calvert
Date d'inscription
février 2007
Âge
30
Messages
1 982
Re : Aide fortran
Re !
Il faut chercher dans ton code à quel endroit il fait l'erreur de segmentation. Fais-lui écrire des choses à l'écran de temps en temps, et essaye de déterminer exactement à quelle ligne il plante. Ce n'est pas la lecture, qui se fait correctement. Les segmentation fault sont souvent liée à une mauvaise allocation de mémoire, ou à des manipulations des tableaux avec des indices hors des limites du tableau.
13/07/2012 - 14h09
bbdoll
Date d'inscription
décembre 2005
Âge
25
Messages
410
Re : Aide fortran
Bonjour,
encore moi j'ai compris "mon erreur de segmentation"
elle venait du fait que j'avais mis par inadvertance l'allocation dynamique de la matrice A en commentaire et maintenant ca marche.
Disons que DIM1=10 et DIM2=10 et FORME=carre.
Par contre ce qui est bizzard c'est que dans le fichier au lieu de me mettre le temps moyen d'execution il me met des *******
Sinon ce que j'aimerais savoir c'est comment à la fin lui dire de revenir au debut du programme et de passer a la deuxieme ligne du fichier ?
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"
13/07/2012 - 14h40
Calvert
Date d'inscription
février 2007
Âge
30
Messages
1 982
Re : Aide fortran
Il faut faire quelque chose de ce style :
1. Ouvrir le fichier
2. Tant que le fichier n'est pas terminé, lire le fichier (avec une boucle do while). Il peut être utile de se renseigner sur le flag "iostat" de l'instruction read.
3. Fin de la boucle
4. Fermeture du fichier.
16/07/2012 - 10h08
bbdoll
Date d'inscription
décembre 2005
Âge
25
Messages
410
Re : Aide fortran
bonjour,
j'ai fais effectivement une boucle, mais à partir de dim1=110 il m'affiche uen erreur d'allocation de matrice que je ne comprend pas.
Ci-dessous le nouveau code :
Code:
PROGRAM PROG_PRINC
!
IMPLICIT NONE
!DECLARATION DES PARAMETRES
! LA TAILLE DES MATRICE EST PRECISE DANS UN FICHIER TEXTE (TEST.TXT)
INTEGER :: DIM1
INTEGER :: DIM2
INTEGER :: I,J
INTEGER :: K
CHARACTER*15 :: FORME
!POUR LE STOCKAGE CLASSIQUE DE MATRICE CREUSE
INTEGER,DIMENSION(:),ALLOCATABLE :: VALUES !TABLEAU DE VALEURS
INTEGER,DIMENSION(:,:),ALLOCATABLE :: INDICES !TABLEAU D'INDICES
!POUR LA MATRICE PLEINE
INTEGER,DIMENSION(:),ALLOCATABLE :: U
INTEGER, DIMENSION (:,:), ALLOCATABLE :: A
INTEGER :: IERR
! !LECTURE DES CARACTERISTIQUES DE LA MATRICE DANS LE FICHIER TEST.TXT
OPEN (UNIT=12,FILE="test.txt",FORM="FORMATTED",STATUS="UNKNOWN")
DO K=1,100
READ(12,45)DIM1,DIM2,FORME
WRITE(*,45)DIM1,DIM2,FORME
45 FORMAT(I3,I3,A15)
!ALLOCATION DYNAMIQUE DE LA MEMOIRE
ALLOCATE (A(DIM1,DIM2),STAT=IERR)
ALLOCATE (U(DIM2))
ALLOCATE (INDICES(DIM1,2),STAT=IERR)
ALLOCATE(VALUES(DIM1))
IF(IERR.NE.0) STOP 'ERREUR!'
! PRENONS A LA MATRICE UNITE POUR A ET VALUES
DO I=1,DIM1
DO J=1,DIM2
A(I,J)=0
U(J)=j;
END DO
INDICES(I,1)=I
INDICES(I,2)=I
VALUES(I)=1
A(I,I)=1;
END DO
!!!AFFICHONS LA MATRICE I
! DO I=1,DIM1
! WRITE(*,*) (INDICES(I,J),J=1,2)
! END DO
!APPEL DES SUBROUTINES
CALL GEMV(A,U,DIM1,DIM2,FORME)
CALL SPMV(INDICES,VALUES,U,DIM1)
! ON DESALLOUE TOUT CE QU'ON A ALLOUE
DEALLOCATE(A)
DEALLOCATE(U)
DEALLOCATE(INDICES)
DEALLOCATE(VALUES)
END DO
!----------------------ESPACE SUBROUTINES
CONTAINS
!SUBROUTINES MATRICE DENSE
SUBROUTINE GEMV(A,U,DIM1,DIM2,FORME)
!DECLARATIONS PARAMETRES
REAL :: T1,T2,TEMPS_MOY=0.0
INTEGER, INTENT (IN) :: DIM1,DIM2
CHARACTER*15, INTENT (IN) :: FORME
INTEGER :: I,K,COMPTEUR=0,F_COMPTEUR=100
INTEGER,DIMENSION(:), INTENT (IN) :: U
INTEGER, DIMENSION (:,:), INTENT (IN) :: A
INTEGER,DIMENSION(:),ALLOCATABLE :: V
INTEGER :: IERR
ALLOCATE (V(DIM1))
IF(IERR.NE.0) STOP 'ERREUR!'
!CALCUL PRODUIT
DO COMPTEUR=1,F_COMPTEUR
!TOP CHRONO
CALL CPU_TIME(T1)
DO I=1,DIM1
V(I)=0
END DO
DO I=1,DIM1
DO K=1,DIM2
V(I)=V(I)+A(I,K)*U(K)
END DO
END DO
!STOP CHRONO
CALL CPU_TIME(T2)
TEMPS_MOY=T2 -T1+TEMPS_MOY
END DO
TEMPS_MOY=TEMPS_MOY/F_COMPTEUR
! WRITE (6,*) 'TEMPS TOTAL POUR GEMV= ',TEMPS_MOY
! ECRITURE DES RESULTATS DANS UN FICHIER (ECRITURE SEULE)
OPEN(13,FILE='Dense_F.csv',FORM='FORMATTED',ACTION="WRITE",POSITION="APPEND")
WRITE(13,'(I3,A3,I3,A3,A15,A3,F8.5)') DIM1,';',DIM2,';',FORME,';',TEMPS_MOY
!FERMETURE DU FICHIER
CLOSE(13)
END SUBROUTINE GEMV
!SUBROUTINES MATRICE CREUSE CLASSIQUE
SUBROUTINE SPMV(INDICES,VALUES,U,DIM1)
!DECLARATIONS PARAMETRES
REAL :: T1,T2,TEMPS_MOY=0.0
INTEGER :: I,K,DIM1,COMPTEUR=0,F_COMPTEUR=100
INTEGER,DIMENSION(:), INTENT (IN) :: VALUES
INTEGER,DIMENSION(:), INTENT (IN) :: U
INTEGER, DIMENSION (:,:), INTENT (IN) :: INDICES
INTEGER,DIMENSION(:),ALLOCATABLE :: V
INTEGER :: IERR
ALLOCATE (V(DIM2))
IF(IERR.NE.0) STOP 'ERREUR!'
!CALCUL PRODUIT
DO COMPTEUR=1,F_COMPTEUR
!TOP CHRONO
CALL CPU_TIME(T1)
DO I=1,DIM1
V(I)=0
END DO
DO I=1,DIM1
V(INDICES(I,1))=V(INDICES(I,1))+VALUES(I)*U(INDICES(I,2))
! WRITE (6,*) V(I)
END DO
!STOP CHRONO
CALL CPU_TIME(T2)
TEMPS_MOY=T2 -T1+TEMPS_MOY
END DO
TEMPS_MOY=TEMPS_MOY/F_COMPTEUR
! WRITE (6,*) 'TEMPS TOTAL POUR SPMV_CLASSIQUE= ',TEMPS_MOY
!ECRITURE DES RESULTATS DANS UN FICHIER (ECRITURE SEULE)
OPEN(14,FILE='Creuse_F.csv',FORM='FORMATTED',ACTION="WRITE",POSITION="APPEND")
WRITE(14,'(I3,A3,A15,A3,F8.5)') DIM1,';',FORME,';',TEMPS_MOY
!FERMETURE DU FICHIER
CLOSE(14)
END SUBROUTINE SPMV
END PROGRAM PROG_PRINC
!------------------------------------------------------------------------------
!MESSAGE D'ERREUR RETOURNER DANS LE TERMINAL
!a.out: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
!Abandon
!--------------------------------------------------------------------------------------
j'ai mis en commentaire tout en bas l'erreur retourner pas le terminal.
Est-ce que tu aurais uen idée de pourquoi il peut pas aller au dela de 110 ?
Cordialement.
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"
17/07/2012 - 09h54
bbdoll
Date d'inscription
décembre 2005
Âge
25
Messages
410
Re : Aide fortran
Est-ce un problème lié à Linux ou au compilateur fortran?
Cordialement.
"Ne craignez pas d' être lent, craignez seulement d' être à l' arrêt"