source: LMDZ6/trunk/libf/dyn3d/vlsplt.F90 @ 5274

Last change on this file since 5274 was 5272, checked in by abarral, 9 months ago

Turn paramet.h into a module

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