/[lmdze]/trunk/Sources/phylmd/Conflx/flxasc.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/Conflx/flxasc.f

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

trunk/libf/phylmd/Conflx/flxasc.f90 revision 70 by guez, Mon Jun 24 15:39:52 2013 UTC trunk/phylmd/Conflx/flxasc.f revision 82 by guez, Wed Mar 5 14:57:53 2014 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, intent(in):: pap(klon, klev), paph(klon, klev+1)
28      REAL pqte(klon, klev)      REAL, intent(in):: pqte(klon, klev)
29      REAL pvervel(klon, klev) ! vitesse verticale en Pa/s      REAL, intent(in):: pvervel(klon, klev) ! vitesse verticale en Pa/s
30        LOGICAL, intent(in):: 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 51  contains Line 59  contains
59    
60      REAL zwmax(klon), zzzmb      REAL zwmax(klon), zzzmb
61      INTEGER klwmin(klon) ! level of maximum vertical velocity      INTEGER klwmin(klon) ! level of maximum vertical velocity
62        real fact
63    
64      !----------------------------------------------------------------------      !----------------------------------------------------------------------
65    
# Line 87  contains Line 96  contains
96            pmful(i, k)=0.            pmful(i, k)=0.
97            plude(i, k)=0.            plude(i, k)=0.
98            pdmfup(i, k)=0.            pdmfup(i, k)=0.
99            IF(.NOT. ldcum(i).OR.ktype(i) == 3) klab(i, k)=0            IF (.NOT. ldcum(i) .OR. ktype(i) == 3) klab(i, k)=0
100            IF(.NOT. ldcum(i).AND.paph(i, k) < 4.E4) kctop0(i)=k            IF (.NOT. ldcum(i) .AND. paph(i, k) < 4e4) kctop0(i) = k
101         ENDDO         ENDDO
102      ENDDO      ENDDO
103    
# Line 96  contains Line 105  contains
105         IF (ldland(i)) THEN         IF (ldland(i)) THEN
106            zdland(i)=3.0E4            zdland(i)=3.0E4
107            zdphi=pgeoh(i, kctop0(i))-pgeoh(i, kcbot(i))            zdphi=pgeoh(i, kctop0(i))-pgeoh(i, kcbot(i))
108            IF (ptu(i, kctop0(i)).GE.ztglace) zdland(i)=zdphi            IF (ptu(i, kctop0(i)) >= ztglace) zdland(i)=zdphi
109            zdland(i)=MAX(3.0E4, zdland(i))            zdland(i)=MAX(3.0E4, zdland(i))
110            zdland(i)=MIN(5.0E4, zdland(i))            zdland(i)=MIN(5.0E4, zdland(i))
111         ENDIF         ENDIF
# Line 112  contains Line 121  contains
121            pqu(i, klev) = 0.            pqu(i, klev) = 0.
122         ENDIF         ENDIF
123         pmfu(i, klev) = pmfub(i)         pmfu(i, klev) = pmfub(i)
124         pmfus(i, klev) = pmfub(i)*(RCPD*ptu(i, klev)+pgeoh(i, klev))         pmfus(i, klev) = pmfub(i) * (RCPD * ptu(i, klev)+pgeoh(i, klev))
125         pmfuq(i, klev) = pmfub(i)*pqu(i, klev)         pmfuq(i, klev) = pmfub(i) * pqu(i, klev)
126      ENDDO      ENDDO
127    
128      DO i = 1, klon      DO i = 1, klon
# Line 134  contains Line 143  contains
143                  pqu(i, k+1) = pqen(i, k)                  pqu(i, k+1) = pqen(i, k)
144                  plu(i, k+1) = 0.0                  plu(i, k+1) = 0.0
145                  zzzmb = MAX(CMFCMIN, -pvervel(i, k)/RG)                  zzzmb = MAX(CMFCMIN, -pvervel(i, k)/RG)
146                  zmfmax = (paph(i, k)-paph(i, k-1))/(RG*pdtime)                  zmfmax = (paph(i, k) - paph(i, k-1)) / (RG * pdtime)
147                  pmfub(i) = MIN(zzzmb, zmfmax)                  pmfub(i) = MIN(zzzmb, zmfmax)
148                  pmfu(i, k+1) = pmfub(i)                  pmfu(i, k+1) = pmfub(i)
149                  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))
150                  pmfuq(i, k+1) = pmfub(i)*pqu(i, k+1)                  pmfuq(i, k+1) = pmfub(i) * pqu(i, k+1)
151                  pmful(i, k+1) = 0.0                  pmful(i, k+1) = 0.0
152                  pdmfup(i, k+1) = 0.0                  pdmfup(i, k+1) = 0.0
153                  kcbot(i) = k                  kcbot(i) = k
# Line 163  contains Line 172  contains
172         DO i = 1, klon         DO i = 1, klon
173            pen_u(i, k) = 0.0            pen_u(i, k) = 0.0
174            pde_u(i, k) = 0.0            pde_u(i, k) = 0.0
175            zrho(i)=paph(i, k+1)/(RD*ptenh(i, k+1))            zrho(i) = paph(i, k + 1) / (RD * ptenh(i, k + 1))
176            zpbot(i)=paph(i, kcbot(i))            zpbot(i) = paph(i, kcbot(i))
177            zptop(i)=paph(i, kctop0(i))            zptop(i) = paph(i, kctop0(i))
178         ENDDO         ENDDO
179    
180         DO i = 1, klon         DO i = 1, klon
181            IF(ldcum(i)) THEN            IF (ldcum(i)) THEN
182               zdprho=(paph(i, k+1)-paph(i, k))/(RG*zrho(i))               zdprho = (paph(i, k + 1) - paph(i, k)) / (RG * zrho(i))
183               zentr=pentr(i)*pmfu(i, k+1)*zdprho               zentr=pentr(i) * pmfu(i, k+1) * zdprho
184               llo1=k < kcbot(i)               llo1=k < kcbot(i)
185               IF(llo1) pde_u(i, k)=zentr               IF (llo1) pde_u(i, k)=zentr
186               zpmid=0.5*(zpbot(i)+zptop(i))               zpmid=0.5 * (zpbot(i)+zptop(i))
187               llo2=llo1.AND.ktype(i) == 2.AND. &               llo2 = llo1 .AND. ktype(i) == 2 &
188                    (zpbot(i)-paph(i, k) < 0.2E5.OR. &                    .AND. (zpbot(i) - paph(i, k) < 0.2E5 .OR. paph(i, k) > zpmid)
189                    paph(i, k) > zpmid)               IF (llo2) pen_u(i, k)=zentr
190               IF(llo2) pen_u(i, k)=zentr               llo2 = llo1 .AND. (ktype(i) == 1 .OR. ktype(i) == 3) .AND. &
191               llo2=llo1.AND.(ktype(i) == 1.OR.ktype(i) == 3).AND. &                    (k >= MAX(klwmin(i), kctop0(i) + 2) .OR. pap(i, k) > zpmid)
192                    (k.GE.MAX(klwmin(i), kctop0(i)+2).OR.pap(i, k) > zpmid)               IF (llo2) pen_u(i, k)=zentr
193               IF(llo2) pen_u(i, k)=zentr               llo1=pen_u(i, k) > 0. .AND. (ktype(i) == 1 .OR. ktype(i) == 2)
194               llo1=pen_u(i, k) > 0..AND.(ktype(i) == 1.OR.ktype(i) == 2)               IF (llo1) THEN
195               IF(llo1) THEN                  fact = 1. + 3. * (1. - MIN(1., (zpbot(i) - pap(i, k)) / 1.5E4))
196                  zentr=zentr*(1.+3.*(1.-MIN(1., (zpbot(i)-pap(i, k))/1.5E4)))                  zentr = zentr * fact
197                  pen_u(i, k)=pen_u(i, k)*(1.+3.*(1.-MIN(1., &                  pen_u(i, k)=pen_u(i, k) * fact
198                       (zpbot(i)-pap(i, k))/1.5E4)))                  pde_u(i, k)=pde_u(i, k) * fact
                 pde_u(i, k)=pde_u(i, k)*(1.+3.*(1.-MIN(1., &  
                      (zpbot(i)-pap(i, k))/1.5E4)))  
