!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer, 
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms 
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer 
!version 3 or (at your option) any later version that should be found at: 
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html 
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software; 
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), 
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
***S/P MPRECIP4
*
#include "phy_macros_f.h"

      SUBROUTINE MPRECIP4  (T, Q, R, W, PS, KCL, SATUCO, 1,13
     +                      S , TAU ,ITADJ, MAXADJ, NSUPS,
     +                      N, NK, KA, NDIM)
*
#include "impnone.cdk"
*
      INTEGER N,NK,NDIM,KA
      INTEGER MAXADJ,NSUPS,ITADJ(MAXADJ)
      REAL T(NDIM,NK),Q(NDIM,NK),R(N),W(NDIM,NK),PS(N),KCL(N)
      REAL S(n,NK)
      REAL TAU
      LOGICAL SATUCO
*
*Author
*          R. Benoit RPN(Nov 1979)( RFE )
*
*Revision
* 001      C. Beaudoin RPN(Nov 83)( SEF )
* 002      J. Cote RPN(June 85)( Optimization , Documentation )
* 003      M. Lepine  -  RFE model code revision project (Jan87)
*                     -  Add parameter NDIM
*                     -  Add a list of adjustment counters
*          R. Benoit  - conversions TV <-> T for before/after
*                       convective adjustment
* 004      M. Lepine  -  Initialize NADJ (Feb 88)
* 005      N. Brunet  (May90)
*              Standardization of thermodynamic functions
* 006      H. Ritchie, A.M. Leduc, C. Girard  (May91)
*              Change the call ABORT to call STOP(for ITER too big)
*          N. Brunet  (May91)
*              New version of thermodynamic functions
*              and file of constants
* 007      R. Benoit (Aug 93) Local Sigma
* 008      G. Pellerin (Nov93) adaptation to MACROTASKING in EFR
*              Change call to MCONADJ
*              Change name from MPRECIP to MPRECIP2
* 009      B. Bilodeau (June 1994)  New physics interface
* 010      B. Bilodeau (Jan  1997) Dynamic memory allocation for F
*
*Object
*          to control moist convective adjustment and calculate
*          instantaneous rate
*
*Arguments
*
*          - Input/Output -
* T        temperature
* Q        specific humidity
*
*          - Output -
* R        instantaneous rate of precipitation
*
*          - Input -
* W        vertical motion
* PS       surface pressure
* KCL      index of 1st level in the boundary layer - 3 (N)
* SATUCO   .TRUE. if water/ice phase for saturation
*          .FALSE. if water phase only for saturation
* S        sigma levels
* TAU      FACTDT * timestep (see common block OPTIONS)
*
*          - Output -
* ITADJ    number of points requiring more adjustment after iteration
*          (maximum of MAXADJ iterations)
*
*          - Input -
* MAXADJ   dimension of ITADJ
*
*          - Input/Output -
* NSUPS    counter of number of points for more iterations (if
*          necessary) and with GAC>0
*
*          - Input -
* N        horizontal dimension
* NK       vertical dimension
* KA       level to extract
* NDIM     1st dimension of T, Q, and W
*
*
*Notes
*          We must use the compatible versions of MCONADJ2 and WETCON2
*
*IMPLICITES
*
#include "acmcon.cdk"
*
*MODULES
*
      EXTERNAL MCONADJ2, WETCON2
*
*      SCATTER/GATHER SIMPLE ET MULTIPLE
*
      EXTERNAL SCATTER, GATHER, VSCATR, VGATHR
*
*
**
*
************************************************************************
*     AUTOMATIC ARRAYS
************************************************************************
*
*     careful with dimension of stawsj
      AUTOMATIC ( STAWSJ  , REAL    , (N,KA-1,6   ) )
      AUTOMATIC ( DELWETJ , REAL    , (N,NK       ) )
*
      AUTOMATIC ( F       , INTEGER , (N*6        ) )
      AUTOMATIC ( G       , INTEGER , (10*N*(NK+1)) )
*
************************************************************************
*
*
      INTEGER RDOT,NADJ
      INTEGER DQ,DT,H,HS,P,QS
      INTEGER IT,IQ,IR,IW,IPS,IKCL,IMAX,ITER,I,J,K,KREP,NN
      INTEGER IKZ
      integer ista, idel, is
*
#include "consphy.cdk"
#include "dintern.cdk"
#include "fintern.cdk"
      DO 6 I=1,MAXADJ
    6    ITADJ(I) = 0
*
      DO 10 J=1,N
         R(J) = 0.0
   10 CONTINUE
      DO 15 K=1,NK
         DO 15 J=1,N
            Q(J,K) = MAX( Q(J,K) , 0.0 )
   15 CONTINUE
*
      KREP = NK/2+1
      ITER = 0
