/[lmdze]/trunk/phylmd/Conflx/flxddraf.f
ViewVC logotype

Diff of /trunk/phylmd/Conflx/flxddraf.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 76 by guez, Fri Nov 15 18:45:49 2013 UTC revision 78 by guez, Wed Feb 5 17:51:07 2014 UTC
# Line 1  Line 1 
1        SUBROUTINE flxddraf(ptenh, pqenh, pgeoh, paph, prfl, &  module flxddraf_m
2                   ptd, pqd, pmfd, pmfds, pmfdq, pdmfdp, &  
3                   lddraf, pen_d, pde_d)    IMPLICIT none
4        use dimens_m  
5        use dimphy  contains
6        use flxadjtq_m, only: flxadjtq  
7        use SUPHEC_M    SUBROUTINE flxddraf(ptenh, pqenh, pgeoh, paph, prfl, ptd, pqd, pmfd, pmfds, &
8        use yoethf_m         pmfdq, pdmfdp, lddraf, pen_d, pde_d)
9              use yoecumf  
10        IMPLICIT none      ! This routine calculates cumulus downdraft descent
11  !  
12  !----------------------------------------------------------------------      ! To produce the vertical profiles for cumulus downdrafts
13  !          THIS ROUTINE CALCULATES CUMULUS DOWNDRAFT DESCENT      ! (i.e. T, q, u and v and fluxes)
14  !  
15  !          TO PRODUCE THE VERTICAL PROFILES FOR CUMULUS DOWNDRAFTS      ! Input is T, q, p, Phi, u, v at half levels.
16  !          (I.E. T,Q,U AND V AND FLUXES)      ! It returns fluxes of s, q and evaporation rate
17  !      ! and u, v at levels where downdraft occurs
18  !          INPUT IS T,Q,P,PHI,U,V AT HALF LEVELS.  
19  !          IT RETURNS FLUXES OF S,Q AND EVAPORATION RATE      ! Calculate moist descent for entraining/detraining plume by
20  !          AND U,V AT LEVELS WHERE DOWNDRAFT OCCURS      ! A) moving air dry-adiabatically to next level below and
21  !      ! B) correcting for evaporation to obtain saturated state.
22  !          CALCULATE MOIST DESCENT FOR ENTRAINING/DETRAINING PLUME BY  
23  !          A) MOVING AIR DRY-ADIABATICALLY TO NEXT LEVEL BELOW AND      USE dimphy, ONLY: klev, klon
24  !          B) CORRECTING FOR EVAPORATION TO OBTAIN SATURATED STATE.      USE flxadjtq_m, ONLY: flxadjtq
25  !      USE suphec_m, ONLY: rcpd, rd, retv, rg
26  !----------------------------------------------------------------------      USE yoecumf, ONLY: cmfcmin, entrdd
27  !  
28        REAL ptenh(klon,klev), pqenh(klon,klev)      REAL ptenh(klon, klev), pqenh(klon, klev)
29        REAL pgeoh(klon,klev), paph(klon,klev+1)      REAL, intent(in):: pgeoh(klon, klev), paph(klon, klev + 1)
30  !      REAL prfl(klon)
31        REAL ptd(klon,klev), pqd(klon,klev)      REAL ptd(klon, klev), pqd(klon, klev)
32        REAL pmfd(klon,klev), pmfds(klon,klev), pmfdq(klon,klev)      REAL pmfd(klon, klev), pmfds(klon, klev), pmfdq(klon, klev)
33        REAL pdmfdp(klon,klev)      REAL pdmfdp(klon, klev)
34        REAL prfl(klon)      LOGICAL lddraf(klon)
35        LOGICAL lddraf(klon)      REAL pen_d(klon, klev), pde_d(klon, klev)
36  !  
37        REAL pen_d(klon,klev), pde_d(klon,klev), zcond(klon)      ! Local:
38        LOGICAL llo2(klon), llo1      real zcond(klon)
39        INTEGER i, k, is, icall, itopde      LOGICAL llo2(klon), llo1
40        REAL zentr, zseen, zqeen, zsdde, zqdde, zmfdsk, zmfdqk, zdmfdp      INTEGER i, k, is, icall, itopde
41        REAL zbuo      REAL zentr, zseen, zqeen, zsdde, zqdde, zmfdsk, zmfdqk, zdmfdp
42  !----------------------------------------------------------------------      REAL zbuo
43  ! CALCULATE MOIST DESCENT FOR CUMULUS DOWNDRAFT BY  
44  !       (A) CALCULATING ENTRAINMENT RATES, ASSUMING      !----------------------------------------------------------------------
45  !           LINEAR DECREASE OF MASSFLUX IN PBL  
46  !       (B) DOING MOIST DESCENT - EVAPORATIVE COOLING      ! Calculate moist descent for cumulus downdraft by
47  !           AND MOISTENING IS CALCULATED IN *flxadjtq*  
48  !       (C) CHECKING FOR NEGATIVE BUOYANCY AND      ! (A) calculating entrainment rates, assuming linear decrease of
49  !           SPECIFYING FINAL T,Q,U,V AND DOWNWARD FLUXES      ! massflux in PBL
50  !  
51        DO 180 k = 3, klev      ! (B) doing moist descent - evaporative cooling and moistening is
52  !      ! calculated in flxadjtq
53        is = 0  
54        DO i = 1, klon      ! (C) checking for negative buoyancy and specifying final T, q, u,
55           llo2(i)=lddraf(i).AND.pmfd(i,k-1).LT.0.      ! v and downward fluxes
56           IF (llo2(i)) is = is + 1  
57        ENDDO      DO k = 3, klev
58        IF (is.EQ.0) GOTO 180         is = 0
59  !         DO i = 1, klon
60        DO i = 1, klon            llo2(i)=lddraf(i).AND.pmfd(i, k-1).LT.0.
61        IF (llo2(i)) THEN            IF (llo2(i)) is = is + 1
62           zentr = ENTRDD*pmfd(i,k-1)*RD*ptenh(i,k-1)/ &         ENDDO
63                   (RG*paph(i,k-1))*(paph(i,k)-paph(i,k-1))         IF (is.EQ.0) cycle
64           pen_d(i,k) = zentr  
65           pde_d(i,k) = zentr         DO i = 1, klon
66        ENDIF            IF (llo2(i)) THEN
67        ENDDO               zentr = ENTRDD*pmfd(i, k-1)*RD*ptenh(i, k-1)/ &
68  !                    (RG*paph(i, k-1))*(paph(i, k)-paph(i, k-1))
69        itopde = klev-2               pen_d(i, k) = zentr
70        IF (k.GT.itopde) THEN               pde_d(i, k) = zentr
71           DO i = 1, klon            ENDIF
72           IF (llo2(i)) THEN         ENDDO
73              pen_d(i,k)=0.  
74              pde_d(i,k)=pmfd(i,itopde)* &         itopde = klev-2
75              (paph(i,k)-paph(i,k-1))/(paph(i,klev+1)-paph(i,itopde))         IF (k.GT.itopde) THEN
76           ENDIF            DO i = 1, klon
77           ENDDO               IF (llo2(i)) THEN
78        ENDIF                  pen_d(i, k)=0.
79  !                  pde_d(i, k) = pmfd(i, itopde) * (paph(i, k) - paph(i, k - 1)) &
80        DO i = 1, klon                       / (paph(i, klev + 1) - paph(i, itopde))
81        IF (llo2(i)) THEN               ENDIF
82           pmfd(i,k) = pmfd(i,k-1)+pen_d(i,k)-pde_d(i,k)            ENDDO
83           zseen = (RCPD*ptenh(i,k-1)+pgeoh(i,k-1))*pen_d(i,k)         ENDIF
84           zqeen = pqenh(i,k-1)*pen_d(i,k)  
85           zsdde = (RCPD*ptd(i,k-1)+pgeoh(i,k-1))*pde_d(i,k)         DO i = 1, klon
86           zqdde = pqd(i,k-1)*pde_d(i,k)            IF (llo2(i)) THEN
87           zmfdsk = pmfds(i,k-1)+zseen-zsdde               pmfd(i, k) = pmfd(i, k-1) + pen_d(i, k)-pde_d(i, k)
88           zmfdqk = pmfdq(i,k-1)+zqeen-zqdde               zseen = (RCPD*ptenh(i, k-1) + pgeoh(i, k-1))*pen_d(i, k)
89           pqd(i,k) = zmfdqk*(1./MIN(-CMFCMIN,pmfd(i,k)))               zqeen = pqenh(i, k-1)*pen_d(i, k)
90           ptd(i,k) = (zmfdsk*(1./MIN(-CMFCMIN,pmfd(i,k)))- &               zsdde = (RCPD*ptd(i, k-1) + pgeoh(i, k-1))*pde_d(i, k)
91                       pgeoh(i,k))/RCPD               zqdde = pqd(i, k-1)*pde_d(i, k)
92           ptd(i,k) = MIN(400.,ptd(i,k))               zmfdsk = pmfds(i, k-1) + zseen-zsdde
93           ptd(i,k) = MAX(100.,ptd(i,k))               zmfdqk = pmfdq(i, k-1) + zqeen-zqdde
94           zcond(i) = pqd(i,k)               pqd(i, k) = zmfdqk*(1./MIN(-CMFCMIN, pmfd(i, k)))
95        ENDIF               ptd(i, k) = (zmfdsk*(1./MIN(-CMFCMIN, pmfd(i, k)))- &
96        ENDDO                    pgeoh(i, k))/RCPD
97  !               ptd(i, k) = MIN(400., ptd(i, k))
98        icall = 2               ptd(i, k) = MAX(100., ptd(i, k))
99        CALL flxadjtq(paph(1,k), ptd(1,k), pqd(1,k), llo2, icall)               zcond(i) = pqd(i, k)
100  !            ENDIF
101        DO i = 1, klon         ENDDO
102        IF (llo2(i)) THEN  
103           zcond(i) = zcond(i)-pqd(i,k)         icall = 2
104           zbuo = ptd(i,k)*(1.+RETV  *pqd(i,k))- &         CALL flxadjtq(paph(:, k), ptd(1, k), pqd(1, k), llo2, icall)
105                  ptenh(i,k)*(1.+RETV  *pqenh(i,k))  
106           llo1 = zbuo.LT.0..AND.(prfl(i)-pmfd(i,k)*zcond(i).GT.0.)         DO i = 1, klon
107           IF (.not.llo1) pmfd(i,k) = 0.0            IF (llo2(i)) THEN
108           pmfds(i,k) = (RCPD*ptd(i,k)+pgeoh(i,k))*pmfd(i,k)               zcond(i) = zcond(i)-pqd(i, k)
109           pmfdq(i,k) = pqd(i,k)*pmfd(i,k)               zbuo = ptd(i, k)*(1. + RETV *pqd(i, k))- &
110           zdmfdp = -pmfd(i,k)*zcond(i)                    ptenh(i, k)*(1. + RETV *pqenh(i, k))
111           pdmfdp(i,k-1) = zdmfdp               llo1 = zbuo.LT.0..AND.(prfl(i)-pmfd(i, k)*zcond(i).GT.0.)
112           prfl(i) = prfl(i)+zdmfdp               IF (.not.llo1) pmfd(i, k) = 0.0
113        ENDIF               pmfds(i, k) = (RCPD*ptd(i, k) + pgeoh(i, k))*pmfd(i, k)
114        ENDDO               pmfdq(i, k) = pqd(i, k)*pmfd(i, k)
115  !               zdmfdp = -pmfd(i, k)*zcond(i)
116    180 CONTINUE               pdmfdp(i, k-1) = zdmfdp
117        RETURN               prfl(i) = prfl(i) + zdmfdp
118        END            ENDIF
119           ENDDO
120        end DO
121    
122      END SUBROUTINE flxddraf
123    
124    end module flxddraf_m

Legend:
Removed from v.76  
changed lines
  Added in v.78

  ViewVC Help
Powered by ViewVC 1.1.21