!copyright (C) 2001  MSC-RPN COMM  %%%RPNPHY%%%
***S/P  CONRES1
*
#include "phy_macros_f.h"

      SUBROUTINE CONRES1(RI,GAMA,GAMAQ,FN,T,TVE,Q,QE,PS,HOL,SIGMA,SE,S, 1,1
     %                      QC,N,M,NK)
#include "impnone.cdk"
*
      INTEGER N,M,NK,j,k
*
      REAL RI(N,NK),GAMA(N,NK),GAMAQ(N,NK),FN(N,NK)
      REAL T(M,NK),TVE(N,NK),Q(M,NK),QE(N,NK)
      REAL PS(N),HOL(N)
      REAL SIGMA(n,NK),SE(n,NK),S(N,NK)
      REAL QC(N)
*
      INTEGER MODP
*
      REAL X,TVK,TVN,TVBAR,GAMAA,GAMAV,GAMAVS,FAC,DZ,DLNP
      REAL BETA,GAMAS,AA,RGASD_OV_GRAV,GRAV_OV_CPD
************************************************************************
*     AUTOMATIC ARRAYS
************************************************************************
*
      AUTOMATIC (WORK,REAL   , (N,NK))
      AUTOMATIC (TE  ,REAL   , (N,NK))
      AUTOMATIC (QSAT,REAL   , (N,NK))
      AUTOMATIC (PRES,REAL   , (N,NK))
*
*Author
*        C .Girard RPN March 1993
*
*Revisions
* 001    R. Benoit (August 93) - Local sigma (Sigma, SE (2D))
* 002    C .Girard (March 96) - Clean-up and New shallow convection
* 003    M. Lepine (March 2003) -  CVMG... Replacements
* 004    A. Plante (May 2003) - IBM conversion
*           - replace CVMG* by if/else statements
*           - calls to vslog routine (from massvp4 library)
*           - calls to optimized routin mfoqst
*           - constantes precomputations
*
*Object
*        Parameterization of certain effects of shallow convection:
*        -Estimate a convective cloud fraction which will interact
*         with radiation schemes
*        -Modify the stability through Ri for all diffused variables
*         including wind
*        -Modify the equilibrium gradients of temperature and moisture
*
*
*Arguments
*
*          -Input/Output-
* RI       nombre de Richardson
* GAMA     Gradient at equilibrium for temperature
* GAMAQ    Gradient at equilibrium for moisture
* FN       Cloud fraction related to shallow convection
*
*          -Input-
* T        Temperature (M,NK)
* TVE      Virtual Temperature at level 'E' (N,NK)
* Q        Specific humidity(M,NK)
* QE       Specific humidity at level 'E' (N,NK)
* PS       surface pressure (N)
* HOL      Indicator of stability in the boundary layer (N)
*                 (Unstable when negative)
* SIGMA    Sigma level (n,NK)
* SE       Sigma level for 'E' (n,NK)
* N        Horizontal dimension
* M        1st dimension of T and Q in the calling program
* NK       vertical dimension
*
*          -Work-
* QC       specific humidity of cloud (N)
*
**
*
*
#
#include "consphy.cdk"
#include "dintern.cdk"
#include "fintern.cdk"
*
      RGASD_OV_GRAV=RGASD/GRAV
      GRAV_OV_CPD=GRAV/CPD
*
      DO j=1,N
*
*           POSSIBILITE DE PRESENCE D'UN NUAGE CONVECTIF:
*             QC=QNK    -AU-DESSUS D'UNE COUCHE LIMITE INSTABLE
*
         if (-HOL(j) .ge. 0.) then
            QC(j) = Q(j,NK)
         else
            QC(j) = 0.
         endif
*
      END DO
*
*     Precomputations for optimisation on IBM
      DO k=1,NK
         DO j=1,N
            WORK(j,k)=SIGMA(j,NK)/SIGMA(j,k)
            TE(j,k)=FOTTV(TVE(j,k),QE(j,k))
            PRES(j,k)=SE(j,k)*PS(j)
         END DO
      END DO
      call vslog(WORK,WORK,N*NK)
*
      MODP=3
*     NOTE : SE IS NOT USED IN MODE MODP=3.
      CALL MFOQST(QSAT,TE,SE,PRES,MODP,N,NK,N)
*
      DO k=NK-1,2,-1
         DO j=1,N
*
*           CALCUL DE TVK, TVN ET TVBAR
*
            TVK = FOTVT(T(j,k),Q(j,k))
            TVN = FOTVT(T(j,NK),Q(j,NK))
            TVBAR = 0.5*(TVK+TVN)
*
*           CALCUL APPROX. DE GAMAV
*
            DZ = RGASD_OV_GRAV*TVBAR*WORK(J,K)
            GAMAV = (TVK-TVN)/DZ + GRAV_OV_CPD
*
*           CALCUL APPROX. DE GAMAVS
*
            BETA=1.35E7*QSAT(j,k)/(TE(j,k)*TVE(j,k))
            GAMAS=GRAV_OV_CPD*(1.-6.46E-4*TE(j,k))*BETA/(1.+BETA)
*
            GAMAVS=(TVE(j,k)/TE(j,k))*GAMAS
*
*           CALCUL DU RAPPORT: -GAMAV/GAMAVS
*
            X = - GAMAV/GAMAVS
*
*           DOIT ETRE ENTRE -1. ET 0.
*
            X = MAX(-1.,MIN(0.,X))
*
*           CALCUL DE LA FRACTION NUAGEUSE: FN
*            (variante de la formule de Bjerknes)
*
            FN(j,k) = (1+X)/(2+X)
*
*           QC S'EVANOUIT LORSQUE FN=0
*
            if (FN(j,k) .eq. 0.)then
               QC(j) = 0.
            endif
*
*           FN S'EVANOUIT A SON TOUR SI QC.LT.QSAT
*
            if (QC(j).LT.QSAT(j,k))then
               FN(j,k) = 0.
            endif
*
*           CALCUL DE GAMA = AA x GAMAS
*
            AA=SQRT(FN(j,k))
            GAMAA=AA*GAMAS
*
*           MODIFICATION DE RI
*
            FAC = GRAV / ( TE(j,k) * S(j,k) )
            RI(j,k) =  RI(j,k) - FAC * GAMAA
*
            GAMA(j,k) = GAMA(j,k) + GAMAA
*
            GAMAQ(j,k) = GAMAQ(j,k)
*
         END DO
      END DO
*
      RETURN
      END