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

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

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

trunk/libf/phylmd/Conflx/conflx.f90 revision 62 by guez, Thu Jul 26 14:37:37 2012 UTC trunk/phylmd/Conflx/conflx.f revision 82 by guez, Wed Mar 5 14:57:53 2014 UTC
# Line 4  module conflx_m Line 4  module conflx_m
4    
5  contains  contains
6    
7    SUBROUTINE conflx (dtime, pres_h, pres_f, t, q, con_t, con_q, pqhfl, w, &    SUBROUTINE conflx (dtime, pres_h, pres_f, t, q, con_t, con_q, qhfl, w, &
8         d_t, d_q, rain, snow, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, kcbot, &         d_t, d_q, rain, snow, mfu, mfd, pen_u, pde_u, pen_d, pde_d, kcbot, &
9         kctop, kdtop, pmflxr, pmflxs)         kctop, kdtop, pmflxr, pmflxs)
10    
11      ! From LMDZ4/libf/phylmd/conflx.F, version 1.1.1.1 2004/05/19 12:53:08      ! From LMDZ4/libf/phylmd/conflx.F, version 1.1.1.1 2004/05/19 12:53:08
12    
13      ! Author: Z. X. Li (LMD/CNRS)      ! Author: Z. X. Li (LMD/CNRS)
14      ! date: 1994/10/14      ! Date: 1994/10/14
15    
16      ! Objet: schéma flux de masse pour la convection (schéma de      ! Objet: schéma en flux de masse pour la convection (schéma de
17      ! Tiedtke avec quelques modifications mineures)      ! Tiedtke avec quelques modifications mineures)
18    
19      ! Décembre 1997 : prise en compte des modifications introduites      ! Décembre 1997 : prise en compte des modifications introduites
20      ! par Olivier Boucher et Alexandre Armengaud pour mélange et      ! par Olivier Boucher et Alexandre Armengaud pour le mélange et le
21      ! lessivage des traceurs passifs.      ! lessivage des traceurs passifs.
22    
23      use flxmain_m, only: flxmain      use flxmain_m, only: flxmain
# Line 26  contains Line 26  contains
26      USE yoethf_m, ONLY: r2es      USE yoethf_m, ONLY: r2es
27      USE fcttre, ONLY: foeew      USE fcttre, ONLY: foeew
28    
29      ! Entree:      REAL, intent(in):: dtime ! pas d'integration (s)
30      REAL, intent(in):: dtime            ! pas d'integration (s)      REAL, intent(in):: pres_h(:, :) ! (klon, klev + 1) pression half-level (Pa)
31      REAL, intent(in):: pres_h(klon, klev+1) ! pression half-level (Pa)      REAL, intent(in):: pres_f(:, :) ! (klon, klev) pression full-level (Pa)
32      REAL, intent(in):: pres_f(klon, klev)! pression full-level (Pa)      REAL, intent(in):: t(:, :) ! (klon, klev) temperature (K)
33      REAL, intent(in):: t(klon, klev)     ! temperature (K)      REAL, intent(in):: q(:, :) ! (klon, klev) humidité spécifique (no dimension)
34      REAL q(klon, klev)     ! humidite specifique (g/g)  
35      REAL w(klon, klev)     ! vitesse verticale (Pa/s)      REAL, intent(in):: con_t(:, :)
36      REAL con_t(klon, klev) ! convergence de temperature (K/s)      ! (klon, klev) convergence de temperature (K/s)
37      REAL con_q(klon, klev) ! convergence de l'eau vapeur (g/g/s)  
38      REAL pqhfl(klon)      ! evaporation (negative vers haut) mm/s      REAL, intent(in):: con_q(:, :)
39        ! (klon, klev) convergence de l'eau vapeur (g/g/s)
40      ! Sortie:  
41      REAL d_t(klon, klev)   ! incrementation de temperature      REAL, intent(in):: qhfl(:) ! (klon) evaporation (negative vers haut) mm/s
42      REAL d_q(klon, klev)   ! incrementation d'humidite      REAL, intent(in):: w(:, :) ! (klon, klev) vitesse verticale (Pa/s)
43    
44      REAL, intent(out):: pmfu(:, :) ! (klon, klev)      REAL, intent(out):: d_t(:, :) ! (klon, klev) incrementation de temperature
45      ! flux masse (kg/m2/s) panache ascendant      REAL, intent(out):: d_q(:, :) ! (klon, klev) incrementation d'humidite
46            REAL, intent(out):: rain(:) ! (klon) pluie (mm/s)
47      REAL, intent(out):: pmfd(:, :) ! (klon, klev)      REAL, intent(out):: snow(:) ! (klon) neige (mm/s)
48      ! flux masse (kg/m2/s) panache descendant  
49        REAL, intent(out):: mfu(:, :) ! (klon, klev)
50      REAL pen_u(klon, klev)      ! flux de masse (kg/m2/s) panache ascendant
51      REAL pen_d(klon, klev)  
52      REAL pde_u(klon, klev)      REAL, intent(out):: mfd(:, :) ! (klon, klev)
53      REAL pde_d(klon, klev)      ! flux de masse (kg/m2/s) panache descendant
54      REAL rain(klon)       ! pluie (mm/s)  
55      REAL snow(klon)       ! neige (mm/s)      REAL, intent(out):: pen_u(:, :) ! (klon, klev)
56      REAL pmflxr(klon, klev+1)      REAL, intent(out):: pde_u(:, :) ! (klon, klev)
57      REAL pmflxs(klon, klev+1)      REAL, intent(out):: pen_d(:, :) ! (klon, klev)
58      INTEGER kcbot(klon)  ! niveau du bas de la convection      REAL, intent(out):: pde_d(:, :) ! (klon, klev)
59      INTEGER kctop(klon)  ! niveau du haut de la convection      INTEGER, intent(out):: kcbot(:) ! (klon) niveau du bas de la convection
60      INTEGER kdtop(klon)  ! niveau du haut des downdrafts      INTEGER, intent(out):: kctop(:) ! (klon) niveau du haut de la convection
61        INTEGER, intent(out):: kdtop(:) ! (klon) niveau du haut des downdrafts
62        REAL, intent(out):: pmflxr(:, :) ! (klon, klev + 1)
63        REAL, intent(out):: pmflxs(:, :) ! (klon, klev + 1)
64    
65      ! Local:      ! Local:
66    
67      REAL pt(klon, klev)      REAL qsen(klon, klev)
     REAL pq(klon, klev)  
     REAL pqs(klon, klev)  
