!copyright (C) 2001 MSC-RPN COMM %%%RPNKUO%%%
***S/P LIN_KUOSYM_AD
*
#include "phy_macros_f.h"
SUBROUTINE LIN_KUOSYM_AD ( CTT5,CQT5,ilab,CCF5,DBDT5,CRR5,CSR5, 1,7
+ CTT ,CQT , CRR, CSR ,
+ TP5,TM5,QP5,QM5,GZM5,PSP5,
+ TP ,TM ,QP ,QM ,GZM ,PSP ,
+ SIGMA, TAU, NI, NK )
#include "impnone.cdk"
*
C
INTEGER NI,NK
REAL CTT(NI,NK),CQT(NI,NK)
REAL CTT5(NI,NK),CQT5(NI,NK)
INTEGER ilab(NI,NK)
REAL CCF5(NI,NK),DBDT5(NI),CRR(NI),CSR(NI)
REAL CRR5(NI),CSR5(NI)
REAL TP
(NI,NK),TM(NI,NK),QP(NI,NK),QM(NI,NK),GZM(NI,NK)
REAL TP5(NI,NK),TM5(NI,NK),QP5(NI,NK),QM5(NI,NK),GZM5(NI,NK)
REAL PSP(NI),SIGMA(NI,NK)
REAL PSP5(NI)
REAL TAU
*
*Author
* J.-F. Mahfouf (Sept 2002)
*
*Revision
* 001 J.-F. Mahfouf (Feb 2004) - LNOISE
*
*Object
* To calculate the convective tendencies of T and Q
* using a scheme with a "symmetric Kuo-type closure".
* Geleyn's method is used to obtain the cloud profiles.
*
* ================
* Adjoint version
* ================
*
*Arguments
*
* - Outputs -
* CTT convective temperature tendency
* CQT convective specific humidity tendency
* CRR rate of liquid convective precipitation
* CSR rate of solid convective precipitation
*
* CTT5 convective temperature tendency [trajectory]
* CQT5 convective specific humidity tendency [trajectory]
* ilab flag array: an indication of convective activity [trajectory]
* CCF5 estimated cumulus cloud fraction [trajectory]
* DBDT5 estimated averaged cloud fraction growth rate [trajectory]
* CRR5 rate of liquid convective precipitation [trajectory]
* CSR5 rate of solid convective precipitation [trajectory]
*
* - Inputs -
* TP temperature at (t+dt)
* TM temperature at (t-dt)
* QP specific humidity at (t+dt)
* QM specific humidity at (t-dt)
* GZM geopotential
* PSP surface pressure at (t+dt)
*
* TP5 temperature at (t+dt) [trajectory]
* TM5 temperature at (t-dt) [trajectory]
* QP5 specific humidity at (t+dt) [trajectory]
* QM5 specific humidity at (t-dt) [trajectory]
* GZM5 geopotential [trajectory]
* PSP5 surface pressure at (t+dt) [trajectory]
*
* SIGMA sigma levels
* TAU effective timestep (2*dt)
* NI horizontal dimension
* NK vertical dimension
*
*Notes
* The routine is divided into 5 parts:
* 1)allocation and position for work space
* 2)preliminary computations
* 3)cloud ascent and flagging
* 4)total dry and moist enthalpy accession calculations
* 5)cloud heating and moistening (drying) calculations
*
**
LOGICAL LO, LNOISE
INTEGER IS,IKA,IKB,jk,jkm1,jl
REAL ZTVC5
REAL ZTVC
REAL ENTRM,TAUCU,CHLS,DELTA2
REAL ZA1,ZA3,ZA4,ZSIG5
REAL ZK5,ZDH5,ZTDIF5,ZQDIF5
REAL ZK,ZDH,ZTDIF,ZQDIF
*
C
************************************************************************
* AUTOMATIC ARRAYS
************************************************************************
*
AUTOMATIC ( LO1 , LOGICAL , (NI ))
*
AUTOMATIC ( ZCP5 , REAL , (NI ))
AUTOMATIC ( ZLDCP0 , REAL , (NI ))
AUTOMATIC ( ZPR5 , REAL , (NI ))
AUTOMATIC ( ZT15 , REAL , (NI ))
AUTOMATIC ( ZQ15 , REAL , (NI ))
AUTOMATIC ( ZP15 , REAL , (NI ))
AUTOMATIC ( ZPP5 , REAL , (NI,NK))
AUTOMATIC ( ZDSG5 , REAL , (NI,NK))
AUTOMATIC ( ZDP5 , REAL , (NI,NK))
AUTOMATIC ( ZSDP5 , REAL , (NI,NK))
AUTOMATIC ( ZQAC5 , REAL , (NI,NK))
AUTOMATIC ( ZTAC5 , REAL , (NI,NK))
AUTOMATIC ( ZSTAC5 , REAL , (NI,NK))
AUTOMATIC ( ZHAC5 , REAL , (NI,NK))
AUTOMATIC ( ZSHAC5 , REAL , (NI,NK))
AUTOMATIC ( ZQSE5 , REAL , (NI,NK))
AUTOMATIC ( ZTC5 , REAL , (NI,NK))
AUTOMATIC ( ZQC5 , REAL , (NI,NK))
AUTOMATIC ( ZTC6 , REAL , (NI,NK))
AUTOMATIC ( ZQC6 , REAL , (NI,NK))
AUTOMATIC ( ZTE5 , REAL , (NI,NK))
AUTOMATIC ( ZQE5 , REAL , (NI,NK))
AUTOMATIC ( ZTVE5 , REAL , (NI,NK))
AUTOMATIC ( ZDQ5 , REAL , (NI,NK))
AUTOMATIC ( ZDT5 , REAL , (NI,NK))
AUTOMATIC ( ZSDH5 , REAL , (NI,NK))
AUTOMATIC ( ZESE5 , REAL , (NI,NK))
AUTOMATIC ( ZCP , REAL , (NI ))
AUTOMATIC ( ZPR , REAL , (NI ))
AUTOMATIC ( ZT1 , REAL , (NI ))
AUTOMATIC ( ZQ1 , REAL , (NI ))
AUTOMATIC ( ZP1 , REAL , (NI ))
AUTOMATIC ( ZPP , REAL , (NI,NK))
AUTOMATIC ( ZDP , REAL , (NI,NK))
AUTOMATIC ( ZSDP , REAL , (NI,NK))
AUTOMATIC ( ZQAC , REAL , (NI,NK))
AUTOMATIC ( ZTAC , REAL , (NI,NK))
AUTOMATIC ( ZSTAC , REAL , (NI,NK))
AUTOMATIC ( ZHAC , REAL , (NI,NK))
AUTOMATIC ( ZSHAC , REAL , (NI,NK))
AUTOMATIC ( ZQSE , REAL , (NI,NK))
AUTOMATIC ( ZTC , REAL , (NI,NK))
AUTOMATIC ( ZQC , REAL , (NI,NK))
AUTOMATIC ( ZTE , REAL , (NI,NK))
AUTOMATIC ( ZQE , REAL , (NI,NK))
AUTOMATIC ( ZTVE , REAL , (NI,NK))
AUTOMATIC ( ZDQ , REAL , (NI,NK))
AUTOMATIC ( ZDT , REAL , (NI,NK))
AUTOMATIC ( ZSDH , REAL , (NI,NK))
AUTOMATIC ( ZESE , REAL , (NI,NK))
C
AUTOMATIC ( ZTDIF6 , REAL , (NI,NK))
AUTOMATIC ( ZQDIF6 , REAL , (NI,NK))
AUTOMATIC ( ZCP6 , REAL , (NI,NK))
AUTOMATIC ( LLO1 , LOGICAL , (NI,NK))
AUTOMATIC ( LLO2 , LOGICAL , (NI,NK))
AUTOMATIC ( LLO3 , LOGICAL , (NI,NK))
AUTOMATIC ( LLO4 , LOGICAL , (NI,NK))
C
*
************************************************************************
C
C* PHYSICAL CONSTANTS.
C -------- ----------
C
#include "consphy.cdk"
C
ENTRM = 5.E-6
TAUCU = 3600.
DELTA2 = CPV/CPD - 1.
CHLS = CHLC + CHLF
ZA1 = 610.78
C
LNOISE=.false.
C
C ------------------------------------------------------------------
C
C* 1. ALLOCATION AND POSITION FOR WORK SPACE.
C ---------- --- -------- --- ---- ------
C
C
C
C***
C
C METHOD.
C -------
C
C IN (3) A NEARLY ADIABATIC ASCENT IS ATTEMPTED FOR A CLOUD
C PARCEL STARTING FROM THE LOWEST MODEL LAYER. THIS CLOUD ASCENT
C IS COMPUTED IN TERMS OF TEMPERATURE AND SPECIFIC HUMIDITY.
C ENTRAINMENT IS SIMULATED VIA AN ENTRAINMENT PARAMETER.
C THE LAYERS ARE FLAGGED ACCORDING TO THE FOLLOWING CODE:
C 0 = STABLE OR INACTIVE LAYER,
C 1 = PART OF THE WELL MIXED BOUNDARY LAYER OR DRY UNSTABLE LAYER,
C 2 = MOIST UNSTABLE OR ACTIVE OR CLOUD LAYER.
C THE 1-FLAGS ARE RESET TO 0-FLAGS FOR THE NEXT SECTION.
C IN (4) THE INTEGRATED MOIST AND DRY ENTHALPY ACCESSIONS
C FOR EACH CLOUD LAYER ARE STORED INTO ALL THE CORRESPONDING
C LAYERS IF THE FIRST IS POSITIVE WHILE THE SECOND IS NEGATIVE,
C OTHERWISE, THE 2-FLAGS ARE ALSO RESET TO 0-FLAGS.
C IN (5) THE ACTUAL MODIFICATIONS OF TEMPERATURE AND SPECIFIC
C HUMIDITY ARE COMPUTED. A CLOUD-COVER VALUE IS ESTIMATED BY
C COMPARING THE TIME AT WHICH THE ENVIRONMENT WOULD REACH
C EQUILIBRIUM WITH THE CLOUD TO A PRESCRIBED CLOUD LIFE-TIME.
C
C ------------------------------------------------------------------
C
C ************************** TRAJECTORY *****************************
C
C
C* 2. PRELIMINARY COMPUTATIONS.
C ----------- -------------
C
C* 2.0 INITIALISATION OF OUTPUT FIELDS
C
ilab(:,:) = 0
CTT5(:,:) = 0.0
CQT5(:,:) = 0.0
CCF5(:,:) = 0.0
CRR5(:) = 0.0
CSR5(:) = 0.0
ZPR5(:) = 0.0
DBDT5(:) = 0.0
C
C* 2.1 ENVIRONMENTAL PROFILES AND PARAMETERS,
C* DRY AND MOIST ENTHALPY ACCESSIONS (divided by cp)
C* AND INITIALIZATIONS.
C
DO jl=1,NI
ZDSG5(jl,1)=0.5*(SIGMA(jl,2)-SIGMA(jl,1))
END DO
C
DO jk=2,NK-1
DO jl=1,NI
ZDSG5(jl,jk)=0.5*(SIGMA(jl,jk+1)-SIGMA(jl,jk-1))
END DO
END DO
C
DO jl=1,NI
ZDSG5(jl,NK)=0.5*(1.-SIGMA(jl,NK-1))+0.5*(1.-SIGMA(jl,NK))
END DO
C
DO jl=1,NI
IF (TP5(jl,NK) < TRPL) THEN
ZLDCP0(jl) = CHLS / CPD
ELSE
ZLDCP0(jl) = CHLC / CPD
ENDIF
END DO
C
DO jk=1,NK
DO jl=1,NI
ZPP5(jl,jk)=SIGMA(jl,jk)*PSP5(jl)
ZDP5(jl,jk)=ZDSG5(jl,jk)*PSP5(jl)
ZTE5(jl,jk)=TP5(jl,jk)
IF (ZTE5(jl,jk) > TRPL) THEN
ZA3=17.269
ZA4=35.860
ELSE
ZA3=21.875
ZA4= 7.660
ENDIF
ZESE5(jl,jk)=ZA1*EXP(ZA3*(ZTE5(jl,jk)-TRPL)/(ZTE5(jl,jk)-ZA4))
ZQSE5(jl,jk)=EPS1*ZESE5(jl,jk)/(ZPP5(jl,jk)-EPS2*ZESE5(jl,jk))
IF (ZQSE5(jl,jk) > QM5(jl,jk)) THEN
ZQE5(jl,jk) = QM5(jl,jk)
ELSE
ZQE5(jl,jk) = ZQSE5(jl,jk)
ENDIF
ZTVE5(jl,jk) = ZTE5(jl,jk)*(1.0 + DELTA*ZQE5(jl,jk))
C
ZTAC5(jl,jk)=(TP5(jl,jk)-TM5(jl,jk))*ZDP5(jl,jk)/TAU
ZQAC5(jl,jk)=(QP5(jl,jk)-ZQE5(jl,jk))*ZDP5(jl,jk)/TAU
C
ZHAC5(jl,jk)= ZTAC5(jl,jk) + ZLDCP0(jl)*ZQAC5(jl,jk)
END DO
END DO
C
C* 2.2 SPECIFY TC AND QC AT THE LOWEST LAYER TO START THE
C* CLOUD ASCENT. CHECK FOR POSITIVE ACCESSION
C* BETWEEN SURFACE AND CLOUD BASE.
C* ZQC=0 INDICATES STABLE CONDITIONS.
C
DO jl=1,NI
ZTC5(jl,NK)=ZTE5(jl,NK)
ZQC5(jl,NK)=0.
IF (ZHAC5(jl,NK) > 0.) THEN
ZQC5(jl,NK)=ZQE5(jl,NK)
ilab(jl,NK) = 1
ENDIF
END DO
C
C ------------------------------------------------------------------
C
C* 3. CLOUD ASCENT AND FLAGGING.
C ----- ------ --- ---------
C
C* 3.1 CALCULATE TC AND QC AT UPPER LEVELS BY DRY ADIABATIC
C* LIFTING FOLLOWED BY LATENT HEAT RELEASE WHEN REQUIRED.
C* CONDENSATION CALCULATIONS ARE DONE WITH TWO ITERATIONS.
C***
DO jk=NK-1,1,-1
C***
DO jl=1,NI
ZCP5(jl)=CPD*(1.+DELTA2*ZQC5(jl,jk+1))
ZCP6(jl,jk) = ZCP5(jl)
LLO1(jl,jk) = ZTC5(jl,jk+1) > ZTE5(jl,jk+1) ! store switch
IF ( ZTC5(jl,jk+1) > ZTE5(jl,jk+1) ) THEN
ZTDIF5 = ZTC5(jl,jk+1)-ZTE5(jl,jk+1)
ELSE
ZTDIF5 = 0.0
ENDIF
ZTDIF6(jl,jk) = ZTDIF5 ! extra storage for adjoint part
ZTC5(jl,jk)=ZTC5(jl,jk+1)+(GZM5(jl,jk+1)-GZM5(jl,jk))*
* (1./ZCP5(jl)+ENTRM*ZTDIF5)
LLO2(jl,jk) = ZQC5(jl,jk+1) > ZQE5(jl,jk+1) ! store switch
IF ( ZQC5(jl,jk+1) > ZQE5(jl,jk+1) ) THEN
ZQDIF5 = ZQC5(jl,jk+1)-ZQE5(jl,jk+1)
ELSE
ZQDIF5 = 0.0
ENDIF
ZQDIF6(jl,jk) = ZQDIF5 ! extra storage for adjoint part
ZQC5(jl,jk)=ZQC5(jl,jk+1)+(GZM5(jl,jk+1)-GZM5(jl,jk))*
* ENTRM*ZQDIF5
ZTVC5 = ZTC5(jl,jk)*(1.0 + DELTA*ZQC5(jl,jk))
LO= ZTVC5.GT.ZTVE5(jl,jk) .AND. ZQC5(jl,jk).NE.0.
IF (LO) ilab(jl,jk) = 1
END DO
C
DO jl=1,NI
ZP15(jl) = ZPP5(jl,jk)
ZT15(jl) = ZTC5(jl,jk)
ZQ15(jl) = ZQC5(jl,jk)
C
C* Store extra fields for the call of adjoint routine
C
ZTC6(jl,jk) = ZTC5 (jl,jk)
ZQC6(jl,jk) = ZQC5 (jl,jk)
C
END DO
C
CALL LIN_ADJTQ
( ZT15, ZQ15, ZP15, NI )
C
DO jl=1,NI
LO1(jl) = ZT15(jl) /= ZTC5(jl,jk)
ZTC5(jl,jk) = ZT15(jl)
ZQC5(jl,jk) = ZQ15(jl)
END DO
C
DO jl=1,NI
ZTVC5=ZTC5(jl,jk)*(1.0+DELTA*ZQC5(jl,jk))
LO= ZTVC5.GT.ZTVE5(jl,jk) .AND. LO1(jl)
IF (LO) ilab(jl,jk) = 2
LO1(jl)=ilab(jl,jk).EQ.0
LLO3(jl,jk) = ilab(jl,jk).EQ.0 ! store switch
IF (LO1(jl)) THEN
ZTC5(jl,jk) = ZTE5(jl,jk)
ZQC5(jl,jk) = 0.0
ENDIF
END DO
C
C* 3.2 IF NOT AT THE TOP CHECK FOR NEW LIFTING LEVEL, I.E.
C* ENTHALPY ACCESSION IN A STABLE LAYER.
C***
IF (jk.NE.1) THEN
DO jl=1,NI
LLO4(jl,jk) = LO1(jl).AND.(ZHAC5(jl,jk) > 0.) ! store switch
IF (LO1(jl).AND.(ZHAC5(jl,jk) > 0.)) THEN
ZTC5(jl,jk) = ZTE5(jl,jk)
ZQC5(jl,jk) = ZQE5(jl,jk)
ENDIF
END DO
ENDIF
C***
END DO
C***
C* 3.3 ilab=0 UNLESS ilab=2
C* IKA INDICATES THE HIGHEST TOP OF A CLOUD
C* (TO AVOID UNNECESSARY COMPUTATIONS LATER).
C
IKA=NK+1
C
DO jk=1,NK
C
DO jl=1,NI
IF (ilab(jl,jk) == 1) ilab(jl,jk) = 0
END DO
C
IF (IKA == NK+1) THEN
IS=0
DO jl=1,NI
IS=IS+ilab(jl,jk)
END DO
IF (IS.NE.0) IKA=jk
ENDIF
C
END DO
C***
IF (IKA == NK+1) RETURN
C***
C ------------------------------------------------------------------
C
C* 4. TOTAL ENERGY ACCESSION
C ----- ------ ---------
C
C* 4.1 CALCULATE TOTAL ENTHALPY ACCESSIONS REQUIRING THAT
C* - TOTAL MOIST ENTHALPY ACCESSION BE > 0
C* - TOTAL DRY ENTHALPY ACCESSION BE < 0
C* IKB IS AN UPDATE OF IKA.
C
DO jl=1,NI
ZSHAC5(jl,:) = 0.0
ZSTAC5(jl,:) = 0.0
ZSDP5(jl,:) = 0.0
END DO
C
DO jk=NK-1,IKA,-1
DO jl=1,NI
IF (ilab(jl,jk) == 2) THEN
ZSHAC5(jl,jk) = ZSHAC5(jl,jk+1)+ZHAC5(jl,jk)
ZSTAC5(jl,jk) = ZSTAC5(jl,jk+1)+ZTAC5(jl,jk)
ZSDP5(jl,jk) = ZSDP5(jl,jk+1)+ZDP5(jl,jk)
ENDIF
END DO
END DO
C
IKB=NK+1
C
DO jk=IKA,NK-1
jkm1=max0(jk-1,1)
C
DO jl=1,NI
IF ((ilab(jl,jk) == 2).AND.(ilab(jl,jkm1) == 2)) THEN
ZSHAC5(jl,jk) = ZSHAC5(jl,jkm1)
ZSTAC5(jl,jk) = ZSTAC5(jl,jkm1)
ZSDP5(jl,jk) = ZSDP5(jl,jkm1)
ENDIF
LO = ZSHAC5(jl,jk).GT.0. .and. ZSTAC5(jl,jk).LT.0.
& and. ZSDP5(jl,jk).GT.0.
IF (.not.LO) ilab(jl,jk) = 0
END DO
C
IF (IKB == NK+1) THEN
IS=0
DO jl=1,NI
IS=IS+ilab(jl,jk)
END DO
IF (IS.NE.0) IKB=jk
ENDIF
C
END DO
C***
IF (IKB == NK+1) RETURN
C***
C ------------------------------------------------------------------
C
C* 5. HEATING AND MOISTENING
C ----------------------
C
C* 5.1 COMPUTE THE TOTAL CLOUD-ENVIRONMENT ENTHALPY
C* DIFFERENCE IN CLOUD LAYERS.
C
DO jl=1,NI
ZSDH5(jl,:)=0.
END DO
C
DO jk=NK-1,IKB,-1
DO jl=1,NI
ZTVC5 = ZTC5(jl,jk)*(1.0 + DELTA*ZQC5(jl,jk))
ZDQ5(jl,jk) = (ZQSE5(jl,jk)-ZQE5(jl,jk))*ZDP5(jl,jk)
ZDT5(jl,jk) = (ZTVC5-ZTVE5(jl,jk))*ZDP5(jl,jk)
ZDH5 = ZDT5(jl,jk)+ZLDCP0(jl)*ZDQ5(jl,jk)
IF (ilab(jl,jk) == 2) THEN
ZSDH5(jl,jk) = ZSDH5(jl,jk+1) + ZDH5
ENDIF
END DO
END DO
C
DO jk=IKB+1,NK-1
DO jl=1,NI
IF ((ilab(jl,jk) == 2).AND.(ilab(jl,jk-1) == 2)) THEN
ZSDH5(jl,jk)= ZSDH5(jl,jk-1)
ENDIF
END DO
END DO
C
C* 5.2 COMPUTE CONVECTIVE HEATING AND MOISTENING.
C* ESTIMATE CONVECTIVE CLOUD FRACTION.
C
DO jk=IKB,NK-1
DO jl=1,NI
IF (ilab(jl,jk) == 0) THEN
ZQAC5(jl,jk) = 0.0
ZTAC5(jl,jk) = 0.0
ZSHAC5(jl,jk) = 0.0
ENDIF
IF (ZSDH5(jl,jk) <= 0.) THEN
ZSDH5(jl,jk) = -1.0
ENDIF
C
ZK5 = ZSHAC5(jl,jk)/ZSDH5(jl,jk)
C
CQT5(jl,jk) = (ZK5*ZDQ5(jl,jk)-ZQAC5(jl,jk))/ZDP5(jl,jk)
CTT5(jl,jk) = (ZK5*ZDT5(jl,jk)-ZTAC5(jl,jk))/ZDP5(jl,jk)
C
ZPR5(jl) = ZPR5(jl) + CTT5(jl,jk)/ZLDCP0(jl)*ZDP5(jl,jk)
C
IF ( DBDT5(jl) < ZK5 ) THEN
DBDT5(jl) = ZK5
ENDIF
C
END DO
END DO
C
C* STORE SURFACE PRECIPITATION
C
DO jl=1,NI
IF (ZTE5(jl,NK) > TRPL) THEN
CRR5(jl) = ZPR5(jl) / GRAV
ELSE
CSR5(jl) = ZPR5(jl) / GRAV
ENDIF
END DO
C
C* Convective cloud fraction
C
DO jl=1,NI
ZPR5(jl) = ZPR5(jl) / ( GRAV * 1.E3 )
IF (ZPR5(jl) < 1.0E-12) THEN
ZPR5(jl) = 1.0E-12
ENDIF
ZPR5(jl) = 2.5 + 0.125 * ALOG(ZPR5(jl))
IF (ZPR5(jl) < DBDT5(jl) * TAU) THEN
ZPR5(jl) = DBDT5(jl) * TAU
ENDIF
IF (ZPR5(jl) > 0.8) THEN
ZPR5(jl) = 0.8
ENDIF
END DO
C
DO jk=IKB,NK-1
DO jl=1,NI
IF (ilab(jl,jk) == 2) THEN
CCF5(jl,jk) = ZPR5(jl)
ELSE
CCF5(jl,jk) = 0.0
ENDIF
ZSIG5=(SIGMA(jl,jk)/0.8)**2
IF (ZSIG5 > 1.0) ZSIG5=1.0
CCF5(jl,jk) = CCF5(jl,jk) * ZSIG5
END DO
END DO
C
C **************************** ADJOINT ****************************
C
C
C 1.0 INITIALISATION OF LOCAL ARRAYS AND VARIABLES
C --------------------------------------------
C
ZTVC = 0.0
ZK = 0.0
ZDH = 0.0
ZTDIF = 0.0
ZQDIF = 0.0
C
ZCP (:) = 0.0
ZPR (:) = 0.0
ZT1 (:) = 0.0
ZQ1 (:) = 0.0
ZP1 (:) = 0.0
C
ZPP (:,:) = 0.0
ZDP (:,:) = 0.0
ZSDP (:,:) = 0.0
ZQAC (:,:) = 0.0
ZTAC (:,:) = 0.0
ZSTAC (:,:) = 0.0
ZHAC (:,:) = 0.0
ZSHAC (:,:) = 0.0
ZQSE (:,:) = 0.0
ZTC (:,:) = 0.0
ZQC (:,:) = 0.0
ZTE (:,:) = 0.0
ZQE (:,:) = 0.0
ZTVE (:,:) = 0.0
ZDQ (:,:) = 0.0
ZDT (:,:) = 0.0
ZSDH (:,:) = 0.0
ZESE (:,:) = 0.0
C
C* STORE SURFACE PRECIPITATION
C
DO jl=1,NI
IF (ZTE5(jl,NK) > TRPL) THEN
ZPR (jl) = ZPR(jl) + CRR(jl) / GRAV
CRR (jl) = 0.0
ELSE
ZPR (jl) = ZPR(jl) + CSR(jl) / GRAV
CSR (jl) = 0.0
ENDIF
END DO
C ------------------------------------------------------------------
C
C* 5. HEATING AND MOISTENING
C ----------------------
CC
C* 5.2 COMPUTE CONVECTIVE HEATING AND MOISTENING.
C* ESTIMATE CONVECTIVE CLOUD FRACTION.
C
DO jk=NK-1,IKB,-1
DO jl=1,NI
C
ZK5 = ZSHAC5(jl,jk)/ZSDH5(jl,jk)
C
CTT (jl,jk) = CTT (jl,jk) + ZPR (jl)/ZLDCP0(jl)*ZDP5(jl,jk)
ZDP (jl,jk) = ZDP (jl,jk) + ZPR (jl)*CTT5(jl,jk)/ZLDCP0(jl)
C
IF (LNOISE) THEN
ZDT (jl,jk) = ZDT (jl,jk) + CTT (jl,jk)*ZK5/ZDP5(jl,jk)
ZK = ZK + CTT (jl,jk)*ZDT5(jl,jk)/ZDP5(jl,jk)
ENDIF
ZTAC (jl,jk) = ZTAC (jl,jk) - CTT (jl,jk)/ZDP5(jl,jk)
ZDP (jl,jk) = ZDP (jl,jk) - CTT (jl,jk)*
* (ZK5*ZDT5(jl,jk)-ZTAC5(jl,jk))/ZDP5(jl,jk)**2
CTT (jl,jk) = 0.0
IF (LNOISE) THEN
ZDQ (jl,jk) = ZDQ (jl,jk) + CQT (jl,jk)*ZK5/ZDP5(jl,jK)
ZK = ZK + CQT (jl,jk)*ZDQ5(jl,jk)/ZDP5(jl,jk)
ENDIF
ZQAC (jl,jk) = ZQAC (jl,jk) - CQT (jl,jk)/ZDP5(jl,jk)
ZDP (jl,jk) = ZDP (jl,jk) - CQT (jl,jk)*
* (ZK5*ZDQ5(jl,jk)-ZQAC5(jl,jk))/ZDP5(jl,jk)**2
CQT(jl,jk) = 0.0
C
ZSHAC (jl,jk) = ZSHAC (jl,jk) + ZK/ZSDH5(jl,jk)
ZSDH(jl,jk) = ZSDH(jl,jk) - ZK*ZSHAC5(jl,jk)/ZSDH5(jl,jk)**2
ZK = 0.0
C
IF (ZSDH5(jl,jk) <= 0.) THEN
ZSDH (jl,jk) = 0.0
ENDIF
IF (ilab(jl,jk) == 0) THEN
ZQAC (jl,jk) = 0.0
ZTAC (jl,jk) = 0.0
ZSHAC (jl,jk) = 0.0
ENDIF
C
END DO
END DO
C
C* 5.1 COMPUTE THE TOTAL CLOUD-ENVIRONMENT ENTHALPY
C* DIFFERENCE IN CLOUD LAYERS.
C
DO jk=NK-1,IKB+1,-1
DO jl=1,NI
IF ((ilab(jl,jk) == 2).AND.(ilab(jl,jk-1) == 2)) THEN
ZSDH (jl,jk-1) = ZSDH (jl,jk-1) + ZSDH (jl,jk)
ZSDH (jl,jk)= 0.0
ENDIF
END DO
END DO
C
DO jk=IKB,NK-1
DO jl=1,NI
ZTVC5 = ZTC5(jl,jk)*(1.0 + DELTA*ZQC5(jl,jk))
IF (ilab(jl,jk) == 2) THEN
ZDH = ZDH + ZSDH (jl,jk)
ZSDH (jl,jk+1)= ZSDH (jl,jk+1) + ZSDH (jl,jk)
ZSDH (jl,jk) = 0.0
ENDIF
ZDT (jl,jk) = ZDT (jl,jk) + ZDH
ZDQ (jl,jk) = ZDQ (jl,jk) + ZDH*ZLDCP0(jl)
ZDH = 0.0
ZTVC = ZTVC + ZDT (jl,jk)*ZDP5(jl,jk)
ZTVE (jl,jk) = ZTVE (jl,jk) - ZDT (jl,jk)*ZDP5(jl,jk)
ZDP (jl,jk) = ZDP (jl,jk) + ZDT (jl,jk)*(ZTVC5-ZTVE5(jl,jk))
ZDT (jl,jk) = 0.0
ZQSE (jl,jk) = ZQSE(jl,jk) + ZDQ (jl,jk)*ZDP5(jl,jk)
ZQE (jl,jk) = ZQE (jl,jk) - ZDQ(jl,jk)*ZDP5(jl,jk)
ZDP (jl,jk) = ZDP (jl,jk) + ZDQ (jl,jk)*
* (ZQSE5(jl,jk)-ZQE5(jl,jk))
ZDQ (jl,jk) = 0.0
ZTC (jl,jk) = ZTC (jl,jk) + ZTVC*(1.0 + DELTA*ZQC5(jl,jk))
ZQC (jl,jk) = ZQC (jl,jk) + ZTVC*DELTA*ZTC5(jl,jk)
ZTVC = 0.0
END DO
END DO
C
DO jl=1,NI
ZSDH (jl,:)=0.
END DO
C
C ------------------------------------------------------------------
C
C* 4. TOTAL ENERGY ACCESSION
C ----- ------ ---------
C
C* 4.1 CALCULATE TOTAL ENTHALPY ACCESSIONS REQUIRING THAT
C* - TOTAL MOIST ENTHALPY ACCESSION BE > 0
C* - TOTAL DRY ENTHALPY ACCESSION BE < 0
C* IKB IS AN UPDATE OF IKA.
C
DO jk=NK-1,IKA,-1
jkm1=max0(jk-1,1)
C
DO jl=1,NI
IF ((ilab(jl,jk) == 2).AND.(ilab(jl,jkm1) == 2)) THEN
ZSDP (jl,jkm1) = ZSDP (jl,jkm1) + ZSDP (jl,jk)
ZSDP (jl,jk) = 0.0
ZSTAC (jl,jkm1) = ZSTAC (jl,jkm1) + ZSTAC (jl,jk)
ZSTAC (jl,jk) = 0.0
ZSHAC (jl,jkm1) = ZSHAC (jl,jkm1) + ZSHAC (jl,jk)
ZSHAC (jl,jk) = 0.0
ENDIF
END DO
END DO
DO jk=IKA,NK-1
DO jl=1,NI
IF (ilab(jl,jk) == 2) THEN
ZSDP (jl,jk+1) = ZSDP (jl,jk+1) + ZSDP (jl,jk)
ZDP (jl,jk) = ZDP (jl,jk) + ZSDP (jl,jk)
ZSDP (jl,jk) = 0.0
ZSTAC (jl,jk+1) = ZSTAC (jl,jk+1) + ZSTAC (jl,jk)
ZTAC (jl,jk) = ZTAC (jl,jk) + ZSTAC (jl,jk)
ZSTAC (jl,jk) = 0.0
ZSHAC (jl,jk+1) = ZSHAC (jl,jk+1) + ZSHAC (jl,jk)
ZHAC (jl,jk) = ZHAC (jl,jk) + ZSHAC (jl,jk)
ZSHAC (jl,jk) = 0.0
ENDIF
END DO
END DO
C
DO jl=1,NI
ZSHAC (jl,:) = 0.0
ZSTAC (jl,:) = 0.0
ZSDP (jl,:) = 0.0
END DO
C
C ------------------------------------------------------------------
C
C* 3. CLOUD ASCENT AND FLAGGING.
C ----- ------ --- ---------
C
C* 3.1 CALCULATE TC AND QC AT UPPER LEVELS BY DRY ADIABATIC
C* LIFTING FOLLOWED BY LATENT HEAT RELEASE WHEN REQUIRED.
C* CONDENSATION CALCULATIONS ARE DONE WITH TWO ITERATIONS.
C***
DO jk=1,NK-1
C
C* 3.2 IF NOT AT THE TOP CHECK FOR NEW LIFTING LEVEL, I.E.
C* ENTHALPY ACCESSION IN A STABLE LAYER.
C***
IF (jk.NE.1) THEN
DO jl=1,NI
IF ( LLO4(jl,jk) ) THEN
ZTE (jl,jk) = ZTE (jl,jk) + ZTC (jl,jk)
ZTC (jl,jk) = 0.0
ZQE (jl,jk) = ZQE (jl,jk) + ZQC (jl,jk)
ZQC (jl,jk) = 0.0
ENDIF
END DO
ENDIF
C
DO jl=1,NI
IF ( LLO3(jl,jk) ) THEN
ZTE (jl,jk) = ZTE (jl,jk) + ZTC (jl,jk)
ZTC (jl,jk) = 0.0
ZQC (jl,jk) = 0.0
ENDIF
END DO
C
DO jl=1,NI
ZT1 (jl) = ZT1 (jl) + ZTC (jl,jk)
ZTC (jl,jk) = 0.0
ZQ1 (jl) = ZQ1 (jl) + ZQC (jl,jk)
ZQC (jl,jk) = 0.0
ENDDO
C
C* Set-up correct trajectory inputs before adjoint call
C
DO jl=1,NI
ZT15(jl) = ZTC6 (jl,jk)
ZQ15(jl) = ZQC6 (jl,jk)
ZP15(jl) = ZPP5 (jl,jk)
END DO
C
CALL LIN_ADJTQ_AD
( ZT15, ZQ15, ZP15, ZT1, ZQ1, ZP1, NI )
C
DO jl=1,NI
ZQC (jl,jk) = ZQC (jl,jk) + ZQ1 (jl)
ZQ1 (jl) = 0.0
ZTC (jl,jk) = ZTC (jl,jk) + ZT1 (jl)
ZT1 (jl) = 0.0
ZPP (jl,jk) = ZPP (jl,jk) + ZP1 (jl)
ZP1 (jl) = 0.0
END DO
C
DO jl=1,NI
ZTDIF5 = ZTDIF6 (jl,jk)
ZQDIF5 = ZQDIF6 (jl,jk)
ZCP5(jl) = ZCP6(jl,jk)
C
ZQC (jl,jk+1) = ZQC (jl,jk+1) + ZQC (jl,jk)
GZM (jl,jk+1) = GZM (jl,jk+1) + ZQC (jl,jk)*ENTRM*ZQDIF5
GZM (jl,jk) = GZM (jl,jk) - ZQC (jl,jk)*ENTRM*ZQDIF5
ZQDIF = ZQDIF + ZQC (jl,jk)*ENTRM*(GZM5(jl,jk+1)-GZM5(jl,jk))
ZQC (jl,jk) = 0.0
IF ( LLO2(jl,jk) ) THEN
ZQC (jl,jk+1) = ZQC (jl,jk+1) + ZQDIF
ZQE (jl,jk+1) = ZQE (jl,jk+1) - ZQDIF
ZQDIF = 0.0
ELSE
ZQDIF = 0.0
ENDIF
ZTC (jl,jk+1) = ZTC (jl,jk+1) + ZTC (jl,jk)
GZM (jl,jk+1) = GZM (jl,jk+1) + ZTC (jl,jk)*
* (1./ZCP5(jl)+ENTRM*ZTDIF5)
GZM (jl,jk) = GZM (jl,jk) - ZTC (jl,jk)*
* (1./ZCP5(jl)+ENTRM*ZTDIF5)
ZCP (jl) = ZCP (jl) - ZTC (jl,jk)*
* (GZM5(jl,jk+1)-GZM5(jl,jk))/ZCP5(jl)**2
ZTDIF = ZTDIF + ZTC (jl,jk)*ENTRM*
* (GZM5(jl,jk+1)-GZM5(jl,jk))
ZTC (jl,jk) = 0.0
IF ( LLO1(jl,jk) ) THEN
ZTC (jl,jk+1) = ZTC (jl,jk+1) + ZTDIF
ZTE (jl,jk+1) = ZTE (jl,jk+1) - ZTDIF
ZTDIF = 0.0
ELSE
ZTDIF = 0.0
ENDIF
ZQC (jl,jk+1) = ZQC (jl,jk+1) + ZCP (jl)*CPD*DELTA2
ZCP (jl) = 0.0
END DO
C***
END DO
C***
C
C* 2.2 SPECIFY TC AND QC AT THE LOWEST LAYER TO START THE
C* CLOUD ASCENT. CHECK FOR POSITIVE ACCESSION
C* BETWEEN SURFACE AND CLOUD BASE.
C* ZQC=0 INDICATES STABLE CONDITIONS.
C
DO jl=1,NI
IF (ZHAC5(jl,NK) > 0.) THEN
ZQE (jl,NK) = ZQE (jl,NK) + ZQC (jl,NK)
ZQC (jl,NK) = 0.0
ENDIF
ZTE (jl,NK) = ZTE (jl,NK) + ZTC (jl,NK)
ZTC (jl,NK) = 0.0
ZQC (jl,NK) = 0.0
END DO
C
C
C* 2.1 ENVIRONMENTAL PROFILES AND PARAMETERS,
C* DRY AND MOIST ENTHALPY ACCESSIONS (divided by cp)
C* AND INITIALIZATIONS.
C
C
DO jk=NK,1,-1
DO jl=1,NI
IF (ZTE5(jl,jk) > TRPL) THEN
ZA3=17.269
ZA4=35.860
ELSE
ZA3=21.875
ZA4= 7.660
ENDIF
ZTAC (jl,jk) = ZTAC (jl,jk) + ZHAC (jl,jk)
ZQAC (jl,jk) = ZQAC (jl,jk) + ZHAC (jl,jk)*ZLDCP0(jl)
ZHAC (jl,jk) = 0.0
QP (jl,jk) = QP (jl,jk) + ZQAC (jl,jk)*ZDP5(jl,jk)/TAU
ZQE (jl,jk) = ZQE (jl,jk) - ZQAC (jl,jk)*ZDP5(jl,jk)/TAU
ZDP (jl,jk) = ZDP (jl,jk) + ZQAC (jl,jk)*
* (QP5(jl,jk)-ZQE5(jl,jk))/TAU
ZQAC (jl,jk) = 0.0
TP
(jl,jk) = TP
(jl,jk) + ZTAC (jl,jk)*ZDP5(jl,jk)/TAU
TM (jl,jk) = TM (jl,jk) - ZTAC (jl,jk)*ZDP5(jl,jk)/TAU
ZDP (jl,jk) = ZDP (jl,jk) + ZTAC (jl,jk)*
* (TP5(jl,jk)-TM5(jl,jk))/TAU
ZTAC (jl,jk) = 0.0
ZTE (jl,jk) = ZTE (jl,jk) + ZTVE (jl,jk)*
* (1.0 + DELTA*ZQE5(jl,jk))
ZQE (jl,jk) = ZQE (jl,jk) + ZTVE (jl,jk)*DELTA*ZTE5(jl,jk)
ZTVE (jl,jk) = 0.0
IF (ZQSE5(jl,jk) > QM5(jl,jk)) THEN
QM (jl,jk) = QM (jl,jk) + ZQE (jl,jk)
ZQE (jl,jk) = 0.0
ELSE
ZQSE (jl,jk) = ZQSE (jl,jk) + ZQE (jl,jk)
ZQE (jl,jk) = 0.0
ENDIF
ZESE (jl,jk) = ZESE (jl,jk) + ZQSE (jl,jk)*EPS1*ZPP5(jl,jk)/
* ((ZPP5(jl,jk)-EPS2*ZESE5(jl,jk))**2)
ZPP (jl,jk) = ZPP (jl,jk) - ZQSE (jl,jk)*EPS1*ZESE5(jl,jk)/
* ((ZPP5(jl,jk)-EPS2*ZESE5(jl,jk))**2)
ZQSE (jl,jk) = 0.0
ZTE (jl,jk) = ZTE (jl,jk) + ZESE(jl,jk)*ZA1*ZA3*(TRPL-ZA4)/
* ((ZTE5(jl,jk)-ZA4)**2)*
* EXP(ZA3*(ZTE5(jl,jk)-TRPL)/(ZTE5(jl,jk)-ZA4))
ZESE (jl,jk) = 0.0
C
TP
(jl,jk) = TP
(jl,jk) + ZTE (jl,jk)
ZTE (jl,jk) = 0.0
PSP (jl) = PSP (jl) + ZDSG5(jl,jk)*ZDP (jl,jk)
ZDP (jl,jk) = 0.0
PSP (jl) = PSP (jl) + SIGMA(jl,jk)*ZPP (jl,jk)
ZPP (jl,jk) = 0.0
C
END DO
END DO
C
C* 2.0 INITIALISATION OF OUTPUT FIELDS
C
CTT (:,:) = 0.0
CQT (:,:) = 0.0
CRR (:) = 0.0
CSR (:) = 0.0
ZPR (:) = 0.0
C
RETURN
END SUBROUTINE LIN_KUOSYM_AD