/[lmdze]/trunk/Sources/phylmd/concvl.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/concvl.f

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

trunk/libf/phylmd/concvl.f90 revision 72 by guez, Tue Jul 23 13:00:07 2013 UTC trunk/Sources/phylmd/concvl.f revision 178 by guez, Fri Mar 11 18:47:26 2016 UTC
# Line 4  module concvl_m Line 4  module concvl_m
4    
5  contains  contains
6    
7    SUBROUTINE concvl(dtime, paprs, play, t, q, u, v, tra, sig1, w01, &    SUBROUTINE concvl(dtime, paprs, play, t, q, u, v, sig1, w01, d_t, d_q, d_u, &
8         d_t, d_q, d_u, d_v, d_tra, rain, snow, kbas, ktop, upwd, dnwd, dnwd0, &         d_v, rain, snow, kbas, ktop, upwd, dnwd, dnwd0, ma, cape, iflag, &
9         ma, cape, tvp, iflag, pbase, bbase, dtvpdt1, dtvpdq1, dplcldt, &         qcondc, wd, pmflxr, pmflxs, da, phi, mp)
        dplcldr, qcondc, wd, pmflxr, pmflxs, da, phi, mp, ntra)  
10    
11      ! From phylmd/concvl.F, version 1.3 2005/04/15 12:36:17      ! From phylmd/concvl.F, version 1.3 2005/04/15 12:36:17
12      ! Author: Z. X. Li (LMD/CNRS)      ! Author: Z. X. Li (LMD/CNRS)
13      ! Date: 1993/08/18      ! Date: 1993 August 18
14      ! Objet : schéma de convection d'Emanuel (1991), interface      ! Objet : schéma de convection d'Emanuel (1991), interface
15      ! (driver commun aux versions 3 et 4)      ! (driver commun aux versions 3 et 4)
16    
17      use clesphys2, only: iflag_con      use clesphys2, only: iflag_con
18      use cv_driver_m, only: cv_driver      use cv_driver_m, only: cv_driver
     USE dimens_m, ONLY: nqmx  
19      USE dimphy, ONLY: klev, klon      USE dimphy, ONLY: klev, klon
20      USE fcttre, ONLY: foeew      USE fcttre, ONLY: foeew
21      USE suphec_m, ONLY: retv, rtt      USE suphec_m, ONLY: retv, rtt
22      USE yoethf_m, ONLY: r2es      USE yoethf_m, ONLY: r2es
23    
     INTEGER, PARAMETER:: ntrac = nqmx - 2  
   
24      REAL, INTENT (IN):: dtime ! pas d'integration (s)      REAL, INTENT (IN):: dtime ! pas d'integration (s)
25      REAL, INTENT (IN):: paprs(klon, klev+1)      REAL, INTENT (IN):: paprs(klon, klev+1)
26      REAL, INTENT (IN):: play(klon, klev)      REAL, INTENT (IN):: play(klon, klev)
27      REAL, intent(in):: t(klon, klev)      REAL, intent(in):: t(klon, klev)
28      real q(klon, klev) ! input vapeur d'eau (en kg/kg)      real, intent(in):: q(klon, klev) ! vapeur d'eau (en kg/kg)
29      real u(klon, klev), v(klon, klev)      real, INTENT (IN):: u(klon, klev), v(klon, klev)
     REAL, INTENT (IN):: tra(klon, klev, ntrac)  
     INTEGER, intent(in):: ntra ! number of tracers  
30      REAL, intent(inout):: sig1(klon, klev), w01(klon, klev)      REAL, intent(inout):: sig1(klon, klev), w01(klon, klev)
31      REAL pmflxr(klon, klev+1), pmflxs(klon, klev+1)      REAL, intent(out):: d_t(klon, klev)
32        REAL, intent(out):: d_q(klon, klev) ! increment de la vapeur d'eau
33      REAL d_t(klon, klev), d_q(klon, klev), d_u(klon, klev), d_v(klon, &      REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
34           klev)      REAL, intent(out):: rain(klon) ! pluie (mm/s)
35      ! d_q-----output-R-increment de la vapeur d'eau      REAL, intent(out):: snow(klon) ! neige (mm/s)
     REAL d_tra(klon, klev, ntrac)  
     REAL rain(klon), snow(klon)  
     ! rain----output-R-la pluie (mm/s)  
     ! snow----output-R-la neige (mm/s)  
   
36      INTEGER kbas(klon), ktop(klon)      INTEGER kbas(klon), ktop(klon)
     REAL em_ph(klon, klev+1), em_p(klon, klev)  
37    
38      REAL, intent(out):: upwd(klon, klev)      REAL, intent(out):: upwd(klon, klev)
39      ! saturated updraft mass flux (kg/m**2/s)      ! saturated updraft mass flux (kg/m**2/s)
# Line 56  contains Line 44  contains
44      real, intent(out):: dnwd0(klon, klev)      real, intent(out):: dnwd0(klon, klev)
45      ! unsaturated downdraft mass flux (kg/m**2/s)      ! unsaturated downdraft mass flux (kg/m**2/s)
46    
47      REAL ma(klon, klev), cape(klon), tvp(klon, klev)      REAL ma(klon, klev), cape(klon)
48      ! Cape----output-R-CAPE (J/kg)      ! Cape----output-R-CAPE (J/kg)
49      ! Tvp-----output-R-Temperature virtuelle d'une parcelle soulevee  
     !                  adiabatiquement a partir du niveau 1 (K)  
     REAL da(klon, klev), phi(klon, klev, klev), mp(klon, klev)  
