source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/vlsplt_loc.f90 @ 5116

Last change on this file since 5116 was 5116, checked in by abarral, 2 months ago

rename modules properly lmdz_*
move ismin, ismax, minmax into new lmdz_libmath.f90
(lint) uppercase fortran keywords

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