!copyright (C) 2001 MSC-RPN COMM %%%RPNPHY%%%
***S/R KUOSUN
*
#include "phy_macros_f.h"
SUBROUTINE KUOSUN ( CTT , CQT , ilab , CCF , DBDT , 1,13
& TP , TM , QP , QM , CWP ,
& PSP , PSM , S , ni , nlev ,
& TAU , satuco, kuosym )
#include "impnone.cdk"
*
Integer ni , nlev
Real CTT(ni,nlev) , CQT(ni,nlev) , CCF(ni,nlev), DBDT(ni) ,
& TP
(ni,nlev) , TM(ni,nlev) , QP(ni,nlev) , QM(ni,nlev) ,
& CWP(ni,nlev) , PSP(ni) , PSM(ni) , S(ni,*) ,
& TAU
Integer ilab(ni,nlev)
Logical satuco , kuosym
*
*Authors
* Claude Girard and Gerard Pellerin (1995)
* (from convective code of SKOCON)
*
*Revision
* 001 G.Pellerin (Sep 98) Remove evaporation of CWP
* 002 G.Pellerin (Oct 98) Remove detrainment of CWP
* 003 B.Bilodeau (Jan 01) Automatic arrays
* 003 G.Pellerin (Mai 01) IBM Conversion
* - calls to vslog routine (from massvp4 library)
* - calls to exponen4 (to calculate power function '**')
* - calls to optimized routine MFOQST
* 004 B. Bilodeau (Aug 03) exponen4 replaced by vspown1
*
*Object
*
* This routine deals with parameterization of convective
* heating and drying (a KUO-type scheme developped by Sundqvist)
*
*Arguments
*
* -Outputs-
* CTT temperature tendency due to convection
* CQT vapour tendency due to convection
* -Input/Output-
* ilab flag array: a large scale convergence control as input,
* an indication of convective activity as output
* -Outputs-
* CCF cumulus cloud cover
* -Inputs-
* TP temperature at (t+dt) before convection
* TM temperature at (t-dt)
* QP specific humidity at (t+dt) before convection
* QM specific humidity at (t-dt)
* CWP cloud water content at (t+dt) before convection
* PSP surface pressure at (t+dt)
* PSM surface pressure at (t-dt)
* S sigma level values
* ni number of grid points in the horizontal
* nlev number of levels
* TAU timestep
* satuco parameter to indicate
* kuosym logical switch to activate KUO SYMMETRIC
*
* Note
*
*
* KUO-SUNQVIST scheme
* options of KUO65 and KUO SYMMETRIC
*
* Section 1: Determine CONVECTIVELY ACTIVE COLUMNS and
* define their properties.
*
* An atmospheric column is considered convectively inactive
* until all the conditions are met for it to be called active
* (at the end of the loop 1033 over lifting levels)
*
* a) Find the LCL (lifting condensation level), pressure PB,
* temperature TB, saturated humidity QB, associated with
* lifting level lif.
* Calculate TETAE (equivalent potential temperature) of PB.
* Calculate TC and QC corresponding to TETAE at lif.
* ------------------------------------------------------------
*
* b) Find the LCL (lifting condensation level): khb.
* Calculate profiles of TC and QC assuming TETAE constant.
*
* c) Calculate (TC-T) and (QC-Q)
* Find the LFC (level of free convection): khfree
*
* d) Find the top level (kht)
*
* e) Calculate moisture accession, CQI,
* Calculate the integrals of TC-T and QC-Q,
* from cloud base to cloud top.
* Find (TC-T)max and its level ktcmtx
*
* Section 2: Calculate HEATING and MOISTENING functions.
* Treat the TOP LEVEL as a stratiform ANVIL.
* Special treatment of some SUB-CLOUD layers.
*
**
C-----------------------------------------------------------------------
C I) NAMES OF PARAMETERS AND OTHER QUANTITIES
C ------------------------------------------------------------
C
C CONAE FACTOR TO TUNE TABLE LOOK-UP FOR TETA-AE
C cumask SET = 0 IF CONVECTION, OTHERWISE = 1
C DPRG DELTA-P DIVIDED BY GRAVITY
C HDQAD TENDENCY OF VAPOUR DUE TO EFFECTS OTHER THAN
C CONDENSATION
C HDTAD TENDENCY OF TEMPERATURE DUE TO EFFECTS OTHER THAN
C CONDENSATION
C HKSI0 KSI OF KUO SCHEME
C HPK = P AT SIGMA
C HPKAP = (HP0/HPK ) ** KAPPA
C HQC SATURATION MIXING RATIO ALONG THE MOIST ADIABAT
C THROUGH THE LCL
C HQCMQ HQC MINUS ENVIRONMENTAL Q
C HQSAT SATURATION SPECIFIC HUMIDITY: Qs
C HSQ dQs/dT
C HSQ2 dQs/dlnP
C HTC TEMPERATURE ALONG THE MOIST ADIABAT THROUGH THE LCL
C HTCMT HTC MINUS ENVIRONMENTAL T
C HU RELATIVE HUMIDITY OF THE ENVIRONMENT
C
C HCUNRM CLOUD COVER DEPENDS ON CLOUD DEPTH COMPARED TO
C HCUNRM
C HE273 SATURATION VAPOUR PRESSURE AT T=273K
C HPB P VALUE AT LCL
C HPS TIME AVERAGED SURFACE PRESSURE
C HQB SPECIFIC HUMIDITY AT LCL
C HTAUCU CHARACTERISTIC TIME USED IN CONVECTIVE CLOUD COVER
C SCHEME
C HTB TEMPERATURE AT LCL
C HTD DEW POINT TEMPERATURE OF SURFACE AIR
C HTETAE THETAE THROUGH LCL
C kcbtop NORMALLY = 1, BUT IF THETAE IS SMALL, kcbtop IS SET
C TO .GT. 1, IMPLYING LOWER ALTITUDE IN ORDER TO AVOID
C TC .LT. TVBEG FOR THE VAPSAT TABLE
C khb FIRST MODEL LEVEL ABOVE LCL
C kht TOP LEVEL OF CONVECTION, I.E.,GOING UPWARD IT IS
C THE LAST LEVEL WITH (TC-T).GT.0
C TABICE PROBABILITY FOR ICE CRYSTALS AS A FUNCTION OF
C TEMPERATURE
C TANVIL IF T(cloud top) .LE. TANVIL A STRATIFORM ANVIL CLOUD IS
C PARAMETERIZED
C-----------------------------------------------------------------------
C II) DECLARATIONS
C ------------------------------------------------------------
C
REAL XTCMT , XQCMQ , XLDCP , HKSIZ , HDPAD , ELOFT ,
& HSQ2 , HDQSAD , x , y
REAL XDPRG , UKSIZ , XCOND , XDQ , XEVAP , HP0 ,
& HE273 , HEPSE0 , HKPI , HEDR , HRTDE , HDLDCP ,
& HRTDEL , HELDR , HEDLDR , CONAE , AECON
REAL kmoist , HCUNRM , HTAUCU , TANVIL , rTAU , ZDCW ,
& yp , yt , yq , s1 , s2 , xt ,
& QGTO , xd , ye , YLCP , TVBEG ,
& T0I , TCI , TSCALE , APRI , TOPEQ0 , TODPMX ,
& xwrk , temp1 , temp2
integer khbmax , khtmin , liftst , kcbtmin, ktmp , symopt ,
& khbmin , il , jk , kk , lht , modp ,
& lif , khfmax , khfmin
C
logical logic, formf , anvil, kuo65
c***
#include "dintern.cdk"
#include "consphy.cdk"
c****
*
************************************************************************
* AUTOMATIC ARRAYS
************************************************************************
*
AUTOMATIC ( khb , INTEGER , (NI ))
AUTOMATIC ( kcbtop , INTEGER , (NI ))
AUTOMATIC ( kht , INTEGER , (NI ))
AUTOMATIC ( ilkhb , INTEGER , (NI ))
AUTOMATIC ( ktcmtx , INTEGER , (NI ))
AUTOMATIC ( liftlv , INTEGER , (NI ))
AUTOMATIC ( kuosta , INTEGER , (NI ))
AUTOMATIC ( pp , INTEGER , (NI ))
AUTOMATIC ( ilkht , INTEGER , (NI ))
AUTOMATIC ( khfree , INTEGER , (NI ))
*
AUTOMATIC ( cumask , INTEGER , (NI,NLEV))
AUTOMATIC ( subcld , INTEGER , (NI,NLEV))
*
AUTOMATIC ( activ , LOGICAL , (NI ))
AUTOMATIC ( possib , LOGICAL , (NI ))
AUTOMATIC ( inactiv , LOGICAL , (NI ))
*
AUTOMATIC ( XSUMP , REAL , (NI ))
AUTOMATIC ( HPS , REAL , (NI ))
AUTOMATIC ( ZLDCP , REAL , (NI ))
AUTOMATIC ( HKSI0 , REAL , (NI ))
AUTOMATIC ( HKIMP , REAL , (NI ))
AUTOMATIC ( TEMPAR , REAL , (NI ))
AUTOMATIC ( TEMPAD , REAL , (NI ))
AUTOMATIC ( HTB , REAL , (NI ))
AUTOMATIC ( HPB , REAL , (NI ))
AUTOMATIC ( HQB , REAL , (NI ))
AUTOMATIC ( HTETAE , REAL , (NI ))
AUTOMATIC ( TCMTMX , REAL , (NI ))
AUTOMATIC ( CQI , REAL , (NI ))
AUTOMATIC ( XSUM , REAL , (NI ))
AUTOMATIC ( CQTI , REAL , (NI ))
AUTOMATIC ( HELDCP , REAL , (NI ))
AUTOMATIC ( HTD , REAL , (NI ))
AUTOMATIC ( xdet , REAL , (NI ))
AUTOMATIC ( xdet1 , REAL , (NI ))
*
AUTOMATIC ( HTE , REAL , (NI,NLEV))
AUTOMATIC ( DLNPK , REAL , (NI,NLEV))
AUTOMATIC ( HPKAP , REAL , (NI,NLEV))
AUTOMATIC ( HTCMT , REAL , (NI,NLEV))
AUTOMATIC ( HQCMQ , REAL , (NI,NLEV))
AUTOMATIC ( HDQMX , REAL , (NI,NLEV))
AUTOMATIC ( HQE , REAL , (NI,NLEV))
AUTOMATIC ( HQSAT , REAL , (NI,NLEV))
AUTOMATIC ( HQSATP , REAL , (NI,NLEV))
AUTOMATIC ( HSQ , REAL , (NI,NLEV))
AUTOMATIC ( HU , REAL , (NI,NLEV))
AUTOMATIC ( BETA , REAL , (NI,NLEV))
AUTOMATIC ( HLDCP , REAL , (NI,NLEV))
AUTOMATIC ( HTC , REAL , (NI,NLEV))
AUTOMATIC ( HQC , REAL , (NI,NLEV))
AUTOMATIC ( HFDTMX , REAL , (NI,NLEV))
AUTOMATIC ( DPRG , REAL , (NI,NLEV))
AUTOMATIC ( HCIMP , REAL , (NI,NLEV))
AUTOMATIC ( HDTAD , REAL , (NI,NLEV))
AUTOMATIC ( HDQAD , REAL , (NI,NLEV))
AUTOMATIC ( PRESP , REAL , (NI,NLEV))
AUTOMATIC ( PRESM , REAL , (NI,NLEV))
AUTOMATIC ( HPK , REAL , (NI,NLEV+2))
*
************************************************************************
C
C
C-----------------------------------------------------------------------
C III) STATEMENT FUNCTIONS
C -----------------------------------------------------------
C
*
REAL TABICE , DPKSF , TETAE
*
#include "fintern.cdk"
C
C FORMULA FOR THETHAE FROM A SERIES EXPANSION
C
C TAE = PI*T*EXP(L*Q/(CP*T)) = EXP(CONAE)*PI*T*(1+(X*(1+.5*X))
C WHERE X = L*Q/(CP*T)-CONAE AND CONAE IS A CONST APPR = 0.15
C
TETAE(YP,YT,YQ,YLCP) = AECON * YP * YT * ( 1. + ( YLCP * YQ / YT
& - CONAE ) * ( 1. + 0.5 * ( YLCP * YQ / YT
& - CONAE ) ) )
C
C FORMULA FOR DPK/P
C
DPKSF(S1,S2) = 2. * (S1-S2) / (S1+S2)
C
C PROBABILITY FOR EXISTENCE OF ICE AND THE PRODUCT OF THOSE
C
cgp TABICE(xt) = MAX(APRI*(EXP(-(((MAX(xt,TCI)-TCI)/TSCALE)**2))
cgp + -1.)+1. , 0.0)
C
C
C-----------------------------------------------------------------------
C IV) VALUES OF CONSTANTS - IN SI UNITS - INCLUDING DERIVED ONES
C -----------------------------------------------------------
C
HE273 = 610.78
T0I = 1./TRPL
TCI = 232.
TOPEQ0 = 268.
TODPMX = 256.
TSCALE = (TODPMX - TCI)*SQRT(2.)
APRI = 1./(1.-EXP(-((TOPEQ0-TCI)/TSCALE)**2))
C
HP0 = 1.E5
HEPSE0 = EPS1 * HE273
HKPI = 1./CAPPA
HEDR = EPS1/RGASD
HRTDE = RGASD*TRPL/EPS1
HEDLDR = EPS1*CHLF/RGASD
HDLDCP = CHLF/CPD
C
C-----------------------------------------------------------------------
C V) PARAMATER VALUES IN SI UNITS
C ------------------------------------------------------------
C
CONAE = 0.15
AECON = EXP(CONAE)
rTAU = 1. / TAU
C
C-----------------------------------------------------------------------
C VI) PREPARATIONS
C ------------------------------------------------------------
C
do il = 1, ni
DBDT(il) = 0.
HPS(il) = ( PSP(il) + PSM(il) ) * 0.5
end do
C
DO jk = 1, nlev
do il = 1, ni
HPK(il,jk) = S(il,jk) * HPS(il)
HPKAP(il,jk) = HP0/HPK(il,jk)
end do
END DO
call vspown1 (HPKAP,HPKAP,CAPPA,ni*nlev)
C
do il = 1, ni
HPK(il,nlev+1) = 0. !HPS(il)
HPK(il,nlev+2) = 0. !1.01*HPS(il) !gp
DPRG(il,1) = 0.5 * ( HPK(il,2) - HPK(il,1) ) / GRAV
DLNPK(il,1) = (HPK(il,2) + HPK(il,1)) / HPK(il,1)
end do
C
DO jk = 2, nlev-1
do il = 1, ni
DPRG(il,jk) = 0.5 * ( HPK(il,jk+1) - HPK(il,jk-1) ) / GRAV
DLNPK(il,jk) = (HPK(il,jk+1) + HPK(il,jk)) /
& (HPK(il,jk) + HPK(il,jk-1))
end do
END DO
C
do il = 1, ni
DPRG(il,nlev) = ( 0.5 * ( HPK(il,nlev) - HPK(il,nlev-1) )
& + S(il,nlev+1) * HPS(il) - HPK(il,nlev) ) / GRAV
DLNPK(il,nlev) = (HPS(il) + HPK(il,nlev)) /
& (HPK(il,nlev) + HPK(il,nlev-1))
end do
call vslog( DLNPK, DLNPK, NI*nlev)
C
DO jk = 1, nlev
do il = 1, ni
PRESP(il,jk)=S(il,jk)*PSP(il)
PRESM(il,jk)=S(il,jk)*PSM(il)
enddo
ENDDO
MODP=3
if ( satuco ) then
CALL MFOQST
(HQSAT, TM,S,PRESM,MODP,NI,NLEV,NI)
CALL MFOQST
(HQSATP,TP,S,PRESP,MODP,NI,NLEV,NI)
else
CALL MFOQSA
(HQSAT, TM,S,PRESM,MODP,NI,NLEV,NI)
CALL MFOQSA
(HQSATP,TP,S,PRESP,MODP,NI,NLEV,NI)
endif
C
DO jk = 1, nlev
do il = 1, ni
temp1 = TM(il,jk)
HLDCP(il,jk)=-(((max(temp1,tci)-tci)/tscale)**2)
enddo
call vsexp(HLDCP(1,jk),HLDCP(1,jk),ni)
do il = 1, ni
C
xwrk= max(((apri*(HLDCP(il,jk)-1.0))+1.0),0.0)
HLDCP(il,jk)=(CHLC + (CHLF * xwrk))/CPD
C
if ( satuco ) then
HSQ(il,jk) = FODQS( HQSAT(il,jk) , TM(il,jk) )
else
HSQ(il,jk) = FODQA( HQSAT(il,jk) , TM(il,jk) )
endif
C
HSQ2 = - HQSAT(il,jk) * ( 1. + DELTA * HQSAT(il,jk) )
C
HU(il,jk) = QP(il,jk)/HQSATP(il,jk)
HU(il,jk) = amin1( HU(il,jk) , 1. )
HU(il,jk) = amax1( HU(il,jk) , 0. )
C
QM(il,jk) = amin1( QM(il,jk) , HQSAT(il,jk) )
C
HDTAD(il,jk) = ( TP
(il,jk) - TM(il,jk) ) * rTAU
HDQAD(il,jk) = ( QP(il,jk) - QM(il,jk) ) * rTAU
C
HDPAD = ( PSP(il) - PSM(il) ) / HPS(il) * rTAU
HDQSAD = HSQ(il,jk) * HDTAD(il,jk) + HSQ2 * HDPAD
HCIMP(il,jk) = 1. / ( 1. + HLDCP(il,jk) * HSQ(il,jk) )
HDQMX(il,jk) = ( ( QM(il,jk) - HQSAT(il,jk) ) * rTAU
& + HDQAD(il,jk) - HDQSAD ) * HCIMP(il,jk)
C
XCOND = amax1( HDQMX(il,jk) , 0.0 )
HTE(il,jk) = TP
(il,jk) + HLDCP(il,jk) * XCOND
HQE(il,jk) = QP(il,jk) - XCOND
C
end do
END DO
C
C***********************************************************************
C
C HERE BEGINS THE CALCULATION OF CONVECTIVE CONDENSATION
C
C***********************************************************************
C
C KUO-SUNQVIST scheme
C options of KUO65 and KUO SYMMETRIC
C ------------------------------------------------------------
C
C A) OPTIONS
C
C 1) KUO SUNQVIST (kuosym=.false. , kuo65=.false. )
C 2) KUO65 (kuosym=.false. , kuo65=.true. )
C
kuo65 = .false.
formf = .true.
anvil = .false.
C
C 3) KUO SYMMETRIC (kuosym=.true.)
C
C a) symopt=0 : transient as well as stationary clouds
C activ si CQI>0 ; stat si CQI+CQTI>0
C b) symopt=1 : stationary clouds only
C activ ssi CQI+CQTI>0
symopt = 0
C
if( kuosym ) then
kuo65 = .true.
formf = .false.
anvil = .false.
endif
C
C
C-----------------------------------------------------------------------
C
C B) PARAMATER VALUES IN SI UNITS
C
liftst = 5
kmoist = 3
HCUNRM = 3.E+3
HTAUCU = 3600.
TANVIL = 253.
C
TVBEG = 100.
C-----------------------------------------------------------------------
C
C C) INITIALIZATIONS
C
do il = 1, ni
ZLDCP(il) = HLDCP(il,nlev)
activ(il) = .false.
inactiv(il) = .true.
liftlv(il) = 1
ilkhb(il) = 1
ilkht(il) = 1
kuosta(il) = 0
if( kuosym ) then
kuosta(il) = symopt
endif
end do
C
DO jk = 1, nlev
do il = 1, ni
cumask(il,jk) = 1
subcld(il,jk) = 0
CTT(il,jk) = 0.
CQT(il,jk) = 0.
CCF(il,jk) = 0.
HTCMT(il,jk) = 0.
HQCMQ(il,jk) = 0.
BETA(il,jk) = ( 1.- HU(il,jk) ) ** kmoist
HFDTMX(il,jk) = 1.
end do
END DO
C
if (kuo65) then
DO jk = 1, nlev
do il = 1, ni
BETA(il,jk) = 1.
end do
END DO
endif
C-----------------------------------------------------------------------
C
C D) CALCULATIONS
C
C Section 1: Determine CONVECTIVELY ACTIVE COLUMNS and
C define their properties.
C
C An atmospheric column is considered convectively inactive
C until all the conditions are met for it to be called active
C (at the end of the loop 1033 over lifting levels)
C
C -------------------------------------------------------------------
C
DO 1033 lif = nlev, liftst, -1
C-----------------------------------------------------------------------
C BEGINNING OF LONG VERTICAL LOOP OVER lifting LEVELS
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C
C 1 a) Find the LCL (lifting condensation level), pressure PB,
C temperature TB, saturated humidity QB, associated with
C lifting level lif.
C Calculate TETAE (equivalent potential temperature) of PB.
C Calculate TC and QC corresponding to TETAE at lif.
C ------------------------------------------------------------
C
do il = 1, ni
C
C Find PB
C
HELDCP(il) = EPS1 * HLDCP(il,lif)
xdet(il) = HEPSE0 / (HPK(il,lif)*amax1( HQE(il,lif),1.E-5))
C
end do
call vslog(xdet,xdet,ni)
do il = 1, ni
x = TRPL / ( 1. + HRTDE / (CPD * HLDCP(il,lif)) * xdet(il))
HTD(il) = amin1( x, HTE(il,lif) )
C
xdet(il) = HTD(il) - 0.1875 * ( HTE(il,lif) - HTD(il) )
xdet1(il) = HELDCP(il) * ( 1./HTD(il) - 1./xdet(il) )
end do
call vsexp( xdet1, xdet1, ni)
C
do il = 1, ni
y = HTE(il,lif) * xdet1(il)
x = xdet(il)
HTB(il) = x - ( x - y ) / ( 1. - HELDCP(il) * y / x / x )
HTB(il) = amax1( HTB(il), 1. )
! HPB(il) = HPK(il,lif) * ( HTB(il) / HTE(il,lif) ) ** HKPI
HPB(il) = HTB(il) / HTE(il,lif)
end do
C
call vspown1 (HPB,HPB,HKPI,ni)
C
C Calculate TETAE
C
do il = 1, ni
HPB(il) = HPK(il,lif) * HPB(il)
HQB(il) = amax1( HQE(il,lif), 1.E-5 )
x = HPKAP(il,lif) * HTE(il,lif) / HTB(il)
C
XLDCP = HLDCP(il,lif)
HTETAE(il) = TETAE( x, HTB(il), HQB(il), XLDCP )
C
C Calculate TC and QC
C
x = DPKSF( HPK(il,lif) , HPB(il) )
C
y = x * HTB(il) * ( CAPPA + 9.5 * ( 3.E-3*x + HQB(il) ) )
& / ( 1. + 169. * ( 3.E-3 * x + HQB(il) ) )
C
HTC(il,lif) = HTB(il) + y
end do
C
if ( satuco ) then
CALL MFOQST
(HQC(1,lif),HTC(1,lif),S,HPK(1,lif),MODP,NI,1,NI)
else
CALL MFOQSA
(HQC(1,lif),HTC(1,lif),S,HPK(1,lif),MODP,NI,1,NI)
endif
C
C Estimate maximum cloud tops kcbtop using TETAE
C
IF ( lif .eq. nlev ) THEN
C
do il = 1, ni
kcbtop(il) = 3
end do
C
DO kk = 3, nlev
do il = 1, ni
if ( HTETAE(il) .le. TVBEG*HPKAP(il,kk) ) then
kcbtop(il) = kcbtop(il) + 1
endif
end do
END DO
C
ENDIF
C
kcbtmin = nlev
do il = 1, ni
C
C -the atmosphere must not be too dry
C
possib(il) = inactiv(il) .and. HU(il,lif) .ge. 0.20
CCC & .and. ilab(il,lif).eq.1
C
if ( possib(il) ) then
kcbtmin = min0 ( kcbtmin, kcbtop(il) )
endif
end do
C
C-----------------------------------------------------------------------
C
C 1 b) Find the LCL (lifting condensation level): khb.
C Calculate profiles of TC and QC assuming TETAE constant.
C -------------------------------------------------------------
C
do il = 1, ni
khb(il) = kcbtmin+1
if ( HPK(il,lif).le.HPB(il) ) khb(il) = lif
end do
C
DO kk = lif-1, kcbtmin, -1
do il = 1, ni
C
HELDR = HEDR * CPD * HLDCP(il,kk)
XLDCP = HLDCP(il,kk)
C
C - khb: first level above PB
C
if ( HPK(il,kk).le.HPB(il) .and.
& HPB(il) .lt. HPK(il,kk+1) ) then
temp2 = HPB(il)
x = HTB(il)
khb(il) = kk
else
temp2 = HPK(il,kk+1)
x = HTC(il,kk+1)
endif
C
xd = DPKSF( HPK(il,kk), temp2 )
y = x * xd * ( CAPPA + 9.5 * HQC(il,kk+1) )
& / ( 1. + 169. * HQC(il,kk+1) )
xdet(il) = x + y
end do
C
if ( satuco ) then
CALL MFOQST
(xdet1,xdet,S,HPK(1,kk),MODP,NI,1,NI)
else
CALL MFOQSA
(xdet1,xdet,S,HPK(1,kk),MODP,NI,1,NI)
endif
C
do il = 1, ni
XLDCP = HLDCP(il,kk)
ye = TETAE( HPKAP(il,kk), xdet(il), xdet1(il), XLDCP )
C
x = xdet(il)
y = xdet1(il)
HTC(il,kk) = x - ( ye - HTETAE(il) ) / ( ye
& * ( 1. + XLDCP * y / x * ( HELDR / x - 1. ) ) ) * x
end do
C
if ( satuco ) then
CALL MFOQST
(HQC(1,kk),HTC(1,kk),S,HPK(1,kk),MODP,NI,1,NI)
else
CALL MFOQSA
(HQC(1,kk),HTC(1,kk),S,HPK(1,kk),MODP,NI,1,NI)
endif
END DO
C
do il = 1, ni
possib(il) = possib(il) .and. khb(il) .ge. kcbtop(il)+2
pp(il) = 0
if (possib(il) ) pp(il) = 1
end do
C-----------------------------------------------------------------------
C
C 1 c) Calculate (TC-T) and (QC-Q)
C Find the LFC (level of free convection): khfree
C ------------------------------------------------------------
C
DO kk = lif, kcbtmin, -1
do il = 1, ni
C
XTCMT = HTC(il,kk) * ( 1. + DELTA * HQC(il,kk) )
& - HTE(il,kk) * ( 1. + DELTA * HQE(il,kk) )
XQCMQ = amax1( HQC(il,kk) - HQE(il,kk) , 0. )
C
HTCMT(il,kk) = pp(il) * XTCMT + (1-pp(il)) * HTCMT(il,kk)
HQCMQ(il,kk) = pp(il) * XQCMQ + (1-pp(il)) * HQCMQ(il,kk)
C
end do
END DO
C
khbmax = liftst
khbmin = nlev
do il = 1, ni
if ( possib(il) ) then
khbmax = max0 ( khb(il), khbmax )
khbmin = min0 ( khb(il), khbmin )
endif
end do
C
do il = 1, ni
TEMPAR(il) = 0.
TEMPAD(il) = 0.
khfree(il) = khb(il) + 1
end do
DO kk = kcbtmin+2, khbmax
do il = 1, ni
C
C - khfree: first level for which TC-T > 0.
C
if ( possib(il) .and. HTCMT(il,kk) .gt. 0. ) then
khfree(il) = kk
endif
end do
END DO
C
khfmin=nlev
do il = 1, ni
khfmin = min0 ( khfree(il), khfmin )
end do
C
DO kk = khbmax, khfmin, -1
do il = 1, ni
if ( possib(il)
& .and. khb(il).ge.kk .and. kk.ge.khfree(il) ) then
TEMPAD(il) = HTCMT(il,kk) * DLNPK(il,kk)
TEMPAR(il) = TEMPAR(il) + amin1( TEMPAD(il), 0. )
endif
end do
END DO
*vdir nodep
do il = 1, ni
C
ktmp = khfree(il)
CGP if ( possib(il) ) then !gp
temp1 = HTCMT(il,ktmp-1) * DLNPK(il,ktmp-1)
C
logic = TEMPAR(il).gt.-5.6E-2
& .and. TEMPAR(il)+TEMPAD(il)+temp1 .gt. 0.
& .and. HPK(il,khb(il))-HPK(il,ktmp) .lt. 10000.
& .and. ( HTCMT(il,ktmp-2) .gt. 0.
& .or. HTCMT(il,ktmp-1) .gt. 0.)
C
C -the neg buoy between LCL and LFC must not be too large
C -the net buoy just above LFC must be positive
C -the distance between LCL and LFC must be < than 100 mb
C -the next 2 levels above LFC must not both be neg buoy
C
possib(il) = possib(il) .and. logic
CGP endif
C
end do
C-----------------------------------------------------------------------
C
C 1 d) Find the top level (kht)
C ------------------------------------------------------------
C
khfmax = khbmax
do il = 1, ni
if( possib(il) ) then
khfmax = max0( khfree(il) , khfmax )
endif
kht(il) = nlev+1
end do
C
DO kk = kcbtmin+1, khfmax-1
do il = 1, ni
C
logic = khfree(il).gt.kk .and. kk.gt.kcbtop(il)
& .and. HTCMT(il,kk-1) .le. 0.
& .and. HTCMT(il,kk) .gt. 0.
C
C - kht: last pos buoy level found above khfree
C
if ( logic ) kht(il) = kk
C
end do
END DO
C
khtmin = nlev+1
do il = 1, ni
khtmin = min0 ( kht(il), khtmin )
possib(il) = possib(il) .and. kht(il) .lt. khb(il)
end do
C-----------------------------------------------------------------------
C
C 1 e) Calculate moisture accession, CQI,
C Calculate the integrals of TC-T and QC-Q,
C from cloud base to cloud top.
C Find (TC-T)max and its level ktcmtx
C ------------------------------------------------------------
C
do il = 1, ni
if( possib(il) ) then
CQI(il) = 0.
CQTI(il) = 0.
XSUM(il) = 0.
XSUMP(il) = 0.
endif
end do
C
IF ( formf ) THEN
C
do il = 1, ni
if( possib(il) ) then
ktcmtx(il) = 0
TCMTMX(il) = 1.E-6
endif
end do
C
DO kk = khbmax, khtmin, -1
do il = 1, ni
logic = possib(il)
& .and. kht(il).le.kk .and. kk.le.khb(il)
C
if ( logic .and. TCMTMX(il) .LT. HTCMT(il,kk) ) then
TCMTMX(il) = HTCMT(il,kk)
ktcmtx(il) = kk
endif
end do
END DO
C
DO kk = khtmin, khbmax
do il = 1, ni
C
logic = possib(il)
& .and. kht(il).le.kk .and. kk.le.khb(il)
C
if ( logic ) then
HFDTMX(il,kk) = 1.
if ( kk .lt. ktcmtx(il) ) then
HFDTMX(il,kk) = ABS( HTCMT(il,kk) / TCMTMX(il) )
endif
endif
C
end do
END DO
C
ENDIF
C
DO kk = khtmin, khbmax
do il = 1, ni
C
logic = possib(il)
& .and. kht(il).le.kk .and. kk.le.khb(il)
C
XDPRG = 0.
if ( logic ) XDPRG = DPRG(il,kk)
C
CQI(il) = CQI(il) + XDPRG * HDQAD(il,kk)
CQTI(il) = CQTI(il) + XDPRG * HDTAD(il,kk) / ZLDCP(il)
C
XSUM(il) = XSUM(il) + XDPRG * HFDTMX(il,kk)
& * ( HTCMT(il,kk) / ZLDCP(il)
& + HQCMQ(il,kk) * BETA(il,kk) )
XSUMP(il) = XSUMP(il) + XDPRG
C
end do
END DO
C
C Final conditions for convection:
C -positive CQI
C -sufficient latent energy
C
do il = 1, ni
C
possib(il) = possib(il)
& .and. CQI(il) + kuosta(il)*CQTI(il) .gt. 0.0
& .and. XSUM(il) .gt. 0.2
C
activ(il) = activ(il) .or. possib(il)
inactiv(il) = inactiv(il) .and. .not.possib(il)
C
if ( possib(il) ) then
ilkhb(il) = khb(il)
ilkht(il) = kht(il)
liftlv(il) = lif
endif
C
end do
C
C-----------------------------------------------------------------------
C END OF LONG VERTICAL LOOP OVER lifting LEVELS
1033 CONTINUE
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C
C Section 2: Calculate HEATING and MOISTENING functions.
C Treat the TOP LEVEL as a stratiform ANVIL.
C Special treatment of some SUB-CLOUD layers.
C
C -------------------------------------------------------------------
C
khbmax = 1
khbmin = nlev
khtmin = nlev
do il = 1, ni
C
if ( activ(il) ) then
khbmin = min0 ( ilkhb(il), khbmin )
khbmax = max0 ( ilkhb(il), khbmax )
khtmin = min0 ( ilkht(il), khtmin )
if ( kuosym .and. (CQI(il)+CQTI(il)) .gt. 0. ) then
kuosta(il)=1
endif
endif
C
CQI(il) = CQI(il) + kuosta(il) * CQTI(il)
HKSI0(il) = CQI(il) / amax1( XSUM(il), 1.e-6 )
HKIMP(il) = 1. / ( 1. + 0.5 * TAU * HKSI0(il) )
HKSI0(il) = HKSI0(il) * HKIMP(il)
C
end do
C
DO jk = khtmin, khbmax
do il = 1, ni
C
logic = activ(il)
& .and. ilkht(il).le.jk .and. jk.le.ilkhb(il)
C
if ( logic ) cumask(il,jk) = 0
C
HKSIZ = HKSI0(il) * HFDTMX(il,jk)
HKSIZ = HKSIZ * (1-cumask(il,jk))
UKSIZ = BETA(il,jk) * HKSIZ
C
CTT(il,jk) = HKSIZ * HTCMT(il,jk)
CQT(il,jk) = UKSIZ * HQCMQ(il,jk)
C
CTT(il,jk) = CTT(il,jk)
& - kuosta(il) * HDTAD(il,jk) * HKIMP(il) * (1-cumask(il,jk))
C
CQT(il,jk) = CQT(il,jk)
& - HDQAD(il,jk) * HKIMP(il) * (1-cumask(il,jk))
C
C detrainement de l eau nuageuse
c ZDCW = UKSIZ * CWP(il,jk)
C
c XDQ = HDQMX(il,jk) - ZDCW
c & + ( CQT(il,jk) - HSQ(il,jk) * CTT(il,jk) ) * HCIMP(il,jk)
c XDQ = amax1( XDQ , -ZDCW ) * (1-cumask(il,jk))
C
c CTT(il,jk) = CTT(il,jk) + ZLDCP(il) * XDQ
c CQT(il,jk) = CQT(il,jk) - XDQ
C
C Cloud Cover
C
CCF(il,jk) = HKSIZ * HTAUCU * (1. + XSUMP(il)/HCUNRM )
& / ( 1. + 2.5 * HKSIZ * HTAUCU ) * ( 1.+HU(il,jk) )
C
CCF(il,jk) = amin1( CCF(il,jk), (0.25+0.5*HU(il,jk)) )
C
end do
END DO
C-----------------------------------------------------------------------
C
C Treat the TOP LEVEL as a stratiform ANVIL.
C ------------------------------------------------------------
C
IF ( anvil ) THEN
C
*vdir nodep
do il = 1, ni
C
lht = ilkht(il)
C
logic = activ(il) .and. HTE(il,lht) .le. TANVIL
C
if ( logic ) then
C
CQT(il,lht) = CQT(il,lht) + CTT(il,lht) / ZLDCP(il)
CTT(il,lht) = 0.
*** HDQAD(il,lht) = HDQAD(il,lht) + CQT(il,lht)
cumask(il,lht) = 1
CCF(il,lht) = 0.
C
endif
C
end do
C
ENDIF
C-----------------------------------------------------------------------
C
DO jk = 1, nlev
do il = 1, ni
DBDT(il) = amax1( DBDT(il) , BETA(il,jk) * HKSI0(il) )
ilab(il,jk)=0
if(cumask(il,jk).eq.0) ilab(il,jk)=2
end do
END DO
C***********************************************************************
C
C HERE ENDS THE CALCULATION OF CONVECTIVE CONDENSATION
C
C***********************************************************************
C
C***********************************************************************
C
RETURN
END