source: LMDZ6/trunk/libf/phylmd/cvltr_noscav.f90

Last change on this file was 5274, checked in by abarral, 48 minutes ago

Replace yomcst.h by existing module

File size: 6.1 KB
Line 
1!
2! $Id $
3!
4SUBROUTINE cvltr_noscav(it,pdtime,da, phi, mp,wght_cvfd,paprs,pplay,x,upd,dnd,dx)
5  USE dimphy
6  USE infotrac_phy, ONLY : nbtr
7  USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
8          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
9          , R_ecc, R_peri, R_incl                                      &
10          , RA, RG, R1SA                                         &
11          , RSIGMA                                                     &
12          , R, RMD, RMV, RD, RV, RCPD                    &
13          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
14          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
15          , RCW, RCS                                                 &
16          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
17          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
18          , RALPD, RBETD, RGAMD
19IMPLICIT NONE
20!=====================================================================
21! Objet : convection des traceurs / KE
22! Auteurs: M-A Filiberti and J-Y Grandpeix
23!=====================================================================
24
25  include "YOECUMF.h"
26
27! Entree
28  REAL,INTENT(IN)                           :: pdtime
29  INTEGER, INTENT(IN)                       :: it
30  REAL,DIMENSION(klon,klev),INTENT(IN)      :: da
31  REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: phi
32  REAL,DIMENSION(klon,klev),INTENT(IN)      :: mp
33  REAL,DIMENSION(klon,klev),INTENT(IN)      :: wght_cvfd  ! weights of the layers feeding convection
34  REAL,DIMENSION(klon,klev+1),INTENT(IN)    :: paprs ! pression aux 1/2 couches (bas en haut)
35  REAL,DIMENSION(klon,klev),INTENT(IN)      :: pplay ! pression pour le milieu de chaque couche
36  REAL,DIMENSION(klon,klev,nbtr),INTENT(IN)      :: x     ! q de traceur (bas en haut)
37  REAL,DIMENSION(klon,klev),INTENT(IN)      :: upd   ! saturated updraft mass flux
38  REAL,DIMENSION(klon,klev),INTENT(IN)      :: dnd   ! saturated downdraft mass flux
39
40! Sortie
41  REAL,DIMENSION(klon,klev,nbtr),INTENT(inOUT) :: dx ! tendance de traceur  (bas en haut)
42
43! Variables locales     
44! REAL,DIMENSION(klon,klev)       :: zed
45  REAL,DIMENSION(klon,klev,klev)  :: zmd
46  REAL,DIMENSION(klon,klev,klev)  :: za
47  REAL,DIMENSION(klon,klev)       :: zmfd,zmfa
48  REAL,DIMENSION(klon,klev)       :: zmfp,zmfu
49  REAL,DIMENSION(klon,nbtr)       :: qfeed     ! tracer concentration feeding convection
50  REAL,DIMENSION(klon,klev)       :: deltap
51  INTEGER                         :: i,k,j
52  REAL                            :: pdtimeRG
53  REAL                            :: smallest_mp
54  real conserv
55  real smfd
56  real smfu
57  real smfa
58  real smfp
59! =========================================
60! calcul des tendances liees au downdraft
61! =========================================
62!
63  smallest_mp = tiny(mp(1,1))
64!cdir collapse
65  qfeed(:,it) = 0.
66  DO j=1,klev
67  DO i=1,klon
68!   zed(i,j)=0.
69    zmfd(i,j)=0.
70    zmfa(i,j)=0.
71    zmfu(i,j)=0.
72    zmfp(i,j)=0.
73  END DO
74  END DO
75!cdir collapse
76  DO k=1,klev
77  DO j=1,klev
78  DO i=1,klon
79    zmd(i,j,k)=0.
80    za (i,j,k)=0.
81  END DO
82  END DO
83  END DO
84! entrainement
85! DO k=1,klev-1
86!    DO i=1,klon
87!       zed(i,k)=max(0.,mp(i,k)-mp(i,k+1))
88!    END DO
89! END DO
90
91! calcul de la matrice d echange
92! matrice de distribution de la masse entrainee en k
93
94  DO k=1,klev-1
95     DO i=1,klon
96        zmd(i,k,k)=max(0.,mp(i,k)-mp(i,k+1))
97     END DO
98  END DO
99  DO k=2,klev
100     DO j=k-1,1,-1
101        DO i=1,klon
102!!           if(mp(i,j+1).ne.0) then
103!!              zmd(i,j,k)=zmd(i,j+1,k)*min(1.,mp(i,j)/mp(i,j+1))
104!!           ENDif
105           zmd(i,j,k)=zmd(i,j+1,k)*mp(i,j)/max(mp(i,j),mp(i,j+1),smallest_mp)
106        END DO
107     END DO
108  END DO
109  DO k=1,klev
110     DO j=1,klev-1
111        DO i=1,klon
112           za(i,j,k)=max(0.,zmd(i,j+1,k)-zmd(i,j,k))
113        END DO
114     END DO
115  END DO
116!
117! rajout du terme lie a l ascendance induite
118!
119  DO j=2,klev
120     DO i=1,klon
121        za(i,j,j-1)=za(i,j,j-1)+mp(i,j)
122     END DO
123  END DO
124!
125! tendances
126!           
127  DO k=1,klev
128     DO j=1,klev
129        DO i=1,klon
130           zmfd(i,j)=zmfd(i,j)+za(i,j,k)*(x(i,k,it)-x(i,j,it))
131        END DO
132     END DO
133  END DO
134!
135! =========================================
136! calcul des tendances liees aux flux satures
137! =========================================
138!RL
139!  Feeding concentrations
140  DO j=1,klev
141     DO i=1,klon
142        qfeed(i,it)=qfeed(i,it)+wght_cvfd(i,j)*x(i,j,it)
143     END DO
144  END DO
145!RL
146!
147  DO j=1,klev
148     DO i=1,klon
149!RL
150!!        zmfa(i,j,it)=da(i,j)*(x(i,1,it)-x(i,j,it))                     ! da
151        zmfa(i,j)=da(i,j)*(qfeed(i,it)-x(i,j,it))                     ! da
152!RL
153     END DO
154  END DO
155!
156!!  print *,'it, qfeed(1,it), x(1,1,it) ', it, qfeed(1,it), x(1,1,it)  !jyg
157!!  print *,'wght_cvfd ', (j, wght_cvfd(1,j), j=1,5)                     !jyg
158!
159  DO k=1,klev
160     DO j=1,klev
161        DO i=1,klon
162           zmfp(i,j)=zmfp(i,j)+phi(i,j,k)*(x(i,k,it)-x(i,j,it))
163        END DO
164     END DO
165  END DO
166  DO j=1,klev-1
167     DO i=1,klon
168        zmfu(i,j)=max(0.,upd(i,j+1)+dnd(i,j+1))*(x(i,j+1,it)-x(i,j,it))
169     END DO
170  END DO
171  DO j=2,klev
172     DO i=1,klon
173        zmfu(i,j)=zmfu(i,j)+min(0.,upd(i,j)+dnd(i,j))*(x(i,j,it)-x(i,j-1,it))
174     END DO
175  END DO
176
177! =========================================
178! calcul final des tendances
179! =========================================
180  DO k=1, klev
181     DO i=1, klon
182        deltap(i,k)=paprs(i,k)-paprs(i,k+1)
183     ENDDO
184  ENDDO
185  pdtimeRG=pdtime*RG
186!cdir collapse
187  DO k=1, klev
188     DO i=1, klon
189        dx(i,k,it)=(zmfd(i,k)+zmfu(i,k)       &
190                +zmfa(i,k)+zmfp(i,k))*pdtimeRG/deltap(i,k)
191     ENDDO
192  ENDDO
193
194!! test de conservation du traceur
195      conserv=0.
196      smfd = 0.
197      smfu = 0.
198      smfa = 0.
199      smfp = 0.
200      DO k=1, klev
201        DO i=1, klon
202         conserv=conserv+dx(i,k,it)*   &
203          deltap(i,k)/RG
204         smfd = smfd + zmfd(i,k)*pdtime
205         smfu = smfu + zmfu(i,k)*pdtime
206         smfa = smfa + zmfa(i,k)*pdtime
207         smfp = smfp + zmfp(i,k)*pdtime
208        ENDDO
209      ENDDO
210!!      print *,'it',it,'cvltr_noscav conserv, smfd, smfu, smfa, smfp ',conserv,  &
211!!               smfd, smfu, smfa, smfp
212     
213END SUBROUTINE cvltr_noscav
Note: See TracBrowser for help on using the repository browser.