/[lmdze]/trunk/dyn3d/vlspltqs.f
ViewVC logotype

Contents of /trunk/dyn3d/vlspltqs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (show annotations)
Thu Apr 1 14:59:19 2010 UTC (14 years, 2 months ago) by guez
Original Path: trunk/libf/dyn3d/vlspltqs.f
File size: 21018 byte(s)
Split "vlsplt.f" in single-procedure files. Gathered the files in
directory "dyn3d/Vlsplt".

Defined "pbarum(:, 1, :)" and "pbarum(:, jjm + 1, :)" in procedure
"groupe".

1 !
2 ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/vlspltqs.F,v 1.2 2005/02/24 12:16:57 fairhead Exp $
3 !
4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt,
5 , p,pk,teta )
6 c
7 c Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron
8 c
9 c ********************************************************************
10 c Shema d'advection " pseudo amont " .
11 c + test sur humidite specifique: Q advecte< Qsat aval
12 c (F. Codron, 10/99)
13 c ********************************************************************
14 c q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
15 c
16 c pente_max facteur de limitation des pentes: 2 en general
17 c 0 pour un schema amont
18 c pbaru,pbarv,w flux de masse en u ,v ,w
19 c pdt pas de temps
20 c
21 c teta temperature potentielle, p pression aux interfaces,
22 c pk exner au milieu des couches necessaire pour calculer Qsat
23 c --------------------------------------------------------------------
24 use dimens_m
25 use paramet_m
26 use comconst
27 use comvert
28 use logic
29 IMPLICIT NONE
30 c
31
32 c
33 c Arguments:
34 c ----------
35 REAL masse(ip1jmp1,llm),pente_max
36 REAL, intent(in):: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
37 REAL q(ip1jmp1,llm)
38 REAL w(ip1jmp1,llm)
39 real, intent(in):: pdt
40 REAL, intent(in):: p(ip1jmp1,llmp1)
41 real teta(ip1jmp1,llm),pk(ip1jmp1,llm)
42 c
43 c Local
44 c ---------
45 c
46 INTEGER i,ij,l,j,ii
47 c
48 REAL qsat(ip1jmp1,llm)
49 REAL zm(ip1jmp1,llm)
50 REAL mu(ip1jmp1,llm)
51 REAL mv(ip1jm,llm)
52 REAL mw(ip1jmp1,llm+1)
53 REAL zq(ip1jmp1,llm)
54 REAL temps1,temps2,temps3
55 REAL zzpbar, zzw
56 LOGICAL testcpu
57 SAVE testcpu
58 SAVE temps1,temps2,temps3
59
60 REAL qmin,qmax
61 DATA qmin,qmax/0.,1.e33/
62 DATA testcpu/.false./
63 DATA temps1,temps2,temps3/0.,0.,0./
64
65 c--pour rapport de melange saturant--
66
67 REAL rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
68 REAL ptarg,pdelarg,foeew,zdelta
69 REAL tempe(ip1jmp1)
70
71 c fonction psat(T)
72
73 FOEEW ( PTARG,PDELARG ) = EXP (
74 * (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT)
75 * / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
76
77 r2es = 380.11733
78 r3les = 17.269
79 r3ies = 21.875
80 r4les = 35.86
81 r4ies = 7.66
82 retv = 0.6077667
83 rtt = 273.16
84
85 c-- Calcul de Qsat en chaque point
86 c-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
87 c pour eviter une exponentielle.
88 DO l = 1, llm
89 DO ij = 1, ip1jmp1
90 tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
91 ENDDO
92 DO ij = 1, ip1jmp1
93 zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
94 play = 0.5*(p(ij,l)+p(ij,l+1))
95 qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
96 qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
97 ENDDO
98 ENDDO
99
100 c PRINT*,'Debut vlsplt version debug sans vlyqs'
101
102 zzpbar = 0.5 * pdt
103 zzw = pdt
104 DO l=1,llm
105 DO ij = iip2,ip1jm
106 mu(ij,l)=pbaru(ij,l) * zzpbar
107 ENDDO
108 DO ij=1,ip1jm
109 mv(ij,l)=pbarv(ij,l) * zzpbar
110 ENDDO
111 DO ij=1,ip1jmp1
112 mw(ij,l)=w(ij,l) * zzw
113 ENDDO
114 ENDDO
115
116 DO ij=1,ip1jmp1
117 mw(ij,llm+1)=0.
118 ENDDO
119
120 CALL SCOPY(ijp1llm,q,1,zq,1)
121 CALL SCOPY(ijp1llm,masse,1,zm,1)
122
123 c call minmaxq(zq,qmin,qmax,'avant vlxqs ')
124 call vlxqs(zq,pente_max,zm,mu,qsat)
125
126
127 c call minmaxq(zq,qmin,qmax,'avant vlyqs ')
128
129 call vlyqs(zq,pente_max,zm,mv,qsat)
130
131
132 c call minmaxq(zq,qmin,qmax,'avant vlz ')
133
134 call vlz(zq,pente_max,zm,mw)
135
136
137 c call minmaxq(zq,qmin,qmax,'avant vlyqs ')
138 c call minmaxq(zm,qmin,qmax,'M avant vlyqs ')
139
140 call vlyqs(zq,pente_max,zm,mv,qsat)
141
142
143 c call minmaxq(zq,qmin,qmax,'avant vlxqs ')
144 c call minmaxq(zm,qmin,qmax,'M avant vlxqs ')
145
146 call vlxqs(zq,pente_max,zm,mu,qsat)
147
148 c call minmaxq(zq,qmin,qmax,'apres vlxqs ')
149 c call minmaxq(zm,qmin,qmax,'M apres vlxqs ')
150
151
152 DO l=1,llm
153 DO ij=1,ip1jmp1
154 q(ij,l)=zq(ij,l)
155 ENDDO
156 DO ij=1,ip1jm+1,iip1
157 q(ij+iim,l)=q(ij,l)
158 ENDDO
159 ENDDO
160
161 RETURN
162 END
163 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat)
164 c
165 c Auteurs: P.Le Van, F.Hourdin, F.Forget
166 c
167 c ********************************************************************
168 c Shema d'advection " pseudo amont " .
169 c ********************************************************************
170 c
171 c --------------------------------------------------------------------
172 use dimens_m
173 use paramet_m
174 use comconst
175 use comvert
176 use logic
177 IMPLICIT NONE
178 c
179 c
180 c
181 c Arguments:
182 c ----------
183 REAL masse(ip1jmp1,llm),pente_max
184 REAL u_m( ip1jmp1,llm )
185 REAL q(ip1jmp1,llm)
186 REAL qsat(ip1jmp1,llm)
187 c
188 c Local
189 c ---------
190 c
191 INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju
192 INTEGER n0,iadvplus(ip1jmp1,llm),nl(llm)
193 c
194 REAL new_m,zu_m,zdum(ip1jmp1,llm)
195 REAL dxq(ip1jmp1,llm),dxqu(ip1jmp1)
196 REAL zz(ip1jmp1)
197 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
198 REAL u_mq(ip1jmp1,llm)
199
200 Logical first,testcpu
201 SAVE first,testcpu
202
203 REAL SSUM
204 REAL temps0,temps1,temps2,temps3,temps4,temps5
205 SAVE temps0,temps1,temps2,temps3,temps4,temps5
206
207
208 DATA first,testcpu/.true.,.false./
209
210 IF(first) THEN
211 temps1=0.
212 temps2=0.
213 temps3=0.
214 temps4=0.
215 temps5=0.
216 first=.false.
217 ENDIF
218
219 c calcul de la pente a droite et a gauche de la maille
220
221
222 IF (pente_max.gt.-1.e-5) THEN
223 c IF (pente_max.gt.10) THEN
224
225 c calcul des pentes avec limitation, Van Leer scheme I:
226 c -----------------------------------------------------
227
228 c calcul de la pente aux points u
229 DO l = 1, llm
230 DO ij=iip2,ip1jm-1
231 dxqu(ij)=q(ij+1,l)-q(ij,l)
232 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
233 c sigu(ij)=u_m(ij,l)/masse(ij,l)
234 ENDDO
235 DO ij=iip1+iip1,ip1jm,iip1
236 dxqu(ij)=dxqu(ij-iim)
237 c sigu(ij)=sigu(ij-iim)
238 ENDDO
239
240 DO ij=iip2,ip1jm
241 adxqu(ij)=abs(dxqu(ij))
242 ENDDO
243
244 c calcul de la pente maximum dans la maille en valeur absolue
245
246 DO ij=iip2+1,ip1jm
247 dxqmax(ij,l)=pente_max*
248 , min(adxqu(ij-1),adxqu(ij))
249 c limitation subtile
250 c , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij)))
251
252
253 ENDDO
254
255 DO ij=iip1+iip1,ip1jm,iip1
256 dxqmax(ij-iim,l)=dxqmax(ij,l)
257 ENDDO
258
259 DO ij=iip2+1,ip1jm
260 IF(dxqu(ij-1)*dxqu(ij).gt.0) THEN
261 dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
262 ELSE
263 c extremum local
264 dxq(ij,l)=0.
265 ENDIF
266 dxq(ij,l)=0.5*dxq(ij,l)
267 dxq(ij,l)=
268 , sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
269 ENDDO
270
271 ENDDO ! l=1,llm
272
273 ELSE ! (pente_max.lt.-1.e-5)
274
275 c Pentes produits:
276 c ----------------
277
278 DO l = 1, llm
279 DO ij=iip2,ip1jm-1
280 dxqu(ij)=q(ij+1,l)-q(ij,l)
281 ENDDO
282 DO ij=iip1+iip1,ip1jm,iip1
283 dxqu(ij)=dxqu(ij-iim)
284 ENDDO
285
286 DO ij=iip2+1,ip1jm
287 zz(ij)=dxqu(ij-1)*dxqu(ij)
288 zz(ij)=zz(ij)+zz(ij)
289 IF(zz(ij).gt.0) THEN
290 dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
291 ELSE
292 c extremum local
293 dxq(ij,l)=0.
294 ENDIF
295 ENDDO
296
297 ENDDO
298
299 ENDIF ! (pente_max.lt.-1.e-5)
300
301 c bouclage de la pente en iip1:
302 c -----------------------------
303
304 DO l=1,llm
305 DO ij=iip1+iip1,ip1jm,iip1
306 dxq(ij-iim,l)=dxq(ij,l)
307 ENDDO
308
309 DO ij=1,ip1jmp1
310 iadvplus(ij,l)=0
311 ENDDO
312
313 ENDDO
314
315
316 c calcul des flux a gauche et a droite
317
318 c on cumule le flux correspondant a toutes les mailles dont la masse
319 c au travers de la paroi pENDant le pas de temps.
320 c le rapport de melange de l'air advecte est min(q_vanleer, Qsat_downwind)
321 DO l=1,llm
322 DO ij=iip2,ip1jm-1
323 IF (u_m(ij,l).gt.0.) THEN
324 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
325 u_mq(ij,l)=u_m(ij,l)*
326 $ min(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
327 ELSE
328 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
329 u_mq(ij,l)=u_m(ij,l)*
330 $ min(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
331 ENDIF
332 ENDDO
333 ENDDO
334
335
336 c detection des points ou on advecte plus que la masse de la
337 c maille
338 DO l=1,llm
339 DO ij=iip2,ip1jm-1
340 IF(zdum(ij,l).lt.0) THEN
341 iadvplus(ij,l)=1
342 u_mq(ij,l)=0.
343 ENDIF
344 ENDDO
345 ENDDO
346 DO l=1,llm
347 DO ij=iip1+iip1,ip1jm,iip1
348 iadvplus(ij,l)=iadvplus(ij-iim,l)
349 ENDDO
350 ENDDO
351
352
353
354 c traitement special pour le cas ou on advecte en longitude plus que le
355 c contenu de la maille.
356 c cette partie est mal vectorisee.
357
358 c pas d'influence de la pression saturante (pour l'instant)
359
360 c calcul du nombre de maille sur lequel on advecte plus que la maille.
361
362 n0=0
363 DO l=1,llm
364 nl(l)=0
365 DO ij=iip2,ip1jm
366 nl(l)=nl(l)+iadvplus(ij,l)
367 ENDDO
368 n0=n0+nl(l)
369 ENDDO
370
371 IF(n0.gt.0) THEN
372 ccc PRINT*,'Nombre de points pour lesquels on advect plus que le'
373 ccc & ,'contenu de la maille : ',n0
374
375 DO l=1,llm
376 IF(nl(l).gt.0) THEN
377 iju=0
378 c indicage des mailles concernees par le traitement special
379 DO ij=iip2,ip1jm
380 IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN
381 iju=iju+1
382 indu(iju)=ij
383 ENDIF
384 ENDDO
385 niju=iju
386 c PRINT*,'niju,nl',niju,nl(l)
387
388 c traitement des mailles
389 DO iju=1,niju
390 ij=indu(iju)
391 j=(ij-1)/iip1+1
392 zu_m=u_m(ij,l)
393 u_mq(ij,l)=0.
394 IF(zu_m.gt.0.) THEN
395 ijq=ij
396 i=ijq-(j-1)*iip1
397 c accumulation pour les mailles completements advectees
398 do while(zu_m.gt.masse(ijq,l))
399 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
400 zu_m=zu_m-masse(ijq,l)
401 i=mod(i-2+iim,iim)+1
402 ijq=(j-1)*iip1+i
403 ENDDO
404 c ajout de la maille non completement advectee
405 u_mq(ij,l)=u_mq(ij,l)+zu_m*
406 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
407 ELSE
408 ijq=ij+1
409 i=ijq-(j-1)*iip1
410 c accumulation pour les mailles completements advectees
411 do while(-zu_m.gt.masse(ijq,l))
412 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
413 zu_m=zu_m+masse(ijq,l)
414 i=mod(i,iim)+1
415 ijq=(j-1)*iip1+i
416 ENDDO
417 c ajout de la maille non completement advectee
418 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
419 & 0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
420 ENDIF
421 ENDDO
422 ENDIF
423 ENDDO
424 ENDIF ! n0.gt.0
425
426
427
428 c bouclage en latitude
429
430 DO l=1,llm
431 DO ij=iip1+iip1,ip1jm,iip1
432 u_mq(ij,l)=u_mq(ij-iim,l)
433 ENDDO
434 ENDDO
435
436
437 c calcul des tendances
438
439 DO l=1,llm
440 DO ij=iip2+1,ip1jm
441 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
442 q(ij,l)=(q(ij,l)*masse(ij,l)+
443 & u_mq(ij-1,l)-u_mq(ij,l))
444 & /new_m
445 masse(ij,l)=new_m
446 ENDDO
447 c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
448 DO ij=iip1+iip1,ip1jm,iip1
449 q(ij-iim,l)=q(ij,l)
450 masse(ij-iim,l)=masse(ij,l)
451 ENDDO
452 ENDDO
453
454 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
455 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
456
457
458 RETURN
459 END
460 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat)
461 c
462 c Auteurs: P.Le Van, F.Hourdin, F.Forget
463 c
464 c ********************************************************************
465 c Shema d'advection " pseudo amont " .
466 c ********************************************************************
467 c q,masse_adv_v,w sont des arguments d'entree pour le s-pg ....
468 c qsat est un argument de sortie pour le s-pg ....
469 c
470 c
471 c --------------------------------------------------------------------
472 c
473 use dimens_m
474 use paramet_m
475 use comconst
476 use comvert
477 use logic
478 use comgeom
479 IMPLICIT NONE
480 c
481 c
482 c Arguments:
483 c ----------
484 REAL masse(ip1jmp1,llm),pente_max
485 REAL masse_adv_v( ip1jm,llm)
486 REAL q(ip1jmp1,llm)
487 REAL qsat(ip1jmp1,llm)
488 c
489 c Local
490 c ---------
491 c
492 INTEGER i,ij,l
493 c
494 REAL airej2,airejjm,airescb(iim),airesch(iim)
495 REAL dyq(ip1jmp1,llm),dyqv(ip1jm)
496 REAL adyqv(ip1jm),dyqmax(ip1jmp1)
497 REAL qbyv(ip1jm,llm)
498
499 REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
500 c REAL newq,oldmasse
501 Logical first,testcpu
502 REAL temps0,temps1,temps2,temps3,temps4,temps5
503 SAVE temps0,temps1,temps2,temps3,temps4,temps5
504 SAVE first,testcpu
505
506 REAL convpn,convps,convmpn,convmps
507 REAL sinlon(iip1),sinlondlon(iip1)
508 REAL coslon(iip1),coslondlon(iip1)
509 SAVE sinlon,coslon,sinlondlon,coslondlon
510 SAVE airej2,airejjm
511 c
512 c
513 REAL SSUM
514
515 DATA first,testcpu/.true.,.false./
516 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
517
518 IF(first) THEN
519 PRINT*,'Shema Amont nouveau appele dans Vanleer '
520 first=.false.
521 do i=2,iip1
522 coslon(i)=cos(rlonv(i))
523 sinlon(i)=sin(rlonv(i))
524 coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
525 sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
526 ENDDO
527 coslon(1)=coslon(iip1)
528 coslondlon(1)=coslondlon(iip1)
529 sinlon(1)=sinlon(iip1)
530 sinlondlon(1)=sinlondlon(iip1)
531 airej2 = SSUM( iim, aire(iip2), 1 )
532 airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
533 ENDIF
534
535 c
536
537
538 DO l = 1, llm
539 c
540 c --------------------------------
541 c CALCUL EN LATITUDE
542 c --------------------------------
543
544 c On commence par calculer la valeur du traceur moyenne sur le premier cercle
545 c de latitude autour du pole (qpns pour le pole nord et qpsn pour
546 c le pole nord) qui sera utilisee pour evaluer les pentes au pole.
547
548 DO i = 1, iim
549 airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
550 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
551 ENDDO
552 qpns = SSUM( iim, airescb ,1 ) / airej2
553 qpsn = SSUM( iim, airesch ,1 ) / airejjm
554
555 c calcul des pentes aux points v
556
557 DO ij=1,ip1jm
558 dyqv(ij)=q(ij,l)-q(ij+iip1,l)
559 adyqv(ij)=abs(dyqv(ij))
560 ENDDO
561
562 c calcul des pentes aux points scalaires
563
564 DO ij=iip2,ip1jm
565 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
566 dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
567 dyqmax(ij)=pente_max*dyqmax(ij)
568 ENDDO
569
570 c calcul des pentes aux poles
571
572 DO ij=1,iip1
573 dyq(ij,l)=qpns-q(ij+iip1,l)
574 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
575 ENDDO
576
577 c filtrage de la derivee
578 dyn1=0.
579 dys1=0.
580 dyn2=0.
581 dys2=0.
582 DO ij=1,iim
583 dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
584 dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
585 dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
586 dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
587 ENDDO
588 DO ij=1,iip1
589 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
590 dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
591 ENDDO
592
593 c calcul des pentes limites aux poles
594
595 fn=1.
596 fs=1.
597 DO ij=1,iim
598 IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
599 fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
600 ENDIF
601 IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
602 fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
603 ENDIF
604 ENDDO
605 DO ij=1,iip1
606 dyq(ij,l)=fn*dyq(ij,l)
607 dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
608 ENDDO
609
610 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
611 C En memoire de dIFferents tests sur la
612 C limitation des pentes aux poles.
613 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
614 C PRINT*,dyq(1)
615 C PRINT*,dyqv(iip1+1)
616 C apn=abs(dyq(1)/dyqv(iip1+1))
617 C PRINT*,dyq(ip1jm+1)
618 C PRINT*,dyqv(ip1jm-iip1+1)
619 C aps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))
620 C DO ij=2,iim
621 C apn=amax1(abs(dyq(ij)/dyqv(ij)),apn)
622 C aps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),aps)
623 C ENDDO
624 C apn=min(pente_max/apn,1.)
625 C aps=min(pente_max/aps,1.)
626 C
627 C
628 C cas ou on a un extremum au pole
629 C
630 C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
631 C & apn=0.
632 C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
633 C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
634 C & aps=0.
635 C
636 C limitation des pentes aux poles
637 C DO ij=1,iip1
638 C dyq(ij)=apn*dyq(ij)
639 C dyq(ip1jm+ij)=aps*dyq(ip1jm+ij)
640 C ENDDO
641 C
642 C test
643 C DO ij=1,iip1
644 C dyq(iip1+ij)=0.
645 C dyq(ip1jm+ij-iip1)=0.
646 C ENDDO
647 C DO ij=1,ip1jmp1
648 C dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))
649 C ENDDO
650 C
651 C changement 10 07 96
652 C IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
653 C & THEN
654 C DO ij=1,iip1
655 C dyqmax(ij)=0.
656 C ENDDO
657 C ELSE
658 C DO ij=1,iip1
659 C dyqmax(ij)=pente_max*abs(dyqv(ij))
660 C ENDDO
661 C ENDIF
662 C
663 C IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
664 C & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
665 C &THEN
666 C DO ij=ip1jm+1,ip1jmp1
667 C dyqmax(ij)=0.
668 C ENDDO
669 C ELSE
670 C DO ij=ip1jm+1,ip1jmp1
671 C dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))
672 C ENDDO
673 C ENDIF
674 C fin changement 10 07 96
675 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
676
677 c calcul des pentes limitees
678
679 DO ij=iip2,ip1jm
680 IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN
681 dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
682 ELSE
683 dyq(ij,l)=0.
684 ENDIF
685 ENDDO
686
687 ENDDO
688
689 DO l=1,llm
690 DO ij=1,ip1jm
691 IF( masse_adv_v(ij,l).GT.0. ) THEN
692 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l ) +
693 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)))
694 ELSE
695 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l) - dyq(ij,l) *
696 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) )
697 ENDIF
698 qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l)
699 ENDDO
700 ENDDO
701
702
703 DO l=1,llm
704 DO ij=iip2,ip1jm
705 newmasse=masse(ij,l)
706 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
707 q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
708 & /newmasse
709 masse(ij,l)=newmasse
710 ENDDO
711 c.-. ancienne version
712 convpn=SSUM(iim,qbyv(1,l),1)/apoln
713 convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
714 DO ij = 1,iip1
715 newmasse=masse(ij,l)+convmpn*aire(ij)
716 q(ij,l)=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/
717 & newmasse
718 masse(ij,l)=newmasse
719 ENDDO
720 convps = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
721 convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols
722 DO ij = ip1jm+1,ip1jmp1
723 newmasse=masse(ij,l)+convmps*aire(ij)
724 q(ij,l)=(q(ij,l)*masse(ij,l)+convps*aire(ij))/
725 & newmasse
726 masse(ij,l)=newmasse
727 ENDDO
728 c.-. fin ancienne version
729
730 c._. nouvelle version
731 c convpn=SSUM(iim,qbyv(1,l),1)
732 c convmpn=ssum(iim,masse_adv_v(1,l),1)
733 c oldmasse=ssum(iim,masse(1,l),1)
734 c newmasse=oldmasse+convmpn
735 c newq=(q(1,l)*oldmasse+convpn)/newmasse
736 c newmasse=newmasse/apoln
737 c DO ij = 1,iip1
738 c q(ij,l)=newq
739 c masse(ij,l)=newmasse*aire(ij)
740 c ENDDO
741 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
742 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
743 c oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
744 c newmasse=oldmasse+convmps
745 c newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
746 c newmasse=newmasse/apols
747 c DO ij = ip1jm+1,ip1jmp1
748 c q(ij,l)=newq
749 c masse(ij,l)=newmasse*aire(ij)
750 c ENDDO
751 c._. fin nouvelle version
752 ENDDO
753
754 RETURN
755 END

  ViewVC Help
Powered by ViewVC 1.1.21