50      INTEGER iflag(klon)      INTEGER iflag(klon)
     REAL pbase(klon), bbase(klon)  
     REAL dtvpdt1(klon, klev), dtvpdq1(klon, klev)  
     REAL dplcldt(klon), dplcldr(klon)  
51      REAL qcondc(klon, klev)      REAL qcondc(klon, klev)
52      REAL wd(klon)      REAL wd(klon)
53        REAL pmflxr(klon, klev+1), pmflxs(klon, klev+1)
54        REAL, intent(inout):: da(klon, klev), phi(klon, klev, klev), mp(klon, klev)
55    
56      REAL zx_t, zdelta, zx_qs, zcor      ! Local:
57    
58      INTEGER i, k, itra      REAL em_ph(klon, klev+1), em_p(klon, klev)
59        REAL zx_t, zx_qs, zcor
60        INTEGER i, k
61      REAL qs(klon, klev)      REAL qs(klon, klev)
62      REAL, save:: cbmf(klon)      REAL, save:: cbmf(klon)
63      INTEGER:: ifrst = 0      INTEGER:: ifrst = 0
# Line 104  contains Line 91  contains
91         DO k = 1, klev         DO k = 1, klev
92            DO i = 1, klon            DO i = 1, klon
93               zx_t = t(i, k)               zx_t = t(i, k)
94               zdelta = max(0., sign(1., rtt-zx_t))               zx_qs = min(0.5, r2es*foeew(zx_t, rtt >= zx_t)/em_p(i, k)/100.0)
              zx_qs = min(0.5, r2es*foeew(zx_t, zdelta)/em_p(i, k)/100.0)  
95               zcor = 1./(1.-retv*zx_qs)               zcor = 1./(1.-retv*zx_qs)
96               qs(i, k) = zx_qs*zcor               qs(i, k) = zx_qs*zcor
97            END DO            END DO
98         END DO         END DO
99      ELSE      ELSE
100         ! iflag_con=3 (modif de puristes qui fait la diffce pour la         ! iflag_con=3 (modification de puristes qui fait la
101         ! convergence numerique)         ! diff\'erence pour la convergence numerique)
102         DO k = 1, klev         DO k = 1, klev
103            DO i = 1, klon            DO i = 1, klon
104               zx_t = t(i, k)               zx_t = t(i, k)
105               zdelta = max(0., sign(1., rtt-zx_t))               zx_qs = r2es*foeew(zx_t, rtt >= zx_t)/em_p(i, k)/100.0
              zx_qs = r2es*foeew(zx_t, zdelta)/em_p(i, k)/100.0  
106               zx_qs = min(0.5, zx_qs)               zx_qs = min(0.5, zx_qs)
107               zcor = 1./(1.-retv*zx_qs)               zcor = 1./(1.-retv*zx_qs)
108               zx_qs = zx_qs*zcor               zx_qs = zx_qs*zcor
# Line 126  contains Line 111  contains
111         END DO         END DO
112      END IF      END IF
113    
114      CALL cv_driver(klon, klev, klev+1, ntra, t, q, qs, u, v, tra, em_p, &      CALL cv_driver(t, q, qs, u, v, em_p, em_ph, iflag, d_t, d_q, d_u, d_v, &
115           em_ph, iflag, d_t, d_q, d_u, d_v, d_tra, rain, pmflxr, cbmf, sig1, &           rain, pmflxr, cbmf, sig1, w01, kbas, ktop, dtime, ma, upwd, dnwd, &
116           w01, kbas, ktop, dtime, ma, upwd, dnwd, dnwd0, qcondc, wd, cape, &           dnwd0, qcondc, wd, cape, da, phi, mp)
          da, phi, mp)  
117    
118      DO i = 1, klon      DO i = 1, klon
119         rain(i) = rain(i)/86400.         rain(i) = rain(i)/86400.
# Line 143  contains Line 127  contains
127            d_v(i, k) = dtime*d_v(i, k)            d_v(i, k) = dtime*d_v(i, k)
128         END DO         END DO
129      END DO      END DO
     DO itra = 1, ntra  
        DO k = 1, klev  
           DO i = 1, klon  
              d_tra(i, k, itra) = dtime*d_tra(i, k, itra)  
           END DO  
        END DO  
     END DO  
     ! les traceurs ne sont pas mis dans cette version de convect4:  
     IF (iflag_con==4) THEN  
        DO itra = 1, ntra  
           DO k = 1, klev  
              DO i = 1, klon  
                 d_tra(i, k, itra) = 0.  
              END DO  
           END DO  
        END DO  
     END IF  
130    
131    END SUBROUTINE concvl    END SUBROUTINE concvl
132    

Legend:
Removed from v.72  
changed lines
  Added in v.178

  ViewVC Help
Powered by ViewVC 1.1.21