!----------------------------------------------------------------------- ! !WRF:MODEL_LAYER:PHYSICS ! !####################TIEDTKE SCHEME######################### ! Taken from the IPRC iRAM - Yuqing Wang, University of Hawaii ! Added by Chunxi Zhang and Yuqing Wang to WRF3.2, May, 2010 ! refenrence: Tiedtke (1989, MWR, 117, 1779-1800) ! Nordeng, T.E., (1995), CAPE closure and organized entrainment/detrainment ! Yuqing Wang et al. (2003,J. Climate, 16, 1721-1738) for improvements ! for cloud top detrainment ! (2004, Mon. Wea. Rev., 132, 274-296), improvements for PBL clouds ! (2007,Mon. Wea. Rev., 135, 567-585), diurnal cycle of precipitation ! This scheme is on testing !########################################################### MODULE module_cu_tiedtke 2 ! !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! epsl--- allowed minimum value for floating calculation !--------------------------------------------------------------- real,parameter :: epsl = 1.0e-20 real,parameter :: t000 = 273.15 real,parameter :: hgfr = 233.15 ! defined in param.f in explct !------------------------------------------------------------- ! Ends the parameters set !++++++++++++++++++++++++++++ REAL,PRIVATE :: G,CPV REAL :: API,A,EOMEGA,RD,RV,CPD,RCPD,VTMPC1,VTMPC2, & RHOH2O,ALV,ALS,ALF,CLW,TMELT,SOLC,STBO,DAYL,YEARL, & C1ES,C2ES,C3LES,C3IES,C4LES,C4IES,C5LES,C5IES,ZRG REAL :: ENTRPEN,ENTRSCV,ENTRMID,ENTRDD,CMFCTOP,RHM,RHC, & CMFCMAX,CMFCMIN,CMFDEPS,RHCDD,CPRCON,CRIRH,ZBUO0, & fdbk,ZTAU INTEGER :: orgen,nturben,cutrigger REAL :: CVDIFTS, CEVAPCU1, CEVAPCU2,ZDNOPRC PARAMETER(A=6371.22E03, & ALV=2.5008E6, & ALS=2.8345E6, & ALF=ALS-ALV, & CPD=1005.46, & CPV=1869.46, & ! CPV in module is 1846.4 RCPD=1.0/CPD, & RHOH2O=1.0E03, & TMELT=273.16, & G=9.806, & ! G=9.806 ZRG=1.0/G, & RD=287.05, & RV=461.51, & C1ES=610.78, & C2ES=C1ES*RD/RV, & C3LES=17.269, & C4LES=35.86, & C5LES=C3LES*(TMELT-C4LES), & C3IES=21.875, & C4IES=7.66, & C5IES=C3IES*(TMELT-C4IES), & API=3.141593, & ! API=2.0*ASIN(1.) VTMPC1=RV/RD-1.0, & VTMPC2=CPV/CPD-1.0, & CVDIFTS=1.0, & CEVAPCU1=1.93E-6*261.0*0.5/G, & CEVAPCU2=1.E3/(38.3*0.293) ) ! SPECIFY PARAMETERS FOR MASSFLUX-SCHEME ! -------------------------------------- ! These are tunable parameters ! ! ENTRPEN: AVERAGE ENTRAINMENT RATE FOR PENETRATIVE CONVECTION ! ------- ! PARAMETER(ENTRPEN=1.0E-4) ! ! ENTRSCV: AVERAGE ENTRAINMENT RATE FOR SHALLOW CONVECTION ! ------- ! PARAMETER(ENTRSCV=1.2E-3) ! ! ENTRMID: AVERAGE ENTRAINMENT RATE FOR MIDLEVEL CONVECTION ! ------- ! PARAMETER(ENTRMID=1.0E-4) ! ! ENTRDD: AVERAGE ENTRAINMENT RATE FOR DOWNDRAFTS ! ------ ! PARAMETER(ENTRDD =2.0E-4) ! ! CMFCTOP: RELATIVE CLOUD MASSFLUX AT LEVEL ABOVE NONBUOYANCY LEVEL ! ------- ! PARAMETER(CMFCTOP=0.30) ! ! CMFCMAX: MAXIMUM MASSFLUX VALUE ALLOWED FOR UPDRAFTS ETC ! ------- ! PARAMETER(CMFCMAX=1.0) ! ! CMFCMIN: MINIMUM MASSFLUX VALUE (FOR SAFETY) ! ------- ! PARAMETER(CMFCMIN=1.E-10) ! ! CMFDEPS: FRACTIONAL MASSFLUX FOR DOWNDRAFTS AT LFS ! ------- ! PARAMETER(CMFDEPS=0.30) ! ! CPRCON: COEFFICIENTS FOR DETERMINING CONVERSION FROM CLOUD WATER ! PARAMETER(CPRCON = 1.1E-3/G) ! ! ZDNOPRC: The pressure depth below which no precipitation ! PARAMETER(ZDNOPRC =1.5E4) !-------------------- PARAMETER(orgen=1) ! Old organized entrainment rate ! PARAMETER(orgen=2) ! New organized entrainment rate PARAMETER(nturben=1) ! old deep turburent entrainment/detrainment rate ! PARAMETER(nturben=2) ! New deep turburent entrainment/detrainment rate PARAMETER(cutrigger=1) ! Old trigger function ! PARAMETER(cutrigger=2) ! New trigger function ! !-------------------- PARAMETER(RHC=0.80,RHM=1.0,ZBUO0=0.50) !-------------------- PARAMETER(CRIRH=0.70,fdbk = 1.0,ZTAU = 1800.0) !-------------------- LOGICAL :: LMFPEN,LMFMID,LMFSCV,LMFDD,LMFDUDV PARAMETER(LMFPEN=.TRUE.,LMFMID=.TRUE.,LMFSCV=.TRUE.,LMFDD=.TRUE.,LMFDUDV=.TRUE.) !-------------------- !#################### END of Variables definition########################## !----------------------------------------------------------------------- ! CONTAINS !----------------------------------------------------------------------- SUBROUTINE CU_TIEDTKE( & 1,1 DT,ITIMESTEP,STEPCU & ,RAINCV,PRATEC,QFX,HFX,ZNU & ,U3D,V3D,W,T3D,QV3D,QC3D,QI3D,PI3D,RHO3D & ,QVFTEN,QVPBLTEN & ,DZ8W,PCPS,P8W,XLAND,CU_ACT_FLAG & ,ids,ide, jds,jde, kds,kde & ,ims,ime, jms,jme, kms,kme & ,its,ite, jts,jte, kts,kte & ,RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN & ,RUCUTEN, RVCUTEN & ,F_QV ,F_QC ,F_QR ,F_QI ,F_QS & ) !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- !-- U3D 3D u-velocity interpolated to theta points (m/s) !-- V3D 3D v-velocity interpolated to theta points (m/s) !-- TH3D 3D potential temperature (K) !-- T3D temperature (K) !-- QV3D 3D water vapor mixing ratio (Kg/Kg) !-- QC3D 3D cloud mixing ratio (Kg/Kg) !-- QI3D 3D ice mixing ratio (Kg/Kg) !-- RHO3D 3D air density (kg/m^3) !-- P8w 3D hydrostatic pressure at full levels (Pa) !-- Pcps 3D hydrostatic pressure at half levels (Pa) !-- PI3D 3D exner function (dimensionless) !-- QVFTEN 3D water vapor advection tendency !-- QVPBLTEN 3D water vapor tendency due to a PBL !-- RTHCUTEN Theta tendency due to ! cumulus scheme precipitation (K/s) !-- RUCUTEN U wind tendency due to ! cumulus scheme precipitation (K/s) !-- RVCUTEN V wind tendency due to ! cumulus scheme precipitation (K/s) !-- RQVCUTEN Qv tendency due to ! cumulus scheme precipitation (kg/kg/s) !-- RQRCUTEN Qr tendency due to ! cumulus scheme precipitation (kg/kg/s) !-- RQCCUTEN Qc tendency due to ! cumulus scheme precipitation (kg/kg/s) !-- RQSCUTEN Qs tendency due to ! cumulus scheme precipitation (kg/kg/s) !-- RQICUTEN Qi tendency due to ! cumulus scheme precipitation (kg/kg/s) !-- RAINC accumulated total cumulus scheme precipitation (mm) !-- RAINCV cumulus scheme precipitation (mm) !-- PRATEC precipitiation rate from cumulus scheme (mm/s) !-- dz8w dz between full levels (m) !-- QFX upward moisture flux at the surface (kg/m^2/s) !-- DT time step (s) !-- F_QV etc flag values for tendencies, not used !-- ids start index for i in domain !-- ide end index for i in domain !-- jds start index for j in domain !-- jde end index for j in domain !-- kds start index for k in domain !-- kde end index for k in domain !-- ims start index for i in memory !-- ime end index for i in memory !-- jms start index for j in memory !-- jme end index for j in memory !-- kms start index for k in memory !-- kme end index for k in memory !-- its start index for i in tile !-- ite end index for i in tile !-- jts start index for j in tile !-- jte end index for j in tile !-- kts start index for k in tile !-- kte end index for k in tile !------------------------------------------------------------------- INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte, & ITIMESTEP, & STEPCU REAL, INTENT(IN) :: & DT REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: & XLAND REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: & RAINCV, PRATEC LOGICAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: & CU_ACT_FLAG REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: & DZ8W, & P8w, & Pcps, & PI3D, & QC3D, & QVFTEN, & QVPBLTEN, & QI3D, & QV3D, & RHO3D, & T3D, & U3D, & V3D, & W !--------------------------- OPTIONAL VARS ---------------------------- REAL, DIMENSION(ims:ime, kms:kme, jms:jme), & OPTIONAL, INTENT(INOUT) :: & RQCCUTEN, & RQICUTEN, & RQVCUTEN, & RTHCUTEN, & RUCUTEN, & RVCUTEN ! ! Flags relating to the optional tendency arrays declared above ! Models that carry the optional tendencies will provdide the ! optional arguments at compile time; these flags all the model ! to determine at run-time whether a particular tracer is in ! use or not. ! LOGICAL, OPTIONAL :: & F_QV & ,F_QC & ,F_QR & ,F_QI & ,F_QS !--------------------------- LOCAL VARS ------------------------------ REAL, DIMENSION(ims:ime, jms:jme) :: & QFX, & HFX REAL :: & DELT, & RDELT REAL , DIMENSION(its:ite) :: & RCS, & RN, & EVAP, & heatflux, & rho2d INTEGER , DIMENSION(its:ite) :: SLIMSK REAL , DIMENSION(its:ite, kts:kte+1) :: & PRSI REAL , DIMENSION(its:ite, kts:kte) :: & DEL, & DOT, & PHIL, & PRSL, & Q1, & Q2, & Q3, & Q1B, & Q1BL, & Q11, & Q12, & T1, & U1, & V1, & ZI, & ZL, & OMG, & GHT INTEGER, DIMENSION(its:ite) :: & KBOT, & KTOP INTEGER :: & I, & IM, & J, & K, & KM, & KP, & KX !-------other local variables---- INTEGER,DIMENSION( its:ite ) :: KTYPE REAL, DIMENSION( kts:kte ) :: sig1 ! half sigma levels REAL, DIMENSION( kms:kme ) :: ZNU INTEGER :: zz !----------------------------------------------------------------------- ! DO J=JTS,JTE DO I=ITS,ITE CU_ACT_FLAG(I,J)=.TRUE. ENDDO ENDDO IM=ITE-ITS+1 KX=KTE-KTS+1 DELT=DT*STEPCU RDELT=1./DELT !------------- J LOOP (OUTER) -------------------------------------------------- DO J=jts,jte ! --------------- compute zi and zl ----------------------------------------- DO i=its,ite ZI(I,KTS)=0.0 ENDDO DO k=kts+1,kte KM=k-1 DO i=its,ite ZI(I,K)=ZI(I,KM)+dz8w(i,km,j) ENDDO ENDDO DO k=kts+1,kte KM=k-1 DO i=its,ite ZL(I,KM)=(ZI(I,K)+ZI(I,KM))*0.5 ENDDO ENDDO DO i=its,ite ZL(I,KTE)=2.*ZI(I,KTE)-ZL(I,KTE-1) ENDDO ! --------------- end compute zi and zl ------------------------------------- DO i=its,ite SLIMSK(i)=int(ABS(XLAND(i,j)-2.)) ENDDO DO k=kts,kte kp=k+1 DO i=its,ite DOT(i,k)=-0.5*g*rho3d(i,k,j)*(w(i,k,j)+w(i,kp,j)) ENDDO ENDDO DO k=kts,kte zz = kte+1-k DO i=its,ite U1(i,zz)=U3D(i,k,j) V1(i,zz)=V3D(i,k,j) T1(i,zz)=T3D(i,k,j) Q1(i,zz)= QV3D(i,k,j) if(itimestep == 1) then Q1B(i,zz)=0. Q1BL(i,zz)=0. else Q1B(i,zz)=QVFTEN(i,k,j) Q1BL(i,zz)=QVPBLTEN(i,k,j) endif Q2(i,zz)=QC3D(i,k,j) Q3(i,zz)=QI3D(i,k,j) OMG(i,zz)=DOT(i,k) GHT(i,zz)=ZL(i,k) PRSL(i,zz) = Pcps(i,k,j) ENDDO ENDDO DO k=kts,kte+1 zz = kte+2-k DO i=its,ite PRSI(i,zz) = P8w(i,k,j) ENDDO ENDDO DO k=kts,kte zz = kte+1-k sig1(zz) = ZNU(k) ENDDO !###############before call TIECNV, we need EVAP######################## ! EVAP is the vapor flux at the surface !######################################################################## ! DO i=its,ite EVAP(i) = QFX(i,j) heatflux(i)=HFX(i,j) rho2d(i) = rho3d(i,1,j) ENDDO !######################################################################## CALL TIECNV(U1,V1,T1,Q1,Q2,Q3,Q1B,Q1BL,GHT,OMG,PRSL,PRSI,EVAP,heatflux,rho2d, & RN,SLIMSK,KTYPE,IM,KX,KX+1,sig1,DELT) DO I=ITS,ITE RAINCV(I,J)=RN(I)/STEPCU PRATEC(I,J)=RN(I)/(STEPCU * DT) ENDDO DO K=KTS,KTE zz = kte+1-k DO I=ITS,ITE RTHCUTEN(I,K,J)=(T1(I,zz)-T3D(I,K,J))/PI3D(I,K,J)*RDELT RQVCUTEN(I,K,J)=(Q1(I,zz)-QV3D(I,K,J))*RDELT RUCUTEN(I,K,J) =(U1(I,zz)-U3D(I,K,J))*RDELT RVCUTEN(I,K,J) =(V1(I,zz)-V3D(I,K,J))*RDELT ENDDO ENDDO IF(PRESENT(RQCCUTEN))THEN IF ( F_QC ) THEN DO K=KTS,KTE zz = kte+1-k DO I=ITS,ITE RQCCUTEN(I,K,J)=(Q2(I,zz)-QC3D(I,K,J))*RDELT ENDDO ENDDO ENDIF ENDIF IF(PRESENT(RQICUTEN))THEN IF ( F_QI ) THEN DO K=KTS,KTE zz = kte+1-k DO I=ITS,ITE RQICUTEN(I,K,J)=(Q3(I,zz)-QI3D(I,K,J))*RDELT ENDDO ENDDO ENDIF ENDIF ENDDO END SUBROUTINE CU_TIEDTKE !==================================================================== SUBROUTINE tiedtkeinit(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, & 1 RUCUTEN,RVCUTEN, & RESTART,P_QC,P_QI,P_FIRST_SCALAR, & allowed_to_read, & ids, ide, jds, jde, kds, kde, & ims, ime, jms, jme, kms, kme, & its, ite, jts, jte, kts, kte) !-------------------------------------------------------------------- IMPLICIT NONE !-------------------------------------------------------------------- LOGICAL , INTENT(IN) :: allowed_to_read,restart INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, & ims, ime, jms, jme, kms, kme, & its, ite, jts, jte, kts, kte INTEGER , INTENT(IN) :: P_FIRST_SCALAR, P_QI, P_QC REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: & RTHCUTEN, & RQVCUTEN, & RQCCUTEN, & RQICUTEN, & RUCUTEN,RVCUTEN INTEGER :: i, j, k, itf, jtf, ktf jtf=min0(jte,jde-1) ktf=min0(kte,kde-1) itf=min0(ite,ide-1) IF(.not.restart)THEN DO j=jts,jtf DO k=kts,ktf DO i=its,itf RTHCUTEN(i,k,j)=0. RQVCUTEN(i,k,j)=0. RUCUTEN(i,k,j)=0. RVCUTEN(i,k,j)=0. ENDDO ENDDO ENDDO IF (P_QC .ge. P_FIRST_SCALAR) THEN DO j=jts,jtf DO k=kts,ktf DO i=its,itf RQCCUTEN(i,k,j)=0. ENDDO ENDDO ENDDO ENDIF IF (P_QI .ge. P_FIRST_SCALAR) THEN DO j=jts,jtf DO k=kts,ktf DO i=its,itf RQICUTEN(i,k,j)=0. ENDDO ENDDO ENDDO ENDIF ENDIF END SUBROUTINE tiedtkeinit ! ------------------------------------------------------------------------ !------------This is the combined version for tiedtke--------------- !---------------------------------------------------------------- ! In this module only the mass flux convection scheme of the ECMWF is included !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ !############################################################# ! ! LEVEL 1 SUBROUTINEs ! !############################################################# !******************************************************** ! subroutine TIECNV !******************************************************** SUBROUTINE TIECNV(pu,pv,pt,pqv,pqc,pqi,pqvf,pqvbl,poz,pomg, & 1,2 pap,paph,evap,hfx,rho,zprecc,lndj,KTYPE,lq,km,km1,sig1,dt) !----------------------------------------------------------------- ! This is the interface between the meso-scale model and the mass ! flux convection module !----------------------------------------------------------------- implicit none real pu(lq,km),pv(lq,km),pt(lq,km),pqv(lq,km),pqvf(lq,km) real poz(lq,km),pomg(lq,km),evap(lq),zprecc(lq),pqvbl(lq,km) real PHHFL(lq),RHO(lq),hfx(lq) REAL PUM1(lq,km), PVM1(lq,km), & PTTE(lq,km), PQTE(lq,km), PVOM(lq,km), PVOL(lq,km), & PVERV(lq,km), PGEO(lq,km), PAP(lq,km), PAPH(lq,km1) REAL PQHFL(lq), ZQQ(lq,km), PAPRC(lq), PAPRS(lq), & PRSFC(lq), PSSFC(lq), PAPRSM(lq), PCTE(lq,km) REAL ZTP1(lq,km), ZQP1(lq,km), ZTU(lq,km), ZQU(lq,km), & ZLU(lq,km), ZLUDE(lq,km), ZMFU(lq,km), ZMFD(lq,km), & ZQSAT(lq,km), pqc(lq,km), pqi(lq,km), ZRAIN(lq) REAL sig(km1),sig1(km) INTEGER ICBOT(lq), ICTOP(lq), KTYPE(lq), lndj(lq) REAL dt LOGICAL LOCUM(lq) real PSHEAT,PSRAIN,PSEVAP,PSMELT,PSDISS,TT real ZTMST,ZTPP1,fliq,fice,ZTC,ZALF integer i,j,k,lq,lp,km,km1 ! real TLUCUA ! external TLUCUA ZTMST=dt ! Masv flux diagnostics. PSHEAT=0.0 PSRAIN=0.0 PSEVAP=0.0 PSMELT=0.0 PSDISS=0.0 DO 8 j=1,lq ZRAIN(j)=0.0 LOCUM(j)=.FALSE. PRSFC(j)=0.0 PSSFC(j)=0.0 PAPRC(j)=0.0 PAPRS(j)=0.0 PAPRSM(j)=0.0 PQHFL(j)=evap(j) PHHFL(j)=hfx(j) 8 CONTINUE ! CONVERT MODEL VARIABLES FOR MFLUX SCHEME DO 10 k=1,km DO 10 j=1,lq PTTE(j,k)=0.0 PCTE(j,k)=0.0 PVOM(j,k)=0.0 PVOL(j,k)=0.0 ZTP1(j,k)=pt(j,k) ZQP1(j,k)=pqv(j,k)/(1.0+pqv(j,k)) PUM1(j,k)=pu(j,k) PVM1(j,k)=pv(j,k) PVERV(j,k)=pomg(j,k) PGEO(j,k)=G*poz(j,k) TT=ZTP1(j,k) ZQSAT(j,k)=TLUCUA(TT)/PAP(j,k) ZQSAT(j,k)=MIN(0.5,ZQSAT(j,k)) ZQSAT(j,k)=ZQSAT(j,k)/(1.-VTMPC1*ZQSAT(j,k)) PQTE(j,k)=pqvf(j,k)+pqvbl(j,k) ZQQ(j,k)=PQTE(j,k) 10 CONTINUE ! !----------------------------------------------------------------------- !* 2. CALL 'CUMASTR'(MASTER-ROUTINE FOR CUMULUS PARAMETERIZATION) ! CALL CUMASTR_NEW & (lq, km, km1, km-1, ZTP1, & ZQP1, PUM1, PVM1, PVERV, ZQSAT, & PQHFL, ZTMST, PAP, PAPH, PGEO, & PTTE, PQTE, PVOM, PVOL, PRSFC, & PSSFC, PAPRC, PAPRSM, PAPRS, LOCUM, & KTYPE, ICBOT, ICTOP, ZTU, ZQU, & ZLU, ZLUDE, ZMFU, ZMFD, ZRAIN, & PSRAIN, PSEVAP, PSHEAT, PSDISS, PSMELT, & PCTE, PHHFL, RHO, sig1, lndj) ! ! TO INCLUDE THE CLOUD WATER AND CLOUD ICE DETRAINED FROM CONVECTION ! IF(fdbk.ge.1.0e-9) THEN DO 20 K=1,km DO 20 j=1,lq If(PCTE(j,k).GT.0.0) then ZTPP1=pt(j,k)+PTTE(j,k)*ZTMST if(ZTPP1.ge.t000) then fliq=1.0 ZALF=0.0 else if(ZTPP1.le.hgfr) then fliq=0.0 ZALF=ALF else ZTC=ZTPP1-t000 fliq=0.0059+0.9941*exp(-0.003102*ZTC*ZTC) ZALF=ALF endif fice=1.0-fliq pqc(j,k)=pqc(j,k)+fliq*PCTE(j,k)*ZTMST pqi(j,k)=pqi(j,k)+fice*PCTE(j,k)*ZTMST PTTE(j,k)=PTTE(j,k)-ZALF*RCPD*fliq*PCTE(j,k) Endif 20 CONTINUE ENDIF ! DO 75 k=1,km DO 75 j=1,lq pt(j,k)=ZTP1(j,k)+PTTE(j,k)*ZTMST ZQP1(j,k)=ZQP1(j,k)+(PQTE(j,k)-ZQQ(j,k))*ZTMST pqv(j,k)=ZQP1(j,k)/(1.0-ZQP1(j,k)) 75 CONTINUE DO 85 j=1,lq zprecc(j)=amax1(0.0,(PRSFC(j)+PSSFC(j))*ZTMST) 85 CONTINUE IF (LMFDUDV) THEN DO 100 k=1,km DO 100 j=1,lq pu(j,k)=pu(j,k)+PVOM(j,k)*ZTMST pv(j,k)=pv(j,k)+PVOL(j,k)*ZTMST 100 CONTINUE ENDIF ! RETURN END SUBROUTINE TIECNV !############################################################# ! ! LEVEL 2 SUBROUTINEs ! !############################################################# !*********************************************************** ! SUBROUTINE CUMASTR_NEW !*********************************************************** SUBROUTINE CUMASTR_NEW & 1,10 (KLON, KLEV, KLEVP1, KLEVM1, PTEN, & PQEN, PUEN, PVEN, PVERV, PQSEN, & PQHFL, ZTMST, PAP, PAPH, PGEO, & PTTE, PQTE, PVOM, PVOL, PRSFC, & PSSFC, PAPRC, PAPRSM, PAPRS, LDCUM, & KTYPE, KCBOT, KCTOP, PTU, PQU, & PLU, PLUDE, PMFU, PMFD, PRAIN, & PSRAIN, PSEVAP, PSHEAT, PSDISS, PSMELT,& PCTE, PHHFL, RHO, sig1, lndj) ! !***CUMASTR* MASTER ROUTINE FOR CUMULUS MASSFLUX-SCHEME ! M.TIEDTKE E.C.M.W.F. 1986/1987/1989 !***PURPOSE ! ------- ! THIS ROUTINE COMPUTES THE PHYSICAL TENDENCIES OF THE ! PROGNOSTIC VARIABLES T,Q,U AND V DUE TO CONVECTIVE PROCESSES. ! PROCESSES CONSIDERED ARE: CONVECTIVE FLUXES, FORMATION OF ! PRECIPITATION, EVAPORATION OF FALLING RAIN BELOW CLOUD BASE, ! SATURATED CUMULUS DOWNDRAFTS. !***INTERFACE. ! ---------- ! *CUMASTR* IS CALLED FROM *MSSFLX* ! THE ROUTINE TAKES ITS INPUT FROM THE LONG-TERM STORAGE ! T,Q,U,V,PHI AND P AND MOISTURE TENDENCIES. ! IT RETURNS ITS OUTPUT TO THE SAME SPACE ! 1.MODIFIED TENDENCIES OF MODEL VARIABLES ! 2.RATES OF CONVECTIVE PRECIPITATION ! (USED IN SUBROUTINE SURF) ! 3.CLOUD BASE, CLOUD TOP AND PRECIP FOR RADIATION ! (USED IN SUBROUTINE CLOUD) !***METHOD ! ------ ! PARAMETERIZATION IS DONE USING A MASSFLUX-SCHEME. ! (1) DEFINE CONSTANTS AND PARAMETERS ! (2) SPECIFY VALUES (T,Q,QS...) AT HALF LEVELS AND ! INITIALIZE UPDRAFT- AND DOWNDRAFT-VALUES IN 'CUINI' ! (3) CALCULATE CLOUD BASE IN 'CUBASE' ! AND SPECIFY CLOUD BASE MASSFLUX FROM PBL MOISTURE BUDGET ! (4) DO CLOUD ASCENT IN 'CUASC' IN ABSENCE OF DOWNDRAFTS ! (5) DO DOWNDRAFT CALCULATIONS: ! (A) DETERMINE VALUES AT LFS IN 'CUDLFS' ! (B) DETERMINE MOIST DESCENT IN 'CUDDRAF' ! (C) RECALCULATE CLOUD BASE MASSFLUX CONSIDERING THE ! EFFECT OF CU-DOWNDRAFTS ! (6) DO FINAL CLOUD ASCENT IN 'CUASC' ! (7) DO FINAL ADJUSMENTS TO CONVECTIVE FLUXES IN 'CUFLX', ! DO EVAPORATION IN SUBCLOUD LAYER ! (8) CALCULATE INCREMENTS OF T AND Q IN 'CUDTDQ' ! (9) CALCULATE INCREMENTS OF U AND V IN 'CUDUDV' !***EXTERNALS. ! ---------- ! CUINI: INITIALIZES VALUES AT VERTICAL GRID USED IN CU-PARAMETR. ! CUBASE: CLOUD BASE CALCULATION FOR PENETR.AND SHALLOW CONVECTION ! CUASC: CLOUD ASCENT FOR ENTRAINING PLUME ! CUDLFS: DETERMINES VALUES AT LFS FOR DOWNDRAFTS ! CUDDRAF:DOES MOIST DESCENT FOR CUMULUS DOWNDRAFTS ! CUFLX: FINAL ADJUSTMENTS TO CONVECTIVE FLUXES (ALSO IN PBL) ! CUDQDT: UPDATES TENDENCIES FOR T AND Q ! CUDUDV: UPDATES TENDENCIES FOR U AND V !***SWITCHES. ! -------- ! LMFPEN=.T. PENETRATIVE CONVECTION IS SWITCHED ON ! LMFSCV=.T. SHALLOW CONVECTION IS SWITCHED ON ! LMFMID=.T. MIDLEVEL CONVECTION IS SWITCHED ON ! LMFDD=.T. CUMULUS DOWNDRAFTS SWITCHED ON ! LMFDUDV=.T. CUMULUS FRICTION SWITCHED ON !*** ! MODEL PARAMETERS (DEFINED IN SUBROUTINE CUPARAM) ! ------------------------------------------------ ! ENTRPEN ENTRAINMENT RATE FOR PENETRATIVE CONVECTION ! ENTRSCV ENTRAINMENT RATE FOR SHALLOW CONVECTION ! ENTRMID ENTRAINMENT RATE FOR MIDLEVEL CONVECTION ! ENTRDD ENTRAINMENT RATE FOR CUMULUS DOWNDRAFTS ! CMFCTOP RELATIVE CLOUD MASSFLUX AT LEVEL ABOVE NONBUOYANCY ! LEVEL ! CMFCMAX MAXIMUM MASSFLUX VALUE ALLOWED FOR ! CMFCMIN MINIMUM MASSFLUX VALUE (FOR SAFETY) ! CMFDEPS FRACTIONAL MASSFLUX FOR DOWNDRAFTS AT LFS ! CPRCON COEFFICIENT FOR CONVERSION FROM CLOUD WATER TO RAIN !***REFERENCE. ! ---------- ! PAPER ON MASSFLUX SCHEME (TIEDTKE,1989) !----------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER KLEVM1 REAL ZTMST REAL PSRAIN, PSEVAP, PSHEAT, PSDISS, PSMELT, ZCONS2 INTEGER JK,JL,IKB REAL ZQUMQE, ZDQMIN, ZMFMAX, ZALVDCP, ZQALV REAL ZHSAT, ZGAM, ZZZ, ZHHAT, ZBI, ZRO, ZDZ, ZDHDZ, ZDEPTH REAL ZFAC, ZRH, ZPBMPT, DEPT, ZHT, ZEPS INTEGER ICUM, ITOPM2 REAL PTEN(KLON,KLEV), PQEN(KLON,KLEV), & PUEN(KLON,KLEV), PVEN(KLON,KLEV), & PTTE(KLON,KLEV), PQTE(KLON,KLEV), & PVOM(KLON,KLEV), PVOL(KLON,KLEV), & PQSEN(KLON,KLEV), PGEO(KLON,KLEV), & PAP(KLON,KLEV), PAPH(KLON,KLEVP1),& PVERV(KLON,KLEV), PQHFL(KLON), & PHHFL(KLON), RHO(KLON) REAL PTU(KLON,KLEV), PQU(KLON,KLEV), & PLU(KLON,KLEV), PLUDE(KLON,KLEV), & PMFU(KLON,KLEV), PMFD(KLON,KLEV), & PAPRC(KLON), PAPRS(KLON), & PAPRSM(KLON), PRAIN(KLON), & PRSFC(KLON), PSSFC(KLON) REAL ZTENH(KLON,KLEV), ZQENH(KLON,KLEV),& ZGEOH(KLON,KLEV), ZQSENH(KLON,KLEV),& ZTD(KLON,KLEV), ZQD(KLON,KLEV), & ZMFUS(KLON,KLEV), ZMFDS(KLON,KLEV), & ZMFUQ(KLON,KLEV), ZMFDQ(KLON,KLEV), & ZDMFUP(KLON,KLEV), ZDMFDP(KLON,KLEV),& ZMFUL(KLON,KLEV), ZRFL(KLON), & ZUU(KLON,KLEV), ZVU(KLON,KLEV), & ZUD(KLON,KLEV), ZVD(KLON,KLEV) REAL ZENTR(KLON), ZHCBASE(KLON), & ZMFUB(KLON), ZMFUB1(KLON), & ZDQPBL(KLON), ZDQCV(KLON) REAL ZSFL(KLON), ZDPMEL(KLON,KLEV), & PCTE(KLON,KLEV), ZCAPE(KLON), & ZHEAT(KLON), ZHHATT(KLON,KLEV), & ZHMIN(KLON), ZRELH(KLON) REAL sig1(KLEV) INTEGER ILAB(KLON,KLEV), IDTOP(KLON), & ICTOP0(KLON), ILWMIN(KLON) INTEGER KCBOT(KLON), KCTOP(KLON), & KTYPE(KLON), IHMIN(KLON), & KTOP0, lndj(KLON) LOGICAL LDCUM(KLON) LOGICAL LODDRAF(KLON), LLO1 REAL CRIRH1 !------------------------------------------- ! 1. SPECIFY CONSTANTS AND PARAMETERS !------------------------------------------- 100 CONTINUE ZCONS2=1./(G*ZTMST) !-------------------------------------------------------------- !* 2. INITIALIZE VALUES AT VERTICAL GRID POINTS IN 'CUINI' !-------------------------------------------------------------- 200 CONTINUE CALL CUINI & (KLON, KLEV, KLEVP1, KLEVM1, PTEN, & PQEN, PQSEN, PUEN, PVEN, PVERV, & PGEO, PAPH, ZGEOH, ZTENH, ZQENH, & ZQSENH, ILWMIN, PTU, PQU, ZTD, & ZQD, ZUU, ZVU, ZUD, ZVD, & PMFU, PMFD, ZMFUS, ZMFDS, ZMFUQ, & ZMFDQ, ZDMFUP, ZDMFDP, ZDPMEL, PLU, & PLUDE, ILAB) !---------------------------------- !* 3.0 CLOUD BASE CALCULATIONS !---------------------------------- 300 CONTINUE !* (A) DETERMINE CLOUD BASE VALUES IN 'CUBASE' ! ------------------------------------------- CALL CUBASE & (KLON, KLEV, KLEVP1, KLEVM1, ZTENH, & ZQENH, ZGEOH, PAPH, PTU, PQU, & PLU, PUEN, PVEN, ZUU, ZVU, & LDCUM, KCBOT, ILAB) !* (B) DETERMINE TOTAL MOISTURE CONVERGENCE AND !* THEN DECIDE ON TYPE OF CUMULUS CONVECTION ! ----------------------------------------- JK=1 DO 310 JL=1,KLON ZDQCV(JL) =PQTE(JL,JK)*(PAPH(JL,JK+1)-PAPH(JL,JK)) ZDQPBL(JL)=0.0 IDTOP(JL)=0 310 CONTINUE DO 320 JK=2,KLEV DO 315 JL=1,KLON ZDQCV(JL)=ZDQCV(JL)+PQTE(JL,JK)*(PAPH(JL,JK+1)-PAPH(JL,JK)) IF(JK.GE.KCBOT(JL)) ZDQPBL(JL)=ZDQPBL(JL)+PQTE(JL,JK) & *(PAPH(JL,JK+1)-PAPH(JL,JK)) 315 CONTINUE 320 CONTINUE if(cutrigger .eq. 1) then DO JL=1,KLON KTYPE(JL)=0 IF(ZDQCV(JL).GT.MAX(0.,1.1*PQHFL(JL)*G)) THEN KTYPE(JL)=1 ELSE KTYPE(JL)=2 ENDIF END DO else if(cutrigger .eq. 2) then CALL CUTYPE & ( KLON, KLEV, KLEVP1, KLEVM1, & ZTENH, ZQENH, ZQSENH, ZGEOH, PAPH, & RHO, PHHFL, PQHFL, KTYPE, lndj ) end if !* (C) DETERMINE MOISTURE SUPPLY FOR BOUNDARY LAYER !* AND DETERMINE CLOUD BASE MASSFLUX IGNORING !* THE EFFECTS OF DOWNDRAFTS AT THIS STAGE ! ------------------------------------------ ! do jl=1,klon ! if(ktype(jl) .ge. 1 ) then ! write(6,*)"ktype=", KTYPE(jl) ! end if ! end do DO 340 JL=1,KLON IKB=KCBOT(JL) ZQUMQE=PQU(JL,IKB)+PLU(JL,IKB)-ZQENH(JL,IKB) ZDQMIN=MAX(0.01*ZQENH(JL,IKB),1.E-10) IF(ZDQPBL(JL).GT.0..AND.ZQUMQE.GT.ZDQMIN.AND.LDCUM(JL)) THEN ZMFUB(JL)=ZDQPBL(JL)/(G*MAX(ZQUMQE,ZDQMIN)) ELSE ZMFUB(JL)=0.01 LDCUM(JL)=.FALSE. ENDIF ZMFMAX=(PAPH(JL,IKB)-PAPH(JL,IKB-1))*ZCONS2 ZMFUB(JL)=MIN(ZMFUB(JL),ZMFMAX) !------------------------------------------------------ !* 4.0 DETERMINE CLOUD ASCENT FOR ENTRAINING PLUME !------------------------------------------------------ 400 CONTINUE !* (A) ESTIMATE CLOUD HEIGHT FOR ENTRAINMENT/DETRAINMENT !* CALCULATIONS IN CUASC (MAX.POSSIBLE CLOUD HEIGHT !* FOR NON-ENTRAINING PLUME, FOLLOWING A.-S.,1974) ! ------------------------------------------------------------- IKB=KCBOT(JL) ZHCBASE(JL)=CPD*PTU(JL,IKB)+ZGEOH(JL,IKB)+ALV*PQU(JL,IKB) ICTOP0(JL)=KCBOT(JL)-1 340 CONTINUE ZALVDCP=ALV/CPD ZQALV=1./ALV DO 420 JK=KLEVM1,3,-1 DO 420 JL=1,KLON ZHSAT=CPD*ZTENH(JL,JK)+ZGEOH(JL,JK)+ALV*ZQSENH(JL,JK) ZGAM=C5LES*ZALVDCP*ZQSENH(JL,JK)/ & ((1.-VTMPC1*ZQSENH(JL,JK))*(ZTENH(JL,JK)-C4LES)**2) ZZZ=CPD*ZTENH(JL,JK)*0.608 ZHHAT=ZHSAT-(ZZZ+ZGAM*ZZZ)/(1.+ZGAM*ZZZ*ZQALV)* & MAX(ZQSENH(JL,JK)-ZQENH(JL,JK),0.) ZHHATT(JL,JK)=ZHHAT IF(JK.LT.ICTOP0(JL).AND.ZHCBASE(JL).GT.ZHHAT) ICTOP0(JL)=JK 420 CONTINUE DO 430 JL=1,KLON JK=KCBOT(JL) ZHSAT=CPD*ZTENH(JL,JK)+ZGEOH(JL,JK)+ALV*ZQSENH(JL,JK) ZGAM=C5LES*ZALVDCP*ZQSENH(JL,JK)/ & ((1.-VTMPC1*ZQSENH(JL,JK))*(ZTENH(JL,JK)-C4LES)**2) ZZZ=CPD*ZTENH(JL,JK)*0.608 ZHHAT=ZHSAT-(ZZZ+ZGAM*ZZZ)/(1.+ZGAM*ZZZ*ZQALV)* & MAX(ZQSENH(JL,JK)-ZQENH(JL,JK),0.) ZHHATT(JL,JK)=ZHHAT 430 CONTINUE ! ! Find lowest possible org. detrainment level ! DO 440 JL = 1, KLON ZHMIN(JL) = 0. IF( LDCUM(JL).AND.KTYPE(JL).EQ.1 ) THEN IHMIN(JL) = KCBOT(JL) ELSE IHMIN(JL) = -1 END IF 440 CONTINUE ! ZBI = 1./(25.*G) DO 450 JK = KLEV, 1, -1 DO 450 JL = 1, KLON LLO1 = LDCUM(JL).AND.KTYPE(JL).EQ.1.AND.IHMIN(JL).EQ.KCBOT(JL) IF (LLO1.AND.JK.LT.KCBOT(JL).AND.JK.GE.ICTOP0(JL)) THEN IKB = KCBOT(JL) ZRO = RD*ZTENH(JL,JK)/(G*PAPH(JL,JK)) ZDZ = (PAPH(JL,JK)-PAPH(JL,JK-1))*ZRO ZDHDZ=(CPD*(PTEN(JL,JK-1)-PTEN(JL,JK))+ALV*(PQEN(JL,JK-1)- & PQEN(JL,JK))+(PGEO(JL,JK-1)-PGEO(JL,JK)))*G/(PGEO(JL, & JK-1)-PGEO(JL,JK)) ZDEPTH = ZGEOH(JL,JK) - ZGEOH(JL,IKB) ZFAC = SQRT(1.+ZDEPTH*ZBI) ZHMIN(JL) = ZHMIN(JL) + ZDHDZ*ZFAC*ZDZ ZRH = -ALV*(ZQSENH(JL,JK)-ZQENH(JL,JK))*ZFAC IF (ZHMIN(JL).GT.ZRH) IHMIN(JL) = JK END IF 450 CONTINUE DO 460 JL = 1, KLON IF (LDCUM(JL).AND.KTYPE(JL).EQ.1) THEN IF (IHMIN(JL).LT.ICTOP0(JL)) IHMIN(JL) = ICTOP0(JL) END IF IF(KTYPE(JL).EQ.1) THEN ZENTR(JL)=ENTRPEN ELSE ZENTR(JL)=ENTRSCV ENDIF if(lndj(JL).eq.1) ZENTR(JL)=ZENTR(JL)*1.05 460 CONTINUE !* (B) DO ASCENT IN 'CUASC'IN ABSENCE OF DOWNDRAFTS !---------------------------------------------------------- CALL CUASC_NEW & (KLON, KLEV, KLEVP1, KLEVM1, ZTENH, & ZQENH, PUEN, PVEN, PTEN, PQEN, & PQSEN, PGEO, ZGEOH, PAP, PAPH, & PQTE, PVERV, ILWMIN, LDCUM, ZHCBASE, & KTYPE, ILAB, PTU, PQU, PLU, & ZUU, ZVU, PMFU, ZMFUB, ZENTR, & ZMFUS, ZMFUQ, ZMFUL, PLUDE, ZDMFUP, & KCBOT, KCTOP, ICTOP0, ICUM, ZTMST, & IHMIN, ZHHATT, ZQSENH) IF(ICUM.EQ.0) GO TO 1000 !* (C) CHECK CLOUD DEPTH AND CHANGE ENTRAINMENT RATE ACCORDINGLY ! CALCULATE PRECIPITATION RATE (FOR DOWNDRAFT CALCULATION) !------------------------------------------------------------------ DO 480 JL=1,KLON ZPBMPT=PAPH(JL,KCBOT(JL))-PAPH(JL,KCTOP(JL)) IF(LDCUM(JL)) ICTOP0(JL)=KCTOP(JL) IF(LDCUM(JL).AND.KTYPE(JL).EQ.1.AND.ZPBMPT.LT.ZDNOPRC) KTYPE(JL)=2 IF(KTYPE(JL).EQ.2) then ZENTR(JL)=ENTRSCV if(lndj(JL).eq.1) ZENTR(JL)=ZENTR(JL)*1.05 endif ZRFL(JL)=ZDMFUP(JL,1) 480 CONTINUE DO 490 JK=2,KLEV DO 490 JL=1,KLON ZRFL(JL)=ZRFL(JL)+ZDMFUP(JL,JK) 490 CONTINUE !----------------------------------------- !* 5.0 CUMULUS DOWNDRAFT CALCULATIONS !----------------------------------------- 500 CONTINUE IF(LMFDD) THEN !* (A) DETERMINE LFS IN 'CUDLFS' !-------------------------------------- CALL CUDLFS & (KLON, KLEV, KLEVP1, ZTENH, ZQENH, & PUEN, PVEN, ZGEOH, PAPH, PTU, & PQU, ZUU, ZVU, LDCUM, KCBOT, & KCTOP, ZMFUB, ZRFL, ZTD, ZQD, & ZUD, ZVD, PMFD, ZMFDS, ZMFDQ, & ZDMFDP, IDTOP, LODDRAF) !* (B) DETERMINE DOWNDRAFT T,Q AND FLUXES IN 'CUDDRAF' !------------------------------------------------------------ CALL CUDDRAF & (KLON, KLEV, KLEVP1, ZTENH, ZQENH, & PUEN, PVEN, ZGEOH, PAPH, ZRFL, & LODDRAF, ZTD, ZQD, ZUD, ZVD, & PMFD, ZMFDS, ZMFDQ, ZDMFDP) !* (C) RECALCULATE CONVECTIVE FLUXES DUE TO EFFECT OF ! DOWNDRAFTS ON BOUNDARY LAYER MOISTURE BUDGET !----------------------------------------------------------- END IF ! !-- 5.1 Recalculate cloud base massflux from a cape closure ! for deep convection (ktype=1) and by PBL equilibrium ! taking downdrafts into account for shallow convection ! (ktype=2) ! implemented by Y. WANG based on ECHAM4 in Nov. 2001. ! DO 510 JL=1,KLON ZHEAT(JL)=0.0 ZCAPE(JL)=0.0 ZRELH(JL)=0.0 ZMFUB1(JL)=ZMFUB(JL) 510 CONTINUE ! DO 511 JL=1,KLON IF(LDCUM(JL).AND.KTYPE(JL).EQ.1) THEN do jk=KLEVM1,2,-1 if(abs(paph(jl,jk)*0.01 - 300) .lt. 50.) then KTOP0=MAX(jk,KCTOP(JL)) exit end if end do ! KTOP0=MAX(12,KCTOP(JL)) DO JK=2,KLEV IF(JK.LE.KCBOT(JL).AND.JK.GT.KCTOP(JL)) THEN ZRO=PAPH(JL,JK)/(RD*ZTENH(JL,JK)) ZDZ=(PAPH(JL,JK)-PAPH(JL,JK-1))/(G*ZRO) ZHEAT(JL)=ZHEAT(JL)+((PTEN(JL,JK-1)-PTEN(JL,JK) & +G*ZDZ/CPD)/ZTENH(JL,JK)+0.608*(PQEN(JL,JK-1)- & PQEN(JL,JK)))*(PMFU(JL,JK)+PMFD(JL,JK))*G/ZRO ZCAPE(JL)=ZCAPE(JL)+G*((PTU(JL,JK)*(1.+.608*PQU(JL,JK) & -PLU(JL,JK)))/(ZTENH(JL,JK)*(1.+.608*ZQENH(JL,JK))) & -1.0)*ZDZ ENDIF IF(JK.LE.KCBOT(JL).AND.JK.GT.KTOP0) THEN dept=(PAPH(JL,JK)-PAPH(JL,JK-1))/(PAPH(JL,KCBOT(JL))- & PAPH(JL,KTOP0)) ZRELH(JL)=ZRELH(JL)+dept*PQEN(JL,JK)/PQSEN(JL,JK) ENDIF ENDDO ! if(cutrigger .eq. 1 ) then IF(lndj(JL).EQ.1) then CRIRH1=CRIRH*0.8 ELSE CRIRH1=CRIRH ENDIF else CRIRH1=0. end if IF(ZRELH(JL).GE.CRIRH1 .AND. ZCAPE(JL) .GT. 100.) THEN IKB=KCBOT(JL) ZHT=ZCAPE(JL)/(ZTAU*ZHEAT(JL)) ZMFUB1(JL)=MAX(ZMFUB(JL)*ZHT,0.01) ZMFMAX=(PAPH(JL,IKB)-PAPH(JL,IKB-1))*ZCONS2 ZMFUB1(JL)=MIN(ZMFUB1(JL),ZMFMAX) ELSE ZMFUB1(JL)=0.01 ZMFUB(JL)=0.01 LDCUM(JL)=.FALSE. ENDIF ENDIF 511 CONTINUE ! !* 5.2 RECALCULATE CONVECTIVE FLUXES DUE TO EFFECT OF ! DOWNDRAFTS ON BOUNDARY LAYER MOISTURE BUDGET !-------------------------------------------------------- DO 512 JL=1,KLON IF(KTYPE(JL).NE.1) THEN IKB=KCBOT(JL) IF(PMFD(JL,IKB).LT.0.0.AND.LODDRAF(JL)) THEN ZEPS=CMFDEPS ELSE ZEPS=0. ENDIF ZQUMQE=PQU(JL,IKB)+PLU(JL,IKB)- & ZEPS*ZQD(JL,IKB)-(1.-ZEPS)*ZQENH(JL,IKB) ZDQMIN=MAX(0.01*ZQENH(JL,IKB),1.E-10) ZMFMAX=(PAPH(JL,IKB)-PAPH(JL,IKB-1))*ZCONS2 IF(ZDQPBL(JL).GT.0..AND.ZQUMQE.GT.ZDQMIN.AND.LDCUM(JL) & .AND.ZMFUB(JL).LT.ZMFMAX) THEN ZMFUB1(JL)=ZDQPBL(JL)/(G*MAX(ZQUMQE,ZDQMIN)) ELSE ZMFUB1(JL)=ZMFUB(JL) ENDIF LLO1=(KTYPE(JL).EQ.2).AND.ABS(ZMFUB1(JL) & -ZMFUB(JL)).LT.0.2*ZMFUB(JL) IF(.NOT.LLO1) ZMFUB1(JL)=ZMFUB(JL) ZMFUB1(JL)=MIN(ZMFUB1(JL),ZMFMAX) END IF 512 CONTINUE DO 530 JK=1,KLEV DO 530 JL=1,KLON IF(LDCUM(JL)) THEN ZFAC=ZMFUB1(JL)/MAX(ZMFUB(JL),1.E-10) PMFD(JL,JK)=PMFD(JL,JK)*ZFAC ZMFDS(JL,JK)=ZMFDS(JL,JK)*ZFAC ZMFDQ(JL,JK)=ZMFDQ(JL,JK)*ZFAC ZDMFDP(JL,JK)=ZDMFDP(JL,JK)*ZFAC ELSE PMFD(JL,JK)=0.0 ZMFDS(JL,JK)=0.0 ZMFDQ(JL,JK)=0.0 ZDMFDP(JL,JK)=0.0 ENDIF 530 CONTINUE DO 538 JL=1,KLON IF(LDCUM(JL)) THEN ZMFUB(JL)=ZMFUB1(JL) ELSE ZMFUB(JL)=0.0 ENDIF 538 CONTINUE ! !--------------------------------------------------------------- !* 6.0 DETERMINE FINAL CLOUD ASCENT FOR ENTRAINING PLUME !* FOR PENETRATIVE CONVECTION (TYPE=1), !* FOR SHALLOW TO MEDIUM CONVECTION (TYPE=2) !* AND FOR MID-LEVEL CONVECTION (TYPE=3). !--------------------------------------------------------------- 600 CONTINUE CALL CUASC_NEW & (KLON, KLEV, KLEVP1, KLEVM1, ZTENH, & ZQENH, PUEN, PVEN, PTEN, PQEN, & PQSEN, PGEO, ZGEOH, PAP, PAPH, & PQTE, PVERV, ILWMIN, LDCUM, ZHCBASE,& KTYPE, ILAB, PTU, PQU, PLU, & ZUU, ZVU, PMFU, ZMFUB, ZENTR, & ZMFUS, ZMFUQ, ZMFUL, PLUDE, ZDMFUP, & KCBOT, KCTOP, ICTOP0, ICUM, ZTMST, & IHMIN, ZHHATT, ZQSENH) !---------------------------------------------------------- !* 7.0 DETERMINE FINAL CONVECTIVE FLUXES IN 'CUFLX' !---------------------------------------------------------- 700 CONTINUE CALL CUFLX & (KLON, KLEV, KLEVP1, PQEN, PQSEN, & ZTENH, ZQENH, PAPH, ZGEOH, KCBOT, & KCTOP, IDTOP, KTYPE, LODDRAF, LDCUM, & PMFU, PMFD, ZMFUS, ZMFDS, ZMFUQ, & ZMFDQ, ZMFUL, PLUDE, ZDMFUP, ZDMFDP, & ZRFL, PRAIN, PTEN, ZSFL, ZDPMEL, & ITOPM2, ZTMST, sig1) !---------------------------------------------------------------- !* 8.0 UPDATE TENDENCIES FOR T AND Q IN SUBROUTINE CUDTDQ !---------------------------------------------------------------- 800 CONTINUE CALL CUDTDQ & (KLON, KLEV, KLEVP1, ITOPM2, PAPH, & LDCUM, PTEN, PTTE, PQTE, ZMFUS, & ZMFDS, ZMFUQ, ZMFDQ, ZMFUL, ZDMFUP, & ZDMFDP, ZTMST, ZDPMEL, PRAIN, ZRFL, & ZSFL, PSRAIN, PSEVAP, PSHEAT, PSMELT, & PRSFC, PSSFC, PAPRC, PAPRSM, PAPRS, & PQEN, PQSEN, PLUDE, PCTE) !---------------------------------------------------------------- !* 9.0 UPDATE TENDENCIES FOR U AND U IN SUBROUTINE CUDUDV !---------------------------------------------------------------- 900 CONTINUE IF(LMFDUDV) THEN CALL CUDUDV & (KLON, KLEV, KLEVP1, ITOPM2, KTYPE, & KCBOT, PAPH, LDCUM, PUEN, PVEN, & PVOM, PVOL, ZUU, ZUD, ZVU, & ZVD, PMFU, PMFD, PSDISS) END IF 1000 CONTINUE RETURN END SUBROUTINE CUMASTR_NEW ! !############################################################# ! ! LEVEL 3 SUBROUTINEs ! !############################################################# !********************************************** ! SUBROUTINE CUINI !********************************************** ! SUBROUTINE CUINI & 1,1 (KLON, KLEV, KLEVP1, KLEVM1, PTEN, & PQEN, PQSEN, PUEN, PVEN, PVERV, & PGEO, PAPH, PGEOH, PTENH, PQENH, & PQSENH, KLWMIN, PTU, PQU, PTD, & PQD, PUU, PVU, PUD, PVD, & PMFU, PMFD, PMFUS, PMFDS, PMFUQ, & PMFDQ, PDMFUP, PDMFDP, PDPMEL, PLU, & PLUDE, KLAB) ! M.TIEDTKE E.C.M.W.F. 12/89 !***PURPOSE ! ------- ! THIS ROUTINE INTERPOLATES LARGE-SCALE FIELDS OF T,Q ETC. ! TO HALF LEVELS (I.E. GRID FOR MASSFLUX SCHEME), ! AND INITIALIZES VALUES FOR UPDRAFTS AND DOWNDRAFTS !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM *CUMASTR*. !***METHOD. ! -------- ! FOR EXTRAPOLATION TO HALF LEVELS SEE TIEDTKE(1989) !***EXTERNALS ! --------- ! *CUADJTQ* TO SPECIFY QS AT HALF LEVELS ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER klevm1 INTEGER JK,JL,IK, ICALL REAL ZDP, ZZS REAL PTEN(KLON,KLEV), PQEN(KLON,KLEV), & PUEN(KLON,KLEV), PVEN(KLON,KLEV), & PQSEN(KLON,KLEV), PVERV(KLON,KLEV), & PGEO(KLON,KLEV), PGEOH(KLON,KLEV), & PAPH(KLON,KLEVP1), PTENH(KLON,KLEV), & PQENH(KLON,KLEV), PQSENH(KLON,KLEV) REAL PTU(KLON,KLEV), PQU(KLON,KLEV), & PTD(KLON,KLEV), PQD(KLON,KLEV), & PUU(KLON,KLEV), PUD(KLON,KLEV), & PVU(KLON,KLEV), PVD(KLON,KLEV), & PMFU(KLON,KLEV), PMFD(KLON,KLEV), & PMFUS(KLON,KLEV), PMFDS(KLON,KLEV), & PMFUQ(KLON,KLEV), PMFDQ(KLON,KLEV), & PDMFUP(KLON,KLEV), PDMFDP(KLON,KLEV), & PLU(KLON,KLEV), PLUDE(KLON,KLEV) REAL ZWMAX(KLON), ZPH(KLON), & PDPMEL(KLON,KLEV) INTEGER KLAB(KLON,KLEV), KLWMIN(KLON) LOGICAL LOFLAG(KLON) !------------------------------------------------------------ !* 1. SPECIFY LARGE SCALE PARAMETERS AT HALF LEVELS !* ADJUST TEMPERATURE FIELDS IF STATICLY UNSTABLE !* FIND LEVEL OF MAXIMUM VERTICAL VELOCITY ! ----------------------------------------------------------- 100 CONTINUE ZDP=0.5 DO 130 JK=2,KLEV DO 110 JL=1,KLON PGEOH(JL,JK)=PGEO(JL,JK)+(PGEO(JL,JK-1)-PGEO(JL,JK))*ZDP PTENH(JL,JK)=(MAX(CPD*PTEN(JL,JK-1)+PGEO(JL,JK-1), & CPD*PTEN(JL,JK)+PGEO(JL,JK))-PGEOH(JL,JK))*RCPD PQSENH(JL,JK)=PQSEN(JL,JK-1) ZPH(JL)=PAPH(JL,JK) LOFLAG(JL)=.TRUE. 110 CONTINUE IK=JK ICALL=0 CALL CUADJTQ(KLON,KLEV,IK,ZPH,PTENH,PQSENH,LOFLAG,ICALL) DO 120 JL=1,KLON PQENH(JL,JK)=MIN(PQEN(JL,JK-1),PQSEN(JL,JK-1)) & +(PQSENH(JL,JK)-PQSEN(JL,JK-1)) PQENH(JL,JK)=MAX(PQENH(JL,JK),0.) 120 CONTINUE 130 CONTINUE DO 140 JL=1,KLON PTENH(JL,KLEV)=(CPD*PTEN(JL,KLEV)+PGEO(JL,KLEV)- & PGEOH(JL,KLEV))*RCPD PQENH(JL,KLEV)=PQEN(JL,KLEV) PTENH(JL,1)=PTEN(JL,1) PQENH(JL,1)=PQEN(JL,1) PGEOH(JL,1)=PGEO(JL,1) KLWMIN(JL)=KLEV ZWMAX(JL)=0. 140 CONTINUE DO 160 JK=KLEVM1,2,-1 DO 150 JL=1,KLON ZZS=MAX(CPD*PTENH(JL,JK)+PGEOH(JL,JK), & CPD*PTENH(JL,JK+1)+PGEOH(JL,JK+1)) PTENH(JL,JK)=(ZZS-PGEOH(JL,JK))*RCPD 150 CONTINUE 160 CONTINUE DO 190 JK=KLEV,3,-1 DO 180 JL=1,KLON IF(PVERV(JL,JK).LT.ZWMAX(JL)) THEN ZWMAX(JL)=PVERV(JL,JK) KLWMIN(JL)=JK END IF 180 CONTINUE 190 CONTINUE !----------------------------------------------------------- !* 2.0 INITIALIZE VALUES FOR UPDRAFTS AND DOWNDRAFTS !----------------------------------------------------------- 200 CONTINUE DO 230 JK=1,KLEV IK=JK-1 IF(JK.EQ.1) IK=1 DO 220 JL=1,KLON PTU(JL,JK)=PTENH(JL,JK) PTD(JL,JK)=PTENH(JL,JK) PQU(JL,JK)=PQENH(JL,JK) PQD(JL,JK)=PQENH(JL,JK) PLU(JL,JK)=0. PUU(JL,JK)=PUEN(JL,IK) PUD(JL,JK)=PUEN(JL,IK) PVU(JL,JK)=PVEN(JL,IK) PVD(JL,JK)=PVEN(JL,IK) PMFU(JL,JK)=0. PMFD(JL,JK)=0. PMFUS(JL,JK)=0. PMFDS(JL,JK)=0. PMFUQ(JL,JK)=0. PMFDQ(JL,JK)=0. PDMFUP(JL,JK)=0. PDMFDP(JL,JK)=0. PDPMEL(JL,JK)=0. PLUDE(JL,JK)=0. KLAB(JL,JK)=0 220 CONTINUE 230 CONTINUE RETURN END SUBROUTINE CUINI !********************************************** ! SUBROUTINE CUBASE !********************************************** SUBROUTINE CUBASE & 1,1 (KLON, KLEV, KLEVP1, KLEVM1, PTENH, & PQENH, PGEOH, PAPH, PTU, PQU, & PLU, PUEN, PVEN, PUU, PVU, & LDCUM, KCBOT, KLAB) ! THIS ROUTINE CALCULATES CLOUD BASE VALUES (T AND Q) ! FOR CUMULUS PARAMETERIZATION ! M.TIEDTKE E.C.M.W.F. 7/86 MODIF. 12/89 !***PURPOSE. ! -------- ! TO PRODUCE CLOUD BASE VALUES FOR CU-PARAMETRIZATION !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM *CUMASTR*. ! INPUT ARE ENVIRONM. VALUES OF T,Q,P,PHI AT HALF LEVELS. ! IT RETURNS CLOUD BASE VALUES AND FLAGS AS FOLLOWS; ! KLAB=1 FOR SUBCLOUD LEVELS ! KLAB=2 FOR CONDENSATION LEVEL !***METHOD. ! -------- ! LIFT SURFACE AIR DRY-ADIABATICALLY TO CLOUD BASE ! (NON ENTRAINING PLUME,I.E.CONSTANT MASSFLUX) !***EXTERNALS ! --------- ! *CUADJTQ* FOR ADJUSTING T AND Q DUE TO CONDENSATION IN ASCENT ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER klevm1 INTEGER JL,JK,IS,IK,ICALL,IKB REAL ZBUO,ZZ REAL PTENH(KLON,KLEV), PQENH(KLON,KLEV), & PGEOH(KLON,KLEV), PAPH(KLON,KLEVP1) REAL PTU(KLON,KLEV), PQU(KLON,KLEV), & PLU(KLON,KLEV) REAL PUEN(KLON,KLEV), PVEN(KLON,KLEV), & PUU(KLON,KLEV), PVU(KLON,KLEV) REAL ZQOLD(KLON,KLEV), ZPH(KLON) INTEGER KLAB(KLON,KLEV), KCBOT(KLON) LOGICAL LDCUM(KLON), LOFLAG(KLON) !***INPUT VARIABLES: ! PTENH [ZTENH] - Environment Temperature on half levels. (CUINI) ! PQENH [ZQENH] - Env. specific humidity on half levels. (CUINI) ! PGEOH [ZGEOH] - Geopotential on half levels, (MSSFLX) ! PAPH - Pressure of half levels. (MSSFLX) !***VARIABLES MODIFIED BY CUBASE: ! LDCUM - Logical denoting profiles. (CUBASE) ! KTYPE - Convection type - 1: Penetrative (CUMASTR) ! 2: Stratocumulus (CUMASTR) ! 3: Mid-level (CUASC) ! PTU - Cloud Temperature. ! PQU - Cloud specific Humidity. ! PLU - Cloud Liquid Water (Moisture condensed out) ! KCBOT - Cloud Base Level. (CUBASE) ! KLAB [ILAB] - Level Label - 1: Sub-cloud layer (CUBASE) !------------------------------------------------ ! 1. INITIALIZE VALUES AT LIFTING LEVEL !------------------------------------------------ 100 CONTINUE DO 110 JL=1,KLON KLAB(JL,KLEV)=1 KCBOT(JL)=KLEVM1 LDCUM(JL)=.FALSE. PUU(JL,KLEV)=PUEN(JL,KLEV)*(PAPH(JL,KLEVP1)-PAPH(JL,KLEV)) PVU(JL,KLEV)=PVEN(JL,KLEV)*(PAPH(JL,KLEVP1)-PAPH(JL,KLEV)) 110 CONTINUE !------------------------------------------------------- ! 2.0 DO ASCENT IN SUBCLOUD LAYER, ! CHECK FOR EXISTENCE OF CONDENSATION LEVEL, ! ADJUST T,Q AND L ACCORDINGLY IN *CUADJTQ*, ! CHECK FOR BUOYANCY AND SET FLAGS !------------------------------------------------------- DO 200 JK=1,KLEV DO 200 JL=1,KLON ZQOLD(JL,JK)=0.0 200 CONTINUE DO 290 JK=KLEVM1,2,-1 IS=0 DO 210 JL=1,KLON IF(KLAB(JL,JK+1).EQ.1) THEN IS=IS+1 LOFLAG(JL)=.TRUE. ELSE LOFLAG(JL)=.FALSE. ENDIF ZPH(JL)=PAPH(JL,JK) 210 CONTINUE IF(IS.EQ.0) GO TO 290 DO 220 JL=1,KLON IF(LOFLAG(JL)) THEN PQU(JL,JK)=PQU(JL,JK+1) PTU(JL,JK)=(CPD*PTU(JL,JK+1)+PGEOH(JL,JK+1) & -PGEOH(JL,JK))*RCPD ZBUO=PTU(JL,JK)*(1.+VTMPC1*PQU(JL,JK))- & PTENH(JL,JK)*(1.+VTMPC1*PQENH(JL,JK))+ZBUO0 IF(ZBUO.GT.0.) KLAB(JL,JK)=1 ZQOLD(JL,JK)=PQU(JL,JK) END IF 220 CONTINUE IK=JK ICALL=1 CALL CUADJTQ(KLON,KLEV,IK,ZPH,PTU,PQU,LOFLAG,ICALL) DO 240 JL=1,KLON IF(LOFLAG(JL).AND.PQU(JL,JK).NE.ZQOLD(JL,JK)) THEN KLAB(JL,JK)=2 PLU(JL,JK)=PLU(JL,JK)+ZQOLD(JL,JK)-PQU(JL,JK) ZBUO=PTU(JL,JK)*(1.+VTMPC1*PQU(JL,JK))- & PTENH(JL,JK)*(1.+VTMPC1*PQENH(JL,JK))+ZBUO0 IF(ZBUO.GT.0.) THEN KCBOT(JL)=JK LDCUM(JL)=.TRUE. END IF END IF 240 CONTINUE ! CALCULATE AVERAGES OF U AND V FOR SUBCLOUD ARA,. ! THE VALUES WILL BE USED TO DEFINE CLOUD BASE VALUES. IF(LMFDUDV) THEN DO 250 JL=1,KLON IF(JK.GE.KCBOT(JL)) THEN PUU(JL,KLEV)=PUU(JL,KLEV)+ & PUEN(JL,JK)*(PAPH(JL,JK+1)-PAPH(JL,JK)) PVU(JL,KLEV)=PVU(JL,KLEV)+ & PVEN(JL,JK)*(PAPH(JL,JK+1)-PAPH(JL,JK)) END IF 250 CONTINUE END IF 290 CONTINUE IF(LMFDUDV) THEN DO 310 JL=1,KLON IF(LDCUM(JL)) THEN IKB=KCBOT(JL) ZZ=1./(PAPH(JL,KLEVP1)-PAPH(JL,IKB)) PUU(JL,KLEV)=PUU(JL,KLEV)*ZZ PVU(JL,KLEV)=PVU(JL,KLEV)*ZZ ELSE PUU(JL,KLEV)=PUEN(JL,KLEVM1) PVU(JL,KLEV)=PVEN(JL,KLEVM1) END IF 310 CONTINUE END IF RETURN END SUBROUTINE CUBASE !********************************************** ! SUBROUTINE CUTYPE !********************************************** SUBROUTINE CUTYPE & 1,2 ( KLON, KLEV, KLEVP1, KLEVM1,& PTENH, PQENH, PQSENH, PGEOH, PAPH,& RHO, HFX, QFX, KTYPE, lndj ) ! THIS ROUTINE CALCULATES CLOUD BASE and TOP ! AND RETURN CLOUD TYPES ! ZHANG & WANG IPRC 12/2010 !***PURPOSE. ! -------- ! TO PRODUCE CLOUD TYPE for CU-PARAMETERIZATIONS !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM *CUMASTR*. ! INPUT ARE ENVIRONM. VALUES OF T,Q,P,PHI AT HALF LEVELS. ! IT RETURNS CLOUD TYPES AS FOLLOWS; ! KTYPE=1 FOR deep cumulus ! KTYPE=2 FOR shallow cumulus !***METHOD. ! -------- ! based on a simplified updraught equation ! partial(Hup)/partial(z)=eta(H - Hup) ! eta is the entrainment rate for test parcel ! H stands for dry static energy or the total water specific humidity ! references: Christian Jakob, 2003: A new subcloud model for mass-flux convection schemes ! influence on triggering, updraft properties, and model climate, Mon.Wea.Rev. ! 131, 2765-2778 ! and ! IFS Documentation - Cy33r1 ! !***EXTERNALS ! --------- ! *CUADJTQ* FOR ADJUSTING T AND Q DUE TO CONDENSATION IN ASCENT ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER klevm1 INTEGER JL,JK,IS,IK,ICALL,IKB,LEVELS REAL PTENH(KLON,KLEV), PQENH(KLON,KLEV), & PQSENH(KLON,KLEV),& PGEOH(KLON,KLEV), PAPH(KLON,KLEVP1) REAL ZRELH(KLON) REAL QFX(KLON),RHO(KLON),HFX(KLON) REAL ZQOLD(KLON,KLEV), ZPH(KLON) INTEGER KCTOP(KLON),KCBOT(KLON) INTEGER KTYPE(KLON),LCLFLAG(KLON) LOGICAL TOPFLAG(KLON),DEEPFLAG(KLON),MYFLAG(KLON) REAL part1(klon), part2(klon), root(klon) REAL conw(klon),deltT(klon),deltQ(klon) REAL eta(klon),dz(klon),coef(klon) REAL dhen(KLON,KLEV), dh(KLON,KLEV),qh(KLON,KLEV) REAL Tup(KLON,KLEV),Qup(KLON,KLEV),ql(KLON,KLEV) REAL ww(KLON,KLEV),Kup(KLON,KLEV) REAL Vtup(KLON,KLEV),Vten(KLON,KLEV),buoy(KLON,KLEV) INTEGER lndj(KLON) REAL CRIRH1 !***INPUT VARIABLES: ! PTENH [ZTENH] - Environment Temperature on half levels. (CUINI) ! PQENH [ZQENH] - Env. specific humidity on half levels. (CUINI) ! PGEOH [ZGEOH] - Geopotential on half levels, (MSSFLX) ! PAPH - Pressure of half levels. (MSSFLX) ! RHO - Density of the lowest Model level ! QFX - net upward moisture flux at the surface (kg/m^2/s) ! HFX - net upward heat flux at the surface (W/m^2) !***VARIABLES OUTPUT BY CUTYPE: ! KTYPE - Convection type - 1: Penetrative (CUMASTR) ! 2: Stratocumulus (CUMASTR) ! 3: Mid-level (CUASC) !-------------------------------------------------------------- DO JL=1,KLON KCBOT(JL)=KLEVM1 KCTOP(JL)=KLEVM1 KTYPE(JL)=0 END DO !----------------------------------------------------------- ! let's do test,and check the shallow convection first ! the first level is JK+1 ! define deltaT and deltaQ !----------------------------------------------------------- DO JK=1,KLEV DO JL=1,KLON ZQOLD(JL,JK)=0.0 ql(jl,jk)=0.0 ! parcel liquid water Tup(jl,jk)=0.0 ! parcel temperature Qup(jl,jk)=0.0 ! parcel specific humidity dh(jl,jk)=0.0 ! parcel dry static energy qh(jl,jk)=0.0 ! parcel total water specific humidity ww(jl,jk)=0.0 ! parcel vertical speed (m/s) dhen(jl,jk)=0.0 ! environment dry static energy Kup(jl,jk)=0.0 ! updraught kinetic energy for parcel Vtup(jl,jk)=0.0 ! parcel virtual temperature considering water-loading Vten(jl,jk)=0.0 ! environment virtual temperature buoy(jl,jk)=0.0 ! parcel buoyancy END DO END DO do jl=1,klon lclflag(jl) = 0 ! flag for the condensation level conw(jl) = 0.0 ! convective-scale velocity,also used for the vertical speed at the first level myflag(jl) = .true. ! just as input for cuadjqt subroutine topflag(jl) = .false.! flag for whether the cloud top is found end do ! check the levels from lowest level to second top level do JK=KLEVM1,2,-1 DO JL=1,KLON ZPH(JL)=PAPH(JL,JK) END DO ! define the variables at the first level if(jk .eq. KLEVM1) then do jl=1,klon part1(jl) = 1.5*0.4*pgeoh(jl,jk+1)/(rho(jl)*ptenh(jl,jk+1)) part2(jl) = hfx(jl)/cpd+0.61*ptenh(jl,jk+1)*qfx(jl) root(jl) = 0.001-part1(jl)*part2(jl) if(root(jl) .gt. 0) then conw(jl) = 1.2*(root(jl))**(1.0/3.0) else conw(jl) = -1.2*(-root(jl))**(1.0/3.0) end if deltT(jl) = -1.5*hfx(jl)/(rho(jl)*cpd*conw(jl)) deltQ(jl) = -1.5*qfx(jl)/(rho(jl)*conw(jl)) Tup(jl,jk+1) = ptenh(jl,jk+1) + deltT(jl) Qup(jl,jk+1) = pqenh(jl,jk+1) + deltQ(jl) ql(jl,jk+1) = 0. dh(jl,jk+1) = pgeoh(jl,jk+1) + Tup(jl,jk+1)*cpd qh(jl,jk+1) = pqenh(jl,jk+1) + deltQ(jl) + ql(jl,jk+1) ww(jl,jk+1) = conw(jl) end do end if ! the next levels, we use the variables at the first level as initial values do jl=1,klon if(.not. topflag(jl)) then eta(jl) = 0.5*(0.55/(pgeoh(jl,jk)*zrg)+1.0e-3) dz(jl) = (pgeoh(jl,jk)-pgeoh(jl,jk+1))*zrg coef(jl)= eta(jl)*dz(jl) dhen(jl,jk) = pgeoh(jl,jk) + cpd*ptenh(jl,jk) dh(jl,jk) = (coef(jl)*dhen(jl,jk) + dh(jl,jk+1))/(1+coef(jl)) qh(jl,jk) = (coef(jl)*pqenh(jl,jk)+ qh(jl,jk+1))/(1+coef(jl)) Tup(jl,jk) = (dh(jl,jk)-pgeoh(jl,jk))*RCPD Qup(jl,jk) = qh(jl,jk) - ql(jl,jk+1) zqold(jl,jk) = Qup(jl,jk) end if end do ! check if the parcel is saturated ik=jk icall=1 call CUADJTQ(klon,klev,ik,zph,Tup,Qup,myflag,icall) do jl=1,klon if( .not. topflag(jl) .and. zqold(jl,jk) .ne. Qup(jl,jk) ) then lclflag(jl) = lclflag(jl) + 1 ql(jl,jk) = ql(jl,jk+1) + zqold(jl,jk) - Qup(jl,jk) dh(jl,jk) = pgeoh(jl,jk) + cpd*Tup(jl,jk) end if end do ! compute the updraft speed do jl=1,klon if(.not. topflag(jl))then Kup(jl,jk+1) = 0.5*ww(jl,jk+1)**2 Vtup(jl,jk) = Tup(jl,jk)*(1.+VTMPC1*Qup(jl,jk)-ql(jl,jk)) Vten(jl,jk) = ptenh(jl,jk)*(1.+VTMPC1*pqenh(jl,jk)) buoy(jl,jk) = (Vtup(jl,jk) - Vten(jl,jk))/Vten(jl,jk)*g Kup(jl,jk) = (Kup(jl,jk+1) + 0.333*dz(jl)*buoy(jl,jk))/ & (1+2*2*eta(jl)*dz(jl)) if(Kup(jl,jk) .gt. 0 ) then ww(jl,jk) = sqrt(2*Kup(jl,jk)) if(lclflag(jl) .eq. 1 ) kcbot(jl) = jk if(jk .eq. 2) then kctop(jl) = jk topflag(jl)= .true. end if else ww(jl,jk) = 0 kctop(jl) = jk + 1 topflag(jl) = .true. end if end if end do end do ! end all the levels do jl=1,klon if(paph(jl,kcbot(jl)) - paph(jl,kctop(jl)) .lt. ZDNOPRC .and. & paph(jl,kcbot(jl)) - paph(jl,kctop(jl)) .gt. 0 & .and. lclflag(jl) .gt. 0) then ktype(jl) = 2 end if end do !----------------------------------------------------------- ! Next, let's check the deep convection ! the first level is JK ! define deltaT and deltaQ !---------------------------------------------------------- ! we check the parcel starting level by level (from the second lowest level to the next 12th level, ! usually, the 12th level around 700 hPa for common eta levels) do levels=KLEVM1-1,KLEVM1-12,-1 DO JK=1,KLEV DO JL=1,KLON ZQOLD(JL,JK)=0.0 ql(jl,jk)=0.0 ! parcel liquid water Tup(jl,jk)=0.0 ! parcel temperature Qup(jl,jk)=0.0 ! parcel specific humidity dh(jl,jk)=0.0 ! parcel dry static energy qh(jl,jk)=0.0 ! parcel total water specific humidity ww(jl,jk)=0.0 ! parcel vertical speed (m/s) dhen(jl,jk)=0.0 ! environment dry static energy Kup(jl,jk)=0.0 ! updraught kinetic energy for parcel Vtup(jl,jk)=0.0 ! parcel virtual temperature considering water-loading Vten(jl,jk)=0.0 ! environment virtual temperature buoy(jl,jk)=0.0 ! parcel buoyancy END DO END DO do jl=1,klon lclflag(jl) = 0 ! flag for the condensation level kctop(jl) = levels kcbot(jl) = levels myflag(jl) = .true. ! just as input for cuadjqt subroutine topflag(jl) = .false.! flag for whether the cloud top is found end do ! check the levels from lowest level to second top level do JK=levels,2,-1 DO JL=1,KLON ZPH(JL)=PAPH(JL,JK) END DO ! define the variables at the first level if(jk .eq. levels) then do jl=1,klon deltT(jl) = 0.2 deltQ(jl) = 1.0e-4 if(paph(jl,KLEVM1-1)-paph(jl,jk) .le. 6.e3) then ql(jl,jk+1) = 0. Tup(jl,jk+1) = 0.25*(ptenh(jl,jk+1)+ptenh(jl,jk)+ & ptenh(jl,jk-1)+ptenh(jl,jk-2)) + & deltT(jl) dh(jl,jk+1) = 0.25*(pgeoh(jl,jk+1)+pgeoh(jl,jk)+ & pgeoh(jl,jk-1)+pgeoh(jl,jk-2)) + & Tup(jl,jk+1)*cpd qh(jl,jk+1) = 0.25*(pqenh(jl,jk+1)+pqenh(jl,jk)+ & pqenh(jl,jk-1)+pqenh(jl,jk-2))+ & deltQ(jl) + ql(jl,jk+1) Qup(jl,jk+1) = qh(jl,jk+1) - ql(jl,jk+1) else ql(jl,jk+1) = 0. Tup(jl,jk+1) = ptenh(jl,jk+1) + deltT(jl) dh(jl,jk+1) = pgeoh(jl,jk+1) + Tup(jl,jk+1)*cpd qh(jl,jk+1) = pqenh(jl,jk+1) + deltQ(jl) Qup(jl,jk+1) = qh(jl,jk+1) - ql(jl,jk+1) end if ww(jl,jk+1) = 1.0 end do end if ! the next levels, we use the variables at the first level as initial values do jl=1,klon if(.not. topflag(jl)) then eta(jl) = 1.1e-4 dz(jl) = (pgeoh(jl,jk)-pgeoh(jl,jk+1))*zrg coef(jl)= eta(jl)*dz(jl) dhen(jl,jk) = pgeoh(jl,jk) + cpd*ptenh(jl,jk) dh(jl,jk) = (coef(jl)*dhen(jl,jk) + dh(jl,jk+1))/(1+coef(jl)) qh(jl,jk) = (coef(jl)*pqenh(jl,jk)+ qh(jl,jk+1))/(1+coef(jl)) Tup(jl,jk) = (dh(jl,jk)-pgeoh(jl,jk))*RCPD Qup(jl,jk) = qh(jl,jk) - ql(jl,jk+1) zqold(jl,jk) = Qup(jl,jk) end if end do ! check if the parcel is saturated ik=jk icall=1 call CUADJTQ(klon,klev,ik,zph,Tup,Qup,myflag,icall) do jl=1,klon if( .not. topflag(jl) .and. zqold(jl,jk) .ne. Qup(jl,jk) ) then lclflag(jl) = lclflag(jl) + 1 ql(jl,jk) = ql(jl,jk+1) + zqold(jl,jk) - Qup(jl,jk) dh(jl,jk) = pgeoh(jl,jk) + cpd*Tup(jl,jk) end if end do ! compute the updraft speed do jl=1,klon if(.not. topflag(jl))then Kup(jl,jk+1) = 0.5*ww(jl,jk+1)**2 Vtup(jl,jk) = Tup(jl,jk)*(1.+VTMPC1*Qup(jl,jk)-ql(jl,jk)) Vten(jl,jk) = ptenh(jl,jk)*(1.+VTMPC1*pqenh(jl,jk)) buoy(jl,jk) = (Vtup(jl,jk) - Vten(jl,jk))/Vten(jl,jk)*g Kup(jl,jk) = (Kup(jl,jk+1) + 0.333*dz(jl)*buoy(jl,jk))/ & (1+2*2*eta(jl)*dz(jl)) if(Kup(jl,jk) .gt. 0 ) then ww(jl,jk) = sqrt(2*Kup(jl,jk)) if(lclflag(jl) .eq. 1 ) kcbot(jl) = jk if(jk .eq. 2) then kctop(jl) = jk topflag(jl)= .true. end if else ww(jl,jk) = 0 kctop(jl) = jk + 1 topflag(jl) = .true. end if end if end do end do ! end all the levels do jl = 1, klon if(paph(jl,kcbot(jl)) - paph(jl,kctop(jl)) .gt. ZDNOPRC .and. & lclflag(jl) .gt. 0 ) then ZRELH(JL) = 0. do jk=kcbot(jl),kctop(jl),-1 ZRELH(JL)=ZRELH(JL)+ PQENH(JL,JK)/PQSENH(JL,JK) end do ZRELH(JL) = ZRELH(JL)/(kcbot(jl)-kctop(jl)+1) if(lndj(JL) .eq. 1) then CRIRH1 = CRIRH*0.8 else CRIRH1 = CRIRH end if if(ZRELH(JL) .ge. CRIRH1) ktype(jl) = 1 end if end do end do ! end all cycles END SUBROUTINE CUTYPE ! !********************************************** ! SUBROUTINE CUASC_NEW !********************************************** SUBROUTINE CUASC_NEW & 2,7 (KLON, KLEV, KLEVP1, KLEVM1, PTENH, & PQENH, PUEN, PVEN, PTEN, PQEN, & PQSEN, PGEO, PGEOH, PAP, PAPH, & PQTE, PVERV, KLWMIN, LDCUM, PHCBASE,& KTYPE, KLAB, PTU, PQU, PLU, & PUU, PVU, PMFU, PMFUB, PENTR, & PMFUS, PMFUQ, PMFUL, PLUDE, PDMFUP, & KCBOT, KCTOP, KCTOP0, KCUM, ZTMST, & KHMIN, PHHATT, PQSENH) ! THIS ROUTINE DOES THE CALCULATIONS FOR CLOUD ASCENTS ! FOR CUMULUS PARAMETERIZATION ! M.TIEDTKE E.C.M.W.F. 7/86 MODIF. 12/89 ! Y.WANG IPRC 11/01 MODIF. !***PURPOSE. ! -------- ! TO PRODUCE CLOUD ASCENTS FOR CU-PARAMETRIZATION ! (VERTICAL PROFILES OF T,Q,L,U AND V AND CORRESPONDING ! FLUXES AS WELL AS PRECIPITATION RATES) !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM *CUMASTR*. !***METHOD. ! -------- ! LIFT SURFACE AIR DRY-ADIABATICALLY TO CLOUD BASE ! AND THEN CALCULATE MOIST ASCENT FOR ! ENTRAINING/DETRAINING PLUME. ! ENTRAINMENT AND DETRAINMENT RATES DIFFER FOR ! SHALLOW AND DEEP CUMULUS CONVECTION. ! IN CASE THERE IS NO PENETRATIVE OR SHALLOW CONVECTION ! CHECK FOR POSSIBILITY OF MID LEVEL CONVECTION ! (CLOUD BASE VALUES CALCULATED IN *CUBASMC*) !***EXTERNALS ! --------- ! *CUADJTQ* ADJUST T AND Q DUE TO CONDENSATION IN ASCENT ! *CUENTR_NEW* CALCULATE ENTRAINMENT/DETRAINMENT RATES ! *CUBASMC* CALCULATE CLOUD BASE VALUES FOR MIDLEVEL CONVECTION !***REFERENCE ! --------- ! (TIEDTKE,1989) !***INPUT VARIABLES: ! PTENH [ZTENH] - Environ Temperature on half levels. (CUINI) ! PQENH [ZQENH] - Env. specific humidity on half levels. (CUINI) ! PUEN - Environment wind u-component. (MSSFLX) ! PVEN - Environment wind v-component. (MSSFLX) ! PTEN - Environment Temperature. (MSSFLX) ! PQEN - Environment Specific Humidity. (MSSFLX) ! PQSEN - Environment Saturation Specific Humidity. (MSSFLX) ! PGEO - Geopotential. (MSSFLX) ! PGEOH [ZGEOH] - Geopotential on half levels, (MSSFLX) ! PAP - Pressure in Pa. (MSSFLX) ! PAPH - Pressure of half levels. (MSSFLX) ! PQTE - Moisture convergence (Delta q/Delta t). (MSSFLX) ! PVERV - Large Scale Vertical Velocity (Omega). (MSSFLX) ! KLWMIN [ILWMIN] - Level of Minimum Omega. (CUINI) ! KLAB [ILAB] - Level Label - 1: Sub-cloud layer. ! 2: Condensation Level (Cloud Base) ! PMFUB [ZMFUB] - Updraft Mass Flux at Cloud Base. (CUMASTR) !***VARIABLES MODIFIED BY CUASC: ! LDCUM - Logical denoting profiles. (CUBASE) ! KTYPE - Convection type - 1: Penetrative (CUMASTR) ! 2: Stratocumulus (CUMASTR) ! 3: Mid-level (CUASC) ! PTU - Cloud Temperature. ! PQU - Cloud specific Humidity. ! PLU - Cloud Liquid Water (Moisture condensed out) ! PUU [ZUU] - Cloud Momentum U-Component. ! PVU [ZVU] - Cloud Momentum V-Component. ! PMFU - Updraft Mass Flux. ! PENTR [ZENTR] - Entrainment Rate. (CUMASTR ) (CUBASMC) ! PMFUS [ZMFUS] - Updraft Flux of Dry Static Energy. (CUBASMC) ! PMFUQ [ZMFUQ] - Updraft Flux of Specific Humidity. ! PMFUL [ZMFUL] - Updraft Flux of Cloud Liquid Water. ! PLUDE - Liquid Water Returned to Environment by Detrainment. ! PDMFUP [ZMFUP] - FLUX DIFFERENCE OF PRECIP. IN UPDRAFTS ! KCBOT - Cloud Base Level. (CUBASE) ! KCTOP - ! KCTOP0 [ICTOP0] - Estimate of Cloud Top. (CUMASTR) ! KCUM [ICUM] - !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER klevm1,kcum REAL ZTMST,ZCONS2,ZDZ,ZDRODZ INTEGER JL,JK,IKB,IK,IS,IKT,ICALL REAL ZMFMAX,ZFAC,ZMFTEST,ZDPRHO,ZMSE,ZNEVN,ZODMAX REAL ZQEEN,ZSEEN,ZSCDE,ZGA,ZDT,ZSCOD REAL ZQUDE,ZQCOD, ZMFUSK, ZMFUQK,ZMFULK REAL ZBUO, ZPRCON, ZLNEW, ZZ, ZDMFEU, ZDMFDU REAL ZBUOYZ,ZZDMF REAL PTENH(KLON,KLEV), PQENH(KLON,KLEV), & PUEN(KLON,KLEV), PVEN(KLON,KLEV), & PTEN(KLON,KLEV), PQEN(KLON,KLEV), & PGEO(KLON,KLEV), PGEOH(KLON,KLEV), & PAP(KLON,KLEV), PAPH(KLON,KLEVP1), & PQSEN(KLON,KLEV), PQTE(KLON,KLEV), & PVERV(KLON,KLEV), PQSENH(KLON,KLEV) REAL PTU(KLON,KLEV), PQU(KLON,KLEV), & PUU(KLON,KLEV), PVU(KLON,KLEV), & PMFU(KLON,KLEV), ZPH(KLON), & PMFUB(KLON), PENTR(KLON), & PMFUS(KLON,KLEV), PMFUQ(KLON,KLEV), & PLU(KLON,KLEV), PLUDE(KLON,KLEV), & PMFUL(KLON,KLEV), PDMFUP(KLON,KLEV) REAL ZDMFEN(KLON), ZDMFDE(KLON), & ZMFUU(KLON), ZMFUV(KLON), & ZPBASE(KLON), ZQOLD(KLON), & PHHATT(KLON,KLEV), ZODETR(KLON,KLEV), & ZOENTR(KLON,KLEV), ZBUOY(KLON) REAL PHCBASE(KLON) INTEGER KLWMIN(KLON), KTYPE(KLON), & KLAB(KLON,KLEV), KCBOT(KLON), & KCTOP(KLON), KCTOP0(KLON), & KHMIN(KLON) LOGICAL LDCUM(KLON), LOFLAG(KLON) integer leveltop,levelbot real tt(klon),ttb(klon) real zqsat(klon), zqsatb(klon) real fscale(klon) !-------------------------------- !* 1. SPECIFY PARAMETERS !-------------------------------- 100 CONTINUE ZCONS2=1./(G*ZTMST) !--------------------------------- ! 2. SET DEFAULT VALUES !--------------------------------- 200 CONTINUE DO 210 JL=1,KLON ZMFUU(JL)=0. ZMFUV(JL)=0. ZBUOY(JL)=0. IF(.NOT.LDCUM(JL)) KTYPE(JL)=0 210 CONTINUE DO 230 JK=1,KLEV DO 230 JL=1,KLON PLU(JL,JK)=0. PMFU(JL,JK)=0. PMFUS(JL,JK)=0. PMFUQ(JL,JK)=0. PMFUL(JL,JK)=0. PLUDE(JL,JK)=0. PDMFUP(JL,JK)=0. ZOENTR(JL,JK)=0. ZODETR(JL,JK)=0. IF(.NOT.LDCUM(JL).OR.KTYPE(JL).EQ.3) KLAB(JL,JK)=0 IF(.NOT.LDCUM(JL).AND.PAPH(JL,JK).LT.4.E4) KCTOP0(JL)=JK 230 CONTINUE !------------------------------------------------ ! 3.0 INITIALIZE VALUES AT LIFTING LEVEL !------------------------------------------------ DO 310 JL=1,KLON KCTOP(JL)=KLEVM1 IF(.NOT.LDCUM(JL)) THEN KCBOT(JL)=KLEVM1 PMFUB(JL)=0. PQU(JL,KLEV)=0. END IF PMFU(JL,KLEV)=PMFUB(JL) PMFUS(JL,KLEV)=PMFUB(JL)*(CPD*PTU(JL,KLEV)+PGEOH(JL,KLEV)) PMFUQ(JL,KLEV)=PMFUB(JL)*PQU(JL,KLEV) IF(LMFDUDV) THEN ZMFUU(JL)=PMFUB(JL)*PUU(JL,KLEV) ZMFUV(JL)=PMFUB(JL)*PVU(JL,KLEV) END IF 310 CONTINUE ! !-- 3.1 Find organized entrainment at cloud base ! DO 322 JL=1,KLON LDCUM(JL)=.FALSE. IF (KTYPE(JL).EQ.1) THEN IKB = KCBOT(JL) if(orgen .eq. 1 ) then ! old scheme ZBUOY(JL)=G*((PTU(JL,IKB)-PTENH(JL,IKB))/PTENH(JL,IKB)+ & 0.608*(PQU(JL,IKB)-PQENH(JL,IKB))) IF (ZBUOY(JL).GT.0.) THEN ZDZ = (PGEO(JL,IKB-1)-PGEO(JL,IKB))*ZRG ZDRODZ = -LOG(PTEN(JL,IKB-1)/PTEN(JL,IKB))/ZDZ - & G/(RD*PTENH(JL,IKB)) ZOENTR(JL,IKB-1)=ZBUOY(JL)*0.5/(1.+ZBUOY(JL)*ZDZ) & +ZDRODZ ZOENTR(JL,IKB-1) = MIN(ZOENTR(JL,IKB-1),1.E-3) ZOENTR(JL,IKB-1) = MAX(ZOENTR(JL,IKB-1),0.) END IF ! New scheme ! Let's define the fscale else if(orgen .eq. 2 ) then tt(jl) = ptenh(jl,ikb) zqsat(jl) = TLUCUA(tt(jl))/paph(jl,ikb-1) zqsat(jl) = zqsat(jl)/(1.-VTMPC1*zqsat(jl)) ttb(jl) = ptenh(jl,ikb) zqsatb(jl) = TLUCUA(ttb(jl))/paph(jl,ikb) zqsatb(jl) = zqsatb(jl)/(1.-VTMPC1*zqsatb(jl)) fscale(jl) = (zqsat(jl)/zqsatb(jl))**3 ! end of defining the fscale zoentr(jl,ikb-1) = 1.E-3*(1.3-PQEN(jl,ikb-1)/PQSEN(jl,ikb-1))*fscale(jl) zoentr(jl,ikb-1) = MIN(zoentr(jl,ikb-1),1.E-3) zoentr(jl,ikb-1) = MAX(zoentr(jl,ikb-1),0.) end if END IF 322 CONTINUE ! !----------------------------------------------------------------- ! 4. DO ASCENT: SUBCLOUD LAYER (KLAB=1) ,CLOUDS (KLAB=2) ! BY DOING FIRST DRY-ADIABATIC ASCENT AND THEN ! BY ADJUSTING T,Q AND L ACCORDINGLY IN *CUADJTQ*, ! THEN CHECK FOR BUOYANCY AND SET FLAGS ACCORDINGLY !----------------------------------------------------------------- 400 CONTINUE ! let's define the levels in which the middle level convection could be activated do jk=KLEVM1,2,-1 if(abs(paph(1,jk)*0.01 - 250) .lt. 50.) then leveltop = jk exit end if end do leveltop = min(KLEV-15,leveltop) levelbot = KLEVM1 - 4 DO 480 JK=KLEVM1,2,-1 ! SPECIFY CLOUD BASE VALUES FOR MIDLEVEL CONVECTION ! IN *CUBASMC* IN CASE THERE IS NOT ALREADY CONVECTION ! --------------------------------------------------------------------- IK=JK IF(LMFMID.AND.IK.LT.levelbot.AND.IK.GT.leveltop) THEN CALL CUBASMC & (KLON, KLEV, KLEVM1, IK, PTEN, & PQEN, PQSEN, PUEN, PVEN, PVERV, & PGEO, PGEOH, LDCUM, KTYPE, KLAB, & PMFU, PMFUB, PENTR, KCBOT, PTU, & PQU, PLU, PUU, PVU, PMFUS, & PMFUQ, PMFUL, PDMFUP, ZMFUU, ZMFUV) ENDIF IS=0 DO 410 JL=1,KLON ZQOLD(JL)=0.0 IS=IS+KLAB(JL,JK+1) IF(KLAB(JL,JK+1).EQ.0) KLAB(JL,JK)=0 LOFLAG(JL)=KLAB(JL,JK+1).GT.0 ZPH(JL)=PAPH(JL,JK) IF(KTYPE(JL).EQ.3.AND.JK.EQ.KCBOT(JL)) THEN ZMFMAX=(PAPH(JL,JK)-PAPH(JL,JK-1))*ZCONS2 IF(PMFUB(JL).GT.ZMFMAX) THEN ZFAC=ZMFMAX/PMFUB(JL) PMFU(JL,JK+1)=PMFU(JL,JK+1)*ZFAC PMFUS(JL,JK+1)=PMFUS(JL,JK+1)*ZFAC PMFUQ(JL,JK+1)=PMFUQ(JL,JK+1)*ZFAC ZMFUU(JL)=ZMFUU(JL)*ZFAC ZMFUV(JL)=ZMFUV(JL)*ZFAC PMFUB(JL)=ZMFMAX END IF END IF 410 CONTINUE IF(IS.EQ.0) GO TO 480 ! !* SPECIFY ENTRAINMENT RATES IN *CUENTR_NEW* ! ------------------------------------- IK=JK CALL CUENTR_NEW & (KLON, KLEV, KLEVP1, IK, PTENH,& PAPH, PAP, PGEOH, KLWMIN, LDCUM,& KTYPE, KCBOT, KCTOP0, ZPBASE, PMFU, & PENTR, ZDMFEN, ZDMFDE, ZODETR, KHMIN) ! ! DO ADIABATIC ASCENT FOR ENTRAINING/DETRAINING PLUME ! ------------------------------------------------------- ! Do adiabatic ascent for entraining/detraining plume ! the cloud ensemble entrains environmental values ! in turbulent detrainment cloud ensemble values are detrained ! in organized detrainment the dry static energy and ! moisture that are neutral compared to the ! environmental air are detrained ! DO 420 JL=1,KLON IF(LOFLAG(JL)) THEN IF(JK.LT.KCBOT(JL)) THEN ZMFTEST=PMFU(JL,JK+1)+ZDMFEN(JL)-ZDMFDE(JL) ZMFMAX=MIN(ZMFTEST,(PAPH(JL,JK)-PAPH(JL,JK-1))*ZCONS2) ZDMFEN(JL)=MAX(ZDMFEN(JL)-MAX(ZMFTEST-ZMFMAX,0.),0.) END IF ZDMFDE(JL)=MIN(ZDMFDE(JL),0.75*PMFU(JL,JK+1)) PMFU(JL,JK)=PMFU(JL,JK+1)+ZDMFEN(JL)-ZDMFDE(JL) IF (JK.LT.kcbot(jl)) THEN zdprho = (pgeoh(jl,jk)-pgeoh(jl,jk+1))*zrg zoentr(jl,jk) = zoentr(jl,jk)*zdprho*pmfu(jl,jk+1) zmftest = pmfu(jl,jk) + zoentr(jl,jk)-zodetr(jl,jk) zmfmax = MIN(zmftest,(paph(jl,jk)-paph(jl,jk-1))*zcons2) zoentr(jl,jk) = MAX(zoentr(jl,jk)-MAX(zmftest-zmfmax,0.),0.) END IF ! ! limit organized detrainment to not allowing for too deep clouds ! IF (ktype(jl).EQ.1.AND.jk.LT.kcbot(jl).AND.jk.LE.khmin(jl)) THEN zmse = cpd*ptu(jl,jk+1) + alv*pqu(jl,jk+1) + pgeoh(jl,jk+1) ikt = kctop0(jl) znevn=(pgeoh(jl,ikt)-pgeoh(jl,jk+1))*(zmse-phhatt(jl, & jk+1))*zrg IF (znevn.LE.0.) znevn = 1. zdprho = (pgeoh(jl,jk)-pgeoh(jl,jk+1))*zrg zodmax = ((phcbase(jl)-zmse)/znevn)*zdprho*pmfu(jl,jk+1) zodmax = MAX(zodmax,0.) zodetr(jl,jk) = MIN(zodetr(jl,jk),zodmax) END IF zodetr(jl,jk) = MIN(zodetr(jl,jk),0.75*pmfu(jl,jk)) pmfu(jl,jk) = pmfu(jl,jk) + zoentr(jl,jk) - zodetr(jl,jk) ZQEEN=PQENH(JL,JK+1)*ZDMFEN(JL) zqeen=zqeen + pqenh(jl,jk+1)*zoentr(jl,jk) ZSEEN=(CPD*PTENH(JL,JK+1)+PGEOH(JL,JK+1))*ZDMFEN(JL) zseen=zseen+(cpd*ptenh(jl,jk+1)+pgeoh(jl,jk+1))* & zoentr(jl,jk) ZSCDE=(CPD*PTU(JL,JK+1)+PGEOH(JL,JK+1))*ZDMFDE(JL) ! find moist static energy that give nonbuoyant air zga = alv*pqsenh(jl,jk+1)/(rv*(ptenh(jl,jk+1)**2)) zdt = (plu(jl,jk+1)-0.608*(pqsenh(jl,jk+1)-pqenh(jl, & jk+1)))/(1./ptenh(jl,jk+1)+0.608*zga) zscod = cpd*ptenh(jl,jk+1) + pgeoh(jl,jk+1) + cpd*zdt zscde = zscde + zodetr(jl,jk)*zscod zqude = pqu(jl,jk+1)*zdmfde(jl) zqcod = pqsenh(jl,jk+1) + zga*zdt zqude = zqude + zodetr(jl,jk)*zqcod plude(jl,jk) = plu(jl,jk+1)*zdmfde(jl) plude(jl,jk) = plude(jl,jk)+plu(jl,jk+1)*zodetr(jl,jk) zmfusk = pmfus(jl,jk+1) + zseen - zscde zmfuqk = pmfuq(jl,jk+1) + zqeen - zqude zmfulk = pmful(jl,jk+1) - plude(jl,jk) plu(jl,jk) = zmfulk*(1./MAX(cmfcmin,pmfu(jl,jk))) pqu(jl,jk) = zmfuqk*(1./MAX(cmfcmin,pmfu(jl,jk))) ptu(jl,jk)=(zmfusk*(1./MAX(cmfcmin,pmfu(jl,jk)))- & pgeoh(jl,jk))*rcpd ptu(jl,jk) = MAX(100.,ptu(jl,jk)) ptu(jl,jk) = MIN(400.,ptu(jl,jk)) zqold(jl) = pqu(jl,jk) END IF 420 CONTINUE !* DO CORRECTIONS FOR MOIST ASCENT !* BY ADJUSTING T,Q AND L IN *CUADJTQ* !------------------------------------------------ IK=JK ICALL=1 ! CALL CUADJTQ(KLON,KLEV,IK,ZPH,PTU,PQU,LOFLAG,ICALL) ! DO 440 JL=1,KLON IF(LOFLAG(JL).AND.PQU(JL,JK).NE.ZQOLD(JL)) THEN KLAB(JL,JK)=2 PLU(JL,JK)=PLU(JL,JK)+ZQOLD(JL)-PQU(JL,JK) ZBUO=PTU(JL,JK)*(1.+VTMPC1*PQU(JL,JK)-PLU(JL,JK))- & PTENH(JL,JK)*(1.+VTMPC1*PQENH(JL,JK)) IF(KLAB(JL,JK+1).EQ.1) ZBUO=ZBUO+ZBUO0 IF(ZBUO.GT.0..AND.PMFU(JL,JK).GT.0.01*PMFUB(JL).AND. & JK.GE.KCTOP0(JL)) THEN KCTOP(JL)=JK LDCUM(JL)=.TRUE. IF(ZPBASE(JL)-PAPH(JL,JK).GE.ZDNOPRC) THEN ZPRCON=CPRCON ELSE ZPRCON=0. ENDIF ZLNEW=PLU(JL,JK)/(1.+ZPRCON*(PGEOH(JL,JK)-PGEOH(JL,JK+1))) PDMFUP(JL,JK)=MAX(0.,(PLU(JL,JK)-ZLNEW)*PMFU(JL,JK)) PLU(JL,JK)=ZLNEW ELSE KLAB(JL,JK)=0 PMFU(JL,JK)=0. END IF END IF IF(LOFLAG(JL)) THEN PMFUL(JL,JK)=PLU(JL,JK)*PMFU(JL,JK) PMFUS(JL,JK)=(CPD*PTU(JL,JK)+PGEOH(JL,JK))*PMFU(JL,JK) PMFUQ(JL,JK)=PQU(JL,JK)*PMFU(JL,JK) END IF 440 CONTINUE ! IF(LMFDUDV) THEN ! DO 460 JL=1,KLON zdmfen(jl) = zdmfen(jl) + zoentr(jl,jk) zdmfde(jl) = zdmfde(jl) + zodetr(jl,jk) IF(LOFLAG(JL)) THEN IF(KTYPE(JL).EQ.1.OR.KTYPE(JL).EQ.3) THEN IF(ZDMFEN(JL).LE.1.E-20) THEN ZZ=3. ELSE ZZ=2. ENDIF ELSE IF(ZDMFEN(JL).LE.1.0E-20) THEN ZZ=1. ELSE ZZ=0. ENDIF END IF ZDMFEU=ZDMFEN(JL)+ZZ*ZDMFDE(JL) ZDMFDU=ZDMFDE(JL)+ZZ*ZDMFDE(JL) ZDMFDU=MIN(ZDMFDU,0.75*PMFU(JL,JK+1)) ZMFUU(JL)=ZMFUU(JL)+ & ZDMFEU*PUEN(JL,JK)-ZDMFDU*PUU(JL,JK+1) ZMFUV(JL)=ZMFUV(JL)+ & ZDMFEU*PVEN(JL,JK)-ZDMFDU*PVU(JL,JK+1) IF(PMFU(JL,JK).GT.0.) THEN PUU(JL,JK)=ZMFUU(JL)*(1./PMFU(JL,JK)) PVU(JL,JK)=ZMFUV(JL)*(1./PMFU(JL,JK)) END IF END IF 460 CONTINUE ! END IF ! ! Compute organized entrainment ! for use at next level ! DO 470 jl = 1, klon IF (loflag(jl).AND.ktype(jl).EQ.1) THEN ! old scheme if(orgen .eq. 1 ) then zbuoyz=g*((ptu(jl,jk)-ptenh(jl,jk))/ptenh(jl,jk)+ & 0.608*(pqu(jl,jk)-pqenh(jl,jk))-plu(jl,jk)) zbuoyz = MAX(zbuoyz,0.0) zdz = (pgeo(jl,jk-1)-pgeo(jl,jk))*zrg zdrodz = -LOG(pten(jl,jk-1)/pten(jl,jk))/zdz - & g/(rd*ptenh(jl,jk)) zbuoy(jl) = zbuoy(jl) + zbuoyz*zdz zoentr(jl,jk-1) = zbuoyz*0.5/(1.+zbuoy(jl))+zdrodz zoentr(jl,jk-1) = MIN(zoentr(jl,jk-1),1.E-3) zoentr(jl,jk-1) = MAX(zoentr(jl,jk-1),0.) else if(orgen .eq. 2 ) then ! Let's define the fscale tt(jl) = ptenh(jl,jk-1) zqsat(jl) = TLUCUA(tt(jl))/paph(jl,jk-1) zqsat(jl) = zqsat(jl)/(1.-VTMPC1*zqsat(jl)) ttb(jl) = ptenh(jl,kcbot(jl)) zqsatb(jl) = TLUCUA(ttb(jl))/paph(jl,kcbot(jl)) zqsatb(jl) = zqsatb(jl)/(1.-VTMPC1*zqsatb(jl)) fscale(jl) = (zqsat(jl)/zqsatb(jl))**3 ! end of defining the fscale zoentr(jl,jk-1) = 1.E-3*(1.3-PQEN(jl,jk-1)/PQSEN(jl,jk-1))*fscale(jl) zoentr(jl,jk-1) = MIN(zoentr(jl,jk-1),1.E-3) zoentr(jl,jk-1) = MAX(zoentr(jl,jk-1),0.) ! write(6,*) "zoentr=",zoentr(jl,jk-1) end if END IF 470 CONTINUE ! 480 CONTINUE ! ----------------------------------------------------------------- ! 5. DETERMINE CONVECTIVE FLUXES ABOVE NON-BUOYANCY LEVEL ! ----------------------------------------------------------------- ! (NOTE: CLOUD VARIABLES LIKE T,Q AND L ARE NOT ! AFFECTED BY DETRAINMENT AND ARE ALREADY KNOWN ! FROM PREVIOUS CALCULATIONS ABOVE) 500 CONTINUE DO 510 JL=1,KLON IF(KCTOP(JL).EQ.KLEVM1) LDCUM(JL)=.FALSE. KCBOT(JL)=MAX(KCBOT(JL),KCTOP(JL)) 510 CONTINUE IS=0 DO 520 JL=1,KLON IF(LDCUM(JL)) THEN IS=IS+1 ENDIF 520 CONTINUE KCUM=IS IF(IS.EQ.0) GO TO 800 DO 530 JL=1,KLON IF(LDCUM(JL)) THEN JK=KCTOP(JL)-1 ZZDMF=CMFCTOP ZDMFDE(JL)=(1.-ZZDMF)*PMFU(JL,JK+1) PLUDE(JL,JK)=ZDMFDE(JL)*PLU(JL,JK+1) PMFU(JL,JK)=PMFU(JL,JK+1)-ZDMFDE(JL) PMFUS(JL,JK)=(CPD*PTU(JL,JK)+PGEOH(JL,JK))*PMFU(JL,JK) PMFUQ(JL,JK)=PQU(JL,JK)*PMFU(JL,JK) PMFUL(JL,JK)=PLU(JL,JK)*PMFU(JL,JK) PLUDE(JL,JK-1)=PMFUL(JL,JK) PDMFUP(JL,JK)=0. END IF 530 CONTINUE IF(LMFDUDV) THEN DO 540 JL=1,KLON IF(LDCUM(JL)) THEN JK=KCTOP(JL)-1 PUU(JL,JK)=PUU(JL,JK+1) PVU(JL,JK)=PVU(JL,JK+1) END IF 540 CONTINUE END IF 800 CONTINUE RETURN END SUBROUTINE CUASC_NEW ! !********************************************** ! SUBROUTINE CUDLFS !********************************************** SUBROUTINE CUDLFS & 1,1 (KLON, KLEV, KLEVP1, PTENH, PQENH, & PUEN, PVEN, PGEOH, PAPH, PTU, & PQU, PUU, PVU, LDCUM, KCBOT, & KCTOP, PMFUB, PRFL, PTD, PQD, & PUD, PVD, PMFD, PMFDS, PMFDQ, & PDMFDP, KDTOP, LDDRAF) ! THIS ROUTINE CALCULATES LEVEL OF FREE SINKING FOR ! CUMULUS DOWNDRAFTS AND SPECIFIES T,Q,U AND V VALUES ! M.TIEDTKE E.C.M.W.F. 12/86 MODIF. 12/89 !***PURPOSE. ! -------- ! TO PRODUCE LFS-VALUES FOR CUMULUS DOWNDRAFTS ! FOR MASSFLUX CUMULUS PARAMETERIZATION !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM *CUMASTR*. ! INPUT ARE ENVIRONMENTAL VALUES OF T,Q,U,V,P,PHI ! AND UPDRAFT VALUES T,Q,U AND V AND ALSO ! CLOUD BASE MASSFLUX AND CU-PRECIPITATION RATE. ! IT RETURNS T,Q,U AND V VALUES AND MASSFLUX AT LFS. !***METHOD. ! -------- ! CHECK FOR NEGATIVE BUOYANCY OF AIR OF EQUAL PARTS OF ! MOIST ENVIRONMENTAL AIR AND CLOUD AIR. !***EXTERNALS ! --------- ! *CUADJTQ* FOR CALCULATING WET BULB T AND Q AT LFS ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER JL,KE,JK,IS,IK,ICALL REAL ZTTEST, ZQTEST, ZBUO, ZMFTOP REAL PTENH(KLON,KLEV), PQENH(KLON,KLEV), & PUEN(KLON,KLEV), PVEN(KLON,KLEV), & PGEOH(KLON,KLEV), PAPH(KLON,KLEVP1), & PTU(KLON,KLEV), PQU(KLON,KLEV), & PUU(KLON,KLEV), PVU(KLON,KLEV), & PMFUB(KLON), PRFL(KLON) REAL PTD(KLON,KLEV), PQD(KLON,KLEV), & PUD(KLON,KLEV), PVD(KLON,KLEV), & PMFD(KLON,KLEV), PMFDS(KLON,KLEV), & PMFDQ(KLON,KLEV), PDMFDP(KLON,KLEV) REAL ZTENWB(KLON,KLEV), ZQENWB(KLON,KLEV), & ZCOND(KLON), ZPH(KLON) INTEGER KCBOT(KLON), KCTOP(KLON), & KDTOP(KLON) LOGICAL LDCUM(KLON), LLo2(KLON), & LDDRAF(KLON) !----------------------------------------------- ! 1. SET DEFAULT VALUES FOR DOWNDRAFTS !----------------------------------------------- 100 CONTINUE DO 110 JL=1,KLON LDDRAF(JL)=.FALSE. KDTOP(JL)=KLEVP1 110 CONTINUE IF(.NOT.LMFDD) GO TO 300 !------------------------------------------------------------ ! 2. DETERMINE LEVEL OF FREE SINKING BY ! DOING A SCAN FROM TOP TO BASE OF CUMULUS CLOUDS ! FOR EVERY POINT AND PROCEED AS FOLLOWS: ! (1) DETEMINE WET BULB ENVIRONMENTAL T AND Q ! (2) DO MIXING WITH CUMULUS CLOUD AIR ! (3) CHECK FOR NEGATIVE BUOYANCY ! THE ASSUMPTION IS THAT AIR OF DOWNDRAFTS IS MIXTURE ! OF 50% CLOUD AIR + 50% ENVIRONMENTAL AIR AT WET BULB ! TEMPERATURE (I.E. WHICH BECAME SATURATED DUE TO ! EVAPORATION OF RAIN AND CLOUD WATER) !------------------------------------------------------------------ 200 CONTINUE KE=KLEV-3 DO 290 JK=3,KE ! 2.1 CALCULATE WET-BULB TEMPERATURE AND MOISTURE ! FOR ENVIRONMENTAL AIR IN *CUADJTQ* ! ----------------------------------------------------- 210 CONTINUE IS=0 DO 212 JL=1,KLON ZTENWB(JL,JK)=PTENH(JL,JK) ZQENWB(JL,JK)=PQENH(JL,JK) ZPH(JL)=PAPH(JL,JK) LLO2(JL)=LDCUM(JL).AND.PRFL(JL).GT.0..AND..NOT.LDDRAF(JL).AND. & (JK.LT.KCBOT(JL).AND.JK.GT.KCTOP(JL)) IF(LLO2(JL))THEN IS=IS+1 ENDIF 212 CONTINUE IF(IS.EQ.0) GO TO 290 IK=JK ICALL=2 CALL CUADJTQ(KLON,KLEV,IK,ZPH,ZTENWB,ZQENWB,LLO2,ICALL) ! 2.2 DO MIXING OF CUMULUS AND ENVIRONMENTAL AIR ! AND CHECK FOR NEGATIVE BUOYANCY. ! THEN SET VALUES FOR DOWNDRAFT AT LFS. ! ----------------------------------------------------- 220 CONTINUE DO 222 JL=1,KLON IF(LLO2(JL)) THEN ZTTEST=0.5*(PTU(JL,JK)+ZTENWB(JL,JK)) ZQTEST=0.5*(PQU(JL,JK)+ZQENWB(JL,JK)) ZBUO=ZTTEST*(1.+VTMPC1*ZQTEST)- & PTENH(JL,JK)*(1.+VTMPC1*PQENH(JL,JK)) ZCOND(JL)=PQENH(JL,JK)-ZQENWB(JL,JK) ZMFTOP=-CMFDEPS*PMFUB(JL) IF(ZBUO.LT.0..AND.PRFL(JL).GT.10.*ZMFTOP*ZCOND(JL)) THEN KDTOP(JL)=JK LDDRAF(JL)=.TRUE. PTD(JL,JK)=ZTTEST PQD(JL,JK)=ZQTEST PMFD(JL,JK)=ZMFTOP PMFDS(JL,JK)=PMFD(JL,JK)*(CPD*PTD(JL,JK)+PGEOH(JL,JK)) PMFDQ(JL,JK)=PMFD(JL,JK)*PQD(JL,JK) PDMFDP(JL,JK-1)=-0.5*PMFD(JL,JK)*ZCOND(JL) PRFL(JL)=PRFL(JL)+PDMFDP(JL,JK-1) END IF END IF 222 CONTINUE IF(LMFDUDV) THEN DO 224 JL=1,KLON IF(PMFD(JL,JK).LT.0.) THEN PUD(JL,JK)=0.5*(PUU(JL,JK)+PUEN(JL,JK-1)) PVD(JL,JK)=0.5*(PVU(JL,JK)+PVEN(JL,JK-1)) END IF 224 CONTINUE END IF 290 CONTINUE 300 CONTINUE RETURN END SUBROUTINE CUDLFS ! !********************************************** ! SUBROUTINE CUDDRAF !********************************************** SUBROUTINE CUDDRAF & 1,1 (KLON, KLEV, KLEVP1, PTENH, PQENH, & PUEN, PVEN, PGEOH, PAPH, PRFL, & LDDRAF, PTD, PQD, PUD, PVD, & PMFD, PMFDS, PMFDQ, PDMFDP) ! THIS ROUTINE CALCULATES CUMULUS DOWNDRAFT DESCENT ! M.TIEDTKE E.C.M.W.F. 12/86 MODIF. 12/89 !***PURPOSE. ! -------- ! TO PRODUCE THE VERTICAL PROFILES FOR CUMULUS DOWNDRAFTS ! (I.E. T,Q,U AND V AND FLUXES) !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM *CUMASTR*. ! INPUT IS T,Q,P,PHI,U,V AT HALF LEVELS. ! IT RETURNS FLUXES OF S,Q AND EVAPORATION RATE ! AND U,V AT LEVELS WHERE DOWNDRAFT OCCURS !***METHOD. ! -------- ! CALCULATE MOIST DESCENT FOR ENTRAINING/DETRAINING PLUME BY ! A) MOVING AIR DRY-ADIABATICALLY TO NEXT LEVEL BELOW AND ! B) CORRECTING FOR EVAPORATION TO OBTAIN SATURATED STATE. !***EXTERNALS ! --------- ! *CUADJTQ* FOR ADJUSTING T AND Q DUE TO EVAPORATION IN ! SATURATED DESCENT !***REFERENCE ! --------- ! (TIEDTKE,1989) ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER JK,IS,JL,ITOPDE, IK, ICALL REAL ZENTR,ZSEEN, ZQEEN, ZSDDE, ZQDDE,ZMFDSK, ZMFDQK REAL ZBUO, ZDMFDP, ZMFDUK, ZMFDVK REAL PTENH(KLON,KLEV), PQENH(KLON,KLEV), & PUEN(KLON,KLEV), PVEN(KLON,KLEV), & PGEOH(KLON,KLEV), PAPH(KLON,KLEVP1) REAL PTD(KLON,KLEV), PQD(KLON,KLEV), & PUD(KLON,KLEV), PVD(KLON,KLEV), & PMFD(KLON,KLEV), PMFDS(KLON,KLEV), & PMFDQ(KLON,KLEV), PDMFDP(KLON,KLEV), & PRFL(KLON) REAL ZDMFEN(KLON), ZDMFDE(KLON), & ZCOND(KLON), ZPH(KLON) LOGICAL LDDRAF(KLON), LLO2(KLON) !-------------------------------------------------------------- ! 1. CALCULATE MOIST DESCENT FOR CUMULUS DOWNDRAFT BY ! (A) CALCULATING ENTRAINMENT RATES, ASSUMING ! LINEAR DECREASE OF MASSFLUX IN PBL ! (B) DOING MOIST DESCENT - EVAPORATIVE COOLING ! AND MOISTENING IS CALCULATED IN *CUADJTQ* ! (C) CHECKING FOR NEGATIVE BUOYANCY AND ! SPECIFYING FINAL T,Q,U,V AND DOWNWARD FLUXES ! ---------------------------------------------------------------- 100 CONTINUE DO 180 JK=3,KLEV IS=0 DO 110 JL=1,KLON ZPH(JL)=PAPH(JL,JK) LLO2(JL)=LDDRAF(JL).AND.PMFD(JL,JK-1).LT.0. IF(LLO2(JL)) THEN IS=IS+1 ENDIF 110 CONTINUE IF(IS.EQ.0) GO TO 180 DO 122 JL=1,KLON IF(LLO2(JL)) THEN ZENTR=ENTRDD*PMFD(JL,JK-1)*RD*PTENH(JL,JK-1)/ & (G*PAPH(JL,JK-1))*(PAPH(JL,JK)-PAPH(JL,JK-1)) ZDMFEN(JL)=ZENTR ZDMFDE(JL)=ZENTR END IF 122 CONTINUE ITOPDE=KLEV-2 IF(JK.GT.ITOPDE) THEN DO 124 JL=1,KLON IF(LLO2(JL)) THEN ZDMFEN(JL)=0. ZDMFDE(JL)=PMFD(JL,ITOPDE)* & (PAPH(JL,JK)-PAPH(JL,JK-1))/ & (PAPH(JL,KLEVP1)-PAPH(JL,ITOPDE)) END IF 124 CONTINUE END IF DO 126 JL=1,KLON IF(LLO2(JL)) THEN PMFD(JL,JK)=PMFD(JL,JK-1)+ZDMFEN(JL)-ZDMFDE(JL) ZSEEN=(CPD*PTENH(JL,JK-1)+PGEOH(JL,JK-1))*ZDMFEN(JL) ZQEEN=PQENH(JL,JK-1)*ZDMFEN(JL) ZSDDE=(CPD*PTD(JL,JK-1)+PGEOH(JL,JK-1))*ZDMFDE(JL) ZQDDE=PQD(JL,JK-1)*ZDMFDE(JL) ZMFDSK=PMFDS(JL,JK-1)+ZSEEN-ZSDDE ZMFDQK=PMFDQ(JL,JK-1)+ZQEEN-ZQDDE PQD(JL,JK)=ZMFDQK*(1./MIN(-CMFCMIN,PMFD(JL,JK))) PTD(JL,JK)=(ZMFDSK*(1./MIN(-CMFCMIN,PMFD(JL,JK)))- & PGEOH(JL,JK))*RCPD PTD(JL,JK)=MIN(400.,PTD(JL,JK)) PTD(JL,JK)=MAX(100.,PTD(JL,JK)) ZCOND(JL)=PQD(JL,JK) END IF 126 CONTINUE IK=JK ICALL=2 CALL CUADJTQ(KLON,KLEV,IK,ZPH,PTD,PQD,LLO2,ICALL) DO 150 JL=1,KLON IF(LLO2(JL)) THEN ZCOND(JL)=ZCOND(JL)-PQD(JL,JK) ZBUO=PTD(JL,JK)*(1.+VTMPC1*PQD(JL,JK))- & PTENH(JL,JK)*(1.+VTMPC1*PQENH(JL,JK)) IF(ZBUO.GE.0..OR.PRFL(JL).LE.(PMFD(JL,JK)*ZCOND(JL))) THEN PMFD(JL,JK)=0. ENDIF PMFDS(JL,JK)=(CPD*PTD(JL,JK)+PGEOH(JL,JK))*PMFD(JL,JK) PMFDQ(JL,JK)=PQD(JL,JK)*PMFD(JL,JK) ZDMFDP=-PMFD(JL,JK)*ZCOND(JL) PDMFDP(JL,JK-1)=ZDMFDP PRFL(JL)=PRFL(JL)+ZDMFDP END IF 150 CONTINUE IF(LMFDUDV) THEN DO 160 JL=1,KLON IF(LLO2(JL).AND.PMFD(JL,JK).LT.0.) THEN ZMFDUK=PMFD(JL,JK-1)*PUD(JL,JK-1)+ & ZDMFEN(JL)*PUEN(JL,JK-1)-ZDMFDE(JL)*PUD(JL,JK-1) ZMFDVK=PMFD(JL,JK-1)*PVD(JL,JK-1)+ & ZDMFEN(JL)*PVEN(JL,JK-1)-ZDMFDE(JL)*PVD(JL,JK-1) PUD(JL,JK)=ZMFDUK*(1./MIN(-CMFCMIN,PMFD(JL,JK))) PVD(JL,JK)=ZMFDVK*(1./MIN(-CMFCMIN,PMFD(JL,JK))) END IF 160 CONTINUE END IF 180 CONTINUE RETURN END SUBROUTINE CUDDRAF ! !********************************************** ! SUBROUTINE CUFLX !********************************************** SUBROUTINE CUFLX & 1 (KLON, KLEV, KLEVP1, PQEN, PQSEN, & PTENH, PQENH, PAPH, PGEOH, KCBOT, & KCTOP, KDTOP, KTYPE, LDDRAF, LDCUM, & PMFU, PMFD, PMFUS, PMFDS, PMFUQ, & PMFDQ, PMFUL, PLUDE, PDMFUP, PDMFDP, & PRFL, PRAIN, PTEN, PSFL, PDPMEL, & KTOPM2, ZTMST, sig1) ! M.TIEDTKE E.C.M.W.F. 7/86 MODIF. 12/89 !***PURPOSE ! ------- ! THIS ROUTINE DOES THE FINAL CALCULATION OF CONVECTIVE ! FLUXES IN THE CLOUD LAYER AND IN THE SUBCLOUD LAYER !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM *CUMASTR*. !***EXTERNALS ! --------- ! NONE ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER KTOPM2, ITOP, JL, JK, IKB REAL ZTMST, ZCONS1, ZCONS2, ZCUCOV, ZTMELP2 REAL ZZP, ZFAC, ZSNMLT, ZRFL, CEVAPCU, ZRNEW REAL ZRMIN, ZRFLN, ZDRFL, ZDPEVAP REAL PQEN(KLON,KLEV), PQSEN(KLON,KLEV), & PTENH(KLON,KLEV), PQENH(KLON,KLEV), & PAPH(KLON,KLEVP1), PGEOH(KLON,KLEV) REAL PMFU(KLON,KLEV), PMFD(KLON,KLEV), & PMFUS(KLON,KLEV), PMFDS(KLON,KLEV), & PMFUQ(KLON,KLEV), PMFDQ(KLON,KLEV), & PDMFUP(KLON,KLEV), PDMFDP(KLON,KLEV), & PMFUL(KLON,KLEV), PLUDE(KLON,KLEV), & PRFL(KLON), PRAIN(KLON) REAL PTEN(KLON,KLEV), PDPMEL(KLON,KLEV), & PSFL(KLON), ZPSUBCL(KLON) REAL sig1(KLEV) INTEGER KCBOT(KLON), KCTOP(KLON), & KDTOP(KLON), KTYPE(KLON) LOGICAL LDDRAF(KLON), LDCUM(KLON) !* SPECIFY CONSTANTS ZCONS1=CPD/(ALF*G*ZTMST) ZCONS2=1./(G*ZTMST) ZCUCOV=0.05 ZTMELP2=TMELT+2. !* 1.0 DETERMINE FINAL CONVECTIVE FLUXES !--------------------------------------------- 100 CONTINUE ITOP=KLEV DO 110 JL=1,KLON PRFL(JL)=0. PSFL(JL)=0. PRAIN(JL)=0. ! SWITCH OFF SHALLOW CONVECTION IF(.NOT.LMFSCV.AND.KTYPE(JL).EQ.2)THEN LDCUM(JL)=.FALSE. LDDRAF(JL)=.FALSE. ENDIF ITOP=MIN(ITOP,KCTOP(JL)) IF(.NOT.LDCUM(JL).OR.KDTOP(JL).LT.KCTOP(JL)) LDDRAF(JL)=.FALSE. IF(.NOT.LDCUM(JL)) KTYPE(JL)=0 110 CONTINUE KTOPM2=ITOP-2 DO 120 JK=KTOPM2,KLEV DO 115 JL=1,KLON IF(LDCUM(JL).AND.JK.GE.KCTOP(JL)-1) THEN PMFUS(JL,JK)=PMFUS(JL,JK)-PMFU(JL,JK)* & (CPD*PTENH(JL,JK)+PGEOH(JL,JK)) PMFUQ(JL,JK)=PMFUQ(JL,JK)-PMFU(JL,JK)*PQENH(JL,JK) IF(LDDRAF(JL).AND.JK.GE.KDTOP(JL)) THEN PMFDS(JL,JK)=PMFDS(JL,JK)-PMFD(JL,JK)* & (CPD*PTENH(JL,JK)+PGEOH(JL,JK)) PMFDQ(JL,JK)=PMFDQ(JL,JK)-PMFD(JL,JK)*PQENH(JL,JK) ELSE PMFD(JL,JK)=0. PMFDS(JL,JK)=0. PMFDQ(JL,JK)=0. PDMFDP(JL,JK-1)=0. END IF ELSE PMFU(JL,JK)=0. PMFD(JL,JK)=0. PMFUS(JL,JK)=0. PMFDS(JL,JK)=0. PMFUQ(JL,JK)=0. PMFDQ(JL,JK)=0. PMFUL(JL,JK)=0. PDMFUP(JL,JK-1)=0. PDMFDP(JL,JK-1)=0. PLUDE(JL,JK-1)=0. END IF 115 CONTINUE 120 CONTINUE DO 130 JK=KTOPM2,KLEV DO 125 JL=1,KLON IF(LDCUM(JL).AND.JK.GT.KCBOT(JL)) THEN IKB=KCBOT(JL) ZZP=((PAPH(JL,KLEVP1)-PAPH(JL,JK))/ & (PAPH(JL,KLEVP1)-PAPH(JL,IKB))) IF(KTYPE(JL).EQ.3) THEN ZZP=ZZP**2 ENDIF PMFU(JL,JK)=PMFU(JL,IKB)*ZZP PMFUS(JL,JK)=PMFUS(JL,IKB)*ZZP PMFUQ(JL,JK)=PMFUQ(JL,IKB)*ZZP PMFUL(JL,JK)=PMFUL(JL,IKB)*ZZP END IF !* 2. CALCULATE RAIN/SNOW FALL RATES !* CALCULATE MELTING OF SNOW !* CALCULATE EVAPORATION OF PRECIP !---------------------------------------------- IF(LDCUM(JL)) THEN PRAIN(JL)=PRAIN(JL)+PDMFUP(JL,JK) IF(PTEN(JL,JK).GT.TMELT) THEN PRFL(JL)=PRFL(JL)+PDMFUP(JL,JK)+PDMFDP(JL,JK) IF(PSFL(JL).GT.0..AND.PTEN(JL,JK).GT.ZTMELP2) THEN ZFAC=ZCONS1*(PAPH(JL,JK+1)-PAPH(JL,JK)) ZSNMLT=MIN(PSFL(JL),ZFAC*(PTEN(JL,JK)-ZTMELP2)) PDPMEL(JL,JK)=ZSNMLT PSFL(JL)=PSFL(JL)-ZSNMLT PRFL(JL)=PRFL(JL)+ZSNMLT END IF ELSE PSFL(JL)=PSFL(JL)+PDMFUP(JL,JK)+PDMFDP(JL,JK) END IF END IF 125 CONTINUE 130 CONTINUE DO 230 JL=1,KLON PRFL(JL)=MAX(PRFL(JL),0.) PSFL(JL)=MAX(PSFL(JL),0.) ZPSUBCL(JL)=PRFL(JL)+PSFL(JL) 230 CONTINUE DO 240 JK=KTOPM2,KLEV DO 235 JL=1,KLON IF(LDCUM(JL).AND.JK.GE.KCBOT(JL).AND. & ZPSUBCL(JL).GT.1.E-20) THEN ZRFL=ZPSUBCL(JL) CEVAPCU=CEVAPCU1*SQRT(CEVAPCU2*SQRT(sig1(JK))) ZRNEW=(MAX(0.,SQRT(ZRFL/ZCUCOV)- & CEVAPCU*(PAPH(JL,JK+1)-PAPH(JL,JK))* & MAX(0.,PQSEN(JL,JK)-PQEN(JL,JK))))**2*ZCUCOV ZRMIN=ZRFL-ZCUCOV*MAX(0.,0.8*PQSEN(JL,JK)-PQEN(JL,JK)) & *ZCONS2*(PAPH(JL,JK+1)-PAPH(JL,JK)) ZRNEW=MAX(ZRNEW,ZRMIN) ZRFLN=MAX(ZRNEW,0.) ZDRFL=MIN(0.,ZRFLN-ZRFL) PDMFUP(JL,JK)=PDMFUP(JL,JK)+ZDRFL ZPSUBCL(JL)=ZRFLN END IF 235 CONTINUE 240 CONTINUE DO 250 JL=1,KLON ZDPEVAP=ZPSUBCL(JL)-(PRFL(JL)+PSFL(JL)) PRFL(JL)=PRFL(JL)+ZDPEVAP*PRFL(JL)* & (1./MAX(1.E-20,PRFL(JL)+PSFL(JL))) PSFL(JL)=PSFL(JL)+ZDPEVAP*PSFL(JL)* & (1./MAX(1.E-20,PRFL(JL)+PSFL(JL))) 250 CONTINUE RETURN END SUBROUTINE CUFLX ! !********************************************** ! SUBROUTINE CUDTDQ !********************************************** SUBROUTINE CUDTDQ & 1 (KLON, KLEV, KLEVP1, KTOPM2, PAPH, & LDCUM, PTEN, PTTE, PQTE, PMFUS, & PMFDS, PMFUQ, PMFDQ, PMFUL, PDMFUP, & PDMFDP, ZTMST, PDPMEL, PRAIN, PRFL, & PSFL, PSRAIN, PSEVAP, PSHEAT, PSMELT, & PRSFC, PSSFC, PAPRC, PAPRSM, PAPRS, & PQEN, PQSEN, PLUDE, PCTE) !**** *CUDTDQ* - UPDATES T AND Q TENDENCIES, PRECIPITATION RATES ! DOES GLOBAL DIAGNOSTICS ! M.TIEDTKE E.C.M.W.F. 7/86 MODIF. 12/89 !***INTERFACE. ! ---------- ! *CUDTDQ* IS CALLED FROM *CUMASTR* ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER KTOPM2,JL, JK REAL ZTMST, PSRAIN, PSEVAP, PSHEAT, PSMELT, ZDIAGT, ZDIAGW REAL ZALV, RHK, RHCOE, PLDFD, ZDTDT, ZDQDT REAL PTTE(KLON,KLEV), PQTE(KLON,KLEV), & PTEN(KLON,KLEV), PLUDE(KLON,KLEV), & PGEO(KLON,KLEV), PAPH(KLON,KLEVP1), & PAPRC(KLON), PAPRS(KLON), & PAPRSM(KLON), PCTE(KLON,KLEV), & PRSFC(KLON), PSSFC(KLON) REAL PMFUS(KLON,KLEV), PMFDS(KLON,KLEV), & PMFUQ(KLON,KLEV), PMFDQ(KLON,KLEV), & PMFUL(KLON,KLEV), PQSEN(KLON,KLEV), & PDMFUP(KLON,KLEV), PDMFDP(KLON,KLEV),& PRFL(KLON), PRAIN(KLON), & PQEN(KLON,KLEV) REAL PDPMEL(KLON,KLEV), PSFL(KLON) REAL ZSHEAT(KLON), ZMELT(KLON) LOGICAL LDCUM(KLON) !-------------------------------- !* 1.0 SPECIFY PARAMETERS !-------------------------------- 100 CONTINUE ZDIAGT=ZTMST ZDIAGW=ZDIAGT/RHOH2O !-------------------------------------------------- !* 2.0 INCREMENTATION OF T AND Q TENDENCIES !-------------------------------------------------- 200 CONTINUE DO 210 JL=1,KLON ZMELT(JL)=0. ZSHEAT(JL)=0. 210 CONTINUE DO 250 JK=KTOPM2,KLEV IF(JK.LT.KLEV) THEN DO 220 JL=1,KLON IF(LDCUM(JL)) THEN IF(PTEN(JL,JK).GT.TMELT) THEN ZALV=ALV ELSE ZALV=ALS ENDIF RHK=MIN(1.0,PQEN(JL,JK)/PQSEN(JL,JK)) RHCOE=MAX(0.0,(RHK-RHC)/(RHM-RHC)) pldfd=MAX(0.0,RHCOE*fdbk*PLUDE(JL,JK)) ZDTDT=(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))*RCPD* & (PMFUS(JL,JK+1)-PMFUS(JL,JK)+ & PMFDS(JL,JK+1)-PMFDS(JL,JK)-ALF*PDPMEL(JL,JK) & -ZALV*(PMFUL(JL,JK+1)-PMFUL(JL,JK)-pldfd- & (PDMFUP(JL,JK)+PDMFDP(JL,JK)))) PTTE(JL,JK)=PTTE(JL,JK)+ZDTDT ZDQDT=(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))*& (PMFUQ(JL,JK+1)-PMFUQ(JL,JK)+ & PMFDQ(JL,JK+1)-PMFDQ(JL,JK)+ & PMFUL(JL,JK+1)-PMFUL(JL,JK)-pldfd- & (PDMFUP(JL,JK)+PDMFDP(JL,JK))) PQTE(JL,JK)=PQTE(JL,JK)+ZDQDT PCTE(JL,JK)=(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))*pldfd ZSHEAT(JL)=ZSHEAT(JL)+ZALV*(PDMFUP(JL,JK)+PDMFDP(JL,JK)) ZMELT(JL)=ZMELT(JL)+PDPMEL(JL,JK) END IF 220 CONTINUE ELSE DO 230 JL=1,KLON IF(LDCUM(JL)) THEN IF(PTEN(JL,JK).GT.TMELT) THEN ZALV=ALV ELSE ZALV=ALS ENDIF RHK=MIN(1.0,PQEN(JL,JK)/PQSEN(JL,JK)) RHCOE=MAX(0.0,(RHK-RHC)/(RHM-RHC)) pldfd=MAX(0.0,RHCOE*fdbk*PLUDE(JL,JK)) ZDTDT=-(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))*RCPD* & (PMFUS(JL,JK)+PMFDS(JL,JK)+ALF*PDPMEL(JL,JK)-ZALV* & (PMFUL(JL,JK)+PDMFUP(JL,JK)+PDMFDP(JL,JK)+pldfd)) PTTE(JL,JK)=PTTE(JL,JK)+ZDTDT ZDQDT=-(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))* & (PMFUQ(JL,JK)+PMFDQ(JL,JK)+pldfd+ & (PMFUL(JL,JK)+PDMFUP(JL,JK)+PDMFDP(JL,JK))) PQTE(JL,JK)=PQTE(JL,JK)+ZDQDT PCTE(JL,JK)=(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))*pldfd ZSHEAT(JL)=ZSHEAT(JL)+ZALV*(PDMFUP(JL,JK)+PDMFDP(JL,JK)) ZMELT(JL)=ZMELT(JL)+PDPMEL(JL,JK) END IF 230 CONTINUE END IF 250 CONTINUE !--------------------------------------------------------- ! 3. UPDATE SURFACE FIELDS AND DO GLOBAL BUDGETS !--------------------------------------------------------- 300 CONTINUE DO 310 JL=1,KLON PRSFC(JL)=PRFL(JL) PSSFC(JL)=PSFL(JL) PAPRC(JL)=PAPRC(JL)+ZDIAGW*(PRFL(JL)+PSFL(JL)) PAPRS(JL)=PAPRSM(JL)+ZDIAGW*PSFL(JL) PSHEAT=PSHEAT+ZSHEAT(JL) PSRAIN=PSRAIN+PRAIN(JL) PSEVAP=PSEVAP-(PRFL(JL)+PSFL(JL)) PSMELT=PSMELT+ZMELT(JL) 310 CONTINUE PSEVAP=PSEVAP+PSRAIN RETURN END SUBROUTINE CUDTDQ ! !********************************************** ! SUBROUTINE CUDUDV !********************************************** SUBROUTINE CUDUDV & 1,1 (KLON, KLEV, KLEVP1, KTOPM2, KTYPE, & KCBOT, PAPH, LDCUM, PUEN, PVEN, & PVOM, PVOL, PUU, PUD, PVU, & PVD, PMFU, PMFD, PSDISS) !**** *CUDUDV* - UPDATES U AND V TENDENCIES, ! DOES GLOBAL DIAGNOSTIC OF DISSIPATION ! M.TIEDTKE E.C.M.W.F. 7/86 MODIF. 12/89 !***INTERFACE. ! ---------- ! *CUDUDV* IS CALLED FROM *CUMASTR* ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER KTOPM2, JK, IK, JL, IKB REAL PSDISS,ZZP, ZDUDT ,ZDVDT, ZSUM REAL PUEN(KLON,KLEV), PVEN(KLON,KLEV), & PVOL(KLON,KLEV), PVOM(KLON,KLEV), & PAPH(KLON,KLEVP1) REAL PUU(KLON,KLEV), PUD(KLON,KLEV), & PVU(KLON,KLEV), PVD(KLON,KLEV), & PMFU(KLON,KLEV), PMFD(KLON,KLEV) REAL ZMFUU(KLON,KLEV), ZMFDU(KLON,KLEV), & ZMFUV(KLON,KLEV), ZMFDV(KLON,KLEV), & ZDISS(KLON) INTEGER KTYPE(KLON), KCBOT(KLON) LOGICAL LDCUM(KLON) !------------------------------------------------------------ !* 1.0 CALCULATE FLUXES AND UPDATE U AND V TENDENCIES ! ----------------------------------------------------------- 100 CONTINUE DO 120 JK=KTOPM2,KLEV IK=JK-1 DO 110 JL=1,KLON IF(LDCUM(JL)) THEN ZMFUU(JL,JK)=PMFU(JL,JK)*(PUU(JL,JK)-PUEN(JL,IK)) ZMFUV(JL,JK)=PMFU(JL,JK)*(PVU(JL,JK)-PVEN(JL,IK)) ZMFDU(JL,JK)=PMFD(JL,JK)*(PUD(JL,JK)-PUEN(JL,IK)) ZMFDV(JL,JK)=PMFD(JL,JK)*(PVD(JL,JK)-PVEN(JL,IK)) END IF 110 CONTINUE 120 CONTINUE DO 140 JK=KTOPM2,KLEV DO 130 JL=1,KLON IF(LDCUM(JL).AND.JK.GT.KCBOT(JL)) THEN IKB=KCBOT(JL) ZZP=((PAPH(JL,KLEVP1)-PAPH(JL,JK))/ & (PAPH(JL,KLEVP1)-PAPH(JL,IKB))) IF(KTYPE(JL).EQ.3) THEN ZZP=ZZP**2 ENDIF ZMFUU(JL,JK)=ZMFUU(JL,IKB)*ZZP ZMFUV(JL,JK)=ZMFUV(JL,IKB)*ZZP ZMFDU(JL,JK)=ZMFDU(JL,IKB)*ZZP ZMFDV(JL,JK)=ZMFDV(JL,IKB)*ZZP END IF 130 CONTINUE 140 CONTINUE DO 150 JL=1,KLON ZDISS(JL)=0. 150 CONTINUE DO 190 JK=KTOPM2,KLEV IF(JK.LT.KLEV) THEN DO 160 JL=1,KLON IF(LDCUM(JL)) THEN ZDUDT=(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))* & (ZMFUU(JL,JK+1)-ZMFUU(JL,JK)+ & ZMFDU(JL,JK+1)-ZMFDU(JL,JK)) ZDVDT=(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))* & (ZMFUV(JL,JK+1)-ZMFUV(JL,JK)+ & ZMFDV(JL,JK+1)-ZMFDV(JL,JK)) ZDISS(JL)=ZDISS(JL)+ & PUEN(JL,JK)*(ZMFUU(JL,JK+1)-ZMFUU(JL,JK)+ & ZMFDU(JL,JK+1)-ZMFDU(JL,JK))+ & PVEN(JL,JK)*(ZMFUV(JL,JK+1)-ZMFUV(JL,JK)+ & ZMFDV(JL,JK+1)-ZMFDV(JL,JK)) PVOM(JL,JK)=PVOM(JL,JK)+ZDUDT PVOL(JL,JK)=PVOL(JL,JK)+ZDVDT END IF 160 CONTINUE ELSE DO 170 JL=1,KLON IF(LDCUM(JL)) THEN ZDUDT=-(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))* & (ZMFUU(JL,JK)+ZMFDU(JL,JK)) ZDVDT=-(G/(PAPH(JL,JK+1)-PAPH(JL,JK)))* & (ZMFUV(JL,JK)+ZMFDV(JL,JK)) ZDISS(JL)=ZDISS(JL)- & (PUEN(JL,JK)*(ZMFUU(JL,JK)+ZMFDU(JL,JK))+ & PVEN(JL,JK)*(ZMFUV(JL,JK)+ZMFDV(JL,JK))) PVOM(JL,JK)=PVOM(JL,JK)+ZDUDT PVOL(JL,JK)=PVOL(JL,JK)+ZDVDT END IF 170 CONTINUE END IF 190 CONTINUE ZSUM=SSUM(KLON,ZDISS(1),1) PSDISS=PSDISS+ZSUM RETURN END SUBROUTINE CUDUDV ! !################################################################# ! ! LEVEL 4 SUBROUTINES ! !################################################################# !************************************************************** ! SUBROUTINE CUBASMC !************************************************************** SUBROUTINE CUBASMC & 1 (KLON, KLEV, KLEVM1, KK, PTEN, & PQEN, PQSEN, PUEN, PVEN, PVERV, & PGEO, PGEOH, LDCUM, KTYPE, KLAB, & PMFU, PMFUB, PENTR, KCBOT, PTU, & PQU, PLU, PUU, PVU, PMFUS, & PMFUQ, PMFUL, PDMFUP, PMFUU, PMFUV) ! M.TIEDTKE E.C.M.W.F. 12/89 !***PURPOSE. ! -------- ! THIS ROUTINE CALCULATES CLOUD BASE VALUES ! FOR MIDLEVEL CONVECTION !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM *CUASC*. ! INPUT ARE ENVIRONMENTAL VALUES T,Q ETC ! IT RETURNS CLOUDBASE VALUES FOR MIDLEVEL CONVECTION !***METHOD. ! ------- ! S. TIEDTKE (1989) !***EXTERNALS ! --------- ! NONE ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER KLEVM1,KK, JL REAL zzzmb REAL PTEN(KLON,KLEV), PQEN(KLON,KLEV), & PUEN(KLON,KLEV), PVEN(KLON,KLEV), & PQSEN(KLON,KLEV), PVERV(KLON,KLEV), & PGEO(KLON,KLEV), PGEOH(KLON,KLEV) REAL PTU(KLON,KLEV), PQU(KLON,KLEV), & PUU(KLON,KLEV), PVU(KLON,KLEV), & PLU(KLON,KLEV), PMFU(KLON,KLEV), & PMFUB(KLON), PENTR(KLON), & PMFUS(KLON,KLEV), PMFUQ(KLON,KLEV), & PMFUL(KLON,KLEV), PDMFUP(KLON,KLEV), & PMFUU(KLON), PMFUV(KLON) INTEGER KTYPE(KLON), KCBOT(KLON), & KLAB(KLON,KLEV) LOGICAL LDCUM(KLON) !-------------------------------------------------------- !* 1. CALCULATE ENTRAINMENT AND DETRAINMENT RATES ! ------------------------------------------------------- 100 CONTINUE DO 150 JL=1,KLON IF( .NOT. LDCUM(JL).AND.KLAB(JL,KK+1).EQ.0.0.AND. & PQEN(JL,KK).GT.0.80*PQSEN(JL,KK)) THEN PTU(JL,KK+1)=(CPD*PTEN(JL,KK)+PGEO(JL,KK)-PGEOH(JL,KK+1)) & *RCPD PQU(JL,KK+1)=PQEN(JL,KK) PLU(JL,KK+1)=0. ZZZMB=MAX(CMFCMIN,-PVERV(JL,KK)/G) ZZZMB=MIN(ZZZMB,CMFCMAX) PMFUB(JL)=ZZZMB PMFU(JL,KK+1)=PMFUB(JL) PMFUS(JL,KK+1)=PMFUB(JL)*(CPD*PTU(JL,KK+1)+PGEOH(JL,KK+1)) PMFUQ(JL,KK+1)=PMFUB(JL)*PQU(JL,KK+1) PMFUL(JL,KK+1)=0. PDMFUP(JL,KK+1)=0. KCBOT(JL)=KK KLAB(JL,KK+1)=1 KTYPE(JL)=3 PENTR(JL)=ENTRMID IF(LMFDUDV) THEN PUU(JL,KK+1)=PUEN(JL,KK) PVU(JL,KK+1)=PVEN(JL,KK) PMFUU(JL)=PMFUB(JL)*PUU(JL,KK+1) PMFUV(JL)=PMFUB(JL)*PVU(JL,KK+1) END IF END IF 150 CONTINUE RETURN END SUBROUTINE CUBASMC ! !************************************************************** ! SUBROUTINE CUADJTQ !************************************************************** SUBROUTINE CUADJTQ(KLON,KLEV,KK,PP,PT,PQ,LDFLAG,KCALL) 7,8 ! M.TIEDTKE E.C.M.W.F. 12/89 ! D.SALMOND CRAY(UK)) 12/8/91 !***PURPOSE. ! -------- ! TO PRODUCE T,Q AND L VALUES FOR CLOUD ASCENT !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM SUBROUTINES: ! *CUBASE* (T AND Q AT CONDENSTION LEVEL) ! *CUASC* (T AND Q AT CLOUD LEVELS) ! *CUINI* (ENVIRONMENTAL T AND QS VALUES AT HALF LEVELS) ! INPUT ARE UNADJUSTED T AND Q VALUES, ! IT RETURNS ADJUSTED VALUES OF T AND Q ! NOTE: INPUT PARAMETER KCALL DEFINES CALCULATION AS ! KCALL=0 ENV. T AND QS IN*CUINI* ! KCALL=1 CONDENSATION IN UPDRAFTS (E.G. CUBASE, CUASC) ! KCALL=2 EVAPORATION IN DOWNDRAFTS (E.G. CUDLFS,CUDDRAF !***EXTERNALS ! --------- ! 3 LOOKUP TABLES ( TLUCUA, TLUCUB, TLUCUC ) ! FOR CONDENSATION CALCULATIONS. ! THE TABLES ARE INITIALISED IN *SETPHYS*. ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV INTEGER KK, KCALL, ISUM, JL REAL ZQSAT, ZCOR, ZCOND1, TT REAL PT(KLON,KLEV), PQ(KLON,KLEV), & ZCOND(KLON), ZQP(KLON), & PP(KLON) LOGICAL LDFLAG(KLON) !------------------------------------------------------------------ ! 2. CALCULATE CONDENSATION AND ADJUST T AND Q ACCORDINGLY !------------------------------------------------------------------ 200 CONTINUE IF (KCALL.EQ.1 ) THEN ISUM=0 DO 210 JL=1,KLON ZCOND(JL)=0. IF(LDFLAG(JL)) THEN ZQP(JL)=1./PP(JL) TT=PT(JL,KK) ZQSAT=TLUCUA(TT)*ZQP(JL) ZQSAT=MIN(0.5,ZQSAT) ZCOR=1./(1.-VTMPC1*ZQSAT) ZQSAT=ZQSAT*ZCOR ZCOND(JL)=(PQ(JL,KK)-ZQSAT)/(1.+ZQSAT*ZCOR*TLUCUB(TT)) ZCOND(JL)=MAX(ZCOND(JL),0.) PT(JL,KK)=PT(JL,KK)+TLUCUC(TT)*ZCOND(JL) PQ(JL,KK)=PQ(JL,KK)-ZCOND(JL) IF(ZCOND(JL).NE.0.0) ISUM=ISUM+1 END IF 210 CONTINUE IF(ISUM.EQ.0) GO TO 230 DO 220 JL=1,KLON IF(LDFLAG(JL).AND.ZCOND(JL).NE.0.) THEN TT=PT(JL,KK) ZQSAT=TLUCUA(TT)*ZQP(JL) ZQSAT=MIN(0.5,ZQSAT) ZCOR=1./(1.-VTMPC1*ZQSAT) ZQSAT=ZQSAT*ZCOR ZCOND1=(PQ(JL,KK)-ZQSAT)/(1.+ZQSAT*ZCOR*TLUCUB(TT)) PT(JL,KK)=PT(JL,KK)+TLUCUC(TT)*ZCOND1 PQ(JL,KK)=PQ(JL,KK)-ZCOND1 END IF 220 CONTINUE 230 CONTINUE END IF IF(KCALL.EQ.2) THEN ISUM=0 DO 310 JL=1,KLON ZCOND(JL)=0. IF(LDFLAG(JL)) THEN TT=PT(JL,KK) ZQP(JL)=1./PP(JL) ZQSAT=TLUCUA(TT)*ZQP(JL) ZQSAT=MIN(0.5,ZQSAT) ZCOR=1./(1.-VTMPC1*ZQSAT) ZQSAT=ZQSAT*ZCOR ZCOND(JL)=(PQ(JL,KK)-ZQSAT)/(1.+ZQSAT*ZCOR*TLUCUB(TT)) ZCOND(JL)=MIN(ZCOND(JL),0.) PT(JL,KK)=PT(JL,KK)+TLUCUC(TT)*ZCOND(JL) PQ(JL,KK)=PQ(JL,KK)-ZCOND(JL) IF(ZCOND(JL).NE.0.0) ISUM=ISUM+1 END IF 310 CONTINUE IF(ISUM.EQ.0) GO TO 330 DO 320 JL=1,KLON IF(LDFLAG(JL).AND.ZCOND(JL).NE.0.) THEN TT=PT(JL,KK) ZQSAT=TLUCUA(TT)*ZQP(JL) ZQSAT=MIN(0.5,ZQSAT) ZCOR=1./(1.-VTMPC1*ZQSAT) ZQSAT=ZQSAT*ZCOR ZCOND1=(PQ(JL,KK)-ZQSAT)/(1.+ZQSAT*ZCOR*TLUCUB(TT)) PT(JL,KK)=PT(JL,KK)+TLUCUC(TT)*ZCOND1 PQ(JL,KK)=PQ(JL,KK)-ZCOND1 END IF 320 CONTINUE 330 CONTINUE END IF IF(KCALL.EQ.0) THEN ISUM=0 DO 410 JL=1,KLON TT=PT(JL,KK) ZQP(JL)=1./PP(JL) ZQSAT=TLUCUA(TT)*ZQP(JL) ZQSAT=MIN(0.5,ZQSAT) ZCOR=1./(1.-VTMPC1*ZQSAT) ZQSAT=ZQSAT*ZCOR ZCOND(JL)=(PQ(JL,KK)-ZQSAT)/(1.+ZQSAT*ZCOR*TLUCUB(TT)) PT(JL,KK)=PT(JL,KK)+TLUCUC(TT)*ZCOND(JL) PQ(JL,KK)=PQ(JL,KK)-ZCOND(JL) IF(ZCOND(JL).NE.0.0) ISUM=ISUM+1 410 CONTINUE IF(ISUM.EQ.0) GO TO 430 DO 420 JL=1,KLON TT=PT(JL,KK) ZQSAT=TLUCUA(TT)*ZQP(JL) ZQSAT=MIN(0.5,ZQSAT) ZCOR=1./(1.-VTMPC1*ZQSAT) ZQSAT=ZQSAT*ZCOR ZCOND1=(PQ(JL,KK)-ZQSAT)/(1.+ZQSAT*ZCOR*TLUCUB(TT)) PT(JL,KK)=PT(JL,KK)+TLUCUC(TT)*ZCOND1 PQ(JL,KK)=PQ(JL,KK)-ZCOND1 420 CONTINUE 430 CONTINUE END IF IF(KCALL.EQ.4) THEN DO 510 JL=1,KLON TT=PT(JL,KK) ZQP(JL)=1./PP(JL) ZQSAT=TLUCUA(TT)*ZQP(JL) ZQSAT=MIN(0.5,ZQSAT) ZCOR=1./(1.-VTMPC1*ZQSAT) ZQSAT=ZQSAT*ZCOR ZCOND(JL)=(PQ(JL,KK)-ZQSAT)/(1.+ZQSAT*ZCOR*TLUCUB(TT)) PT(JL,KK)=PT(JL,KK)+TLUCUC(TT)*ZCOND(JL) PQ(JL,KK)=PQ(JL,KK)-ZCOND(JL) 510 CONTINUE DO 520 JL=1,KLON TT=PT(JL,KK) ZQSAT=TLUCUA(TT)*ZQP(JL) ZQSAT=MIN(0.5,ZQSAT) ZCOR=1./(1.-VTMPC1*ZQSAT) ZQSAT=ZQSAT*ZCOR ZCOND1=(PQ(JL,KK)-ZQSAT)/(1.+ZQSAT*ZCOR*TLUCUB(TT)) PT(JL,KK)=PT(JL,KK)+TLUCUC(TT)*ZCOND1 PQ(JL,KK)=PQ(JL,KK)-ZCOND1 520 CONTINUE END IF RETURN END SUBROUTINE CUADJTQ ! !********************************************************** ! SUBROUTINE CUENTR_NEW !********************************************************** SUBROUTINE CUENTR_NEW & 1,2 (KLON, KLEV, KLEVP1, KK, PTENH, & PAPH, PAP, PGEOH, KLWMIN, LDCUM, & KTYPE, KCBOT, KCTOP0, ZPBASE, PMFU, & PENTR, ZDMFEN, ZDMFDE, ZODETR, KHMIN) ! M.TIEDTKE E.C.M.W.F. 12/89 ! Y.WANG IPRC 11/01 !***PURPOSE. ! -------- ! THIS ROUTINE CALCULATES ENTRAINMENT/DETRAINMENT RATES ! FOR UPDRAFTS IN CUMULUS PARAMETERIZATION !***INTERFACE ! --------- ! THIS ROUTINE IS CALLED FROM *CUASC*. ! INPUT ARE ENVIRONMENTAL VALUES T,Q ETC ! AND UPDRAFT VALUES T,Q ETC ! IT RETURNS ENTRAINMENT/DETRAINMENT RATES !***METHOD. ! -------- ! S. TIEDTKE (1989), NORDENG(1996) !***EXTERNALS ! --------- ! NONE ! ---------------------------------------------------------------- !------------------------------------------------------------------- IMPLICIT NONE !------------------------------------------------------------------- INTEGER KLON, KLEV, KLEVP1 INTEGER KK, JL, IKLWMIN,IKB, IKT, IKH REAL ZRRHO, ZDPRHO, ZPMID, ZENTR, ZZMZK, ZTMZK, ARG, ZORGDE REAL PTENH(KLON,KLEV), & PAP(KLON,KLEV), PAPH(KLON,KLEVP1), & PMFU(KLON,KLEV), PGEOH(KLON,KLEV), & PENTR(KLON), ZPBASE(KLON), & ZDMFEN(KLON), ZDMFDE(KLON), & ZODETR(KLON,KLEV) INTEGER KLWMIN(KLON), KTYPE(KLON), & KCBOT(KLON), KCTOP0(KLON), & KHMIN(KLON) LOGICAL LDCUM(KLON),LLO1,LLO2 real tt(klon),ttb(klon) real zqsat(klon), zqsatb(klon) real fscale(klon) !--------------------------------------------------------- !* 1. CALCULATE ENTRAINMENT AND DETRAINMENT RATES !--------------------------------------------------------- !* 1.1 SPECIFY ENTRAINMENT RATES FOR SHALLOW CLOUDS !---------------------------------------------------------- !* 1.2 SPECIFY ENTRAINMENT RATES FOR DEEP CLOUDS !------------------------------------------------------- DO jl = 1, klon zpbase(jl) = paph(jl,kcbot(jl)) zrrho = (rd*ptenh(jl,kk+1))/paph(jl,kk+1) zdprho = (paph(jl,kk+1)-paph(jl,kk))*zrg ! old or new choice zpmid = 0.5*(zpbase(jl)+paph(jl,kctop0(jl))) zentr = pentr(jl)*pmfu(jl,kk+1)*zdprho*zrrho llo1 = kk.LT.kcbot(jl).AND.ldcum(jl) ! old or new choice if(llo1) then if(nturben.eq.1) zdmfde(jl) = zentr if(nturben.eq.2) zdmfde(jl) = zentr*1.2 else zdmfde(jl) = 0.0 endif ! old or new choice if(nturben .eq. 1) then fscale(jl) = 1.0 elseif (nturben .eq. 2) then ! defining the facale tt(jl) = ptenh(jl,kk+1) zqsat(jl) = TLUCUA(tt(jl))/paph(jl,kk+1) zqsat(jl) = zqsat(jl)/(1.-VTMPC1*zqsat(jl)) ttb(jl) = ptenh(jl,kcbot(jl)) zqsatb(jl) = TLUCUA(ttb(jl))/zpbase(jl) zqsatb(jl) = zqsatb(jl)/(1.-VTMPC1*zqsatb(jl)) fscale(jl) = 4.0*(zqsat(jl)/zqsatb(jl))**2 end if ! end of defining the fscale llo2 = llo1.AND.ktype(jl).EQ.2.AND.((zpbase(jl)-paph(jl,kk)) & .LT.ZDNOPRC.OR.paph(jl,kk).GT.zpmid) if(llo2) then zdmfen(jl) = zentr*fscale(jl) else zdmfen(jl) = 0.0 endif iklwmin = MAX(klwmin(jl),kctop0(jl)+2) llo2 = llo1.AND.ktype(jl).EQ.3.AND.(kk.GE.iklwmin.OR.pap(jl,kk) & .GT.zpmid) IF (llo2) zdmfen(jl) = zentr*fscale(jl) llo2 = llo1.AND.ktype(jl).EQ.1 ! Turbulent entrainment IF (llo2) zdmfen(jl) = zentr*fscale(jl) ! Organized detrainment, detrainment starts at khmin ikb = kcbot(jl) zodetr(jl,kk) = 0. IF (llo2.AND.kk.LE.khmin(jl).AND.kk.GE.kctop0(jl)) THEN ikt = kctop0(jl) ikh = khmin(jl) IF (ikh.GT.ikt) THEN zzmzk = -(pgeoh(jl,ikh)-pgeoh(jl,kk))*zrg ztmzk = -(pgeoh(jl,ikh)-pgeoh(jl,ikt))*zrg arg = 3.1415*(zzmzk/ztmzk)*0.5 zorgde = TAN(arg)*3.1415*0.5/ztmzk zdprho = (paph(jl,kk+1)-paph(jl,kk))*(zrg*zrrho) zodetr(jl,kk) = MIN(zorgde,1.E-3)*pmfu(jl,kk+1)*zdprho END IF END IF ENDDO ! RETURN END SUBROUTINE CUENTR_NEW !********************************************************** ! FUNCTION SSUM, TLUCUA, TLUCUB, TLUCUC !********************************************************** REAL FUNCTION SSUM ( N, X, IX ) 1 ! ! COMPUTES SSUM = SUM OF [X(I)] ! FOR N ELEMENTS OF X WITH SKIP INCREMENT IX FOR VECTOR X ! IMPLICIT NONE REAL X(*) REAL ZSUM INTEGER N, IX, JX, JL ! JX = 1 ZSUM = 0.0 DO JL = 1, N ZSUM = ZSUM + X(JX) JX = JX + IX enddo ! SSUM=ZSUM ! RETURN END FUNCTION SSUM REAL FUNCTION TLUCUA(TT) 15 ! ! Set up lookup tables for cloud ascent calculations. ! IMPLICIT NONE REAL ZCVM3,ZCVM4,TT ! IF(TT-TMELT.GT.0.) THEN ZCVM3=C3LES ZCVM4=C4LES ELSE ZCVM3=C3IES ZCVM4=C4IES END IF TLUCUA=C2ES*EXP(ZCVM3*(TT-TMELT)*(1./(TT-ZCVM4))) ! RETURN END FUNCTION TLUCUA ! REAL FUNCTION TLUCUB(TT) ! ! Set up lookup tables for cloud ascent calculations. ! IMPLICIT NONE REAL Z5ALVCP,Z5ALSCP,ZCVM4,ZCVM5,TT ! Z5ALVCP=C5LES*ALV/CPD Z5ALSCP=C5IES*ALS/CPD IF(TT-TMELT.GT.0.) THEN ZCVM4=C4LES ZCVM5=Z5ALVCP ELSE ZCVM4=C4IES ZCVM5=Z5ALSCP END IF TLUCUB=ZCVM5*(1./(TT-ZCVM4))**2 ! RETURN END FUNCTION TLUCUB ! REAL FUNCTION TLUCUC(TT) ! ! Set up lookup tables for cloud ascent calculations. ! IMPLICIT NONE REAL ZALVDCP,ZALSDCP,TT,ZLDCP ! ZALVDCP=ALV/CPD ZALSDCP=ALS/CPD IF(TT-TMELT.GT.0.) THEN ZLDCP=ZALVDCP ELSE ZLDCP=ZALSDCP END IF TLUCUC=ZLDCP ! RETURN END FUNCTION TLUCUC ! END MODULE module_cu_tiedtke