1 | SUBROUTINE ps_amont(nq,iq,q,w,pbaru,pbarv,dq) |
---|
2 | c |
---|
3 | c Auteurs: P.Le Van, F.Hourdin, F.Forget |
---|
4 | c |
---|
5 | c ******************************************************************** |
---|
6 | c Shema d'advection " pseudo amont " . |
---|
7 | c ******************************************************************** |
---|
8 | c nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg .... |
---|
9 | c dq sont des arguments de sortie pour le s-pg .... |
---|
10 | c |
---|
11 | c |
---|
12 | c -------------------------------------------------------------------- |
---|
13 | IMPLICIT NONE |
---|
14 | c |
---|
15 | #include "dimensions.h" |
---|
16 | #include "paramet.h" |
---|
17 | #include "comgeom.h" |
---|
18 | c |
---|
19 | c |
---|
20 | c Arguments: |
---|
21 | c ---------- |
---|
22 | INTEGER nq,iq |
---|
23 | REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm) |
---|
24 | REAL q(ip1jmp1,llm,nq), dq( ip1jmp1,llm,nq ) |
---|
25 | REAL w(ip1jmp1,llm) |
---|
26 | c |
---|
27 | c Local |
---|
28 | c --------- |
---|
29 | c |
---|
30 | INTEGER i,ij,l |
---|
31 | c |
---|
32 | REAL airej2,airejjm,airescb(iim),airesch(iim) |
---|
33 | REAL pente(ip1jmp1),xg(ip1jmp1),xd(ip1jmp1),xs(ip1jmp1) , |
---|
34 | * xn(ip1jmp1),xb(ip1jmp1),xh(ip1jmp1) |
---|
35 | REAL qg(ip1jmp1),qd(ip1jmp1),qs(ip1jmp1) , |
---|
36 | * qn(ip1jmp1),qb(ip1jmp1,llm),qh(ip1jmp1,llm) |
---|
37 | REAL qbyv(ip1jm,llm), qbxu(ip1jmp1,llm), ww,dqh(ip1jmp1,llm) |
---|
38 | REAL qpns,qpsn |
---|
39 | logical first,extrpn,extrps |
---|
40 | save first |
---|
41 | c |
---|
42 | c |
---|
43 | REAL SSUM,CVMGP,CVMGT |
---|
44 | EXTERNAL SSUM, convflu |
---|
45 | |
---|
46 | data first/.true./ |
---|
47 | |
---|
48 | if(first) then |
---|
49 | print*,'SCHEMA AMONT NOUVEAU' |
---|
50 | first=.false. |
---|
51 | endif |
---|
52 | |
---|
53 | |
---|
54 | c |
---|
55 | c |
---|
56 | IF( forward.OR.leapf ) THEN |
---|
57 | c |
---|
58 | c |
---|
59 | DO 100 l = 1, llm |
---|
60 | c |
---|
61 | c ... Boucle sur les llm niveaux verticaux ... |
---|
62 | c |
---|
63 | c |
---|
64 | c -------------------------------------------------------------- |
---|
65 | c -------------------------------------------------------------- |
---|
66 | c ............. Traitement en longitude ............... |
---|
67 | c -------------------------------------------------------------- |
---|
68 | c -------------------------------------------------------------- |
---|
69 | c |
---|
70 | c |
---|
71 | c | | | | |
---|
72 | c | q(i-1) | q(i) | q(i+1) | |
---|
73 | c | |qg(i) qd(i)|qg(i+1) | |
---|
74 | c |
---|
75 | c |
---|
76 | c En longitude , |
---|
77 | c Pour chaque maille ( i ) avec q(i,j,l,iq), on cherche a determiner |
---|
78 | c avec une methode de ' pente' les valeurs qg(i) et qd(i) qui se trouvent |
---|
79 | c au bord gauche et droite de cette maille . |
---|
80 | c |
---|
81 | c Si ( q(i+1)-q(i) ) * ( q(i)-q(i-1)) < 0. ,on a qg(i)=qd(i)=q(i) |
---|
82 | c Sinon |
---|
83 | c qg(i)= q(i) - 1/4 * ( q(i+1) - q(i-1)) |
---|
84 | c qd(i)= q(i) + 1/4 * ( q(i+1) - q(i-1) ) |
---|
85 | c |
---|
86 | c On utilisera la meme methode pour determiner les valeurs qs(i) et qn(i) |
---|
87 | c en latitude , ainsi que les valeurs qb(i) et qh(i) en altitude . |
---|
88 | c |
---|
89 | c |
---|
90 | c |
---|
91 | DO ij = 1,iip1 |
---|
92 | qg(ij) = 0. |
---|
93 | qd(ij) = 0. |
---|
94 | qg(ij+ ip1jm) = 0. |
---|
95 | qd(ij+ ip1jm) = 0. |
---|
96 | ENDDO |
---|
97 | c |
---|
98 | c .... calculs pour les lignes j= 2 a j = jjm .... |
---|
99 | c |
---|
100 | DO ij = iip2, ip1jm -1 |
---|
101 | pente(ij) =( q(ij+1,l,iq)-q(ij,l,iq)) *(q(ij,l,iq)-q(ij-1,l,iq)) |
---|
102 | xg(ij) = q(ij,l,iq) - 0.25 * ( q(ij+1,l,iq) - q(ij-1,l,iq) ) |
---|
103 | xd(ij) = q(ij,l,iq) + 0.25 * ( q(ij+1,l,iq) - q(ij-1,l,iq) ) |
---|
104 | qg(ij) = CVMGP( xg(ij), q(ij,l,iq) ,pente(ij) ) |
---|
105 | qd(ij) = CVMGP( xd(ij), q(ij,l,iq), pente(ij) ) |
---|
106 | ENDDO |
---|
107 | |
---|
108 | c ... Correction aux points ( i= 1, j ) ..... |
---|
109 | c |
---|
110 | DO ij = iip2, ip1jm, iip1 |
---|
111 | pente(ij) = ( q(ij+1,l,iq) - q(ij,l,iq) ) * |
---|
112 | * ( q(ij,l,iq) - q(ij+iim-1,l,iq) ) |
---|
113 | xg(ij) = q(ij,l,iq) - 0.25* ( q(ij+1,l,iq)- q(ij+iim-1,l,iq) ) |
---|
114 | xd(ij) = q(ij,l,iq) + 0.25* ( q(ij+1,l,iq)- q(ij+iim-1,l,iq) ) |
---|
115 | qg(ij) = CVMGP( xg(ij), q(ij,l,iq) ,pente(ij) ) |
---|
116 | qd(ij) = CVMGP( xd(ij), q(ij,l,iq), pente(ij) ) |
---|
117 | ENDDO |
---|
118 | c |
---|
119 | c ... Correction aux points ( i= iip1, j ) ..... |
---|
120 | c |
---|
121 | DO ij = iip2, ip1jm, iip1 |
---|
122 | qg( ij+ iim ) = qg( ij ) |
---|
123 | qd( ij+ iim ) = qd( ij ) |
---|
124 | ENDDO |
---|
125 | c |
---|
126 | c ............................................................. |
---|
127 | c ......... Limitation des pentes a gauche des boites ..... |
---|
128 | c |
---|
129 | c Si (q(i)-qg(i))*(qg(i)-q(i-1)) < 0. , on a qg(i)=q(i-1) |
---|
130 | c et qd(i)=2*q(i)-qg(i) |
---|
131 | c ............................................................. |
---|
132 | c |
---|
133 | DO ij = iip2,ip1jm -1 |
---|
134 | pente(ij)= ( qg(ij) -q(ij-1,l,iq))*(q(ij,l,iq)-qg(ij) ) |
---|
135 | qg(ij) = CVMGP( qg(ij), q(ij-1,l,iq) ,pente(ij) ) |
---|
136 | qd(ij) = CVMGP( qd(ij), |
---|
137 | * q(ij,l,iq)+ q(ij,l,iq) -qg(ij) , pente(ij) ) |
---|
138 | ENDDO |
---|
139 | c |
---|
140 | c ..... Correction aux points ( i= 1, j ) ...... |
---|
141 | c |
---|
142 | DO ij = iip2 ,ip1jm, iip1 |
---|
143 | qg(ij) = qg(ij+ iim) |
---|
144 | qd(ij) = qd(ij+ iim) |
---|
145 | ENDDO |
---|
146 | c |
---|
147 | c ............................................................... |
---|
148 | c ...... Limitation des pentes a droite des boites ......... |
---|
149 | c Si (q(i+1)-qd(i))*(qd(i)-q(i)) < 0. , on a qd(i)=q(i+1) |
---|
150 | c et qg(i)=2*q(i)-qd(i) . |
---|
151 | c ............................................................... |
---|
152 | c |
---|
153 | DO ij = iip2, ip1jm -1 |
---|
154 | pente(ij) = ( qd(ij)-q(ij,l,iq) )*(q(ij+1,l,iq)-qd(ij) ) |
---|
155 | qd(ij) = CVMGP( qd(ij), q(ij+1,l,iq), pente(ij) ) |
---|
156 | qg(ij) = CVMGP( qg(ij), |
---|
157 | * q(ij,l,iq)+ q(ij,l,iq) -qd(ij) , pente(ij) ) |
---|
158 | ENDDO |
---|
159 | c |
---|
160 | c .... Correction aux points ( i = iip1, j ) ..... |
---|
161 | c |
---|
162 | DO ij = iip2, ip1jm, iip1 |
---|
163 | qg( ij+ iim ) = qg( ij ) |
---|
164 | qd( ij+ iim ) = qd( ij ) |
---|
165 | ENDDO |
---|
166 | c |
---|
167 | |
---|
168 | c ------------------------------------------------------------- |
---|
169 | c ------------------------------------------------------------- |
---|
170 | c ............. Traitement en latitude ................. |
---|
171 | c ------------------------------------------------------------- |
---|
172 | c ------------------------------------------------------------- |
---|
173 | c |
---|
174 | c |
---|
175 | c q(j=1) PN |
---|
176 | c -------------- |
---|
177 | c --------- |
---|
178 | c -------------- |
---|
179 | c |
---|
180 | c q(j-1) |
---|
181 | c |
---|
182 | c -------------- |
---|
183 | c qn(j) |
---|
184 | c q(j) |
---|
185 | c qs(j) |
---|
186 | c -------------- |
---|
187 | c |
---|
188 | c q(j+1) |
---|
189 | c |
---|
190 | c -------------- |
---|
191 | c |
---|
192 | c q(jjp1) PS |
---|
193 | c |
---|
194 | c -------------- |
---|
195 | c |
---|
196 | c |
---|
197 | c ...... operations pour les lignes j= 2 a j= jjm ....... |
---|
198 | c |
---|
199 | DO ij = iip2, ip1jm |
---|
200 | pente(ij) = ( q(ij-iip1,l,iq)- q(ij,l,iq) ) * |
---|
201 | * ( q(ij,l,iq) - q(ij+iip1,l,iq) ) |
---|
202 | xs(ij) = q(ij,l,iq) - 0.25 * ( q(ij-iip1,l,iq) -q(ij+iip1,l,iq) ) |
---|
203 | xn(ij) = q(ij,l,iq) + 0.25 * ( q(ij-iip1,l,iq) -q(ij+iip1,l,iq) ) |
---|
204 | qs(ij) = CVMGP( xs(ij), q(ij,l,iq), pente(ij) ) |
---|
205 | qn(ij) = CVMGP( xn(ij), q(ij,l,iq), pente(ij) ) |
---|
206 | ENDDO |
---|
207 | c |
---|
208 | c |
---|
209 | c ...... Calculs aux poles ............................. |
---|
210 | c ............................................................ |
---|
211 | c |
---|
212 | c On n'a pas besoin des valeurs de qn au pole Nord ( j= 1) , |
---|
213 | c ainsi que de celles de qs au pole Sud ( j= jjp1) |
---|
214 | c |
---|
215 | c |
---|
216 | airej2 = SSUM( iim, aire(iip2), 1 ) |
---|
217 | airejjm= SSUM( iim, aire(ip1jm -iim), 1 ) |
---|
218 | DO i = 1, iim |
---|
219 | airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) |
---|
220 | airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) |
---|
221 | ENDDO |
---|
222 | qpns = SSUM( iim, airescb ,1 ) / airej2 |
---|
223 | qpsn = SSUM( iim, airesch ,1 ) / airejjm |
---|
224 | c |
---|
225 | c qpns , val.moyenne de q sur la ligne j= 2 |
---|
226 | c qpsn , val.moyenne de q sur la ligne j= jjm |
---|
227 | c |
---|
228 | c |
---|
229 | c |
---|
230 | c on cherche si on a un extremum au pole |
---|
231 | c |
---|
232 | extrpn=.true. |
---|
233 | extrps=.true. |
---|
234 | DO ij=2,iim |
---|
235 | if((q(iip1+i,l,iq)-q(1,l,iq))*(q(iip2,l,iq)-q(1,l,iq)).lt.0.) |
---|
236 | . extrpn=.false. |
---|
237 | if((q(ip1jm-iip1+i,l,iq)-q(1,l,iq))* |
---|
238 | . (q(ip1jm-iim,l,iq)-q(1,l,iq)).lt.0.) |
---|
239 | . extrps=.false. |
---|
240 | ENDDO |
---|
241 | |
---|
242 | c calcul des pentes au pole |
---|
243 | |
---|
244 | if(extrpn) then |
---|
245 | DO ij = 1, iip1 |
---|
246 | qs(ij)= q(ij,l,iq) |
---|
247 | ENDDO |
---|
248 | else |
---|
249 | DO ij = 1, iip1 |
---|
250 | qs(ij)= q(ij,l,iq) + 0.5 * ( q(ij+ iip1,l,iq) - qpns ) |
---|
251 | ENDDO |
---|
252 | endif |
---|
253 | |
---|
254 | if(extrps) then |
---|
255 | DO ij = 1, iip1 |
---|
256 | qn(ij+ip1jm) = q(ij+ip1jm,l,iq) |
---|
257 | ENDDO |
---|
258 | else |
---|
259 | DO ij = 1, iip1 |
---|
260 | qn(ij+ip1jm) = q(ij+ip1jm,l,iq) + 0.5 * |
---|
261 | * ( q(ij+ip1jm-iip1,l,iq) - qpsn ) |
---|
262 | ENDDO |
---|
263 | endif |
---|
264 | |
---|
265 | c |
---|
266 | c |
---|
267 | c ......................................................... |
---|
268 | c ...... Limitation des pentes au sud des boites ..... |
---|
269 | c ......................................................... |
---|
270 | c |
---|
271 | DO ij = 1, ip1jm |
---|
272 | pente(ij) = ( qs(ij) - q (ij+iip1,l,iq) ) * |
---|
273 | * ( q( ij,l,iq) - qs( ij ) ) |
---|
274 | qs(ij) = CVMGP( qs(ij) , q(ij+iip1,l,iq), pente(ij) ) |
---|
275 | qn(ij) = CVMGP( qn(ij) , |
---|
276 | * q(ij,l,iq)+ q(ij,l,iq) -qs(ij), pente(ij) ) |
---|
277 | ENDDO |
---|
278 | c |
---|
279 | c |
---|
280 | c ....................................................... |
---|
281 | c .... Limitation des pentes au nord des boites ......... |
---|
282 | c ....................................................... |
---|
283 | c |
---|
284 | DO ij = iip2, ip1jmp1 |
---|
285 | pente(ij) = ( qn( ij ) - q(ij,l,iq) ) * |
---|
286 | * ( q(ij-iip1,l,iq) - qn(ij) ) |
---|
287 | qn(ij) = CVMGP( qn(ij), q(ij-iip1,l,iq), pente(ij) ) |
---|
288 | qs(ij) = CVMGP( qs(ij), |
---|
289 | * q(ij,l,iq)+ q(ij,l,iq) -qn(ij) , pente(ij) ) |
---|
290 | ENDDO |
---|
291 | c |
---|
292 | c |
---|
293 | c ............................................................. |
---|
294 | c ..... Calculs des flux de q sur le plan horizontal ...... |
---|
295 | c ............................................................. |
---|
296 | c |
---|
297 | c |
---|
298 | c |
---|
299 | c |
---|
300 | c .... Selon X .... |
---|
301 | c |
---|
302 | DO ij = iip2, ip1jm - 1 |
---|
303 | c |
---|
304 | qbxu( ij,l ) = pbaru( ij,l ) * |
---|
305 | * CVMGT( qd(ij), qg(ij +1), pbaru(ij,l).GT.0. ) |
---|
306 | ENDDO |
---|
307 | c |
---|
308 | c ..... correction pour qbxu(iip1,j,l) ..... |
---|
309 | c ... qbxu(iip1,j,l)= qbxu(1,j,l) ... |
---|
310 | c |
---|
311 | c &&&CDIR$ IVDEP |
---|
312 | DO ij = iip1 +iip1, ip1jm, iip1 |
---|
313 | qbxu( ij,l ) = qbxu( ij - iim, l ) |
---|
314 | ENDDO |
---|
315 | c |
---|
316 | c .... Selon Y ..... |
---|
317 | c |
---|
318 | DO ij = 1, ip1jm |
---|
319 | qbyv( ij,l ) = pbarv( ij,l ) * |
---|
320 | * CVMGT( qn(ij+iip1), qs(ij), pbarv(ij,l).GT.0. ) |
---|
321 | ENDDO |
---|
322 | c |
---|
323 | c |
---|
324 | c |
---|
325 | 100 CONTINUE |
---|
326 | c |
---|
327 | c .......................................................... |
---|
328 | c ( ... fin des traitements en longitude et latitude ... ) |
---|
329 | c |
---|
330 | c |
---|
331 | c stockage dans dqh de la convergence horiz.du flux d'humidite . |
---|
332 | c .... |
---|
333 | c |
---|
334 | c |
---|
335 | CALL convflu( qbxu, qbyv, llm, dqh ) |
---|
336 | c |
---|
337 | c |
---|
338 | c |
---|
339 | c ---------------------------------------------------------------- |
---|
340 | c ---------------------------------------------------------------- |
---|
341 | c ............. Traitement en altitude ............. |
---|
342 | c ---------------------------------------------------------------- |
---|
343 | c ---------------------------------------------------------------- |
---|
344 | c |
---|
345 | c |
---|
346 | c ------------- |
---|
347 | c q (llm) |
---|
348 | c |
---|
349 | c ------------- |
---|
350 | c ------------- |
---|
351 | c |
---|
352 | c q(l+1) |
---|
353 | c |
---|
354 | c ------------- |
---|
355 | c qh(l) |
---|
356 | c q(l) |
---|
357 | c qb(l) |
---|
358 | c ------------- |
---|
359 | c |
---|
360 | c q(l-1) |
---|
361 | c |
---|
362 | c ------------- |
---|
363 | c ------------- |
---|
364 | c q(1) |
---|
365 | c ------------- |
---|
366 | c |
---|
367 | c |
---|
368 | c ... Calculs pour les niveaux 2 a llm -1 ... |
---|
369 | c |
---|
370 | c |
---|
371 | DO 200 l = 2, llm -1 |
---|
372 | |
---|
373 | DO ij = 1, ip1jmp1 |
---|
374 | pente(ij) = ( q(ij, l+1 ,iq) - q(ij , l , iq) ) * |
---|
375 | * ( q(ij, l ,iq) - q(ij ,l-1 , iq) ) |
---|
376 | xb(ij) = q(ij,l,iq) - 0.25* ( q(ij,l+1,iq) - q(ij,l-1,iq) ) |
---|
377 | xh(ij) = q(ij,l,iq) + 0.25* ( q(ij,l+1,iq) - q(ij,l-1,iq) ) |
---|
378 | qb(ij,l) = CVMGP( xb(ij), q(ij,l,iq), pente(ij) ) |
---|
379 | qh(ij,l) = CVMGP( xh(ij), q(ij,l,iq), pente(ij) ) |
---|
380 | ENDDO |
---|
381 | c |
---|
382 | c ........................................................ |
---|
383 | c ...... Limitation des pentes en bas des boites ...... |
---|
384 | c ........................................................ |
---|
385 | c |
---|
386 | DO ij = 1, ip1jmp1 |
---|
387 | pente(ij) = ( qb(ij,l) - q ( ij,l-1,iq) ) * |
---|
388 | * ( q (ij,l,iq) - qb( ij,l ) ) |
---|
389 | qb(ij,l) = CVMGP( qb(ij,l), q(ij,l-1,iq), pente(ij) ) |
---|
390 | qh(ij,l) = CVMGP( qh(ij,l), |
---|
391 | * q(ij,l,iq) + q(ij,l,iq) -qb(ij,l), pente(ij) ) |
---|
392 | ENDDO |
---|
393 | c |
---|
394 | c |
---|
395 | c ........................................................ |
---|
396 | c ...... Limitation des pentes en haut des boites ...... |
---|
397 | c ........................................................ |
---|
398 | c |
---|
399 | DO ij = 1, ip1jmp1 |
---|
400 | pente(ij) = ( qh(ij,l) - q ( ij,l+1,iq) ) * |
---|
401 | * ( q (ij,l,iq) - qh( ij,l ) ) |
---|
402 | qh(ij,l) = CVMGP( qh(ij,l), q(ij,l+1,iq), pente(ij) ) |
---|
403 | qb(ij,l) = CVMGP( qb(ij,l), |
---|
404 | * q(ij,l,iq) + q(ij,l,iq) -qh(ij,l), pente(ij) ) |
---|
405 | ENDDO |
---|
406 | c |
---|
407 | c |
---|
408 | 200 CONTINUE |
---|
409 | c |
---|
410 | c |
---|
411 | c ............................................................ |
---|
412 | c ..... Calculs pour les niveaux l= 1 et l= llm ......... |
---|
413 | c ............................................................ |
---|
414 | c |
---|
415 | DO ij = 1, ip1jmp1 |
---|
416 | qb(ij,1) = q(ij, 1 , iq) |
---|
417 | qb(ij,llm) = q(ij,llm, iq) |
---|
418 | qh(ij,1) = q(ij, 1 , iq) |
---|
419 | qh(ij,llm) = q(ij,llm, iq) |
---|
420 | ENDDO |
---|
421 | c |
---|
422 | |
---|
423 | c --------------------------------------------------------------- |
---|
424 | c .... calcul des termes d'advection verticale ....... |
---|
425 | c --------------------------------------------------------------- |
---|
426 | |
---|
427 | c calcul de - d( q * w )/ d(sigma) qu'on ajoute a dqh pour calculer dq |
---|
428 | c |
---|
429 | |
---|
430 | DO 300 l = 1,llmm1 |
---|
431 | c |
---|
432 | DO ij = 1,ip1jmp1 |
---|
433 | ww= - w( ij,l+1 ) * |
---|
434 | * CVMGT ( qh(ij,l), qb(ij,l+1), w(ij,l+1).LT.0.) |
---|
435 | |
---|
436 | dq (ij, l ,iq ) = dqh(ij, l ) - dsig1( l ) * ww |
---|
437 | dqh(ij,l+1 ) = dqh(ij,l+1) + dsig1(l+1) * ww |
---|
438 | ENDDO |
---|
439 | c |
---|
440 | 300 CONTINUE |
---|
441 | c |
---|
442 | c |
---|
443 | c |
---|
444 | DO ij = 1,ip1jmp1 |
---|
445 | dq( ij,llm,iq ) = dqh( ij,llm ) |
---|
446 | END DO |
---|
447 | c |
---|
448 | c |
---|
449 | END IF |
---|
450 | c |
---|
451 | RETURN |
---|
452 | END |
---|