C $Header: /u/gcmpack/MITgcm/pkg/aim_v23/phy_convmf.F,v 1.1 2002/11/22 17:17:03 jmc Exp $
C $Name:  $

#include "AIM_OPTIONS.h"


      SUBROUTINE CONVMF (PSA,dpFac,SE,QA,QSAT, 1
     O                   IDEPTH,CBMF,PRECNV,DFSE,DFQA,
     I                   kGrd,bi,bj,myThid)
C--
C--   SUBROUTINE CONVMF (PSA,SE,QA,QSAT,
C--  *                   IDEPTH,CBMF,PRECNV,DFSE,DFQA)
C--
C--   Purpose: Compute convective fluxes of dry static energy and moisture
C--            using a simplified mass-flux scheme
C--   Input:   PSA    = norm. surface pressure [p/p0]            (2-dim)
C              dpFac  = cell delta_P fraction                    (3-dim)
C--            SE     = dry static energy                        (3-dim)
C--            QA     = specific humidity [g/kg]                 (3-dim)
C--            QSAT   = saturation spec. hum. [g/kg]             (3-dim)
C--   Output:  IDEPTH = convection depth in layers               (2-dim)
C--            CBMF   = cloud-base mass flux                     (2-dim)
C--            PRECNV = convective precipitation [g/(m^2 s)]     (2-dim)
C--            DFSE   = net flux of d.s.en. into each atm. layer (3-dim)
C--            DFQA   = net flux of sp.hum. into each atm. layer (3-dim)
C    Input:    kGrd   = Ground level index                       (2-dim)
C              bi,bj  = tile index
C              myThid = Thread number for this instance of the routine
C-------
C  Note: dry static energy has been replaced by Pot.Temp.
C-------

      IMPLICIT NONE

C     Resolution parameters

C-- size for MITgcm & Physics package :
#include "AIM_SIZE.h" 

#include "EEPARAMS.h"

C     Physical constants + functions of sigma and latitude

#include "com_physcon.h"

C     Convection constants

#include "com_cnvcon.h"

C-- Routine arguments:
      _RL PSA(NGP), SE(NGP,NLEV), QA(NGP,NLEV), QSAT(NGP,NLEV)
      _RL dpFac(NGP,NLEV)
      INTEGER IDEPTH(NGP)
      _RL CBMF(NGP), PRECNV(NGP), DFSE(NGP,NLEV), DFQA(NGP,NLEV)
      INTEGER  kGrd(NGP)
      INTEGER  bi,bj,myThid

#ifdef ALLOW_AIM

C-- Local variables:
      INTEGER ITOP(NGP)
c_FM  REAL SM(NGP,NLEV), QATHR(NGP), ENTR(2:NLEV-1)
      _RL  QATHR(NGP), ENTR(2:NLEV-1) 
      _RL  ENTR_PS(NGP,2:NLEV-1), FM0(NGP) 

      INTEGER J, K, K1, Ktmp
      _RL  dSEdp(NGP,NLEV), factP, PSA_1
      _RL  dSEdpTot, stab_crit, FDMUS
C- jmc: declare all local variables:
      _RL  QMAX, DELQ, QB, QSATB, FMASS, ENMASS, SENTR 
      _RL  FPSA, FQMAX, RDPS, FUQ, FDQ, FSQ
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

C--   1. Initialization of output and workspace arrays

      PSA_1 = 1.
      FQMAX=  5.

      RDPS = 2. _d 0 /(1. _d 0 - PSMIN)
c_FM  FM0=P0*DSIG(NLEV)/(GG*TRCNV*3600)
c_FM    FPSA=PSA(J)*MIN(1.,(PSA(J)-PSMIN)*RDPS)
C-    compute FM0(J) = FM0*FPSA
      DO J=1,NGP
       FM0(J)=0.
       Ktmp = kGrd(J)
       IF ( Ktmp .NE. 0 ) THEN
        FPSA = MIN(1. _d 0 ,(PSA(J)-PSMIN)*RDPS)
        FM0(J)=P0*DSIG(Ktmp)*dpFac(J,Ktmp)/(GG*TRCNV*3600. _d 0)
       ENDIF
      ENDDO

      DO K=1,NLEV
        DO J=1,NGP
          DFSE(J,K)=0.0
          DFQA(J,K)=0.0
        ENDDO
      ENDDO
      DO K=2,NLEV-1
        DO J=1,NGP
          ENTR_PS(J,K)=0.
        ENDDO
      ENDDO

      DO J=1,NGP
        ITOP(J)  =kGrd(J)
        CBMF(J)  =0.0
        PRECNV(J)=0.0
      ENDDO

