/[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 70 by guez, Mon Jun 24 15:39:52 2013 UTC trunk/phylmd/Conflx/conflx.f90 revision 78 by guez, Wed Feb 5 17:51:07 2014 UTC
# Line 5  module conflx_m Line 5  module conflx_m
5  contains  contains
6    
7    SUBROUTINE conflx (dtime, pres_h, pres_f, t, q, con_t, con_q, qhfl, 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
# Line 27  contains Line 27  contains
27      USE fcttre, ONLY: foeew      USE fcttre, ONLY: foeew
28    
29      REAL, intent(in):: dtime ! pas d'integration (s)      REAL, intent(in):: dtime ! pas d'integration (s)
30      REAL, intent(in):: pres_h(:, :) ! (klon, klev+1) pression half-level (Pa)      REAL, intent(in):: pres_h(:, :) ! (klon, klev + 1) pression half-level (Pa)
31      REAL, intent(in):: pres_f(:, :) ! (klon, klev) pression full-level (Pa)      REAL, intent(in):: pres_f(:, :) ! (klon, klev) pression full-level (Pa)
32      REAL, intent(in):: t(:, :) ! (klon, klev) temperature (K)      REAL, intent(in):: t(:, :) ! (klon, klev) temperature (K)
33      REAL, intent(in):: q(:, :) ! (klon, klev) humidité spécifique (g/g)      REAL, intent(in):: q(:, :) ! (klon, klev) humidité spécifique (no dimension)
34    
35      REAL, intent(in):: con_t(:, :)      REAL, intent(in):: con_t(:, :)
36      ! (klon, klev) convergence de temperature (K/s)      ! (klon, klev) convergence de temperature (K/s)
# Line 46  contains Line 46  contains
46      REAL, intent(out):: rain(:) ! (klon) pluie (mm/s)      REAL, intent(out):: rain(:) ! (klon) pluie (mm/s)
47      REAL, intent(out):: snow(:) ! (klon) neige (mm/s)      REAL, intent(out):: snow(:) ! (klon) neige (mm/s)
48    
49      REAL, intent(out):: pmfu(:, :) ! (klon, klev)      REAL, intent(out):: mfu(:, :) ! (klon, klev)
50      ! flux masse (kg/m2/s) panache ascendant      ! flux de masse (kg/m2/s) panache ascendant
51    
52      REAL, intent(out):: pmfd(:, :) ! (klon, klev)      REAL, intent(out):: mfd(:, :) ! (klon, klev)
53      ! flux masse (kg/m2/s) panache descendant      ! flux de masse (kg/m2/s) panache descendant
54    
55      REAL, intent(out):: pen_u(:, :) ! (klon, klev)      REAL, intent(out):: pen_u(:, :) ! (klon, klev)
56      REAL, intent(out):: pde_u(:, :) ! (klon, klev)      REAL, intent(out):: pde_u(:, :) ! (klon, klev)
# Line 59  contains Line 59  contains
59      INTEGER, intent(out):: kcbot(:) ! (klon) niveau du bas de la convection      INTEGER, intent(out):: kcbot(:) ! (klon) niveau du bas de la convection
60      INTEGER, intent(out):: kctop(:) ! (klon) niveau du haut de la convection      INTEGER, intent(out):: kctop(:) ! (klon) niveau du haut de la convection
61      INTEGER, intent(out):: kdtop(:) ! (klon) niveau du haut des downdrafts      INTEGER, intent(out):: kdtop(:) ! (klon) niveau du haut des downdrafts
62      REAL, intent(out):: pmflxr(:, :) ! (klon, klev+1)      REAL, intent(out):: pmflxr(:, :) ! (klon, klev + 1)
63      REAL, intent(out):: pmflxs(:, :) ! (klon, klev+1)      REAL, intent(out):: pmflxs(:, :) ! (klon, klev + 1)
64    
65      ! Local:      ! Local:
66    
67      REAL pq(klon, klev)      REAL qsen(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 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            pq(i, k) = q(i, klev-k+1)            paprsf(i, k) = pres_f(i, klev-k + 1)
115            paprsf(i, k) = pres_f(i, klev-k+1)            paprs(i, k) = pres_h(i, klev + 1-k + 1)
116            paprs(i, k) = pres_h(i, klev+1-k+1)            pvervel(i, k) = w(i, klev + 1-k)
117            pvervel(i, k) = w(i, klev+1-k)            zcvgt(i, k) = con_t(i, klev-k + 1)
118            zcvgt(i, k) = con_t(i, klev-k+1)            zcvgq(i, k) = con_q(i, klev-k + 1)
           zcvgq(i, k) = con_q(i, klev-k+1)  
119    
120            zqsat = MIN(0.5, R2ES * FOEEW(t(i, k), &            zqsat = MIN(0.5, R2ES * FOEEW(t(i, k), &
121                 merge(0., 1., rtt < t(i, k))) / paprsf(i, k))                 merge(0., 1., rtt < t(i, k))) / paprsf(i, k))
122            pqs(i, k) = zqsat / (1. - RETV * zqsat)            qsen(i, k) = zqsat / (1. - RETV * 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 * t(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*(t(i, k+1)+t(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, pq, pqs, qhfl, paprsf, paprs, zgeom, land, &      CALL flxmain(dtime, t, q, qsen, qhfl, paprsf, paprs, zgeom, land, &
141           zcvgt, zcvgq, pvervel, rain, snow, kcbot, kctop, kdtop, zmfu, zmfd, &           zcvgt, zcvgq, pvervel, rain, snow, kcbot, kctop, kdtop, mfu, mfd, &
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 169  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.70  
changed lines
  Added in v.78

  ViewVC Help
Powered by ViewVC 1.1.21