Problème compteur fortran
Fermé
altopic
-
18 juin 2009 à 13:37
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 - 3 juil. 2009 à 12:10
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 - 3 juil. 2009 à 12:10
A voir également:
- Compteur woyofal vide
- Coeur vide ✓ - Forum Facebook
- Supprimer page vide word - Guide
- Compteur woyofal bloqué - Forum Réseau
- Raccourci coeur blanc - Forum Facebook
- Coeur vide ✓ - Forum Facebook
10 réponses
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
19 juin 2009 à 00:45
19 juin 2009 à 00:45
Bonsoir,
Je te propose cette solution qui, je l'espère, doit répondre à ton problème:
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
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
23 juin 2009 à 21:57
23 juin 2009 à 21:57
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.
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.
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
24 juin 2009 à 01:22
24 juin 2009 à 01:22
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):
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 -----------------------------------------------------------------
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....
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....
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
24 juin 2009 à 14:32
24 juin 2009 à 14:32
Bonjour
Oui, c'est un peu plus clair.
Je vous propose cette adaptation de votre code :
Résultats avec votre fichier en input :
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
25 juin 2009 à 13:56
25 juin 2009 à 13:56
Bonjour,
Merci pour le retour, bonne continuation à vous aussi.
Merci pour le retour, bonne continuation à vous aussi.
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
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
Re bonjour, pas de problème en fait, j'ai compris le fonctionnement.
Bonsoir
Bonsoir
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.
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.
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
2 juil. 2009 à 14:08
2 juil. 2009 à 14:08
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.
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.
--Cordialement.
Cchristian.
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.
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?
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?
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
2 juil. 2009 à 20:06
2 juil. 2009 à 20:06
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 :
A devra être, à chaque exécution du programme, < ou = à cette valeur maximale (ici, dans mon exemple: 32767).
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).
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
3 juil. 2009 à 00:33
3 juil. 2009 à 00:33
Bonsoir,
Essayez cela je pense que ça répond à votre problème:
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
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,
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,
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
3 juil. 2009 à 12:10
3 juil. 2009 à 12:10
Bonjour,
Content que cela vous convienne. A plus peut-être.
Bonne continuation.
Content que cela vous convienne. A plus peut-être.
Bonne continuation.
23 juin 2009 à 09:55
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.