source: LMDZ5/trunk/libf/dyn3dmem/vlspltqs_loc.F @ 2598

Last change on this file since 2598 was 2597, checked in by Ehouarn Millour, 8 years ago

Cleanup in the dynamics: get rid of comconst.h, make it a module comconst_mod.
EM

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