68      REAL pvervel(klon, klev)      REAL pvervel(klon, klev)
69      LOGICAL land(klon)      LOGICAL land(klon)
70    
71      REAL d_t_bis(klon, klev)      REAL d_t_bis(klon, klev)
72      REAL d_q_bis(klon, klev)      REAL d_q_bis(klon, klev)
73      REAL paprs(klon, klev+1)      REAL paprs(klon, klev + 1)
74      REAL paprsf(klon, klev)      REAL paprsf(klon, klev)
75      REAL zgeom(klon, klev)      REAL zgeom(klon, klev)
76      REAL zcvgq(klon, klev)      REAL zcvgq(klon, klev)
77      REAL zcvgt(klon, klev)      REAL zcvgt(klon, klev)
78    
     REAL zmfu(klon, klev)  
     REAL zmfd(klon, klev)  
79      REAL zen_u(klon, klev)      REAL zen_u(klon, klev)
80      REAL zen_d(klon, klev)      REAL zen_d(klon, klev)
81      REAL zde_u(klon, klev)      REAL zde_u(klon, klev)
82      REAL zde_d(klon, klev)      REAL zde_d(klon, klev)
83      REAL zmflxr(klon, klev+1)      REAL zmflxr(klon, klev + 1)
84      REAL zmflxs(klon, klev+1)      REAL zmflxs(klon, klev + 1)
85    
86      INTEGER i, k      INTEGER i, k
87      REAL zdelta, zqsat      REAL zqsat
88    
89      !--------------------------------------------------------------------      !--------------------------------------------------------------------
90    
91      ! initialiser les variables de sortie (pour securite)      ! Initialiser les variables de sortie (pour securité):
92      DO i = 1, klon      rain = 0.
93         rain(i) = 0.0      snow = 0.
94         snow(i) = 0.0      kcbot = 0
95         kcbot(i) = 0      kctop = 0
96         kctop(i) = 0      kdtop = 0
97         kdtop(i) = 0      d_t = 0.
98      ENDDO      d_q = 0.
99      DO k = 1, klev  
100         DO i = 1, klon      zen_u = 0.
101            d_t(i, k) = 0.0      zde_u = 0.
102            d_q(i, k) = 0.0      zen_d = 0.
103            pmfu(i, k) = 0.0      zde_d = 0.
104            pmfd(i, k) = 0.0      zmflxr = 0.
105            pen_u(i, k) = 0.0      zmflxs = 0.
           pde_u(i, k) = 0.0  
           pen_d(i, k) = 0.0  
           pde_d(i, k) = 0.0  
           zmfu(i, k) = 0.0  
           zmfd(i, k) = 0.0  
           zen_u(i, k) = 0.0  
           zde_u(i, k) = 0.0  
           zen_d(i, k) = 0.0  
           zde_d(i, k) = 0.0  
        ENDDO  
     ENDDO  
     DO k = 1, klev+1  
        DO i = 1, klon  
           zmflxr(i, k) = 0.0  
           zmflxs(i, k) = 0.0  
        ENDDO  
     ENDDO  
