!+ produce t,q and l values for cloud ascent !+ $Id: cuadjtq.f90,v 1.11 1999/10/01 13:09:46 m214003 Exp $ !#define DEBUG 5: SUBROUTINE cuadjtq(klp2,klon,klev,kk,pp,pt,pq,ldflag,kcall) ! Description: ! 10: ! Produce t,q and l values for cloud ascent ! ! Method: ! ! This routine is called from subroutines: 15: ! *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 20: ! 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) ! 25: ! Externals: ! 3 lookup tables ( tlucua, tlucub, tlucuc ) ! for condensation calculations. ! the tables are initialised in *setphys*. ! 30: ! Authors: ! ! M. Tiedtke, ECMWF, December 1989, original source ! D. Salmond, CRAY(UK), August 1991, changed ! L. Kornblueh, MPI, May 1998, f90 rewrite 35: ! U. Schulzweida, MPI, May 1998, f90 rewrite ! A. Rhodin, MPI, December 1998, lookup tables removed ! ! for more details see file AUTHORS ! 40: USE mo_constants, ONLY: alsdcp, alvdcp, c2es, c3ies, c3les, c4ies, & c4les, c5alscp, c5alvcp, vtmpc1, tmelt #ifndef NOLOOKUP USE mo_convect_tables, ONLY: tlucua, & ! table a 45: tlucub, & ! table b tlucuc, & ! table c jptlucu1, jptlucu2 #endif 50: IMPLICIT NONE ! Scalar arguments with intent(In): INTEGER, INTENT (IN) :: kcall, kk, klev, klon, klp2 55: ! Array arguments with intent(In): REAL, INTENT (IN) :: pp(klp2) LOGICAL, INTENT (IN) :: ldflag(klp2) ! Array arguments with intent(InOut): 60: REAL, INTENT (INOUT) :: pq(klp2,klev), pt(klp2,klev) ! Local scalars: REAL :: zcond1, zcor, zqsat INTEGER :: isum, jl 65: #ifndef NOLOOKUP INTEGER :: it #else LOGICAL :: lo #endif 70: ! Local arrays: REAL :: zcond(klp2), zqp(klp2) ! Intrinsic functions 75: INTRINSIC MAX, MIN #ifndef NOLOOKUP INTRINSIC INT #endif 80: ! Executable statements ! 1. Calculate condensation and adjust t and q accordingly zcond = 0. 85: IF (kcall==1) THEN isum = 0 !DIR$ IVDEP !OCL NOVREC 90: DO jl = 1, klon IF (ldflag(jl)) THEN zqp(jl) = 1./pp(jl) #ifndef NOLOOKUP it = INT(pt(jl,kk)*1000.) 95: #ifdef DEBUG IF (it<jptlucu1 .OR. it>jptlucu2) THEN WRITE(*,*) 'cuadjtq: 1 it=',it,jl,kk END IF #endif 100: it = MAX(MIN(it,jptlucu2),jptlucu1) zqsat = tlucua(it)*zqp(jl) zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor 105: zcond(jl) = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor*tlucub(it)) zcond(jl) = MAX(zcond(jl),0.) pt(jl,kk) = pt(jl,kk) + tlucuc(it)*zcond(jl) #else lo = pt(jl,kk) > tmelt 110: zqsat = c2es*EXP(MERGE(c3les,c3ies,lo)*(pt(jl,kk)-tmelt) & / (pt(jl,kk)-MERGE(c4les,c4ies,lo)))*zqp(jl) zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor 115: zcond(jl) = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor & * (MERGE(c5alvcp,c5alscp,lo) / (pt(jl,kk)-MERGE(c4les,c4ies,lo))**2)) zcond(jl) = MAX(zcond(jl),0.) pt(jl,kk) = pt(jl,kk) + MERGE(alvdcp, alsdcp, lo)*zcond(jl) #endif 120: pq(jl,kk) = pq(jl,kk) - zcond(jl) IF (ABS(zcond(jl)) > 0.) isum = isum + 1 END IF END DO 125: IF (isum/=0) THEN !DIR$ IVDEP !OCL NOVREC DO jl = 1, klon IF (ldflag(jl) .AND. ABS(zcond(jl)) > 0.) THEN 130: #ifndef NOLOOKUP it = INT(pt(jl,kk)*1000.) #ifdef DEBUG IF (it<jptlucu1 .OR. it>jptlucu2) THEN WRITE(*,*) 'cuadjtq: 2 it=',it,jl,kk 135: END IF #endif it = MAX(MIN(it,jptlucu2),jptlucu1) zqsat = tlucua(it)*zqp(jl) zqsat = MIN(0.5,zqsat) 140: zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond1 = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor*tlucub(it)) pt(jl,kk) = pt(jl,kk) + tlucuc(it)*zcond1 #else 145: lo = pt(jl,kk) > tmelt zqsat = c2es*EXP(MERGE(c3les,c3ies,lo)*(pt(jl,kk)-tmelt) & / (pt(jl,kk)-MERGE(c4les,c4ies,lo)))*zqp(jl) zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) 150: zqsat = zqsat*zcor zcond1 = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor & * (MERGE(c5alvcp,c5alscp,lo) / (pt(jl,kk)-MERGE(c4les,c4ies,lo))**2) ) pt(jl,kk) = pt(jl,kk) + MERGE(alvdcp, alsdcp, lo) * zcond1 #endif 155: pq(jl,kk) = pq(jl,kk) - zcond1 END IF END DO END IF 160: END IF IF (kcall==2) THEN isum = 0 165: !DIR$ IVDEP !OCL NOVREC DO jl = 1, klon IF (ldflag(jl)) THEN zqp(jl) = 1./pp(jl) 170: #ifndef NOLOOKUP it = INT(pt(jl,kk)*1000.) #ifdef DEBUG IF (it<jptlucu1 .OR. it>jptlucu2) THEN WRITE(*,*) 'cuadjtq: 3 it=',it,jl,kk 175: END IF #endif it = MAX(MIN(it,jptlucu2),jptlucu1) zqsat = tlucua(it)*zqp(jl) zqsat = MIN(0.5,zqsat) 180: zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond(jl) = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor*tlucub(it)) zcond(jl) = MIN(zcond(jl),0.) pt(jl,kk) = pt(jl,kk) + tlucuc(it)*zcond(jl) 185: #else lo = pt(jl,kk) > tmelt zqsat = c2es*EXP(MERGE(c3les,c3ies,lo)*(pt(jl,kk)-tmelt) & / (pt(jl,kk)-MERGE(c4les,c4ies,lo))) *zqp(jl) zqsat = MIN(0.5,zqsat) 190: zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond(jl) = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor & * (MERGE(c5alvcp,c5alscp,lo) / (pt(jl,kk)-MERGE(c4les,c4ies,lo))**2)) zcond(jl) = MIN(zcond(jl),0.) 195: pt(jl,kk) = pt(jl,kk) + MERGE(alvdcp, alsdcp, lo) * zcond(jl) #endif pq(jl,kk) = pq(jl,kk) - zcond(jl) IF (ABS(zcond(jl)) > 0.) isum = isum + 1 END IF 200: END DO IF (isum/=0) THEN !DIR$ IVDEP !OCL NOVREC 205: DO jl = 1, klon IF (ldflag(jl) .AND. ABS(zcond(jl)) > 0.) THEN #ifndef NOLOOKUP it = INT(pt(jl,kk)*1000.) #ifdef DEBUG 210: IF (it<jptlucu1 .OR. it>jptlucu2) THEN WRITE(*,*) 'cuadjtq: 4 it=',it,jl,kk END IF #endif it = MAX(MIN(it,jptlucu2),jptlucu1) 215: zqsat = tlucua(it)*zqp(jl) zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond1 = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor*tlucub(it)) 220: pt(jl,kk) = pt(jl,kk) + tlucuc(it)*zcond1 #else lo = pt(jl,kk) > tmelt zqsat = c2es*EXP(MERGE(c3les,c3ies,lo)*(pt(jl,kk)-tmelt) & / (pt(jl,kk)-MERGE(c4les,c4ies,lo))) *zqp(jl) 225: zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond1 = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor & * (MERGE(c5alvcp,c5alscp,lo) / (pt(jl,kk)-MERGE(c4les,c4ies,lo))**2)) 230: pt(jl,kk) = pt(jl,kk) + MERGE(alvdcp, alsdcp, lo) *zcond1 #endif pq(jl,kk) = pq(jl,kk) - zcond1 END IF END DO 235: END IF END IF IF (kcall==0) THEN 240: isum = 0 !DIR$ IVDEP !OCL NOVREC DO jl = 1, klon 245: zqp(jl) = 1./pp(jl) #ifndef NOLOOKUP it = INT(pt(jl,kk)*1000.) #ifdef DEBUG IF (it<jptlucu1 .OR. it>jptlucu2) THEN 250: WRITE(*,*) 'cuadjtq: 5 it=',it,jl,kk END IF #endif it = MAX(MIN(it,jptlucu2),jptlucu1) zqsat = tlucua(it)*zqp(jl) 255: zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond(jl) = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor*tlucub(it)) pt(jl,kk) = pt(jl,kk) + tlucuc(it)*zcond(jl) 260: #else lo = pt(jl,kk) > tmelt zqsat = c2es*EXP(MERGE(c3les,c3ies,lo)*(pt(jl,kk)-tmelt) & / (pt(jl,kk)-MERGE(c4les,c4ies,lo))) *zqp(jl) zqsat = MIN(0.5,zqsat) 265: zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond(jl) = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor & * (MERGE(c5alvcp,c5alscp,lo) / (pt(jl,kk)-MERGE(c4les,c4ies,lo))**2)) pt(jl,kk) = pt(jl,kk) + MERGE(alvdcp, alsdcp, lo)*zcond(jl) 270: #endif pq(jl,kk) = pq(jl,kk) - zcond(jl) IF (ABS(zcond(jl)) > 0.) isum = isum + 1 END DO 275: IF (isum/=0) THEN !DIR$ IVDEP !OCL NOVREC DO jl = 1, klon #ifndef NOLOOKUP 280: it = INT(pt(jl,kk)*1000.) #ifdef DEBUG IF (it<jptlucu1 .OR. it>jptlucu2) THEN WRITE(*,*) 'cuadjtq: 6 it=',it,jl,kk END IF 285: #endif it = MAX(MIN(it,jptlucu2),jptlucu1) zqsat = tlucua(it)*zqp(jl) zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) 290: zqsat = zqsat*zcor zcond1 = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor*tlucub(it)) pt(jl,kk) = pt(jl,kk) + tlucuc(it)*zcond1 #else lo = pt(jl,kk) > tmelt 295: zqsat = c2es*EXP(MERGE(c3les,c3ies,lo)*(pt(jl,kk)-tmelt) & / (pt(jl,kk)-MERGE(c4les,c4ies,lo)))*zqp(jl) zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor 300: zcond1 = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor & * (MERGE(c5alvcp,c5alscp,lo) / (pt(jl,kk)-MERGE(c4les,c4ies,lo))**2)) pt(jl,kk) = pt(jl,kk) + MERGE(alvdcp, alsdcp, lo) * zcond1 #endif pq(jl,kk) = pq(jl,kk) - zcond1 305: END DO END IF END IF 310: IF (kcall==4) THEN !DIR$ IVDEP !OCL NOVREC DO jl = 1, klon 315: zqp(jl) = 1./pp(jl) #ifndef NOLOOKUP it = INT(pt(jl,kk)*1000.) #ifdef DEBUG IF (it<jptlucu1 .OR. it>jptlucu2) THEN 320: WRITE(*,*) 'cuadjtq: 7 it=',it,jl,kk END IF #endif it = MAX(MIN(it,jptlucu2),jptlucu1) zqsat = tlucua(it)*zqp(jl) 325: zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond(jl) = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor*tlucub(it)) pt(jl,kk) = pt(jl,kk) + tlucuc(it)*zcond(jl) 330: #else lo = pt(jl,kk) > tmelt zqsat = c2es*EXP(MERGE(c3les,c3ies,lo)*(pt(jl,kk)-tmelt) & / (pt(jl,kk)-MERGE(c4les,c4ies,lo)))*zqp(jl) zqsat = MIN(0.5,zqsat) 335: zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond(jl) = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor & * (MERGE(c5alvcp,c5alscp,lo) / (pt(jl,kk)-MERGE(c4les,c4ies,lo))**2)) pt(jl,kk) = pt(jl,kk) + MERGE(alvdcp, alsdcp, lo) * zcond(jl) 340: #endif pq(jl,kk) = pq(jl,kk) - zcond(jl) END DO !DIR$ IVDEP 345: !OCL NOVREC DO jl = 1, klon #ifndef NOLOOKUP it = INT(pt(jl,kk)*1000.) #ifdef DEBUG 350: IF (it<jptlucu1 .OR. it>jptlucu2) THEN WRITE(*,*) 'cuadjtq: 8 it=',it,jl,kk END IF #endif it = MAX(MIN(it,jptlucu2),jptlucu1) 355: zqsat = tlucua(it)*zqp(jl) zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond1 = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor*tlucub(it)) 360: pt(jl,kk) = pt(jl,kk) + tlucuc(it)*zcond1 #else lo = pt(jl,kk) > tmelt zqsat = c2es*EXP(MERGE(c3les,c3ies,lo)*(pt(jl,kk)-tmelt) & / (pt(jl,kk)-MERGE(c4les,c4ies,lo)))*zqp(jl) 365: zqsat = MIN(0.5,zqsat) zcor = 1./(1.-vtmpc1*zqsat) zqsat = zqsat*zcor zcond1 = (pq(jl,kk)-zqsat)/(1.+zqsat*zcor & * (MERGE(c5alvcp,c5alscp,lo) / (pt(jl,kk)-MERGE(c4les,c4ies,lo))**2)) 370: pt(jl,kk) = pt(jl,kk) + MERGE(alvdcp, alsdcp, lo) * zcond1 #endif pq(jl,kk) = pq(jl,kk) - zcond1 END DO 375: END IF RETURN END SUBROUTINE cuadjtqback to top
Info Section uses: mo_constants, mo_convect_tables
HTML derived from FORTRAN source by f2html.pl v0.3 (C) 1997,98 Beroud Jean-Marc.