Erreur dans Fortran
marwamel
Messages postés
9
Date d'inscription
Statut
Membre
Dernière intervention
-
PSud Messages postés 1275 Date d'inscription Statut Membre Dernière intervention -
PSud Messages postés 1275 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Comment resoudre cette erreur dans Fortran:
The variable remplissage_mat is being used without being defined ?
Merci d'avance.
Comment resoudre cette erreur dans Fortran:
The variable remplissage_mat is being used without being defined ?
Merci d'avance.
A voir également:
- Erreur dans Fortran
- Erreur 0x80070643 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Comment recuperer whatsapp supprimé par erreur - Guide
22 réponses
J'ai trouvé deux erreurs dans le sous-programme remplissa_mat dont le dépassement d'indice dans un tableau que je soupçonnais.
Une première qui ne porte peut-être pas à conséquence :
dans le calcul de fsec(1), tu utilises la variable u(2) qui n'a jamais été initialisée. Elle est mise par défaut à 0 mais est-ce bien ce que tu veux ?
La deuxième qui entraine ces valeurs folles :
Au début du sous-programme tu as une première boucle sur i qui calcule sigma_b.
Puis une deuxième toujours sur i qui calcule la conductivité.
A la sortie de cette boucle, tu calcules K2 puis u(1).
Dans le calcul de u(1), tu utilises hn(i+1), hn(i) et deltaz(i) hors le fortran, pour savoir si la boucle précédente est terminée, incrémente i puis compare à la valeur de fin nm. Si i est plus grand que nm, il sort de la boucle.
Donc après la boucle i = nm+1 !!!! et donc, puisque dans ton exemple, nm=200, i devient égal à 201 et tu vas utiliser hn(202), hn(201) et deltaz(201) alors que ces trois tableaux sont dimentionnés à 200.
Une première qui ne porte peut-être pas à conséquence :
dans le calcul de fsec(1), tu utilises la variable u(2) qui n'a jamais été initialisée. Elle est mise par défaut à 0 mais est-ce bien ce que tu veux ?
La deuxième qui entraine ces valeurs folles :
Au début du sous-programme tu as une première boucle sur i qui calcule sigma_b.
Puis une deuxième toujours sur i qui calcule la conductivité.
A la sortie de cette boucle, tu calcules K2 puis u(1).
Dans le calcul de u(1), tu utilises hn(i+1), hn(i) et deltaz(i) hors le fortran, pour savoir si la boucle précédente est terminée, incrémente i puis compare à la valeur de fin nm. Si i est plus grand que nm, il sort de la boucle.
Donc après la boucle i = nm+1 !!!! et donc, puisque dans ton exemple, nm=200, i devient égal à 201 et tu vas utiliser hn(202), hn(201) et deltaz(201) alors que ces trois tableaux sont dimentionnés à 200.
Voici la nouvelle version de mon programe
program geophysique
program geophysique
implicit none INTEGER ::nm,nt,k,i,j REAL*8, DIMENSION(:) , ALLOCATABLE ::b_inf,b_sup,b_dia,fsec,deltaz,z,sigma_b,kond,PSn,hn,theta,u REAL*8 :: L,tmax,temps,PSimp,dt,flux0,Csat,sigma_sat,Ro,g,fi,Ks,u0,himp,sigma_w,F,na,A,B,sig1,sig2,[/download/telecharger-34078674-k1 k1],k2,cte L=20d0 tmax=1000.0d0 dt=1.0d0 !le fichier des input open (14, FILE='input_geo.dat') open (13, FILE='new_input.dat') open(15,FILE='resultats_touma.dat') read(13,*) nm Allocate (deltaz(nm),z(nm)) ALLOCATE(PSn(nm),fsec(nm),b_inf(nm),kond(nm),b_sup(nm),b_dia(nm),sigma_b(nm),u(nm),hn(nm),theta(nm)) read(13,*) deltaz(1:nm) read(13,*)himp read(13,*)u0 read(14,*) PSimp read(14,*) flux0 do i=1,nm read(15,*) z(i), hn(i) , theta(i) end do write(*,*) hn(1) open(16,FILE='resultats_géophysique.dat') nt=tmax/dt WRITE(*,*)'nm=',nm,'nt=',nt temps=0.0d0 pause do k=1,nt write(*,*)k temps=temps+dt call rempli_mat(nm,deltaz,dt,kond,sigma_b,b_sup,b_dia,b_inf,fsec,flux0,PSimp,hn,theta) call thomas(nm,b_sup,b_inf,b_dia,PSn,fsec) end do !Affichage du potenciel spontané do i=1,nm write(16,*)k,PSn(i) end do WRITE(*,*)'minimum=',MINVAL(PSn(1:nm)),'maximum=',MaxVAL(PSn(1:nm)) pause end subroutine rempli_mat(nm,deltaz,dt,kond,sigma_b,b_sup,b_dia,b_inf,fsec,flux0,PSimp,hn,theta) implicit none integer nm,i real*8 theta(*),u(nm),hn(*),deltaz(*),fsec(*),b_dia(*),b_sup(*),b_inf(*),sigma_b(*) real*8 Ro,g,fi,Csat,Ks,flux0,PSimp,kond(*),sigma_w,sigma_sat,F,sig1,sig2,na,cte,A,B,u0,k1,k2,himp,dt A=5.03611d0 B=6.07d0 sigma_w=0.00051d0 sigma_sat=0.0031d0 Ro=999.97d0 g=9.8d0 Ks=0.0000825d0 F=4.26d0 na=1.6d0 Csat=-2.9d-7 fi=1.0d0 u0=2.3d0 !calcul de sigma_b do i=1,nm sigma_b(i)=( (1.0d0/F)*sigma_w*(((theta(i))/fi)**na) ) end do !------------------------ !calcul de la conductivité do i=1,nm kond(i)=A*((theta(i))**B) end do !------------------------------ !calcul de vitesse de Darcy do i=2,nm-1 k1=(kond(i-1)+kond(i))/2.0d0 k2=(kond(i)+kond(i+1))/2.0d0 u(i)=( (-k2*(hn(i+1)-hn(i)) )/deltaz(i) ) + ( (k1*(hn(i)-hn(i-1)) )/deltaz(i) )+(k2-k1) end do !------------------------------- k2=(kond(1)+kond(2))/2.0d0 u(1)=( (-k2*(hn(2)-hn(1)) )/deltaz(1) )+k2-u0 cte=( (-Csat*sigma_sat*Ro*g*fi)/Ks ) sig2=( (sigma_b(1)+sigma_b(2))/2.0d0 ) b_dia(1)=( -sig2/deltaz(1) ) b_sup(1)= ( sig2/deltaz(1) ) fsec(1)= (cte*( ( (u(2)+u(1))/( theta(2)+theta(1)) )- (u(1)/theta(1)) ))+flux0 do i=2,nm-1 !k1=(kond(i-1)+kond(i))/2.0d0 !k2=(kond(i)+kond(i+1))/2.0d0 !u(i)=( (-k2*(hn(i+1)-hn(i)) )/deltaz(i) ) + ( (k1*(hn(i)-hn(i-1)) )/deltaz(i) )+(k2-k1) sig1=( ( sigma_b(i)+sigma_b(i-1) )/2.0d0 ) sig2=( (sigma_b(i)+sigma_b(i+1) )/2.0d0 ) b_inf(i)=(sig1/deltaz(i) ) b_dia(i)= ( -(sig2+sig1)/deltaz(i) ) b_sup(i)=( sig2/deltaz(i) ) fsec(i)= cte* ( ( (u(i+1)+u(i)) /(theta(i+1)+theta(i)) )- ( (u(i-1)+u(i) )/( theta(i-1)+theta(i) ) ) ) end do k1=(kond(nm-1)+kond(nm))/2.0d0 k2=kond(nm) u(nm)=( (-k2*(himp-hn(nm)) )/deltaz(nm) ) + ( (k1*(hn(nm)-hn(nm-1)) )/deltaz(nm) )+(k2-k1) sig1= ( (sigma_b(nm-1)+sigma_b(nm))/2.0d0 ) b_inf(nm)= ( sig1/deltaz(nm) ) b_dia(nm)= ( - ((2.0d0*sig2)+sig1)/deltaz(nm) ) fsec(nm)= (cte* ( (u(nm)/theta(nm))-( (u(nm)+u(nm-1))/(theta(nm)+theta(nm-1) ) )) )- ((2.0d0*sig2*PSimp)/deltaz(nm)) return end subroutine thomas(n,a,b,d,c,f) implicit none integer i,j,nmax,n parameter (nmax=10000) real*8 a(*),b(*),c(*),d(*),f(*),r(nmax),g r(1)=f(1) do i=2,n g=b(i)/d(i-1) d(i)=d(i)-g*a(i-1) r(i)=f(i)-g*r(i-1) enddo c(n)=r(n)/d(n) DO i=2,n j=n-i+1 c(j)=(r(j)-a(j)*c(j+1))/d(j) enddo return !close(13) end
Je ne sais pas si le résultat est celui attendu mais ce sont des chiffres plus "normaux". A ce stade, j'aurais juste une remarque : dans le fichier résultat, cela présente peu d'intérêt d'écrire sur chaque ligne la valeur de k qui est la fin de la boucle précédente. Il vaudrait mieux écrire la valeur de la boucle en cours et donc :
write (16,*) i, PSn(i)
write (16,*) i, PSn(i)
et ça donne ça :
1 -3935430.2051826436
2 -3932333.3792258673
3 -3926131.6604003091
4 -3919923.6897394797
5 -3913709.3707977696
6 -3907488.6051638792
7 -3901261.2924077096
8 -3895027.3300254424
9 -3888786.6133827381
10 -3882539.0356559642
11 -3876284.4877713793
12 -3870022.8583421852
13 -3863754.0336033520
14 -3857477.8973441240
15 -3851194.3308381075
16 -3844903.2127708304
17 -3838604.4191646664
18 -3832297.8233010108
19 -3825983.2956395722
20 -3819660.7037346647
21 -3813329.9121483630
22 -3806990.7823603647
23 -3800643.1726744245
24 -3794286.9381211922
25 -3787921.9303572900
26 -3781547.9975604466
27 -3775164.9843205079
28 -3768772.7315261224
29 -3762371.0762468958
30 -3755959.8516107895
31 -3749538.8866765318
32 -3743108.0063007963
33 -3736667.0309998854
34 -3730215.7768056355
35 -3723754.0551152620
36 -3717281.6725348234
37 -3710798.4307159735
38 -3704304.1261856649
39 -3697798.5501684099
40 -3691281.4884007256
41 -3684752.7209373252
42 -3678212.0219486165
43 -3671659.1595090330
44 -3665093.8953756876
45 -3658515.9847568078
46 -3651925.1760693798
47 -3645321.2106853835
48 -3638703.8226659694
49 -3632072.7384828678
50 -3625427.6767262868
51 -3618768.3477984951
52 -3612094.4535922394
53 -3605405.6871530693
54 -3598701.7323245867
55 -3591982.2633755691
56 -3585246.9446078259
57 -3578495.4299435774
58 -3571727.3624910410
59 -3564942.3740868182
60 -3558140.0848135655
61 -3551320.1024913155
62 -3544482.0221406776
63 -3537625.4254160239
64 -3530749.8800065974
65 -3523854.9390033153
66 -3516940.1402288629
67 -3510005.0055284635
68 -3503049.0400184975
69 -3496071.7312898925
70 -3489072.5485629425
71 -3482050.9417899251
72 -3475006.3407015568
73 -3467938.1537929643
74 -3460845.7672444629
75 -3453728.5437719948
76 -3446585.8214015840
77 -3439416.9121616380
78 -3432221.1006863313
79 -3424997.6427226155
80 -3417745.7635326930
81 -3410464.6561829336
82 -3403153.4797093007
83 -3395811.3571483195
84 -3388437.3734214329
85 -3381030.5730593097
86 -3373589.9577511833
87 -3366114.4837026214
88 -3358603.0587832802
89 -3351054.5394440391
90 -3343467.7273805114
91 -3335841.3659171793
92 -3328174.1360832672
93 -3320464.6523478990
94 -3312711.4579779911
95 -3304913.0199776310
96 -3297067.7235623049
97 -3289173.8661150867
98 -3281229.6505647162
99 -3273233.1781171155
100 -3265182.4402622012
101 -3257075.3099664846
102 -3248909.5319487099
103 -3240682.7119201901
104 -3232392.3046531668
105 -3224035.6007188358
106 -3215609.7117109578
107 -3207111.5537403319
108 -3198537.8289487972
109 -3189885.0047474471
110 -3181149.2904307181
111 -3172326.6107537802
112 -3163412.5759824836
113 -3154402.4478294807
114 -3145291.1005725507
115 -3136072.9765057447
116 -3126742.0346931326
117 -3117291.6917686528
118 -3107714.7532405737
119 -3098003.3333977270
120 -3088148.7614531857
121 -3078141.4709671945
122 -3067970.8688207893
123 -3057625.1790036899
124 -3047091.2551495917
125 -3036354.3539787587
126 -3025397.8594205943
127 -3014202.9439402851
128 -3002748.1491226479
129 -2991008.8613388743
130 -2978956.6495382441
131 -2966558.4196540155
132 -2953775.3219282497
133 -2940561.3207532214
134 -2926861.2968710167
135 -2912608.4918569070
136 -2897721.0136365024
137 -2882096.9824962043
138 -2865607.6859726673
139 -2848087.8021775391
140 -2829321.3445605631
141 -2809021.6180566382
142 -2786803.8440101366
143 -2762152.6978066345
144 -2734401.1563042193
145 -2702776.4057496926
146 -2666628.7011165530
147 -2625892.9279647893
148 -2581399.7904822868
149 -2534485.9532814999
150 -2486291.8506380725
151 -2437498.7582928310
152 -2388442.4238049295
153 -2339273.6901712655
154 -2290057.5756018143
155 -2240821.6024728781
156 -2191577.3287910246
157 -2142329.5906642606
158 -2093080.4079028184
159 -2043830.6231707637
160 -1994580.5877562582
161 -1945330.4480094488
162 -1896080.2648651279
163 -1846830.0636797145
164 -1797579.8549986063
165 -1748329.6432049908
166 -1699079.4301196919
167 -1649829.2164986613
168 -1600579.0026555648
169 -1551328.7887204753
170 -1502078.5747472991
171 -1452828.3607583640
172 -1403578.1467629122
173 -1354327.9327647674
174 -1305077.7187655105
175 -1255827.5047657948
176 -1206577.2907658897
177 -1157327.0767659065
178 -1108076.8627658912
179 -1058826.6487658629
180 -1009576.4347658292
181 -960326.22076579358
182 -911076.00676575699
183 -861825.79276572005
184 -812575.57876568288
185 -763325.36476564547
186 -714075.15076560806
187 -664824.93676557066
188 -615574.72276553325
189 -566324.50876549585
190 -517074.29476545844
191 -467824.08076542104
192 -418573.86676538363
193 -369323.65276534623
194 -320073.43876530882
195 -270823.22476527141
196 -221573.01076523401
197 -172322.79676519660
198 -123072.58276515920
199 -73822.368765121792
200 -24598.630882551548
1 -3935430.2051826436
2 -3932333.3792258673
3 -3926131.6604003091
4 -3919923.6897394797
5 -3913709.3707977696
6 -3907488.6051638792
7 -3901261.2924077096
8 -3895027.3300254424
9 -3888786.6133827381
10 -3882539.0356559642
11 -3876284.4877713793
12 -3870022.8583421852
13 -3863754.0336033520
14 -3857477.8973441240
15 -3851194.3308381075
16 -3844903.2127708304
17 -3838604.4191646664
18 -3832297.8233010108
19 -3825983.2956395722
20 -3819660.7037346647
21 -3813329.9121483630
22 -3806990.7823603647
23 -3800643.1726744245
24 -3794286.9381211922
25 -3787921.9303572900
26 -3781547.9975604466
27 -3775164.9843205079
28 -3768772.7315261224
29 -3762371.0762468958
30 -3755959.8516107895
31 -3749538.8866765318
32 -3743108.0063007963
33 -3736667.0309998854
34 -3730215.7768056355
35 -3723754.0551152620
36 -3717281.6725348234
37 -3710798.4307159735
38 -3704304.1261856649
39 -3697798.5501684099
40 -3691281.4884007256
41 -3684752.7209373252
42 -3678212.0219486165
43 -3671659.1595090330
44 -3665093.8953756876
45 -3658515.9847568078
46 -3651925.1760693798
47 -3645321.2106853835
48 -3638703.8226659694
49 -3632072.7384828678
50 -3625427.6767262868
51 -3618768.3477984951
52 -3612094.4535922394
53 -3605405.6871530693
54 -3598701.7323245867
55 -3591982.2633755691
56 -3585246.9446078259
57 -3578495.4299435774
58 -3571727.3624910410
59 -3564942.3740868182
60 -3558140.0848135655
61 -3551320.1024913155
62 -3544482.0221406776
63 -3537625.4254160239
64 -3530749.8800065974
65 -3523854.9390033153
66 -3516940.1402288629
67 -3510005.0055284635
68 -3503049.0400184975
69 -3496071.7312898925
70 -3489072.5485629425
71 -3482050.9417899251
72 -3475006.3407015568
73 -3467938.1537929643
74 -3460845.7672444629
75 -3453728.5437719948
76 -3446585.8214015840
77 -3439416.9121616380
78 -3432221.1006863313
79 -3424997.6427226155
80 -3417745.7635326930
81 -3410464.6561829336
82 -3403153.4797093007
83 -3395811.3571483195
84 -3388437.3734214329
85 -3381030.5730593097
86 -3373589.9577511833
87 -3366114.4837026214
88 -3358603.0587832802
89 -3351054.5394440391
90 -3343467.7273805114
91 -3335841.3659171793
92 -3328174.1360832672
93 -3320464.6523478990
94 -3312711.4579779911
95 -3304913.0199776310
96 -3297067.7235623049
97 -3289173.8661150867
98 -3281229.6505647162
99 -3273233.1781171155
100 -3265182.4402622012
101 -3257075.3099664846
102 -3248909.5319487099
103 -3240682.7119201901
104 -3232392.3046531668
105 -3224035.6007188358
106 -3215609.7117109578
107 -3207111.5537403319
108 -3198537.8289487972
109 -3189885.0047474471
110 -3181149.2904307181
111 -3172326.6107537802
112 -3163412.5759824836
113 -3154402.4478294807
114 -3145291.1005725507
115 -3136072.9765057447
116 -3126742.0346931326
117 -3117291.6917686528
118 -3107714.7532405737
119 -3098003.3333977270
120 -3088148.7614531857
121 -3078141.4709671945
122 -3067970.8688207893
123 -3057625.1790036899
124 -3047091.2551495917
125 -3036354.3539787587
126 -3025397.8594205943
127 -3014202.9439402851
128 -3002748.1491226479
129 -2991008.8613388743
130 -2978956.6495382441
131 -2966558.4196540155
132 -2953775.3219282497
133 -2940561.3207532214
134 -2926861.2968710167
135 -2912608.4918569070
136 -2897721.0136365024
137 -2882096.9824962043
138 -2865607.6859726673
139 -2848087.8021775391
140 -2829321.3445605631
141 -2809021.6180566382
142 -2786803.8440101366
143 -2762152.6978066345
144 -2734401.1563042193
145 -2702776.4057496926
146 -2666628.7011165530
147 -2625892.9279647893
148 -2581399.7904822868
149 -2534485.9532814999
150 -2486291.8506380725
151 -2437498.7582928310
152 -2388442.4238049295
153 -2339273.6901712655
154 -2290057.5756018143
155 -2240821.6024728781
156 -2191577.3287910246
157 -2142329.5906642606
158 -2093080.4079028184
159 -2043830.6231707637
160 -1994580.5877562582
161 -1945330.4480094488
162 -1896080.2648651279
163 -1846830.0636797145
164 -1797579.8549986063
165 -1748329.6432049908
166 -1699079.4301196919
167 -1649829.2164986613
168 -1600579.0026555648
169 -1551328.7887204753
170 -1502078.5747472991
171 -1452828.3607583640
172 -1403578.1467629122
173 -1354327.9327647674
174 -1305077.7187655105
175 -1255827.5047657948
176 -1206577.2907658897
177 -1157327.0767659065
178 -1108076.8627658912
179 -1058826.6487658629
180 -1009576.4347658292
181 -960326.22076579358
182 -911076.00676575699
183 -861825.79276572005
184 -812575.57876568288
185 -763325.36476564547
186 -714075.15076560806
187 -664824.93676557066
188 -615574.72276553325
189 -566324.50876549585
190 -517074.29476545844
191 -467824.08076542104
192 -418573.86676538363
193 -369323.65276534623
194 -320073.43876530882
195 -270823.22476527141
196 -221573.01076523401
197 -172322.79676519660
198 -123072.58276515920
199 -73822.368765121792
200 -24598.630882551548
Ton Fortran est peut-être plus restrictif que celui que j'ai pris. Tu devrais l'installer (voir plus haut comment faire) et essayer sur ton PC.
La ligne de commande pour compiler est simple une fois que tu as installé le gfortran :
tu te mets dans le répertoire où sont le source et les datas et tu tapes :
gfortran geophysique.f90
Ca te génère un exécutable nommé a.exe
La ligne de commande pour compiler est simple une fois que tu as installé le gfortran :
tu te mets dans le répertoire où sont le source et les datas et tu tapes :
gfortran geophysique.f90
Ca te génère un exécutable nommé a.exe