106    
107      ! calculer la nature du sol (pour l'instant, ocean partout)      ! Calculer la nature du sol (pour l'instant, océan partout):
108      DO i = 1, klon      land = .FALSE.
        land(i) = .FALSE.  
     ENDDO  
109    
110      ! preparer les variables d'entree (attention: l'ordre des niveaux      ! Préparer les variables d'entrée (attention: l'indice des niveaux
111      ! verticaux augmente du haut vers le bas)      ! verticaux augmente du haut vers le bas) :
112      DO k = 1, klev      DO k = 1, klev
113         DO i = 1, klon         DO i = 1, klon
114            pt(i, k) = t(i, klev-k+1)            paprsf(i, k) = pres_f(i, klev-k + 1)
115            pq(i, k) = q(i, klev-k+1)            paprs(i, k) = pres_h(i, klev + 1-k + 1)
116            paprsf(i, k) = pres_f(i, klev-k+1)            pvervel(i, k) = w(i, klev + 1-k)
117            paprs(i, k) = pres_h(i, klev+1-k+1)            zcvgt(i, k) = con_t(i, klev-k + 1)
118            pvervel(i, k) = w(i, klev+1-k)            zcvgq(i, k) = con_q(i, klev-k + 1)
119            zcvgt(i, k) = con_t(i, klev-k+1)  
120            zcvgq(i, k) = con_q(i, klev-k+1)            zqsat = MIN(0.5, R2ES * FOEEW(t(i, k), &
121                   merge(0., 1., rtt < t(i, k))) / paprsf(i, k))
122            zdelta=MAX(0., SIGN(1., RTT-pt(i, k)))            qsen(i, k) = zqsat / (1. - RETV * zqsat)
           zqsat=R2ES*FOEEW ( pt(i, k), zdelta ) / paprsf(i, k)  
           zqsat=MIN(0.5, zqsat)  
           zqsat=zqsat/(1.-RETV  *zqsat)  
           pqs(i, k) = zqsat  