C     Saturation moist static energy
c_FM  DO K=1,NLEV
c_FM    DO J=1,NGP
c_FM      SM(J,K)=SE(J,K)+ALHC*QSAT(J,K)
c_FM    ENDDO
c_FM  ENDDO

C ---------------------------------------------
C    Write Conditional stability based on Pot.Temp :
C    dSEdp(K) = Delta[Static-Energy] between 2 Plevels(k,k+1)
C    and corresponds to SE(K+1)-SE(K) in the original code
C -------
      DO K=1,NLEV-1
       factP = CP*SIGH(K)**(RD/CP)
       DO J=1,NGP
         dSEdp(J,K)=(SE(J,K+1)-SE(J,K))*factP
       ENDDO
      ENDDO

C     Entrainment profile (up to sigma = 0.5)

c_FM  SENTR=0.
c_FM  DO K=2,NLEV-1
c_FM    ENTR(K)=( MAX( 0. _d 0, SIG(K)-0.5 _d 0) )**2
c_FM    SENTR=SENTR+ENTR(K)
c_FM  ENDDO

c_FM  SENTR=ENTMAX/SENTR
c_FM  DO K=2,NLEV-1
c_FM    ENTR(K)=ENTR(K)*SENTR
c_FM  ENDDO 

      DO J=1,NGP
       DO K=2,NLEV-1
        ENTR_PS(J,K)=0.
       ENDDO
       Ktmp = kGrd(J)
       IF (Ktmp.GT.2) THEN
         SENTR=0.
         DO K=2,Ktmp-1
           ENTR(K)= ( MAX( 0. _d 0, SIG(K)/PSA(J) - 0.5 _d 0) )**2
           SENTR=SENTR+ENTR(K)
         ENDDO
         IF (SENTR.GT.0.) THEN
          SENTR=ENTMAX/SENTR
          DO K=2,Ktmp-1
           ENTR_PS(J,K) = ENTR(K)*SENTR*PSA(J)
          ENDDO
         ENDIF
       ENDIF
      ENDDO

C--   2. Check of conditions for convection

C     2.1 Conditional instability

c_FM  DO K=NLEV-2,2,-1
c_FM    DO J=1,NGP
c_FM      SMB=SM(J,K)+WVI(K,2)*(SM(J,K+1)-SM(J,K))
c_FM      IF (SM(J,NLEV).GT.SMB) ITOP(J)=K
c_FM    ENDDO
c_FM  ENDDO   

      DO J=1,NGP
       Ktmp = kGrd(J)
       IF ( Ktmp .GE. 2 ) THEN
        dSEdpTot = dSEdp(J,Ktmp-1)
        DO k=Ktmp-2,2,-1
          dSEdpTot = dSEdpTot + dSEdp(J,K)
          stab_crit = dSEdpTot + ALHC*(QSAT(J,Ktmp)-QSAT(J,K))
     &     -WVI(K,2)*(dSEdp(J,K) + ALHC*(QSAT(J,K+1)-QSAT(J,K)) )
          IF (stab_crit.GT.0.) ITOP(J) = K
        ENDDO
       ENDIF
      ENDDO


C     2.2 Humidity exceeding prescribed threshold

      DO J=1,NGP
       Ktmp = kGrd(J)
       IF ( Ktmp .NE. 0 ) THEN
        QATHR(J)=MIN(QBL,RHBL*QSAT(J,Ktmp))
        IF (QA(J,Ktmp).LT.QATHR(J).OR.PSA(J).LT.PSMIN)
     &      ITOP(J)=Ktmp
       ENDIF
        IDEPTH(J)=Ktmp-ITOP(J)
      ENDDO 

C--   3. Convection over selected grid-points

      DO 300 J=1,NGP
       Ktmp = kGrd(J)
      IF (ITOP(J).EQ.Ktmp) GO TO 300

