C $Header: /u/gcmpack/MITgcm/pkg/aim_v23/phy_lscond.F,v 1.3 2006/03/28 04:26:21 jmc Exp $
C $Name:  $

#include "AIM_OPTIONS.h"

      SUBROUTINE LSCOND (PSA,dpFac,QA,QSAT,
     O                   PRECLS,DTLSC,DQLSC,
     I                   kGrd,bi,bj,myThid)
C--
C--   SUBROUTINE LSCOND (PSA,QA,QSAT,
C--  *                   PRECLS,DTLSC,DQLSC)
C--
C--   Purpose: Compute large-scale precipitation and
C--            associated tendencies of temperature and moisture
C--   Input:   PSA    = norm. surface pressure [p/p0]           (2-dim)
C              dpFac  = cell delta_P fraction                   (3-dim)
C--            QA     = specific humidity [g/kg]                (3-dim)
C--            QSAT   = saturation spec. hum. [g/kg]            (3-dim)
C--   Output:  PRECLS = large-scale precipitation [g/(m^2 s)]   (2-dim)
C--            DTLSC  = temperature tendency from l.s. cond     (3-dim)
C--            DQLSC  = hum. tendency [g/(kg s)] from l.s. cond (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--

      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     Large-scale condensation constants

#include "com_lsccon.h"

C-- Routine arguments:
      _RL PSA(NGP), dpFac(NGP,NLEV), QA(NGP,NLEV), QSAT(NGP,NLEV)
      _RL PRECLS(NGP), DTLSC(NGP,NLEV), DQLSC(NGP,NLEV)
      INTEGER  kGrd(NGP)
      INTEGER  bi,bj,myThid

#ifdef ALLOW_AIM

C-- Local variables:
      INTEGER J, K
      _RL PSA2(NGP)

C- jmc: declare all local variables:
      _RL RTLSC, TFACT, PRG
      _RL SIG2, RHREF, DQMAX, PFACT
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

C--   1. Initialization

c_FM  QSMAX = 50.

      RTLSC = 1./(TRLSC*3600.)
      TFACT = ALHC/CP
      PRG = P0/GG

      DO J=1,NGP
        DTLSC(J,1) = 0.
        DQLSC(J,1) = 0.
        PRECLS(J)  = 0.
        PSA2(J)    = PSA(J)*PSA(J)
      ENDDO

C--   2. Tendencies of temperature and moisture
C        NB. A maximum heating rate is imposed to avoid
C            grid-point-storm instability

      DO K=2,NLEV
        SIG2=SIG(K)*SIG(K)
c_FM    RHREF = RHLSC+DRHLSC*(SIG2-1.)
c_FM    DQMAX = (1.1-RHREF)*QSMAX*SIG2*RTLSC
        DO J=1,NGP
          RHREF = RHLSC+DRHLSC*(SIG2/PSA2(J) - 1. _d 0)
          DQMAX = (1.1 _d 0-RHREF)*QSMAX*SIG2*RTLSC
          DQLSC(J,K) = MIN(0. _d 0,(RHREF*QSAT(J,K)-QA(J,K)))*RTLSC
c_FM      DTLSC(J,K) = TFACT*MIN(-DQLSC(J,K),DQMAX*PSA2(J))
c         DTLSC(J,K) = TFACT*MIN(-DQLSC(J,K),DQMAX)
C-jmc: the threshold on latent heat (above) breaks the energy conservation;
C      to fix this, apply the threshold directly to the condensation
          DQLSC(J,K) = MAX(-DQMAX, DQLSC(J,K) )
          DTLSC(J,K) = -TFACT*DQLSC(J,K)
        ENDDO
      ENDDO

C--   Scale LSC tendencies by dpFac (=Partial-Cell factor) (=> Mass Weighted)
C     to get homogenous units & scaling across all physics tendencies.
      DO K=2,NLEV
        DO J=1,NGP
          DQLSC(J,K) = DQLSC(J,K)*dpFac(J,K)
          DTLSC(J,K) = DTLSC(J,K)*dpFac(J,K)
        ENDDO
      ENDDO

C--   3. Large-scale precipitation

      DO J=1,NGP
        DO K=2,kGrd(J)
          PFACT = DSIG(K)*PRG
          PRECLS(J) = PRECLS(J)-PFACT*DQLSC(J,K)
        ENDDO
      ENDDO

c_FM  DO J=1,NGP
c_FM    PRECLS(J) = PRECLS(J)*PSA(J)
c_FM  ENDDO

C--
#endif /* ALLOW_AIM */

      RETURN
      END