199               ENDIF               ENDIF
200               IF(llo2.AND.pqenh(i, k+1) > 1.E-5) &               IF (llo2 .AND. pqenh(i, k+1) > 1e-5) &
201                    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) * &
202                    zrho(i)*zdprho                    zrho(i) * zdprho
203            ENDIF            ENDIF
204         end DO         end DO
205    
# Line 202  contains Line 209  contains
209            IF (llflag(i)) THEN            IF (llflag(i)) THEN
210               IF (k < kcbot(i)) THEN               IF (k < kcbot(i)) THEN
211                  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)
212                  zmfmax = MIN(zmftest, (paph(i, k)-paph(i, k-1))/(RG*pdtime))                  zmfmax = MIN(zmftest, &
213                         (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 236  contains Line 244  contains
244         CALL flxadjtq(paph(1, k), ptu(1, k), pqu(1, k), llflag, icall)         CALL flxadjtq(paph(1, k), ptu(1, k), pqu(1, k), llflag, icall)
245    
246         DO i = 1, klon         DO i = 1, klon
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.
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      end DO      end DO
277    
278      ! Determine convective fluxes above non-buoyancy level (note:      ! Determine convective fluxes above non-buoyancy level (note:
# Line 288  contains Line 295  contains
295         DO i = 1, klon         DO i = 1, klon
296            IF (ldcum(i)) THEN            IF (ldcum(i)) THEN
297               k=kctop(i)-1               k=kctop(i)-1
298               pde_u(i, k)=(1.-CMFCTOP)*pmfu(i, k+1)               pde_u(i, k)=(1.-CMFCTOP) * pmfu(i, k+1)
299               plude(i, k)=pde_u(i, k)*plu(i, k+1)               plude(i, k)=pde_u(i, k) * plu(i, k+1)
300               pmfu(i, k)=pmfu(i, k+1)-pde_u(i, k)               pmfu(i, k)=pmfu(i, k+1)-pde_u(i, k)
301               zlnew=plu(i, k)               zlnew=plu(i, k)
302               pdmfup(i, k)=MAX(0., (plu(i, k)-zlnew)*pmfu(i, k))               pdmfup(i, k)=MAX(0., (plu(i, k)-zlnew) * pmfu(i, k))
303               plu(i, k)=zlnew               plu(i, k)=zlnew
304               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)
305               pmfuq(i, k)=pqu(i, k)*pmfu(i, k)               pmfuq(i, k)=pqu(i, k) * pmfu(i, k)
306               pmful(i, k)=plu(i, k)*pmfu(i, k)               pmful(i, k)=plu(i, k) * pmfu(i, k)
307               plude(i, k-1)=pmful(i, k)               plude(i, k-1)=pmful(i, k)
308            ENDIF            ENDIF
309         end DO         end DO

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

  ViewVC Help
Powered by ViewVC 1.1.21