!-------------------------------------- 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 --------------------------------------
!-------------------------------------------------------------------------------
!
! ######################
SUBROUTINE INI_CONVPAR 1,1
! ######################
!
!!**** *INI_CONVPAR * - routine to initialize the constants modules
!!
!! PURPOSE
!! -------
! The purpose of this routine is to initialize the constants
! stored in modules MODD_CONVPAR, MODD_CONVPAREXT.
!
!
!!** METHOD
!! ------
!! The deep convection constants are set to their numerical values
!!
!!
!! EXTERNAL
!! --------
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CONVPAR : contains deep convection constants
!!
!! REFERENCE
!! ---------
!! Book2 of the documentation (module MODD_CONVPAR, routine INI_CONVPAR)
!!
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 26/03/96
!! Last modified 15/04/98 adapted for ARPEGE
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CONVPAR
!
IMPLICIT NONE
!
!-------------------------------------------------------------------------------
!
!* 1. Set the thermodynamical and numerical constants for
! the deep convection parameterization
! ---------------------------------------------------
!
!
XA25 = 625.E6 ! 25 km x 25 km reference grid area
!
XCRAD = 1500. ! cloud radius !jiao xcrad updated
XCDEPTH = 3.E3 ! minimum necessary cloud depth !jiao xcdepth updated
XENTR = 0.03 ! entrainment constant (m/Pa) = 0.2 (m)
!
XZLCL = 3.5E3 ! maximum allowed allowed height
! difference between the surface and the LCL
XZPBL = 60.E2 ! minimum mixed layer depth to sustain convection
XWTRIG = 6.00 ! constant in vertical velocity trigger
XWTRIG = 4.64 ! constant in vertical velocity trigger !jiao this is the value in the paper
!
!
XNHGAM = 1.3333 ! accounts for non-hydrost. pressure
! in buoyancy term of w equation
! = 2 / (1+gamma)
XTFRZ1 = 268.16 ! begin of freezing interval
XTFRZ2 = 248.16 ! end of freezing interval
!
XRHDBC = 0.9 ! relative humidity below cloud in downdraft
XRCONV = 0.015 ! constant in precipitation conversion
XSTABT = 0.75 ! factor to assure stability in fractional time
! integration, routine CONVECT_CLOSURE
XSTABC = 0.95 ! factor to assure stability in CAPE adjustment,
! routine CONVECT_CLOSURE
XUSRDPTH = 165.E2 ! pressure thickness used to compute updraft
! moisture supply rate for downdraft
XMELDPTH = 200.E2 ! layer (Pa) through which precipitation melt is
! allowed below downdraft
XUVDP = 0.7 ! constant for pressure perturb in momentum transport
!
!
!* 2. Set the fundamental thermodynamical constants
! these have the same values (not names) as in ARPEGE IFS
! -------------------------------------------------------
! (now initialized by a call to INI_CSTS in BKFCALL, BD)
!
! XP00 = 1.E5 ! reference pressure
! XPI = 3.141592654 ! Pi
! XG = 9.80665 ! gravity constant
! XMD = 28.9644E-3 ! molecular weight of dry air
! XMV = 18.0153E-3 ! molecular weight of water vapor
! XRD = 287.05967 ! gaz constant for dry air
! XRV = 461.524993 ! gaz constant for water vapor
! XCPD = 1004.708845 ! specific heat of dry air
! XCPV = 1846.1 ! specific heat of water vapor
! XRHOLW = 1000. ! density of liquid water
! XCL = 4218. ! specific heat of liquid water
! XCI = 2106. ! specific heat of ice
! XTT = 273.16 ! triple point temperature
! XLVTT = 2.5008E6 ! latent heat of vaporisation at XTT
! XLSTT = 2.8345E6 ! latent heat of sublimation at XTT
! XLMTT = 0.3337E6 ! latent heat of melting at XTT
! XESTT = 611.14 ! saturation pressure at XTT
! XALPW = 60.22416 ! constants in saturation pressure over liquid water
! XBETAW = 6822.459384
! XGAMW = 5.13948
! XALPI = 32.62116 ! constants in saturation pressure over ice
! XBETAI = 6295.421
! XGAMI = 0.56313
!
!
END SUBROUTINE INI_CONVPAR
!
!------------------------------------------------------------------------------
!
!
! ###################################################################
SUBROUTINE DEEP_CONVECTION( KLON , KLEV , PDTCONV, & 1,11
KIDIA , KFDIA , KBDIA , KTDIA , &
KICE , OREFRESH, ODOWN , OSETTADJ, PTIMEC , &
KCOUNT , INDEXCV , PDXDY , &
PPABST , PZZ , PTT , &
PRVT , PRCT , PRIT , &
PUT , PVT , PWT , &
PTTEN , PRVTEN , OUVCONV, PUTEN , &
PVTEN , PRTTEN , PPCTEN , &
PAREA , PCLOUD , PEFFOUT, PWMAX , &
PPRLFLX , PPRSFLX , PPRTTEN, &
PURCOUT , PURIOUT , PURCINT, PURIINT , &
PCAPE , PCLTOP , PCLBAS , &
PUMF , PDMF , &
OCH1CONV, KCH1 , PCH1 , PCH1TEN )
! ###################################################################
!
!!**** Monitor routine to compute all convective tendencies by calls
!! of several subroutines.
!!
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine the convective
!! tendencies. The routine first prepares all necessary grid-scale
!! variables. The final convective tendencies are then computed by
!! calls of different subroutines.
!!
!!
!!** METHOD
!! ------
!! We start by selecting convective columns in the model domain through
!! the call of routine TRIGGER_FUNCT. Then, we allocate memory for the
!! convection updraft and downdraft variables and gather the grid scale
!! variables in convective arrays.
!! The updraft and downdraft computations are done level by level starting
!! at the bottom and top of the domain, respectively.
!! All computations are done on MNH thermodynamic levels. The depth
!! of the current model layer k is defined by DP(k)=P(k-1)-P(k)
!!
!!
!!
!! EXTERNAL
!! --------
!! CONVECT_TRIGGER_FUNCT
!! CONVECT_SATMIXRATIO
!! CONVECT_UPDRAFT
!! CONVECT_CONDENS
!! CONVECT_MIXING_FUNCT
!! CONVECT_TSTEP_PREF
!! CONVECT_DOWNDRAFT
!! CONVECT_PRECIP_ADJUST
!! CONVECT_CLOSURE
!! CONVECT_CLOSURE_THRVLCL
!! CONVECT_CLOSURE_ADJUST
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CSTS
!! XG ! gravity constant
!! XPI ! number Pi
!! XP00 ! reference pressure
!! XRD, XRV ! gaz constants for dry air and water vapor
!! XCPD, XCPV ! specific heat for dry air and water vapor
!! XRHOLW ! density of liquid water
!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure
!! XTT ! triple point temperature
!! XLVTT, XLSTT ! vaporization, sublimation heat constant
!! XCL, XCI ! specific heat for liquid water and ice
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! Module MODD_CONVPAR
!! XA25 ! reference grid area
!! XCRAD ! cloud radius
!!
!!
!! REFERENCE
!! ---------
!!
!! Bechtold et al., 2001, Quart. J. Roy. Meteor. Soc. :
!! A mass flux convection scheme for regional and global models.
!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol. 47, 2784-2801.
!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. 24, 165-170.
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 26/03/96
!! Peter Bechtold 04/10/97 replace theta_il by enthalpy
!! " 10/12/98 changes for ARPEGE
!! Dominique Paquin UQAM suivi des corrections de debordements
!
! " OURANOS Avril 2003
! CONVECT_CLOSURE correction pcp < 0
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CSTS
USE MODD_CONVPAREXT
USE MODD_CONVPAR
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x
INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x
INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at
! ! KBDIA that is at least 1
INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be
! limited to KLEV + 1 - KTDIA
! default=1
REAL, INTENT(IN) :: PDTCONV ! Interval of time between two
! calls of the deep convection scheme
INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes,
! 0 = no ice )
LOGICAL, INTENT(IN) :: OREFRESH ! refresh or not tendencies
! at every call
LOGICAL, INTENT(IN) :: ODOWN ! take or not convective
! downdrafts into account
LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective
! adjustment time by user
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTT ! grid scale temperature at t
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRVT ! grid scale water vapor "
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRCT ! grid scale r_c "
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRIT ! grid scale r_i "
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUT ! grid scale horiz. wind u "
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PVT ! grid scale horiz. wind v "
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PWT ! grid scale vertical velocity (m/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPABST ! grid scale pressure at t (Pa)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZ ! height of model layer (m)
REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! horizontal grid area (m^2)
REAL, DIMENSION(KLON), INTENT(IN) :: PTIMEC ! value of convective adjustment
! time if OSETTADJ=.TRUE.
REAL, DIMENSION(KLON), INTENT(INOUT):: KCOUNT ! convective counter (FLAGCONV IN KF)
! (recompute tendency when OREFRESH=.TRUE.)
! (or keep it when OREFRESH=.FALSE.)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PTTEN ! convective temperature tendency (K/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s)
REAL, DIMENSION(KLON,KLEV) :: PRCTEN ! convective r_c tendency (1/s)
REAL, DIMENSION(KLON,KLEV) :: PRITEN ! convective r_i tendency (1/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRTTEN ! convective cloud liquid/ice tendency (1/s)
! PRTTEN=PRCTEN+PRITEN (DQCDT IN KF)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PPCTEN ! convective rain liquid/ice tendency (1/s)
! PPCTEN=ZURR+ZURC (DQRDT IN KF)
LOGICAL, INTENT(IN) :: OUVCONV ! include wind transport (Cu friction)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUTEN ! convective u-momentum tendency (m/s^2) (DUDT IN KF)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PVTEN ! convective v-momentum tendency (m/s^2) (DVDT IN KF)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PURCOUT ! normalized mixing ratio of updraft cloud water (kg/kg)
! RLIQOUT IN KF
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PURIOUT ! normalized mixing ratio of updraft cloud ice (kg/kg)
! RICEOUT IN KF
REAL, DIMENSION(KLON) , INTENT(INOUT):: PURCINT ! integrated (purcout) updraft cloud water (kg/m2)
REAL, DIMENSION(KLON) , INTENT(INOUT):: PURIINT ! integrated (puriout) updraft cloud ice (kg/m2)
!
REAL, DIMENSION(KLON) :: PPRLTEN ! liquid surf. precipitation tendency (m/s)
REAL, DIMENSION(KLON) :: PPRSTEN ! solid surf. precipitation tendency (m/s)
REAL, DIMENSION(KLON), INTENT(INOUT):: PPRTTEN ! total liquid+solid surf. precipitation tendency (m/s)
! at surface (ZCRR IN KF)
INTEGER, DIMENSION(KLON), INTENT(INOUT):: INDEXCV ! convection index (deep=2, shallow=1,none=0)
INTEGER, DIMENSION(KLON) :: KCLTOP ! cloud top level
INTEGER, DIMENSION(KLON) :: KCLBAS ! cloud base level
! they are given a value of 0 if no convection
REAL, DIMENSION(KLON), INTENT(INOUT):: PCLTOP ! cloud top height (m)
REAL, DIMENSION(KLON), INTENT(INOUT):: PCLBAS ! cloud base height (m)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PPRLFLX ! liquid precip flux (m/s) !jiao unit changed into kg/m2 s
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PPRSFLX ! solid precip flux (m/s) !jiao unit changed into kg/m2 s
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s m2)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s m2)
! unit changed back to kg/s, in consistent with KF output !jiao
REAL, DIMENSION(KLON), INTENT(INOUT):: PCAPE ! total CAPE (J/kg) in updraft
! in original scheme, this was the maximum CAPE
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PAREA ! cloud coverage (updraft) area (m^2)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PCLOUD ! cloud fractional coverage area
! (fraction between 0 and 1 = areaup/dxdy)
REAL, DIMENSION(KLON ), INTENT(INOUT):: PEFFOUT ! precipitation efficiency = ZPREF
REAL, DIMENSION(KLON ), INTENT(INOUT):: PWMAX ! maximum velocity in the convective updrafts (m/s)
!
LOGICAL, INTENT(IN) :: OCH1CONV ! include tracer transport
INTEGER, INTENT(IN) :: KCH1 ! number of species
REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(IN) :: PCH1 ! grid scale chemical species
REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(INOUT):: PCH1TEN ! species conv. tendency (1/s)
!
!
!* 0.2 Declarations of local fixed memory variables :
!
INTEGER :: ITEST, ICONV, ICONV1 ! number of convective columns
INTEGER :: IIB, IIE ! horizontal loop bounds
INTEGER :: IKB, IKE ! vertical loop bounds
INTEGER :: IKS ! vertical dimension
INTEGER :: JI, JL ! horizontal loop index
INTEGER :: JN ! number of tracers
INTEGER :: JK, JKP, JKM ! vertical loop index
INTEGER :: IFTSTEPS ! only used for chemical tracers
REAL :: ZEPS, ZEPSA, ZEPSB ! R_d / R_v, R_v / R_d, XCPV / XCPD - ZEPSA
REAL :: ZCPORD, ZRDOCP ! C_p/R_d, R_d/C_p
!
LOGICAL, DIMENSION(KLON, KLEV) :: GTRIG3 ! 3D logical mask for convection
LOGICAL, DIMENSION(KLON ) :: GTRIG ! 2D logical mask for trigger test
REAL , DIMENSION(KLON, KLEV) :: ZTHT, ZSTHV, ZSTHES ! grid scale theta, theta_v, theta_es
REAL , DIMENSION(KLON ) :: ZTIME ! convective time period
REAL , DIMENSION(KLON ) :: ZWORK2, ZWORK2B ! work array
REAL :: ZW1 ! work scalar
!
!
!* 0.2 Declarations of local allocatable variables :
!
INTEGER, DIMENSION(:), ALLOCATABLE :: IDPL ! index for parcel departure level
INTEGER, DIMENSION(:), ALLOCATABLE :: IPBL ! index for source layer top
INTEGER, DIMENSION(:), ALLOCATABLE :: ILCL ! index for lifting condensation level
INTEGER, DIMENSION(:), ALLOCATABLE :: IETL ! index for zero buoyancy level
INTEGER, DIMENSION(:), ALLOCATABLE :: ICTL ! index for cloud top level
INTEGER, DIMENSION(:), ALLOCATABLE :: ILFS ! index for level of free sink
INTEGER, DIMENSION(:), ALLOCATABLE :: IDBL ! index for downdraft base level
INTEGER, DIMENSION(:), ALLOCATABLE :: IML ! melting level
!
INTEGER, DIMENSION(:), ALLOCATABLE :: ISDPL ! index for parcel departure level
INTEGER, DIMENSION(:), ALLOCATABLE :: ISPBL ! index for source layer top
INTEGER, DIMENSION(:), ALLOCATABLE :: ISLCL ! index for lifting condensation level
REAL , DIMENSION(:), ALLOCATABLE :: ZSTHLCL ! updraft theta at LCL
REAL , DIMENSION(:), ALLOCATABLE :: ZSTLCL ! updraft temp. at LCL
REAL , DIMENSION(:), ALLOCATABLE :: ZSRVLCL ! updraft rv at LCL
REAL , DIMENSION(:), ALLOCATABLE :: ZSWLCL ! updraft w at LCL
REAL , DIMENSION(:), ALLOCATABLE :: ZSZLCL ! LCL height
REAL , DIMENSION(:), ALLOCATABLE :: ZSTHVELCL! envir. theta_v at LCL
REAL , DIMENSION(:), ALLOCATABLE :: ZSDXDY ! grid area (m^2)
REAL , DIMENSION(:), ALLOCATABLE :: ZSCRAD ! cloud radius (m) !jiao xcrad
REAL , DIMENSION(:), ALLOCATABLE :: ZSCDEP ! cloud depth (m) !jiao xcdepth
!
! grid scale variables
REAL , DIMENSION(:,:), ALLOCATABLE :: ZZ ! height of model layer (m)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZPRES ! grid scale pressure
REAL , DIMENSION(:,:), ALLOCATABLE :: ZDPRES ! pressure difference between
! bottom and top of layer (Pa)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZU ! grid scale horiz. u component on theta grid
REAL , DIMENSION(:,:), ALLOCATABLE :: ZV ! grid scale horiz. v component on theta grid
REAL , DIMENSION(:,:), ALLOCATABLE :: ZW ! grid scale vertical velocity on theta grid
REAL , DIMENSION(:,:), ALLOCATABLE :: ZTT ! temperature
REAL , DIMENSION(:,:), ALLOCATABLE :: ZTH ! grid scale theta
REAL , DIMENSION(:,:), ALLOCATABLE :: ZTHV ! grid scale theta_v
REAL , DIMENSION(:,:), ALLOCATABLE :: ZTHL ! grid scale enthalpy (J/kg)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZTHES, ZTHEST ! grid scale saturated theta_e
REAL , DIMENSION(:,:), ALLOCATABLE :: ZRW ! grid scale total water (kg/kg)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZRV ! grid scale water vapor (kg/kg)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZRC ! grid scale cloud water (kg/kg)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZRI ! grid scale cloud ice (kg/kg)
REAL , DIMENSION(:), ALLOCATABLE :: ZDXDY ! grid area (m^2)
REAL , DIMENSION(:), ALLOCATABLE :: ZCRAD ! cloud radius (m) !jiao xcrad
REAL , DIMENSION(:), ALLOCATABLE :: ZCDEP ! cloud depth (m) !jiao xcdepth
!
! updraft variables
REAL , DIMENSION(:,:), ALLOCATABLE :: ZUMF ! updraft mass flux (kg/s)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZUER ! updraft entrainment (kg/s)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZUDR ! updraft detrainment (kg/s)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZUPR ! updraft precipitation in
! flux units (kg water / s)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZUTHL ! updraft enthalpy (J/kg)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZUTHV ! updraft theta_v (K)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZURW ! updraft total water (kg/kg)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZURC ! updraft cloud water (kg/kg)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZURI ! updraft cloud ice (kg/kg)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZURR ! liquid precipit. (kg/kg)
! produced in model layer
REAL , DIMENSION(:,:), ALLOCATABLE :: ZURS ! solid precipit. (kg/kg)
! produced in model layer
REAL , DIMENSION(:,:), ALLOCATABLE :: ZUWW ! vertical velocity in updraft (m/s)
REAL , DIMENSION(:), ALLOCATABLE :: ZUTPR ! total updraft precipitation (kg/s)
REAL , DIMENSION(:), ALLOCATABLE :: ZMFLCL ! cloud base unit mass flux(kg/s)
REAL , DIMENSION(:), ALLOCATABLE :: ZCAPE ! available potent. energy
REAL , DIMENSION(:), ALLOCATABLE :: ZTHLCL ! updraft theta at LCL
REAL , DIMENSION(:), ALLOCATABLE :: ZTLCL ! updraft temp. at LCL
REAL , DIMENSION(:), ALLOCATABLE :: ZRVLCL ! updraft rv at LCL
REAL , DIMENSION(:), ALLOCATABLE :: ZWLCL ! updraft w at LCL
REAL , DIMENSION(:), ALLOCATABLE :: ZZLCL ! LCL height
REAL , DIMENSION(:), ALLOCATABLE :: ZTHVELCL ! envir. theta_v at LCL
!
! downdraft variables
REAL , DIMENSION(:,:), ALLOCATABLE :: ZDMF ! downdraft mass flux (kg/s)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZDER ! downdraft entrainment (kg/s)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZDDR ! downdraft detrainment (kg/s)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZDTHL ! downdraft enthalpy (J/kg)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZDRW ! downdraft total water (kg/kg)
REAL , DIMENSION(:), ALLOCATABLE :: ZMIXF ! mixed fraction at LFS
REAL , DIMENSION(:), ALLOCATABLE :: ZTPR ! total surf precipitation (kg/s)
REAL , DIMENSION(:), ALLOCATABLE :: ZSPR ! solid surf precipitation (kg/s)
REAL , DIMENSION(:), ALLOCATABLE :: ZDTEVR ! donwndraft evapor. (kg/s)
REAL , DIMENSION(:), ALLOCATABLE :: ZPREF ! precipitation efficiency
REAL , DIMENSION(:,:), ALLOCATABLE :: ZDTEVRF ! donwndraft evapor. (kg/s)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZPRLFLX ! liquid precip flux
REAL , DIMENSION(:,:), ALLOCATABLE :: ZPRSFLX ! solid precip flux
!
! closure variables
REAL , DIMENSION(:,:), ALLOCATABLE :: ZLMASS ! mass of model layer (kg)
REAL , DIMENSION(:), ALLOCATABLE :: ZTIMEA ! advective time period
REAL , DIMENSION(:), ALLOCATABLE :: ZTIMEC, ZTIMED! time during which convection is
! active at grid point (as ZTIME)
!
REAL , DIMENSION(:,:), ALLOCATABLE :: ZTHC ! conv. adj. grid scale theta
REAL , DIMENSION(:,:), ALLOCATABLE :: ZRVC ! conv. adj. grid scale r_w
REAL , DIMENSION(:,:), ALLOCATABLE :: ZRCC ! conv. adj. grid scale r_c
REAL , DIMENSION(:,:), ALLOCATABLE :: ZRIC ! conv. adj. grid scale r_i
REAL , DIMENSION(:,:), ALLOCATABLE :: ZWSUB ! envir. compensating subsidence (Pa/s)
!
LOGICAL, DIMENSION(:), ALLOCATABLE :: GTRIG1 ! logical mask for convection
LOGICAL, DIMENSION(:), ALLOCATABLE :: GWORK ! logical work array
INTEGER, DIMENSION(:), ALLOCATABLE :: IINDEX, IJINDEX, IJSINDEX, IJPINDEX ! hor.index
REAL , DIMENSION(:), ALLOCATABLE :: ZCPH ! specific heat C_ph
REAL , DIMENSION(:), ALLOCATABLE :: ZLV, ZLS ! latent heat of vaporis., sublim.
REAL :: ZES ! saturation vapor mixng ratio
! for U, V transport:
REAL , DIMENSION(:,:), ALLOCATABLE :: ZUC ! horizontal wind u (m/s)
REAL , DIMENSION(:,:), ALLOCATABLE :: ZVC ! horizontal wind v (m/s)
! Chemical Tracers:
REAL , DIMENSION(:,:,:), ALLOCATABLE:: ZCH1 ! grid scale chemical specy (kg/kg)
REAL , DIMENSION(:,:,:), ALLOCATABLE:: ZCH1C ! conv. adjust. chemical specy 1
REAL , DIMENSION(:,:), ALLOCATABLE:: ZWORK3 ! work arrays
LOGICAL, DIMENSION(:,:,:), ALLOCATABLE:: GTRIG4 ! logical mask
!
!-------------------------------------------------------------------------------
!
!* 0.3 Compute loop bounds
! -------------------
!
IIB = KIDIA
IIE = KFDIA
JCVEXB = MAX( 0, KBDIA - 1 )
IKB = 1 + JCVEXB
IKS = KLEV
JCVEXT = MAX( 0, KTDIA - 1 )
IKE = IKS - JCVEXT
!
!
!* 0.5 Update convective counter ( where KCOUNT > 0
! convection is still active ).
! ---------------------------------------------
!
KCOUNT(IIB:IIE) = KCOUNT(IIB:IIE) - 1.
!
IF ( OREFRESH ) THEN
KCOUNT(IIB:IIE) = 0. ! refresh or not at every call
END IF
!
GTRIG(:) = KCOUNT(:) <= 0.
ITEST = COUNT( GTRIG(:) )
IF ( ITEST == 0 ) RETURN ! if convection is already active at every grid point
! exit DEEP_CONVECTION
!
!
!* 0.7 Reset convective tendencies to zero if convective
! counter becomes negative
! -------------------------------------------------
!
GTRIG3(:,:) = SPREAD( GTRIG(:), DIM=2, NCOPIES=IKS )
WHERE ( GTRIG3(:,:) )
PTTEN (:,:) = 0.
PRVTEN (:,:) = 0.
PRCTEN (:,:) = 0.
PRITEN (:,:) = 0.
PRTTEN (:,:) = 0.
PPCTEN (:,:) = 0.
PPRLFLX (:,:) = 0.
PPRSFLX (:,:) = 0.
PUTEN (:,:) = 0.
PVTEN (:,:) = 0.
PUMF (:,:) = 0.
PDMF (:,:) = 0.
PURCOUT (:,:) = 0.
PURIOUT (:,:) = 0.
PAREA (:,:) = 0.
PCLOUD (:,:) = 0.
END WHERE
WHERE ( GTRIG(:) )
PPRLTEN (:) = 0.
PPRSTEN (:) = 0.
PPRTTEN (:) = 0.
PURCINT (:) = 0.
PURIINT (:) = 0.
PEFFOUT (:) = 0.
PWMAX (:) = 0.
INDEXCV (:) = 0
KCLTOP (:) = 0
KCLBAS (:) = 0
PCLTOP (:) = 0.
PCLBAS (:) = 0.
PCAPE (:) = 0.
END WHERE
IF ( OCH1CONV ) THEN
ALLOCATE( GTRIG4(KLON,KLEV,KCH1) )
GTRIG4(:,:,:) = SPREAD( GTRIG3(:,:), DIM=3, NCOPIES=KCH1 )
WHERE( GTRIG4(:,:,:) ) PCH1TEN(:,:,:) = 0.
DEALLOCATE( GTRIG4 )
END IF
!
!
!* 1. Initialize local variables
! ----------------------------
!
ZEPS = XRD / XRV
ZEPSA = XRV / XRD
ZEPSB = XCPV / XCPD - ZEPSA
ZCPORD = XCPD / XRD
ZRDOCP = XRD / XCPD
!
!
!* 1.1 Set up grid scale theta, theta_v, theta_es
! ------------------------------------------
!
ZTHT(:,:) = 300.
ZSTHV(:,:)= 300.
ZSTHES(:,:) = 400.
DO JK = IKB, IKE
DO JI = IIB, IIE
IF ( PPABST(JI,JK) > 40.E2 ) THEN
ZTHT(JI,JK) = PTT(JI,JK) * ( XP00 / PPABST(JI,JK) ) ** ZRDOCP
ZSTHV(JI,JK) = ZTHT(JI,JK) * ( 1. + ZEPSA * PRVT(JI,JK) ) / &
( 1. + PRVT(JI,JK) + PRCT(JI,JK) + PRIT(JI,JK) )
!
! use conservative Bolton (1980) formula for theta_e
! it is used to compute CAPE for undilute parcel ascent
! For economical reasons we do not use routine CONVECT_SATMIXRATIO here
!
ZES = EXP( XALPW - XBETAW / PTT(JI,JK) - XGAMW * LOG( PTT(JI,JK) ) )
ZES = MIN( 1., ZEPS * ZES / ( PPABST(JI,JK) - ZES ) )
ZSTHES(JI,JK) = PTT(JI,JK) * ( ZTHT(JI,JK) / PTT(JI,JK) ) ** &
( 1. - 0.28 * ZES ) * EXP( ( 3374.6525 / PTT(JI,JK) - 2.5403 ) &
* ZES * ( 1. + 0.81 * ZES ) )
END IF
END DO
END DO
!
!
!
!* 2. Test for convective columns and determine properties at the LCL
! --------------------------------------------------------------
!
!* 2.1 Allocate arrays depending on number of model columns that need
! to be tested for convection (i.e. where no convection is present
! at the moment.
! --------------------------------------------------------------
!
ALLOCATE( ZPRES (ITEST,IKS) )
ALLOCATE( ZZ (ITEST,IKS) )
ALLOCATE( ZW (ITEST,IKS) )
ALLOCATE( ZTH (ITEST,IKS) )
ALLOCATE( ZTHV (ITEST,IKS) )
ALLOCATE( ZTHEST (ITEST,IKS) )
ALLOCATE( ZRV (ITEST,IKS) )
ALLOCATE( ZSTHLCL (ITEST) )
ALLOCATE( ZSTLCL (ITEST) )
ALLOCATE( ZSRVLCL (ITEST) )
ALLOCATE( ZSWLCL (ITEST) )
ALLOCATE( ZSZLCL (ITEST) )
ALLOCATE( ZSTHVELCL(ITEST) )
ALLOCATE( ISDPL (ITEST) )
ALLOCATE( ISPBL (ITEST) )
ALLOCATE( ISLCL (ITEST) )
ALLOCATE( ZSDXDY (ITEST) )
ALLOCATE( ZSCRAD (ITEST) ) !jiao xcrad
ALLOCATE( ZSCDEP (ITEST) ) !jiao xcdepth
ALLOCATE( GTRIG1 (ITEST) )
ALLOCATE( ZCAPE (ITEST) )
ALLOCATE( IINDEX (KLON) )
ALLOCATE( IJSINDEX (ITEST) )
DO JI = 1, KLON
IINDEX(JI) = JI
END DO
IJSINDEX(:) = PACK( IINDEX(:), MASK=GTRIG(:) )
!
DO JK = IKB, IKE
DO JI = 1, ITEST
JL = IJSINDEX(JI)
ZPRES (JI,JK) = PPABST(JL,JK)
ZZ (JI,JK) = PZZ (JL,JK)
ZTH (JI,JK) = ZTHT (JL,JK)
ZTHV (JI,JK) = ZSTHV (JL,JK)
ZTHEST(JI,JK) = ZSTHES(JL,JK)
ZRV (JI,JK) = MAX( 0., PRVT(JL,JK) )
ZW (JI,JK) = PWT (JL,JK)
END DO
END DO
DO JI = 1, ITEST
JL = IJSINDEX(JI)
ZSDXDY(JI) = PDXDY(JL)
END DO
!
!* 2.2 Compute environm. enthalpy and total water = r_v + r_i + r_c
! and envir. saturation theta_e
! ------------------------------------------------------------
!
!
!* 2.3 Test for convective columns and determine properties at the LCL
! --------------------------------------------------------------
!
ISLCL(:) = MAX( IKB, 2 ) ! initialize DPL PBL and LCL
ISDPL(:) = IKB
ISPBL(:) = IKB
!
!
CALL CONVECT_TRIGGER_FUNCT
( ITEST, KLEV, &
ZPRES, ZTH, ZTHV, ZTHEST, &
ZRV, ZW, ZZ, ZSDXDY, &
ZSTHLCL, ZSTLCL, ZSRVLCL, ZSWLCL, ZSZLCL, &
ZSTHVELCL, ISLCL, ISDPL, ISPBL, GTRIG1, &
ZCAPE, ZSCRAD, ZSCDEP ) !jiao xcrad and xcdepth
!
DEALLOCATE( ZPRES )
DEALLOCATE( ZZ )
DEALLOCATE( ZTH )
DEALLOCATE( ZTHV )
DEALLOCATE( ZTHEST )
DEALLOCATE( ZRV )
DEALLOCATE( ZW )
DEALLOCATE( ZCAPE )
!
!
!* 3. After the call of TRIGGER_FUNCT we allocate all the dynamic
! arrays used in the convection scheme using the mask GTRIG, i.e.
! we do calculus only in convective columns. This corresponds to
! a GATHER operation.
! --------------------------------------------------------------
!
ICONV = COUNT( GTRIG1(:) )
IF ( ICONV == 0 ) THEN
DEALLOCATE( ZSTHLCL )
DEALLOCATE( ZSTLCL )
DEALLOCATE( ZSRVLCL )
DEALLOCATE( ZSWLCL )
DEALLOCATE( ZSZLCL )
DEALLOCATE( ZSTHVELCL )
DEALLOCATE( ZSDXDY )
DEALLOCATE( ZSCRAD ) !jiao xcrad
DEALLOCATE( ZSCDEP ) !jiao xcdepth
DEALLOCATE( ISLCL )
DEALLOCATE( ISDPL )
DEALLOCATE( ISPBL )
DEALLOCATE( GTRIG1 )
DEALLOCATE( IINDEX )
DEALLOCATE( IJSINDEX )
RETURN ! no convective column has been found, exit DEEP_CONVECTION
ENDIF
!
! vertical index variables
!
ALLOCATE( IDPL(ICONV) )
ALLOCATE( IPBL(ICONV) )
ALLOCATE( ILCL(ICONV) )
ALLOCATE( ICTL(ICONV) )
ALLOCATE( IETL(ICONV) )
!
! grid scale variables
!
ALLOCATE( ZZ (ICONV,IKS) )
ALLOCATE( ZPRES (ICONV,IKS) )
ALLOCATE( ZDPRES(ICONV,IKS) )
ALLOCATE( ZU (ICONV,IKS) )
ALLOCATE( ZV (ICONV,IKS) )
ALLOCATE( ZTT (ICONV,IKS) )
ALLOCATE( ZTH (ICONV,IKS) )
ALLOCATE( ZTHV (ICONV,IKS) )
ALLOCATE( ZTHL (ICONV,IKS) )
ALLOCATE( ZTHES (ICONV,IKS) )
ALLOCATE( ZRV (ICONV,IKS) )
ALLOCATE( ZRC (ICONV,IKS) )
ALLOCATE( ZRI (ICONV,IKS) )
ALLOCATE( ZRW (ICONV,IKS) )
ALLOCATE( ZDXDY (ICONV) )
ALLOCATE( ZCRAD (ICONV) ) !jiao xcrad
ALLOCATE( ZCDEP (ICONV) ) !jiao xcdepth
!
! updraft variables
!
ALLOCATE( ZUMF (ICONV,IKS) )
ALLOCATE( ZUER (ICONV,IKS) )
ALLOCATE( ZUDR (ICONV,IKS) )
ALLOCATE( ZUPR (ICONV,IKS) )
ALLOCATE( ZUTHL (ICONV,IKS) )
ALLOCATE( ZUTHV (ICONV,IKS) )
ALLOCATE( ZURW (ICONV,IKS) )
ALLOCATE( ZURC (ICONV,IKS) )
ALLOCATE( ZURI (ICONV,IKS) )
ALLOCATE( ZURR (ICONV,IKS) )
ALLOCATE( ZURS (ICONV,IKS) )
ALLOCATE( ZUWW (ICONV,IKS) )
ALLOCATE( ZUTPR (ICONV) )
ALLOCATE( ZTHLCL (ICONV) )
ALLOCATE( ZTLCL (ICONV) )
ALLOCATE( ZRVLCL (ICONV) )
ALLOCATE( ZWLCL (ICONV) )
ALLOCATE( ZMFLCL (ICONV) )
ALLOCATE( ZZLCL (ICONV) )
ALLOCATE( ZTHVELCL(ICONV) )
ALLOCATE( ZCAPE (ICONV) )
!
! work variables
!
ALLOCATE( IJINDEX (ICONV) )
ALLOCATE( IJPINDEX(ICONV) )
ALLOCATE( ZCPH (ICONV) )
ALLOCATE( ZLV (ICONV) )
ALLOCATE( ZLS (ICONV) )
!
!
!* 3.1 Gather grid scale and updraft base variables in
! arrays using mask GTRIG
! ---------------------------------------------------
!
GTRIG(:) = UNPACK( GTRIG1(:), MASK=GTRIG(:), FIELD=.FALSE. )
IJINDEX(:) = PACK( IINDEX(:), MASK=GTRIG(:) )
!
DO JK = IKB, IKE
DO JI = 1, ICONV
JL = IJINDEX(JI)
ZZ (JI,JK) = PZZ (JL,JK)
ZPRES(JI,JK) = PPABST (JL,JK)
ZTT (JI,JK) = PTT (JL,JK)
ZTH (JI,JK) = ZTHT (JL,JK)
ZTHES(JI,JK) = ZSTHES (JL,JK)
ZRV (JI,JK) = MAX(PRVT(JL,JK), 0.0 )
ZRC (JI,JK) = MAX(PRCT(JL,JK), 0.0)
ZRI (JI,JK) = MAX(PRIT(JL,JK), 0.0)
ZTHV (JI,JK) = ZSTHV (JL,JK)
ZU (JI,JK) = PUT (JL,JK)
ZV (JI,JK) = PVT (JL,JK)
END DO
END DO
IF ( OSETTADJ ) THEN
ALLOCATE( ZTIMED(ICONV) )
DO JI = 1, ICONV
JL = IJINDEX(JI)
ZTIMED(JI) = PTIMEC(JL)
END DO
END IF
!
DO JI = 1, ITEST
IJSINDEX(JI) = JI
END DO
IJPINDEX(:) = PACK( IJSINDEX(:), MASK=GTRIG1(:) )
DO JI = 1, ICONV
JL = IJPINDEX(JI)
IDPL (JI) = ISDPL (JL)
IPBL (JI) = ISPBL (JL)
ILCL (JI) = ISLCL (JL)
ZTHLCL (JI) = ZSTHLCL (JL)
ZTLCL (JI) = ZSTLCL (JL)
ZRVLCL (JI) = ZSRVLCL (JL)
ZWLCL (JI) = ZSWLCL (JL)
ZZLCL (JI) = ZSZLCL (JL)
ZTHVELCL(JI) = ZSTHVELCL(JL)
ZDXDY (JI) = ZSDXDY (JL)
ZCRAD (JI) = ZSCRAD (JL) !jiao xcrad
ZCDEP (JI) = ZSCDEP (JL) !jiao xcdepth
END DO
ALLOCATE( GWORK(ICONV) )
GWORK(:) = PACK( GTRIG1(:), MASK=GTRIG1(:) )
DEALLOCATE( GTRIG1 )
ALLOCATE( GTRIG1(ICONV) )
GTRIG1(:) = GWORK(:)
!
DEALLOCATE( GWORK )
DEALLOCATE( IJPINDEX )
DEALLOCATE( ISDPL )
DEALLOCATE( ISPBL )
DEALLOCATE( ISLCL )
DEALLOCATE( ZSTHLCL )
DEALLOCATE( ZSTLCL )
DEALLOCATE( ZSRVLCL )
DEALLOCATE( ZSWLCL )
DEALLOCATE( ZSZLCL )
DEALLOCATE( ZSTHVELCL)
DEALLOCATE( ZSDXDY )
DEALLOCATE( ZSCRAD ) !jiao xcrad
DEALLOCATE( ZSCDEP ) !jiao xcdepth
!
!
!* 3.2 Compute pressure difference
! ---------------------------------------------------
!
ZDPRES(:,IKB) = 0.
DO JK = IKB + 1, IKE
ZDPRES(:,JK) = ZPRES(:,JK-1) - ZPRES(:,JK)
END DO
!
!* 3.3 Compute environm. enthalpy and total water = r_v + r_i + r_c
! ----------------------------------------------------------
!
DO JK = IKB, IKE, 1
ZRW(:,JK) = ZRV(:,JK) + ZRC(:,JK) + ZRI(:,JK)
ZCPH(:) = XCPD + XCPV * ZRW(:,JK)
ZLV(:) = XLVTT + ( XCPV - XCL ) * ( ZTT(:,JK) - XTT ) ! compute L_v
ZLS(:) = XLSTT + ( XCPV - XCI ) * ( ZTT(:,JK) - XTT ) ! compute L_i
ZTHL(:,JK) = ZCPH(:) * ZTT(:,JK) + ( 1. + ZRW(:,JK) ) * XG * ZZ(:,JK) &
- ZLV(:) * ZRC(:,JK) - ZLS(:) * ZRI(:,JK)
END DO
!
!
!* 4. Compute updraft properties
! ----------------------------
!
!* 4.1 Set mass flux at LCL ( here a unit mass flux with w = 1 m/s )
! -------------------------------------------------------------
!
DO JI = 1, ICONV
JK = ILCL(JI) - 1
ZMFLCL(JI) = ZPRES(JI,JK) / ( XRD * ZTT(JI,JK) * &
( 1. + ZEPS * ZRVLCL(JI) ) ) * XPI * ZCRAD(JI) * ZCRAD(JI)
END DO
!
DEALLOCATE( ZCPH )
DEALLOCATE( ZLV )
DEALLOCATE( ZLS )
!
!
CALL CONVECT_UPDRAFT
( ICONV, KLEV, &
KICE, ZPRES, ZDPRES, ZZ, ZTHL, ZTHV, ZTHES, ZRW, &
ZTHLCL, ZTLCL, ZRVLCL, ZWLCL, ZZLCL, ZTHVELCL, &
ZMFLCL, GTRIG1, ILCL, IDPL, IPBL, &
ZUMF, ZUER, ZUDR, ZUTHL, ZUTHV, ZURW, &
ZURC, ZURI, ZURR, ZURS, ZUPR, &
ZUTPR, ZCAPE, ICTL, IETL, ZCRAD, ZCDEP, ZUWW)
!jiao xcrad and xcdepth
!
!
!
!* 4.2 In routine UPDRAFT GTRIG1 has been set to false when cloud
! thickness is smaller than 3 km
! -----------------------------------------------------------
!
!
ICONV1 = COUNT(GTRIG1)
!
IF ( ICONV1 > 0 ) THEN
!
!* 4.3 Allocate memory for downdraft variables
! ---------------------------------------
!
! downdraft variables
!
ALLOCATE( ILFS (ICONV) )
ALLOCATE( IDBL (ICONV) )
ALLOCATE( IML (ICONV) )
ALLOCATE( ZDMF (ICONV,IKS) )
ALLOCATE( ZDER (ICONV,IKS) )
ALLOCATE( ZDDR (ICONV,IKS) )
ALLOCATE( ZDTHL (ICONV,IKS) )
ALLOCATE( ZDRW (ICONV,IKS) )
ALLOCATE( ZLMASS(ICONV,IKS) )
DO JK = IKB, IKE
ZLMASS(:,JK) = ZDXDY(:) * ZDPRES(:,JK) / XG ! mass of model layer
END DO
ZLMASS(:,IKB) = ZLMASS(:,IKB+1)
ALLOCATE( ZMIXF (ICONV) )
ALLOCATE( ZTPR (ICONV) )
ALLOCATE( ZSPR (ICONV) )
ALLOCATE( ZDTEVR (ICONV) )
ALLOCATE( ZPREF (ICONV) )
ALLOCATE( ZDTEVRF(ICONV,IKS) )
ALLOCATE( ZPRLFLX(ICONV,IKS) )
ALLOCATE( ZPRSFLX(ICONV,IKS) )
!
! closure variables
!
ALLOCATE( ZTIMEA(ICONV) )
ALLOCATE( ZTIMEC(ICONV) )
ALLOCATE( ZTHC (ICONV,IKS) )
ALLOCATE( ZRVC (ICONV,IKS) )
ALLOCATE( ZRCC (ICONV,IKS) )
ALLOCATE( ZRIC (ICONV,IKS) )
ALLOCATE( ZWSUB (ICONV,IKS) )
!
!
!* 5. Compute downdraft properties
! ----------------------------
!
!* 5.1 Compute advective time period and precipitation
! efficiency as a function of mean ambient wind (shear)
! --------------------------------------------------------
!
CALL CONVECT_TSTEP_PREF
( ICONV, KLEV, &
ZU, ZV, ZPRES, ZZ, ZDXDY, ILCL, ICTL, &
ZTIMEA, ZPREF )
!
! exclude convective downdrafts if desired
IF ( .NOT. ODOWN ) ZPREF(:) = 1.
!
! Compute the period during which convection is active
ZTIMEC(:) = MAX( 1800., MIN( 3600., ZTIMEA(:) ) )
ZTIMEC(:) = REAL( INT( ZTIMEC(:) / PDTCONV ) ) * PDTCONV
ZTIMEC(:) = MAX( PDTCONV, ZTIMEC(:) ) ! necessary if PDTCONV > 1800
IF ( OSETTADJ ) THEN
ZTIMEC(:) = MAX( PDTCONV, ZTIMED(:) )
END IF
!
!
!* 5.2 Compute melting level
! ----------------------
!
IML(:) = IKB
DO JK = IKE, IKB, -1
WHERE( ZTT(:,JK) <= XTT ) IML(:) = JK
END DO
!
CALL CONVECT_DOWNDRAFT
( ICONV, KLEV, &
KICE, ZPRES, ZDPRES, ZZ, ZTH, ZTHES, &
ZRW, ZRC, ZRI, &
ZPREF, ILCL, ICTL, IETL, &
ZUTHL, ZURW, ZURC, ZURI, &
ZDMF, ZDER, ZDDR, ZDTHL, ZDRW, &
ZMIXF, ZDTEVR, ILFS, IDBL, IML, &
ZDTEVRF,ZCRAD ) !jiao xcrad
!
!
!* 6. Adjust up and downdraft mass flux to be consistent
! with precipitation efficiency relation.
! ---------------------------------------------------
!
CALL CONVECT_PRECIP_ADJUST
( ICONV, KLEV, &
ZPRES,ZUMF, ZUER, ZUDR, ZUPR, ZUTPR, ZURW,&
ZDMF, ZDER, ZDDR, ZDTHL, ZDRW, &
ZPREF, ZTPR, ZMIXF, ZDTEVR, &
ILFS, IDBL, ILCL, ICTL, IETL, &
ZDTEVRF )
!
!
!* 7. Determine adjusted environmental values assuming
! that all available buoyant energy must be removed
! within an advective time step ZTIMEC.
! ---------------------------------------------------
!
CALL CONVECT_CLOSURE
( ICONV, KLEV, &
ZPRES, ZDPRES, ZZ, ZDXDY, ZLMASS, &
ZTHL, ZTH, ZRW, ZRC, ZRI, GTRIG1, &
ZTHC, ZRVC, ZRCC, ZRIC, ZWSUB, &
ILCL, IDPL, IPBL, ILFS, ICTL, IML, &
ZUMF, ZUER, ZUDR, ZUTHL, ZURW, &
ZURC, ZURI, ZUPR, &
ZDMF, ZDER, ZDDR, ZDTHL, ZDRW, &
ZTPR, ZSPR, ZDTEVR, &
ZCAPE, ZTIMEC, &
IFTSTEPS, &
ZDTEVRF, ZPRLFLX, ZPRSFLX )
!
!* 8. Determine the final grid-scale (environmental) convective
! tendencies and set convective counter
! --------------------------------------------------------
!
!
!* 8.1 Grid scale tendencies
! ---------------------
!
! in order to save memory, the tendencies are temporarily stored
! in the tables for the adjusted grid-scale values
!
DO JK = IKB, IKE
ZTHC(:,JK) = ( ZTHC(:,JK) - ZTH(:,JK) ) / ZTIMEC(:) &
* ( ZPRES(:,JK) / XP00 ) ** ZRDOCP ! change theta in temperature
ZRVC(:,JK) = ( ZRVC(:,JK) - ZRW(:,JK) + ZRC(:,JK) + ZRI(:,JK) ) &
/ ZTIMEC(:)
ZRCC(:,JK) = ( ZRCC(:,JK) - ZRC(:,JK) ) / ZTIMEC(:)
ZRIC(:,JK) = ( ZRIC(:,JK) - ZRI(:,JK) ) / ZTIMEC(:)
!
ZPRLFLX(:,JK) = ZPRLFLX(:,JK) / ( XRHOLW * ZDXDY(:) )
ZPRSFLX(:,JK) = ZPRSFLX(:,JK) / ( XRHOLW * ZDXDY(:) )
!
END DO
!
ZPRLFLX(:,IKB) = ZPRLFLX(:,IKB+1)
ZPRSFLX(:,IKB) = ZPRSFLX(:,IKB+1)
!
!
!* 8.2 Apply conservation correction
! -----------------------------
!
! Compute vertical integrals
!
JKM = MAXVAL( ICTL(:) )
ZWORK2(:) = 0.
ZWORK2B(:) = 0.
DO JK = JKM, IKB+1, -1
JKP = JK + 1
DO JI = 1, ICONV
ZWORK2(JI) = ZWORK2(JI) + ( ZRVC(JI,JK) + ZRCC(JI,JK) + ZRIC(JI,JK) ) * & ! moisture
(ZPRES(JI,JK) - ZPRES(JI,JKP)) / XG
! ZWORK2B(JI) = ZWORK2B(JI) + ( & ! energy
! ( XCPD + XCPV * ZRW(JI,JK) )* ZTHC(JI,JK) - &
! ( XLVTT + ( XCPV - XCL ) * ( ZTT(JI,JK) - XTT ) ) * ZRCC(JI,JK) - &
! ( XLSTT + ( XCPV - XCL ) * ( ZTT(JI,JK) - XTT ) ) * ZRIC(JI,JK) ) * &
! (ZPRES(JI,JK) - ZPRES(JI,JKP)) / XG
END DO
END DO
!
! Budget error (compare integral to surface precip.)
!
DO JI = 1, ICONV
IF ( ZTPR(JI) > 0.) THEN
JKP = ICTL(JI) + 1
ZWORK2(JI) = ( ZTPR(JI) / ZDXDY(JI) + ZWORK2(JI) ) * XG / &
( ZPRES(JI,IKB+1) - ZPRES(JI,JKP) )
! ZWORK2B(JI) = ( ZTPR(JI) / ZDXDY(JI) * &
! ( XLVTT + ( XCPV - XCL ) * ( ZTT(JI,IKB) - XTT ) ) - ZWORK2B(JI) ) &
! * XG / ( ZPRES(JI,IKB+1) - ZPRES(JI,JKP) )
END IF
END DO
!
! Apply uniform correction
!
DO JK = JKM, IKB+1, -1
DO JI = 1, ICONV
IF ( ZTPR(JI) > 0. .AND. JK <= ICTL(JI) ) THEN
ZRVC(JI,JK) = ZRVC(JI,JK) - ZWORK2(JI) ! moisture
! ZTHC(JI,JK) = ZTHC(JI,JK) + ZWORK2B(JI) / ( XCPD + XCPV * ZRW(JI,JK) )! energy
END IF
END DO
END DO
!
!
!
! execute a "scatter"= pack command to store the tendencies in
! the final 2D tables
!
DO JK = IKB, IKE
DO JI = 1, ICONV
JL = IJINDEX(JI)
PTTEN (JL,JK) = ZTHC (JI,JK)
PRVTEN (JL,JK) = ZRVC (JI,JK)
PRCTEN (JL,JK) = ZRCC (JI,JK)
PRITEN (JL,JK) = ZRIC (JI,JK)
PRTTEN (JL,JK) = ZRCC (JI,JK) + ZRIC (JI,JK)
!
!jiao>>> --------------------------------
! Units changed to (kg/m2 s) by multiplying XRHOLW
! PPRLFLX(JL,JK) = ZPRLFLX(JI,JK) !orig, unit in m/s
! PPRSFLX(JL,JK) = ZPRSFLX(JI,JK) !orig, unit in m/s
PPRLFLX(JL,JK) = ZPRLFLX(JI,JK) * XRHOLW
PPRSFLX(JL,JK) = ZPRSFLX(JI,JK) * XRHOLW
!jiao<<< --------------------------------
END DO
END DO
!
!
!
!
!* 8.3 Convective rainfall tendency, cape and precipitation efficiency
! ---------------------------------------------------------
!
! liquid and solid surface rainfall tendency in m/s
ZTPR(:) = ZTPR(:) / ( XRHOLW * ZDXDY(:) ) ! total surf precip
ZSPR(:) = ZSPR(:) / ( XRHOLW * ZDXDY(:) ) ! solid surf precip
ZTPR(:) = ZTPR(:) - ZSPR(:) ! compute liquid part
!
DO JI = 1, ICONV
JL = IJINDEX(JI)
PPRLTEN(JL) = ZTPR (JI)
PPRSTEN(JL) = ZSPR (JI)
PPRTTEN(JL) = ZTPR (JI) + ZSPR(JI)
!jiao>>> precipitation efficiency for output
PEFFOUT(JL) = ZPREF(JI)
PCAPE (JL) = ZCAPE(JI)
END DO
!
!
! Cloud base and top levels
! -------------------------
!
ILCL(:) = MIN( ILCL(:), ICTL(:) )
DO JI = 1, ICONV
JL = IJINDEX(JI)
KCLTOP (JL) = ICTL(JI)
KCLBAS (JL) = ILCL(JI)
PCLTOP (JL) = PZZ( JI, ICTL(JI) )
PCLBAS (JL) = PZZ( JI, ILCL(JI) )
INDEXCV(JL) = 2
END DO
!
!
!* 8.4 Set convective counter
! ----------------------
!
! compute convective counter for just activated convective
! grid points
! If the advective time period is less than specified
! minimum for convective period, allow feedback to occur only
! during advective time
!
ZTIME(:) = 1.
ZWORK2(:) = 0.
DO JI = 1, ICONV
JL = IJINDEX(JI)
ZTIME(JL) = ZTIMEC(JI)
ZWORK2(JL) = ZTIMEA(JI)
ZWORK2(JL) = MIN( ZWORK2(JL), ZTIME(JL) )
ZWORK2(JL) = MAX( ZWORK2(JL), PDTCONV )
IF ( GTRIG(JL) ) KCOUNT(JL) = ZWORK2(JL) / PDTCONV
IF ( GTRIG(JL) .AND. PPRLTEN(JL)<1.E-14 ) KCOUNT(JL) = 0.
END DO
!
!
!
!* 8.7 Compute convective tendencies for Tracers
! ------------------------------------------
!
IF ( OCH1CONV ) THEN
!
ALLOCATE( ZCH1 (ICONV,IKS,KCH1) )
ALLOCATE( ZCH1C (ICONV,IKS,KCH1) )
ALLOCATE( ZWORK3(ICONV,KCH1) )
!
DO JK = IKB, IKE
DO JI = 1, ICONV
JL = IJINDEX(JI)
ZCH1(JI,JK,:) = PCH1(JL,JK,:)
END DO
END DO
!
CALL CONVECT_CHEM_TRANSPORT
( ICONV, KLEV, KCH1, ZCH1, ZCH1C, &
IDPL, IPBL, ILCL, ICTL, ILFS, IDBL, &
ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, &
ZTIMEC, ZDXDY, ZMIXF, ZLMASS, ZWSUB, &
IFTSTEPS )
!
DO JK = IKB, IKE
DO JN = 1, KCH1
ZCH1C(:,JK,JN) = ( ZCH1C(:,JK,JN)- ZCH1(:,JK,JN) ) / ZTIMEC(:)
END DO
END DO
!
!* 8.8 Apply conservation correction
! -----------------------------
!
! Compute vertical integrals
!
JKM = MAXVAL( ICTL(:) )
ZWORK3(:,:) = 0.
DO JK = JKM, IKB+1, -1
JKP = JK + 1
DO JI = 1, ICONV
ZWORK3(JI,:) = ZWORK3(JI,:) + ZCH1C(JI,JK,:) * &
(ZPRES(JI,JK) - ZPRES(JI,JKP)) / XG
END DO
END DO
!
! Mass error (integral must be zero)
!
DO JI = 1, ICONV
IF ( ZTPR(JI) > 0.) THEN
JKP = ICTL(JI) + 1
ZWORK3(JI,:) = ZWORK3(JI,:) * &
XG / ( ZPRES(JI,IKB+1) - ZPRES(JI,JKP) )
END IF
END DO
!
! Apply uniform correction but assure positive mass at each level
!
DO JK = JKM, IKB+1, -1
DO JI = 1, ICONV
IF ( ZTPR(JI) > 0. .AND. JK <= ICTL(JI) ) THEN
ZCH1C(JI,JK,:) = ZCH1C(JI,JK,:) - ZWORK3(JI,:)
ZCH1C(JI,JK,:) = MAX( ZCH1C(JI,JK,:), -ZCH1(JI,JK,:)/ZTIMEC(JI) )
END IF
END DO
END DO
!
DO JK = IKB, IKE
DO JI = 1, ICONV
JL = IJINDEX(JI)
PCH1TEN(JL,JK,:) = ZCH1C(JI,JK,:)
END DO
END DO
END IF
!
!
!* 8.9 Compute convective tendencies for wind
! --------------------------------------
IF ( OUVCONV ) THEN
ALLOCATE( ZUC(ICONV,IKS) )
ALLOCATE( ZVC(ICONV,IKS) )
CALL CONVECT_UV_TRANSPORT
( ICONV, KLEV, ZU, ZV, ZUC, ZVC, &
& IDPL, IPBL, ILCL, ICTL, ILFS, IDBL, &
& ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, &
& ZTIMEC, ZDXDY, ZMIXF, ZLMASS, ZWSUB, &
& IFTSTEPS )
DO JK = IKB, IKE
ZUC(:,JK) = ( ZUC(:,JK)- ZU(:,JK) ) / ZTIMEC(:)
ZVC(:,JK) = ( ZVC(:,JK)- ZV(:,JK) ) / ZTIMEC(:)
ENDDO
!* 8.9 Apply conservation correction
! -----------------------------
! Compute vertical integrals
JKM = MAXVAL( ICTL(:) )
ZWORK2(:) = 0.0
ZWORK2B(:)= 0.0
DO JK = IKB+1, JKM
JKP = JK + 1
DO JI = 1, ICONV
ZW1 = 0.5 * (ZPRES(JI,JK-1) - ZPRES(JI,JKP)) / XG
ZWORK2(JI) = ZWORK2(JI) + ZUC(JI,JK) * ZW1
ZWORK2B(JI)= ZWORK2B(JI)+ ZVC(JI,JK) * ZW1
ENDDO
ENDDO
! error (integral must be zero)
DO JI = 1, ICONV
IF ( ZTPR(JI) > 0.0) THEN
JKP = ICTL(JI)
ZW1 = XG / ( ZPRES(JI,IKB) - ZPRES(JI,JKP) - &
& 0.5*(ZDPRES(JI,IKB+1) - ZDPRES(JI,JKP+1)) )
ZWORK2(JI) = ZWORK2(JI) * ZW1
ZWORK2B(JI)= ZWORK2B(JI)* ZW1
ENDIF
ENDDO
! Apply uniform correction
DO JK = JKM, IKB+1, -1
DO JI = 1, ICONV
IF ( ZTPR(JI) > 0.0 .AND. JK <= ICTL(JI) ) THEN
ZUC(JI,JK) = ZUC(JI,JK) - ZWORK2(JI)
ZVC(JI,JK) = ZVC(JI,JK) - ZWORK2B(JI)
ENDIF
ENDDO
ENDDO
!
! extend tendencies to first model level
! DO JI = 1, ICONV
! ZWORK2(JI) = ZDPRES(JI,IKB+1) + ZDPRES(JI,IKB+2)
! ZUC(JI,IKB) = ZUC(JI,IKB+1) * ZDPRES(JI,IKB+2)/ZWORK2(JI)
! ZUC(JI,IKB+1)= ZUC(JI,IKB+1) * ZDPRES(JI,IKB+1)/ZWORK2(JI)
! ZVC(JI,IKB) = ZVC(JI,IKB+1) * ZDPRES(JI,IKB+2)/ZWORK2(JI)
! ZVC(JI,IKB+1)= ZVC(JI,IKB+1) * ZDPRES(JI,IKB+1)/ZWORK2(JI)
! ENDDO
DO JK = IKB, IKE
DO JI = 1, ICONV
JL = IJINDEX(JI)
PUTEN(JL,JK) = ZUC(JI,JK)
PVTEN(JL,JK) = ZVC(JI,JK)
ENDDO
ENDDO
ENDIF
!
!* 9. Write up- and downdraft mass fluxes
! ------------------------------------
!
!jiao keep mass flux units in kg/s, in consistent with the output of KF
! DO JK = IKB, IKE
! ZUMF(:,JK) = ZUMF(:,JK) / ZDXDY(:) ! Mass flux per unit area
! ZDMF(:,JK) = ZDMF(:,JK) / ZDXDY(:)
! END DO
!jiao keep the units in kg/s, in consistent with the output of KF
ZWORK2(:) = 1.
WHERE ( PPRLTEN(:)<1.E-14 ) ZWORK2(:) = 0.
DO JK = IKB, IKE
DO JI = 1, ICONV
JL = IJINDEX(JI)
PUMF(JL,JK) = ZUMF(JI,JK) * ZWORK2(JL)
PDMF(JL,JK) = ZDMF(JI,JK) * ZWORK2(JL)
!jiao>>> --------------------------------
! Intergrated cloud liquid and ice water in updraft (kg/m2)
PURCINT(JL) = PURCINT(JL) + ZURC(JI,JK)/XG*ZDPRES(JI,JK)
PURIINT(JL) = PURIINT(JL) + ZURI(JI,JK)/XG*ZDPRES(JI,JK)
! Tendency of precipitation in updraft for output (1/s)
PPCTEN (JL,JK) = (ZURR(JI,JK) + ZURS (JI,JK) )/ ZTIMEC(JI)
! Maximum vertical velocity in updraft
PWMAX(JL) = MAX(PWMAX(JL), ZUWW (JI,JK) )
! Diagnose cloud coverage area (m2) for output (see kfcp4.ftn)
IF (ZUWW(JI,JK) .GT. 0.1) THEN
PAREA(JL,JK) = (PUMF(JL,JK)*ZUTHV(JI,JK)*XRD ) / &
( ZPRES(JI,JK)* ZUWW(JI,JK) )
ENDIF
PCLOUD(JL,JK) = MAX(0.0,PAREA(JL,JK)/PDXDY(JL))
! Cloud liquid and ice water mixing ratio in updraft, normalized by convective cloud
PURCOUT(JL,JK) = ZURC(JI,JK)*PCLOUD(JL,JK)
PURIOUT(JL,JK) = ZURI(JI,JK)*PCLOUD(JL,JK)
!jiao<<< --------------------------------
END DO
END DO
!
!
!* 10. Deallocate all local arrays
! ---------------------------
!
! downdraft variables
!
DEALLOCATE( ZDMF )
DEALLOCATE( ZDER )
DEALLOCATE( ZDDR )
DEALLOCATE( ZDTHL )
DEALLOCATE( ZDRW )
DEALLOCATE( ZLMASS )
DEALLOCATE( ZMIXF )
DEALLOCATE( ZTPR )
DEALLOCATE( ZSPR )
DEALLOCATE( ZDTEVR )
DEALLOCATE( ZPREF )
DEALLOCATE( IML )
DEALLOCATE( ILFS )
DEALLOCATE( IDBL )
DEALLOCATE( ZDTEVRF )
DEALLOCATE( ZPRLFLX )
DEALLOCATE( ZPRSFLX )
!
! closure variables
!
DEALLOCATE( ZTIMEA )
DEALLOCATE( ZTIMEC )
DEALLOCATE( ZTHC )
DEALLOCATE( ZRVC )
DEALLOCATE( ZRCC )
DEALLOCATE( ZRIC )
DEALLOCATE( ZWSUB )
!
IF ( OCH1CONV ) THEN
DEALLOCATE( ZCH1 )
DEALLOCATE( ZCH1C )
DEALLOCATE( ZWORK3 )
END IF
!
ENDIF
!
! vertical index
!
DEALLOCATE( IDPL )
DEALLOCATE( IPBL )
DEALLOCATE( ILCL )
DEALLOCATE( ICTL )
DEALLOCATE( IETL )
!
! grid scale variables
!
DEALLOCATE( ZZ )
DEALLOCATE( ZPRES )
DEALLOCATE( ZDPRES )
DEALLOCATE( ZU )
DEALLOCATE( ZV )
DEALLOCATE( ZTT )
DEALLOCATE( ZTH )
DEALLOCATE( ZTHV )
DEALLOCATE( ZTHL )
DEALLOCATE( ZTHES )
DEALLOCATE( ZRW )
DEALLOCATE( ZRV )
DEALLOCATE( ZRC )
DEALLOCATE( ZRI )
DEALLOCATE( ZDXDY )
DEALLOCATE( ZCRAD ) !jiao xcrad
DEALLOCATE( ZCDEP ) !jiao xcdepth
!
! updraft variables
!
DEALLOCATE( ZUMF )
DEALLOCATE( ZUER )
DEALLOCATE( ZUDR )
DEALLOCATE( ZUTHL )
DEALLOCATE( ZUTHV )
DEALLOCATE( ZURW )
DEALLOCATE( ZURC )
DEALLOCATE( ZURI )
DEALLOCATE( ZURR )
DEALLOCATE( ZURS )
DEALLOCATE( ZUWW )
DEALLOCATE( ZUPR )
DEALLOCATE( ZUTPR )
DEALLOCATE( ZTHLCL )
DEALLOCATE( ZTLCL )
DEALLOCATE( ZRVLCL )
DEALLOCATE( ZWLCL )
DEALLOCATE( ZZLCL )
DEALLOCATE( ZTHVELCL )
DEALLOCATE( ZMFLCL )
DEALLOCATE( ZCAPE )
IF ( OSETTADJ ) DEALLOCATE( ZTIMED )
!
! work arrays
!
DEALLOCATE( IINDEX )
DEALLOCATE( IJINDEX )
DEALLOCATE( IJSINDEX )
DEALLOCATE( GTRIG1 )
!
!
END SUBROUTINE DEEP_CONVECTION
!-----------------------------------------------------------------------------
!
! ######################################################################
SUBROUTINE CONVECT_TRIGGER_FUNCT( KLON, KLEV, & 1,5
PPRES, PTH, PTHV, PTHES, &
PRV, PW, PZ, PDXDY, &
PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, &
PTHVELCL, KLCL, KDPL, KPBL, OTRIG, &
PCAPE, PCRAD, PCDEP ) !jiao xcrad xcdepth
! ######################################################################
!
!!**** Determine convective columns as well as the cloudy values of theta,
!! and qv at the lifting condensation level (LCL)
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine convective columns
!!
!!
!!
!!** METHOD
!! ------
!! Computations are done at every model level starting from bottom.
!! The use of masks allows to optimise the inner loops (horizontal loops).
!! What we look for is the undermost unstable level at each grid point.
!!
!!
!!
!! EXTERNAL
!! --------
!! Routine CONVECT_SATMIXRATIO
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CSTS
!! XG ! gravity constant
!! XP00 ! Reference pressure
!! XRD, XRV ! Gaz constants for dry air and water vapor
!! XCPD ! Cpd (dry air)
!! XTT ! triple point temperature
!! XBETAW, XGAMW ! constants for vapor saturation pressure
!!
!! Module MODD_CONVPAR
!! XA25 ! reference grid area
!! XZLCL ! maximum height difference between
!! ! the surface and the DPL
!! XZPBL ! minimum mixed layer depth to sustain convection
!! XWTRIG ! constant in vertical velocity trigger
!! XCDEPTH ! minimum necessary cloud depth
!! XNHGAM ! coefficient for buoyancy term in w eq.
!! ! accounting for nh-pressure
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! REFERENCE
!! ---------
!!
!! Book2 of documentation ( routine TRIGGER_FUNCT)
!! Fritsch and Chappell (1980), J. Atm. Sci., Vol. 37, 1722-1761.
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 07/11/95
!! Last modified 20/03/97 Select first departure level
!! that produces a cloud thicker than XCDEPTH
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CSTS
USE MODD_CONVPAR
USE MODD_CONVPAREXT
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
INTEGER, INTENT(IN) :: KLON ! horizontal loop index
INTEGER, INTENT(IN) :: KLEV ! vertical loop index
REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH, PTHV ! theta, theta_v
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHES ! envir. satur. theta_e
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRV ! vapor mixing ratio
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PPRES ! pressure
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PZ ! height of grid point (m)
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PW ! vertical velocity
!
REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL
REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temp. at LCL
REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL
REAL, DIMENSION(KLON), INTENT(OUT):: PWLCL ! parcel velocity at LCL
REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m)
REAL, DIMENSION(KLON), INTENT(OUT):: PTHVELCL ! environm. theta_v at LCL (K)
LOGICAL, DIMENSION(KLON), INTENT(OUT):: OTRIG ! logical mask for convection
INTEGER, DIMENSION(KLON), INTENT(INOUT):: KLCL ! contains vert. index of LCL
INTEGER, DIMENSION(KLON), INTENT(INOUT):: KDPL ! contains vert. index of DPL
INTEGER, DIMENSION(KLON), INTENT(INOUT):: KPBL ! contains index of source layer top
REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! CAPE (J/kg) for diagnostics
REAL, DIMENSION(KLON), INTENT(OUT):: PCRAD ! cloud radius (m) !jiao xcrad
REAL, DIMENSION(KLON), INTENT(OUT):: PCDEP ! cloud depth (m) !jiao xcdepth
!
!* 0.2 Declarations of local variables :
!
INTEGER :: JKK, JK, JKP, JKM, JKDL, JL, JKT, JT! vertical loop index
INTEGER :: JI ! horizontal loop index
INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds
REAL :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d
REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd
!
REAL, DIMENSION(KLON) :: ZTHLCL, ZTLCL, ZRVLCL, & ! locals for PTHLCL,PTLCL
ZWLCL, ZZLCL, ZTHVELCL ! PRVLCL, ....
INTEGER, DIMENSION(KLON) :: IDPL, IPBL, ILCL ! locals for KDPL, ...
REAL, DIMENSION(KLON) :: ZPLCL ! pressure at LCL
REAL, DIMENSION(KLON) :: ZZDPL ! height of DPL
REAL, DIMENSION(KLON) :: ZTHVLCL ! theta_v at LCL = mixed layer value
REAL, DIMENSION(KLON) :: ZTMIX ! mixed layer temperature
REAL, DIMENSION(KLON) :: ZEVMIX ! mixed layer water vapor pressure
REAL, DIMENSION(KLON) :: ZDPTHMIX, ZPRESMIX ! mixed layer depth and pressure
REAL, DIMENSION(KLON) :: ZCAPE ! convective available energy (m^2/s^2/g)
REAL, DIMENSION(KLON) :: ZTHEUL ! updraft equiv. pot. temperature (K)
REAL, DIMENSION(KLON) :: ZLV, ZCPH! specific heats of vaporisation, dry air
REAL, DIMENSION(KLON) :: ZDP ! pressure between LCL and model layer
REAL, DIMENSION(KLON) :: ZTOP ! estimated cloud top (m)
REAL, DIMENSION(KLON,KLEV):: ZCAP ! CAPE at every level for diagnostics
!INTEGER, DIMENSION(KLON) :: ITOP ! work array to store highest test layer
REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3 ! work arrays
LOGICAL, DIMENSION(KLON) :: GTRIG, GTRIG2 ! local arrays for OTRIG
LOGICAL, DIMENSION(KLON) :: GWORK1 ! work array
!
!
!-------------------------------------------------------------------------------
!
!* 0.3 Compute array bounds
! --------------------
!
IIE = KLON
IKB = 1 + JCVEXB
IKE = KLEV - JCVEXT
!
!
!* 1. Initialize local variables
! --------------------------
!
ZEPS = XRD / XRV
ZEPSA = XRV / XRD
ZCPORD = XCPD / XRD
ZRDOCP = XRD / XCPD
OTRIG(:) = .FALSE.
IDPL(:) = KDPL(:)
IPBL(:) = KPBL(:)
ILCL(:) = KLCL(:)
!ITOP(:) = IKB
PWLCL(:) = 0.
ZWLCL(:) = 0.
PTHLCL(:) = 1.
PTHVELCL(:)= 1.
PTLCL(:) = 1.
PRVLCL(:) = 0.
PWLCL(:) = 0.
PZLCL(:) = PZ(:,IKB)
ZZDPL(:) = PZ(:,IKB)
GTRIG2(:) = .TRUE.
ZCAP(:,:) = 0.
!
!
!
! 1. Determine highest necessary loop test layer
! -------------------------------------------
!
JT = IKE - 2
DO JK = IKB + 1, IKE - 2
! DO JI = 1, IIE
! IF ( PZ(JI,JK) - PZ(JI,IKB) <= XZLCL ) ITOP(JI) = JK
! END DO
IF ( PZ(1,JK) - PZ(1,IKB) < 12.E3 ) JT = JK
END DO
!
!
!* 2. Enter loop for convection test
! ------------------------------
!
JKP = MINVAL( IDPL(:) ) + 1
!JKT = MAXVAL( ITOP(:) )
JKT = JT
DO JKK = JKP, JKT
!
GWORK1(:) = ZZDPL(:) - PZ(:,IKB) < XZLCL
! we exit the trigger test when the center of the mixed layer is more
! than 3500 m above soil level.
WHERE ( GWORK1(:) )
ZDPTHMIX(:) = 0.
ZPRESMIX(:) = 0.
ZTHLCL(:) = 0.
ZRVLCL(:) = 0.
ZZDPL(:) = PZ(:,JKK)
IDPL(:) = JKK
END WHERE
!
!
!* 3. Construct a mixed layer of at least 60 hPa (XZPBL)
! ------------------------------------------
!
DO JK = JKK, IKE - 1
JKM = JK + 1
DO JI = 1, IIE
IF ( GWORK1(JI) .AND. ZDPTHMIX(JI) < XZPBL ) THEN
IPBL(JI) = JK
ZWORK1(JI) = PPRES(JI,JK) - PPRES(JI,JKM)
ZDPTHMIX(JI) = ZDPTHMIX(JI) + ZWORK1(JI)
ZPRESMIX(JI) = ZPRESMIX(JI) + PPRES(JI,JK) * ZWORK1(JI)
ZTHLCL(JI) = ZTHLCL(JI) + PTH(JI,JK) * ZWORK1(JI)
ZRVLCL(JI) = ZRVLCL(JI) + PRV(JI,JK) * ZWORK1(JI)
END IF
END DO
IF ( MINVAL ( ZDPTHMIX(:) ) >= XZPBL ) EXIT
END DO
!
!
WHERE ( GWORK1(:) )
!
ZPRESMIX(:) = ZPRESMIX(:) / ZDPTHMIX(:)
! ZTHLCL(:) = ZTHLCL(:) / ZDPTHMIX(:)
! ZRVLCL(:) = ZRVLCL(:) / ZDPTHMIX(:)
ZTHLCL(:) = ZTHLCL(:) / ZDPTHMIX(:) +.3
ZRVLCL(:) = ZRVLCL(:) / ZDPTHMIX(:) +1.e-4
ZTHVLCL(:) = ZTHLCL(:) * ( 1. + ZEPSA * ZRVLCL(:) ) &
/ ( 1. + ZRVLCL(:) )
!
!* 4.1 Use an empirical direct solution ( Bolton formula )
! to determine temperature and pressure at LCL.
! Nota: the adiabatic saturation temperature is not
! equal to the dewpoint temperature
! ----------------------------------------------------
!
!
ZTMIX(:) = ZTHLCL(:) * ( ZPRESMIX(:) / XP00 ) ** ZRDOCP
ZEVMIX(:) = ZRVLCL(:) * ZPRESMIX(:) / ( ZRVLCL(:) + ZEPS )
ZEVMIX(:) = MAX( 1.E-8, ZEVMIX(:) )
ZWORK1(:) = LOG( ZEVMIX(:) / 613.3 )
! dewpoint temperature
ZWORK1(:) = ( 4780.8 - 32.19 * ZWORK1(:) ) / ( 17.502 - ZWORK1(:) )
! adiabatic saturation temperature
ZTLCL(:) = ZWORK1(:) - ( .212 + 1.571E-3 * ( ZWORK1(:) - XTT ) &
- 4.36E-4 * ( ZTMIX(:) - XTT ) ) * ( ZTMIX(:) - ZWORK1(:) )
ZTLCL(:) = MIN( ZTLCL(:), ZTMIX(:) )
ZPLCL(:) = XP00 * ( ZTLCL(:) / ZTHLCL(:) ) ** ZCPORD
!
END WHERE
!
!
!* 4.2 Correct ZTLCL in order to be completely consistent
! with MNH saturation formula
! ---------------------------------------------
!
CALL CONVECT_SATMIXRATIO
( KLON, ZPLCL, ZTLCL, ZWORK1, ZLV, ZWORK2, ZCPH )
WHERE( GWORK1(:) )
ZWORK2(:) = ZWORK1(:) / ZTLCL(:) * ( XBETAW / ZTLCL(:) - XGAMW ) ! dr_sat/dT
ZWORK2(:) = ( ZWORK1(:) - ZRVLCL(:) ) / &
( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) )
ZTLCL(:) = ZTLCL(:) - ZLV(:) / ZCPH(:) * ZWORK2(:)
!
END WHERE
!
!
!* 4.3 If ZRVLCL = PRVMIX is oversaturated set humidity
! and temperature to saturation values.
! ---------------------------------------------
!
CALL CONVECT_SATMIXRATIO
( KLON, ZPRESMIX, ZTMIX, ZWORK1, ZLV, ZWORK2, ZCPH )
WHERE( GWORK1(:) .AND. ZRVLCL(:) > ZWORK1(:) )
ZWORK2(:) = ZWORK1(:) / ZTMIX(:) * ( XBETAW / ZTMIX(:) - XGAMW ) ! dr_sat/dT
ZWORK2(:) = ( ZWORK1(:) - ZRVLCL(:) ) / &
( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) )
ZTLCL(:) = ZTMIX(:) - ZLV(:) / ZCPH(:) * ZWORK2(:)
ZRVLCL(:) = ZRVLCL(:) - ZWORK2(:)
ZPLCL(:) = ZPRESMIX(:)
ZTHLCL(:) = ZTLCL(:) * ( XP00 / ZPLCL(:) ) ** ZRDOCP
ZTHVLCL(:)= ZTHLCL(:) * ( 1. + ZEPSA * ZRVLCL(:) ) &
/ ( 1. + ZRVLCL(:) )
END WHERE
!
!
!* 5.1 Determine vertical loop index at the LCL and DPL
! --------------------------------------------------
!
DO JK = JKK, IKE - 1
DO JI = 1, IIE
IF ( ZPLCL(JI) <= PPRES(JI,JK) .AND. GWORK1(JI) ) ILCL(JI) = JK + 1
END DO
END DO
IF ( JKK.GT.MINVAL(ILCL(:)) ) EXIT
!
!
!* 5.2 Estimate height and environm. theta_v at LCL
! --------------------------------------------------
!
DO JI = 1, IIE
JK = ILCL(JI)
JKM = JK - 1
ZDP(JI) = LOG( ZPLCL(JI) / PPRES(JI,JKM) ) / &
LOG( PPRES(JI,JK) / PPRES(JI,JKM) )
ZWORK1(JI) = PTHV(JI,JKM) + ( PTHV(JI,JK) - PTHV(JI,JKM) ) * ZDP(JI)
! we compute the precise value of the LCL
! The precise height is between the levels ILCL and ILCL-1.
ZWORK2(JI) = PZ(JI,JKM) + ( PZ(JI,JK) - PZ(JI,JKM) ) * ZDP(JI)
END DO
WHERE( GWORK1(:) )
ZTHVELCL(:) = ZWORK1(:)
ZZLCL(:) = ZWORK2(:)
END WHERE
!
!
!* 6. Check to see if cloud is bouyant
! --------------------------------
!
!* 6.1 Compute grid scale vertical velocity perturbation term ZWORK1
! -------------------------------------------------------------
!
! normalize w grid scale to a 25 km refer. grid
DO JI = 1, IIE
JK = ILCL(JI)
JKM = JK - 1
!jiao xcrad beg---------------------------------------------
!Kain (2004), Journal fo applied meteorology, 43, 170-181. eq(2)
IF(ZZLCL(JI) .LE. 2000.) THEN
ZWORK1(JI)=0.02*ZZLCL(JI)/2000.
ELSE
ZWORK1(JI)=0.02
ENDIF
!calculate dlp using z instead of log(p)...
ZWORK2(JI) = (ZZLCL(JI)-PZ(JI,JKM))/(PZ(JI,JK)-PZ(JI,JKM))
ZWORK1(JI)=(PW(JI,JKM) + (PW(JI,JK) - PW(JI,JKM)) * ZWORK2(JI)) &
*SQRT( PDXDY(JI) / XA25 ) - ZWORK1(JI)
!Kain (2004), Journal fo applied meteorology, 43, 170-181. eq(6)
IF(ZWORK1(JI).LT.0.) THEN
PCRAD(JI) = 1000.
ELSEIF(ZWORK1(JI).GT.0.1) THEN
PCRAD(JI) = 2000.
ELSE
PCRAD(JI) = 1000. * (1.0 + ZWORK1(JI)/0.1 )
ENDIF
! PCRAD(JI) = 1500.0 !jiao bkf
!jiao xcrad end---------------------------------------------
ZWORK1(JI) = ( PW(JI,JKM) + ( PW(JI,JK) - PW(JI,JKM) ) * ZDP(JI) ) &
* SQRT( PDXDY(JI) / XA25 )
! - 0.02 * ZZLCL(JI) / XZLCL ! avoid spurious convection
END DO
! compute sign of normalized grid scale w
ZWORK2(:) = SIGN( 1., ZWORK1(:) )
ZWORK1(:) = XWTRIG * ZWORK2(:) * ABS( ZWORK1(:) ) ** 0.333 &
* ( XP00 / ZPLCL(:) ) ** ZRDOCP
!
!* 6.2 Compute parcel vertical velocity at LCL
! ---------------------------------------
!
DO JI = 1, IIE
JKDL = IDPL(JI)
ZWORK3(JI) = XG * ZWORK1(JI) * ( ZZLCL(JI) - PZ(JI,JKDL) ) &
/ ( PTHV(JI,JKDL) + ZTHVELCL(JI) )
END DO
WHERE( GWORK1(:) )
ZWLCL(:) = 1. + .5 * ZWORK2(:) * SQRT( ABS( ZWORK3(:) ) )
GTRIG(:) = ZTHVLCL(:) - ZTHVELCL(:) + ZWORK1(:) > 0. .AND. &
ZWLCL(:) > 0.
END WHERE
!
!
!* 6.3 Look for parcel that produces sufficient cloud depth.
! The cloud top is estimated as the level where the CAPE
! is smaller than a given value (based on vertical velocity eq.)
! --------------------------------------------------------------
!
ZTHEUL(:) = ZTLCL(:) * ( ZTHLCL(:) / ZTLCL(:) ) &
** ( 1. - 0.28 * ZRVLCL(:) ) &
* EXP( ( 3374.6525 / ZTLCL(:) - 2.5403 ) * &
ZRVLCL(:) * ( 1. + 0.81 * ZRVLCL(:) ) )
!
ZCAPE(:) = 0.
ZTOP(:) = 0.
ZWORK3(:)= 0.
JKM = MINVAL( ILCL(:) )
DO JL = JKM, JT
JK = JL + 1
DO JI = 1, IIE
ZWORK1(JI) = ( 2. * ZTHEUL(JI) / &
( PTHES(JI,JK) + PTHES(JI,JL) ) - 1. ) * ( PZ(JI,JK) - PZ(JI,JL) )
IF ( JL < ILCL(JI) ) ZWORK1(JI) = 0.
ZCAPE(JI) = ZCAPE(JI) + ZWORK1(JI)
ZCAP(JI,JKK) = ZCAP(JI,JKK) + XG * MAX( 0., ZWORK1(JI) ) ! actual CAPE
ZWORK2(JI) = XNHGAM * XG * ZCAPE(JI) + 1.05 * ZWLCL(JI) * ZWLCL(JI)
! the factor 1.05 takes entrainment into account
ZWORK2(JI) = SIGN( 1., ZWORK2(JI) )
ZWORK3(JI) = ZWORK3(JI) + MIN(0., ZWORK2(JI) )
ZWORK3(JI) = MAX( -1., ZWORK3(JI) )
! Nota, the factors ZWORK2 and ZWORK3 are only used to avoid
! if and goto statements, the difficulty is to extract only
! the level where the criterium is first fullfilled
ZTOP(JI) = PZ(JI,JL) * .5 * ( 1. + ZWORK2(JI) ) * ( 1. + ZWORK3(JI) ) + &
ZTOP(JI) * .5 * ( 1. - ZWORK2(JI) )
END DO
END DO
!jiao xcdepth beg---------------------
! specifying minimum cloud depth as a function of tlcl
! Kain, 2004, Journal fo applied meteorology, 43, 170-181. eq(7)
DO JI = 1, IIE
IF (ZTLCL(JI).GT.293.0) THEN
PCDEP(JI) = 4000.0
ELSE IF( ZTLCL(JI) .LE. 293.0 .AND. ZTLCL(JI) .GE. 273.0) THEN
PCDEP(JI) = 2000.0 + 100.*(ZTLCL(JI)-273.0)
ELSE IF( ZTLCL(JI) .LT. 273.0) THEN
PCDEP(JI) = 2000.0
END IF
END DO
! PCDEP(JI) = 4000.0 !jiao bkf
!jiao xcdepth end----------------------
!
!
WHERE( ZTOP(:) - ZZLCL(:) .GE. PCDEP(:) .AND. GTRIG(:) .AND. GTRIG2(:) )
GTRIG2(:) = .FALSE.
OTRIG(:) = GTRIG(:) ! we select the first departure level
PTHLCL(:) = ZTHLCL(:) ! that gives sufficient cloud depth
PRVLCL(:) = ZRVLCL(:)
PTLCL(:) = ZTLCL(:)
PWLCL(:) = ZWLCL(:)
PZLCL(:) = ZZLCL(:)
PTHVELCL(:) = ZTHVELCL(:)
KDPL(:) = IDPL(:)
KPBL(:) = IPBL(:)
KLCL(:) = ILCL(:)
END WHERE
!
IF ( COUNT(.NOT.OTRIG(:) ) == 0 ) EXIT
END DO
!
!jiao>>> -------------------
! DO JI = 1, IIE
! PCAPE(JI) = MAXVAL( ZCAP(JI,:) ) ! maximum CAPE for diagnostics
! END DO
!jiao<<< -------------------
!
!
END SUBROUTINE CONVECT_TRIGGER_FUNCT
!
!-------------------------------------------------------------------------------
!
! ###########################################################################
SUBROUTINE CONVECT_UPDRAFT( KLON, KLEV, & 1,6
KICE, PPRES, PDPRES, PZ, PTHL, PTHV, PTHES, PRW, &
PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, PTHVELCL, &
PMFLCL, OTRIG, KLCL, KDPL, KPBL, &
PUMF, PUER, PUDR, PUTHL, PUTHV, PURW, &
PURC, PURI, PURR, PURS, PUPR, &
PUTPR, PCAPE, KCTL, KETL, PCRAD, PCDEP, PUWW )
!jiao xcrad and xcdepth
! #############################################################################
!
!!**** Compute updraft properties from DPL to CTL.
!!
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine updraft properties
!! ( mass flux, thermodynamics, precipitation )
!!
!!
!!** METHOD
!! ------
!! Computations are done at every model level starting from bottom.
!! The use of masks allows to optimise the inner loops (horizontal loops).
!!
!!
!!
!! EXTERNAL
!! --------
!! Routine CONVECT_MIXING_FUNCT
!! Routine CONVECT_CONDENS
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CSTS
!! XG ! gravity constant
!! XP00 ! reference pressure
!! XRD, XRV ! gaz constants for dry air and water vapor
!! XCPD, XCPV, XCL ! Cp of dry air, water vapor and liquid water
!! XTT ! triple point temperature
!! XLVTT ! vaporisation heat at XTT
!!
!!
!! Module MODD_CONVPAR
!! XA25 ! reference grid area
!! XCRAD ! cloud radius
!! XCDEPTH ! minimum necessary cloud depth
!! XENTR ! entrainment constant
!! XRCONV ! constant in precipitation conversion
!! XNHGAM ! coefficient for buoyancy term in w eq.
!! ! accounting for nh-pressure
!! XTFRZ1 ! begin of freezing interval
!! XTFRZ2 ! begin of freezing interval
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! REFERENCE
!! ---------
!!
!! Book1,2 of documentation ( routine CONVECT_UPDRAFT)
!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol.
!! Kain and Fritsch, 1993, Meteor. Monographs, Vol.
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 07/11/95
!! Last modified 10/12/97
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CSTS
USE MODD_CONVPAR
USE MODD_CONVPAREXT
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes,
! 0 = no ice )
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHV ! grid scale theta_v
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRW ! grid scale total water
! mixing ratio
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES ! pressure difference between
! bottom and top of layer (Pa)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m)
REAL, DIMENSION(KLON), INTENT(IN) :: PTHLCL ! theta at LCL
REAL, DIMENSION(KLON), INTENT(IN) :: PTLCL ! temp. at LCL
REAL, DIMENSION(KLON), INTENT(IN) :: PRVLCL ! vapor mixing ratio at LCL
REAL, DIMENSION(KLON), INTENT(IN) :: PWLCL ! parcel velocity at LCL (m/s)
REAL, DIMENSION(KLON), INTENT(IN) :: PMFLCL ! cloud base unit mass flux
! (kg/s)
REAL, DIMENSION(KLON), INTENT(IN) :: PCRAD ! cloud radius !jiao xcrad
REAL, DIMENSION(KLON), INTENT(IN) :: PCDEP ! cloud depth !jiao xcdepth
REAL, DIMENSION(KLON), INTENT(IN) :: PZLCL ! height at LCL (m)
REAL, DIMENSION(KLON), INTENT(IN) :: PTHVELCL! environm. theta_v at LCL (K)
LOGICAL, DIMENSION(KLON), INTENT(INOUT):: OTRIG ! logical mask for convection
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL
INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL
INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layertop
!
!
INTEGER, DIMENSION(KLON), INTENT(OUT):: KCTL ! contains vert. index of CTL
INTEGER, DIMENSION(KLON), INTENT(OUT):: KETL ! contains vert. index of &
! equilibrium (zero buoyancy) level
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUMF ! updraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUER ! updraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUDR ! updraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHL ! updraft enthalpy (J/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHV ! updraft theta_v (K)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURW ! updraft total water (kg/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURC ! updraft cloud water (kg/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURI ! updraft cloud ice (kg/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURR ! liquid precipit. (kg/kg)
! produced in model layer
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURS ! solid precipit. (kg/kg)
! produced in model layer
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUWW ! vertical velocity in updraft . (m/s)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUPR ! updraft precipitation in
! flux units (kg water / s)
REAL, DIMENSION(KLON), INTENT(OUT):: PUTPR ! total updraft precipitation
! in flux units (kg water / s)
REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! available potent. energy
!
!* 0.2 Declarations of local variables :
!
INTEGER :: IIE, IKB, IKE ! horizontal and vertical loop bounds
INTEGER :: JI ! horizontal loop index
INTEGER :: JK, JKP, JKM, JK1, JK2, JKMIN ! vertical loop index
REAL :: ZEPSA, ZCVOCD ! R_v / R_d, C_pv / C_pd
REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd
!
REAL, DIMENSION(KLON) :: ZUT ! updraft temperature (K)
REAL, DIMENSION(KLON) :: ZUW1, ZUW2 ! square of updraft vert.
! velocity at levels k and k+1
REAL, DIMENSION(KLON) :: ZE1,ZE2,ZD1,ZD2 ! fractional entrainm./detrain
! rates at levels k and k+1
REAL, DIMENSION(KLON) :: ZMIXF ! critical mixed fraction
REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph
REAL, DIMENSION(KLON) :: ZLV, ZLS ! latent heat of vaporis., sublim.
REAL, DIMENSION(KLON) :: ZURV ! updraft water vapor at level k+1
REAL, DIMENSION(KLON) :: ZPI ! Pi=(P0/P)**(Rd/Cpd)
REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent
REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5, &
ZWORK6 ! work arrays
INTEGER, DIMENSION(KLON) :: IWORK ! wok array
LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK2, GWORK4, GWORK5
! work arrays
LOGICAL, DIMENSION(KLON,KLEV) :: GWORK6 ! work array
!
!
!-------------------------------------------------------------------------------
!
! 0.3 Set loop bounds
! ---------------
!
IKB = 1 + JCVEXB
IKE = KLEV - JCVEXT
IIE = KLON
!
!
!* 1. Initialize updraft properties and local variables
! -------------------------------------------------
!
ZEPSA = XRV / XRD
ZCVOCD = XCPV / XCPD
ZCPORD = XCPD / XRD
ZRDOCP = XRD / XCPD
!
PUMF (:,:) = 0.
PUER (:,:) = 0.
PUDR (:,:) = 0.
PUTHL (:,:) = 0.
PUTHV (:,:) = 0.
PURW (:,:) = 0.
PURC (:,:) = 0.
PURI (:,:) = 0.
PUPR (:,:) = 0.
PURR (:,:) = 0.
PURS (:,:) = 0.
PUWW (:,:) = 0.
PUTPR (:) = 0.
ZUW1 (:) = PWLCL(:) * PWLCL(:)
ZUW2 (:) = 0.
ZE1 (:) = 1.
ZD1 (:) = 0.
PCAPE (:) = 0.
KCTL (:) = IKB
KETL (:) = KLCL(:)
GWORK2(:) = .TRUE.
GWORK5(:) = .TRUE.
ZPI (:) = 1.
ZWORK3(:) = 0.
ZWORK4(:) = 0.
ZWORK5(:) = 0.
ZWORK6(:) = 0.
GWORK1(:) = .FALSE.
GWORK4(:) = .FALSE.
!
!
!* 1.1 Compute undilute updraft theta_e for CAPE computations
! Bolton (1980) formula.
! Define accurate enthalpy for updraft
! -----------------------------------------------------
!
ZTHEUL(:) = PTLCL(:) * ( PTHLCL(:) / PTLCL(:) ) ** ( 1. - 0.28 * PRVLCL(:) ) &
* EXP( ( 3374.6525 / PTLCL(:) - 2.5403 ) * &
PRVLCL(:) * ( 1. + 0.81 * PRVLCL(:) ) )
!
!
ZWORK1(:) = ( XCPD + PRVLCL(:) * XCPV ) * PTLCL(:) &
+ ( 1. + PRVLCL(:) ) * XG * PZLCL(:)
!
!
!* 2. Set updraft properties between DPL and LCL
! ------------------------------------------
!
JKP = MAXVAL( KLCL(:) )
JKM = MINVAL( KDPL(:) )
DO JK = JKM, JKP
DO JI = 1, IIE
IF ( JK >= KDPL(JI) .AND. JK < KLCL(JI) ) THEN
PUMF(JI,JK) = PMFLCL(JI)
PUTHL(JI,JK) = ZWORK1(JI)
PUTHV(JI,JK) = PTHLCL(JI) * ( 1. + ZEPSA * PRVLCL(JI) ) / &
( 1. + PRVLCL(JI) )
PURW(JI,JK) = PRVLCL(JI)
END IF
END DO
END DO
!
!
!* 3. Enter loop for updraft computations
! ------------------------------------
!
JKMIN = MINVAL( KLCL(:) - 1 )
DO JK = MAX( IKB + 1, JKMIN ), IKE - 1
ZWORK6(:) = 1.
JKP = JK + 1
!
GWORK4(:) = JK >= KLCL(:) - 1
GWORK1(:) = GWORK4(:) .AND. GWORK2(:) ! this mask is used to confine
! updraft computations between the LCL and the CTL
!
WHERE( JK == KLCL(:) - 1 ) ZWORK6(:) = 0. ! factor that is used in buoyancy
! computation at first level above LCL
!
!
!* 4. Estimate condensate, L_v L_i, Cph and theta_v at level k+1
! ----------------------------------------------------------
!
ZWORK1(:) = PURC(:,JK) + PURR(:,JK)
ZWORK2(:) = PURI(:,JK) + PURS(:,JK)
CALL CONVECT_CONDENS
( KLON, KICE, PPRES(:,JKP), PUTHL(:,JK), PURW(:,JK),&
ZWORK1, ZWORK2, PZ(:,JKP), GWORK1, ZUT, ZURV, &
PURC(:,JKP), PURI(:,JKP), ZLV, ZLS, ZCPH )
!
!
ZPI(:) = ( XP00 / PPRES(:,JKP) ) ** ZRDOCP
WHERE ( GWORK1(:) )
!
PUTHV(:,JKP) = ZPI(:) * ZUT(:) * ( 1. + ZEPSA * ZURV(:) ) &
/ ( 1. + PURW(:,JK) )
!
!
!* 5. Compute square of vertical velocity using entrainment
! at level k
! -----------------------------------------------------
!
ZWORK3(:) = PZ(:,JKP) - PZ(:,JK) * ZWORK6(:) - &
( 1. - ZWORK6(:) ) * PZLCL(:) ! level thickness
ZWORK4(:) = PTHV(:,JK) * ZWORK6(:) + &
( 1. - ZWORK6(:) ) * PTHVELCL(:)
ZWORK5(:) = 2. * ZUW1(:) * PUER(:,JK) / MAX( .1, PUMF(:,JK) )
ZUW2 (:) = ZUW1(:) + ZWORK3(:) * XNHGAM * XG * &
( ( PUTHV(:,JK) + PUTHV(:,JKP) ) / &
( ZWORK4(:) + PTHV(:,JKP) ) - 1. ) & ! buoyancy term
- ZWORK5(:) ! entrainment term
! save vertical velocity into puww for output
PUWW(:,JKP) = SQRT( MAX( 1.E-2, ZUW2(:) ) )
!
!
!* 6. Update total precipitation: dr_r=(r_c+r_i)*exp(-rate*dz)
! --------------------------------------------------------
!
! compute level mean vertical velocity
ZWORK2(: ) = 0.5 * &
( SQRT( MAX( 1.E-2, ZUW2(:) ) ) + &
SQRT( MAX( 1.E-2, ZUW1(:) ) ) )
PURR (:,JKP) = 0.5 * ( PURC(:,JK) + PURC(:,JKP) + PURI(:,JK) + PURI(:,JKP) )&
* ( 1. - EXP( - XRCONV * ZWORK3(:) / ZWORK2(:) ) )
PUPR (:,JKP) = PURR(:,JKP) * PUMF(:,JK) ! precipitation rate ( kg water / s)
PUTPR (: ) = PUTPR(:) + PUPR(:,JKP) ! total precipitation rate
ZWORK2(: ) = PURR(:,JKP) / MAX( 1.E-8, PURC(:,JKP) + PURI(:,JKP) )
PURR (:,JKP) = ZWORK2(:) * PURC(:,JKP) ! liquid precipitation
PURS (:,JKP) = ZWORK2(:) * PURI(:,JKP) ! solid precipitation
!
!
!* 7. Update r_c, r_i, enthalpy, r_w for precipitation
! -------------------------------------------------------
!
PURW (:,JKP) = PURW(:,JK ) - PURR(:,JKP) - PURS(:,JKP)
PURC (:,JKP) = PURC(:,JKP) - PURR(:,JKP)
PURI (:,JKP) = PURI(:,JKP) - PURS(:,JKP)
PUTHL(:,JKP) = ( XCPD + PURW(:,JKP) * XCPV ) * ZUT(:) &
+ ( 1. + PURW(:,JKP) ) * XG * PZ(:,JKP) &
- ZLV(:) * PURC(:,JKP) - ZLS(:) * PURI(:,JKP)
!
ZUW1(: ) = ZUW2(:)
!
END WHERE
!
!
!* 8. Compute entrainment and detrainment using conservative
! variables adjusted for precipitation ( not for entrainment)
! -----------------------------------------------------------
!
!* 8.1 Compute critical mixed fraction by estimating unknown
! T^mix r_c^mix and r_i^mix from enthalpy^mix and r_w^mix
! We determine the zero crossing of the linear curve
! evaluating the derivative using ZMIXF=0.1.
! -----------------------------------------------------
!
ZMIXF(:) = 0.1 ! starting value for critical mixed fraction
ZWORK1(:) = ZMIXF(:) * PTHL(:,JKP) &
+ ( 1. - ZMIXF(:) ) * PUTHL(:,JKP) ! mixed enthalpy
ZWORK2(:) = ZMIXF(:) * PRW(:,JKP) &
+ ( 1. - ZMIXF(:) ) * PURW(:,JKP) ! mixed r_w
!
CALL CONVECT_CONDENS
( KLON, KICE, PPRES(:,JKP), ZWORK1, ZWORK2, &
PURC(:,JKP), PURI(:,JKP), PZ(:,JKP), GWORK1, ZUT,&
ZWORK3, ZWORK4, ZWORK5, ZLV, ZLS, ZCPH )
! put in enthalpy and r_w and get T r_c, r_i (ZUT, ZWORK4-5)
!
! compute theta_v of mixture
ZWORK3(:) = ZUT(:) * ZPI(:) * ( 1. + ZEPSA * ( &
ZWORK2(:) - ZWORK4(:) - ZWORK5(:) ) ) / ( 1. + ZWORK2(:) )
! compute final value of critical mixed fraction using theta_v
! of mixture, grid-scale and updraft
ZMIXF(:) = MAX( 0., PUTHV(:,JKP) - PTHV(:,JKP) ) * ZMIXF(:) / &
( PUTHV(:,JKP) - ZWORK3(:) + 1.E-10 )
ZMIXF(:) = MAX( 0., MIN( 1., ZMIXF(:) ) )
!
!
!* 8.2 Compute final midlevel values for entr. and detrainment
! after call of distribution function
! -------------------------------------------------------
!
!
CALL CONVECT_MIXING_FUNCT
( KLON, ZMIXF, 1, ZE2, ZD2 )
! Note: routine MIXING_FUNCT returns fractional entrainm/detrainm. rates
!
! ZWORK1(:) = XENTR * PMFLCL(:) * PDPRES(:,JKP) / pcrad(:) ! rate of env. inflow !jiao xcrad
!*MOD
ZWORK1(:) = XENTR * XG / pcrad(:) * PUMF(:,JK) * ( PZ(:,JKP) - PZ(:,JK) ) !jiao xcrad
! ZWORK1(:) = XENTR * pumf(:,jk) * PDPRES(:,JKP) / pcrad(:) ! rate of env. inflow !jiao xcrad
!*MOD
ZWORK2(:) = 0.
WHERE ( GWORK1(:) ) ZWORK2(:) = 1.
WHERE ( PUTHV(:,JKP) > PTHV(:,JKP) )
ze2=.5; zd2=.5 ! modif entrainment=detrainment, this avoids
! too large mass flux values at upper levels
! ze2(:)=max(ze2(:),0.5) !jiao need more test Kain2004,eq(4)
! ze2(:)=max(ze2(:),0.5);zd2(:)=max(zd2(:),0.5) !jiao need more test Kain2004,eq(4)
PUER(:,JKP) = 0.5 * ZWORK1(:) * ( ZE1(:) + ZE2(:) ) * ZWORK2(:)
PUDR(:,JKP) = 0.5 * ZWORK1(:) * ( ZD1(:) + ZD2(:) ) * ZWORK2(:)
ELSEWHERE
PUER(:,JKP) = 0.
PUDR(:,JKP) = ZWORK1(:) * ZWORK2(:)
END WHERE
!
!* 8.3 Determine equilibrium temperature level
! --------------------------------------
!
WHERE ( PUTHV(:,JKP) > PTHV(:,JKP) .AND. JK > KLCL(:) + 1 &
.AND. GWORK1(:) )
KETL(:) = JKP ! equilibrium temperature level
END WHERE
!
!* 8.4 If the calculated detrained mass flux is greater than
! the total updraft mass flux, or vertical velocity is
! negative, all cloud mass detrains at previous model level,
! exit updraft calculations - CTL is attained
! -------------------------------------------------------
!
WHERE( GWORK1(:) ) &
GWORK2(:) = PUMF(:,JK) - PUDR(:,JKP) > 10. .AND. ZUW2(:) > 0.
WHERE ( GWORK2(:) ) KCTL(:) = JKP ! cloud top level
GWORK1(:) = GWORK2(:) .AND. GWORK4(:)
!
IF ( COUNT( GWORK2(:) ) == 0 ) EXIT
!
!
!* 9. Compute CAPE for undilute ascent using theta_e and
! theta_es instead of theta_v. This estimation produces
! a significantly larger value for CAPE than the actual one.
! ----------------------------------------------------------
!
WHERE ( GWORK1(:) )
!
ZWORK3(:) = PZ(:,JKP) - PZ(:,JK) * ZWORK6(:) - &
( 1. - ZWORK6(:) ) * PZLCL(:) ! level thickness
ZWORK2(:) = PTHES(:,JK) + ( 1. - ZWORK6(:) ) * &
( PTHES(:,JKP) - PTHES(:,JK) ) / ( PZ(:,JKP) - PZ(:,JK) ) * &
( PZLCL(:) - PZ(:,JK) ) ! linear interpolation for theta_es at LCL
! ( this is only done for model level just above LCL
!
ZWORK1(:) = ( 2. * ZTHEUL(:) ) / ( ZWORK2(:) + PTHES(:,JKP) ) - 1.
!
!jiao dilute beg----------------------------------------------------------
! cape now calculated by an entrainment influenced dilute ascent
! profile rather than the original undilute ascent
!jiao bkf
ZWORK2(:) = PTHVELCL(:)* (1. - ZWORK6(:)) + PUTHV(:,JK) * ZWORK6(:)
ZWORK1(:) = (ZWORK2(:)+PUTHV(:,JKP)) / (PTHV(:,JK) + PTHV(:,JKP)) - 1.
!jiao bkf
!jiao dilute end----------------------------------------------------------
PCAPE(:) = PCAPE(:) + XG * ZWORK3(:) * MAX( 0., ZWORK1(:) )
!
!
!* 10. Compute final values of updraft mass flux, enthalpy, r_w
! at level k+1
! --------------------------------------------------------
!
PUMF(:,JKP) = PUMF(:,JK) - PUDR(:,JKP) + PUER(:,JKP)
PUMF(:,JKP) = MAX( PUMF(:,JKP), 0.1 )
PUTHL(:,JKP) = ( PUMF(:,JK) * PUTHL(:,JK) + &
PUER(:,JKP) * PTHL(:,JK) - PUDR(:,JKP) * PUTHL(:,JK) ) &
/ PUMF(:,JKP) + PUTHL(:,JKP) - PUTHL(:,JK)
PURW(:,JKP) = ( PUMF(:,JK) * PURW(:,JK) + &
PUER(:,JKP) * PRW(:,JK) - PUDR(:,JKP) * PURW(:,JK) ) &
/ PUMF(:,JKP) - PURR(:,JKP) - PURS(:,JKP)
!
ZE1(:) = ZE2(:) ! update fractional entrainment/detrainment
ZD1(:) = ZD2(:)
!
END WHERE
!
END DO
!
!* 12.1 Set OTRIG to False if cloud thickness < XCDEPTH
! or CAPE < 1
! ------------------------------------------------
!
DO JI = 1, IIE
JK = KCTL(JI)
OTRIG(JI) = PZ(JI,JK) - PZLCL(JI) >= PCDEP(JI) &
.AND. PCAPE(JI) > 1.
END DO
WHERE( .NOT. OTRIG(:) )
KCTL(:) = IKB
END WHERE
KETL(:) = MAX( KETL(:), KLCL(:) + 2 )
KETL(:) = MIN( KETL(:), KCTL(:) )
!
!
!* 12.2 If the ETL and CTL are the same detrain updraft mass
! flux at this level
! -------------------------------------------------------
!
ZWORK1(:) = 0.
WHERE ( KETL(:) == KCTL(:) ) ZWORK1(:) = 1.
!
DO JI = 1, IIE
JK = KETL(JI)
PUDR(JI,JK) = PUDR(JI,JK) + &
( PUMF(JI,JK) - PUER(JI,JK) ) * ZWORK1(JI)
PUER(JI,JK) = PUER(JI,JK) * ( 1. - ZWORK1(JI) )
PUMF(JI,JK) = PUMF(JI,JK) * ( 1. - ZWORK1(JI) )
JKP = KCTL(JI) + 1
PUER(JI,JKP) = 0. ! entrainm/detr rates have been already computed
PUDR(JI,JKP) = 0. ! at level KCTL+1, set them to zero
END DO
!
!* 12.3 Adjust mass flux profiles, detrainment rates, and
! precipitation fallout rates to reflect linear decrease
! in mass flux between the ETL and CTL
! -------------------------------------------------------
!
ZWORK1(:) = 0.
JK1 = MINVAL( KETL(:) )
JK2 = MAXVAL( KCTL(:) )
DO JK = JK1, JK2
DO JI = 1, IIE
IF( JK > KETL(JI) .AND. JK <= KCTL(JI) ) THEN
ZWORK1(JI) = ZWORK1(JI) + PDPRES(JI,JK)
END IF
END DO
END DO
!
DO JI = 1, IIE
JK = KETL(JI)
ZWORK1(JI) = PUMF(JI,JK) / MAX( 1., ZWORK1(JI) )
END DO
!
DO JK = JK1 + 1, JK2
JKP = JK - 1
DO JI = 1, IIE
IF ( JK > KETL(JI) .AND. JK <= KCTL(JI) ) THEN
! PUTPR(JI) = PUTPR(JI) - ( PURR(JI,JK) + PURS(JI,JK) ) * PUMF(JI,JKP)
PUTPR(JI) = PUTPR(JI) - PUPR(JI,JK)
PUDR(JI,JK) = PDPRES(JI,JK) * ZWORK1(JI)
PUMF(JI,JK) = PUMF(JI,JKP) - PUDR(JI,JK)
PUPR(JI,JK) = PUMF(JI,JKP) * ( PURR(JI,JK) + PURS(JI,JK) )
PUTPR(JI) = PUTPR(JI) + PUPR(JI,JK)
END IF
END DO
END DO
!
! 12.4 Set mass flux and entrainment in the source layer.
! Linear increase throughout the source layer.
! -------------------------------------------------------
!
!IWORK(:) = MIN( KPBL(:), KLCL(:) - 1 )
IWORK(:) = KPBL(:)
DO JI = 1, IIE
JK = KDPL(JI)
JKP = IWORK(JI)
! mixed layer depth
ZWORK2(JI) = PPRES(JI,JK) - PPRES(JI,JKP) + PDPRES(JI,JK)
END DO
!
JKP = MAXVAL( IWORK(:) )
DO JK = JKM, JKP
DO JI = 1, IIE
IF ( JK >= KDPL(JI) .AND. JK <= IWORK(JI) ) THEN
PUER(JI,JK) = PUER(JI,JK) + PMFLCL(JI) * PDPRES(JI,JK) / ( ZWORK2(JI) + 0.1 )
PUMF(JI,JK) = PUMF(JI,JK-1) + PUER(JI,JK)
END IF
END DO
END DO
!
!
!* 13. If cloud thickness is smaller than 3 km, no
! convection is allowed
! Nota: For technical reasons, we stop the convection
! computations in this case and do not go back to
! TRIGGER_FUNCT to look for the next unstable LCL
! which could produce a thicker cloud.
! ---------------------------------------------------
!
GWORK6(:,:) = SPREAD( OTRIG(:), DIM=2, NCOPIES=KLEV )
WHERE ( .NOT. OTRIG(:) ) PUTPR(:) = 0.
WHERE ( .NOT. GWORK6(:,:) )
PUMF(:,:) = 0.
PUDR(:,:) = 0.
PUER(:,:) = 0.
PUTHL(:,:) = PTHL(:,:)
PURW(:,:) = PRW(:,:)
PUPR(:,:) = 0.
PURC(:,:) = 0.
PURI(:,:) = 0.
PURR(:,:) = 0.
PURS(:,:) = 0.
PUWW(:,:) = 0.
END WHERE
!
END SUBROUTINE CONVECT_UPDRAFT
!
!
!-------------------------------------------------------------------------------
!
! ##########################################################################
SUBROUTINE CONVECT_CONDENS( KLON, & 4,2
KICE, PPRES, PTHL, PRW, PRCO, PRIO, PZ, OWORK1, &
PT, PEW, PRC, PRI, PLV, PLS, PCPH )
! ###########################################################################
!
!!**** Compute temperature cloud and ice water content from enthalpy and r_w
!!
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine cloud condensate
!! and to return values for L_v, L_s and C_ph
!!
!!
!!** METHOD
!! ------
!! Condensate is extracted iteratively
!!
!!
!! EXTERNAL
!! --------
!! None
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!! Module MODD_CSTS
!! XG ! gravity constant
!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure
!! XALPI, XBETAI, XGAMI ! constants for ice saturation pressure
!! XP00 ! reference pressure
!! XRD, XRV ! gaz constants for dry air and water vapor
!! XCPD, XCPV ! specific heat for dry air and water vapor
!! XCL, XCI ! specific heat for liquid water and ice
!! XTT ! triple point temperature
!! XLVTT, XLSTT ! vaporization, sublimation heat constant
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CONVPAR
!! XTFRZ1 ! begin of freezing interval
!! XTFRZ2 ! end of freezing interval
!!
!! REFERENCE
!! ---------
!!
!! Book1,2 of documentation ( routine CONVECT_CONDENS)
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 07/11/95
!! Last modified 04/10/97
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CSTS
USE MODD_CONVPAR
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
INTEGER, INTENT(IN) :: KLON ! horizontal loop index
INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes,
! 0 = no ice )
REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure
REAL, DIMENSION(KLON), INTENT(IN) :: PTHL ! enthalpy (J/kg)
REAL, DIMENSION(KLON), INTENT(IN) :: PRW ! total water mixing ratio
REAL, DIMENSION(KLON), INTENT(IN) :: PRCO ! cloud water estimate (kg/kg)
REAL, DIMENSION(KLON), INTENT(IN) :: PRIO ! cloud ice estimate (kg/kg)
REAL, DIMENSION(KLON), INTENT(IN) :: PZ ! level height (m)
LOGICAL, DIMENSION(KLON),INTENT(IN) :: OWORK1 ! logical mask
!
!
REAL, DIMENSION(KLON), INTENT(OUT):: PT ! temperature
REAL, DIMENSION(KLON), INTENT(OUT):: PRC ! cloud water mixing ratio(kg/kg)
REAL, DIMENSION(KLON), INTENT(OUT):: PRI ! cloud ice mixing ratio (kg/kg)
REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v
REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s
REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph
REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! water saturation mixing ratio
!
!* 0.2 Declarations of local variables KLON
!
INTEGER :: JITER ! iteration index
REAL :: ZEPS, ZEPSA ! R_d / R_v, 1 / ZEPS
REAL :: ZCVOCD ! XCPV / XCPD
REAL :: ZRDOCP ! R_d / C_pd
!
REAL, DIMENSION(KLON) :: ZEI ! ice saturation mixing ratio
REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZT ! work arrays
!
!
!-------------------------------------------------------------------------------
!
!* 1. Initialize temperature and Exner function
! -----------------------------------------
!
ZRDOCP = XRD / XCPD
ZEPS = XRD / XRV
ZEPSA = 1. / ZEPS
ZCVOCD = XCPV / XCPD
!
!
! Make a first temperature estimate, based e.g. on values of
! r_c and r_i at lower level
!
!! Note that the definition of ZCPH is not the same as used in
!! routine CONVECT_SATMIXRATIO
PCPH(:) = XCPD + XCPV * PRW(:)
ZWORK1(:) = ( 1. + PRW(:) ) * XG * PZ(:)
PT(:) = ( PTHL(:) + PRCO(:) * XLVTT + PRIO(:) * XLSTT - ZWORK1(:) ) &
/ PCPH(:)
PT(:) = MAX(180., MIN( 330., PT(:) ) ) ! set overflow bounds in
! case that PTHL=0
!
!
!* 2. Enter the iteration loop
! ------------------------
!
DO JITER = 1,6
PEW(:) = EXP( XALPW - XBETAW / PT(:) - XGAMW * LOG( PT(:) ) )
ZEI(:) = EXP( XALPI - XBETAI / PT(:) - XGAMI * LOG( PT(:) ) )
PEW(:) = ZEPS * PEW(:) / ( PPRES(:) - PEW(:) )
ZEI(:) = ZEPS * ZEI(:) / ( PPRES(:) - ZEI(:) )
!
PLV(:) = XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT ) ! compute L_v
PLS(:) = XLSTT + ( XCPV - XCI ) * ( PT(:) - XTT ) ! compute L_i
!
ZWORK2(:) = ( XTFRZ1 - PT(:) ) / ( XTFRZ1 - XTFRZ2 ) ! freezing interval
ZWORK2(:) = MAX( 0., MIN(1., ZWORK2(:) ) ) * REAL( KICE )
ZWORK3(:) = ( 1. - ZWORK2(:) ) * PEW(:) + ZWORK2(:) * ZEI(:)
PRC(:) = MAX( 0., ( 1. - ZWORK2(:) ) * ( PRW(:) - ZWORK3(:) ) )
PRI(:) = MAX( 0., ZWORK2(:) * ( PRW(:) - ZWORK3(:) ) )
ZT(:) = ( PTHL(:) + PRC(:) * PLV(:) + PRI(:) * PLS(:) - ZWORK1(:) ) &
/ PCPH(:)
PT(:) = PT(:) + ( ZT(:) - PT(:) ) * 0.4 ! force convergence
PT(:) = MAX( 175., MIN( 330., PT(:) ) )
END DO
!
!
END SUBROUTINE CONVECT_CONDENS
!
!---------------------------------------------------------------------------
!
! ################################################################
SUBROUTINE CONVECT_SATMIXRATIO( KLON, & 12,1
PPRES, PT, PEW, PLV, PLS, PCPH )
! ################################################################
!
!!**** Compute vapor saturation mixing ratio over liquid water
!!
!!
!! PDRPOSE
!! -------
!! The purpose of this routine is to determine saturation mixing ratio
!! and to return values for L_v L_s and C_ph
!!
!!
!!** METHOD
!! ------
!!
!!
!! EXTERNAL
!! --------
!! None
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CSTS
!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure
!! XRD, XRV ! gaz constants for dry air and water vapor
!! XCPD, XCPV ! specific heat for dry air and water vapor
!! XCL, XCI ! specific heat for liquid water and ice
!! XTT ! triple point temperature
!! XLVTT, XLSTT ! vaporization, sublimation heat constant
!!
!!
!! REFERENCE
!! ---------
!!
!! Book1,2 of documentation ( routine CONVECT_SATMIXRATIO)
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 07/11/95
!! Last modified 04/10/97
!------------------------- ------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CSTS
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
!
INTEGER, INTENT(IN) :: KLON ! horizontal loop index
REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure
REAL, DIMENSION(KLON), INTENT(IN) :: PT ! temperature
!
REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! vapor saturation mixing ratio
REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v
REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s
REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph
!
!* 0.2 Declarations of local variables :
!
REAL, DIMENSION(KLON) :: ZT ! temperature
REAL :: ZEPS ! R_d / R_v
!
!
!-------------------------------------------------------------------------------
!
ZEPS = XRD / XRV
!
ZT(:) = MIN( 400., MAX( PT(:), 10. ) ) ! overflow bound
PEW(:) = EXP( XALPW - XBETAW / ZT(:) - XGAMW * LOG( ZT(:) ) )
PEW(:) = ZEPS * PEW(:) / ( PPRES(:) - PEW(:) )
!
PLV(:) = XLVTT + ( XCPV - XCL ) * ( ZT(:) - XTT ) ! compute L_v
PLS(:) = XLSTT + ( XCPV - XCI ) * ( ZT(:) - XTT ) ! compute L_i
!
PCPH(:) = XCPD + XCPV * PEW(:) ! compute C_ph
!
END SUBROUTINE CONVECT_SATMIXRATIO
!
!--------------------------------------------------------------------------
!
! #######################################################
SUBROUTINE CONVECT_MIXING_FUNCT( KLON, & 2
PMIXC, KMF, PER, PDR )
! #######################################################
!
!!**** Determine the area under the distribution function
!! KMF = 1 : gaussian KMF = 2 : triangular distribution function
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine the entrainment and
!! detrainment rate by evaluating the are under the distribution
!! function. The integration interval is limited by the critical
!! mixed fraction PMIXC
!!
!!
!!
!!** METHOD
!! ------
!! Use handbook of mathemat. functions by Abramowitz and Stegun, 1968
!!
!!
!!
!! EXTERNAL
!! --------
!! None
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! None
!!
!!
!! REFERENCE
!! ---------
!!
!! Book2 of documentation ( routine MIXING_FUNCT)
!! Abramovitz and Stegun (1968), handbook of math. functions
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 07/11/95
!! Last modified 04/10/97
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KMF ! switch for dist. function
REAL, DIMENSION(KLON), INTENT(IN) :: PMIXC ! critical mixed fraction
!
REAL, DIMENSION(KLON), INTENT(OUT):: PER ! normalized entrainment rate
REAL, DIMENSION(KLON), INTENT(OUT):: PDR ! normalized detrainment rate
!
!* 0.2 Declarations of local variables :
!
REAL :: ZSIGMA = 0.166666667 ! standard deviation
REAL :: ZFE = 4.931813949 ! integral normalization
REAL :: ZSQRTP = 2.506628, ZP = 0.33267 ! constants
REAL :: ZA1 = 0.4361836, ZA2 =-0.1201676 ! constants
REAL :: ZA3 = 0.9372980, ZT1 = 0.500498 ! constants
REAL :: ZE45 = 0.01111 ! constant
!
REAL, DIMENSION(KLON) :: ZX, ZY, ZW1, ZW2 ! work variables
REAL :: ZW11
!
!
!-------------------------------------------------------------------------------
!
! 1. Use gaussian function for KMF=1
! -------------------------------
!
IF( KMF == 1 ) THEN
! ZX(:) = ( PMIXC(:) - 0.5 ) / ZSIGMA
ZX(:) = 6. * PMIXC(:) - 3.
ZW1(:) = 1. / ( 1.+ ZP * ABS ( ZX(:) ) )
ZY(:) = EXP( -0.5 * ZX(:) * ZX(:) )
ZW2(:) = ZA1 * ZW1(:) + ZA2 * ZW1(:) * ZW1(:) + &
ZA3 * ZW1(:) * ZW1(:) * ZW1(:)
ZW11 = ZA1 * ZT1 + ZA2 * ZT1 * ZT1 + ZA3 * ZT1 * ZT1 * ZT1
ENDIF
!
WHERE ( KMF == 1 .AND. ZX(:) >= 0. )
PER(:) = ZSIGMA * ( 0.5 * ( ZSQRTP - ZE45 * ZW11 &
- ZY(:) * ZW2(:) ) + ZSIGMA * ( ZE45 - ZY(:) ) ) &
- 0.5 * ZE45 * PMIXC(:) * PMIXC(:)
PDR(:) = ZSIGMA*( 0.5 * ( ZY(:) * ZW2(:) - ZE45 * ZW11 ) &
+ ZSIGMA * ( ZE45 - ZY(:) ) ) &
- ZE45 * ( 0.5 + 0.5 * PMIXC(:) * PMIXC(:) - PMIXC(:) )
END WHERE
WHERE ( KMF == 1 .AND. ZX(:) < 0. )
PER(:) = ZSIGMA*( 0.5 * ( ZY(:) * ZW2(:) - ZE45 * ZW11 ) &
+ ZSIGMA * ( ZE45 - ZY(:) ) ) &
- 0.5 * ZE45 * PMIXC(:) * PMIXC(:)
PDR(:) = ZSIGMA * ( 0.5 * ( ZSQRTP - ZE45 * ZW11 - ZY(:) &
* ZW2(:) ) + ZSIGMA * ( ZE45 - ZY(:) ) ) &
- ZE45 * ( 0.5 + 0.5 * PMIXC(:) * PMIXC(:) - PMIXC(:) )
END WHERE
!
PER(:) = PER(:) * ZFE
PDR(:) = PDR(:) * ZFE
!
!
! 2. Use triangular function KMF=2
! -------------------------------
!
! not yet released
!
!
END SUBROUTINE CONVECT_MIXING_FUNCT
!
!
!-------------------------------------------------------------------------------
!
! ######################################################################
SUBROUTINE CONVECT_TSTEP_PREF( KLON, KLEV, & 1,1
PU, PV, PPRES, PZ, PDXDY, KLCL, KCTL, &
PTIMEA, PPREF )
! ######################################################################
!
!!**** Routine to compute convective advection time step and precipitation
!! efficiency
!!
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine the convective
!! advection time step PTIMEC as a function of the mean ambient
!! wind as well as the precipitation efficiency as a function
!! of wind shear and cloud base height.
!!
!!
!!** METHOD
!! ------
!!
!!
!! EXTERNAL
!! --------
!! None
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! REFERENCE
!! ---------
!!
!! Book1,2 of documentation
!! Fritsch and Chappell, 1980, J. Atmos. Sci.
!! Kain and Fritsch, 1993, Meteor. Monographs, Vol.
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 07/11/95
!! Last modified 04/10/97
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CONVPAREXT
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (Pa)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PU ! grid scale horiz. wind u
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PV ! grid scale horiz. wind v
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m)
REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2)
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! lifting condensation level index
INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! cloud top level index
!
REAL, DIMENSION(KLON), INTENT(OUT):: PTIMEA ! advective time period
REAL, DIMENSION(KLON), INTENT(OUT):: PPREF ! precipitation efficiency
!
!
!* 0.2 Declarations of local variables KLON
!
INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds
INTEGER :: JI ! horizontal loop index
INTEGER :: JK, JKLC, JKP5, JKCT ! vertical loop index
!
INTEGER, DIMENSION(KLON) :: IP500 ! index of 500 hPa levels
REAL, DIMENSION(KLON) :: ZCBH ! cloud base height
REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3 ! work arrays
!
!
!-------------------------------------------------------------------------------
!
! 0.3 Set loop bounds
! ---------------
!
IIE = KLON
IKB = 1 + JCVEXB
IKE = KLEV - JCVEXT
!
!
!* 1. Determine vertical index for 500 hPa levels
! ------------------------------------------
!
!
IP500(:) = IKB
DO JK = IKB, IKE
WHERE ( PPRES(:,JK) >= 500.E2 ) IP500(:) = JK
END DO
!
!
!* 2. Compute convective time step
! ----------------------------
!
! compute wind speed at LCL, 500 hPa, CTL
DO JI = 1, IIE
JKLC = KLCL(JI)
JKP5 = IP500(JI)
JKCT = KCTL(JI)
ZWORK1(JI) = SQRT( PU(JI,JKLC) * PU(JI,JKLC) + &
PV(JI,JKLC) * PV(JI,JKLC) )
ZWORK2(JI) = SQRT( PU(JI,JKP5) * PU(JI,JKP5) + &
PV(JI,JKP5) * PV(JI,JKP5) )
ZWORK3(JI) = SQRT( PU(JI,JKCT) * PU(JI,JKCT) + &
PV(JI,JKCT) * PV(JI,JKCT) )
END DO
!
ZWORK2(:) = MAX( 0.1, 0.5 * ( ZWORK1(:) + ZWORK2(:) ) )
!
!correction debordement domi
DO JI = 1, IIE
PTIMEA(:) = SQRT( PDXDY(:) ) / ZWORK2(:)
END DO
!
!
!* 3. Compute precipitation efficiency
! -----------------------------------
!
!* 3.1 Precipitation efficiency as a function of wind shear
! ----------------------------------------------------
!
ZWORK2(:) = SIGN( 1., ZWORK3(:) - ZWORK1(:) )
DO JI = 1, IIE
JKLC = KLCL(JI)
JKCT = KCTL(JI)
ZWORK1(JI) = ( PU(JI,JKCT) - PU(JI,JKLC) ) * &
( PU(JI,JKCT) - PU(JI,JKLC) ) + &
( PV(JI,JKCT) - PV(JI,JKLC) ) * &
( PV(JI,JKCT) - PV(JI,JKLC) )
ZWORK1(JI) = 1.E3 * ZWORK2(JI) * SQRT( ZWORK1(JI) ) / &
MAX( 1.E-2, PZ(JI,JKCT) - PZ(JI,JKLC) )
END DO
!
PPREF(:) = 1.591 + ZWORK1(:) * ( -.639 + ZWORK1(:) * ( &
9.53E-2 - ZWORK1(:) * 4.96E-3 ) )
PPREF(:) = MAX( .4, MIN( PPREF(:), .92 ) )
!PPREF(:) = MAX( .2, MIN( PPREF(:), .90 ) ) !jiao bkf
!
!* 3.2 Precipitation efficiency as a function of cloud base height
! ----------------------------------------------------------
!
DO JI = 1, IIE
JKLC = KLCL(JI)
ZCBH(JI) = MAX( 3., ( PZ(JI,JKLC) - PZ(JI,IKB) ) * 3.281E-3 )
END DO
ZWORK1(:) = .9673 + ZCBH(:) * ( -.7003 + ZCBH(:) * ( .1622 + &
ZCBH(:) * ( -1.2570E-2 + ZCBH(:) * ( 4.2772E-4 - &
ZCBH(:) * 5.44E-6 ) ) ) )
ZWORK1(:) = MAX( .4, MIN( .92, 1./ ( 1. + ZWORK1(:) ) ) )
!ZWORK1(:) = MAX( .2, MIN( .90, 1./ ( 1. + ZWORK1(:) ) ) ) !jiao bkf
!
!* 3.3 Mean precipitation efficiency is used to compute rainfall
! ----------------------------------------------------------
!
PPREF(:) = 0.5 * ( PPREF(:) + ZWORK1(:) )
!
!
END SUBROUTINE CONVECT_TSTEP_PREF
!
!-------------------------------------------------------------------------------
!
! #######################################################################
SUBROUTINE CONVECT_DOWNDRAFT( KLON, KLEV, & 1,5
KICE, PPRES, PDPRES, PZ, PTH, PTHES, &
PRW, PRC, PRI, &
PPREF, KLCL, KCTL, KETL, &
PUTHL, PURW, PURC, PURI, &
PDMF, PDER, PDDR, PDTHL, PDRW, &
PMIXF, PDTEVR, KLFS, KDBL, KML, &
PDTEVRF, PCRAD ) !jiao xcrad
! ########################################################################
!
!!**** Compute downdraft properties from LFS to DBL.
!!
!!
!! PDRPOSE
!! -------
!! The purpose of this routine is to determine downdraft properties
!! ( mass flux, thermodynamics )
!!
!!
!!** METHOD
!! ------
!! Computations are done at every model level starting from top.
!! The use of masks allows to optimise the inner loops (horizontal loops).
!!
!!
!!
!! EXTERNAL
!! --------
!! Routine CONVECT_SATMIXRATIO
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!! Module MODD_CSTS
!! XG ! gravity constant
!! XPI ! Pi
!! XP00 ! reference pressure
!! XRD, XRV ! gaz constants for dry air and water vapor
!! XCPD ! Cpd (dry air)
!! XCPV, XCL, XCI ! Cp of water vapor, liquid water and ice
!! XTT ! triple point temperature
!! XLVTT, XLSTT ! vaporisation/sublimation heat at XTT
!!
!! Module MODD_CONVPAR
!! XCRAD ! cloud radius
!! XZPBL ! thickness of downdraft detrainment layer
!! XENTR ! entrainment constant in pressure coordinates
!! XRHDBC ! relative humidity in downdraft below cloud
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! REFERENCE
!! ---------
!!
!! Book1,2 of documentation ( routine CONVECT_DOWNDRAFT)
!! Kain and Fritsch, 1993, Meteor. Monographs, Vol.
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 07/11/95
!! Last modified 04/10/97
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CSTS
USE MODD_CONVPAR
USE MODD_CONVPAREXT
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes,
! 0 = no ice )
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTH ! grid scale theta
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRW ! grid scale total water
! mixing ratio
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRC ! grid scale r_c (cloud water)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRI ! grid scale r_i (cloud ice)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (Pa)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES! pressure difference between
! bottom and top of layer (Pa)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! level height (m)
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL
INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL
INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of
! equilibrium (zero buoyancy) level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! " vert. index of melting level
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURC ! updraft r_c (kg/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURI ! updraft r_i (kg/kg)
REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency
REAL, DIMENSION(KLON), INTENT(IN) :: PCRAD ! jiao xcrad
!
!
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDMF ! downdraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDER ! downdraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDDR ! downdraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDTHL ! downdraft enthalpy (J/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDRW ! downdraft total water (kg/kg)
REAL, DIMENSION(KLON), INTENT(OUT):: PMIXF ! mixed fraction at LFS
REAL, DIMENSION(KLON), INTENT(OUT):: PDTEVR ! total downdraft evaporation
! rate at LFS (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDTEVRF! downdraft evaporation rate
INTEGER, DIMENSION(KLON), INTENT(OUT):: KLFS ! contains vert. index of LFS
INTEGER, DIMENSION(KLON), INTENT(OUT):: KDBL ! contains vert. index of DBL
!
!* 0.2 Declarations of local variables :
!
INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds
INTEGER :: JK, JKP, JKM, JKT ! vertical loop index
INTEGER :: JI, JL ! horizontal loop index
INTEGER :: JITER ! iteration loop index
REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd
REAL :: ZEPS ! R_d / R_v
REAL :: ZEPSA, ZCVOCD ! R_v / R_d, C_pv / C_pd
!
INTEGER, DIMENSION(KLON) :: IDDT ! top level of detrainm. layer
REAL, DIMENSION(KLON) :: ZTHE ! environm. theta_e (K)
REAL, DIMENSION(KLON) :: ZDT, ZDTP ! downdraft temperature (K)
REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph
REAL, DIMENSION(KLON) :: ZLV, ZLS ! latent heat of vaporis., sublim.
REAL, DIMENSION(KLON) :: ZDDT ! thickness (hPa) of detrainm. layer
REAL, DIMENSION(KLON) :: ZPI ! Pi=(P0/P)**(Rd/Cpd)
REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, &
ZWORK5 ! work arrays
LOGICAL, DIMENSION(KLON) :: GWORK1 ! work array
!
!
!-------------------------------------------------------------------------------
!
! 0.3 Set loop bounds
! ---------------
!
IIE = KLON
IKB = 1 + JCVEXB
IKE = KLEV - JCVEXT
!
!
!* 1. Initialize downdraft properties
! -------------------------------
!
ZCPORD = XCPD / XRD
ZRDOCP = XRD / XCPD
ZEPS = XRD / XRV
ZEPSA = XRV / XRD
ZCVOCD = XCPV / XCPD
PDMF(:,:) = 0.
PDER(:,:) = 0.
PDDR(:,:) = 0.
PDRW(:,:) = 0.
PDTHL(:,:) = 0.
PDTEVR(:) = 0.
PMIXF(:) = 0.
ZTHE(:) = 0.
ZDDT(:) = PDPRES(:,IKB+2)
KDBL(:) = IKB + 1
KLFS(:) = IKB + 1
IDDT(:) = KDBL(:) + 1
!
!
!* 2. Determine the LFS by looking for minimum of environmental
! saturated theta_e
! ----------------------------------------------------------
!
ZWORK1(:) = 900. ! starting value for search of minimum envir. theta_e
DO JK = MINVAL( KLCL(:) ) + 2, MAXVAL( KETL(:) )
DO JI = 1, IIE
GWORK1(JI) = JK >= KLCL(JI) + 2 .AND. JK < KETL(JI)
IF ( GWORK1(JI) .AND. ZWORK1(JI) > PTHES(JI,JK) ) THEN
KLFS(JI) = JK
ZWORK1(JI) = MIN( ZWORK1(JI), PTHES(JI,JK) )
END IF
END DO
END DO
!
!
!* 3. Determine the mixed fraction using environmental and updraft
! values of theta_e at LFS
! ---------------------------------------------------------
!
DO JI = 1, IIE
JK = KLFS(JI)
ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP
! compute updraft theta_e
ZWORK3(JI) = PURW(JI,JK) - PURC(JI,JK) - PURI(JI,JK)
ZDT(JI) = PTH(JI,JK) / ZPI(JI)
ZLV(JI) = XLVTT + ( XCPV - XCL ) * ( ZDT(JI) - XTT )
ZLS(JI) = XLSTT + ( XCPV - XCI ) * ( ZDT(JI) - XTT )
ZCPH(JI) = XCPD + XCPV * PURW(JI,JK)
ZDT(JI) = ( PUTHL(JI,JK) - ( 1. + PURW(JI,JK) ) * XG * PZ(JI,JK) &
+ ZLV(JI) * PURC(JI,JK) + ZLS(JI) * PURI(JI,JK) ) / ZCPH(JI)
ZWORK1(JI) = ZDT(JI) * ZPI(JI) ** ( 1. - 0.28 * ZWORK3(JI) ) &
* EXP( ( 3374.6525 / ZDT(JI) - 2.5403 ) &
* ZWORK3(JI) * ( 1. + 0.81 * ZWORK3(JI) ) )
! compute environmental theta_e
ZDT(JI) = PTH(JI,JK) / ZPI(JI)
ZLV(JI) = XLVTT + ( XCPV - XCL ) * ( ZDT(JI) - XTT )
ZLS(JI) = XLSTT + ( XCPV - XCI ) * ( ZDT(JI) - XTT )
ZWORK3(JI) = PRW(JI,JK) - PRC(JI,JK) - PRI(JI,JK)
ZCPH(JI) = XCPD + XCPV * PRW(JI,JK)
ZWORK2(JI) = ZDT(JI) * ZPI(JI) ** ( 1. - 0.28 * ZWORK3(JI) ) &
* EXP( ( 3374.6525 / ZDT(JI) - 2.5403 ) &
* ZWORK3(JI) * ( 1. + 0.81 * ZWORK3(JI) ) )
! compute mixed fraction
PMIXF(JI) = MAX( 0., ( ZWORK1(JI) - PTHES(JI,JK) ) ) &
/ ( ZWORK1(JI) - ZWORK2(JI) + 1.E-10 )
PMIXF(JI) = MAX(0., MIN( 1., PMIXF(JI) ) )
ZWORK4(JI) = PPRES(JI,JK)
END DO
!
!
!* 4. Estimate the effect of melting on the downdraft
! ---------------------------------------------
!
ZWORK1(:) = 0.
! use total solid precipitation
!DO JK = IKB + 1, IKE
! ZWORK1(:) = ZWORK1(:) + PURS(:,JK) ! total snow/hail content
!END DO
!
DO JI = 1, IIE
JK = KLCL(JI)
JKP = KCTL(JI)
ZWORK1(JI) = 0.5 * ( PURW(JI,JK) - PURW(JI,JKP) )
END DO
!
! temperature perturbation due to melting at LFS
ZWORK3(:) = 0.
WHERE( KML(:) > IKB + 2 )
ZWORK3(:) = ZWORK1(:) * ( ZLS(:) - ZLV(:) ) / ZCPH(:)
ZDT(:) = ZDT(:) - ZWORK3(:) * REAL(KICE)
END WHERE
!
!
!* 5. Initialize humidity at LFS as a saturated mixture of
! updraft and environmental air
! -----------------------------------------------------
!
DO JI = 1, IIE
JK = KLFS(JI)
PDRW(JI,JK) = PMIXF(JI) * PRW(JI,JK) + ( 1. - PMIXF(JI) ) * PURW(JI,JK)
ZWORK2(JI) = PDRW(JI,JK) - ( 1. - PMIXF(JI) ) &
* ( PURC(JI,JK) + PURI(JI,JK) )
END DO
!
!
!* 6.1 Determine the DBL by looking for level where the envir.
! theta_es at the LFS corrected by melting effects becomes
! larger than envir. value
! ---------------------------------------------------------
!
! compute satur. mixing ratio for melting corrected temperature
CALL CONVECT_SATMIXRATIO( KLON, ZWORK4, ZDT, ZWORK3, ZLV, ZLS, ZCPH )
!
! compute envir. saturated theta_e for melting corrected temperature
ZWORK1(:) = MIN( ZWORK2(:), ZWORK3(:) )
ZWORK3(:) = ZWORK3(:) * ZWORK4(:) / ( ZWORK3(:) + ZEPS ) ! sat. pressure
ZWORK3(:) = LOG( ZWORK3(:) / 613.3 )
! dewp point temperature
ZWORK3(:) = ( 4780.8 - 32.19 * ZWORK3(:) ) / ( 17.502 - ZWORK3(:) )
! adiabatic saturation temperature
ZWORK3(:) = ZWORK3(:) - ( .212 + 1.571E-3 * ( ZWORK3(:) - XTT ) &
- 4.36E-4 * ( ZDT(:) - XTT ) ) * ( ZDT(:) - ZWORK3(:) )
ZWORK4(:) = SIGN(0.5, ZWORK2(:) - ZWORK3(:) )
ZDT(:) = ZDT(:) * ( .5 + ZWORK4(:) ) + ( .5 - ZWORK4(:) ) * ZWORK3(:)
ZWORK2(:) = ZDT(:) * ZPI(:) ** ( 1. - 0.28 * ZWORK2(:) ) &
* EXP( ( 3374.6525 / ZDT(:) - 2.5403 ) &
* ZWORK1(:) * ( 1. + 0.81 * ZWORK1(:) ) )
!
GWORK1(:) = .TRUE.
JKM = MAXVAL( KLFS(:) )
DO JK = JKM - 1, IKB + 1, -1
DO JI = 1, IIE
IF ( JK < KLFS(JI) .AND. ZWORK2(JI) > PTHES(JI,JK) .AND. GWORK1(JI) ) THEN
KDBL(JI) = JK
GWORK1(JI) = .FALSE.
END IF
END DO
END DO
!
!
!* 7. Define mass flux and entr/detr. rates at LFS
! -------------------------------------------
!
DO JI = 1, IIE
JK = KLFS(JI)
ZWORK1(JI) = PPRES(JI,JK) / &
( XRD * ZDT(JI) * ( 1. + ZEPS * ZWORK1(JI) ) ) ! density
PDMF(JI,JK) = - ( 1. - PPREF(JI) ) * ZWORK1(JI) * XPI * PCRAD(JI) * PCRAD(JI) !jiao xcrad
PDTHL(JI,JK)= ZWORK2(JI) ! theta_l is here actually theta_e
ZWORK2(JI) = PDMF(JI,JK)
PDDR(JI,JK) = 0.
PDER(JI,JK) = - PMIXF(JI) * PDMF(JI,JK)
END DO
!
!
! 7.1 Downdraft detrainment is assumed to occur in a layer
! of 60 hPa, determine top level IDDT of this layer
! ---------------------------------------------------------
!
ZWORK1(:) = 0.
DO JK = IKB + 2, JKM
ZWORK1(:) = ZWORK1(:) + PDPRES(:,JK)
WHERE ( JK > KDBL(:) .AND. ZWORK1(:) <= XZPBL )
ZDDT(:) = ZWORK1(:)
IDDT(:) = JK
END WHERE
END DO
!
!
!* 8. Enter loop for downdraft computations. Make a first guess
! of initial downdraft mass flux.
! In the downdraft computations we use theta_es instead of
! enthalpy as it allows to better take into account evaporation
! effects. As the downdraft detrainment rate is zero apart
! from the detrainment layer, we just compute enthalpy
! downdraft from theta_es in this layer.
! ----------------------------------------------------------
!
!
ZWORK5(:) = 0.
!
DO JK = JKM - 1, IKB + 1, -1
JKP = JK + 1
DO JI = 1, IIE
IF ( JK < KLFS(JI) .AND. JK >= IDDT(JI) ) THEN
PDER(JI,JK) = - ZWORK2(JI) * XENTR * PDPRES(JI,JKP) / PCRAD(JI) !jiao xcrad
! DER and DPRES are positive
PDMF(JI,JK) = PDMF(JI,JKP) - PDER(JI,JK)
ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP
ZDT(JI) = PTH(JI,JK) / ZPI(JI)
ZWORK1(JI) = PRW(JI,JK) - PRC(JI,JK) - PRI(JI,JK)
ZTHE(JI) = ZDT(JI) * ZPI(JI) ** ( 1. - 0.28 * ZWORK1(JI) ) &
* EXP( ( 3374.6525 / ZDT(JI) - 2.5403 ) &
* ZWORK1(JI) * ( 1. + 0.81 * ZWORK1(JI) ) )
! PDTHL is here theta_es, later on in this routine this table is
! reskipped to enthalpy
PDTHL(JI,JK) = ( PDTHL(JI,JKP) * PDMF(JI,JKP) - ZTHE(JI) * PDER(JI,JK) &
) / ( PDMF(JI,JK) - 1.E-7 )
PDRW(JI,JK) = ( PDRW(JI,JKP) * PDMF(JI,JKP) - PRW(JI,JK) * PDER(JI,JK) &
) / ( PDMF(JI,JK) - 1.E-7 )
END IF
IF ( JK < IDDT(JI) .AND. JK >= KDBL(JI) ) THEN
JL = IDDT(JI)
PDDR(JI,JK) = - PDMF(JI,JL) * PDPRES(JI,JKP) / ZDDT(JI)
PDMF(JI,JK) = PDMF(JI,JKP) + PDDR(JI,JK)
PDTHL(JI,JK) = PDTHL(JI,JKP)
PDRW(JI,JK) = PDRW(JI,JKP)
END IF
END DO
END DO
!
!
!* 9. Calculate total downdraft evaporation
! rate for given mass flux (between DBL and IDDT)
! -----------------------------------------------
!
PDTEVRF(:,:) = 0.
!
JKT = MAXVAL( IDDT(:) )
DO JK = IKB + 1, JKT
!
ZPI(:) = ( XP00 / PPRES(:,JK) ) ** ZRDOCP
ZDT(:) = PTH(:,JK) / ZPI(:)
!
!* 9.1 Determine wet bulb temperature at DBL from theta_e.
! The iteration algoritm is similar to that used in
! routine CONVECT_CONDENS
! --------------------------------------------------
!
DO JITER = 1, 4
CALL CONVECT_SATMIXRATIO
( KLON, PPRES(:,JK), ZDT, ZWORK1, ZLV, ZLS, ZCPH )
ZDTP(:) = PDTHL(:,JK) / ( ZPI(:) ** ( 1. - 0.28 * ZWORK1(:) ) &
* EXP( ( 3374.6525 / ZDT(:) - 2.5403 ) &
* ZWORK1(:) * ( 1. + 0.81 * ZWORK1(:) ) ) )
ZDT(:) = 0.4 * ZDTP(:) + 0.6 * ZDT(:) ! force convergence
END DO
!
!
!* 9.2 Sum total downdraft evaporation rate. No evaporation
! if actual humidity is larger than specified one.
! -----------------------------------------------------
!
ZWORK2(:) = ZWORK1(:) / ZDT(:) * ( XBETAW / ZDT(:) - XGAMW ) ! dr_sat/dT
ZWORK2(:) = ZLV(:) / ZCPH(:) * ZWORK1(:) * ( 1. - XRHDBC ) / &
( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) ) ! temperature perturb ! due to evaporation
ZDT(:) = ZDT(:) + ZWORK2(:)
!
CALL CONVECT_SATMIXRATIO
( KLON, PPRES(:,JK), ZDT, ZWORK3, ZLV, ZLS, ZCPH )
!
ZWORK3(:) = ZWORK3(:) * XRHDBC
ZWORK1(:) = MAX( 0., ZWORK3(:) - PDRW(:,JK) )
PDTEVR(:) = PDTEVR(:) + ZWORK1(:) * PDDR(:,JK)
PDTEVRF(:,JK)= PDTEVRF(:,JK) + ZWORK1(:) * PDDR(:,JK)
! compute enthalpie and humidity in the detrainment layer
PDRW(:,JK) = MAX( PDRW(:,JK), ZWORK3(:) )
PDTHL(:,JK) = ( ( XCPD + PDRW(:,JK) * XCPV ) * ZDT(:) &
+ ( 1. + PDRW(:,JK) ) * XG * PZ(:,JK) )
!
END DO
!
!
!* 12. If downdraft does not evaporate any water for specified
! relative humidity, no downdraft is allowed
! ---------------------------------------------------------
!
ZWORK2(:) = 1.
WHERE ( PDTEVR(:) < 1. .OR. KLFS(:) == IKB + 1 ) ZWORK2(:) = 0.
DO JK = IKB, JKM
KDBL(:) = KDBL(:) * INT( ZWORK2(:) ) + ( 1 - INT( ZWORK2(:) ) ) * IKB
KLFS(:) = KLFS(:) * INT( ZWORK2(:) ) + ( 1 - INT( ZWORK2(:) ) ) * IKB
PDMF(:,JK) = PDMF(:,JK) * ZWORK2(:)
PDER(:,JK) = PDER(:,JK) * ZWORK2(:)
PDDR(:,JK) = PDDR(:,JK) * ZWORK2(:)
ZWORK1(:) = REAL( KLFS(:) - JK ) ! use this to reset thl_d
ZWORK1(:) = MAX( 0.,MIN(1.,ZWORK1(:) ) ) ! and rv_d to zero above LFS
PDTHL(:,JK) = PDTHL(:,JK) * ZWORK2(:) * ZWORK1(:)
PDRW(:,JK) = PDRW(:,JK) * ZWORK2(:) * ZWORK1(:)
PDTEVR(:) = PDTEVR(:) * ZWORK2(:)
PDTEVRF(:,JK)= PDTEVRF(:,JK) * ZWORK2(:)
END DO
!
END SUBROUTINE CONVECT_DOWNDRAFT
!
!-----------------------------------------------------------------------------
! ######################################################################
SUBROUTINE CONVECT_PRECIP_ADJUST( KLON, KLEV, & 1,2
PPRES, PUMF, PUER, PUDR, &
PUPR, PUTPR, PURW, &
PDMF, PDER, PDDR, PDTHL, PDRW, &
PPREF, PTPR, PMIXF, PDTEVR, &
KLFS, KDBL, KLCL, KCTL, KETL, &
PDTEVRF )
! ######################################################################
!
!!**** Adjust up- and downdraft mass fluxes to be consistent with the
!! mass transport at the LFS given by the precipitation efficiency
!! relation.
!!
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to adjust up- and downdraft mass
!! fluxes below the LFS to be consistent with the precipitation
!! efficiency relation
!!
!!
!!
!!** METHOD
!! ------
!!
!!
!! EXTERNAL
!! --------
!! None
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! Module MODD_CONVPAR
!! XUSRDPTH ! pressure depth to compute updraft humidity
!! ! supply rate for downdraft
!!
!! REFERENCE
!! ---------
!!
!! Book1,2 of documentation ( routine CONVECT_PRECIP_ADJUST)
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 07/11/95
!! Last modified 04/10/97
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CONVPAREXT
USE MODD_CONVPAR
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (Pa)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg)
REAL, DIMENSION(KLON), INTENT(IN) :: PUTPR ! updraft total precipit. (kg/s
REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency
REAL, DIMENSION(KLON), INTENT(IN) :: PMIXF ! critical mixed fraction at LCL
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL
INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL
INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of equilibrium
! (zero buoyancy) level
INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KLFS ! contains vert. index of LFS
INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KDBL ! contains vert. index of DBL
!
REAL, DIMENSION(KLON), INTENT(INOUT) :: PDTEVR ! total downdraft evaporation
! rate at LFS
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDTEVRF! downdraft evaporation rate
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUPR ! updraft precipit. (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDTHL ! downdraft enthalpy (J/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDRW ! downdraft total water (kg/kg)
!
REAL, DIMENSION(KLON), INTENT(OUT) :: PTPR ! total precipitation (kg/s)
! = downdraft precipitation
!
!* 0.2 Declarations of local variables :
!
INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds
INTEGER :: JK, JKT1, JKT2, JKT3 ! vertical loop index
INTEGER :: JI ! horizontal loop index
!
INTEGER, DIMENSION(KLON) :: IPRL
REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, &
ZWORK4, ZWORK5, ZWORK6 ! work arrays
!
!
!-------------------------------------------------------------------------------
!
! 0.3 Set loop bounds
! ---------------
!
IKB = 1 + JCVEXB
IKE = KLEV - JCVEXT
IIE = KLON
JKT1 = MAXVAL( KLFS(:) )
JKT2 = MAXVAL( KCTL(:) )
JKT3 = MINVAL( KLCL(:) )
!
!
! 1. Set some output variables for columns where no downdraft
! exists. Exit if there is no downdraft at all.
! --------------------------------------------------------
!
IPRL(:) = IKB
PTPR(:) = 0.
!
WHERE ( PDTEVR(:) == 0. )
PTPR(:) = PUTPR(:) ! no downdraft evaporation => no downdraft, all
! precipitation occurs in updraft
END WHERE
IF ( COUNT( PDTEVR(:) > 0. ) == 0 ) RETURN ! exit routine if no downdraft exists
!
!* 2. The total mass transported from the updraft to the down-
! draft at the LFS must be consistent with the three water
! budget terms :
! ---------------------------------------------------------
!
!* 2.1 Downdraft evaporation rate at the DBL. The evaporation
! rate in downdraft must be consistent with precipitation
! efficiency relation.
! --------------------------------------------------------
!
!
DO JI = 1, IIE
JK = KLFS(JI)
ZWORK1(JI) = PDTEVR(JI) / MIN( -1.E-1, PDMF(JI,JK) )
ZWORK6(JI) = PDMF(JI,JK)
END DO
!
!* 2.2 Some preliminar computations for downdraft = total
! precipitation rate. The precipitation is evaluated in
! a layer thickness DP=XUSRDPTH=165 hPa above the LCL.
! The difference between updraft precipitation and downdraft
! precipitation (updraft supply rate) is used to drive the
! downdraft through evaporational cooling.
! --------------------------------------------------------
!
DO JI = 1, IIE
JK = KLCL(JI)
ZWORK5(JI) = PPRES(JI,JK)
END DO
!
PTPR(:) = 0.
DO JK = JKT3, JKT2
WHERE ( JK >= KLCL(:) .AND. PPRES(:,JK) >= ZWORK5(:) - XUSRDPTH )
PTPR(:) = PTPR(:) + PUPR(:,JK)
IPRL(:) = JK
END WHERE
END DO
IPRL(:) = MIN( KETL(:), IPRL(:) )
!
DO JI = 1, IIE
JK = IPRL(JI)
PTPR(JI) = PUMF(JI,JK+1) * PURW(JI,JK+1) + PTPR(JI)
END DO
!
PTPR(:) = PPREF(:) * MIN( PUTPR(:), PTPR(:) )
ZWORK4(:) = PUTPR(:) - PTPR(:)
!
!
!* 2.3 Total amount of precipitation that falls out of the up-
! draft between the LCL and the LFS.
! Condensate transfer from up to downdraft at LFS
! ---------------------------------------------------------
!
ZWORK5(:) = 0.
DO JK = JKT3, JKT1
WHERE ( JK >= KLCL(:) .AND. JK <= KLFS(:) )
ZWORK5(:) = ZWORK5(:) + PUPR(:,JK)
END WHERE
END DO
!
DO JI = 1, IIE
JK = KLFS(JI)
ZWORK2(JI) = ( 1. - PPREF(JI) ) * ZWORK5(JI) * &
( 1. - PMIXF(JI) ) / MAX( 1.E-1, PUMF(JI,JK) )
END DO
!
!
!* 2.4 Increase the first guess downdraft mass flux to satisfy
! precipitation efficiency relation.
! If downdraft does not evaporate any water at the DBL for
! the specified relative humidity, or if the corrected mass
! flux at the LFS is positive no downdraft is allowed
! ---------------------------------------------------------
!
!
ZWORK1(:) = ZWORK4(:) / ( ZWORK1(:) + ZWORK2(:) + 1.E-8 )
ZWORK2(:) = ZWORK1(:) / MIN( -1.E-1, ZWORK6(:) ) ! ratio of budget consistent to actual DMF
!
ZWORK3(:) = 1.
ZWORK6(:) = 1.
WHERE ( ZWORK1(:) > 0. .OR. PDTEVR(:) < 1. )
KDBL(:) = IKB
KLFS(:) = IKB
PDTEVR(:) = 0.
ZWORK2(:) = 0.
ZWORK3(:) = 0.
ZWORK6(:) = 0.
END WHERE
!
DO JK = IKB, JKT1
PDMF(:,JK) = PDMF(:,JK) * ZWORK2(:)
PDER(:,JK) = PDER(:,JK) * ZWORK2(:)
PDDR(:,JK) = PDDR(:,JK) * ZWORK2(:)
PDTEVRF(:,JK) = PDTEVRF(:,JK)* ZWORK2(:)
PDRW(:,JK) = PDRW(:,JK) * ZWORK3(:)
PDTHL(:,JK) = PDTHL(:,JK) * ZWORK3(:)
END DO
ZWORK4(:) = ZWORK2(:)
!
!
!* 3. Increase updraft mass flux, mass detrainment rate, and water
! substance detrainment rates to be consistent with the transfer
! of the estimated mass from the up- to the downdraft at the LFS
! --------------------------------------------------------------
!
DO JI = 1, IIE
JK = KLFS(JI)
ZWORK2(JI) = ( 1. - ZWORK6(JI) ) + ZWORK6(JI) * &
( PUMF(JI,JK) - ( 1. - PMIXF(JI) ) * ZWORK1(JI) ) / &
MAX( 1.E-1, PUMF(JI,JK) )
END DO
!
!
JKT1 = MAXVAL( KLFS(:) ) ! value of KLFS might have been reset to IKB above
DO JK = IKB, JKT1
DO JI = 1, IIE
IF ( JK <= KLFS(JI) ) THEN
PUMF(JI,JK) = PUMF(JI,JK) * ZWORK2(JI)
PUER(JI,JK) = PUER(JI,JK) * ZWORK2(JI)
PUDR(JI,JK) = PUDR(JI,JK) * ZWORK2(JI)
PUPR(JI,JK) = PUPR(JI,JK) * ZWORK2(JI)
END IF
END DO
END DO
!
!
!* 4. Increase total = downdraft precipitation and evaporation rate
! -------------------------------------------------------------
!
WHERE ( PDTEVR(:) > 0. )
PDTEVR(:) = PDTEVR(:) * ZWORK4(:)
PTPR(:) = PTPR(:) + PPREF(:) * ZWORK5(:) * ( ZWORK2(:) - 1. )
ELSEWHERE
PTPR(:) = PUTPR(:)
END WHERE
!
!
END SUBROUTINE CONVECT_PRECIP_ADJUST
!
! ---------------------------------------------------------------------------
SUBROUTINE CONVECT_CLOSURE( KLON, KLEV, & 1,7
PPRES, PDPRES, PZ, PDXDY, PLMASS, &
PTHL, PTH, PRW, PRC, PRI, OTRIG1, &
PTHC, PRWC, PRCC, PRIC, PWSUB, &
KLCL, KDPL, KPBL, KLFS, KCTL, KML, &
PUMF, PUER, PUDR, PUTHL, PURW, &
PURC, PURI, PUPR, &
PDMF, PDER, PDDR, PDTHL, PDRW, &
PTPR, PSPR, PDTEVR, &
PCAPE, PTIMEC, &
KFTSTEPS, &
PDTEVRF, PPRLFLX, PPRSFLX )
! #######################################################################
!
!!**** Uses modified Fritsch-Chappell closure
!!
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine the final adjusted
!! (over a time step PTIMEC) environmental values of THETA_l, R_w, R_c, R_i
!! The final convective tendencies can then be evaluated in the main
!! routine DEEP_CONVECT by (PTHC-PTH)/PTIMEC
!!
!!
!!** METHOD
!! ------
!! Computations are done at every model level starting from bottom.
!! The use of masks allows to optimise the inner loops (horizontal loops).
!!
!!
!!
!! EXTERNAL
!! --------
!!
!! CONVECT_CLOSURE_THRVLCL
!! CONVECT_CLOSURE_ADJUST
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CSTS
!! XG ! gravity constant
!! XP00 ! reference pressure
!! XRD, XRV ! gaz constants for dry air and water vapor
!! XCPD, XCPV ! specific heat for dry air and water vapor
!! XCL, XCI ! specific heat for liquid water and ice
!! XTT ! triple point temperature
!! XLVTT, XLSTT ! vaporization, sublimation heat constant
!!
!! Module MODD_CONVPAR
!! XA25 ! reference grid area
!! XSTABT ! stability factor in time integration
!! XSTABC ! stability factor in CAPE adjustment
!! XMELDPTH ! allow melting over specific pressure depth
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!!
!! REFERENCE
!! ---------
!!
!! Book1,2 of documentation ( routine CONVECT_CLOSURE)
!! Fritsch and Chappell, 1980, J. Atmos. Sci.
!! Kain and Fritsch, 1993, Meteor. Monographs, Vol.
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 26/03/96
!! Peter Bechtold 04/10/97 change for enthalpie, r_c + r_i tendencies
!! Dominique Paquin UQAM suivi des corrections de debordements
!! OURANOS Avril 2003 correction pcp < 0
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CSTS
USE MODD_CONVPAR
USE MODD_CONVPAREXT
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLFS ! index for level of free sink
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer
INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! index for melting level
REAL, DIMENSION(KLON), INTENT(INOUT) :: PTIMEC ! convection time step
REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2)
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg)
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH ! grid scale theta
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRW ! grid scale total water
! mixing ratio
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRC ! grid scale r_c
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRI ! grid scale r_i
LOGICAL, DIMENSION(KLON), INTENT(IN) :: OTRIG1 ! logical to keep trace of
! convective arrays modified in UPDRAFT
!
!
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES ! pressure difference between
! bottom and top of layer (Pa)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PLMASS ! mass of model layer (kg)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m)
REAL, DIMENSION(KLON), INTENT(IN) :: PCAPE ! available potent. energy
INTEGER, INTENT(OUT) :: KFTSTEPS! maximum of fract time steps
! only used for chemical tracers
!
!
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUER ! updraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUDR ! updraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUPR ! updraft precipitation in
! flux units (kg water / s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURC ! updraft cloud water (kg/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURI ! updraft cloud ice (kg/kg)
!
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDER ! downdraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDDR ! downdraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDTHL ! downdraft enthalpy (J/kg)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDRW ! downdraft total water (kg/kg)
REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total surf precipitation (kg/s)
REAL, DIMENSION(KLON), INTENT(OUT) :: PSPR ! solid surf precipitation (kg/s)
REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR! donwndraft evapor. (kg/s)
!
REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PTHC ! conv. adj. grid scale theta
REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRWC ! conv. adj. grid scale r_w
REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRCC ! conv. adj. grid scale r_c
REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRIC ! conv. adj. grid scale r_i
REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PWSUB ! envir. compensating subsidence(Pa/s)
!
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDTEVRF! downdraft evaporation rate
REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PPRLFLX! liquid precip flux
REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PPRSFLX! solid precip flux
!
!* 0.2 Declarations of local variables :
!
INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds
INTEGER :: IKS ! vertical dimension
INTEGER :: JK, JKP, JKMAX ! vertical loop index
INTEGER :: JI ! horizontal loop index
INTEGER :: JITER ! iteration loop index
INTEGER :: JSTEP ! fractional time loop index
REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd
REAL :: ZCVOCD, ZEPSA ! C_pv / C_pd, R_v / R_d
!
REAL, DIMENSION(KLON,KLEV) :: ZTHLC ! convectively adjusted
! grid scale enthalpy
REAL, DIMENSION(KLON,KLEV) :: ZOMG ! conv. environm. subsidence (Pa/s)
REAL, DIMENSION(KLON,KLEV) :: ZUMF ! non-adjusted updraft mass flux
REAL, DIMENSION(KLON,KLEV) :: ZUER ! " updraft entrainm. rate
REAL, DIMENSION(KLON,KLEV) :: ZUDR ! " updraft detrainm. rate
REAL, DIMENSION(KLON,KLEV) :: ZDMF ! " downdraft mass flux
REAL, DIMENSION(KLON,KLEV) :: ZDER ! " downdraft entrainm. rate
REAL, DIMENSION(KLON,KLEV) :: ZDDR ! " downdraft detrainm. rate
REAL, DIMENSION(KLON) :: ZTPR ! " total precipitation
REAL, DIMENSION(KLON) :: ZDTEVR ! " total downdraft evapor.
REAL, DIMENSION(KLON,KLEV):: ZPRLFLX ! " liquid precip flux
REAL, DIMENSION(KLON,KLEV):: ZPRSFLX ! " solid precip flux
REAL, DIMENSION(KLON) :: ZPRMELT ! melting of precipitation
REAL, DIMENSION(KLON) :: ZPRMELTO ! non-adjusted "
REAL, DIMENSION(KLON) :: ZADJ ! mass adjustment factor
REAL, DIMENSION(KLON) :: ZADJMAX ! limit value for ZADJ
REAL, DIMENSION(KLON) :: ZCAPE ! new CAPE after adjustment
REAL, DIMENSION(KLON) :: ZTIMEC ! fractional convective time step
REAL, DIMENSION(KLON,KLEV):: ZTIMC ! 2D work array for ZTIMEC
!
REAL, DIMENSION(KLON) :: ZTHLCL ! new theta at LCL
REAL, DIMENSION(KLON) :: ZRVLCL ! new r_v at LCL
REAL, DIMENSION(KLON) :: ZZLCL ! height of LCL
REAL, DIMENSION(KLON) :: ZTLCL ! temperature at LCL
REAL, DIMENSION(KLON) :: ZTELCL ! envir. temper. at LCL
REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent
REAL, DIMENSION(KLON) :: ZTHES1, ZTHES2! saturation environm. theta_e
REAL, DIMENSION(KLON,KLEV) :: ZTHMFIN, ZTHMFOUT, ZRWMFIN, ZRWMFOUT
REAL, DIMENSION(KLON,KLEV) :: ZRCMFIN, ZRCMFOUT, ZRIMFIN, ZRIMFOUT
! work arrays for environm. compensat. mass flux
REAL, DIMENSION(KLON) :: ZPI ! (P/P00)**R_d/C_pd
REAL, DIMENSION(KLON) :: ZLV ! latent heat of vaporisation
REAL, DIMENSION(KLON) :: ZLS ! latent heat of sublimation
REAL, DIMENSION(KLON) :: ZLM ! latent heat of melting
REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph
REAL, DIMENSION(KLON) :: ZMELDPTH ! actual depth of melting layer
INTEGER, DIMENSION(KLON) :: ITSTEP ! fractional convective time step
INTEGER, DIMENSION(KLON) :: ICOUNT ! timestep counter
INTEGER, DIMENSION(KLON) :: ILCL ! index lifting condens. level
INTEGER, DIMENSION(KLON) :: IWORK1 ! work array
REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5
REAL, DIMENSION(KLON,KLEV):: ZWORK6
LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK3! work arrays
LOGICAL, DIMENSION(KLON,KLEV) :: GWORK4 ! work array
REAL, DIMENSION(KLON) :: ZUTHED1,ZUTHED2 ! jiao dilute updraft theta_e
REAL :: ZUFR ! jiao dilute updraft fraction
!
!
!-------------------------------------------------------------------------------
!
!* 0.2 Initialize local variables
! ----------------------------
!
!
PSPR(:) = 0.
ZTIMC(:,:) = 0.
ZTHES2(:) = 0.
ZWORK1(:) = 0.
ZWORK2(:) = 0.
ZWORK3(:) = 0.
ZWORK4(:) = 0.
ZWORK5(:) = 0.
GWORK1(:) = .FALSE.
GWORK3(:) = .FALSE.
GWORK4(:,:) = .FALSE.
ILCL(:) = KLCL(:)
!
ZCPORD = XCPD / XRD
ZRDOCP = XRD / XCPD
ZCVOCD = XCPV / XCPD
ZEPSA = XRV / XRD
!
ZADJ(:) = 1.
ZWORK5(:) = 1.
WHERE( .NOT. OTRIG1(:) ) ZWORK5(:) = 0.
!
!
!* 0.3 Compute loop bounds
! -------------------
!
IIE = KLON
IKB = 1 + JCVEXB
IKS = KLEV
IKE = KLEV - JCVEXT
JKMAX = MAXVAL( KCTL(:) )
!
!
!* 2. Save initial mass flux values to be used in adjustment procedure
! ---------------------------------------------------------------
!
ZUMF (:,:) = PUMF(:,:)
ZUER (:,:) = PUER(:,:)
ZUDR (:,:) = PUDR(:,:)
ZDMF (:,:) = PDMF(:,:)
ZDER (:,:) = PDER(:,:)
ZDDR (:,:) = PDDR(:,:)
ZTPR (: ) = PTPR(:)
ZDTEVR (: ) = PDTEVR(:)
ZOMG (:,:) = 0.
PWSUB (:,:) = 0.
ZPRMELT(: ) = 0.
PPRLFLX(:,:) = 0.
ZPRLFLX(:,:) = 0.
PPRSFLX(:,:) = 0.
ZPRSFLX(:,:) = 0.
!
!
!* 2.1 Some preliminar computations for melting of precipitation
! used later in section 9 and computation of precip fluxes
! Precipitation fluxes are updated for melting and evaporation
! ---------------------------------------------------------
!
!
ZWORK1(:) = 0.
ZMELDPTH(:) = 0.
ZWORK6(:,:) = 0.
DO JK = JKMAX + 1, IKB + 1, -1
! Nota: PUPR is total precipitation flux, but the solid, liquid
! precipitation is stored in units kg/kg; therefore we compute here
! the solid fraction of the total precipitation flux.
DO JI = 1, IIE
ZWORK2(JI) = PUPR(JI,JK) / ( PURC(JI,JK) + PURI(JI,JK) + 1.E-8 )
ZPRMELT(JI) = ZPRMELT(JI) + PURI(JI,JK) * ZWORK2(JI)
ZWORK1(JI) = ZWORK1(JI) + PURC(JI,JK) * ZWORK2(JI) - PDTEVRF(JI,JK)
ZPRLFLX(JI,JK)= MAX( 0., ZWORK1(JI) )
ZPRMELT(JI) = ZPRMELT(JI) + MIN( 0., ZWORK1(JI) )
ZPRSFLX(JI,JK)= ZPRMELT(JI)
IF ( KML(JI) >= JK .AND. ZMELDPTH(JI) <= XMELDPTH ) THEN
ZPI(JI) = ( PPRES(JI,JK) / XP00 ) ** ZRDOCP
ZWORK3(JI) = PTH(JI,JK) * ZPI(JI) ! temperature estimate
ZLM(JI) = XLSTT + ( XCPV - XCI ) * ( ZWORK3(JI) - XTT ) - &
( XLVTT + ( XCPV - XCL ) * ( ZWORK3(JI) - XTT ) ) ! L_s - L_v
ZCPH(JI) = XCPD + XCPV * PRW(JI,JK)
ZMELDPTH(JI) = ZMELDPTH(JI) + PDPRES(JI,JK)
ZWORK6(JI,JK)= ZLM(JI) * PTIMEC(JI) / PLMASS(JI,JK) * PDPRES(JI,JK)
ZOMG(JI,JK)= 1. ! at this place only used as work variable
END IF
END DO
!
END DO
!
ZWORK2(:) = 0.
DO JK = JKMAX, IKB + 1, -1
ZWORK1(:) = ZPRMELT(:) * PDPRES(:,JK) / MAX( XMELDPTH, ZMELDPTH(:) )
ZWORK2(:) = ZWORK2(:) + ZWORK1(:) * ZOMG(:,JK)
ZPRLFLX(:,JK) = ZPRLFLX(:,JK) + ZWORK2(:)
ZPRSFLX(:,JK) = ZPRSFLX(:,JK) - ZWORK2(:)
END DO
WHERE( ZPRSFLX(:,:) < 1. ) ZPRSFLX(:,:)=0.
ZPRMELTO(:) = ZPRMELT(:)
!
!
!* 3. Compute limits on the closure adjustment factor so that the
! inflow in convective drafts from a given layer can't be larger
! than the mass contained in this layer initially.
! ---------------------------------------------------------------
!
ZADJMAX(:) = 1000.
IWORK1(:) = MAX( ILCL(:), KLFS(:) )
JKP = MINVAL( KDPL(:) )
DO JK = JKP, IKE
DO JI = 1, IIE
IF( JK > KDPL(JI) .AND. JK <= IWORK1(JI) ) THEN
ZWORK1(JI) = PLMASS(JI,JK) / &
( ( PUER(JI,JK) + PDER(JI,JK) + 1.E-5 ) * PTIMEC(JI) )
ZADJMAX(JI) = MIN( ZADJMAX(JI), ZWORK1(JI) )
END IF
END DO
END DO
!
!
GWORK1(:) = OTRIG1(:) ! logical array to limit adjustment to not definitively
! adjusted columns
!
DO JK = IKB, IKE
ZTHLC(:,:) = PTHL(:,:) ! initialize adjusted envir. values
PRWC(:,:) = PRW(:,:)
PRCC(:,:) = PRC(:,:)
PRIC(:,:) = PRI(:,:)
PTHC(:,:) = PTH(:,:)
END DO
!
!
!
DO JITER = 1, 7 ! Enter adjustment loop to assure that all CAPE is
! removed within the advective time interval TIMEC
!
ZTIMEC(:) = PTIMEC(:)
GWORK4(:,:) = SPREAD( GWORK1(:), DIM=2, NCOPIES=IKS )
WHERE( GWORK4(:,:) ) PWSUB(:,:) = 0.
ZOMG(:,:)=0.
!
DO JK = IKB + 1, JKMAX
JKP = MAX( IKB + 1, JK - 1 )
WHERE ( GWORK1(:) .AND. JK <= KCTL(:) )
!
!
!* 4. Determine vertical velocity at top and bottom of each layer
! to satisfy mass continuity.
! ---------------------------------------------------------------
! we compute here Domega/Dp = - g rho Dw/Dz = 1/Dt
!
ZWORK1(:) = - ( PUER(:,JKP) + PDER(:,JKP) - &
PUDR(:,JKP) - PDDR(:,JKP) ) / PLMASS(:,JKP)
!
PWSUB(:,JK) = PWSUB(:,JKP) - PDPRES(:,JK-1) * ZWORK1(:)
! we use PDPRES(JK-1) and not JKP in order to have zero subsidence
! at the first layer
!
!
!* 5. Compute fractional time step. For stability or
! mass conservation reasons one must split full time step PTIMEC)
! ---------------------------------------------------------------
!
ZWORK1(:) = XSTABT * PDPRES(:,JKP) / ( ABS( PWSUB(:,JK) ) + 1.E-10 )
! the factor XSTABT is used for stability reasons
ZTIMEC(:) = MIN( ZTIMEC(:), ZWORK1(:) )
!
! transform vertical velocity in mass flux units
ZOMG(:,JK) = PWSUB(:,JK) * PDXDY(:) / XG
END WHERE
END DO
!
!
WHERE( GWORK4(:,:) )
ZTHLC(:,:) = PTHL(:,:) ! reinitialize adjusted envir. values
PRWC(:,:) = PRW(:,:) ! when iteration criterium not attained
PRCC(:,:) = PRC(:,:)
PRIC(:,:) = PRI(:,:)
PTHC(:,:) = PTH(:,:)
END WHERE
!
!
! 6. Check for mass conservation, i.e. ZWORK1 > 1.E-2
! If mass is not conserved, the convective tendencies
! automatically become zero.
! ----------------------------------------------------
!
DO JI = 1, IIE
JK=KCTL(JI)
ZWORK1(JI) = PUDR(JI,JK) * PDPRES(JI,JK) / ( PLMASS(JI,JK) + .1 ) &
- PWSUB(JI,JK)
END DO
WHERE( GWORK1(:) .AND. ABS( ZWORK1(:) ) - .01 > 0. )
GWORK1(:) = .FALSE.
PTIMEC(:) = 1.E-1
ZTPR(:) = 0.
ZWORK5(:) = 0.
END WHERE
DO JK = IKB, IKE
PWSUB(:,JK) = PWSUB(:,JK) * ZWORK5(:)
ZPRLFLX(:,JK) = ZPRLFLX(:,JK) * ZWORK5(:)
ZPRSFLX(:,JK) = ZPRSFLX(:,JK) * ZWORK5(:)
END DO
GWORK4(:,1:IKB) = .FALSE.
GWORK4(:,IKS) = .FALSE.
!
ITSTEP(:) = INT( PTIMEC(:) / ZTIMEC(:) ) + 1
ZTIMEC(:) = PTIMEC(:) / REAL( ITSTEP(:) ) ! adjust fractional time step
! to be an integer multiple of PTIMEC
ZTIMC(:,:)= SPREAD( ZTIMEC(:), DIM=2, NCOPIES=IKS )
ICOUNT(:) = 0
!
!
!
KFTSTEPS = MAXVAL( ITSTEP(:) )
DO JSTEP = 1, KFTSTEPS ! Enter the fractional time step loop here
!
ICOUNT(:) = ICOUNT(:) + 1
!
GWORK3(:) = ITSTEP(:) >= ICOUNT(:) .AND. GWORK1(:)
!
!
!* 7. Assign enthalpy and r_w values at the top and bottom of each
! layer based on the sign of w
! ------------------------------------------------------------
!
ZTHMFIN(:,:) = 0.
ZRWMFIN(:,:) = 0.
ZRCMFIN(:,:) = 0.
ZRIMFIN(:,:) = 0.
ZTHMFOUT(:,:) = 0.
ZRWMFOUT(:,:) = 0.
ZRCMFOUT(:,:) = 0.
ZRIMFOUT(:,:) = 0.
!
DO JK = IKB + 1, JKMAX
GWORK4(:,JK) = GWORK3(:) .AND. JK <= KCTL(:)
JKP = MAX( IKB + 1, JK - 1 )
DO JI = 1, IIE
IF ( GWORK3(JI) ) THEN
!
ZWORK1(JI) = SIGN( 1., ZOMG(JI,JK) )
ZWORK2(JI) = 0.5 * ( 1. + ZWORK1(JI) )
ZWORK1(JI) = 0.5 * ( 1. - ZWORK1(JI) )
ZTHMFIN(JI,JK) = - ZOMG(JI,JK) * ZTHLC(JI,JKP) * ZWORK1(JI)
ZTHMFOUT(JI,JK) = ZOMG(JI,JK) * ZTHLC(JI,JK) * ZWORK2(JI)
ZTHMFIN(JI,JKP) = ZTHMFIN(JI,JKP) + ZTHMFOUT(JI,JK) * ZWORK2(JI)
ZTHMFOUT(JI,JKP) = ZTHMFOUT(JI,JKP) + ZTHMFIN(JI,JK) * ZWORK1(JI)
ZRWMFIN(JI,JK) = - ZOMG(JI,JK) * PRWC(JI,JKP) * ZWORK1(JI)
ZRWMFOUT(JI,JK) = ZOMG(JI,JK) * PRWC(JI,JK) * ZWORK2(JI)
ZRWMFIN(JI,JKP) = ZRWMFIN(JI,JKP) + ZRWMFOUT(JI,JK) * ZWORK2(JI)
ZRWMFOUT(JI,JKP) = ZRWMFOUT(JI,JKP) + ZRWMFIN(JI,JK) * ZWORK1(JI)
ZRCMFIN(JI,JK) = - ZOMG(JI,JK) * PRCC(JI,JKP) * ZWORK1(JI)
ZRCMFOUT(JI,JK) = ZOMG(JI,JK) * PRCC(JI,JK) * ZWORK2(JI)
ZRCMFIN(JI,JKP) = ZRCMFIN(JI,JKP) + ZRCMFOUT(JI,JK) * ZWORK2(JI)
ZRCMFOUT(JI,JKP) = ZRCMFOUT(JI,JKP) + ZRCMFIN(JI,JK) * ZWORK1(JI)
ZRIMFIN(JI,JK) = - ZOMG(JI,JK) * PRIC(JI,JKP) * ZWORK1(JI)
ZRIMFOUT(JI,JK) = ZOMG(JI,JK) * PRIC(JI,JK) * ZWORK2(JI)
ZRIMFIN(JI,JKP) = ZRIMFIN(JI,JKP) + ZRIMFOUT(JI,JK) * ZWORK2(JI)
ZRIMFOUT(JI,JKP) = ZRIMFOUT(JI,JKP) + ZRIMFIN(JI,JK) * ZWORK1(JI)
!
END IF
END DO
END DO
!
WHERE ( GWORK4(:,:) )
!
!******************************************************************************
!
!* 8. Update the environmental values of enthalpy and r_w at each level
! NOTA: These are the MAIN EQUATIONS of the scheme
! -----------------------------------------------------------------
!
!
ZTHLC(:,:) = ZTHLC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( &
ZTHMFIN(:,:) + PUDR(:,:) * PUTHL(:,:) + &
PDDR(:,:) * PDTHL(:,:) - ZTHMFOUT(:,:) - &
( PUER(:,:) + PDER(:,:) ) * PTHL(:,:) )
PRWC(:,:) = PRWC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( &
ZRWMFIN(:,:) + PUDR(:,:) * PURW(:,:) + &
PDDR(:,:) * PDRW(:,:) - ZRWMFOUT(:,:) - &
( PUER(:,:) + PDER(:,:) ) * PRW(:,:) )
PRCC(:,:) = PRCC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( &
ZRCMFIN(:,:) + PUDR(:,:) * PURC(:,:) - ZRCMFOUT(:,:) - &
( PUER(:,:) + PDER(:,:) ) * PRC(:,:) )
PRIC(:,:) = PRIC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( &
ZRIMFIN(:,:) + PUDR(:,:) * PURI(:,:) - ZRIMFOUT(:,:) - &
( PUER(:,:) + PDER(:,:) ) * PRI(:,:) )
!
!
!******************************************************************************
!
END WHERE
!
END DO ! Exit the fractional time step loop
!
!
!* 9. Allow frozen precipitation to melt over a 200 mb deep layer
! -----------------------------------------------------------
!
DO JK = JKMAX, IKB + 1, -1
ZTHLC(:,JK) = ZTHLC(:,JK) - &
ZPRMELT(:) * ZWORK6(:,JK) / MAX( XMELDPTH, ZMELDPTH(:) )
END DO
!
!
!* 10. Compute final linearized value of theta envir.
! ----------------------------------------------
!
DO JK = IKB + 1, JKMAX
DO JI = 1, IIE
IF( GWORK1(JI) .AND. JK <= KCTL(JI) ) THEN
ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP
ZCPH(JI) = XCPD + PRWC(JI,JK) * XCPV
ZWORK2(JI) = PTH(JI,JK) / ZPI(JI) ! first temperature estimate
ZLV(JI) = XLVTT + ( XCPV - XCL ) * ( ZWORK2(JI) - XTT )
ZLS(JI) = XLVTT + ( XCPV - XCI ) * ( ZWORK2(JI) - XTT )
! final linearized temperature
ZWORK2(JI) = ( ZTHLC(JI,JK) + ZLV(JI) * PRCC(JI,JK) + ZLS(JI) * PRIC(JI,JK) &
- (1. + PRWC(JI,JK) ) * XG * PZ(JI,JK) ) / ZCPH(JI)
ZWORK2(JI) = MAX( 180., MIN( 340., ZWORK2(JI) ) )
PTHC(JI,JK)= ZWORK2(JI) * ZPI(JI) ! final adjusted envir. theta
END IF
END DO
END DO
!
!
!* 11. Compute new cloud ( properties at new LCL )
! NOTA: The computations are very close to
! that in routine TRIGGER_FUNCT
! ---------------------------------------------
!
CALL CONVECT_CLOSURE_THRVLCL
( KLON, KLEV, &
PPRES, PTHC, PRWC, PZ, GWORK1, &
ZTHLCL, ZRVLCL, ZZLCL, ZTLCL, ZTELCL, &
ILCL, KDPL, KPBL )
!
!
ZTLCL(:) = MAX( 230., MIN( 335., ZTLCL(:) ) ) ! set some overflow bounds
ZTELCL(:) = MAX( 230., MIN( 335., ZTELCL(:) ) )
ZTHLCL(:) = MAX( 230., MIN( 345., ZTHLCL(:) ) )
ZRVLCL(:) = MAX( 0., MIN( 1., ZRVLCL(:) ) )
!
!
!* 12. Compute adjusted CAPE
! ---------------------
!
ZCAPE(:) = 0.
ZPI(:) = ZTHLCL(:) / ZTLCL(:)
ZPI(:) = MAX( 0.95, MIN( 1.5, ZPI(:) ) )
ZWORK1(:) = XP00 / ZPI(:) ** ZCPORD ! pressure at LCL
!
CALL CONVECT_SATMIXRATIO
( KLON, ZWORK1, ZTELCL, ZWORK3, ZLV, ZLS, ZCPH )
ZWORK3(:) = MIN( .1, MAX( 0., ZWORK3(:) ) )
!
! compute theta_e updraft undilute
ZTHEUL(:) = ZTLCL(:) * ZPI(:) ** ( 1. - 0.28 * ZRVLCL(:) ) &
* EXP( ( 3374.6525 / ZTLCL(:) - 2.5403 ) &
* ZRVLCL(:) * ( 1. + 0.81 * ZRVLCL(:) ) )
!jiao dilute updraft theta_e at lcl
ZUTHED1(:) = ZTHEUL(:)
!
! compute theta_e saturated environment at LCL
ZTHES1(:) = ZTELCL(:) * ZPI(:) ** ( 1. - 0.28 * ZWORK3(:) ) &
* EXP( ( 3374.6525 / ZTELCL(:) - 2.5403 ) &
* ZWORK3(:) * ( 1. + 0.81 * ZWORK3(:) ) )
!
DO JK = MINVAL( ILCL(:) ), JKMAX
JKP = JK - 1
DO JI = 1, IIE
ZWORK4(JI) = 1.
IF ( JK == ILCL(JI) ) ZWORK4(JI) = 0.
!
! compute theta_e saturated environment and adjusted values
! of theta
!
GWORK3(JI) = JK >= ILCL(JI) .AND. JK <= KCTL(JI) .AND. GWORK1(JI)
!
ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP
ZWORK2(JI) = PTHC(JI,JK) / ZPI(JI)
END DO
!
CALL CONVECT_SATMIXRATIO
( KLON, PPRES(:,JK), ZWORK2, ZWORK3, ZLV, ZLS, ZCPH )
!
!
DO JI = 1, IIE
IF ( GWORK3(JI) ) THEN
ZTHES2(JI) = ZWORK2(JI) * ZPI(JI) ** ( 1. - 0.28 * ZWORK3(JI) ) &
* EXP( ( 3374.6525 / ZWORK2(JI) - 2.5403 ) &
* ZWORK3(JI) * ( 1. + 0.81 * ZWORK3(JI) ) )
!
ZWORK3(JI) = PZ(JI,JK) - PZ(JI,JKP) * ZWORK4(JI) - &
( 1. - ZWORK4(JI) ) * ZZLCL(JI) ! level thickness
ZWORK1(JI) = ( 2. * ZTHEUL(JI) ) / ( ZTHES1(JI) + ZTHES2(JI) ) - 1.
!jiao dilute beg--------------------------------------------
!calculate updraft dilute fraction using mass fluxes
ZUFR = (PUMF(JI,JKP)-PUDR(JI,JK))/(PUMF(JI,JKP)-PUDR(JI,JK)+PUER(JI,JK)+0.000001)
ZUFR = MAX(0.0, MIN(ZUFR,1.0) )
!update theta_e of updraft dilute
ZUTHED2(JI) = ZUTHED1(JI)*ZUFR + ZTHES2(JI)*(1.0-ZUFR)
!the bracket part in eq. (16.29) for calculating cape
ZWORK1(JI) = ( ZUTHED1(JI) + ZUTHED2(JI) ) / ( ZTHES1(JI) + ZTHES2(JI) ) - 1. !jiao bkf
!update theta_e for the next upper layer
ZUTHED1(JI) = ZUTHED2(JI)
!jiao dilute end--------------------------------------------
ZCAPE(JI) = ZCAPE(JI) + XG * ZWORK3(JI) * MAX( 0., ZWORK1(JI) )
ZTHES1(JI) = ZTHES2(JI)
END IF
END DO
END DO
!
!
!* 13. Determine mass adjustment factor knowing how much
! CAPE has been removed.
! -------------------------------------------------
!
WHERE ( GWORK1(:) )
ZWORK1(:) = MAX( PCAPE(:) - ZCAPE(:), 0.1 * PCAPE(:) )
ZWORK2(:) = ZCAPE(:) / ( PCAPE(:) + 1.E-8 )
!
GWORK1(:) = ZWORK2(:) > 0.1 .OR. ZCAPE(:) == 0. ! mask for adjustment
END WHERE
!
WHERE ( ZCAPE(:) == 0. .AND. GWORK1(:) ) ZADJ(:) = ZADJ(:) * 0.5
WHERE ( ZCAPE(:) /= 0. .AND. GWORK1(:) ) &
ZADJ(:) = ZADJ(:) * XSTABC * PCAPE(:) / ( ZWORK1(:) + 1.E-8 )
ZADJ(:) = MIN( ZADJ(:), ZADJMAX(:) )
!
!
!* 13. Adjust mass flux by the factor ZADJ to converge to
! specified degree of stabilization
! ----------------------------------------------------
!
CALL CONVECT_CLOSURE_ADJUST
( KLON, KLEV, ZADJ, &
PUMF, ZUMF, PUER, ZUER, PUDR, ZUDR, &
PDMF, ZDMF, PDER, ZDER, PDDR, ZDDR, &
ZPRMELT, ZPRMELTO, PDTEVR, ZDTEVR, &
PTPR, ZTPR, &
PPRLFLX, ZPRLFLX, PPRSFLX, ZPRSFLX )
!
!
IF ( COUNT( GWORK1(:) ) == 0 ) EXIT ! exit big adjustment iteration loop
! when all columns have reached
! desired degree of stabilization.
!
END DO ! end of big adjustment iteration loop
!
!
! skip adj. total water array to water vapor
DO JK = IKB, IKE
PRWC(:,JK) = MAX( 0., PRWC(:,JK) - PRCC(:,JK) - PRIC(:,JK) )
END DO
!
! compute surface solid (ice) precipitation
PSPR(:) = ZPRMELT(:) * ( 1. - ZMELDPTH(:) / XMELDPTH )
PSPR(:) = MAX( 0., PSPR(:) )
!
!domi correction pcp < 0
PTPR(:) = MAX( PTPR(:) , PSPR(:) )
!fin correction domi
!
!
END SUBROUTINE CONVECT_CLOSURE
!-------------------------------------------------------------------------------
!
! #########################################################################
SUBROUTINE CONVECT_CLOSURE_ADJUST( KLON, KLEV, PADJ, & 1,1
PUMF, PZUMF, PUER, PZUER, PUDR, PZUDR, &
PDMF, PZDMF, PDER, PZDER, PDDR, PZDDR, &
PPRMELT, PZPRMELT, PDTEVR, PZDTEVR, &
PTPR, PZTPR, &
PPRLFLX, PZPRLFL, PPRSFLX, PZPRSFL )
! #########################################################################
!
!!**** Uses closure adjustment factor to adjust mass flux and to modify
!! precipitation efficiency when necessary. The computations are
!! similar to routine CONVECT_PRECIP_ADJUST.
!!
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to adjust the mass flux using the
!! factor PADJ computed in CONVECT_CLOSURE
!!
!!
!!** METHOD
!! ------
!! Computations are done at every model level starting from bottom.
!! The use of masks allows to optimise the inner loops (horizontal loops).
!!
!!
!! EXTERNAL
!! --------
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! None
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!! None
!!
!! REFERENCE
!! ---------
!!
!! Book1,2 of documentation ( routine CONVECT_CLOSURE_ADJUST)
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 26/03/96
!! Last modified 04/10/97
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CONVPAREXT
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
REAL, DIMENSION(KLON), INTENT(IN) :: PADJ ! mass adjustment factor
!
!
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUMF ! initial value of "
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUER ! initial value of "
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUDR ! initial value of "
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZDMF ! initial value of "
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZDER ! initial value of "
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZDDR ! initial value of "
REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total precipitation (kg/s)
REAL, DIMENSION(KLON), INTENT(INOUT):: PZTPR ! initial value of "
REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR ! donwndraft evapor. (kg/s)
REAL, DIMENSION(KLON), INTENT(INOUT):: PZDTEVR ! initial value of "
REAL, DIMENSION(KLON), INTENT(INOUT):: PPRMELT ! melting of precipitation
REAL, DIMENSION(KLON), INTENT(INOUT):: PZPRMELT ! initial value of "
REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PPRLFLX! liquid precip flux
REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PZPRLFL! initial value "
REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PPRSFLX! solid precip flux
REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PZPRSFL! initial value "
!
!
!* 0.2 Declarations of local variables :
!
INTEGER :: IIE, IKB, IKE ! horiz. + vert. loop bounds
INTEGER :: JK ! vertical loop index
!
!
!-------------------------------------------------------------------------------
!
!* 0.3 Compute loop bounds
! -------------------
!
IIE = KLON
IKB = 1 + JCVEXB
IKE = KLEV - JCVEXT
!
!
!* 1. Adjust mass flux by the factor PADJ to converge to
! specified degree of stabilization
! ----------------------------------------------------
!
PPRMELT(:) = PZPRMELT(:) * PADJ(:)
PDTEVR(:) = PZDTEVR(:) * PADJ(:)
PTPR(:) = PZTPR(:) * PADJ(:)
!
DO JK = IKB + 1, IKE
PUMF(:,JK) = PZUMF(:,JK) * PADJ(:)
PUER(:,JK) = PZUER(:,JK) * PADJ(:)
PUDR(:,JK) = PZUDR(:,JK) * PADJ(:)
PDMF(:,JK) = PZDMF(:,JK) * PADJ(:)
PDER(:,JK) = PZDER(:,JK) * PADJ(:)
PDDR(:,JK) = PZDDR(:,JK) * PADJ(:)
PPRLFLX(:,JK) = PZPRLFL(:,JK) * PADJ(:)
PPRSFLX(:,JK) = PZPRSFL(:,JK) * PADJ(:)
END DO
!
END SUBROUTINE CONVECT_CLOSURE_ADJUST
!
!-------------------------------------------------------------------------------
!
! ######################################################################
SUBROUTINE CONVECT_CLOSURE_THRVLCL( KLON, KLEV, & 2,5
PPRES, PTH, PRV, PZ, OWORK1, &
PTHLCL, PRVLCL, PZLCL, PTLCL, PTELCL,&
KLCL, KDPL, KPBL )
! ######################################################################
!
!!**** Determine thermodynamic properties at new LCL
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine the thermodynamic
!! properties at the new lifting condensation level LCL
!!
!!
!!
!!** METHOD
!! ------
!! see CONVECT_TRIGGER_FUNCT
!!
!!
!!
!! EXTERNAL
!! --------
!! Routine CONVECT_SATMIXRATIO
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CSTS
!! XG ! gravity constant
!! XP00 ! Reference pressure
!! XRD, XRV ! Gaz constants for dry air and water vapor
!! XCPD ! Cpd (dry air)
!! XTT ! triple point temperature
!! XBETAW, XGAMW ! constants for vapor saturation pressure
!!
!! Module MODD_CONVPAR
!! XA25 ! reference grid area
!! XZLCL ! lowest allowed pressure difference between
!! ! surface and LCL
!! XZPBL ! minimum mixed layer depth to sustain convection
!! XWTRIG ! constant in vertical velocity trigger
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! REFERENCE
!! ---------
!!
!! Book2 of documentation ( routine TRIGGER_FUNCT)
!! Fritsch and Chappell (1980), J. Atm. Sci., Vol. 37, 1722-1761.
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!! Original 07/11/95
!! Last modified 04/10/97
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CSTS
USE MODD_CONVPAR
USE MODD_CONVPAREXT
!
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTH ! theta
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRV ! vapor mixing ratio
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of grid point (m)
INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL
INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layer top
LOGICAL, DIMENSION(KLON), INTENT(IN) :: OWORK1! logical mask
!
REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL
REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL
REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m)
REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temperature at LCL (m)
REAL, DIMENSION(KLON), INTENT(OUT):: PTELCL ! environm. temp. at LCL (K)
INTEGER, DIMENSION(KLON), INTENT(OUT):: KLCL ! contains vert. index of LCL
!
!* 0.2 Declarations of local variables :
!
INTEGER :: JK, JKM, JKMIN, JKMAX ! vertical loop index
INTEGER :: JI ! horizontal loop index
INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds
REAL :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d
REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd
!
REAL, DIMENSION(KLON) :: ZPLCL ! pressure at LCL
REAL, DIMENSION(KLON) :: ZTMIX ! mixed layer temperature
REAL, DIMENSION(KLON) :: ZEVMIX ! mixed layer water vapor pressure
REAL, DIMENSION(KLON) :: ZDPTHMIX, ZPRESMIX ! mixed layer depth and pressure
REAL, DIMENSION(KLON) :: ZLV, ZCPH! specific heats of vaporisation, dry air
REAL, DIMENSION(KLON) :: ZDP ! pressure between LCL and model layer
REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2 ! work arrays
!
!
!-------------------------------------------------------------------------------
!
!* 0.3 Compute array bounds
! --------------------
!
IIE = KLON
IKB = 1 + JCVEXB
IKE = KLEV - JCVEXT
!
!
!* 1. Initialize local variables
! --------------------------
!
ZEPS = XRD / XRV
ZEPSA = XRV / XRD
ZCPORD = XCPD / XRD
ZRDOCP = XRD / XCPD
!
ZDPTHMIX(:) = 0.
ZPRESMIX(:) = 0.
PTHLCL(:) = 300.
PTLCL(:) = 300.
PTELCL(:) = 300.
PRVLCL(:) = 0.
PZLCL(:) = PZ(:,IKB)
ZTMIX(:) = 230.
ZPLCL(:) = 1.E4
KLCL(:) = IKB + 1
!
!
!* 2. Construct a mixed layer as in TRIGGER_FUNCT
! -------------------------------------------
!
JKMAX = MAXVAL( KPBL(:) )
JKMIN = MINVAL( KDPL(:) )
DO JK = IKB + 1, JKMAX
JKM = JK + 1
DO JI = 1, IIE
IF ( JK >= KDPL(JI) .AND. JK <= KPBL(JI) ) THEN
!
ZWORK1(JI) = PPRES(JI,JK) - PPRES(JI,JKM)
ZDPTHMIX(JI) = ZDPTHMIX(JI) + ZWORK1(JI)
ZPRESMIX(JI) = ZPRESMIX(JI) + PPRES(JI,JK) * ZWORK1(JI)
PTHLCL(JI) = PTHLCL(JI) + PTH(JI,JK) * ZWORK1(JI)
PRVLCL(JI) = PRVLCL(JI) + PRV(JI,JK) * ZWORK1(JI)
!
END IF
END DO
END DO
!
!
WHERE ( OWORK1(:) )
!
ZPRESMIX(:) = ZPRESMIX(:) / ZDPTHMIX(:)
PTHLCL(:) = PTHLCL(:) / ZDPTHMIX(:)
PRVLCL(:) = PRVLCL(:) / ZDPTHMIX(:)
!
!* 3.1 Use an empirical direct solution ( Bolton formula )
! to determine temperature and pressure at LCL.
! Nota: the adiabatic saturation temperature is not
! equal to the dewpoint temperature
! --------------------------------------------------
!
!
ZTMIX(:) = PTHLCL(:) * ( ZPRESMIX(:) / XP00 ) ** ZRDOCP
ZEVMIX(:) = PRVLCL(:) * ZPRESMIX(:) / ( PRVLCL(:) + ZEPS )
ZEVMIX(:) = MAX( 1.E-8, ZEVMIX(:) )
ZWORK1(:) = LOG( ZEVMIX(:) / 613.3 )
! dewpoint temperature
ZWORK1(:) = ( 4780.8 - 32.19 * ZWORK1(:) ) / ( 17.502 - ZWORK1(:) )
! adiabatic saturation temperature
PTLCL(:) = ZWORK1(:) - ( .212 + 1.571E-3 * ( ZWORK1(:) - XTT ) &
- 4.36E-4 * ( ZTMIX(:) - XTT ) ) * ( ZTMIX(:) - ZWORK1(:) )
PTLCL(:) = MIN( PTLCL(:), ZTMIX(:) )
ZPLCL(:) = XP00 * ( PTLCL(:) / PTHLCL(:) ) ** ZCPORD
!
END WHERE
!
ZPLCL(:) = MIN( 2.E5, MAX( 10., ZPLCL(:) ) ) ! bound to avoid overflow
!
!
!* 3.2 Correct PTLCL in order to be completely consistent
! with MNH saturation formula
! --------------------------------------------------
!
CALL CONVECT_SATMIXRATIO
( KLON, ZPLCL, PTLCL, ZWORK1, ZLV, ZWORK2, ZCPH )
WHERE( OWORK1(:) )
ZWORK2(:) = ZWORK1(:) / PTLCL(:) * ( XBETAW / PTLCL(:) - XGAMW ) ! dr_sat/dT
ZWORK2(:) = ( ZWORK1(:) - PRVLCL(:) ) / &
( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) )
PTLCL(:) = PTLCL(:) - ZLV(:) / ZCPH(:) * ZWORK2(:)
!
END WHERE
!
!
!* 3.3 If PRVLCL is oversaturated set humidity and temperature
! to saturation values.
! -------------------------------------------------------
!
CALL CONVECT_SATMIXRATIO
( KLON, ZPRESMIX, ZTMIX, ZWORK1, ZLV, ZWORK2, ZCPH )
WHERE( OWORK1(:) .AND. PRVLCL(:) > ZWORK1(:) )
ZWORK2(:) = ZWORK1(:) / ZTMIX(:) * ( XBETAW / ZTMIX(:) - XGAMW ) ! dr_sat/dT
ZWORK2(:) = ( ZWORK1(:) - PRVLCL(:) ) / &
( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) )
PTLCL(:) = ZTMIX(:) + ZLV(:) / ZCPH(:) * ZWORK2(:)
PRVLCL(:) = PRVLCL(:) - ZWORK2(:)
ZPLCL(:) = ZPRESMIX(:)
PTHLCL(:) = PTLCL(:) * ( XP00 / ZPLCL(:) ) ** ZRDOCP
END WHERE
!
!
!* 4.1 Determine vertical loop index at the LCL
! -----------------------------------------
!
DO JK = JKMIN, IKE - 1
DO JI = 1, IIE
IF ( ZPLCL(JI) <= PPRES(JI,JK) .AND. OWORK1(JI) ) THEN
KLCL(JI) = JK + 1
PZLCL(JI) = PZ(JI,JK+1)
END IF
END DO
END DO
!
!
!* 4.2 Estimate height and environmental temperature at LCL
! ----------------------------------------------------
!
DO JI = 1, IIE
JK = KLCL(JI)
JKM = JK - 1
ZDP(JI) = LOG( ZPLCL(JI) / PPRES(JI,JKM) ) / &
LOG( PPRES(JI,JK) / PPRES(JI,JKM) )
ZWORK1(JI) = PTH(JI,JK) * ( PPRES(JI,JK) / XP00 ) ** ZRDOCP
ZWORK2(JI) = PTH(JI,JKM) * ( PPRES(JI,JKM) / XP00 ) ** ZRDOCP
ZWORK1(JI) = ZWORK2(JI) + ( ZWORK1(JI) - ZWORK2(JI) ) * ZDP(JI)
! we compute the precise value of the LCL
! The precise height is between the levels KLCL and KLCL-1.
ZWORK2(JI) = PZ(JI,JKM) + ( PZ(JI,JK) - PZ(JI,JKM) ) * ZDP(JI)
END DO
WHERE( OWORK1(:) )
PTELCL(:) = ZWORK1(:)
PZLCL(:) = ZWORK2(:)
END WHERE
!
!
!
END SUBROUTINE CONVECT_CLOSURE_THRVLCL
!
!
!-------------------------------------------------------------------------------
!
! #######################################################################
SUBROUTINE CONVECT_CHEM_TRANSPORT( KLON, KLEV, KCH, PCH1, PCH1C, & 2,2
KDPL, KPBL, KLCL, KCTL, KLFS, KDBL, &
PUMF, PUER, PUDR, PDMF, PDER, PDDR, &
PTIMEC, PDXDY, PMIXF, PLMASS, PWSUB,&
KFTSTEPS )
! #######################################################################
!
!!**** Compute modified chemical tracer values due to convective event
!!
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine the final adjusted
!! environmental values of the chemical tracers
!! The final convective tendencies can then be evaluated in the main
!! routine DEEP_CONVECT by (PCH1C-PCH1)/PTIMEC
!!
!!
!!** METHOD
!! ------
!! Identical to the computation of the conservative variables in the
!! main deep convection code
!!
!! EXTERNAL
!! --------
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CSTS
!! XG ! gravity constant
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!!
!! Original 11/12/97
!!
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CSTS
USE MODD_CONVPAREXT
!
IMPLICIT NONE
!
!* 0.1 Declarations of dummy arguments :
!
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
INTEGER, INTENT(IN) :: KCH ! number of passive tracers
!
REAL,DIMENSION(KLON,KLEV,KCH),INTENT(IN) :: PCH1 ! grid scale tracer concentr.
REAL,DIMENSION(KLON,KLEV,KCH),INTENT(OUT):: PCH1C! conv adjusted tracer concntr.
!
INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLFS ! index for level of free sink
INTEGER, DIMENSION(KLON), INTENT(IN) :: KDBL ! index for downdraft base level
!
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUMF ! updraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUER ! updraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUDR ! updraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDMF ! downdraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDER ! downdraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDDR ! downdraft detrainment (kg/s)
!
REAL, DIMENSION(KLON), INTENT(IN) :: PTIMEC! convection time step
REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2)
REAL, DIMENSION(KLON), INTENT(IN) :: PMIXF ! mixed fraction at LFS
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PLMASS! mass of model layer (kg)
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PWSUB ! envir. compensating subsidence(Pa/s)
INTEGER, INTENT(IN) :: KFTSTEPS ! maximum fractional time steps
!
!
!* 0.2 Declarations of local variables :
!
INTEGER :: INCH1 ! number of chemical tracers
INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds
INTEGER :: IKS ! vertical dimension
INTEGER :: JI ! horizontal loop index
INTEGER :: JK, JKP ! vertical loop index
INTEGER :: JN ! chemical tracer loop index
INTEGER :: JSTEP ! fractional time loop index
INTEGER :: JKLC, JKLD, JKLP, JKMAX ! loop index for levels
!
REAL, DIMENSION(KLON,KLEV) :: ZOMG ! compensat. subsidence (Pa/s)
REAL, DIMENSION(KLON,KLEV,KCH) :: ZUCH1, ZDCH1 ! updraft/downdraft values
REAL, DIMENSION(KLON) :: ZTIMEC ! fractional convective time step
REAL, DIMENSION(KLON,KLEV) :: ZTIMC! 2D work array for ZTIMEC
REAL, DIMENSION(KLON,KLEV,KCH) :: ZCH1MFIN, ZCH1MFOUT
! work arrays for environm. compensat. mass
REAL, DIMENSION(KLON,KCH) :: ZWORK1, ZWORK2, ZWORK3
!
!-------------------------------------------------------------------------------
!
!* 0.3 Compute loop bounds
! -------------------
!
INCH1 = KCH
IIE = KLON
IKB = 1 + JCVEXB
IKS = KLEV
IKE = KLEV - JCVEXT
JKMAX = MAXVAL( KCTL(:) )
!
!
!* 2. Updraft computations
! --------------------
!
ZUCH1(:,:,:) = 0.
!
!* 2.1 Initialization at LCL
! ----------------------------------
!
DO JI = 1, IIE
JKLC = KLCL(JI)
JKLD = KDPL(JI)
JKLP = KPBL(JI)
ZWORK1(JI,:) = .5 * ( PCH1(JI,JKLD,:) + PCH1(JI,JKLP,:) )
END DO
!
!* 2.2 Final updraft loop
! ------------------
!
DO JK = MINVAL( KDPL(:) ), JKMAX
JKP = JK + 1
!
DO JN = 1, INCH1
DO JI = 1, IIE
IF ( KDPL(JI) <= JK .AND. KLCL(JI) > JK ) &
ZUCH1(JI,JK,JN) = ZWORK1(JI,JN)
!
IF ( KLCL(JI) - 1 <= JK .AND. KCTL(JI) > JK ) THEN
ZUCH1(JI,JKP,JN) = ZUCH1(JI,JK,JN)
!if you have reactive i.e. non-passive tracers
! update their values here and add the corresponding
! sink term in the following equation
ZUCH1(JI,JKP,JN) = ( PUMF(JI,JK) * ZUCH1(JI,JK,JN) + &
PUER(JI,JKP) * PCH1(JI,JK,JN) ) / &
( PUMF(JI,JKP) + PUDR(JI,JKP) + 1.E-7 )
END IF
END DO
END DO
!
END DO
!
!* 3. Downdraft computations
! ----------------------
!
ZDCH1(:,:,:) = 0.
!
!* 3.1 Initialization at the LFS
! -------------------------
!
ZWORK1(:,:) = SPREAD( PMIXF(:), DIM=2, NCOPIES=INCH1 )
DO JI = 1, IIE
JK = KLFS(JI)
ZDCH1(JI,JK,:) = ZWORK1(JI,:) * PCH1(JI,JK,:) + &
( 1. - ZWORK1(JI,:) ) * ZUCH1(JI,JK,:)
END DO
!
!* 3.2 Final downdraft loop
! --------------------
!
DO JK = MAXVAL( KLFS(:) ), IKB + 1, -1
JKP = JK - 1
DO JN = 1, INCH1
DO JI = 1, IIE
IF ( JK <= KLFS(JI) .AND. JKP >= KDBL(JI) ) THEN
ZDCH1(JI,JKP,JN) = ( ZDCH1(JI,JK,JN) * PDMF(JI,JK) - &
PCH1(JI,JK,JN) * PDER(JI,JKP) ) / &
( PDMF(JI,JKP) - PDDR(JI,JKP) - 1.E-7 )
END IF
END DO
END DO
END DO
!
!
!* 4. Final closure (environmental) computations
! ------------------------------------------
!
PCH1C(:,IKB:IKE,:) = PCH1(:,IKB:IKE,:) ! initialize adjusted envir. values
!
DO JK = IKB, IKE
ZOMG(:,JK) = PWSUB(:,JK) * PDXDY(:) / XG ! environmental subsidence
END DO
!
ZTIMEC(:) = PTIMEC(:) / REAL( KFTSTEPS ) ! adjust fractional time step
! to be an integer multiple of PTIMEC
WHERE ( PTIMEC(:) < 1. ) ZTIMEC(:) = 0.
ZTIMC(:,:)= SPREAD( ZTIMEC(:), DIM=2, NCOPIES=IKS )
!
ZCH1MFIN(:,:,:) = 0.
ZCH1MFOUT(:,:,:) = 0.
!
DO JSTEP = 1, KFTSTEPS ! Enter the fractional time step loop
!
DO JK = IKB + 1, JKMAX
JKP = MAX( IKB + 1, JK - 1 )
ZWORK3(:,:) = SPREAD( ZOMG(:,JK), DIM=2, NCOPIES=INCH1 )
ZWORK1(:,:) = SIGN( 1., ZWORK3(:,:) )
ZWORK2(:,:) = 0.5 * ( 1. + ZWORK1(:,:) )
ZWORK1(:,:) = 0.5 * ( 1. - ZWORK1(:,:) )
ZCH1MFIN(:,JK,:) = - ZWORK3(:,:) * PCH1C(:,JKP,:) * ZWORK1(:,:)
ZCH1MFOUT(:,JK,:) = ZWORK3(:,:) * PCH1C(:,JK,:) * ZWORK2(:,:)
ZCH1MFIN(:,JKP,:) = ZCH1MFIN(:,JKP,:) + ZCH1MFOUT(:,JK,:) * ZWORK2(:,:)
ZCH1MFOUT(:,JKP,:)= ZCH1MFOUT(:,JKP,:) + ZCH1MFIN(:,JK,:) * ZWORK1(:,:)
END DO
!
DO JN = 1, INCH1
DO JK = IKB + 1, JKMAX
PCH1C(:,JK,JN) = PCH1C(:,JK,JN) + ZTIMC(:,JK) / PLMASS(:,JK) * ( &
ZCH1MFIN(:,JK,JN) + PUDR(:,JK) * ZUCH1(:,JK,JN) + &
PDDR(:,JK) * ZDCH1(:,JK,JN) - ZCH1MFOUT(:,JK,JN) - &
( PUER(:,JK) + PDER(:,JK) ) * PCH1(:,JK,JN) )
PCH1C(:,JK,JN) = MAX( 0., PCH1C(:,JK,JN) )
END DO
END DO
!
END DO ! Exit the fractional time step loop
!
!
END SUBROUTINE CONVECT_CHEM_TRANSPORT
!
!
!----------------------------------------------------------------------------
! ######################################################################
SUBROUTINE CONVECT_UV_TRANSPORT( KLON, KLEV, PU, PV, PUC, PVC, & 1,3
KDPL, KPBL, KLCL, KCTL, KLFS, KDBL, &
PUMF, PUER, PUDR, PDMF, PDER, PDDR, &
PTIMEC, PDXDY, PMIXF, PLMASS, PWSUB,&
KFTSTEPS )
! ######################################################################
!!**** Compute modified horizontal wind components due to convective event
!!
!!
!! PURPOSE
!! -------
!! The purpose of this routine is to determine convective adjusted
!! horizontal wind components u and v
!! The final convective tendencies can then be evaluated in the main
!! routine DEEP_CONVECT by (PUC-PU)/PTIMEC
!!
!!
!!** METHOD
!! ------
!! Identical to the computation of the conservative variables in the
!! tracer routine but includes pressure term
!!
!! EXTERNAL
!! --------
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CSTS
!! XG ! gravity constant
!!
!! Module MODD_CONVPAREXT
!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries
!!
!! AUTHOR
!! ------
!! P. BECHTOLD * Laboratoire d'Aerologie *
!!
!! MODIFICATIONS
!! -------------
!!
!! Original 11/02/02
!!
!-------------------------------------------------------------------------------
!* 0. DECLARATIONS
! ------------
USE MODD_CSTS
USE MODD_CONVPAR
USE MODD_CONVPAREXT
IMPLICIT NONE
!* 0.1 Declarations of dummy arguments :
INTEGER, INTENT(IN) :: KLON ! horizontal dimension
INTEGER, INTENT(IN) :: KLEV ! vertical dimension
REAL,DIMENSION(KLON,KLEV),INTENT(IN) :: PU ! horizontal wind in x (m/s)
REAL,DIMENSION(KLON,KLEV),INTENT(IN) :: PV ! horizontal wind in x (m/s)
REAL,DIMENSION(KLON,KLEV),INTENT(OUT):: PUC ! convective adjusted value of u (m/s)
REAL,DIMENSION(KLON,KLEV),INTENT(OUT):: PVC ! convective adjusted value of v (m/s)
INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level
INTEGER, DIMENSION(KLON), INTENT(IN) :: KLFS ! index for level of free sink
INTEGER, DIMENSION(KLON), INTENT(IN) :: KDBL ! index for downdraft base level
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUMF ! updraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUER ! updraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUDR ! updraft detrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDMF ! downdraft mass flux (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDER ! downdraft entrainment (kg/s)
REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDDR ! downdraft detrainment (kg/s)
REAL, DIMENSION(KLON), INTENT(IN) :: PTIMEC! convection time step
REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2)
REAL, DIMENSION(KLON), INTENT(IN) :: PMIXF ! mixed fraction at LFS
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PLMASS! mass of model layer (kg)
REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PWSUB ! envir. compensating subsidence(Pa/s)
INTEGER, INTENT(IN) :: KFTSTEPS ! maximum fractional time steps
!* 0.2 Declarations of local variables :
INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds
INTEGER :: IKS ! vertical dimension
INTEGER :: JI ! horizontal loop index
INTEGER :: JK, JKP ! vertical loop index
INTEGER :: JSTEP ! fractional time loop index
INTEGER :: JKLD, JKLP, JKMAX ! loop index for levels
INTEGER, PARAMETER :: IUV = 2 ! for u and v
REAL, DIMENSION(KLON,KLEV) :: ZOMG ! compensat. subsidence (Pa/s)
REAL, DIMENSION(KLON,KLEV,IUV) :: ZUUV, ZDUV ! updraft/downdraft values
REAL, DIMENSION(KLON) :: ZTIMEC ! fractional convective time step
REAL, DIMENSION(KLON,KLEV) :: ZTIMC ! 2D work array for ZTIMEC
REAL, DIMENSION(KLON,KLEV,IUV) :: ZUVMFIN, ZUVMFOUT
! work arrays for environm. compensat. mass
REAL, DIMENSION(KLON,IUV) :: ZWORK1, ZWORK2, ZWORK3
!-------------------------------------------------------------------------------
!* 0.3 Compute loop bounds
! -------------------
IIE = KLON
IKB = 1 + JCVEXB
IKS = KLEV
IKE = KLEV - JCVEXT
JKMAX = MAXVAL( KCTL(:) )
!* 2. Updraft computations
! --------------------
ZUUV(:,:,:) = 0.0
!* 2.1 Initialization at LCL
! ----------------------------------
DO JI = 1, IIE
JKLD = KDPL(JI)
JKLP = KPBL(JI)
ZWORK1(JI,1) = 0.5 * ( PU(JI,JKLD) + PU(JI,JKLP) )
ZWORK1(JI,2) = 0.5 * ( PV(JI,JKLD) + PV(JI,JKLP) )
ENDDO
!* 2.2 Final updraft loop
! ------------------
DO JK = MINVAL( KDPL(:) ), JKMAX
JKP = JK + 1
DO JI = 1, IIE
IF ( KDPL(JI) <= JK .AND. KLCL(JI) > JK ) THEN
ZUUV(JI,JK,1) = ZWORK1(JI,1)
ZUUV(JI,JK,2) = ZWORK1(JI,2)
END IF
IF ( KLCL(JI) - 1 <= JK .AND. KCTL(JI) > JK ) THEN
! instead of passive tracers equations
! wind equations also include pressure term
ZUUV(JI,JKP,1) = ( PUMF(JI,JK) * ZUUV(JI,JK,1) + &
& PUER(JI,JKP) * PU(JI,JK) ) / &
& ( PUMF(JI,JKP) + PUDR(JI,JKP) + 1.E-7 ) + &
& XUVDP * ( PU(JI,JKP) - PU(JI,JK) )
ZUUV(JI,JKP,2) = ( PUMF(JI,JK) * ZUUV(JI,JK,2) + &
& PUER(JI,JKP) * PV(JI,JK) ) / &
& ( PUMF(JI,JKP) + PUDR(JI,JKP) + 1.E-7 ) + &
& XUVDP * ( PV(JI,JKP) - PV(JI,JK) )
ENDIF
ENDDO
ENDDO
!* 3. Downdraft computations
! ----------------------
ZDUV(:,:,:) = 0.0
!* 3.1 Initialization at the LFS
! -------------------------
ZWORK1(:,:) = SPREAD( PMIXF(:), DIM=2, NCOPIES=IUV )
DO JI = 1, IIE
JK = KLFS(JI)
ZDUV(JI,JK,1) = ZWORK1(JI,1) * PU(JI,JK) + &
& ( 1.0 - ZWORK1(JI,1) ) * ZUUV(JI,JK,1)
ZDUV(JI,JK,2) = ZWORK1(JI,2) * PV(JI,JK) + &
& ( 1.0 - ZWORK1(JI,2) ) * ZUUV(JI,JK,2)
ENDDO
!* 3.2 Final downdraft loop
! --------------------
DO JK = MAXVAL( KLFS(:) ), IKB + 1, -1
JKP = JK - 1
DO JI = 1, IIE
IF ( JK <= KLFS(JI) .AND. JKP >= KDBL(JI) ) THEN
ZDUV(JI,JKP,1) = ( ZDUV(JI,JK,1) * PDMF(JI,JK) - &
& PU(JI,JK) * PDER(JI,JKP) ) / &
& ( PDMF(JI,JKP) - PDDR(JI,JKP) - 1.E-7 ) + &
& XUVDP * ( PU(JI,JKP) - PU(JI,JK) )
ZDUV(JI,JKP,2) = ( ZDUV(JI,JK,2) * PDMF(JI,JK) - &
& PV(JI,JK) * PDER(JI,JKP) ) / &
& ( PDMF(JI,JKP) - PDDR(JI,JKP) - 1.E-7 ) + &
& XUVDP * ( PV(JI,JKP) - PV(JI,JK) )
ENDIF
ENDDO
ENDDO
!* 4. Final closure (environmental) computations
! ------------------------------------------
PUC(:,IKB:IKE) = PU(:,IKB:IKE) ! initialize adjusted envir. values
PVC(:,IKB:IKE) = PV(:,IKB:IKE) ! initialize adjusted envir. values
DO JK = IKB, IKE
ZOMG(:,JK) = PWSUB(:,JK) * PDXDY(:) / XG ! environmental subsidence
ENDDO
ZTIMEC(:) = PTIMEC(:) / REAL( KFTSTEPS ) ! adjust fractional time step
! to be an integer multiple of PTIMEC
WHERE ( PTIMEC(:) < 1.0 ) ZTIMEC(:) = 0.0
ZTIMC(:,:)= SPREAD( ZTIMEC(:), DIM=2, NCOPIES=IKS )
ZUVMFIN(:,:,:) = 0.0
ZUVMFOUT(:,:,:) = 0.0
DO JSTEP = 1, KFTSTEPS ! Enter the fractional time step loop
DO JK = IKB + 1, JKMAX
JKP = MAX( IKB + 1, JK - 1 )
DO JI = 1, IIE
IF ( JK <= KCTL(JI) ) THEN
ZWORK3(JI,1) = ZOMG(JI,JK)
ZWORK1(JI,1) = SIGN( 1.0, ZWORK3(JI,1) )
ZWORK2(JI,1) = 0.5 * ( 1.0 + ZWORK1(JI,1) )
ZWORK1(JI,1) = 0.5 * ( 1.0 - ZWORK1(JI,1) )
ZUVMFIN(JI,JK,1) = - ZWORK3(JI,1) * PUC(JI,JKP) * ZWORK1(JI,1)
ZUVMFOUT(JI,JK,1) = ZWORK3(JI,1) * PUC(JI,JK) * ZWORK2(JI,1)
ZUVMFIN(JI,JK,2) = - ZWORK3(JI,1) * PVC(JI,JKP) * ZWORK1(JI,1)
ZUVMFOUT(JI,JK,2) = ZWORK3(JI,1) * PVC(JI,JK) * ZWORK2(JI,1)
ZUVMFIN(JI,JKP,1) = ZUVMFIN(JI,JKP,1) + ZUVMFOUT(JI,JK,1) * ZWORK2(JI,1)
ZUVMFIN(JI,JKP,2) = ZUVMFIN(JI,JKP,2) + ZUVMFOUT(JI,JK,2) * ZWORK2(JI,1)
ZUVMFOUT(JI,JKP,1)= ZUVMFOUT(JI,JKP,1)+ ZUVMFIN(JI,JK,1) * ZWORK1(JI,1)
ZUVMFOUT(JI,JKP,2)= ZUVMFOUT(JI,JKP,2)+ ZUVMFIN(JI,JK,2) * ZWORK1(JI,1)
END IF
END DO
END DO
DO JK = IKB + 1, JKMAX
DO JI = 1, IIE
IF ( JK <= KCTL(JI) ) THEN
PUC(JI,JK) = PUC(JI,JK) + ZTIMC(JI,JK) / PLMASS(JI,JK) * ( &
& ZUVMFIN(JI,JK,1) + PUDR(JI,JK) * ZUUV(JI,JK,1) + &
& PDDR(JI,JK) * ZDUV(JI,JK,1) - ZUVMFOUT(JI,JK,1) - &
& ( PUER(JI,JK) + PDER(JI,JK) ) * PU(JI,JK) )
PVC(JI,JK) = PVC(JI,JK) + ZTIMC(JI,JK) / PLMASS(JI,JK) * ( &
& ZUVMFIN(JI,JK,2) + PUDR(JI,JK) * ZUUV(JI,JK,2) + &
& PDDR(JI,JK) * ZDUV(JI,JK,2) - ZUVMFOUT(JI,JK,2) - &
& ( PUER(JI,JK) + PDER(JI,JK) ) * PV(JI,JK) )
END IF
END DO
END DO
ENDDO ! Exit the fractional time step loop
END SUBROUTINE CONVECT_UV_TRANSPORT
!
!----------------------------------------------------------------------------