/[lmdze]/trunk/libf/phylmd/Conflx/flxasc.f90
ViewVC logotype

Diff of /trunk/libf/phylmd/Conflx/flxasc.f90

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

revision 70 by guez, Mon Jun 24 15:39:52 2013 UTC revision 71 by guez, Mon Jul 8 18:12:18 2013 UTC
# Line 9  contains Line 9  contains
9         pmfu, pmfub, pentr, pmfus, pmfuq, pmful, plude, pdmfup, kcbot, kctop, &         pmfu, pmfub, pentr, pmfus, pmfuq, pmful, plude, pdmfup, kcbot, kctop, &
10         kctop0, kcum, pen_u, pde_u)         kctop0, kcum, pen_u, pde_u)
11    
12      USE dimphy, ONLY: klev, klon, max      ! This routine does the calculations for cloud ascents for cumulus
13        ! parameterization.
14    
15        USE dimphy, ONLY: klev, klon
16      use flxadjtq_m, only: flxadjtq      use flxadjtq_m, only: flxadjtq
17      USE suphec_m, ONLY: rcpd, rd, retv, rg, rtt      USE suphec_m, ONLY: rcpd, rd, retv, rg, rtt
18      USE yoecumf, ONLY: cmfcmin, cmfctop, cprcon, entrmid, lmfmid      USE yoecumf, ONLY: cmfcmin, cmfctop, cprcon, entrmid, lmfmid
19    
     ! This routine does the calculations for cloud ascents for cumulus  
     ! parameterization.  
   
20      REAL, intent(in):: pdtime      REAL, intent(in):: pdtime
21      REAL, intent(in):: pten(klon, klev), ptenh(klon, klev)      REAL, intent(in):: ptenh(klon, klev)
22      REAL, intent(in):: pqen(klon, klev), pqenh(klon, klev), pqsen(klon, klev)      REAL, intent(in):: pqenh(klon, klev)
23        REAL, intent(in):: pten(klon, klev)
24        REAL, intent(in):: pqen(klon, klev)
25        REAL, intent(in):: pqsen(klon, klev)
26      REAL, intent(in):: pgeo(klon, klev), pgeoh(klon, klev)      REAL, intent(in):: pgeo(klon, klev), pgeoh(klon, klev)
27      REAL pap(klon, klev), paph(klon, klev+1)      REAL pap(klon, klev), paph(klon, klev+1)
28      REAL pqte(klon, klev)      REAL pqte(klon, klev)
29      REAL pvervel(klon, klev) ! vitesse verticale en Pa/s      REAL pvervel(klon, klev) ! vitesse verticale en Pa/s
30        LOGICAL ldland(klon)
31      REAL pmfub(klon), pentr(klon)      LOGICAL, intent(inout):: ldcum(klon)
32        INTEGER, intent(inout):: ktype(klon)
33        integer klab(klon, klev)
34      REAL ptu(klon, klev), pqu(klon, klev), plu(klon, klev)      REAL ptu(klon, klev), pqu(klon, klev), plu(klon, klev)
35      REAL plude(klon, klev)      REAL pmfu(klon, klev)
36      REAL pmfu(klon, klev), pmfus(klon, klev)      REAL, intent(inout):: pmfub(klon)
37        real pentr(klon)
38        real pmfus(klon, klev)
39      REAL pmfuq(klon, klev), pmful(klon, klev)      REAL pmfuq(klon, klev), pmful(klon, klev)
40        REAL plude(klon, klev)
41      REAL pdmfup(klon, klev)      REAL pdmfup(klon, klev)
42      INTEGER, intent(inout):: ktype(klon)      integer kcbot(klon), kctop(klon)
     integer klab(klon, klev), kcbot(klon), kctop(klon)  
43      INTEGER kctop0(klon)      INTEGER kctop0(klon)
44      LOGICAL ldland(klon)      integer, intent(out):: kcum
     LOGICAL, intent(inout):: ldcum(klon)  
   