123         ENDDO         ENDDO
124      ENDDO      ENDDO
125      DO i = 1, klon      DO i = 1, klon
126         paprs(i, klev+1) = pres_h(i, 1)         paprs(i, klev + 1) = pres_h(i, 1)
127         zgeom(i, klev) = RD * pt(i, klev) &         zgeom(i, klev) = RD * t(i, klev) &
128              / (0.5*(paprs(i, klev+1)+paprsf(i, klev))) &              / (0.5*(paprs(i, klev + 1) + paprsf(i, klev))) &
129              * (paprs(i, klev+1)-paprsf(i, klev))              * (paprs(i, klev + 1)-paprsf(i, klev))
130      ENDDO      ENDDO
131      DO k = klev-1, 1, -1      DO k = klev-1, 1, -1
132         DO i = 1, klon         DO i = 1, klon
133            zgeom(i, k) = zgeom(i, k+1) &            zgeom(i, k) = zgeom(i, k + 1) &
134                 + RD * 0.5*(pt(i, k+1)+pt(i, k)) / paprs(i, k+1) &                 + RD * 0.5*(t(i, k + 1) + t(i, k)) / paprs(i, k + 1) &
135                 * (paprsf(i, k+1)-paprsf(i, k))                 * (paprsf(i, k + 1)-paprsf(i, k))
136         ENDDO         ENDDO
137      ENDDO      ENDDO
138    
139      ! appeler la routine principale      ! Appeler la routine principale :
140        CALL flxmain(dtime, t, q, qsen, qhfl, paprsf, paprs, zgeom, land, &
141      CALL flxmain(dtime, pt, pq, pqs, pqhfl, paprsf, paprs, zgeom, land, &           zcvgt, zcvgq, pvervel, rain, snow, kcbot, kctop, kdtop, mfu, mfd, &
          zcvgt, zcvgq, pvervel, rain, snow, kcbot, kctop, kdtop, zmfu, zmfd, &  
142           zen_u, zde_u, zen_d, zde_d, d_t_bis, d_q_bis, zmflxr, zmflxs)           zen_u, zde_u, zen_d, zde_d, d_t_bis, d_q_bis, zmflxr, zmflxs)
143    
144      ! De la même façon que l'on effectue le réindiçage pour la      ! De la même façon que l'on effectue le réindiçage pour la
# Line 171  contains Line 146  contains
146      ! la convection des traceurs.      ! la convection des traceurs.
147      DO k = 1, klev      DO k = 1, klev
148         DO i = 1, klon         DO i = 1, klon
149            d_q(i, klev+1-k) = dtime*d_q_bis(i, k)            d_q(i, klev + 1-k) = dtime*d_q_bis(i, k)
150            d_t(i, klev+1-k) = dtime*d_t_bis(i, k)            d_t(i, klev + 1-k) = dtime*d_t_bis(i, k)
151         ENDDO         ENDDO
152      ENDDO      ENDDO
153    
154      DO i = 1, klon      mfu = eoshift(mfu, shift=1, dim=2)
155         pmfu(i, 1)= 0.      mfd = eoshift(mfd, shift=1, dim=2)
156         pmfd(i, 1)= 0.      pen_d(:, 1)= 0.
157         pen_d(i, 1)= 0.      pde_d(:, 1)= 0.
        pde_d(i, 1)= 0.  
     ENDDO  
   
     DO k = 2, klev  
        DO i = 1, klon  
           pmfu(i, klev+2-k)= zmfu(i, k)  
           pmfd(i, klev+2-k)= zmfd(i, k)  
        ENDDO  
     ENDDO  
158    
159      DO k = 1, klev      DO k = 1, klev
160         DO i = 1, klon         DO i = 1, klon
161            pen_u(i, klev+1-k)=  zen_u(i, k)            pen_u(i, klev + 1-k)= zen_u(i, k)
162            pde_u(i, klev+1-k)=  zde_u(i, k)            pde_u(i, klev + 1-k)= zde_u(i, k)
163         ENDDO         ENDDO
164      ENDDO      ENDDO
165    
166      DO k = 1, klev-1      DO k = 1, klev-1
167         DO i = 1, klon         DO i = 1, klon
168            pen_d(i, klev+1-k)= -zen_d(i, k+1)            pen_d(i, klev + 1-k)= -zen_d(i, k + 1)
169            pde_d(i, klev+1-k)= -zde_d(i, k+1)            pde_d(i, klev + 1-k)= -zde_d(i, k + 1)
170         ENDDO         ENDDO
171      ENDDO      ENDDO
172    
173      DO k = 1, klev+1      DO k = 1, klev + 1
174         DO i = 1, klon         DO i = 1, klon
175            pmflxr(i, klev+2-k)= zmflxr(i, k)            pmflxr(i, klev + 2-k)= zmflxr(i, k)
176            pmflxs(i, klev+2-k)= zmflxs(i, k)            pmflxs(i, klev + 2-k)= zmflxs(i, k)
177         ENDDO         ENDDO
178      ENDDO      ENDDO
179    

Legend:
Removed from v.62  
changed lines
  Added in v.82

  ViewVC Help
Powered by ViewVC 1.1.21