source: trunk/LMDZ.COMMON/libf/dyn3d/vlspltqs.F @ 1453

Last change on this file since 1453 was 1422, checked in by milmd, 10 years ago

In GENERIC, MARS and COMMON models replace some include files by modules (usefull for decoupling physics with dynamics).

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