45      REAL pen_u(klon, klev), pde_u(klon, klev)      REAL pen_u(klon, klev), pde_u(klon, klev)
46    
47        ! Local:
48    
49      REAL zqold(klon)      REAL zqold(klon)
50      REAL zdland(klon)      REAL zdland(klon)
51      LOGICAL llflag(klon)      LOGICAL llflag(klon)
52      INTEGER k, i, is, icall, kcum      INTEGER k, i, is, icall
53      REAL ztglace, zdphi, zqeen, zseen, zscde, zqude      REAL ztglace, zdphi, zqeen, zseen, zscde, zqude
54      REAL zmfusk, zmfuqk, zmfulk, zbuo, zdnoprc, zprcon, zlnew      REAL zmfusk, zmfuqk, zmfulk, zbuo, zdnoprc, zprcon, zlnew
55    
# Line 96  contains Line 104  contains
104         IF (ldland(i)) THEN         IF (ldland(i)) THEN
105            zdland(i)=3.0E4            zdland(i)=3.0E4
106            zdphi=pgeoh(i, kctop0(i))-pgeoh(i, kcbot(i))            zdphi=pgeoh(i, kctop0(i))-pgeoh(i, kcbot(i))
107            IF (ptu(i, kctop0(i)).GE.ztglace) zdland(i)=zdphi            IF (ptu(i, kctop0(i)) >= ztglace) zdland(i)=zdphi
108            zdland(i)=MAX(3.0E4, zdland(i))            zdland(i)=MAX(3.0E4, zdland(i))
109            zdland(i)=MIN(5.0E4, zdland(i))            zdland(i)=MIN(5.0E4, zdland(i))
110         ENDIF         ENDIF
# Line 112  contains Line 120  contains
120            pqu(i, klev) = 0.            pqu(i, klev) = 0.
121         ENDIF         ENDIF
122         pmfu(i, klev) = pmfub(i)         pmfu(i, klev) = pmfub(i)
123         pmfus(i, klev) = pmfub(i)*(RCPD*ptu(i, klev)+pgeoh(i, klev))         pmfus(i, klev) = pmfub(i) * (RCPD * ptu(i, klev)+pgeoh(i, klev))
124         pmfuq(i, klev) = pmfub(i)*pqu(i, klev)         pmfuq(i, klev) = pmfub(i) * pqu(i, klev)
125      ENDDO      ENDDO
126    
127      DO i = 1, klon      DO i = 1, klon
# Line 134  contains Line 142  contains
142                  pqu(i, k+1) = pqen(i, k)                  pqu(i, k+1) = pqen(i, k)
143                  plu(i, k+1) = 0.0                  plu(i, k+1) = 0.0
144                  zzzmb = MAX(CMFCMIN, -pvervel(i, k)/RG)                  zzzmb = MAX(CMFCMIN, -pvervel(i, k)/RG)
145                  zmfmax = (paph(i, k)-paph(i, k-1))/(RG*pdtime)                  zmfmax = (paph(i, k)-paph(i, k-1))/(RG * pdtime)
146                  pmfub(i) = MIN(zzzmb, zmfmax)                  pmfub(i) = MIN(zzzmb, zmfmax)
147                  pmfu(i, k+1) = pmfub(i)                  pmfu(i, k+1) = pmfub(i)
148                  pmfus(i, k+1) = pmfub(i)*(RCPD*ptu(i, k+1)+pgeoh(i, k+1))                  pmfus(i, k+1) = pmfub(i) * (RCPD * ptu(i, k+1)+pgeoh(i, k+1))
149                  pmfuq(i, k+1) = pmfub(i)*pqu(i, k+1)                  pmfuq(i, k+1) = pmfub(i) * pqu(i, k+1)
150                  pmful(i, k+1) = 0.0                  pmful(i, k+1) = 0.0
151                  pdmfup(i, k+1) = 0.0                  pdmfup(i, k+1) = 0.0
152                  kcbot(i) = k                  kcbot(i) = k
# Line 163  contains Line 171  contains
171         DO i = 1, klon         DO i = 1, klon
172            pen_u(i, k) = 0.0            pen_u(i, k) = 0.0
173            pde_u(i, k) = 0.0            pde_u(i, k) = 0.0
174            zrho(i)=paph(i, k+1)/(RD*ptenh(i, k+1))            zrho(i)=paph(i, k+1)/(RD * ptenh(i, k+1))
175            zpbot(i)=paph(i, kcbot(i))            zpbot(i)=paph(i, kcbot(i))
176            zptop(i)=paph(i, kctop0(i))            zptop(i)=paph(i, kctop0(i))
177         ENDDO         ENDDO
178    
179         DO i = 1, klon         DO i = 1, klon
180            IF(ldcum(i)) THEN            IF(ldcum(i)) THEN
181               zdprho=(paph(i, k+1)-paph(i, k))/(RG*zrho(i))               zdprho=(paph(i, k+1)-paph(i, k))/(RG * zrho(i))
182               zentr=pentr(i)*pmfu(i, k+1)*zdprho               zentr=pentr(i) * pmfu(i, k+1) * zdprho
183               llo1=k < kcbot(i)               llo1=k < kcbot(i)
184               IF(llo1) pde_u(i, k)=zentr               IF(llo1) pde_u(i, k)=zentr
185               zpmid=0.5*(zpbot(i)+zptop(i))               zpmid=0.5 * (zpbot(i)+zptop(i))
186               llo2=llo1.AND.ktype(i) == 2.AND. &               llo2=llo1.AND.ktype(i) == 2.AND. &
187                    (zpbot(i)-paph(i, k) < 0.2E5.OR. &                    (zpbot(i)-paph(i, k) < 0.2E5.OR. &
188                    paph(i, k) > zpmid)                    paph(i, k) > zpmid)
189               IF(llo2) pen_u(i, k)=zentr               IF(llo2) pen_u(i, k)=zentr
190               llo2=llo1.AND.(ktype(i) == 1.OR.ktype(i) == 3).AND. &               llo2=llo1.AND.(ktype(i) == 1.OR.ktype(i) == 3).AND. &
191                    (k.GE.MAX(klwmin(i), kctop0(i)+2).OR.pap(i, k) > zpmid)                    (k >= MAX(klwmin(i), kctop0(i)+2).OR.pap(i, k) > zpmid)
192               IF(llo2) pen_u(i, k)=zentr               IF(llo2) pen_u(i, k)=zentr
193               llo1=pen_u(i, k) > 0..AND.(ktype(i) == 1.OR.ktype(i) == 2)               llo1=pen_u(i, k) > 0..AND.(ktype(i) == 1.OR.ktype(i) == 2)
194               IF(llo1) THEN               IF(llo1) THEN
195                  zentr=zentr*(1.+3.*(1.-MIN(1., (zpbot(i)-pap(i, k))/1.5E4)))                  zentr=zentr * (1.+3. * (1.-MIN(1., (zpbot(i)-pap(i, k))/1.5E4)))
196                  pen_u(i, k)=pen_u(i, k)*(1.+3.*(1.-MIN(1., &                  pen_u(i, k)=pen_u(i, k) * (1.+3. * (1.-MIN(1., &
197                       (zpbot(i)-pap(i, k))/1.5E4)))                       (zpbot(i)-pap(i, k))/1.5E4)))
198                  pde_u(i, k)=pde_u(i, k)*(1.+3.*(1.-MIN(1., &                  pde_u(i, k)=pde_u(i, k) * (1.+3. * (1.-MIN(1., &
199                       (zpbot(i)-pap(i, k))/1.5E4)))                       (zpbot(i)-pap(i, k))/1.5E4)))
200               ENDIF               ENDIF
201               IF(llo2.AND.pqenh(i, k+1) > 1.E-5) &               IF(llo2.AND.pqenh(i, k+1) > 1.E-5) &
202                    pen_u(i, k)=zentr+MAX(pqte(i, k), 0.)/pqenh(i, k+1)* &                    pen_u(i, k)=zentr+MAX(pqte(i, k), 0.)/pqenh(i, k+1) * &
203                    zrho(i)*zdprho                    zrho(i) * zdprho
204            ENDIF            ENDIF
205         end DO         end DO
206    
# Line 202  contains Line 210  contains
210            IF (llflag(i)) THEN            IF (llflag(i)) THEN
211               IF (k < kcbot(i)) THEN               IF (k < kcbot(i)) THEN
212                  zmftest = pmfu(i, k+1)+pen_u(i, k)-pde_u(i, k)                  zmftest = pmfu(i, k+1)+pen_u(i, k)-pde_u(i, k)
213                  zmfmax = MIN(zmftest, (paph(i, k)-paph(i, k-1))/(RG*pdtime))                  zmfmax = MIN(zmftest, (paph(i, k)-paph(i, k-1))/(RG * pdtime))
214                  pen_u(i, k)=MAX(pen_u(i, k)-MAX(0.0, zmftest-zmfmax), 0.0)                  pen_u(i, k)=MAX(pen_u(i, k)-MAX(0.0, zmftest-zmfmax), 0.0)
215               ENDIF               ENDIF
216               pde_u(i, k)=MIN(pde_u(i, k), 0.75*pmfu(i, k+1))               pde_u(i, k)=MIN(pde_u(i, k), 0.75 * pmfu(i, k+1))
217               ! calculer le flux de masse du niveau k a partir de celui du k+1               ! calculer le flux de masse du niveau k a partir de celui du k+1
218               pmfu(i, k)=pmfu(i, k+1)+pen_u(i, k)-pde_u(i, k)               pmfu(i, k)=pmfu(i, k+1)+pen_u(i, k)-pde_u(i, k)
219               ! calculer les valeurs Su, Qu et l du niveau k dans le               ! calculer les valeurs Su, Qu et l du niveau k dans le
220               ! panache montant               ! panache montant
221               zqeen=pqenh(i, k+1)*pen_u(i, k)               zqeen=pqenh(i, k+1) * pen_u(i, k)
222               zseen=(RCPD*ptenh(i, k+1)+pgeoh(i, k+1))*pen_u(i, k)               zseen=(RCPD * ptenh(i, k+1)+pgeoh(i, k+1)) * pen_u(i, k)
223               zscde=(RCPD*ptu(i, k+1)+pgeoh(i, k+1))*pde_u(i, k)               zscde=(RCPD * ptu(i, k+1)+pgeoh(i, k+1)) * pde_u(i, k)
224               zqude=pqu(i, k+1)*pde_u(i, k)               zqude=pqu(i, k+1) * pde_u(i, k)
225               plude(i, k)=plu(i, k+1)*pde_u(i, k)               plude(i, k)=plu(i, k+1) * pde_u(i, k)
226               zmfusk=pmfus(i, k+1)+zseen-zscde               zmfusk=pmfus(i, k+1)+zseen-zscde
227               zmfuqk=pmfuq(i, k+1)+zqeen-zqude               zmfuqk=pmfuq(i, k+1)+zqeen-zqude
228               zmfulk=pmful(i, k+1) -plude(i, k)               zmfulk=pmful(i, k+1) -plude(i, k)
229               plu(i, k)=zmfulk*(1./MAX(CMFCMIN, pmfu(i, k)))               plu(i, k)=zmfulk * (1./MAX(CMFCMIN, pmfu(i, k)))
230               pqu(i, k)=zmfuqk*(1./MAX(CMFCMIN, pmfu(i, k)))               pqu(i, k)=zmfuqk * (1./MAX(CMFCMIN, pmfu(i, k)))
231               ptu(i, k)=(zmfusk*(1./MAX(CMFCMIN, pmfu(i, k)))- &               ptu(i, k)=(zmfusk * (1./MAX(CMFCMIN, pmfu(i, k)))- &
232                    pgeoh(i, k))/RCPD                    pgeoh(i, k))/RCPD
233               ptu(i, k)=MAX(100., ptu(i, k))               ptu(i, k)=MAX(100., ptu(i, k))
234               ptu(i, k)=MIN(400., ptu(i, k))               ptu(i, k)=MIN(400., ptu(i, k))
# Line 239  contains Line 247  contains
247            IF(llflag(i).AND.pqu(i, k).NE.zqold(i)) THEN            IF(llflag(i).AND.pqu(i, k).NE.zqold(i)) THEN
248               klab(i, k) = 2               klab(i, k) = 2
249               plu(i, k) = plu(i, k)+zqold(i)-pqu(i, k)               plu(i, k) = plu(i, k)+zqold(i)-pqu(i, k)
250               zbuo = ptu(i, k)*(1.+RETV*pqu(i, k))- &               zbuo = ptu(i, k) * (1.+RETV * pqu(i, k))- &
251                    ptenh(i, k)*(1.+RETV*pqenh(i, k))                    ptenh(i, k) * (1.+RETV * pqenh(i, k))
252               IF (klab(i, k+1) == 1) zbuo=zbuo+0.5               IF (klab(i, k+1) == 1) zbuo=zbuo+0.5
253               IF (zbuo > 0..AND.pmfu(i, k).GE.0.1*pmfub(i)) THEN               IF (zbuo > 0. .AND. pmfu(i, k) >= 0.1 * pmfub(i)) THEN
254                  kctop(i) = k                  kctop(i) = k
255                  ldcum(i) = .TRUE.                  ldcum(i) = .TRUE.
256                  zdnoprc = 1.5E4                  zdnoprc = 1.5E4
257                  IF (ldland(i)) zdnoprc = zdland(i)                  IF (ldland(i)) zdnoprc = zdland(i)
258                  zprcon = CPRCON                  zprcon = CPRCON
259                  IF ((zpbot(i)-paph(i, k)) < zdnoprc) zprcon = 0.0                  IF ((zpbot(i)-paph(i, k)) < zdnoprc) zprcon = 0.0
260                  zlnew=plu(i, k)/(1.+zprcon*(pgeoh(i, k)-pgeoh(i, k+1)))                  zlnew=plu(i, k)/(1.+zprcon * (pgeoh(i, k)-pgeoh(i, k+1)))
261                  pdmfup(i, k)=MAX(0., (plu(i, k)-zlnew)*pmfu(i, k))                  pdmfup(i, k)=MAX(0., (plu(i, k)-zlnew) * pmfu(i, k))
262                  plu(i, k)=zlnew                  plu(i, k)=zlnew
263               ELSE               ELSE
264                  klab(i, k)=0                  klab(i, k)=0
# Line 260  contains Line 268  contains
268         end DO         end DO
269         DO i = 1, klon         DO i = 1, klon
270            IF (llflag(i)) THEN            IF (llflag(i)) THEN
271               pmful(i, k)=plu(i, k)*pmfu(i, k)               pmful(i, k)=plu(i, k) * pmfu(i, k)
272               pmfus(i, k)=(RCPD*ptu(i, k)+pgeoh(i, k))*pmfu(i, k)               pmfus(i, k)=(RCPD * ptu(i, k)+pgeoh(i, k)) * pmfu(i, k)
273               pmfuq(i, k)=pqu(i, k)*pmfu(i, k)               pmfuq(i, k)=pqu(i, k) * pmfu(i, k)
274            ENDIF            ENDIF
275         end DO         end DO
276    
# Line 288  contains Line 296  contains
296         DO i = 1, klon         DO i = 1, klon
297            IF (ldcum(i)) THEN            IF (ldcum(i)) THEN
298               k=kctop(i)-1               k=kctop(i)-1
299               pde_u(i, k)=(1.-CMFCTOP)*pmfu(i, k+1)               pde_u(i, k)=(1.-CMFCTOP) * pmfu(i, k+1)
300               plude(i, k)=pde_u(i, k)*plu(i, k+1)               plude(i, k)=pde_u(i, k) * plu(i, k+1)
301               pmfu(i, k)=pmfu(i, k+1)-pde_u(i, k)               pmfu(i, k)=pmfu(i, k+1)-pde_u(i, k)
302               zlnew=plu(i, k)               zlnew=plu(i, k)
303               pdmfup(i, k)=MAX(0., (plu(i, k)-zlnew)*pmfu(i, k))               pdmfup(i, k)=MAX(0., (plu(i, k)-zlnew) * pmfu(i, k))
304               plu(i, k)=zlnew               plu(i, k)=zlnew
305               pmfus(i, k)=(RCPD*ptu(i, k)+pgeoh(i, k))*pmfu(i, k)               pmfus(i, k)=(RCPD * ptu(i, k)+pgeoh(i, k)) * pmfu(i, k)
306               pmfuq(i, k)=pqu(i, k)*pmfu(i, k)               pmfuq(i, k)=pqu(i, k) * pmfu(i, k)
307               pmful(i, k)=plu(i, k)*pmfu(i, k)               pmful(i, k)=plu(i, k) * pmfu(i, k)
308               plude(i, k-1)=pmful(i, k)               plude(i, k-1)=pmful(i, k)
309            ENDIF            ENDIF
310         end DO         end DO

Legend:
Removed from v.70  
changed lines
  Added in v.71

  ViewVC Help
Powered by ViewVC 1.1.21