C-      3.1 Boundary layer (cloud base)

        K = Ktmp
        K1=K-1

C       Maximum specific humidity in the PBL
        QMAX=MAX(1.01 _d 0 *QA(J,K),QSAT(J,K))

C       Dry static energy and moisture at upper boundary
c_FM    SB=SE(J,K1)+WVI(K1,2)*(SE(J,K)-SE(J,K1))
        QB=QA(J,K1)+WVI(K1,2)*(QA(J,K)-QA(J,K1))
        QB=MIN(QB,QA(J,K))

C       Cloud-base mass flux, computed to satisfy:
C       fmass*(qmax-qb)*(g/dp)=(q-qthr)/trcnv

c_FM    FPSA=PSA(J)*MIN(1.,(PSA(J)-PSMIN)*RDPS)
c_FM    FMASS=FM0*FPSA*MIN(FQMAX,(QA(J,K)-QATHR(J))/(QMAX-QB))
        FMASS = FM0(J)*MIN(FQMAX,(QA(J,K)-QATHR(J))/(QMAX-QB))
        CBMF(J)=FMASS

C       Upward fluxes at upper boundary
c_FM    FUS=FMASS*SE(J,K)
        FUQ=FMASS*QMAX

C       Downward fluxes at upper boundary
c_FM    FDS=FMASS*SB
        FDQ=FMASS*QB

C       Net flux of dry static energy and moisture
        FDMUS = FMASS*dSEdp(J,K1)*(WVI(K1,2)-1.)
        DFSE(J,K)=FDMUS
c_FM    DFSE(J,K)=FDS-FUS
        DFQA(J,K)=FDQ-FUQ

C-      3.2 Intermediate layers (entrainment)

        DO K=Ktmp-1,ITOP(J)+1,-1
        K1=K-1

C         Fluxes at lower boundary
c_FM      DFSE(J,K)=FUS-FDS
          DFQA(J,K)=FUQ-FDQ

C         Mass entrainment
c_FM      ENMASS=ENTR(K)*PSA(J)*CBMF(J)
          ENMASS=ENTR_PS(J,K) * CBMF(J)
          FMASS=FMASS+ENMASS

C         Upward fluxes at upper boundary
c_FM      FUS=FUS+ENMASS*SE(J,K)
          FUQ=FUQ+ENMASS*QA(J,K)

C         Downward fluxes at upper boundary
c_FM      SB=SE(J,K1)+WVI(K1,2)*(SE(J,K)-SE(J,K1))
          QB=QA(J,K1)+WVI(K1,2)*(QA(J,K)-QA(J,K1))
c_FM      FDS=FMASS*SB
          FDQ=FMASS*QB

C         Net flux of dry static energy and moisture
          DFSE(J,K) = FMASS*(WVI(K1,2)-1.)*dSEdp(J,K1)
     &             -(FMASS-ENMASS)*WVI(K,2)*dSEdp(J,K)
          FDMUS = FDMUS + DFSE(J,K)
c_FM      DFSE(J,K)=DFSE(J,K)+FDS-FUS
          DFQA(J,K)=DFQA(J,K)+FDQ-FUQ

C         Secondary moisture flux
          DELQ=RHIL*QSAT(J,K)-QA(J,K)
          IF (DELQ.GT.0.0) THEN
            FSQ=SMF*CBMF(J)*DELQ
            DFQA(J,K)   =DFQA(J,K)   +FSQ
            DFQA(J,Ktmp)=DFQA(J,Ktmp)-FSQ
          ENDIF

        ENDDO

C-      3.3 Top layer (condensation and detrainment)

        K=ITOP(J)

C       Flux of convective precipitation
        QSATB=QSAT(J,K)+WVI(K,2)*(QSAT(J,K+1)-QSAT(J,K))
        PRECNV(J)=MAX(FUQ-FMASS*QSATB, 0. _d 0)

C       Net flux of dry static energy and moisture
        DFSE(J,K)= -FDMUS+ALHC*PRECNV(J)
c_FM    DFSE(J,K)=FUS-FDS+ALHC*PRECNV(J)
        DFQA(J,K)=FUQ-FDQ-PRECNV(J)

 300  CONTINUE

#endif /* ALLOW_AIM */ 

      RETURN
      END