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

Annotation of /trunk/libf/phylmd/Conflx/flxmain.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 52 - (hide annotations)
Fri Sep 23 12:28:01 2011 UTC (12 years, 9 months ago) by guez
File size: 11334 byte(s)
Split "conflx.f" into single-procedure files in directory "Conflx".

Split "cv_routines.f" into single-procedure files in directory
"CV_routines". Made module "cvparam" from included file
"cvparam.h". No included file other than "netcdf.inc" left in LMDZE.

1 guez 52 !--------------------------------------------------------------------
2     SUBROUTINE flxmain(pdtime, pten, pqen, pqsen, pqhfl, pap, paph, &
3     pgeo, ldland, ptte, pqte, pvervel, &
4     prsfc, pssfc, kcbot, kctop, kdtop, &
5     pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, &
6     dt_con, dq_con, pmflxr, pmflxs)
7     use dimens_m
8     use dimphy
9     use SUPHEC_M
10     use yoethf_m
11     use yoecumf
12     IMPLICIT none
13     ! ------------------------------------------------------------------
14     ! ----------------------------------------------------------------
15     REAL pten(klon,klev), pqen(klon,klev), pqsen(klon,klev)
16     REAL ptte(klon,klev)
17     REAL pqte(klon,klev)
18     REAL pvervel(klon,klev)
19     REAL pgeo(klon,klev), pap(klon,klev), paph(klon,klev+1)
20     REAL pqhfl(klon)
21     !
22     REAL ptu(klon,klev), pqu(klon,klev), plu(klon,klev)
23     REAL plude(klon,klev)
24     REAL pmfu(klon,klev)
25     REAL prsfc(klon), pssfc(klon)
26     INTEGER kcbot(klon), kctop(klon), ktype(klon)
27     LOGICAL ldland(klon), ldcum(klon)
28     !
29     REAL ztenh(klon,klev), zqenh(klon,klev), zqsenh(klon,klev)
30     REAL zgeoh(klon,klev)
31     REAL zmfub(klon), zmfub1(klon)
32     REAL zmfus(klon,klev), zmfuq(klon,klev), zmful(klon,klev)
33     REAL zdmfup(klon,klev), zdpmel(klon,klev)
34     REAL zentr(klon), zhcbase(klon)
35     REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon)
36     REAL zrfl(klon)
37     REAL pmflxr(klon,klev+1)
38     REAL pmflxs(klon,klev+1)
39     INTEGER ilab(klon,klev), ictop0(klon)
40     LOGICAL llo1
41     REAL dt_con(klon,klev), dq_con(klon,klev)
42     REAL zmfmax, zdh
43     REAL, intent(in):: pdtime
44     real zqumqe, zdqmin, zalvdcp, zhsat, zzz
45     REAL zhhat, zpbmpt, zgam, zeps, zfac
46     INTEGER i, k, ikb, itopm2, kcum
47     !
48     REAL pen_u(klon,klev), pde_u(klon,klev)
49     REAL pen_d(klon,klev), pde_d(klon,klev)
50     !
51     REAL ptd(klon,klev), pqd(klon,klev), pmfd(klon,klev)
52     REAL zmfds(klon,klev), zmfdq(klon,klev), zdmfdp(klon,klev)
53     INTEGER kdtop(klon)
54     LOGICAL lddraf(klon)
55     !---------------------------------------------------------------------
56     LOGICAL firstcal
57     SAVE firstcal
58     DATA firstcal / .TRUE. /
59     !---------------------------------------------------------------------
60     IF (firstcal) THEN
61     CALL flxsetup
62     firstcal = .FALSE.
63     ENDIF
64     !---------------------------------------------------------------------
65     DO i = 1, klon
66     ldcum(i) = .FALSE.
67     ENDDO
68     DO k = 1, klev
69     DO i = 1, klon
70     dt_con(i,k) = 0.0
71     dq_con(i,k) = 0.0
72     ENDDO
73     ENDDO
74     !----------------------------------------------------------------------
75     ! initialiser les variables et faire l'interpolation verticale
76     !----------------------------------------------------------------------
77     CALL flxini(pten, pqen, pqsen, pgeo, &
78     paph, zgeoh, ztenh, zqenh, zqsenh, &
79     ptu, pqu, ptd, pqd, pmfd, zmfds, zmfdq, zdmfdp, &
80     pmfu, zmfus, zmfuq, zdmfup, &
81     zdpmel, plu, plude, ilab, pen_u, pde_u, pen_d, pde_d)
82     !---------------------------------------------------------------------
83     ! determiner les valeurs au niveau de base de la tour convective
84     !---------------------------------------------------------------------
85     CALL flxbase(ztenh, zqenh, zgeoh, paph, &
86     ptu, pqu, plu, ldcum, kcbot, ilab)
87     !---------------------------------------------------------------------
88     ! calculer la convergence totale de l'humidite et celle en provenance
89     ! de la couche limite, plus precisement, la convergence integree entre
90     ! le sol et la base de la convection. Cette derniere convergence est
91     ! comparee avec l'evaporation obtenue dans la couche limite pour
92     ! determiner le type de la convection
93     !---------------------------------------------------------------------
94     k=1
95     DO i = 1, klon
96     zdqcv(i) = pqte(i,k)*(paph(i,k+1)-paph(i,k))
97     zdhpbl(i) = 0.0
98     zdqpbl(i) = 0.0
99     ENDDO
100     !
101     DO k=2,klev
102     DO i = 1, klon
103     zdqcv(i)=zdqcv(i)+pqte(i,k)*(paph(i,k+1)-paph(i,k))
104     IF (k.GE.kcbot(i)) THEN
105     zdqpbl(i)=zdqpbl(i)+pqte(i,k)*(paph(i,k+1)-paph(i,k))
106     zdhpbl(i)=zdhpbl(i)+(RCPD*ptte(i,k)+RLVTT*pqte(i,k)) &
107     *(paph(i,k+1)-paph(i,k))
108     ENDIF
109     ENDDO
110     ENDDO
111     !
112     DO i = 1, klon
113     ktype(i) = 2
114     if (zdqcv(i).GT.MAX(0.,-1.5*pqhfl(i)*RG)) ktype(i) = 1
115     !cc if (zdqcv(i).GT.MAX(0.,-1.1*pqhfl(i)*RG)) ktype(i) = 1
116     ENDDO
117     !
118     !---------------------------------------------------------------------
119     ! determiner le flux de masse entrant a travers la base.
120     ! on ignore, pour l'instant, l'effet du panache descendant
121     !---------------------------------------------------------------------
122     DO i = 1, klon
123     ikb=kcbot(i)
124     zqumqe=pqu(i,ikb)+plu(i,ikb)-zqenh(i,ikb)
125     zdqmin=MAX(0.01*zqenh(i,ikb),1.E-10)
126     IF (zdqpbl(i).GT.0..AND.zqumqe.GT.zdqmin.AND.ldcum(i)) THEN
127     zmfub(i) = zdqpbl(i)/(RG*MAX(zqumqe,zdqmin))
128     ELSE
129     zmfub(i) = 0.01
130     ldcum(i)=.FALSE.
131     ENDIF
132     IF (ktype(i).EQ.2) THEN
133     zdh = RCPD*(ptu(i,ikb)-ztenh(i,ikb)) + RLVTT*zqumqe
134     zdh = RG * MAX(zdh,1.0E5*zdqmin)
135     IF (zdhpbl(i).GT.0..AND.ldcum(i))zmfub(i)=zdhpbl(i)/zdh
136     ENDIF
137     zmfmax = (paph(i,ikb)-paph(i,ikb-1)) / (RG*pdtime)
138     zmfub(i) = MIN(zmfub(i),zmfmax)
139     zentr(i) = ENTRSCV
140     IF (ktype(i).EQ.1) zentr(i) = ENTRPEN
141     ENDDO
142     !-----------------------------------------------------------------------
143     ! DETERMINE CLOUD ASCENT FOR ENTRAINING PLUME
144     !-----------------------------------------------------------------------
145     ! (A) calculer d'abord la hauteur "theorique" de la tour convective sans
146     ! considerer l'entrainement ni le detrainement du panache, sachant
147     ! ces derniers peuvent abaisser la hauteur theorique.
148     !
149     DO i = 1, klon
150     ikb=kcbot(i)
151     zhcbase(i)=RCPD*ptu(i,ikb)+zgeoh(i,ikb)+RLVTT*pqu(i,ikb)
152     ictop0(i)=kcbot(i)-1
153     ENDDO
154     !
155     zalvdcp=RLVTT/RCPD
156     DO k=klev-1,3,-1
157     DO i = 1, klon
158     zhsat=RCPD*ztenh(i,k)+zgeoh(i,k)+RLVTT*zqsenh(i,k)
159     zgam=R5LES*zalvdcp*zqsenh(i,k)/ &
160     ((1.-RETV *zqsenh(i,k))*(ztenh(i,k)-R4LES)**2)
161     zzz=RCPD*ztenh(i,k)*0.608
162     zhhat=zhsat-(zzz+zgam*zzz)/(1.+zgam*zzz/RLVTT)* &
163     MAX(zqsenh(i,k)-zqenh(i,k),0.)
164     IF(k.LT.ictop0(i).AND.zhcbase(i).GT.zhhat) ictop0(i)=k
165     ENDDO
166     ENDDO
167     !
168     ! (B) calculer le panache ascendant
169     !
170     CALL flxasc(pdtime,ztenh, zqenh, pten, pqen, pqsen, &
171     pgeo, zgeoh, pap, paph, pqte, pvervel, &
172     ldland, ldcum, ktype, ilab, &
173     ptu, pqu, plu, pmfu, zmfub, zentr, &
174     zmfus, zmfuq, zmful, plude, zdmfup, &
175     kcbot, kctop, ictop0, kcum, pen_u, pde_u)
176     IF (kcum.EQ.0) GO TO 1000
177     !
178     ! verifier l'epaisseur de la convection et changer eventuellement
179     ! le taux d'entrainement/detrainement
180     !
181     DO i = 1, klon
182     zpbmpt=paph(i,kcbot(i))-paph(i,kctop(i))
183     IF(ldcum(i).AND.ktype(i).EQ.1.AND.zpbmpt.LT.2.E4)ktype(i)=2
184     IF(ldcum(i)) ictop0(i)=kctop(i)
185     IF(ktype(i).EQ.2) zentr(i)=ENTRSCV
186     ENDDO
187     !
188     IF (lmfdd) THEN ! si l'on considere le panache descendant
189     !
190     ! calculer la precipitation issue du panache ascendant pour
191     ! determiner l'existence du panache descendant dans la convection
192     DO i = 1, klon
193     zrfl(i)=zdmfup(i,1)
194     ENDDO
195     DO k=2,klev
196     DO i = 1, klon
197     zrfl(i)=zrfl(i)+zdmfup(i,k)
198     ENDDO
199     ENDDO
200     !
201     ! determiner le LFS (level of free sinking: niveau de plonge libre)
202     CALL flxdlfs(ztenh, zqenh, zgeoh, paph, ptu, pqu, &
203     ldcum, kcbot, kctop, zmfub, zrfl, &
204     ptd, pqd, &
205     pmfd, zmfds, zmfdq, zdmfdp, &
206     kdtop, lddraf)
207     !
208     ! calculer le panache descendant
209     CALL flxddraf(ztenh, zqenh, &
210     zgeoh, paph, zrfl, &
211     ptd, pqd, &
212     pmfd, zmfds, zmfdq, zdmfdp, &
213     lddraf, pen_d, pde_d)
214     !
215     ! calculer de nouveau le flux de masse entrant a travers la base
216     ! de la convection, sachant qu'il a ete modifie par le panache
217     ! descendant
218     DO i = 1, klon
219     IF (lddraf(i)) THEN
220     ikb = kcbot(i)
221     llo1 = PMFD(i,ikb).LT.0.
222     zeps = 0.
223     IF ( llo1 ) zeps = CMFDEPS
224     zqumqe = pqu(i,ikb)+plu(i,ikb)- &
225     zeps*pqd(i,ikb)-(1.-zeps)*zqenh(i,ikb)
226     zdqmin = MAX(0.01*zqenh(i,ikb),1.E-10)
227     zmfmax = (paph(i,ikb)-paph(i,ikb-1)) / (RG*pdtime)
228     IF (zdqpbl(i).GT.0..AND.zqumqe.GT.zdqmin.AND.ldcum(i) &
229     .AND.zmfub(i).LT.zmfmax) THEN
230     zmfub1(i) = zdqpbl(i) / (RG*MAX(zqumqe,zdqmin))
231     ELSE
232     zmfub1(i) = zmfub(i)
233     ENDIF
234     IF (ktype(i).EQ.2) THEN
235     zdh = RCPD*(ptu(i,ikb)-zeps*ptd(i,ikb)- &
236     (1.-zeps)*ztenh(i,ikb))+RLVTT*zqumqe
237     zdh = RG * MAX(zdh,1.0E5*zdqmin)
238     IF (zdhpbl(i).GT.0..AND.ldcum(i))zmfub1(i)=zdhpbl(i)/zdh
239     ENDIF
240     IF ( .NOT.((ktype(i).EQ.1.OR.ktype(i).EQ.2).AND. &
241     ABS(zmfub1(i)-zmfub(i)).LT.0.2*zmfub(i)) ) &
242     zmfub1(i) = zmfub(i)
243     ENDIF
244     ENDDO
245     DO k = 1, klev
246     DO i = 1, klon
247     IF (lddraf(i)) THEN
248     zfac = zmfub1(i)/MAX(zmfub(i),1.E-10)
249     pmfd(i,k) = pmfd(i,k)*zfac
250     zmfds(i,k) = zmfds(i,k)*zfac
251     zmfdq(i,k) = zmfdq(i,k)*zfac
252     zdmfdp(i,k) = zdmfdp(i,k)*zfac
253     pen_d(i,k) = pen_d(i,k)*zfac
254     pde_d(i,k) = pde_d(i,k)*zfac
255     ENDIF
256     ENDDO
257     ENDDO
258     DO i = 1, klon
259     IF (lddraf(i)) zmfub(i)=zmfub1(i)
260     ENDDO
261     !
262     ENDIF ! fin de test sur lmfdd
263     !
264     !-----------------------------------------------------------------------
265     ! calculer de nouveau le panache ascendant
266     !-----------------------------------------------------------------------
267     CALL flxasc(pdtime,ztenh, zqenh, pten, pqen, pqsen, &
268     pgeo, zgeoh, pap, paph, pqte, pvervel, &
269     ldland, ldcum, ktype, ilab, &
270     ptu, pqu, plu, pmfu, zmfub, zentr, &
271     zmfus, zmfuq, zmful, plude, zdmfup, &
272     kcbot, kctop, ictop0, kcum, pen_u, pde_u)
273     !
274     !-----------------------------------------------------------------------
275     ! determiner les flux convectifs en forme finale, ainsi que
276     ! la quantite des precipitations
277     !-----------------------------------------------------------------------
278     CALL flxflux(pdtime, pqen, pqsen, ztenh, zqenh, pap, paph, &
279     ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, &
280     pmfu, pmfd, zmfus, zmfds, zmfuq, zmfdq, zmful, plude, &
281     zdmfup, zdmfdp, pten, prsfc, pssfc, zdpmel, itopm2, &
282     pmflxr, pmflxs)
283     !
284     !----------------------------------------------------------------------
285     ! calculer les tendances pour T et Q
286     !----------------------------------------------------------------------
287     CALL flxdtdq(itopm2, paph, ldcum, pten, &
288     zmfus, zmfds, zmfuq, zmfdq, zmful, zdmfup, zdmfdp, zdpmel, &
289     dt_con,dq_con)
290     !
291     1000 CONTINUE
292     RETURN
293     END

  ViewVC Help
Powered by ViewVC 1.1.21