Problème compteur fortran

altopic -  
cchristian Messages postés 928 Statut Membre -
Bonjour à tous,

Je vous explique mon petit problème...
Je dois lire dans un fichier texte des valeurs. jusque la rien de compliqué.. Seulement je dois récupérer que certaines valeurs de ce fichier à savoir toutes les 14 lignes, récupérer la valeur et l'additionner à la précédente pour en faire une moyenne. Je n'arrive pas à implémenter un compteur qui lui fasse comprendre que c toutes les 14 lignes que le programme doit relever la vaeur.
Pour l'instant mon script fait: tous les 14 i(i etant l'increment) j'additione la 1ere ligne avec la deuxieme pui avec la 3ieme... alors que je voudrai la 1iere avec la 14ieme avec la 28ieme...

voici mon bout de script:

do i=1,ligne,14
READ(10,*)lon,lat,sla_free
count=count+1

sla_moy=sla_moy+sla_free
print*,sla_moy
! sla_moy=sla_moy/count
enddo
print*,sla_moy,count
Configuration: Windows 2000
Firefox 3.0.11

10 réponses

  1. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    Je te propose cette solution qui, je l'espère, doit répondre à ton problème:

           PROGRAM  P_MOY                                                                    
    
           IMPLICIT       NONE
    
           INTEGER        IO_RC             /0/ 
           INTEGER        DATA_UT_IN        /10/            
           INTEGER        CPT_ENREG_CAL     /0/
           INTEGER        CPT_PAS_ENREG     /0/
    !      Le pas correspond au nombre d'enregistrements qui sont ignorés 
    !      et sont situés entre deux enregistrements utiles au calcul de la
    !      moyenne.            
           INTEGER        PAS_ENREG         /6/
    !      Illustration: Fichier en entrée (jeu d'essais):     
    !1   2  3.00000000
    !2   5  6.00000000
    !3   8  9.00000000
    !4   11 12.00000000
    !5   11 12.00000000
    !6   11 12.00000000
    !7   11 12.00000000
    !8   2  3.00000000
    !9   5  6.00000000
    !10  8  9.00000000
    !11  11 12.00000000
    !12  11 12.00000000
    !13  11 12.00000000
    !14  11 12.00000000
    !                   Résultats avec un pas de 6 :
    !C:\Documents and Settings\Chris\Mes documents\FORTRAN.files>moy
    ! Pas de            6
    ! lon:            7
    ! lon:           14
    ! LA MOYENNE EST :      24.0000    /           2 =      12.0000       
    
           INTEGER        lon               /0/ 
           INTEGER        lat               /0/ 
           REAL           sla_free          /0.0/ 
           REAL           sla_cum           /0.0/ 
           REAL           sla_moy           /0.0/ 
              
           CHARACTER      F_NAME_IN*16  /'f_moy.txt'/ !Nom du fichier.
           CHARACTER      IO_ORDRE*16       /' '/           
    				 							     
    !      OUVERTURE DU FICHIER.
           IO_ORDRE          = 'OPEN_IN'        
           OPEN      (UNIT   = DATA_UT_IN,    IOSTAT = IO_RC, 
         S            FILE   = F_NAME_IN,     STATUS = 'OLD',
         S            ACCESS = 'SEQUENTIAL',   FORM   = 'FORMATTED',
         S            ERR    = 0001)
    
    !      LECTURE INITIALE (1ER ENREGISTREMENT OU IO_RC = -1 FICHIER VIDE)
           IO_ORDRE          = 'READF_IN'     
           READ (UNIT=DATA_UT_IN, FMT=*, IOSTAT=IO_RC)
         S                                           lon, lat, sla_free  
           IF (IO_RC              .eq. -1)                         THEN
               PRINT *, ' '      
               PRINT *, 'ANOMALIE FICHIER VIDE FS : ', IO_RC,             
         S              ' SUR ORDRE:' ,IO_ORDRE 
               STOP   'TRAITEMENT IMPOSSIBLE'   
           END IF  
    
    ! ATTENTION !!!!!!!
    !    -  Si le 1er enreg. est à considérer dans le calcul alors :       
    !       CPT_PAS_ENREG            =  PAS_ENREG
    !       CPT_ENREG_CAL            =  CPT_ENREG_CAL +  1
    !    -  sinon :
           CPT_PAS_ENREG            =  0
           
           print *, 'Pas de ', PAS_ENREG         ! pour tests
    
           IO_ORDRE                 = 'READ_IN'     
    !      BOUCLE DE LECTURE DE L'INTEGRALITE DES ENREG. DU FICHIER.
           DO  WHILE ( IO_RC       .ne. -1 )
    
              IF  (  CPT_PAS_ENREG .eq. PAS_ENREG )               THEN   
                  print *, 'lon: ', lon          ! pour tests
                  CPT_ENREG_CAL     =  CPT_ENREG_CAL   +  1
                  sla_cum           =  sla_cum         +  sla_free 
                  CPT_PAS_ENREG     =  -1
              END IF
    
    !         BOUCLE DE LECTURE DES LOTS D'ENREGISTREMENTS.
              DO  WHILE ( CPT_PAS_ENREG < PAS_ENREG  .and. IO_RC .eq.  0 )  
                  READ (UNIT=DATA_UT_IN, FMT=*, IOSTAT=IO_RC)
         S                                           lon, lat, sla_free  
                  CPT_PAS_ENREG     =  CPT_PAS_ENREG   +  1
              END DO
    
           END DO   
    
    !      FERMETURE DU FICHIER.
           IO_ORDRE            = 'CLOSE_IN'        
           CLOSE     (UNIT   = DATA_UT_IN,   IOSTAT = IO_RC,
         S            ERR    = 0001,          STATUS = 'KEEP')
    
    
    0001   IF (IO_RC     .ne. 0  .and. IO_RC     .ne. -1)            THEN
               PRINT *, ' '      
               PRINT *, 'ANOMALIE ENTREE/SORTIE FS : ', IO_RC, 
         S              ' SUR ORDRE:' ,IO_ORDRE 
               STOP   'TRAITEMENT IMPOSSIBLE'   
           END IF
    
           sla_moy          =     sla_cum   /  CPT_ENREG_CAL 
           PRINT *, 'LA MOYENNE EST : ', sla_cum, '/',  CPT_ENREG_CAL,
         S          ' = ', sla_moy               ! pour tests     
    
           END      P_MOY
          
    0
    1. altopic
       
      Bonjour Christian,
      Désolé de ne pas avoir encore donné de retours, mais merci d'avoir répondu à mon post.
      Je ne suis pas arrivé à compiler votre script. S'agit-il de Fortran 90? Personnellement je compile en 77, malheureusement.... et je suis découvre ce langage....

      Sinon pour ce qui est du principe il y a de cela mais je n'ai pas bien explicité le problème:

      Dans mon fichier texte, on a 14 temps de mesures pour chaque point. La moyenne doit se faire sur les temps de mesures, c'est à dire que si l'on a 10 points de mesures, on aura un fichier qui contient 140 lignes, mais au final nous aurons 14 moyennes calculées, et ce quelque soit le nombre de mesures. Il faut donc repassé plusieurs fois dans le fichier.
      Je pensai du coup à essayer de faire un tableau, mais je ne vois pas comment l'arranger...
      Le principe serait qu'il est 14 colonnes, et autant de lignes que de points de mesures, puis on calcule la moyenne par colonne.
      Je suis dessus actuellement, mais sans succès pour l'instant...
      Encore une fois merci d'avoir pris le temps de me repondre, si vous avez une idée, elle sera la bienvenue.
      0
  2. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    Pouvez-vous me dire de quelles erreurs de compilation il s'agit ?
    Je regarde de mon côté le problème du tableau à 2 dimensions.
    0
  3. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    Voici une nouvelle version qui devrait passer en compilation (Fortran 77), pour la partie algo. je ne suis pas certain d'avoir bien compris le problème. Je vous propose quand même ce qui suit (il y a un jeu d'essais en fin de post):

           PROGRAM        P_MOY                                                                    
    
           IMPLICIT       NONE
    
           INTEGER        IO_RC             /0/ 
           INTEGER        DATA_UT_IN        /10/            
           INTEGER        lon               /0/ 
           INTEGER        lat               /0/ 
           REAL           sla_free          /0.0/ 
           REAL           sla_cum           /0.0/ 
           REAL           sla_moy           /0.0/ 
              
           CHARACTER      F_NAME_IN*16  /'f_moy.txt'/ 
           CHARACTER      IO_ORDRE*16       /' '/           
           CHARACTER      NOM_PGM*8                  
    			
           INTEGER        NBMAX_POINTS     
           INTEGER        NBMAX_TEMPS         
           INTEGER        NB_POSTES         
           INTEGER        BORNE_POINTS     /0/    
           INTEGER        IND_P            /0/
           INTEGER        IND_T            /0/
           INTEGER        I                /0/
           INTEGER        J                /0/
           INTEGER        K                /0/
    
           PARAMETER  (
         S           NBMAX_POINTS = 1000, 
         S           NBMAX_TEMPS  = 14, 
         S           NB_POSTES    = 14000,  
         S           NOM_PGM      = 'P_MOY')
    
           DIMENSION  TAB_POINTEMPS  (1:NBMAX_POINTS,1:NBMAX_TEMPS) 
           REAL       TAB_POINTEMPS             
           DATA    ( (TAB_POINTEMPS  (J,K), K = 1, NBMAX_TEMPS,  1 ),
         S                                  J = 1, NBMAX_POINTS, 1) 
         S                                         / NB_POSTES * 0 /
    			
    C      -----------------------------------------------------------------
     			
    C      OUVERTURE DU FICHIER.
           IO_ORDRE          = 'OPEN_IN'        
           OPEN      (UNIT   = DATA_UT_IN,    IOSTAT = IO_RC, 
         S            FILE   = F_NAME_IN,     STATUS = 'OLD',
         S            ACCESS = 'SEQUENTIAL',  FORM   = 'FORMATTED',
         S            ERR    = 00900)
    
    !      LECTURE INITIALE (1ER ENREGISTREMENT OU IO_RC = -1 FICHIER VIDE)
           IO_ORDRE          = 'READF_IN'     
           READ (UNIT=DATA_UT_IN, FMT=*, IOSTAT=IO_RC)
         S                                           lon, lat, sla_free  
           IF (IO_RC              .eq. -1)                           THEN
               PRINT *, ' '      
               PRINT *, NOM_PGM, ' ANOMALIE FICHIER VIDE FS : ', IO_RC,             
         S              ' SUR ORDRE:', IO_ORDRE 
               STOP     'TRAITEMENT IMPOSSIBLE'   
           END IF  
    
           I                       = -1
           PRINT '(///,A,I4.1)', 'C  VALEUR DU PAS DE PROGRESSION : ',
         S                       NBMAX_TEMPS
          
    C      BOUCLES DE LECTURE DE L'INTEGRALITE DES ENREG. DU FICHIER ET LEUR
    C      CHARGEMENT DANS UN TABLEAU A 2 DIMENSIONS (TAB_POINTEMPS).
           IO_ORDRE                = 'READ_IN'     
           IND_P                   =  0 
    
    00100  CONTINUE
           IF ( IO_RC             .ne. 0 )                           THEN
                GO TO                                                00400       
           END IF
    
           IND_P                   =  IND_P   +    1
           IND_T                   =  0
    00200  CONTINUE
           IF (IND_T   .LT.  NBMAX_TEMPS + I  .and. IO_RC  .eq. 0)   THEN          
               IND_T               =  IND_T   +    1
               TAB_POINTEMPS         (IND_P, IND_T) = sla_free
               READ    (UNIT=DATA_UT_IN, FMT=*, IOSTAT=IO_RC)
         S                                           lon, lat, sla_free
               IF (IO_RC          .ne. 0  .and.  IO_RC  .ne. -1)     THEN
                   PRINT *, ' '      
                   PRINT '(/)'
                   PRINT *, NOM_PGM, ' ANOMALIE FS : ', IO_RC,             
         S                  ' SUR ORDRE:' ,IO_ORDRE 
                   STOP     'TRAITEMENT IMPOSSIBLE'   
               END IF  
               GO TO                                                 00200
           END IF    
           I                       =  0
           GO TO                                                     00100
    00400  CONTINUE
    
    
           BORNE_POINTS            =  IND_P
    
    C      BOUCLES DE CONTRÔLE DU CHARGEMENT DU TABLEAU (TAB_POINTEMPS). 
           DO  00600       IND_P   =  1, BORNE_POINTS
    	   PRINT '(/,A,I4.1)', 'C  POINT : ', IND_P
               DO 00500    IND_T   =  1, NBMAX_TEMPS
                  PRINT '(A,F8.4,A,I4.1)', 'C  sla_cum : ',
         S              TAB_POINTEMPS (IND_P, IND_T),
         S 	               '       no. colonne: ', IND_T
    00500      CONTINUE
    00600  CONTINUE
    
           PRINT    '(/)'
    
    C      BOUCLES DE CALCUL DE LA MOYENNE.  
           DO 00800        IND_T   =  1, NBMAX_TEMPS
               sla_cum             =  0    
               DO 00700    IND_P   =  1, BORNE_POINTS
                  sla_cum          =  sla_cum  + TAB_POINTEMPS(IND_P, IND_T) 
    00700      CONTINUE
               PRINT    '(A,I4.1,A,F8.2,A,I4.1,A,F8.4)',
         S              'C LA MOYENNE DES COLONNES NO.',
         S               IND_T, ' EST : ',  sla_cum, ' /',  BORNE_POINTS,
         S               ' = ', sla_cum   /  BORNE_POINTS ! PRINT pour tests     
    00800  CONTINUE
    
    
    C      FERMETURE DU FICHIER.
           IO_ORDRE                = 'CLOSE_IN'        
           CLOSE     (UNIT   = DATA_UT_IN,   IOSTAT = IO_RC,
         S            ERR    = 00900,        STATUS = 'KEEP')
    
    
    00900  IF (IO_RC     .ne. 0  .and. IO_RC     .ne. -1)            THEN
               PRINT *, ' '      
               PRINT *, NOM_PGM, ' ANOMALIE ENTREE/SORTIE FS : ', IO_RC, 
         S              ' SUR ORDRE:', IO_ORDRE 
               STOP     'TRAITEMENT IMPOSSIBLE'   
           END IF
    
           END           
           
    C      -----------------------------------------------------------------
    C      J E U X   D'E S S A I S :
    
    C      FICHIER EN INPUT:
    
    C  1   2  1.00000000
    C  2   5  2.00000000
    C  3   8  3.00000000
    C  4   11 4.00000000
    C  5   11 5.00000000
    C  6   11 6.00000000
    C  7   11 7.00000000
    C  8   2  8.00000000
    C  9   5  9.00000000
    C 10   8  10.00000000
    C 11   11 11.00000000
    C 12   11 12.00000000
    C 13   11 13.00000000
    C 14   11 14.00000000
    C 15   11 15.00000000
    C 16   11 16.00000000
    C 17   11 17.00000000
    C 18   11 18.00000000
    C 19   11 19.00000000
    C 20   11 20.00000000
    C 21   11 21.00000000
    C 22   11 22.00000000
    C 23   11 23.00000000
    C 24   11 24.00000000
    C 25   11 25.00000000
    C 26   11 26.00000000
    C 27   11 27.00000000
    C 28   11 28.00000000
    
    
    C      RESULTATS (Affichés à la console):
    
    C  VALEUR DU PAS DE PROGRESSION :   14
    
    C  POINT :    1
    C  sla_cum :   1.0000       no. colonne:    1
    C  sla_cum :   2.0000       no. colonne:    2
    C  sla_cum :   3.0000       no. colonne:    3
    C  sla_cum :   4.0000       no. colonne:    4
    C  sla_cum :   5.0000       no. colonne:    5
    C  sla_cum :   6.0000       no. colonne:    6
    C  sla_cum :   7.0000       no. colonne:    7
    C  sla_cum :   8.0000       no. colonne:    8
    C  sla_cum :   9.0000       no. colonne:    9
    C  sla_cum :  10.0000       no. colonne:   10
    C  sla_cum :  11.0000       no. colonne:   11
    C  sla_cum :  12.0000       no. colonne:   12
    C  sla_cum :  13.0000       no. colonne:   13
    C  sla_cum :   0.0000       no. colonne:   14 (poste délibérément ignoré)
    
    C  POINT :    2
    C  sla_cum :  14.0000       no. colonne:    1
    C  sla_cum :  15.0000       no. colonne:    2
    C  sla_cum :  16.0000       no. colonne:    3
    C  sla_cum :  17.0000       no. colonne:    4
    C  sla_cum :  18.0000       no. colonne:    5
    C  sla_cum :  19.0000       no. colonne:    6
    C  sla_cum :  20.0000       no. colonne:    7
    C  sla_cum :  21.0000       no. colonne:    8
    C  sla_cum :  22.0000       no. colonne:    9
    C  sla_cum :  23.0000       no. colonne:   10
    C  sla_cum :  24.0000       no. colonne:   11
    C  sla_cum :  25.0000       no. colonne:   12
    C  sla_cum :  26.0000       no. colonne:   13
    C  sla_cum :  27.0000       no. colonne:   14
    
    C  POINT :    3
    C  sla_cum :  28.0000       no. colonne:    1 (possible ?????)
    C  sla_cum :   0.0000       no. colonne:    2
    C  sla_cum :   0.0000       no. colonne:    3
    C  sla_cum :   0.0000       no. colonne:    4
    C  sla_cum :   0.0000       no. colonne:    5
    C  sla_cum :   0.0000       no. colonne:    6
    C  sla_cum :   0.0000       no. colonne:    7
    C  sla_cum :   0.0000       no. colonne:    8
    C  sla_cum :   0.0000       no. colonne:    9
    C  sla_cum :   0.0000       no. colonne:   10
    C  sla_cum :   0.0000       no. colonne:   11
    C  sla_cum :   0.0000       no. colonne:   12
    C  sla_cum :   0.0000       no. colonne:   13
    C  sla_cum :   0.0000       no. colonne:   14
    
    
    C LA MOYENNE DES COLONNES NO.   1 EST :    43.00 /   3 =  14.3333
    C LA MOYENNE DES COLONNES NO.   2 EST :    17.00 /   3 =   5.6667
    C LA MOYENNE DES COLONNES NO.   3 EST :    19.00 /   3 =   6.3333
    C LA MOYENNE DES COLONNES NO.   4 EST :    21.00 /   3 =   7.0000
    C LA MOYENNE DES COLONNES NO.   5 EST :    23.00 /   3 =   7.6667
    C LA MOYENNE DES COLONNES NO.   6 EST :    25.00 /   3 =   8.3333
    C LA MOYENNE DES COLONNES NO.   7 EST :    27.00 /   3 =   9.0000
    C LA MOYENNE DES COLONNES NO.   8 EST :    29.00 /   3 =   9.6667
    C LA MOYENNE DES COLONNES NO.   9 EST :    31.00 /   3 =  10.3333
    C LA MOYENNE DES COLONNES NO.  10 EST :    33.00 /   3 =  11.0000
    C LA MOYENNE DES COLONNES NO.  11 EST :    35.00 /   3 =  11.6667
    C LA MOYENNE DES COLONNES NO.  12 EST :    37.00 /   3 =  12.3333
    C LA MOYENNE DES COLONNES NO.  13 EST :    39.00 /   3 =  13.0000
    C LA MOYENNE DES COLONNES NO.  14 EST :    27.00 /   3 =   9.0000
    
    C      -----------------------------------------------------------------       
    0
    1. altopic
       
      Bonjour Christian,
      Je vais regarder votre script, en attendant voila celui que j'ai fais qui marche mais qui est, je pense, vraiment très très moche!!! Comment puis je faire pour ne pas avoir autant de variables à traiter?

      program calcul_gain

      real lon,lat,sla_free(14),sla_assim(14)
      real sla_moy,sla_moy1,sla_moy2,sla_moy3,sla_moy4,sla_moy5,sla_moy6,sla_moy8,sla_moy9,sla_moy10,sla_moy11,sla_moy12,sla_moy13
      real a,b,c,d,e,f,g,h,k,l,m,n,o,p
      real a_ass,b_ass,c_ass,d_ass,e_ass,f_ass,g_ass,h_ass,o_ass,p_ass,k_ass,l_ass,m_ass,n_ass
      real sla_moy_ass,sla_moy1_ass,sla_moy2_ass,sla_moy3_ass,sla_moy4_ass
      real sla_moy5_ass,sla_moy6_ass,sla_moy7_ass,sla_moy8_ass,sla_moy9_ass,sla_moy10_ass
      real sla_moy11_ass,sla_moy12_ass,sla_moy13_ass



      integer ok,ligne
      integer i,j,count





      open(10,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_EMMANUEL_CIRCU/select_spa.txt',status='old')

      ! CALL GETARG(1,select_sla)
      ! OPEN(20,file=select_sla, status='old')

      if(ok /= 0) then
      write(*,*) 'erreur 1 fichier xko.dat'
      stop
      end if

      do while(ok == 0) !boucle pour compter le nombre de ligne du fichier
      read(10,*,iostat = ok)
      if (ok == 0) ligne = ligne + 1
      end do
      rewind(unit=10,iostat=ok)


      count=0
      do i=1,ligne,14
      count=count+1
      do j=1,14

      READ(10,*)lon,lat,sla_free(j),sla_assim(j)
      a=sla_free(1)
      b=sla_free(2)
      c=sla_free(3)
      d=sla_free(4)
      e=sla_free(5)
      f=sla_free(6)
      g=sla_free(7)
      h=sla_free(8)
      o=sla_free(9)
      p=sla_free(10)
      k=sla_free(11)
      l=sla_free(12)
      m=sla_free(13)
      n=sla_free(14)

      a_ass=sla_assim(1)
      b_ass=sla_assim(2)
      c_ass=sla_assim(3)
      d_ass=sla_assim(4)
      e_ass=sla_assim(5)
      f_ass=sla_assim(6)
      g_ass=sla_assim(7)
      h_ass=sla_assim(8)
      o_ass=sla_assim(9)
      p_ass=sla_assim(10)
      k_ass=sla_assim(11)
      l_ass=sla_assim(12)
      m_ass=sla_assim(13)
      n_ass=sla_assim(14)


      enddo

      sla_moy=sla_moy+a
      sla_moy1=sla_moy1+b
      sla_moy2=sla_moy2+c
      sla_moy3=sla_moy3+d
      sla_moy4=sla_moy4+e
      sla_moy5=sla_moy5+f
      sla_moy6=sla_moy6+g
      sla_moy7=sla_moy7+h
      sla_moy8=sla_moy8+o
      sla_moy9=sla_moy9+p
      sla_moy10=sla_moy10+k
      sla_moy11=sla_moy11+l
      sla_moy12=sla_moy12+m
      sla_moy13=sla_moy13+n

      sla_moy_ass=sla_moy_ass+a_ass
      sla_moy1_ass=sla_moy1_ass+b_ass
      sla_moy2_ass=sla_moy2_ass+c_ass
      sla_moy3_ass=sla_moy3_ass+d_ass
      sla_moy4_ass=sla_moy4_ass+e_ass
      sla_moy5_ass=sla_moy5_ass+f_ass
      sla_moy6_ass=sla_moy6_ass+g_ass
      sla_moy7_ass=sla_moy7_ass+h_ass
      sla_moy8_ass=sla_moy8_ass+o_ass
      sla_moy9_ass=sla_moy9_ass+p_ass
      sla_moy10_ass=sla_moy10_ass+k_ass
      sla_moy11_ass=sla_moy11_ass+l_ass
      sla_moy12_ass=sla_moy12_ass+m_ass
      sla_moy13_ass=sla_moy13_ass+n_ass


      enddo

      print*,sla_moy,sla_moy1,sla_moy2,sla_moy3,sla_moy4,sla_moy5,
      s sla_moy6,sla_moy7,sla_moy8,sla_moy9,sla_moy10,
      s sla_moy11,sla_moy12,sla_moy13,sla_moy_ass,
      s sla_moy1_ass,sla_moy2_ass,sla_moy3_ass,
      s sla_moy4_ass,sla_moy5_ass,sla_moy6_ass,
      s sla_moy7_ass,sla_moy8_ass,sla_moy9_ass,
      s sla_moy10_ass,sla_moy11_ass,sla_moy12_ass,
      s sla_moy13_ass,count


      end


      Voici un extrait du fichier en entrée, pour 2 points de mesure (soit 14 valeurs par point de mesures car 14 increments de temps (24,48.....). Tout le fichier est constitué de la sorte, seul le nombre de points de mesures diffère:

      INPUT FILE:
      -0.751800 45.2744 36.5116 9.17149 SOMME 1ere ligne 3ieme colonne avec 15 ieme ligne, 3iemcolonne
      -0.751800 45.2744 34.8931 8.79884 SOMME 2ere ligne 3ieme colonne avec 16 ieme ligne, 3iemcolonne
      -0.751800 45.2744 34.6048 8.76995
      -0.751800 45.2744 36.5679 9.50386
      -0.751800 45.2744 35.1470 9.16028
      -0.751800 45.2744 34.7314 9.08785
      -0.751800 45.2744 31.2656 8.25212
      -0.751800 45.2744 32.5082 8.55597
      -0.751800 45.2744 35.8456 9.09649
      -0.751800 45.2744 35.8083 9.13362
      -0.751800 45.2744 28.1826 7.60678
      -0.751800 45.2744 28.5980 7.74466
      -0.751800 45.2744 28.0311 7.62885
      -0.751800 45.2744 28.6885 7.80316
      -5.57842 50.2222 39.9994 7.64982 15ieme ligne
      -5.57842 50.2222 39.4305 7.49879 16 ieme ligne
      -5.57842 50.2222 41.3295 7.91560
      -5.57842 50.2222 38.1329 7.19185
      -5.57842 50.2222 36.1605 6.80509
      -5.57842 50.2222 38.9594 7.39974
      -5.57842 50.2222 39.2217 7.45642
      -5.57842 50.2222 39.7679 7.58570
      -5.57842 50.2222 38.8845 7.36699
      -5.57842 50.2222 40.1477 7.66869
      -5.57842 50.2222 43.7358 8.40316
      -5.57842 50.2222 38.3003 7.27969
      -5.57842 50.2222 39.0429 7.41285
      -5.57842 50.2222 38.3050 7.28667

      et voici la sortie:

      OUTPUT:
      76.5110 74.3236 75.9343 74.7008 71.3075 73.6908 70.4873 resultats pour la 3ieme colonne (14 resultats)
      72.2761 74.7301 75.9560 71.9184 66.8983 67.0740 66.9935

      16.8213 16.2976 16.6856 16.6957 15.9654 16.4876 15.7085 resultats pour la 4ieme colonne(14resultats)
      16.1417 16.4635 16.8023 16.0099 15.0243 15.0417 15.0898
      2=count: nombres de valeurs additionnées qui me permettent faire la moyenne par la suite


      j'espere que mon objectif est un peu plus clair....
      0
  4. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour

    Oui, c'est un peu plus clair.
    Je vous propose cette adaptation de votre code :

           program calcul_gain 
    
           real lon,lat,sla_free(14),sla_assim(14),sla_moy(14),
         S              sla_moy_ass(14)         
    
            DATA (sla_moy        (i), i = 1,14, 1)    /14  * 0   /
            DATA (sla_moy_ass        (i), i = 1,14, 1)    /14  * 0   /
    
           integer ok,ligne 
           integer i,j,count 
    
           open(10,file='f_moy22.txt',status='old',iostat=ok) 
    
    
            if(ok /= 0) then 
              write(*,*) 'erreur 1 fichier xko.dat' 
              stop 
              end if 
    	ligne = 0           
    	do while(ok == 0) !boucle pour compter le nb.de ligne du fichier 
               read(10,*,iostat = ok) 
               if (ok == 0) ligne = ligne + 1 
              end do 
            rewind(unit=10,iostat=ok) 
    
            count=0 
            do i=1,ligne,14 
               count=count+1 
               do j=1,14 
                 READ(10,*)lon,lat,sla_free(j),sla_assim(j) 
                 sla_moy     (j) = sla_moy     (j) + sla_free   (j)  
                 sla_moy_ass (j) = sla_moy_ass (J) + sla_assim  (j) 
               enddo 
            enddo 
    
    	print '(/,A)', 'Moyenne: '
            do i=1,14 
                print*,sla_moy (i)
            end do
    	print  '(/,A)', 'Moyenne ass: '
            do i=1,14 
                print*,sla_moy_ass (i)
    	end do
    
            end 


    Résultats avec votre fichier en input :
    Moyenne:
      76.5110016
      74.3236008
      75.9342957
      74.7008057
      71.3074951
      73.6907959
      70.4872971
      72.2761002
      74.7301025
      75.9560013
      71.9184036
      66.8983002
      67.0739975
      66.9934998
    
    Moyenne ass:
      16.82131
      16.2976303
      16.6855507
      16.6957111
      15.9653702
      16.4875908
      15.70854
      16.1416702
      16.46348
      16.8023109
      16.0099411
      15.0243492
      15.0417004
      15.0898304

    0
    1. altopic
       
      Bonjour Christian,
      Merci d'avoir pris le temps, votre script marche très bien, c'est exactement ce que je cherche à faire.
      Je vais pouvoir continuer mon étude.

      Bonne continuation, et peut être à bientôt sur le forum.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Merci pour le retour, bonne continuation à vous aussi.
    0
    1. altopic
       
      Bonjour Christian,
      Je voulais vous demander comment marche l'instruction data.
      Je dois faire exactement la même chose que précédemment, mais cette fois-ci le pas est de 13306 et non plus 14. (soit additionner la 1 ligne avec la 13307ieme et ainsi de suite.) mais je n'arrive pas à paramétrer correctement les indices.
      D'avance merci
      0
  7. altopic
     
    Re bonjour, pas de problème en fait, j'ai compris le fonctionnement.
    Bonsoir
    0
    1. altopic
       
      Bonjour Christian,
      Je voulais savoir si dans l'instruction:

      real lon,lat,sla_free(14),sla_assim(14),sla_moy(14),
      S sla_moy_ass(14)

      DATA (sla_moy (i), i = 1,14, 1) /14 * 0 /
      DATA (sla_moy_ass (i), i = 1,14, 1) /14 * 0 /

      il est possible de mettre une variable à la place du pas 14. Ce pas varie en faite à chaque fois en fonction de l'étude.
      J'ai essayé de faire un programme qui enregistre ce pas dans un fichier txt pour le réutiliser dans mon programme, mais sans succès. Voici le script:
      --------------------------------------------------------------------------------------------------------------------------------
      program interval_sla
      integer ok,ligne,A

      open(10,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_EMMANUEL_CIRCU/select_point.txt',status='old',iostat=ok)
      open(20,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_EMMANUEL_CIRCU/A.txt',status='old',iostat=ok)
      if(ok /= 0) then
      write(*,*) 'erreur 1 fichier xko.dat'
      stop
      end if

      ligne = 0

      do while(ok == 0) !boucle pour compter le nb.de ligne du fichier
      read(10,*,iostat = ok)
      if (ok == 0) ligne = ligne + 1
      end do
      rewind(unit=10,iostat=ok)

      A=ligne/14
      write(20,*)A
      close(20)
      call yo

      END

      subroutine yo

      integer ok,ligne,i,j,count,A

      open(20,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_EMMANUEL_CIRCU/A.txt',status='old',iostat=ok)

      read(20,*)A
      close(20)


      lon,lat,sla_free(A),sla_assim(A),sla_moy(A),
      S sla_moy_ass(A)

      DATA (sla_moy (i), i = 1,A, 1) /A * 0 /
      DATA (sla_moy_ass (i), i = 1,A, 1) /A * 0 /

      --------------------------------------------------------------------------------------------------------------------------

      la suite du script yo est la même que celle que vous aviez produite, avec 'A' à la place des intervalles.
      0
  8. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Il doit en effet y avoir au moins une erreur à la compilation je présume car (en Fortran 77) la variable A doit être une constante.

           INTEGER A 
           PARAMETER  (
         S           A   = ............
         S           ..   = .................)


    DATA (sla_moy (i), i = 1,A, 1) /A * 0 / 
    DATA (sla_moy_ass (i), i = 1,A, 1) /A * 0 / 


    ce qui ne correspond pas au problème qui nous intéresse.
    En l'état actuel des choses pour "bypasser" cette contrainte il faut remplacer les instructions DATA par des boucles DO.

    INTEGER A 
    INTEGER IND      /1/
    ..........................
    read(20,*)A 
    ..........................
    
           DO WHILE  (      IND   <=    A)
               sla_moy       (IND)     =   0		  
               sla_moy_ass (IND)     =   0  
               IND                           =  IND    +    1
           END DO


    --Cordialement.

    Cchristian.
    0
    1. altopic
       
      Merci pour votre réponse,

      Je ne suis pas sur de bien comprendre le principe,
      En fait je ne peux pas déclarer

      real lon,lat,sla_free(A),sla_assim(A),sla_moy(A),
      S sla_moy_ass(A)

      avant la boucle do, il me retourne comme erreur :
      "calcul_gain_en_cours.F", Line = 7, Column = 24: ERROR: Local variable "A" must be a dummy argument or in common to be used in a bounds specification expression

      et il est impossible de le déclarer après, je ne vois comment indicer mes varibles.
      Avec votre code cela donnerait :

      INTEGER ok,ligne,i,j,count

      INTEGER A
      INTEGER IND /1/
      real lon,lat,sla_free(A),sla_assim(A),sla_moy(A),
      S sla_moy_ass(A)
      open(20,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_EMMANUEL_CIRCU/A.txt',status='old',iostat=ok)
      read(20,*)A

      DO WHILE ( IND <= A)
      sla_moy (IND) = 0
      sla_moy_ass (IND) = 0
      IND = IND + 1
      END DO

      ??? comment est ce que je peux déclarer mes variables sla_free, sla_assim... etc?
      0
  9. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    Nous sommes dans le même cas de figure que pour l'instruction DATA (voir mon dernier post). De plus il n'y a pas de possibilité d'allouer dynamiquement de la mémoire en Fortran 77. Il faut donc déclarer les variables (tableaux) avec une amplitude maximale supérieure ou égale à une valeur de pas (théorique et prévisionnelle) elle aussi maximale. (pour couvrir tous les cas de figure) . Par exemple :
    real lon,lat,sla_free(32767),sla_assim(32767),sla_moy(32767), 
    S sla_moy_ass(32767)

    A devra être, à chaque exécution du programme, < ou = à cette valeur maximale (ici, dans mon exemple: 32767).
    0
  10. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    Essayez cela je pense que ça répond à votre problème:

           program calcul_gain 
           INTEGER     AMPL_TAB
    C       PARAMETER ( AMPL_TAB = 32767) 
           PARAMETER ( AMPL_TAB = 28) 
           real lon,lat,sla_free    (AMPL_TAB),
         S              sla_assim   (AMPL_TAB),
         S              sla_moy     (AMPL_TAB),
         S              sla_moy_ass (AMPL_TAB)         
    
           integer ok,ligne 
           integer i,j,count 
           INTEGER     PAS_PROGRES
    
            DATA (sla_moy        (i), i = 1,AMPL_TAB, 1)    /AMPL_TAB  * 0 /
            DATA (sla_moy_ass    (i), i = 1,AMPL_TAB, 1)    /AMPL_TAB  * 0 /
    
    0001   WRITE (*,'(/,A,I6.1,A)') '    Entrez le pas de progression <= ',
         S                          AMPL_TAB, ': '
           READ  (*,'(I6.1)')       PAS_PROGRES
    
           IF ( PAS_PROGRES     >   AMPL_TAB)                      THEN
                WRITE (*,'(//,A,I6.1,A)') '***ERREUR Pas de progression > ',
         S                          AMPL_TAB, ': '
                GO TO                                              0001
           END IF 
    
           open(10,file='f_moy22.txt',status='old',iostat=ok) 
    
    
            if(ok /= 0) then 
              write(*,*) 'erreur 1 fichier xko.dat' 
              stop 
              end if 
    	ligne = 0           
    	do while(ok == 0) !boucle pour compter le nb.de ligne du fichier 
               read(10,*,iostat = ok) 
               if (ok == 0) ligne = ligne + 1 
              end do 
            rewind(unit=10,iostat=ok) 
    
           IF ( AMPL_TAB         >    ligne)                     THEN
                WRITE (*,'(//,A,A,I6.1,A)') '***ERREUR Pas de progression',
         S               ' > nb.d''enregistrements:', ligne, ' du fichier.'
                GO TO                                              0001
           END IF 
    
            count=0 
            do i = 1, ligne, PAS_PROGRES 
               count       =       count + 1 
               do  j = 1,    PAS_PROGRES 
                 READ (10,*) lon,lat, sla_free (j), sla_assim   (j) 
                 sla_moy     (j) = sla_moy     (j) + sla_free   (j)  
                 sla_moy_ass (j) = sla_moy_ass (J) + sla_assim  (j) 
               enddo 
            enddo 
    
    	print '(/,A)', 'Moyenne: '
            do i=1,PAS_PROGRES 
                print'(/,F8.4)', sla_moy (i)
            end do
    	print  '(/,A)', 'Moyenne ass: '
            do i=1,PAS_PROGRES 
                print'(/,F8.4)', sla_moy_ass (i)
    	end do
    
            end 
    0
    1. altopic
       
      Bonjour Christian,
      En effet c'est ce que je cherche à faire (encore une fois j'ai envie de dire!!!). J'avoue que pour le coup mes petits bidouillages étaient loin de votre solution (si tant est que mes bidouillages est marchés un jour)!!
      En tout cas encore une fois merci d'avoir pris le temps de vous pencher sur mon problème, cette solution à l'avantage de ne pas être figée en fonction des fichiers que j'ai a traiter et c'est exactement ce que je cherche.
      Merci,
      Cordialement,
      0
  11. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Content que cela vous convienne. A plus peut-être.

    Bonne continuation.
    0