Directory: | ./ |
---|---|
File: | dyn/vlsplt.f |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 205 | 304 | 67.4% |
Branches: | 145 | 240 | 60.4% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | c | ||
2 | c $Id: vlsplt.F 2603 2016-07-25 09:31:56Z emillour $ | ||
3 | c | ||
4 | |||
5 | 1920 | SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq) | |
6 | USE infotrac, ONLY: nqtot,nqdesc,iqfils | ||
7 | c | ||
8 | c Auteurs: P.Le Van, F.Hourdin, F.Forget | ||
9 | c | ||
10 | c ******************************************************************** | ||
11 | c Shema d'advection " pseudo amont " . | ||
12 | c ******************************************************************** | ||
13 | c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg .... | ||
14 | c | ||
15 | c pente_max facteur de limitation des pentes: 2 en general | ||
16 | c 0 pour un schema amont | ||
17 | c pbaru,pbarv,w flux de masse en u ,v ,w | ||
18 | c pdt pas de temps | ||
19 | c | ||
20 | c -------------------------------------------------------------------- | ||
21 | IMPLICIT NONE | ||
22 | c | ||
23 | include "dimensions.h" | ||
24 | include "paramet.h" | ||
25 | |||
26 | c | ||
27 | c Arguments: | ||
28 | c ---------- | ||
29 | REAL masse(ip1jmp1,llm),pente_max | ||
30 | c REAL masse(iip1,jjp1,llm),pente_max | ||
31 | REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm) | ||
32 | REAL q(ip1jmp1,llm,nqtot) | ||
33 | c REAL q(iip1,jjp1,llm) | ||
34 | REAL w(ip1jmp1,llm),pdt | ||
35 | INTEGER iq ! CRisi | ||
36 | c | ||
37 | c Local | ||
38 | c --------- | ||
39 | c | ||
40 | INTEGER i,ij,l,j,ii | ||
41 | INTEGER ijlqmin,iqmin,jqmin,lqmin | ||
42 | c | ||
43 | 3840 | REAL zm(ip1jmp1,llm,nqtot),newmasse | |
44 | REAL mu(ip1jmp1,llm) | ||
45 | REAL mv(ip1jm,llm) | ||
46 | REAL mw(ip1jmp1,llm+1) | ||
47 | 3840 | REAL zq(ip1jmp1,llm,nqtot),zz | |
48 | REAL dqx(ip1jmp1,llm),dqy(ip1jmp1,llm),dqz(ip1jmp1,llm) | ||
49 | REAL second,temps0,temps1,temps2,temps3 | ||
50 | REAL ztemps1,ztemps2,ztemps3 | ||
51 | REAL zzpbar, zzw | ||
52 | LOGICAL testcpu | ||
53 | SAVE testcpu | ||
54 | SAVE temps1,temps2,temps3 | ||
55 | INTEGER iminn,imaxx | ||
56 | INTEGER ifils,iq2 ! CRisi | ||
57 | |||
58 | REAL qmin,qmax | ||
59 | DATA qmin,qmax/0.,1.e33/ | ||
60 | DATA testcpu/.false./ | ||
61 | DATA temps1,temps2,temps3/0.,0.,0./ | ||
62 | |||
63 | |||
64 | 1920 | zzpbar = 0.5 * pdt | |
65 | zzw = pdt | ||
66 |
2/2✓ Branch 0 taken 74880 times.
✓ Branch 1 taken 1920 times.
|
76800 | DO l=1,llm |
67 |
2/2✓ Branch 0 taken 74880 times.
✓ Branch 1 taken 76602240 times.
|
76677120 | DO ij = iip2,ip1jm |
68 | 76677120 | mu(ij,l)=pbaru(ij,l) * zzpbar | |
69 | ENDDO | ||
70 |
2/2✓ Branch 0 taken 74880 times.
✓ Branch 1 taken 79073280 times.
|
79148160 | DO ij=1,ip1jm |
71 | 79148160 | mv(ij,l)=pbarv(ij,l) * zzpbar | |
72 | ENDDO | ||
73 |
2/2✓ Branch 0 taken 81544320 times.
✓ Branch 1 taken 74880 times.
|
81621120 | DO ij=1,ip1jmp1 |
74 | 81619200 | mw(ij,l)=w(ij,l) * zzw | |
75 | ENDDO | ||
76 | ENDDO | ||
77 | |||
78 |
2/2✓ Branch 0 taken 2090880 times.
✓ Branch 1 taken 1920 times.
|
2092800 | DO ij=1,ip1jmp1 |
79 | 2092800 | mw(ij,llm+1)=0. | |
80 | ENDDO | ||
81 | |||
82 | 1920 | CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1) | |
83 | 1920 | CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1) | |
84 | |||
85 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1920 times.
|
1920 | if (nqdesc(iq).gt.0) then |
86 | ✗ | do ifils=1,nqdesc(iq) | |
87 | ✗ | iq2=iqfils(ifils,iq) | |
88 | ✗ | CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) | |
89 | enddo | ||
90 | endif !if (nqfils(iq).gt.0) then | ||
91 | |||
92 | cprint*,'Entree vlx1' | ||
93 | c call minmaxq(zq,qmin,qmax,'avant vlx ') | ||
94 | 1920 | call vlx(zq,pente_max,zm,mu,iq) | |
95 | cprint*,'Sortie vlx1' | ||
96 | c call minmaxq(zq,qmin,qmax,'apres vlx1 ') | ||
97 | |||
98 | c print*,'Entree vly1' | ||
99 | |||
100 | 1920 | call vly(zq,pente_max,zm,mv,iq) | |
101 | c call minmaxq(zq,qmin,qmax,'apres vly1 ') | ||
102 | cprint*,'Sortie vly1' | ||
103 | 1920 | call vlz(zq,pente_max,zm,mw,iq) | |
104 | c call minmaxq(zq,qmin,qmax,'apres vlz ') | ||
105 | |||
106 | |||
107 | 1920 | call vly(zq,pente_max,zm,mv,iq) | |
108 | c call minmaxq(zq,qmin,qmax,'apres vly ') | ||
109 | |||
110 | |||
111 | 1920 | call vlx(zq,pente_max,zm,mu,iq) | |
112 | c call minmaxq(zq,qmin,qmax,'apres vlx2 ') | ||
113 | |||
114 | |||
115 |
2/2✓ Branch 0 taken 74880 times.
✓ Branch 1 taken 1920 times.
|
76800 | DO l=1,llm |
116 |
2/2✓ Branch 0 taken 81544320 times.
✓ Branch 1 taken 74880 times.
|
81619200 | DO ij=1,ip1jmp1 |
117 | 81619200 | q(ij,l,iq)=zq(ij,l,iq) | |
118 | ENDDO | ||
119 | 1920 | DO ij=1,ip1jm+1,iip1 | |
120 |
2/2✓ Branch 0 taken 2396160 times.
✓ Branch 1 taken 74880 times.
|
2471040 | q(ij+iim,l,iq)=q(ij,l,iq) |
121 | ENDDO | ||
122 | ENDDO | ||
123 | ! CRisi: aussi pour les fils | ||
124 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1920 times.
|
1920 | if (nqdesc(iq).gt.0) then |
125 | ✗ | do ifils=1,nqdesc(iq) | |
126 | ✗ | iq2=iqfils(ifils,iq) | |
127 | ✗ | DO l=1,llm | |
128 | ✗ | DO ij=1,ip1jmp1 | |
129 | ✗ | q(ij,l,iq2)=zq(ij,l,iq2) | |
130 | ENDDO | ||
131 | ✗ | DO ij=1,ip1jm+1,iip1 | |
132 | ✗ | q(ij+iim,l,iq2)=q(ij,l,iq2) | |
133 | ENDDO | ||
134 | ENDDO | ||
135 | enddo !do ifils=1,nqdesc(iq) | ||
136 | endif ! if (nqdesc(iq).gt.0) then | ||
137 | |||
138 | 1920 | RETURN | |
139 | END | ||
140 | 3840 | RECURSIVE SUBROUTINE vlx(q,pente_max,masse,u_m,iq) | |
141 | USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi | ||
142 | |||
143 | c Auteurs: P.Le Van, F.Hourdin, F.Forget | ||
144 | c | ||
145 | c ******************************************************************** | ||
146 | c Shema d'advection " pseudo amont " . | ||
147 | c ******************************************************************** | ||
148 | c nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg .... | ||
149 | c | ||
150 | c | ||
151 | c -------------------------------------------------------------------- | ||
152 | IMPLICIT NONE | ||
153 | c | ||
154 | include "dimensions.h" | ||
155 | include "paramet.h" | ||
156 | include "iniprint.h" | ||
157 | c | ||
158 | c | ||
159 | c Arguments: | ||
160 | c ---------- | ||
161 | REAL masse(ip1jmp1,llm,nqtot),pente_max | ||
162 | REAL u_m( ip1jmp1,llm ),pbarv( iip1,jjm,llm) | ||
163 | REAL q(ip1jmp1,llm,nqtot) | ||
164 | REAL w(ip1jmp1,llm) | ||
165 | INTEGER iq ! CRisi | ||
166 | c | ||
167 | c Local | ||
168 | c --------- | ||
169 | c | ||
170 | INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju | ||
171 | INTEGER n0,iadvplus(ip1jmp1,llm),nl(llm) | ||
172 | c | ||
173 | REAL new_m,zu_m,zdum(ip1jmp1,llm) | ||
174 | REAL sigu(ip1jmp1),dxq(ip1jmp1,llm),dxqu(ip1jmp1) | ||
175 | REAL zz(ip1jmp1) | ||
176 | REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm) | ||
177 | REAL u_mq(ip1jmp1,llm) | ||
178 | |||
179 | ! CRisi | ||
180 | 7680 | REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) | |
181 | INTEGER ifils,iq2 ! CRisi | ||
182 | |||
183 | Logical extremum,first,testcpu | ||
184 | SAVE first,testcpu | ||
185 | |||
186 | REAL SSUM | ||
187 | REAL temps0,temps1,temps2,temps3,temps4,temps5,second | ||
188 | SAVE temps0,temps1,temps2,temps3,temps4,temps5 | ||
189 | |||
190 | REAL z1,z2,z3 | ||
191 | |||
192 | DATA first,testcpu/.true.,.false./ | ||
193 | |||
194 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3839 times.
|
3840 | IF(first) THEN |
195 | 1 | temps1=0. | |
196 | 1 | temps2=0. | |
197 | 1 | temps3=0. | |
198 | 1 | temps4=0. | |
199 | 1 | temps5=0. | |
200 | 1 | first=.false. | |
201 | ENDIF | ||
202 | |||
203 | c calcul de la pente a droite et a gauche de la maille | ||
204 | |||
205 | |||
206 |
1/2✓ Branch 0 taken 3840 times.
✗ Branch 1 not taken.
|
3840 | IF (pente_max.gt.-1.e-5) THEN |
207 | c IF (pente_max.gt.10) THEN | ||
208 | |||
209 | c calcul des pentes avec limitation, Van Leer scheme I: | ||
210 | c ----------------------------------------------------- | ||
211 | |||
212 | c calcul de la pente aux points u | ||
213 |
2/2✓ Branch 0 taken 3840 times.
✓ Branch 1 taken 149760 times.
|
153600 | DO l = 1, llm |
214 |
2/2✓ Branch 0 taken 153054720 times.
✓ Branch 1 taken 149760 times.
|
153204480 | DO ij=iip2,ip1jm-1 |
215 | 153204480 | dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) | |
216 | c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0' | ||
217 | c sigu(ij)=u_m(ij,l)/masse(ij,l,iq) | ||
218 | ENDDO | ||
219 | 4642560 | DO ij=iip1+iip1,ip1jm,iip1 | |
220 |
2/2✓ Branch 0 taken 4492800 times.
✓ Branch 1 taken 149760 times.
|
4642560 | dxqu(ij)=dxqu(ij-iim) |
221 | c sigu(ij)=sigu(ij-iim) | ||
222 | ENDDO | ||
223 | |||
224 |
2/2✓ Branch 0 taken 153204480 times.
✓ Branch 1 taken 149760 times.
|
153354240 | DO ij=iip2,ip1jm |
225 | 153354240 | adxqu(ij)=abs(dxqu(ij)) | |
226 | ENDDO | ||
227 | |||
228 | c calcul de la pente maximum dans la maille en valeur absolue | ||
229 | |||
230 |
2/2✓ Branch 0 taken 153054720 times.
✓ Branch 1 taken 149760 times.
|
153204480 | DO ij=iip2+1,ip1jm |
231 | dxqmax(ij,l)=pente_max* | ||
232 | 153204480 | , min(adxqu(ij-1),adxqu(ij)) | |
233 | c limitation subtile | ||
234 | c , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij))) | ||
235 | |||
236 | |||
237 | ENDDO | ||
238 | |||
239 | 4642560 | DO ij=iip1+iip1,ip1jm,iip1 | |
240 |
2/2✓ Branch 0 taken 4492800 times.
✓ Branch 1 taken 149760 times.
|
4642560 | dxqmax(ij-iim,l)=dxqmax(ij,l) |
241 | ENDDO | ||
242 | |||
243 |
2/2✓ Branch 0 taken 153054720 times.
✓ Branch 1 taken 149760 times.
|
153208320 | DO ij=iip2+1,ip1jm |
244 |
2/2✓ Branch 0 taken 65216412 times.
✓ Branch 1 taken 87838308 times.
|
153054720 | IF(dxqu(ij-1)*dxqu(ij).gt.0) THEN |
245 | 65216412 | dxq(ij,l)=dxqu(ij-1)+dxqu(ij) | |
246 | ELSE | ||
247 | c extremum local | ||
248 | 87838308 | dxq(ij,l)=0. | |
249 | ENDIF | ||
250 | 153054720 | dxq(ij,l)=0.5*dxq(ij,l) | |
251 | dxq(ij,l)= | ||
252 | 153204480 | , sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l)) | |
253 | ENDDO | ||
254 | |||
255 | ENDDO ! l=1,llm | ||
256 | cprint*,'Ok calcul des pentes' | ||
257 | |||
258 | ELSE ! (pente_max.lt.-1.e-5) | ||
259 | |||
260 | c Pentes produits: | ||
261 | c ---------------- | ||
262 | |||
263 | ✗ | DO l = 1, llm | |
264 | ✗ | DO ij=iip2,ip1jm-1 | |
265 | ✗ | dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) | |
266 | ENDDO | ||
267 | ✗ | DO ij=iip1+iip1,ip1jm,iip1 | |
268 | ✗ | dxqu(ij)=dxqu(ij-iim) | |
269 | ENDDO | ||
270 | |||
271 | ✗ | DO ij=iip2+1,ip1jm | |
272 | ✗ | zz(ij)=dxqu(ij-1)*dxqu(ij) | |
273 | ✗ | zz(ij)=zz(ij)+zz(ij) | |
274 | ✗ | IF(zz(ij).gt.0) THEN | |
275 | ✗ | dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij)) | |
276 | ELSE | ||
277 | c extremum local | ||
278 | ✗ | dxq(ij,l)=0. | |
279 | ENDIF | ||
280 | ENDDO | ||
281 | |||
282 | ENDDO | ||
283 | |||
284 | ENDIF ! (pente_max.lt.-1.e-5) | ||
285 | |||
286 | c bouclage de la pente en iip1: | ||
287 | c ----------------------------- | ||
288 | |||
289 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l=1,llm |
290 | 4642560 | DO ij=iip1+iip1,ip1jm,iip1 | |
291 |
2/2✓ Branch 0 taken 4492800 times.
✓ Branch 1 taken 149760 times.
|
4642560 | dxq(ij-iim,l)=dxq(ij,l) |
292 | ENDDO | ||
293 |
2/2✓ Branch 0 taken 163088640 times.
✓ Branch 1 taken 149760 times.
|
163242240 | DO ij=1,ip1jmp1 |
294 | 163238400 | iadvplus(ij,l)=0 | |
295 | ENDDO | ||
296 | |||
297 | ENDDO | ||
298 | |||
299 | c print*,'Bouclage en iip1' | ||
300 | |||
301 | c calcul des flux a gauche et a droite | ||
302 | |||
303 | c on cumule le flux correspondant a toutes les mailles dont la masse | ||
304 | c au travers de la paroi pENDant le pas de temps. | ||
305 | cprint*,'Cumule ....' | ||
306 | |||
307 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l=1,llm |
308 |
2/2✓ Branch 0 taken 153054720 times.
✓ Branch 1 taken 149760 times.
|
153208320 | DO ij=iip2,ip1jm-1 |
309 | c print*,'masse(',ij,')=',masse(ij,l,iq) | ||
310 |
2/2✓ Branch 0 taken 109131512 times.
✓ Branch 1 taken 43923208 times.
|
153204480 | IF (u_m(ij,l).gt.0.) THEN |
311 | 109131512 | zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq) | |
312 | 109131512 | u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l)) | |
313 | ELSE | ||
314 | 43923208 | zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq) | |
315 | u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq) | ||
316 | 43923208 | & -0.5*zdum(ij,l)*dxq(ij+1,l)) | |
317 | ENDIF | ||
318 | ENDDO | ||
319 | ENDDO | ||
320 | c stop | ||
321 | |||
322 | c go to 9999 | ||
323 | c detection des points ou on advecte plus que la masse de la | ||
324 | c maille | ||
325 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l=1,llm |
326 |
2/2✓ Branch 0 taken 153054720 times.
✓ Branch 1 taken 149760 times.
|
153208320 | DO ij=iip2,ip1jm-1 |
327 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 153054720 times.
|
153204480 | IF(zdum(ij,l).lt.0) THEN |
328 | ✗ | iadvplus(ij,l)=1 | |
329 | ✗ | u_mq(ij,l)=0. | |
330 | ENDIF | ||
331 | ENDDO | ||
332 | ENDDO | ||
333 | cprint*,'Ok test 1' | ||
334 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l=1,llm |
335 | 3840 | DO ij=iip1+iip1,ip1jm,iip1 | |
336 |
2/2✓ Branch 0 taken 4492800 times.
✓ Branch 1 taken 149760 times.
|
4642560 | iadvplus(ij,l)=iadvplus(ij-iim,l) |
337 | ENDDO | ||
338 | ENDDO | ||
339 | c print*,'Ok test 2' | ||
340 | |||
341 | |||
342 | c traitement special pour le cas ou on advecte en longitude plus que le | ||
343 | c contenu de la maille. | ||
344 | c cette partie est mal vectorisee. | ||
345 | |||
346 | c calcul du nombre de maille sur lequel on advecte plus que la maille. | ||
347 | |||
348 | 3840 | n0=0 | |
349 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l=1,llm |
350 | 149760 | nl(l)=0 | |
351 |
2/2✓ Branch 0 taken 153204480 times.
✓ Branch 1 taken 149760 times.
|
153354240 | DO ij=iip2,ip1jm |
352 | 153354240 | nl(l)=nl(l)+iadvplus(ij,l) | |
353 | ENDDO | ||
354 | 153600 | n0=n0+nl(l) | |
355 | ENDDO | ||
356 | |||
357 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3840 times.
|
3840 | IF(n0.gt.0) THEN |
358 | ✗ | if (prt_level > 2) PRINT *, | |
359 | ✗ | $ 'Nombre de points pour lesquels on advect plus que le' | |
360 | ✗ | & ,'contenu de la maille : ',n0 | |
361 | |||
362 | ✗ | DO l=1,llm | |
363 | ✗ | IF(nl(l).gt.0) THEN | |
364 | iju=0 | ||
365 | c indicage des mailles concernees par le traitement special | ||
366 | ✗ | DO ij=iip2,ip1jm | |
367 | ✗ | IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN | |
368 | ✗ | iju=iju+1 | |
369 | ✗ | indu(iju)=ij | |
370 | ENDIF | ||
371 | ENDDO | ||
372 | niju=iju | ||
373 | c PRINT*,'niju,nl',niju,nl(l) | ||
374 | |||
375 | c traitement des mailles | ||
376 | ✗ | DO iju=1,niju | |
377 | ✗ | ij=indu(iju) | |
378 | ✗ | j=(ij-1)/iip1+1 | |
379 | ✗ | zu_m=u_m(ij,l) | |
380 | ✗ | u_mq(ij,l)=0. | |
381 | ✗ | IF(zu_m.gt.0.) THEN | |
382 | ijq=ij | ||
383 | ✗ | i=ijq-(j-1)*iip1 | |
384 | c accumulation pour les mailles completements advectees | ||
385 | ✗ | do while(zu_m.gt.masse(ijq,l,iq)) | |
386 | u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq) | ||
387 | ✗ | & *masse(ijq,l,iq) | |
388 | ✗ | zu_m=zu_m-masse(ijq,l,iq) | |
389 | ✗ | i=mod(i-2+iim,iim)+1 | |
390 | ✗ | ijq=(j-1)*iip1+i | |
391 | ENDDO | ||
392 | c ajout de la maille non completement advectee | ||
393 | u_mq(ij,l)=u_mq(ij,l)+zu_m* | ||
394 | & (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq)) | ||
395 | ✗ | & *dxq(ijq,l)) | |
396 | ELSE | ||
397 | ✗ | ijq=ij+1 | |
398 | ✗ | i=ijq-(j-1)*iip1 | |
399 | c accumulation pour les mailles completements advectees | ||
400 | ✗ | do while(-zu_m.gt.masse(ijq,l,iq)) | |
401 | u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq) | ||
402 | ✗ | & *masse(ijq,l,iq) | |
403 | ✗ | zu_m=zu_m+masse(ijq,l,iq) | |
404 | ✗ | i=mod(i,iim)+1 | |
405 | ✗ | ijq=(j-1)*iip1+i | |
406 | ENDDO | ||
407 | c ajout de la maille non completement advectee | ||
408 | u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)- | ||
409 | ✗ | & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l)) | |
410 | ENDIF | ||
411 | ENDDO | ||
412 | ENDIF | ||
413 | ENDDO | ||
414 | ENDIF ! n0.gt.0 | ||
415 | 9999 continue | ||
416 | |||
417 | |||
418 | c bouclage en latitude | ||
419 | cprint*,'cvant bouclage en latitude' | ||
420 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l=1,llm |
421 | 3840 | DO ij=iip1+iip1,ip1jm,iip1 | |
422 |
2/2✓ Branch 0 taken 4492800 times.
✓ Branch 1 taken 149760 times.
|
4642560 | u_mq(ij,l)=u_mq(ij-iim,l) |
423 | ENDDO | ||
424 | ENDDO | ||
425 | |||
426 | ! CRisi: appel récursif de l'advection sur les fils. | ||
427 | ! Il faut faire ça avant d'avoir mis à jour q et masse | ||
428 | !write(*,*) 'vlsplt 326: iq,nqfils(iq)=',iq,nqfils(iq) | ||
429 | |||
430 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3840 times.
|
3840 | if (nqdesc(iq).gt.0) then |
431 | ✗ | do ifils=1,nqdesc(iq) | |
432 | ✗ | iq2=iqfils(ifils,iq) | |
433 | ✗ | DO l=1,llm | |
434 | ✗ | DO ij=iip2,ip1jm | |
435 | ! On a besoin de q et masse seulement entre iip2 et ip1jm | ||
436 | ✗ | masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) | |
437 | ✗ | Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) | |
438 | enddo | ||
439 | enddo | ||
440 | enddo !do ifils=1,nqdesc(iq) | ||
441 | ✗ | do ifils=1,nqfils(iq) | |
442 | ✗ | iq2=iqfils(ifils,iq) | |
443 | ✗ | call vlx(Ratio,pente_max,masseq,u_mq,iq2) | |
444 | enddo !do ifils=1,nqfils(iq) | ||
445 | endif !if (nqfils(iq).gt.0) then | ||
446 | ! end CRisi | ||
447 | |||
448 | |||
449 | c calcul des tENDances | ||
450 | |||
451 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l=1,llm |
452 |
2/2✓ Branch 0 taken 153054720 times.
✓ Branch 1 taken 149760 times.
|
153204480 | DO ij=iip2+1,ip1jm |
453 | 153054720 | new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l) | |
454 | q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ | ||
455 | & u_mq(ij-1,l)-u_mq(ij,l)) | ||
456 | 153054720 | & /new_m | |
457 | 153204480 | masse(ij,l,iq)=new_m | |
458 | ENDDO | ||
459 | c ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous) | ||
460 | 3840 | DO ij=iip1+iip1,ip1jm,iip1 | |
461 | 4642560 | q(ij-iim,l,iq)=q(ij,l,iq) | |
462 |
2/2✓ Branch 0 taken 4492800 times.
✓ Branch 1 taken 149760 times.
|
4642560 | masse(ij-iim,l,iq)=masse(ij,l,iq) |
463 | ENDDO | ||
464 | ENDDO | ||
465 | |||
466 | ! retablir les fils en rapport de melange par rapport a l'air: | ||
467 | ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio | ||
468 | ! puis on boucle en longitude | ||
469 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3840 times.
|
3840 | if (nqdesc(iq).gt.0) then |
470 | ✗ | do ifils=1,nqdesc(iq) | |
471 | ✗ | iq2=iqfils(ifils,iq) | |
472 | ✗ | DO l=1,llm | |
473 | ✗ | DO ij=iip2+1,ip1jm | |
474 | ✗ | q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) | |
475 | enddo | ||
476 | ✗ | DO ij=iip1+iip1,ip1jm,iip1 | |
477 | ✗ | q(ij-iim,l,iq2)=q(ij,l,iq2) | |
478 | enddo ! DO ij=ijb+iip1-1,ije,iip1 | ||
479 | enddo !DO l=1,llm | ||
480 | enddo !do ifils=1,nqdesc(iq) | ||
481 | endif !if (nqfils(iq).gt.0) then | ||
482 | |||
483 | c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) | ||
484 | c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1) | ||
485 | |||
486 | |||
487 | 3840 | RETURN | |
488 | END | ||
489 | 3840 | RECURSIVE SUBROUTINE vly(q,pente_max,masse,masse_adv_v,iq) | |
490 | USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi | ||
491 | c | ||
492 | c Auteurs: P.Le Van, F.Hourdin, F.Forget | ||
493 | c | ||
494 | c ******************************************************************** | ||
495 | c Shema d'advection " pseudo amont " . | ||
496 | c ******************************************************************** | ||
497 | c q,masse_adv_v,w sont des arguments d'entree pour le s-pg .... | ||
498 | c dq sont des arguments de sortie pour le s-pg .... | ||
499 | c | ||
500 | c | ||
501 | c -------------------------------------------------------------------- | ||
502 | USE comconst_mod, ONLY: pi | ||
503 | IMPLICIT NONE | ||
504 | c | ||
505 | include "dimensions.h" | ||
506 | include "paramet.h" | ||
507 | include "comgeom.h" | ||
508 | c | ||
509 | c | ||
510 | c Arguments: | ||
511 | c ---------- | ||
512 | REAL masse(ip1jmp1,llm,nqtot),pente_max | ||
513 | REAL masse_adv_v( ip1jm,llm) | ||
514 | REAL q(ip1jmp1,llm,nqtot), dq( ip1jmp1,llm) | ||
515 | INTEGER iq ! CRisi | ||
516 | c | ||
517 | c Local | ||
518 | c --------- | ||
519 | c | ||
520 | INTEGER i,ij,l | ||
521 | c | ||
522 | REAL airej2,airejjm,airescb(iim),airesch(iim) | ||
523 | REAL dyq(ip1jmp1,llm),dyqv(ip1jm),zdvm(ip1jmp1,llm) | ||
524 | REAL adyqv(ip1jm),dyqmax(ip1jmp1) | ||
525 | REAL qbyv(ip1jm,llm) | ||
526 | |||
527 | REAL qpns,qpsn,appn,apps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs | ||
528 | c REAL newq,oldmasse | ||
529 | Logical extremum,first,testcpu | ||
530 | REAL temps0,temps1,temps2,temps3,temps4,temps5,second | ||
531 | SAVE temps0,temps1,temps2,temps3,temps4,temps5 | ||
532 | SAVE first,testcpu | ||
533 | |||
534 | REAL convpn,convps,convmpn,convmps | ||
535 | real massepn,masseps,qpn,qps | ||
536 | REAL sinlon(iip1),sinlondlon(iip1) | ||
537 | REAL coslon(iip1),coslondlon(iip1) | ||
538 | SAVE sinlon,coslon,sinlondlon,coslondlon | ||
539 | SAVE airej2,airejjm | ||
540 | |||
541 | 7680 | REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi | |
542 | INTEGER ifils,iq2 ! CRisi | ||
543 | |||
544 | c | ||
545 | c | ||
546 | REAL SSUM | ||
547 | |||
548 | DATA first,testcpu/.true.,.false./ | ||
549 | DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./ | ||
550 | |||
551 | !write(*,*) 'vly 578: entree, iq=',iq | ||
552 | |||
553 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3839 times.
|
3840 | IF(first) THEN |
554 | 1 | PRINT*,'Shema Amont nouveau appele dans Vanleer ' | |
555 | 1 | first=.false. | |
556 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | do i=2,iip1 |
557 | 32 | coslon(i)=cos(rlonv(i)) | |
558 | 32 | sinlon(i)=sin(rlonv(i)) | |
559 | 32 | coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi | |
560 | 33 | sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi | |
561 | ENDDO | ||
562 | 1 | coslon(1)=coslon(iip1) | |
563 | 1 | coslondlon(1)=coslondlon(iip1) | |
564 | 1 | sinlon(1)=sinlon(iip1) | |
565 | 1 | sinlondlon(1)=sinlondlon(iip1) | |
566 | 1 | airej2 = SSUM( iim, aire(iip2), 1 ) | |
567 | 1 | airejjm= SSUM( iim, aire(ip1jm -iim), 1 ) | |
568 | ENDIF | ||
569 | |||
570 | c | ||
571 | cPRINT*,'CALCUL EN LATITUDE' | ||
572 | |||
573 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l = 1, llm |
574 | c | ||
575 | c -------------------------------- | ||
576 | c CALCUL EN LATITUDE | ||
577 | c -------------------------------- | ||
578 | |||
579 | c On commence par calculer la valeur du traceur moyenne sur le premier cercle | ||
580 | c de latitude autour du pole (qpns pour le pole nord et qpsn pour | ||
581 | c le pole nord) qui sera utilisee pour evaluer les pentes au pole. | ||
582 | |||
583 |
2/2✓ Branch 0 taken 4792320 times.
✓ Branch 1 taken 149760 times.
|
4942080 | DO i = 1, iim |
584 | 4792320 | airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) | |
585 | 4942080 | airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) | |
586 | ENDDO | ||
587 | 149760 | qpns = SSUM( iim, airescb ,1 ) / airej2 | |
588 | 149760 | qpsn = SSUM( iim, airesch ,1 ) / airejjm | |
589 | |||
590 | c calcul des pentes aux points v | ||
591 | |||
592 |
2/2✓ Branch 0 taken 158146560 times.
✓ Branch 1 taken 149760 times.
|
158296320 | DO ij=1,ip1jm |
593 | 158146560 | dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq) | |
594 | 158296320 | adyqv(ij)=abs(dyqv(ij)) | |
595 | ENDDO | ||
596 | |||
597 | c calcul des pentes aux points scalaires | ||
598 | |||
599 |
2/2✓ Branch 0 taken 153204480 times.
✓ Branch 1 taken 149760 times.
|
153354240 | DO ij=iip2,ip1jm |
600 | 153204480 | dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij)) | |
601 | 153204480 | dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij)) | |
602 | 153354240 | dyqmax(ij)=pente_max*dyqmax(ij) | |
603 | ENDDO | ||
604 | |||
605 | c calcul des pentes aux poles | ||
606 | |||
607 |
2/2✓ Branch 0 taken 4942080 times.
✓ Branch 1 taken 149760 times.
|
5091840 | DO ij=1,iip1 |
608 | 4942080 | dyq(ij,l)=qpns-q(ij+iip1,l,iq) | |
609 | 5091840 | dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn | |
610 | ENDDO | ||
611 | |||
612 | c filtrage de la derivee | ||
613 | dyn1=0. | ||
614 | dys1=0. | ||
615 | dyn2=0. | ||
616 | dys2=0. | ||
617 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 4792320 times.
|
4942080 | DO ij=1,iim |
618 | 4792320 | dyn1=dyn1+sinlondlon(ij)*dyq(ij,l) | |
619 | 4792320 | dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l) | |
620 | 4792320 | dyn2=dyn2+coslondlon(ij)*dyq(ij,l) | |
621 | 4942080 | dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l) | |
622 | ENDDO | ||
623 |
2/2✓ Branch 0 taken 4942080 times.
✓ Branch 1 taken 149760 times.
|
5091840 | DO ij=1,iip1 |
624 | 4942080 | dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij) | |
625 | 5091840 | dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij) | |
626 | ENDDO | ||
627 | |||
628 | c calcul des pentes limites aux poles | ||
629 | |||
630 | goto 8888 | ||
631 | fn=1. | ||
632 | fs=1. | ||
633 | DO ij=1,iim | ||
634 | IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN | ||
635 | fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn) | ||
636 | ENDIF | ||
637 | IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN | ||
638 | fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs) | ||
639 | ENDIF | ||
640 | ENDDO | ||
641 | DO ij=1,iip1 | ||
642 | dyq(ij,l)=fn*dyq(ij,l) | ||
643 | dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l) | ||
644 | ENDDO | ||
645 | 8888 continue | ||
646 |
2/2✓ Branch 0 taken 4942080 times.
✓ Branch 1 taken 149760 times.
|
5091840 | DO ij=1,iip1 |
647 | 4942080 | dyq(ij,l)=0. | |
648 | 5091840 | dyq(ip1jm+ij,l)=0. | |
649 | ENDDO | ||
650 | |||
651 | CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||
652 | C En memoire de dIFferents tests sur la | ||
653 | C limitation des pentes aux poles. | ||
654 | CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||
655 | C PRINT*,dyq(1) | ||
656 | C PRINT*,dyqv(iip1+1) | ||
657 | C appn=abs(dyq(1)/dyqv(iip1+1)) | ||
658 | C PRINT*,dyq(ip1jm+1) | ||
659 | C PRINT*,dyqv(ip1jm-iip1+1) | ||
660 | C apps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1)) | ||
661 | C DO ij=2,iim | ||
662 | C appn=amax1(abs(dyq(ij)/dyqv(ij)),appn) | ||
663 | C apps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),apps) | ||
664 | C ENDDO | ||
665 | C appn=min(pente_max/appn,1.) | ||
666 | C apps=min(pente_max/apps,1.) | ||
667 | C | ||
668 | C | ||
669 | C cas ou on a un extremum au pole | ||
670 | C | ||
671 | C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.) | ||
672 | C & appn=0. | ||
673 | C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)* | ||
674 | C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.) | ||
675 | C & apps=0. | ||
676 | C | ||
677 | C limitation des pentes aux poles | ||
678 | C DO ij=1,iip1 | ||
679 | C dyq(ij)=appn*dyq(ij) | ||
680 | C dyq(ip1jm+ij)=apps*dyq(ip1jm+ij) | ||
681 | C ENDDO | ||
682 | C | ||
683 | C test | ||
684 | C DO ij=1,iip1 | ||
685 | C dyq(iip1+ij)=0. | ||
686 | C dyq(ip1jm+ij-iip1)=0. | ||
687 | C ENDDO | ||
688 | C DO ij=1,ip1jmp1 | ||
689 | C dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1)) | ||
690 | C ENDDO | ||
691 | C | ||
692 | C changement 10 07 96 | ||
693 | C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.) | ||
694 | C & THEN | ||
695 | C DO ij=1,iip1 | ||
696 | C dyqmax(ij)=0. | ||
697 | C ENDDO | ||
698 | C ELSE | ||
699 | C DO ij=1,iip1 | ||
700 | C dyqmax(ij)=pente_max*abs(dyqv(ij)) | ||
701 | C ENDDO | ||
702 | C ENDIF | ||
703 | C | ||
704 | C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)* | ||
705 | C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.) | ||
706 | C &THEN | ||
707 | C DO ij=ip1jm+1,ip1jmp1 | ||
708 | C dyqmax(ij)=0. | ||
709 | C ENDDO | ||
710 | C ELSE | ||
711 | C DO ij=ip1jm+1,ip1jmp1 | ||
712 | C dyqmax(ij)=pente_max*abs(dyqv(ij-iip1)) | ||
713 | C ENDDO | ||
714 | C ENDIF | ||
715 | C fin changement 10 07 96 | ||
716 | CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||
717 | |||
718 | c calcul des pentes limitees | ||
719 | |||
720 |
2/2✓ Branch 0 taken 153204480 times.
✓ Branch 1 taken 149760 times.
|
153358080 | DO ij=iip2,ip1jm |
721 |
2/2✓ Branch 0 taken 66366910 times.
✓ Branch 1 taken 86837570 times.
|
153354240 | IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN |
722 | 66366910 | dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l)) | |
723 | ELSE | ||
724 | 86837570 | dyq(ij,l)=0. | |
725 | ENDIF | ||
726 | ENDDO | ||
727 | |||
728 | ENDDO | ||
729 | |||
730 | !write(*,*) 'vly 756' | ||
731 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l=1,llm |
732 |
2/2✓ Branch 0 taken 158146560 times.
✓ Branch 1 taken 149760 times.
|
158300160 | DO ij=1,ip1jm |
733 |
2/2✓ Branch 0 taken 80232456 times.
✓ Branch 1 taken 77914104 times.
|
158146560 | IF(masse_adv_v(ij,l).gt.0) THEN |
734 | qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)* | ||
735 | , 0.5*(1.-masse_adv_v(ij,l) | ||
736 | 80232456 | , /masse(ij+iip1,l,iq)) | |
737 | ELSE | ||
738 | qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)* | ||
739 | , 0.5*(1.+masse_adv_v(ij,l) | ||
740 | 77914104 | , /masse(ij,l,iq)) | |
741 | ENDIF | ||
742 | 158296320 | qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l) | |
743 | ENDDO | ||
744 | ENDDO | ||
745 | |||
746 | ! CRisi: appel récursif de l'advection sur les fils. | ||
747 | ! Il faut faire ça avant d'avoir mis à jour q et masse | ||
748 | !write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq) | ||
749 | |||
750 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3840 times.
|
3840 | if (nqfils(iq).gt.0) then |
751 | ✗ | do ifils=1,nqdesc(iq) | |
752 | ✗ | iq2=iqfils(ifils,iq) | |
753 | ✗ | DO l=1,llm | |
754 | ✗ | DO ij=1,ip1jmp1 | |
755 | ! attention, chaque fils doit avoir son masseq, sinon, le 1er | ||
756 | ! fils ecrase le masseq de ses freres. | ||
757 | ✗ | masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) | |
758 | ✗ | Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) | |
759 | enddo | ||
760 | enddo | ||
761 | enddo !do ifils=1,nqdesc(iq) | ||
762 | |||
763 | ✗ | do ifils=1,nqfils(iq) | |
764 | ✗ | iq2=iqfils(ifils,iq) | |
765 | ✗ | call vly(Ratio,pente_max,masseq,qbyv,iq2) | |
766 | enddo !do ifils=1,nqfils(iq) | ||
767 | endif !if (nqfils(iq).gt.0) then | ||
768 | |||
769 |
2/2✓ Branch 0 taken 149760 times.
✓ Branch 1 taken 3840 times.
|
153600 | DO l=1,llm |
770 |
2/2✓ Branch 0 taken 153204480 times.
✓ Branch 1 taken 149760 times.
|
153354240 | DO ij=iip2,ip1jm |
771 | newmasse=masse(ij,l,iq) | ||
772 | 153204480 | & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l) | |
773 | q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l) | ||
774 | 153204480 | & -qbyv(ij-iip1,l))/newmasse | |
775 | 153354240 | masse(ij,l,iq)=newmasse | |
776 | ENDDO | ||
777 | c.-. ancienne version | ||
778 | c convpn=SSUM(iim,qbyv(1,l),1)/apoln | ||
779 | c convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln | ||
780 | |||
781 | 149760 | convpn=SSUM(iim,qbyv(1,l),1) | |
782 | 149760 | convmpn=ssum(iim,masse_adv_v(1,l),1) | |
783 | 149760 | massepn=ssum(iim,masse(1,l,iq),1) | |
784 | qpn=0. | ||
785 |
2/2✓ Branch 0 taken 4792320 times.
✓ Branch 1 taken 149760 times.
|
4942080 | do ij=1,iim |
786 | 4942080 | qpn=qpn+masse(ij,l,iq)*q(ij,l,iq) | |
787 | enddo | ||
788 | 149760 | qpn=(qpn+convpn)/(massepn+convmpn) | |
789 |
2/2✓ Branch 0 taken 4942080 times.
✓ Branch 1 taken 149760 times.
|
5091840 | do ij=1,iip1 |
790 | 5091840 | q(ij,l,iq)=qpn | |
791 | enddo | ||
792 | |||
793 | c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)/apols | ||
794 | c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)/apols | ||
795 | |||
796 | 149760 | convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) | |
797 | 149760 | convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1) | |
798 | 149760 | masseps=ssum(iim, masse(ip1jm+1,l,iq),1) | |
799 | qps=0. | ||
800 |
2/2✓ Branch 0 taken 4792320 times.
✓ Branch 1 taken 149760 times.
|
4942080 | do ij = ip1jm+1,ip1jmp1-1 |
801 | 4942080 | qps=qps+masse(ij,l,iq)*q(ij,l,iq) | |
802 | enddo | ||
803 | 149760 | qps=(qps+convps)/(masseps+convmps) | |
804 |
2/2✓ Branch 0 taken 4942080 times.
✓ Branch 1 taken 149760 times.
|
5095680 | do ij=ip1jm+1,ip1jmp1 |
805 | 5091840 | q(ij,l,iq)=qps | |
806 | enddo | ||
807 | |||
808 | c.-. fin ancienne version | ||
809 | |||
810 | c._. nouvelle version | ||
811 | c convpn=SSUM(iim,qbyv(1,l),1) | ||
812 | c convmpn=ssum(iim,masse_adv_v(1,l),1) | ||
813 | c oldmasse=ssum(iim,masse(1,l),1) | ||
814 | c newmasse=oldmasse+convmpn | ||
815 | c newq=(q(1,l)*oldmasse+convpn)/newmasse | ||
816 | c newmasse=newmasse/apoln | ||
817 | c DO ij = 1,iip1 | ||
818 | c q(ij,l)=newq | ||
819 | c masse(ij,l,iq)=newmasse*aire(ij) | ||
820 | c ENDDO | ||
821 | c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) | ||
822 | c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1) | ||
823 | c oldmasse=ssum(iim,masse(ip1jm-iim,l),1) | ||
824 | c newmasse=oldmasse+convmps | ||
825 | c newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse | ||
826 | c newmasse=newmasse/apols | ||
827 | c DO ij = ip1jm+1,ip1jmp1 | ||
828 | c q(ij,l)=newq | ||
829 | c masse(ij,l,iq)=newmasse*aire(ij) | ||
830 | c ENDDO | ||
831 | c._. fin nouvelle version | ||
832 | ENDDO | ||
833 | |||
834 | ! retablir les fils en rapport de melange par rapport a l'air: | ||
835 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3840 times.
|
3840 | if (nqfils(iq).gt.0) then |
836 | ✗ | do ifils=1,nqdesc(iq) | |
837 | ✗ | iq2=iqfils(ifils,iq) | |
838 | ✗ | DO l=1,llm | |
839 | ✗ | DO ij=1,ip1jmp1 | |
840 | ✗ | q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) | |
841 | enddo | ||
842 | enddo | ||
843 | enddo !do ifils=1,nqdesc(iq) | ||
844 | endif !if (nqfils(iq).gt.0) then | ||
845 | |||
846 | !write(*,*) 'vly 853: sortie' | ||
847 | |||
848 | 3840 | RETURN | |
849 | END | ||
850 | 2400 | RECURSIVE SUBROUTINE vlz(q,pente_max,masse,w,iq) | |
851 | USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi | ||
852 | c | ||
853 | c Auteurs: P.Le Van, F.Hourdin, F.Forget | ||
854 | c | ||
855 | c ******************************************************************** | ||
856 | c Shema d'advection " pseudo amont " . | ||
857 | c ******************************************************************** | ||
858 | c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg .... | ||
859 | c dq sont des arguments de sortie pour le s-pg .... | ||
860 | c | ||
861 | c | ||
862 | c -------------------------------------------------------------------- | ||
863 | IMPLICIT NONE | ||
864 | c | ||
865 | include "dimensions.h" | ||
866 | include "paramet.h" | ||
867 | c | ||
868 | c | ||
869 | c Arguments: | ||
870 | c ---------- | ||
871 | REAL masse(ip1jmp1,llm,nqtot),pente_max | ||
872 | REAL q(ip1jmp1,llm,nqtot) | ||
873 | REAL w(ip1jmp1,llm+1) | ||
874 | INTEGER iq | ||
875 | c | ||
876 | c Local | ||
877 | c --------- | ||
878 | c | ||
879 | INTEGER i,ij,l,j,ii | ||
880 | c | ||
881 | REAL wq(ip1jmp1,llm+1),newmasse | ||
882 | |||
883 | REAL dzq(ip1jmp1,llm),dzqw(ip1jmp1,llm),adzqw(ip1jmp1,llm),dzqmax | ||
884 | REAL sigw | ||
885 | |||
886 | 2400 | REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi | |
887 | INTEGER ifils,iq2 ! CRisi | ||
888 | |||
889 | LOGICAL testcpu | ||
890 | SAVE testcpu | ||
891 | |||
892 | REAL temps0,temps1,temps2,temps3,temps4,temps5,second | ||
893 | SAVE temps0,temps1,temps2,temps3,temps4,temps5 | ||
894 | REAL SSUM | ||
895 | |||
896 | DATA testcpu/.false./ | ||
897 | DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./ | ||
898 | |||
899 | c On oriente tout dans le sens de la pression c'est a dire dans le | ||
900 | c sens de W | ||
901 | |||
902 | !write(*,*) 'vlz 923: entree' | ||
903 | |||
904 |
2/2✓ Branch 0 taken 91200 times.
✓ Branch 1 taken 2400 times.
|
93600 | DO l=2,llm |
905 |
2/2✓ Branch 0 taken 99316800 times.
✓ Branch 1 taken 91200 times.
|
99410400 | DO ij=1,ip1jmp1 |
906 | 99316800 | dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq) | |
907 | 99408000 | adzqw(ij,l)=abs(dzqw(ij,l)) | |
908 | ENDDO | ||
909 | ENDDO | ||
910 | |||
911 |
2/2✓ Branch 0 taken 88800 times.
✓ Branch 1 taken 2400 times.
|
91200 | DO l=2,llm-1 |
912 |
2/2✓ Branch 0 taken 96703200 times.
✓ Branch 1 taken 88800 times.
|
96794400 | DO ij=1,ip1jmp1 |
913 |
2/2✓ Branch 0 taken 55269341 times.
✓ Branch 1 taken 41433859 times.
|
96703200 | IF(dzqw(ij,l)*dzqw(ij,l+1).gt.0.) THEN |
914 | 55269341 | dzq(ij,l)=0.5*(dzqw(ij,l)+dzqw(ij,l+1)) | |
915 | ELSE | ||
916 | 41433859 | dzq(ij,l)=0. | |
917 | ENDIF | ||
918 | 96703200 | dzqmax=pente_max*min(adzqw(ij,l),adzqw(ij,l+1)) | |
919 | 96792000 | dzq(ij,l)=sign(min(abs(dzq(ij,l)),dzqmax),dzq(ij,l)) | |
920 | ENDDO | ||
921 | ENDDO | ||
922 | |||
923 | !write(*,*) 'vlz 954' | ||
924 |
2/2✓ Branch 0 taken 2613600 times.
✓ Branch 1 taken 2400 times.
|
2616000 | DO ij=1,ip1jmp1 |
925 | 2613600 | dzq(ij,1)=0. | |
926 | 2616000 | dzq(ij,llm)=0. | |
927 | ENDDO | ||
928 | |||
929 | c --------------------------------------------------------------- | ||
930 | c .... calcul des termes d'advection verticale ....... | ||
931 | c --------------------------------------------------------------- | ||
932 | |||
933 | c calcul de - d( q * w )/ d(sigma) qu'on ajoute a dq pour calculer dq | ||
934 | |||
935 | !write(*,*) 'vlz 969' | ||
936 |
2/2✓ Branch 0 taken 91200 times.
✓ Branch 1 taken 2400 times.
|
93600 | DO l = 1,llm-1 |
937 |
2/2✓ Branch 0 taken 99316800 times.
✓ Branch 1 taken 91200 times.
|
99410400 | do ij = 1,ip1jmp1 |
938 |
2/2✓ Branch 0 taken 49793035 times.
✓ Branch 1 taken 49523765 times.
|
99408000 | IF(w(ij,l+1).gt.0.) THEN |
939 | 49793035 | sigw=w(ij,l+1)/masse(ij,l+1,iq) | |
940 | wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1,iq) | ||
941 | 49793035 | & +0.5*(1.-sigw)*dzq(ij,l+1)) | |
942 | ELSE | ||
943 | 49523765 | sigw=w(ij,l+1)/masse(ij,l,iq) | |
944 | 49523765 | wq(ij,l+1)=w(ij,l+1)*(q(ij,l,iq)-0.5*(1.+sigw)*dzq(ij,l)) | |
945 | ENDIF | ||
946 | ENDDO | ||
947 | ENDDO | ||
948 | |||
949 |
2/2✓ Branch 0 taken 2613600 times.
✓ Branch 1 taken 2400 times.
|
2616000 | DO ij=1,ip1jmp1 |
950 | 2613600 | wq(ij,llm+1)=0. | |
951 | 2616000 | wq(ij,1)=0. | |
952 | ENDDO | ||
953 | |||
954 | ! CRisi: appel récursif de l'advection sur les fils. | ||
955 | ! Il faut faire ça avant d'avoir mis à jour q et masse | ||
956 | !write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq) | ||
957 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2400 times.
|
2400 | if (nqfils(iq).gt.0) then |
958 | ✗ | do ifils=1,nqdesc(iq) | |
959 | ✗ | iq2=iqfils(ifils,iq) | |
960 | ✗ | DO l=1,llm | |
961 | ✗ | DO ij=1,ip1jmp1 | |
962 | ✗ | masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) | |
963 | ✗ | Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) | |
964 | enddo | ||
965 | enddo | ||
966 | enddo !do ifils=1,nqdesc(iq) | ||
967 | |||
968 | ✗ | do ifils=1,nqfils(iq) | |
969 | ✗ | iq2=iqfils(ifils,iq) | |
970 | ✗ | call vlz(Ratio,pente_max,masseq,wq,iq2) | |
971 | enddo !do ifils=1,nqfils(iq) | ||
972 | endif !if (nqfils(iq).gt.0) then | ||
973 | ! end CRisi | ||
974 | |||
975 |
2/2✓ Branch 0 taken 93600 times.
✓ Branch 1 taken 2400 times.
|
96000 | DO l=1,llm |
976 |
2/2✓ Branch 0 taken 101930400 times.
✓ Branch 1 taken 93600 times.
|
102026400 | DO ij=1,ip1jmp1 |
977 | 101930400 | newmasse=masse(ij,l,iq)+w(ij,l+1)-w(ij,l) | |
978 | q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+wq(ij,l+1)-wq(ij,l)) | ||
979 | 101930400 | & /newmasse | |
980 | 102024000 | masse(ij,l,iq)=newmasse | |
981 | ENDDO | ||
982 | ENDDO | ||
983 | |||
984 | ! retablir les fils en rapport de melange par rapport a l'air: | ||
985 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2400 times.
|
2400 | if (nqfils(iq).gt.0) then |
986 | ✗ | do ifils=1,nqdesc(iq) | |
987 | ✗ | iq2=iqfils(ifils,iq) | |
988 | ✗ | DO l=1,llm | |
989 | ✗ | DO ij=1,ip1jmp1 | |
990 | ✗ | q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) | |
991 | enddo | ||
992 | enddo | ||
993 | enddo !do ifils=1,nqdesc(iq) | ||
994 | endif !if (nqfils(iq).gt.0) then | ||
995 | !write(*,*) 'vlsplt 1032' | ||
996 | |||
997 | 2400 | RETURN | |
998 | END | ||
999 | c SUBROUTINE minmaxq(zq,qmin,qmax,comment) | ||
1000 | c | ||
1001 | c#include "dimensions.h" | ||
1002 | c#include "paramet.h" | ||
1003 | |||
1004 | c CHARACTER*(*) comment | ||
1005 | c real qmin,qmax | ||
1006 | c real zq(ip1jmp1,llm) | ||
1007 | |||
1008 | c INTEGER jadrs(ip1jmp1), jbad, k, i | ||
1009 | |||
1010 | |||
1011 | c DO k = 1, llm | ||
1012 | c jbad = 0 | ||
1013 | c DO i = 1, ip1jmp1 | ||
1014 | c IF (zq(i,k).GT.qmax .OR. zq(i,k).LT.qmin) THEN | ||
1015 | c jbad = jbad + 1 | ||
1016 | c jadrs(jbad) = i | ||
1017 | c ENDIF | ||
1018 | c ENDDO | ||
1019 | c IF (jbad.GT.0) THEN | ||
1020 | c PRINT*, comment | ||
1021 | c DO i = 1, jbad | ||
1022 | cc PRINT*, "i,k,zq=", jadrs(i),k,zq(jadrs(i),k) | ||
1023 | c ENDDO | ||
1024 | c ENDIF | ||
1025 | c ENDDO | ||
1026 | |||
1027 | c return | ||
1028 | c end | ||
1029 | ✗ | subroutine minmaxq(zq,qmin,qmax,comment) | |
1030 | |||
1031 | !----------------------------------------------------------------------- | ||
1032 | ! INCLUDE 'dimensions.h' | ||
1033 | ! | ||
1034 | ! dimensions.h contient les dimensions du modele | ||
1035 | ! ndm est tel que iim=2**ndm | ||
1036 | !----------------------------------------------------------------------- | ||
1037 | |||
1038 | INTEGER iim,jjm,llm,ndm | ||
1039 | |||
1040 | PARAMETER (iim= 32,jjm=32,llm=39,ndm=1) | ||
1041 | |||
1042 | !----------------------------------------------------------------------- | ||
1043 | ! | ||
1044 | ! $Header$ | ||
1045 | ! | ||
1046 | ! | ||
1047 | ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre | ||
1048 | ! veillez n'utiliser que des ! pour les commentaires | ||
1049 | ! et bien positionner les & des lignes de continuation | ||
1050 | ! (les placer en colonne 6 et en colonne 73) | ||
1051 | ! | ||
1052 | ! | ||
1053 | !----------------------------------------------------------------------- | ||
1054 | ! INCLUDE 'paramet.h' | ||
1055 | |||
1056 | INTEGER iip1,iip2,iip3,jjp1,llmp1,llmp2,llmm1 | ||
1057 | INTEGER kftd,ip1jm,ip1jmp1,ip1jmi1,ijp1llm | ||
1058 | INTEGER ijmllm,mvar | ||
1059 | INTEGER jcfil,jcfllm | ||
1060 | |||
1061 | PARAMETER( iip1= iim+1,iip2=iim+2,iip3=iim+3 & | ||
1062 | & ,jjp1=jjm+1-1/jjm) | ||
1063 | PARAMETER( llmp1 = llm+1, llmp2 = llm+2, llmm1 = llm-1 ) | ||
1064 | PARAMETER( kftd = iim/2 -ndm ) | ||
1065 | PARAMETER( ip1jm = iip1*jjm, ip1jmp1= iip1*jjp1 ) | ||
1066 | PARAMETER( ip1jmi1= ip1jm - iip1 ) | ||
1067 | PARAMETER( ijp1llm= ip1jmp1 * llm, ijmllm= ip1jm * llm ) | ||
1068 | PARAMETER( mvar= ip1jmp1*( 2*llm+1) + ijmllm ) | ||
1069 | PARAMETER( jcfil=jjm/2+5, jcfllm=jcfil*llm ) | ||
1070 | |||
1071 | !----------------------------------------------------------------------- | ||
1072 | |||
1073 | character*20 comment | ||
1074 | real qmin,qmax | ||
1075 | real zq(ip1jmp1,llm) | ||
1076 | real zzq(iip1,jjp1,llm) | ||
1077 | |||
1078 | integer imin,jmin,lmin,ijlmin | ||
1079 | integer imax,jmax,lmax,ijlmax | ||
1080 | |||
1081 | integer ismin,ismax | ||
1082 | |||
1083 | ✗ | return | |
1084 | 9999 format(a20,' q(',i3,',',i2,',',i2,')=',e12.5,e12.5) | ||
1085 | end | ||
1086 | |||
1087 | |||
1088 | |||
1089 |