source: trunk/LMDZ.GENERIC/libf/dyn3d/vlspltqs.F @ 1422

Last change on this file since 1422 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       SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt,
2     ,                                  p,pk,teta                 )
3c
4c     Auteurs:   P.Le Van, F.Hourdin, F.Forget, F.Codron
5c
6c    ********************************************************************
7c          Shema  d'advection " pseudo amont " .
8c      + test sur humidite specifique: Q advecte< Qsat aval
9c                   (F. Codron, 10/99)
10c    ********************************************************************
11c     q,pbaru,pbarv,w sont des arguments d'entree  pour le s-pg ....
12c
13c     pente_max facteur de limitation des pentes: 2 en general
14c                                                0 pour un schema amont
15c     pbaru,pbarv,w flux de masse en u ,v ,w
16c     pdt pas de temps
17c
18c     teta temperature potentielle, p pression aux interfaces,
19c     pk exner au milieu des couches necessaire pour calculer Qsat
20c   --------------------------------------------------------------------
21      USE comconst_mod, ONLY: cpp
22
23      IMPLICIT NONE
24c
25#include "dimensions.h"
26#include "paramet.h"
27
28c
29c   Arguments:
30c   ----------
31      REAL masse(ip1jmp1,llm),pente_max
32      REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
33      REAL q(ip1jmp1,llm)
34      REAL w(ip1jmp1,llm),pdt
35      REAL p(ip1jmp1,llmp1),teta(ip1jmp1,llm),pk(ip1jmp1,llm)
36c
37c      Local
38c   ---------
39c
40      INTEGER i,ij,l,j,ii
41c
42      REAL qsat(ip1jmp1,llm)
43      REAL zm(ip1jmp1,llm)
44      REAL mu(ip1jmp1,llm)
45      REAL mv(ip1jm,llm)
46      REAL mw(ip1jmp1,llm+1)
47      REAL zq(ip1jmp1,llm)
48      REAL temps1,temps2,temps3
49      REAL zzpbar, zzw
50      LOGICAL testcpu
51      SAVE testcpu
52      SAVE temps1,temps2,temps3
53
54      REAL qmin,qmax
55      DATA qmin,qmax/0.,1.e33/
56      DATA testcpu/.false./
57      DATA temps1,temps2,temps3/0.,0.,0./
58
59c--pour rapport de melange saturant--
60
61      REAL rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
62      REAL ptarg,pdelarg,foeew,zdelta
63      REAL tempe(ip1jmp1)
64
65c    fonction psat(T)
66
67       FOEEW ( PTARG,PDELARG ) = EXP (
68     *          (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT)
69     * / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
70
71        r2es  = 380.11733
72        r3les = 17.269
73        r3ies = 21.875
74        r4les = 35.86
75        r4ies = 7.66
76        retv = 0.6077667
77        rtt  = 273.16
78
79c-- Calcul de Qsat en chaque point
80c-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
81c   pour eviter une exponentielle.
82        DO l = 1, llm
83         DO ij = 1, ip1jmp1
84          tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
85         ENDDO
86         DO ij = 1, ip1jmp1
87          zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
88          play   = 0.5*(p(ij,l)+p(ij,l+1))
89          qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
90          qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
91         ENDDO
92        ENDDO
93
94
95c      PRINT*,'Debut vlsplt version debug sans vlyqs'
96
97        zzpbar = 0.5 * pdt
98        zzw    = pdt
99      DO l=1,llm
100        DO ij = iip2,ip1jm
101            mu(ij,l)=pbaru(ij,l) * zzpbar
102         ENDDO
103         DO ij=1,ip1jm
104            mv(ij,l)=pbarv(ij,l) * zzpbar
105         ENDDO
106         DO ij=1,ip1jmp1
107            mw(ij,l)=w(ij,l) * zzw
108         ENDDO
109      ENDDO
110
111      DO ij=1,ip1jmp1
112         mw(ij,llm+1)=0.
113      ENDDO
114
115      CALL SCOPY(ijp1llm,q,1,zq,1)
116      CALL SCOPY(ijp1llm,masse,1,zm,1)
117
118c      call minmaxq(zq,qmin,qmax,'avant vlxqs     ')
119      call vlxqs(zq,pente_max,zm,mu,qsat)
120
121
122c     call minmaxq(zq,qmin,qmax,'avant vlyqs     ')
123
124      call vlyqs(zq,pente_max,zm,mv,qsat)
125
126
127c      call minmaxq(zq,qmin,qmax,'avant vlz     ')
128
129      call vlz(zq,pente_max,zm,mw)
130
131
132c     call minmaxq(zq,qmin,qmax,'avant vlyqs     ')
133c     call minmaxq(zm,qmin,qmax,'M avant vlyqs     ')
134
135      call vlyqs(zq,pente_max,zm,mv,qsat)
136
137
138c     call minmaxq(zq,qmin,qmax,'avant vlxqs     ')
139c     call minmaxq(zm,qmin,qmax,'M avant vlxqs     ')
140
141      call vlxqs(zq,pente_max,zm,mu,qsat)
142
143c     call minmaxq(zq,qmin,qmax,'apres vlxqs     ')
144c     call minmaxq(zm,qmin,qmax,'M apres vlxqs     ')
145
146
147      DO l=1,llm
148         DO ij=1,ip1jmp1
149           q(ij,l)=zq(ij,l)
150         ENDDO
151         DO ij=1,ip1jm+1,iip1
152            q(ij+iim,l)=q(ij,l)
153         ENDDO
154      ENDDO
155
156      RETURN
157      END
158      SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat)
159c
160c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
161c
162c    ********************************************************************
163c     Shema  d'advection " pseudo amont " .
164c    ********************************************************************
165c
166c   --------------------------------------------------------------------
167      IMPLICIT NONE
168c
169#include "dimensions.h"
170#include "paramet.h"
171c
172c
173c   Arguments:
174c   ----------
175      REAL masse(ip1jmp1,llm),pente_max
176      REAL u_m( ip1jmp1,llm )
177      REAL q(ip1jmp1,llm)
178      REAL qsat(ip1jmp1,llm)
179c
180c      Local
181c   ---------
182c
183      INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju
184      INTEGER n0,iadvplus(ip1jmp1,llm),nl(llm)
185c
186      REAL new_m,zu_m,zdum(ip1jmp1,llm)
187      REAL dxq(ip1jmp1,llm),dxqu(ip1jmp1)
188      REAL zz(ip1jmp1)
189      REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
190      REAL u_mq(ip1jmp1,llm)
191
192      Logical first,testcpu
193      SAVE first,testcpu
194
195      REAL      SSUM
196      EXTERNAL  SSUM
197      REAL temps0,temps1,temps2,temps3,temps4,temps5
198      SAVE temps0,temps1,temps2,temps3,temps4,temps5
199
200
201      DATA first,testcpu/.true.,.false./
202
203      IF(first) THEN
204         temps1=0.
205         temps2=0.
206         temps3=0.
207         temps4=0.
208         temps5=0.
209         first=.false.
210      ENDIF
211
212c   calcul de la pente a droite et a gauche de la maille
213
214
215      IF (pente_max.gt.-1.e-5) THEN
216c     IF (pente_max.gt.10) THEN
217
218c   calcul des pentes avec limitation, Van Leer scheme I:
219c   -----------------------------------------------------
220
221c   calcul de la pente aux points u
222         DO l = 1, llm
223            DO ij=iip2,ip1jm-1
224               dxqu(ij)=q(ij+1,l)-q(ij,l)
225c              IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
226c              sigu(ij)=u_m(ij,l)/masse(ij,l)
227            ENDDO
228            DO ij=iip1+iip1,ip1jm,iip1
229               dxqu(ij)=dxqu(ij-iim)
230c              sigu(ij)=sigu(ij-iim)
231            ENDDO
232
233            DO ij=iip2,ip1jm
234               adxqu(ij)=abs(dxqu(ij))
235            ENDDO
236
237c   calcul de la pente maximum dans la maille en valeur absolue
238
239            DO ij=iip2+1,ip1jm
240               dxqmax(ij,l)=pente_max*
241     ,      min(adxqu(ij-1),adxqu(ij))
242c limitation subtile
243c    ,      min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij)))
244         
245
246            ENDDO
247
248            DO ij=iip1+iip1,ip1jm,iip1
249               dxqmax(ij-iim,l)=dxqmax(ij,l)
250            ENDDO
251
252            DO ij=iip2+1,ip1jm
253#ifdef CRAY
254               dxq(ij,l)=
255     ,         cvmgp(dxqu(ij-1)+dxqu(ij),0.,dxqu(ij-1)*dxqu(ij))
256#else
257               IF(dxqu(ij-1)*dxqu(ij).gt.0) THEN
258                  dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
259               ELSE
260c   extremum local
261                  dxq(ij,l)=0.
262               ENDIF
263#endif
264               dxq(ij,l)=0.5*dxq(ij,l)
265               dxq(ij,l)=
266     ,         sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
267            ENDDO
268
269         ENDDO ! l=1,llm
270
271      ELSE ! (pente_max.lt.-1.e-5)
272
273c   Pentes produits:
274c   ----------------
275
276         DO l = 1, llm
277            DO ij=iip2,ip1jm-1
278               dxqu(ij)=q(ij+1,l)-q(ij,l)
279            ENDDO
280            DO ij=iip1+iip1,ip1jm,iip1
281               dxqu(ij)=dxqu(ij-iim)
282            ENDDO
283
284            DO ij=iip2+1,ip1jm
285               zz(ij)=dxqu(ij-1)*dxqu(ij)
286               zz(ij)=zz(ij)+zz(ij)
287               IF(zz(ij).gt.0) THEN
288                  dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))
289               ELSE
290c   extremum local
291                  dxq(ij,l)=0.
292               ENDIF
293            ENDDO
294
295         ENDDO
296
297      ENDIF ! (pente_max.lt.-1.e-5)
298
299c   bouclage de la pente en iip1:
300c   -----------------------------
301
302      DO l=1,llm
303         DO ij=iip1+iip1,ip1jm,iip1
304            dxq(ij-iim,l)=dxq(ij,l)
305         ENDDO
306
307         DO ij=1,ip1jmp1
308            iadvplus(ij,l)=0
309         ENDDO
310
311      ENDDO
312
313
314c   calcul des flux a gauche et a droite
315
316#ifdef CRAY
317c--pas encore modification sur Qsat
318      DO l=1,llm
319       DO ij=iip2,ip1jm-1
320          zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l),
321     ,                     1.+u_m(ij,l)/masse(ij+1,l),
322     ,                     u_m(ij,l))
323          zdum(ij,l)=0.5*zdum(ij,l)
324          u_mq(ij,l)=cvmgp(
325     ,                q(ij,l)+zdum(ij,l)*dxq(ij,l),
326     ,                q(ij+1,l)-zdum(ij,l)*dxq(ij+1,l),
327     ,                u_m(ij,l))
328          u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l)
329       ENDDO
330      ENDDO
331#else
332c   on cumule le flux correspondant a toutes les mailles dont la masse
333c   au travers de la paroi pENDant le pas de temps.
334c   le rapport de melange de l'air advecte est min(q_vanleer, Qsat_downwind)
335      DO l=1,llm
336       DO ij=iip2,ip1jm-1
337          IF (u_m(ij,l).gt.0.) THEN
338             zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
339             u_mq(ij,l)=u_m(ij,l)*
340     $         min(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
341          ELSE
342             zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
343             u_mq(ij,l)=u_m(ij,l)*
344     $         min(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
345          ENDIF
346       ENDDO
347      ENDDO
348#endif
349
350
351c   detection des points ou on advecte plus que la masse de la
352c   maille
353      DO l=1,llm
354         DO ij=iip2,ip1jm-1
355            IF(zdum(ij,l).lt.0) THEN
356               iadvplus(ij,l)=1
357               u_mq(ij,l)=0.
358            ENDIF
359         ENDDO
360      ENDDO
361      DO l=1,llm
362       DO ij=iip1+iip1,ip1jm,iip1
363          iadvplus(ij,l)=iadvplus(ij-iim,l)
364       ENDDO
365      ENDDO
366
367
368
369c   traitement special pour le cas ou on advecte en longitude plus que le
370c   contenu de la maille.
371c   cette partie est mal vectorisee.
372
373c   pas d'influence de la pression saturante (pour l'instant)
374
375c  calcul du nombre de maille sur lequel on advecte plus que la maille.
376
377      n0=0
378      DO l=1,llm
379         nl(l)=0
380         DO ij=iip2,ip1jm
381            nl(l)=nl(l)+iadvplus(ij,l)
382         ENDDO
383         n0=n0+nl(l)
384      ENDDO
385
386      IF(n0.gt.1) THEN
387ccc      PRINT*,'Nombre de points pour lesquels on advect plus que le'
388ccc     &       ,'contenu de la maille : ',n0
389
390         DO l=1,llm
391            IF(nl(l).gt.0) THEN
392               iju=0
393c   indicage des mailles concernees par le traitement special
394               DO ij=iip2,ip1jm
395                  IF(iadvplus(ij,l).eq.1.and.mod(ij,iip1).ne.0) THEN
396                     iju=iju+1
397                     indu(iju)=ij
398                  ENDIF
399               ENDDO
400               niju=iju
401c              PRINT*,'niju,nl',niju,nl(l)
402
403c  traitement des mailles
404               DO iju=1,niju
405                  ij=indu(iju)
406                  j=(ij-1)/iip1+1
407                  zu_m=u_m(ij,l)
408                  u_mq(ij,l)=0.
409                  IF(zu_m.gt.0.) THEN
410                     ijq=ij
411                     i=ijq-(j-1)*iip1
412c   accumulation pour les mailles completements advectees
413                     do while(zu_m.gt.masse(ijq,l))
414                        u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
415                        zu_m=zu_m-masse(ijq,l)
416                        i=mod(i-2+iim,iim)+1
417                        ijq=(j-1)*iip1+i
418                     ENDDO
419c   ajout de la maille non completement advectee
420                     u_mq(ij,l)=u_mq(ij,l)+zu_m*
421     &               (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
422                  ELSE
423                     ijq=ij+1
424                     i=ijq-(j-1)*iip1
425c   accumulation pour les mailles completements advectees
426                     do while(-zu_m.gt.masse(ijq,l))
427                        u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
428                        zu_m=zu_m+masse(ijq,l)
429                        i=mod(i,iim)+1
430                        ijq=(j-1)*iip1+i
431                     ENDDO
432c   ajout de la maille non completement advectee
433                     u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
434     &               0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
435                  ENDIF
436               ENDDO
437            ENDIF
438         ENDDO
439      ENDIF  ! n0.gt.0
440
441
442
443c   bouclage en latitude
444
445      DO l=1,llm
446        DO ij=iip1+iip1,ip1jm,iip1
447           u_mq(ij,l)=u_mq(ij-iim,l)
448        ENDDO
449      ENDDO
450
451
452c   calcul des tendances
453
454      DO l=1,llm
455         DO ij=iip2+1,ip1jm
456            new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
457            q(ij,l)=(q(ij,l)*masse(ij,l)+
458     &      u_mq(ij-1,l)-u_mq(ij,l))
459     &      /new_m
460            masse(ij,l)=new_m
461         ENDDO
462c   Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
463         DO ij=iip1+iip1,ip1jm,iip1
464            q(ij-iim,l)=q(ij,l)
465            masse(ij-iim,l)=masse(ij,l)
466         ENDDO
467      ENDDO
468
469c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
470c     CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
471
472
473      RETURN
474      END
475      SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat)
476c
477c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
478c
479c    ********************************************************************
480c     Shema  d'advection " pseudo amont " .
481c    ********************************************************************
482c     q,masse_adv_v,w sont des arguments d'entree  pour le s-pg ....
483c     qsat             est   un argument de sortie pour le s-pg ....
484c
485c
486c   --------------------------------------------------------------------
487      USE comconst_mod, ONLY: pi
488
489      IMPLICIT NONE
490c
491#include "dimensions.h"
492#include "paramet.h"
493#include "comgeom.h"
494c
495c
496c   Arguments:
497c   ----------
498      REAL masse(ip1jmp1,llm),pente_max
499      REAL masse_adv_v( ip1jm,llm)
500      REAL q(ip1jmp1,llm)
501      REAL qsat(ip1jmp1,llm)
502c
503c      Local
504c   ---------
505c
506      INTEGER i,ij,l
507c
508      REAL airej2,airejjm,airescb(iim),airesch(iim)
509      REAL dyq(ip1jmp1,llm),dyqv(ip1jm)
510      REAL adyqv(ip1jm),dyqmax(ip1jmp1)
511      REAL qbyv(ip1jm,llm)
512
513      REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
514c     REAL newq,oldmasse
515      Logical first,testcpu
516      REAL temps0,temps1,temps2,temps3,temps4,temps5
517      SAVE temps0,temps1,temps2,temps3,temps4,temps5
518      SAVE first,testcpu
519
520      REAL convpn,convps,convmpn,convmps
521      REAL sinlon(iip1),sinlondlon(iip1)
522      REAL coslon(iip1),coslondlon(iip1)
523      SAVE sinlon,coslon,sinlondlon,coslondlon
524      SAVE airej2,airejjm
525c
526c
527      REAL      SSUM
528      EXTERNAL  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     apn=abs(dyq(1)/dyqv(iip1+1))
632C     PRINT*,dyq(ip1jm+1)
633C     PRINT*,dyqv(ip1jm-iip1+1)
634C     aps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))
635C     DO ij=2,iim
636C        apn=amax1(abs(dyq(ij)/dyqv(ij)),apn)
637C        aps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),aps)
638C     ENDDO
639C     apn=min(pente_max/apn,1.)
640C     aps=min(pente_max/aps,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    &   apn=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    &   aps=0.
650C
651C   limitation des pentes aux poles
652C     DO ij=1,iip1
653C        dyq(ij)=apn*dyq(ij)
654C        dyq(ip1jm+ij)=aps*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.