source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlsplt_loc.F @ 5101

Last change on this file since 5101 was 5101, checked in by abarral, 3 months ago

Handle DEBUG_IO in lmdz_cppkeys_wrapper.F90
Transform some files .F -> .[fF]90
[ne compile pas à cause de writefield_u non défini - en attente de réponse Laurent]

  • 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
  • Property svn:keywords set to Id
File size: 33.6 KB
Line 
1
2! $Id: vlsplt_loc.F 5101 2024-07-23 06:22:55Z abarral $
3
4      RECURSIVE SUBROUTINE vlx_loc(q,pente_max,masse,u_m,ijb_x,ije_x,iq)
5
6c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
7c
8c    ********************************************************************
9c     Shema  d'advection " pseudo amont " .
10c    ********************************************************************
11c     nq,iq,q,pbaru,pbarv,w sont des arguments d'entree  pour le s-pg ....
12c
13c
14c   --------------------------------------------------------------------
15      USE parallel_lmdz
16      USE infotrac, ONLY: nqtot,tracers, ! CRisi                 &
17     &                     min_qParent,min_qMass,min_ratio ! MVals et CRisi
18      IMPLICIT NONE
19c
20      include "dimensions.h"
21      include "paramet.h"
22      include "iniprint.h"
23c
24c
25c   Arguments:
26c   ----------
27      REAL masse(ijb_u:ije_u,llm,nqtot),pente_max
28      REAL u_m( ijb_u:ije_u,llm),pbarv( iip1,jjb_v:jje_v,llm)
29      REAL q(ijb_u:ije_u,llm,nqtot) ! CRisi: ajout dimension nqtot
30      REAL w(ijb_u:ije_u,llm)
31      INTEGER iq ! CRisi
32c
33c      Local
34c   ---------
35c
36      INTEGER ij,l,j,i,iju,ijq,indu(ijnb_u),niju
37      INTEGER n0,iadvplus(ijb_u:ije_u,llm),nl(llm)
38c
39      REAL new_m,zu_m,zdum(ijb_u:ije_u,llm)
40      REAL sigu(ijb_u:ije_u),dxq(ijb_u:ije_u,llm),dxqu(ijb_u:ije_u)
41      REAL zz(ijb_u:ije_u)
42      REAL adxqu(ijb_u:ije_u),dxqmax(ijb_u:ije_u,llm)
43      REAL u_mq(ijb_u:ije_u,llm)
44
45      REAL Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
46      INTEGER ifils,iq2 ! CRisi
47
48      Logical extremum
49
50      REAL      SSUM
51
52      REAL z1,z2,z3
53
54      INTEGER ijb,ije,ijb_x,ije_x
55
56      !write(*,*) 'vlsplt 58: entree dans vlx_loc, iq,ijb_x=',
57!     &   iq,ijb_x
58c   calcul de la pente a droite et a gauche de la maille
59
60      ijb=ijb_x
61      ije=ije_x
62
63      if (pole_nord.and.ijb==1) ijb=ijb+iip1
64      if (pole_sud.and.ije==ip1jmp1)  ije=ije-iip1
65
66      IF (pente_max>-1.e-5) THEN
67c       IF (pente_max.gt.10) THEN
68
69c   calcul des pentes avec limitation, Van Leer scheme I:
70c   -----------------------------------------------------
71      ! on a besoin de q entre ijb et ije
72c   calcul de la pente aux points u
73c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
74         DO l = 1, llm
75
76            DO ij=ijb,ije-1
77               dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
78c              IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
79c              sigu(ij)=u_m(ij,l)/masse(ij,l,iq)
80            ENDDO
81            DO ij=ijb+iip1-1,ije,iip1
82               dxqu(ij)=dxqu(ij-iim)
83c              sigu(ij)=sigu(ij-iim)
84            ENDDO
85
86            DO ij=ijb,ije
87               adxqu(ij)=abs(dxqu(ij))
88            ENDDO
89
90c   calcul de la pente maximum dans la maille en valeur absolue
91
92            DO ij=ijb+1,ije
93               dxqmax(ij,l)=pente_max*
94     ,      min(adxqu(ij-1),adxqu(ij))
95c limitation subtile
96c    ,      min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij)))
97
98
99            ENDDO
100
101            DO ij=ijb+iip1-1,ije,iip1
102               dxqmax(ij-iim,l)=dxqmax(ij,l)
103            ENDDO
104
105            DO ij=ijb+1,ije
106               IF(dxqu(ij-1)*dxqu(ij)>0) THEN
107                  dxq(ij,l)=dxqu(ij-1)+dxqu(ij)
108               ELSE
109c   extremum local
110                  dxq(ij,l)=0.
111               ENDIF
112               dxq(ij,l)=0.5*dxq(ij,l)
113               dxq(ij,l)=
114     ,         sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l))
115            ENDDO
116
117         ENDDO ! l=1,llm
118c$OMP END DO NOWAIT
119c       print*,'Ok calcul des pentes'
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)>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
149      !write(*,*) 'vlx 156: iq,ijb_x=',iq,ijb_x
150
151c   bouclage de la pente en iip1:
152c   -----------------------------
153c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
154      DO l=1,llm
155         DO ij=ijb+iip1-1,ije,iip1
156            dxq(ij-iim,l)=dxq(ij,l)
157         ENDDO
158         DO ij=ijb,ije
159            iadvplus(ij,l)=0
160         ENDDO
161
162      ENDDO
163c$OMP END DO NOWAIT
164c        print*,'Bouclage en iip1'
165
166c   calcul des flux a gauche et a droite
167
168
169c   on cumule le flux correspondant a toutes les mailles dont la masse
170c   au travers de la paroi pENDant le pas de temps.
171c       print*,'Cumule ....'
172c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
173        ! on a besoin de masse entre ijb et ije
174      DO l=1,llm
175       DO ij=ijb,ije-1
176c       print*,'masse(',ij,')=',masse(ij,l,iq)
177          IF (u_m(ij,l)>0.) THEN
178             zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq)
179             u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq)
180     :           +0.5*zdum(ij,l)*dxq(ij,l))
181          ELSE
182             zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq)
183             u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq)
184     :           -0.5*zdum(ij,l)*dxq(ij+1,l))
185          ENDIF
186       ENDDO
187      ENDDO
188c$OMP END DO NOWAIT
189
190c   detection des points ou on advecte plus que la masse de la
191c   maille
192c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
193      DO l=1,llm
194         DO ij=ijb,ije-1
195            IF(zdum(ij,l)<0) THEN
196               iadvplus(ij,l)=1
197               u_mq(ij,l)=0.
198            ENDIF
199         ENDDO
200      ENDDO
201c$OMP END DO NOWAIT
202c       print*,'Ok test 1'
203
204c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
205      DO l=1,llm
206       DO ij=ijb+iip1-1,ije,iip1
207          iadvplus(ij,l)=iadvplus(ij-iim,l)
208       ENDDO
209      ENDDO
210c$OMP END DO NOWAIT
211c        print*,'Ok test 2'
212
213
214c   traitement special pour le cas ou on advecte en longitude plus que le
215c   contenu de la maille.
216c   cette partie est mal vectorisee.
217
218c  calcul du nombre de maille sur lequel on advecte plus que la maille.
219
220      n0=0
221c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
222      DO l=1,llm
223         nl(l)=0
224         DO ij=ijb,ije
225            nl(l)=nl(l)+iadvplus(ij,l)
226         ENDDO
227         n0=n0+nl(l)
228      ENDDO
229c$OMP END DO NOWAIT
230cym      IF(n0.gt.1) THEN
231cym      IF(n0.gt.0) THEN
232
233c      PRINT*,'Nombre de points pour lesquels on advect plus que le'
234c     &       ,'contenu de la maille : ',n0
235c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
236
237
238         DO l=1,llm
239            IF(nl(l)>0) THEN
240               iju=0
241c   indicage des mailles concernees par le traitement special
242               DO ij=ijb,ije
243                  IF(iadvplus(ij,l)==1.and.mod(ij,iip1)/=0) THEN
244                     iju=iju+1
245                     indu(iju)=ij
246                  ENDIF
247               ENDDO
248               niju=iju
249               !PRINT*,'vlx 278, niju,nl',niju,nl(l)
250
251c  traitement des mailles
252               DO iju=1,niju
253                  ij=indu(iju)
254                  j=(ij-1)/iip1+1
255                  zu_m=u_m(ij,l)
256                  u_mq(ij,l)=0.
257                  IF(zu_m>0.) THEN
258                     ijq=ij
259                     i=ijq-(j-1)*iip1
260c   accumulation pour les mailles completements advectees
261                     do while(zu_m>masse(ijq,l,iq))
262                        u_mq(ij,l)=u_mq(ij,l)
263     &                          +q(ijq,l,iq)*masse(ijq,l,iq)
264                        zu_m=zu_m-masse(ijq,l,iq)
265                        i=mod(i-2+iim,iim)+1
266                        ijq=(j-1)*iip1+i
267                     ENDDO
268c   ajout de la maille non completement advectee
269                     u_mq(ij,l)=u_mq(ij,l)+zu_m*
270     &               (q(ijq,l,iq)+0.5*
271     &               (1.-zu_m/masse(ijq,l,iq))*dxq(ijq,l))
272                  ELSE
273                     ijq=ij+1
274                     i=ijq-(j-1)*iip1
275c   accumulation pour les mailles completements advectees
276                     do while(-zu_m>masse(ijq,l,iq))
277                        u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq)
278     &                           *masse(ijq,l,iq)
279                        zu_m=zu_m+masse(ijq,l,iq)
280                        i=mod(i,iim)+1
281                        ijq=(j-1)*iip1+i
282                     ENDDO
283c   ajout de la maille non completement advectee
284                     u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)-
285     &               0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l))
286                  ENDIF
287               ENDDO
288            ENDIF
289         ENDDO
290c$OMP END DO NOWAIT
291cym      ENDIF  ! n0.gt.0
292
293c   bouclage en latitude
294c       print*,'Avant bouclage en latitude'
295c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
296      DO l=1,llm
297        DO ij=ijb+iip1-1,ije,iip1
298           u_mq(ij,l)=u_mq(ij-iim,l)
299        ENDDO
300      ENDDO
301c$OMP END DO NOWAIT
302
303! CRisi: appel récursif de l'advection sur les fils.
304! Il faut faire ça avant d'avoir mis à jour q et masse
305
306      do ifils=1,tracers(iq)%nqDescen
307        ! attention: comme Ratio est utilisé comme q dans l'appel
308        ! recursif, il doit contenir à lui seul tous les indices de tous
309        ! les descendants!
310        iq2=tracers(iq)%iqDescen(ifils)
311c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
312        DO l=1,llm
313          DO ij=ijb,ije
314            ! On a besoin de q et masse seulement entre ijb et ije. On ne
315            ! les calcule donc que de ijb à ije
316            !MVals: veiller a ce qu'on n'ait pas de denominateur nul
317            masse(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass)
318            if (q(ij,l,iq)>min_qParent) then ! modif 13 nov 2020
319              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
320            else
321              Ratio(ij,l,iq2)=min_ratio
322            endif
323          enddo
324        enddo
325c$OMP END DO NOWAIT
326      enddo !do ifils=1,tracers(iq)%nqDescen
327      do ifils=1,tracers(iq)%nqChildren
328        iq2=tracers(iq)%iqDescen(ifils)
329        CALL vlx_loc(Ratio,pente_max,masse,u_mq,ijb_x,ije_x,iq2)
330      enddo
331! end CRisi
332
333
334c   calcul des tENDances
335c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
336      DO l=1,llm
337         DO ij=ijb+1,ije
338            !MVals: veiller a ce qu'on n'ait pas de denominateur nul
339            new_m=max(masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l),min_qMass)
340            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+
341     &        u_mq(ij-1,l)-u_mq(ij,l))
342     &        /new_m
343            masse(ij,l,iq)=new_m
344         ENDDO
345c   ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
346         DO ij=ijb+iip1-1,ije,iip1
347            q(ij-iim,l,iq)=q(ij,l,iq)
348            masse(ij-iim,l,iq)=masse(ij,l,iq)
349         ENDDO
350      ENDDO
351c$OMP END DO NOWAIT
352
353! retablir les fils en rapport de melange par rapport a l'air:
354      ! On calcule q entre ijb+1 et ije -> on fait pareil pour ratio
355      ! puis on boucle en longitude
356      do ifils=1,tracers(iq)%nqDescen
357        iq2=tracers(iq)%iqDescen(ifils)
358c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
359        DO l=1,llm
360          DO ij=ijb+1,ije
361            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)
362          enddo
363          DO ij=ijb+iip1-1,ije,iip1
364            q(ij-iim,l,iq2)=q(ij,l,iq2)
365          enddo
366        enddo
367c$OMP END DO NOWAIT
368      enddo
369
370      !write(*,*) 'vlsplt 399: iq,ijb_x=',iq,ijb_x
371c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
372c     CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
373
374
375      RETURN
376      END
377
378
379      RECURSIVE SUBROUTINE vly_loc(q,pente_max,masse,masse_adv_v,iq)
380c
381c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
382c
383c    ********************************************************************
384c     Shema  d'advection " pseudo amont " .
385c    ********************************************************************
386c     q,masse_adv_v,w sont des arguments d'entree  pour le s-pg ....
387c     dq               sont des arguments de sortie pour le s-pg ....
388c
389c
390c   --------------------------------------------------------------------
391      USE parallel_lmdz
392      USE infotrac, ONLY: nqtot,tracers, ! CRisi                 &
393     &                     min_qParent,min_qMass,min_ratio ! MVals et CRisi
394      USE comconst_mod, ONLY: pi
395      IMPLICIT NONE
396c
397      include "dimensions.h"
398      include "paramet.h"
399      include "comgeom.h"
400c
401c
402c   Arguments:
403c   ----------
404      REAL masse(ijb_u:ije_u,llm,nqtot),pente_max
405      REAL masse_adv_v( ijb_v:ije_v,llm)
406      REAL q(ijb_u:ije_u,llm,nqtot), dq( ijb_u:ije_u,llm)
407      INTEGER iq ! CRisi
408c
409c      Local
410c   ---------
411c
412      INTEGER i,ij,l
413c
414      REAL airej2,airejjm,airescb(iim),airesch(iim)
415      REAL dyq(ijb_u:ije_u,llm),dyqv(ijb_v:ije_v),zdvm(ijb_u:ije_u,llm)
416      REAL adyqv(ijb_v:ije_v),dyqmax(ijb_u:ije_u)
417      REAL qbyv(ijb_v:ije_v,llm)
418
419      REAL qpns,qpsn,appn,apps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
420c     REAL newq,oldmasse
421      Logical extremum,first
422      REAL temps0,temps1,temps2,temps3,temps4,temps5,second
423      SAVE temps0,temps1,temps2,temps3,temps4,temps5
424c$OMP THREADPRIVATE(temps0,temps1,temps2,temps3,temps4,temps5)
425      SAVE first
426c$OMP THREADPRIVATE(first)
427
428      REAL convpn,convps,convmpn,convmps
429      real massepn,masseps,qpn,qps
430      REAL sinlon(iip1),sinlondlon(iip1)
431      REAL coslon(iip1),coslondlon(iip1)
432      SAVE sinlon,coslon,sinlondlon,coslondlon
433c$OMP THREADPRIVATE(sinlon,coslon,sinlondlon,coslondlon)
434      SAVE airej2,airejjm
435c$OMP THREADPRIVATE(airej2,airejjm)
436
437      REAL Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
438      INTEGER ifils,iq2 ! CRisi
439c
440c
441      REAL      SSUM
442      EXTERNAL  SSUM
443
444      DATA first/.true./
445      DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
446      INTEGER ijb,ije
447      INTEGER ijbm,ijem
448
449      ijb=ij_begin-2*iip1
450      ije=ij_end+2*iip1
451      if (pole_nord) ijb=ij_begin
452      if (pole_sud)  ije=ij_end
453
454      IF(first) THEN
455         PRINT*,'Shema  Amont nouveau  appele dans  Vanleer   '
456         first=.false.
457         do i=2,iip1
458            coslon(i)=cos(rlonv(i))
459            sinlon(i)=sin(rlonv(i))
460            coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
461            sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
462         ENDDO
463         coslon(1)=coslon(iip1)
464         coslondlon(1)=coslondlon(iip1)
465         sinlon(1)=sinlon(iip1)
466         sinlondlon(1)=sinlondlon(iip1)
467         airej2 = SSUM( iim, aire(iip2), 1 )
468         airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
469      ENDIF
470
471c
472c       PRINT*,'CALCUL EN LATITUDE'
473
474c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
475      DO l = 1, llm
476c
477c   --------------------------------
478c      CALCUL EN LATITUDE
479c   --------------------------------
480
481c   On commence par calculer la valeur du traceur moyenne sur le premier cercle
482c   de latitude autour du pole (qpns pour le pole nord et qpsn pour
483c    le pole nord) qui sera utilisee pour evaluer les pentes au pole.
484
485      if (pole_nord) then
486        DO i = 1, iim
487          airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq)
488        ENDDO
489        qpns   = SSUM( iim,  airescb ,1 ) / airej2
490      endif
491
492      if (pole_sud) then
493        DO i = 1, iim
494          airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq)
495        ENDDO
496        qpsn   = SSUM( iim,  airesch ,1 ) / airejjm
497      endif
498
499c   calcul des pentes aux points v
500
501      ijb=ij_begin-2*iip1
502      ije=ij_end+iip1
503      if (pole_nord) ijb=ij_begin
504      if (pole_sud)  ije=ij_end-iip1
505
506      ! on a besoin de q entre ij_begin-2*iip1 et ij_end+2*iip1
507      ! Si pole sud, entre ij_begin-2*iip1 et ij_end
508      ! Si pole Nord, entre ij_begin et ij_end+2*iip1
509      DO ij=ijb,ije
510         dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq)
511         adyqv(ij)=abs(dyqv(ij))
512      ENDDO
513
514
515c   calcul des pentes aux points scalaires
516      ijb=ij_begin-iip1
517      ije=ij_end+iip1
518      if (pole_nord) ijb=ij_begin+iip1
519      if (pole_sud)  ije=ij_end-iip1
520
521      DO ij=ijb,ije
522         dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
523         dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
524         dyqmax(ij)=pente_max*dyqmax(ij)
525      ENDDO
526
527c   calcul des pentes aux poles
528      IF (pole_nord) THEN
529        DO ij=1,iip1
530           dyq(ij,l)=qpns-q(ij+iip1,l,iq)
531        ENDDO
532
533        dyn1=0.
534        dyn2=0.
535        DO ij=1,iim
536          dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
537          dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
538        ENDDO
539        DO ij=1,iip1
540          dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
541        ENDDO
542
543        DO ij=1,iip1
544         dyq(ij,l)=0.
545        ENDDO
546c ym tout cela ne sert pas a grand chose
547      ENDIF
548
549      IF (pole_sud) THEN
550
551        DO ij=1,iip1
552           dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn
553        ENDDO
554
555        dys1=0.
556        dys2=0.
557
558        DO ij=1,iim
559          dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
560          dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
561        ENDDO
562
563        DO ij=1,iip1
564          dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
565        ENDDO
566
567        DO ij=1,iip1
568         dyq(ip1jm+ij,l)=0.
569        ENDDO
570c ym tout cela ne sert pas a grand chose
571      ENDIF
572
573c   filtrage de la derivee
574
575c   calcul des pentes limites aux poles
576c ym partie inutile
577c      goto 8888
578c      fn=1.
579c      fs=1.
580c      DO ij=1,iim
581c         IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
582c            fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
583c         ENDIF
584c      IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
585c         fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
586c         ENDIF
587c      ENDDO
588c      DO ij=1,iip1
589c         dyq(ij,l)=fn*dyq(ij,l)
590c         dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
591c      ENDDO
592c 8888    continue
593
594
595CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
596C  En memoire de dIFferents tests sur la
597C  limitation des pentes aux poles.
598CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
599C     PRINT*,dyq(1)
600C     PRINT*,dyqv(iip1+1)
601C     appn=abs(dyq(1)/dyqv(iip1+1))
602C     PRINT*,dyq(ip1jm+1)
603C     PRINT*,dyqv(ip1jm-iip1+1)
604C     apps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))
605C     DO ij=2,iim
606C        appn=amax1(abs(dyq(ij)/dyqv(ij)),appn)
607C        apps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),apps)
608C     ENDDO
609C     appn=min(pente_max/appn,1.)
610C     apps=min(pente_max/apps,1.)
611C
612C
613C   cas ou on a un extremum au pole
614C
615C     IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
616C    &   appn=0.
617C     IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
618C    &   dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
619C    &   apps=0.
620C
621C   limitation des pentes aux poles
622C     DO ij=1,iip1
623C        dyq(ij)=appn*dyq(ij)
624C        dyq(ip1jm+ij)=apps*dyq(ip1jm+ij)
625C     ENDDO
626C
627C   test
628C      DO ij=1,iip1
629C         dyq(iip1+ij)=0.
630C         dyq(ip1jm+ij-iip1)=0.
631C      ENDDO
632C      DO ij=1,ip1jmp1
633C         dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))
634C      ENDDO
635C
636C changement 10 07 96
637C     IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
638C    &   THEN
639C        DO ij=1,iip1
640C           dyqmax(ij)=0.
641C        ENDDO
642C     ELSE
643C        DO ij=1,iip1
644C           dyqmax(ij)=pente_max*abs(dyqv(ij))
645C        ENDDO
646C     ENDIF
647C
648C     IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
649C    & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
650C    &THEN
651C        DO ij=ip1jm+1,ip1jmp1
652C           dyqmax(ij)=0.
653C        ENDDO
654C     ELSE
655C        DO ij=ip1jm+1,ip1jmp1
656C           dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))
657C        ENDDO
658C     ENDIF
659C   fin changement 10 07 96
660CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
661
662c   calcul des pentes limitees
663      ijb=ij_begin-iip1
664      ije=ij_end+iip1
665      if (pole_nord) ijb=ij_begin+iip1
666      if (pole_sud)  ije=ij_end-iip1
667
668      DO ij=ijb,ije
669         IF(dyqv(ij)*dyqv(ij-iip1)>0.) THEN
670            dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
671         ELSE
672            dyq(ij,l)=0.
673         ENDIF
674      ENDDO
675
676      ENDDO
677c$OMP END DO NOWAIT
678
679      ijb=ij_begin-iip1
680      ije=ij_end
681      if (pole_nord) ijb=ij_begin
682      if (pole_sud)  ije=ij_end-iip1
683
684c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
685      DO l=1,llm
686       DO ij=ijb,ije
687          IF(masse_adv_v(ij,l)>0) THEN
688              qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)*
689     ,                   0.5*(1.-masse_adv_v(ij,l)
690     ,                   /masse(ij+iip1,l,iq))
691          ELSE
692              qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)*
693     ,                   0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq))
694          ENDIF
695          qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l)
696       ENDDO
697      ENDDO
698c$OMP END DO NOWAIT
699
700! CRisi: appel récursif de l'advection sur les fils.
701! Il faut faire ça avant d'avoir mis à jour q et masse
702!     write(*,*)'vly 689: iq,nqChildren(iq)=',iq,tracers(iq)%nqChildren
703
704      ijb=ij_begin-2*iip1
705      ije=ij_end+2*iip1
706      ijbm=ij_begin-iip1
707      ijem=ij_end+iip1
708      if (pole_nord) ijb=ij_begin
709      if (pole_sud)  ije=ij_end
710      if (pole_nord) ijbm=ij_begin
711      if (pole_sud)  ijem=ij_end
712
713      do ifils=1,tracers(iq)%nqDescen
714        iq2=tracers(iq)%iqDescen(ifils)
715c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
716        DO l=1,llm
717        ! modif des bornes: CRisi 16 nov 2020
718        ! d'abord masse avec bornes corrigées
719          DO ij=ijbm,ijem
720          !MVals: veiller a ce qu'on n'ait pas de denominateur nul
721            masse(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass)
722          enddo
723
724          ! ensuite Ratio avec anciennes bornes
725          DO ij=ijb,ije
726          !MVals: veiller a ce qu'on n'ait pas de denominateur nul
727            if (q(ij,l,iq)>min_qParent) then ! modif 13 nov 2020
728              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
729            else
730              Ratio(ij,l,iq2)=min_ratio
731            endif
732          enddo !DO ij=ijbm,ijem
733        enddo !DO l=1,llm
734c$OMP END DO NOWAIT
735      enddo
736
737      do ifils=1,tracers(iq)%nqChildren
738        iq2=tracers(iq)%iqDescen(ifils)
739        CALL vly_loc(Ratio,pente_max,masse,qbyv,iq2)
740      enddo
741! end CRisi
742
743      ijb=ij_begin
744      ije=ij_end
745      if (pole_nord) ijb=ij_begin+iip1
746      if (pole_sud)  ije=ij_end-iip1
747
748c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
749      DO l=1,llm
750         DO ij=ijb,ije
751            newmasse=masse(ij,l,iq)
752     &         +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
753
754            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l)
755     &         -qbyv(ij-iip1,l))/newmasse
756
757            masse(ij,l,iq)=newmasse
758
759         ENDDO
760
761
762c.-. ancienne version
763c        convpn=SSUM(iim,qbyv(1,l),1)/apoln
764c        convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
765         if (pole_nord) then
766           convpn=SSUM(iim,qbyv(1,l),1)
767           convmpn=ssum(iim,masse_adv_v(1,l),1)
768           massepn=ssum(iim,masse(1,l,iq),1)
769           qpn=0.
770           do ij=1,iim
771              qpn=qpn+masse(ij,l,iq)*q(ij,l,iq)
772           enddo
773           qpn=(qpn+convpn)/(massepn+convmpn)
774           do ij=1,iip1
775              q(ij,l,iq)=qpn
776           enddo
777         endif
778
779c        convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
780c        convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)/apols
781
782         if (pole_sud) then
783
784           convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
785           convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
786           masseps=ssum(iim, masse(ip1jm+1,l,iq),1)
787           qps=0.
788           do ij = ip1jm+1,ip1jmp1-1
789              qps=qps+masse(ij,l,iq)*q(ij,l,iq)
790           enddo
791           qps=(qps+convps)/(masseps+convmps)
792           do ij=ip1jm+1,ip1jmp1
793              q(ij,l,iq)=qps
794           enddo
795         endif
796c.-. fin ancienne version
797
798c._. nouvelle version
799c        convpn=SSUM(iim,qbyv(1,l),1)
800c        convmpn=ssum(iim,masse_adv_v(1,l),1)
801c        oldmasse=ssum(iim,masse(1,l),1)
802c        newmasse=oldmasse+convmpn
803c        newq=(q(1,l)*oldmasse+convpn)/newmasse
804c        newmasse=newmasse/apoln
805c        DO ij = 1,iip1
806c           q(ij,l)=newq
807c           masse(ij,l,iq)=newmasse*aire(ij)
808c        ENDDO
809c        convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
810c        convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
811c        oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
812c        newmasse=oldmasse+convmps
813c        newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
814c        newmasse=newmasse/apols
815c        DO ij = ip1jm+1,ip1jmp1
816c           q(ij,l)=newq
817c           masse(ij,l,iq)=newmasse*aire(ij)
818c        ENDDO
819c._. fin nouvelle version
820      ENDDO
821c$OMP END DO NOWAIT
822
823! retablir les fils en rapport de melange par rapport a l'air:
824      ijb=ij_begin
825      ije=ij_end
826!      if (pole_nord) ijb=ij_begin
827!      if (pole_sud)  ije=ij_end
828
829      do ifils=1,tracers(iq)%nqDescen
830        iq2=tracers(iq)%iqDescen(ifils)
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
839
840
841      RETURN
842      END
843
844
845
846      RECURSIVE SUBROUTINE vlz_loc(q,pente_max,masse,w,ijb_x,ije_x,iq)
847c
848c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
849c
850c    ********************************************************************
851c     Shema  d'advection " pseudo amont " .
852c    ********************************************************************
853c    q,pbaru,pbarv,w sont des arguments d'entree  pour le s-pg ....
854c     dq               sont des arguments de sortie pour le s-pg ....
855c
856c
857c   --------------------------------------------------------------------
858      USE parallel_lmdz
859      USE vlz_mod
860      USE infotrac, ONLY: nqtot,tracers, ! CRisi                 &
861     &                     min_qParent,min_qMass,min_ratio ! MVals et CRisi
862
863      IMPLICIT NONE
864c
865      include "dimensions.h"
866      include "paramet.h"
867      include "iniprint.h"
868c
869c
870c   Arguments:
871c   ----------
872      REAL masse(ijb_u:ije_u,llm,nqtot),pente_max
873      REAL q(ijb_u:ije_u,llm,nqtot)
874      REAL w(ijb_u:ije_u,llm+1,nqtot)
875      INTEGER iq
876c
877c      Local
878c   ---------
879c
880      INTEGER i,ij,l,j,ii
881
882      REAL,DIMENSION(ijb_u:ije_u,llm+1) :: wresi,morig,qorig,dzqorig
883      INTEGER,DIMENSION(ijb_u:ije_u,llm+1) :: lorig
884      INTEGER,SAVE :: countcfl
885!$OMP THREADPRIVATE(countcfl)
886c
887      REAL newmasse
888
889      REAL dzqmax
890      REAL sigw
891
892      REAL temps0,temps1,temps2,temps3,temps4,temps5,second
893      SAVE temps0,temps1,temps2,temps3,temps4,temps5
894c$OMP THREADPRIVATE(temps0,temps1,temps2,temps3,temps4,temps5)
895
896      REAL      SSUM
897
898      DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
899      INTEGER ijb,ije,ijb_x,ije_x
900      LOGICAL,SAVE :: first=.TRUE.
901!$OMP THREADPRIVATE(first)
902
903      !REAL masseq(ijb_u:ije_u,llm,nqtot),Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
904      ! Ces varibles doivent être déclarées en pointer et en save dans
905      ! vlz_loc si on veut qu'elles soient vues par tous les threads.
906      INTEGER ifils,iq2 ! CRisi
907
908
909      IF (first) THEN
910       first=.FALSE.
911      ENDIF
912c    On oriente tout dans le sens de la pression c'est a dire dans le
913c    sens de W
914
915      !write(*,*) 'vlsplt 926: entree dans vlz_loc, iq=',iq
916
917      ijb=ijb_x
918      ije=ije_x
919
920c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
921      DO l=2,llm
922         DO ij=ijb,ije
923            dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq)
924            adzqw(ij,l)=abs(dzqw(ij,l))
925         ENDDO
926      ENDDO
927c$OMP END DO
928
929c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
930      DO l=2,llm-1
931         DO ij=ijb,ije
932            IF(dzqw(ij,l)*dzqw(ij,l+1)>0.) THEN
933                dzq(ij,l)=0.5*(dzqw(ij,l)+dzqw(ij,l+1))
934            ELSE
935                dzq(ij,l)=0.
936            ENDIF
937            dzqmax=pente_max*min(adzqw(ij,l),adzqw(ij,l+1))
938            dzq(ij,l)=sign(min(abs(dzq(ij,l)),dzqmax),dzq(ij,l))
939         ENDDO
940      ENDDO
941c$OMP END DO NOWAIT
942
943c$OMP MASTER
944      DO ij=ijb,ije
945         dzq(ij,1)=0.
946         dzq(ij,llm)=0.
947      ENDDO
948c$OMP END MASTER
949c$OMP BARRIER
950
951!--------------------------------------------------------
952! On repere les points qui violent le CFL (|w| > masse)
953!--------------------------------------------------------
954
955      countcfl=0
956!     print*,'vlz nouveau'
957c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
958      DO l = 2,llm
959         DO ij = ijb,ije
960          IF(  (w(ij,l,iq)>0.AND.w(ij,l,iq)>masse(ij,l,iq))
961     s    .OR. (w(ij,l,iq)<=0.AND.ABS(w(ij,l,iq))>masse(ij,l-1,iq)) )
962     s    countcfl=countcfl+1
963         ENDDO
964      ENDDO
965c$OMP END DO NOWAIT
966
967c ---------------------------------------------------------------
968c  Identification des mailles ou on viole le CFL : w > masse
969c ---------------------------------------------------------------
970
971      IF (countcfl==0) THEN
972
973c ---------------------------------------------------------------
974c   .... calcul des termes d'advection verticale  .......
975c     Dans le cas où le  |w| < masse partout.
976c     Version d'origine
977c     Pourrait etre enleve si on voit que le code plus general
978c     est aussi rapide
979c ---------------------------------------------------------------
980
981c calcul de  - d( q   * w )/ d(sigma)    qu'on ajoute a  dq pour calculer dq
982
983       !write(*,*) 'vlz 982,ijb,ije=',ijb,ije
984c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
985       DO l = 1,llm-1
986         do  ij = ijb,ije
987          IF(w(ij,l+1,iq)>0.) THEN
988             sigw=w(ij,l+1,iq)/masse(ij,l+1,iq)
989             wq(ij,l+1,iq)=w(ij,l+1,iq)*(q(ij,l+1,iq)
990     :           +0.5*(1.-sigw)*dzq(ij,l+1))
991          ELSE
992             sigw=w(ij,l+1,iq)/masse(ij,l,iq)
993             wq(ij,l+1,iq)=w(ij,l+1,iq)*(q(ij,l,iq)
994     :           -0.5*(1.+sigw)*dzq(ij,l))
995          ENDIF
996         ENDDO
997       ENDDO
998c$OMP END DO NOWAIT
999       !write(*,*) 'vlz 1001'
1000
1001      ELSE ! countcfl>=1
1002
1003      IF (prt_level>9) THEN
1004        WRITE(lunout,*)'vlz passage dans le non local'
1005      ENDIF
1006c ---------------------------------------------------------------
1007c  Debut du traitement du cas ou on viole le CFL : w > masse
1008c ---------------------------------------------------------------
1009
1010c Initialisation
1011
1012c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1013       DO l = 2,llm
1014         DO ij = ijb,ije
1015            wresi(ij,l)=w(ij,l,iq)
1016            wq(ij,l,iq)=0.
1017            IF(w(ij,l,iq)>0.) THEN
1018               lorig(ij,l)=l
1019               morig(ij,l)=masse(ij,l,iq)
1020               qorig(ij,l)=q(ij,l,iq)
1021               dzqorig(ij,l)=dzq(ij,l)
1022            ELSE
1023               lorig(ij,l)=l-1
1024               morig(ij,l)=masse(ij,l-1,iq)
1025               qorig(ij,l)=q(ij,l-1,iq)
1026               dzqorig(ij,l)=dzq(ij,l-1)
1027            ENDIF
1028         ENDDO
1029       ENDDO
1030c$OMP END DO NOWAIT
1031
1032c Reindicage vertical en accumulant les flux sur
1033c  les mailles qui viollent le CFL
1034c  on itère jusqu'à ce que tous les poins satisfassent
1035c  le critère
1036      DO WHILE (countcfl>=1)
1037        IF (prt_level>9) THEN
1038          WRITE(lunout,*)'On viole le CFL Vertical sur ',countcfl,' pts'
1039        ENDIF
1040      countcfl=0
1041
1042c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1043      DO l = 2,llm
1044         DO ij = ijb,ije
1045          IF (ABS(wresi(ij,l))>morig(ij,l)) THEN
1046             countcfl=countcfl+1
1047! rm : les 8 lignes ci dessous pourraient sans doute s'ecrire
1048! avec la fonction sign
1049             IF(w(ij,l,iq)>0.) THEN
1050                wresi(ij,l)=wresi(ij,l)-morig(ij,l)
1051                wq(ij,l,iq)=wq(ij,l,iq)+morig(ij,l)*qorig(ij,l)
1052                lorig(ij,l)=lorig(ij,l)+1
1053             ELSE
1054                wresi(ij,l)=wresi(ij,l)+morig(ij,l)
1055                wq(ij,l,iq)=wq(ij,l,iq)-morig(ij,l)*qorig(ij,l)
1056                lorig(ij,l)=lorig(ij,l)-1
1057             ENDIF
1058             ! CRisi 24nov2020: ajout d'un message d'erreur clair au lieu d'un plantage
1059             ! pour seg fault
1060             if (lorig(ij,l)==0) then
1061                CALL abort_gcm("vlz in vlsplt_loc",
1062     :           "unfixable violation of CFL",1)
1063             endif
1064             morig(ij,l)=masse(ij,lorig(ij,l),iq)
1065             qorig(ij,l)=q(ij,lorig(ij,l),iq)
1066             dzqorig(ij,l)=dzq(ij,lorig(ij,l))
1067          ENDIF
1068         ENDDO
1069      ENDDO
1070c$OMP END DO NOWAIT
1071
1072      ENDDO ! WHILE (countcfl>=1)
1073
1074c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1075       DO l = 2,llm
1076         do  ij = ijb,ije
1077          sigw=wresi(ij,l)/morig(ij,l)
1078          IF(w(ij,l,iq)>0.) THEN
1079             wq(ij,l,iq)=wq(ij,l,iq)+wresi(ij,l)*(qorig(ij,l)
1080     :           +0.5*(1.-sigw)*dzqorig(ij,l))
1081          ELSE
1082             wq(ij,l,iq)=wq(ij,l,iq)+wresi(ij,l)*(qorig(ij,l)
1083     :           -0.5*(1.+sigw)*dzqorig(ij,l))
1084          ENDIF
1085         ENDDO
1086       ENDDO
1087c$OMP END DO NOWAIT
1088
1089
1090       ENDIF ! councfl=0
1091
1092
1093
1094c$OMP MASTER
1095       DO ij=ijb,ije
1096          wq(ij,llm+1,iq)=0.
1097          wq(ij,1,iq)=0.
1098       ENDDO
1099c$OMP END MASTER
1100c$OMP BARRIER
1101
1102! CRisi: appel récursif de l'advection sur les fils.
1103! Il faut faire ça avant d'avoir mis à jour q et masse
1104!     write(*,*)'vlsplt 942: iq,nqChildren(iq)=',iq,tracers(iq)%nqChildren
1105      do ifils=1,tracers(iq)%nqDescen
1106        iq2=tracers(iq)%iqDescen(ifils)
1107c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1108        DO l=1,llm
1109          DO ij=ijb,ije
1110           !MVals: veiller a ce qu'on n'ait pas de denominateur nul
1111            masse(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass)
1112            if (q(ij,l,iq)>min_qParent) then
1113              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
1114            else
1115              Ratio(ij,l,iq2)=min_ratio
1116            endif
1117            !wq(ij,l,iq2)=wq(ij,l,iq) ! correction bug le 15mai2015
1118            w(ij,l,iq2)=wq(ij,l,iq)
1119          enddo
1120        enddo
1121c$OMP END DO NOWAIT
1122      enddo
1123c$OMP BARRIER
1124
1125      do ifils=1,tracers(iq)%nqChildren
1126        iq2=tracers(iq)%iqDescen(ifils)
1127        CALL vlz_loc(Ratio,pente_max,masse,w,ijb_x,ije_x,iq2)
1128      enddo
1129! end CRisi
1130
1131! CRisi: On rajoute ici une barrière car on veut être sur que tous les
1132! wq soient synchronisés
1133
1134c$OMP BARRIER
1135c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1136      DO l=1,llm
1137         DO ij=ijb,ije
1138            newmasse=masse(ij,l,iq)+w(ij,l+1,iq)-w(ij,l,iq)
1139            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)
1140     &         +wq(ij,l+1,iq)-wq(ij,l,iq))
1141     &         /newmasse
1142            masse(ij,l,iq)=newmasse
1143         ENDDO
1144      ENDDO
1145c$OMP END DO NOWAIT
1146
1147
1148! retablir les fils en rapport de melange par rapport a l'air:
1149      do ifils=1,tracers(iq)%nqDescen
1150        iq2=tracers(iq)%iqDescen(ifils)
1151c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1152        DO l=1,llm
1153          DO ij=ijb,ije
1154            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)
1155          enddo
1156        enddo
1157c$OMP END DO NOWAIT
1158      enddo
1159
1160      RETURN
1161      END
1162c      SUBROUTINE minmaxq(zq,qmin,qmax,comment)
1163c
1164c      INCLUDE "dimensions.h"
1165c      INCLUDE "paramet.h"
1166
1167c      CHARACTER*(*) comment
1168c      real qmin,qmax
1169c      real zq(ip1jmp1,llm)
1170
1171c      INTEGER jadrs(ip1jmp1), jbad, k, i
1172
1173
1174c      DO k = 1, llm
1175c         jbad = 0
1176c         DO i = 1, ip1jmp1
1177c         IF (zq(i,k).GT.qmax .OR. zq(i,k).LT.qmin) THEN
1178c            jbad = jbad + 1
1179c            jadrs(jbad) = i
1180c         ENDIF
1181c         ENDDO
1182c         IF (jbad.GT.0) THEN
1183c         PRINT*, comment
1184c         DO i = 1, jbad
1185cc            PRINT*, "i,k,zq=", jadrs(i),k,zq(jadrs(i),k)
1186c         ENDDO
1187c         ENDIF
1188c      ENDDO
1189
1190c      return
1191c      end
1192
1193
1194
1195
Note: See TracBrowser for help on using the repository browser.