16    CONTINUE
      NADJ = 0
      RDOT = 0
*
      DQ  = 1
      DT  = DQ  + N
      H   = DT  + N
      HS  = H   + N
      P   = HS  + N
      QS  = P   + N
      IMAX = QS + N - 1
*
*     prepare stawsj, delwetj (from 2D sigma)
*
      call wetcon2(stawsj, s, delwetj, n, ka, ka.lt.nk)
*
      CALL MCONADJ2( T , Q , R , W(1,KREP) , PS , KCL ,
     $              STAWSj , DELWETj ,
     %              S , F(DQ) , F(DT) , F(H) , F(HS) , F(P) ,
     %              F(QS) , NADJ , ITER , N , NK ,
     %              KA, NDIM, SATUCO)
*

      NADJ = 0
      DO 20 I = 1,N
         IF ( F(DQ+I-1) .GT. 0 ) THEN
            NADJ = NADJ + 1
            F(NADJ) = I
         END IF
   20 CONTINUE
*
*
      ITADJ(ITER)=NADJ
25    IF ( NADJ.GT.0 ) THEN
*
         IF ( ITER.EQ.ABS( ITRMAX ) ) THEN
            IF ( ITRMAX.LT.0 ) THEN
               PRINT *,'ARRET DANS MPRECIP ITER = ',ITER
                CALL ABORT
            ELSE
               PRINT *,'RETOUR DE MPRECIP ITER = ',ITER
               GO TO 35
            ENDIF
         ENDIF
*
         DQ  = 1
         DT  = DQ  + NADJ
         H   = DT  + NADJ
         HS  = H   + NADJ
         P   = HS  + NADJ
         QS  = P   + NADJ
*
         IT  = QS + NADJ
         IQ  = IT + NADJ * NK
         IR  = IQ + NADJ * NK
         ista= ir + nadj
         idel= ista+nadj*(ka-1)*6
         is  = idel+nadj*nk
         IW  = Is + NADJ*nk
         IPS = IW + NADJ
         IKCL = IPS + NADJ
         IMAX = IKCL + NADJ - 1
*
*        ALLOCATION DU CHAMP DE TRAVAIL G
c        IF(ITER.EQ.1) THEN
c           ALLOCATE ( G(IMAX) )
c        ENDIF
*
         CALL VGATHR(G(IT),NADJ,T,NDIM,NK,F)
         CALL VGATHR(G(IQ),NADJ,Q,NDIM,NK,F)
         CALL VGATHR(G(ista),NADJ,stawsj,N,(ka-1)*6,F)
         CALL VGATHR(G(Idel),NADJ,delwetj,N,NK,F)
         CALL VGATHR(G(Is),NADJ,s,N,NK,F)
         CALL GATHER(NADJ,G(IR),R,F)
         CALL GATHER(NADJ,G(IKCL),KCL,F)
         CALL GATHER(NADJ,G(IW),W(1,KREP),F)
         CALL GATHER(NADJ,G(IPS),PS,F)
*
         CALL MCONADJ2 ( G(IT) , G(IQ) , G(IR) , G(IW) , G(IPS) ,
     X                  G(IKCL) , G(iSTA) , G(iDEL) , G(iS) ,
     Y                  G(DQ) , G(DT) , G(H) , G(HS) , G(P) , G(QS) ,
     Z                  NN , ITER , NADJ , NK ,
     %                  KA, NADJ, SATUCO)
*
         CALL SCATTER(NADJ,R,F,G(IR))
         CALL VSCATR(G(IT),NADJ,T,NDIM,NK,F)
         CALL VSCATR(G(IQ),NADJ,Q,NDIM,NK,F)
*
         NN = 0
         DO 32 I = 1,NADJ
            IF ( G(DQ+I-1) .GT. 0 ) THEN
               NN = NN + 1
               F(NN) = F(I)
            END IF
   32    CONTINUE
*
         IF ( ITER .EQ. 2 ) THEN
            RDOT = 0
            DO 33 I = 1,NADJ
               IF ( G(QS+I-1) .GT. 0 ) RDOT = RDOT + 1
   33       CONTINUE
         END IF
*
         IF(ITER.LE.MAXADJ) ITADJ(ITER) = NN
         IF(ITER.EQ.MAXADJ) PRINT *,(G(IKZ),IKZ=1,NADJ)
*
         NADJ = NN
*
         GOTO 25
*
      ENDIF
*
*
   35 DO 40 J=1,N
         R(J) = -1. * DEPTH * PS(J) * R(J)/TAU
   40    CONTINUE
      NSUPS = NSUPS + RDOT
*
      DO 50  K=1,NK
         DO 50 J=1,N
   50       Q(J,K) = MAX( Q(J,K) , 0.0 )

*
*
      RETURN
      CONTAINS
#include "fintern90.cdk"
      END