/[lmdze]/trunk/phylmd/Conflx/flxmain.f
ViewVC logotype

Contents of /trunk/phylmd/Conflx/flxmain.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 63 - (show annotations)
Wed Aug 1 14:13:57 2012 UTC (11 years, 10 months ago) by guez
Original Path: trunk/libf/phylmd/Conflx/flxmain.f90
File size: 10201 byte(s)
Superficial changes
1 module flxmain_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE flxmain(pdtime, pten, pqen, pqsen, pqhfl, pap, paph, pgeo, &
8 ldland, ptte, pqte, pvervel, prsfc, pssfc, kcbot, kctop, kdtop, pmfu, &
9 pmfd, pen_u, pde_u, pen_d, pde_d, dt_con, dq_con, pmflxr, pmflxs)
10
11 USE dimphy, ONLY: klev, klon
12 USE suphec_m, ONLY: rcpd, retv, rg, rlvtt
13 USE yoethf_m, ONLY: r4les, r5les
14 USE yoecumf, ONLY: cmfdeps, entrpen, entrscv, lmfdd
15 use flxsetup_m, only: flxsetup
16
17 REAL pten(klon,klev), pqen(klon,klev), pqsen(klon,klev)
18 REAL ptte(klon,klev)
19 REAL pqte(klon,klev)
20 REAL pvervel(klon,klev)
21 REAL pgeo(klon,klev), pap(klon,klev), paph(klon,klev+1)
22 REAL pqhfl(klon)
23
24 REAL ptu(klon,klev), pqu(klon,klev), plu(klon,klev)
25 REAL plude(klon,klev)
26 REAL pmfu(klon,klev)
27 REAL prsfc(klon), pssfc(klon)
28 INTEGER kcbot(klon), kctop(klon), ktype(klon)
29 LOGICAL ldland(klon), ldcum(klon)
30
31 REAL ztenh(klon,klev), zqenh(klon,klev), zqsenh(klon,klev)
32 REAL zgeoh(klon,klev)
33 REAL zmfub(klon), zmfub1(klon)
34 REAL zmfus(klon,klev), zmfuq(klon,klev), zmful(klon,klev)
35 REAL zdmfup(klon,klev), zdpmel(klon,klev)
36 REAL zentr(klon), zhcbase(klon)
37 REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon)
38 REAL zrfl(klon)
39 REAL pmflxr(klon,klev+1)
40 REAL pmflxs(klon,klev+1)
41 INTEGER ilab(klon,klev), ictop0(klon)
42 LOGICAL llo1
43 REAL dt_con(klon,klev), dq_con(klon,klev)
44 REAL zmfmax, zdh
45 REAL, intent(in):: pdtime
46 real zqumqe, zdqmin, zalvdcp, zhsat, zzz
47 REAL zhhat, zpbmpt, zgam, zeps, zfac
48 INTEGER i, k, ikb, itopm2, kcum
49
50 REAL pen_u(klon,klev), pde_u(klon,klev)
51 REAL pen_d(klon,klev), pde_d(klon,klev)
52
53 REAL ptd(klon,klev), pqd(klon,klev), pmfd(klon,klev)
54 REAL zmfds(klon,klev), zmfdq(klon,klev), zdmfdp(klon,klev)
55 INTEGER kdtop(klon)
56 LOGICAL lddraf(klon)
57
58 LOGICAL:: firstcal = .TRUE.
59
60 !---------------------------------------------------------------------
61
62 IF (firstcal) THEN
63 CALL flxsetup
64 firstcal = .FALSE.
65 ENDIF
66
67 DO i = 1, klon
68 ldcum(i) = .FALSE.
69 ENDDO
70 DO k = 1, klev
71 DO i = 1, klon
72 dt_con(i,k) = 0.0
73 dq_con(i,k) = 0.0
74 ENDDO
75 ENDDO
76
77 ! initialiser les variables et faire l'interpolation verticale
78
79 CALL flxini(pten, pqen, pqsen, pgeo, &
80 paph, zgeoh, ztenh, zqenh, zqsenh, &
81 ptu, pqu, ptd, pqd, pmfd, zmfds, zmfdq, zdmfdp, &
82 pmfu, zmfus, zmfuq, zdmfup, &
83 zdpmel, plu, plude, ilab, pen_u, pde_u, pen_d, pde_d)
84
85 ! determiner les valeurs au niveau de base de la tour convective
86
87 CALL flxbase(ztenh, zqenh, zgeoh, paph, &
88 ptu, pqu, plu, ldcum, kcbot, ilab)
89
90 ! calculer la convergence totale de l'humidite et celle en provenance
91 ! de la couche limite, plus precisement, la convergence integree entre
92 ! le sol et la base de la convection. Cette derniere convergence est
93 ! comparee avec l'evaporation obtenue dans la couche limite pour
94 ! determiner le type de la convection
95
96 k=1
97 DO i = 1, klon
98 zdqcv(i) = pqte(i,k)*(paph(i,k+1)-paph(i,k))
99 zdhpbl(i) = 0.0
100 zdqpbl(i) = 0.0
101 ENDDO
102
103 DO k=2,klev
104 DO i = 1, klon
105 zdqcv(i)=zdqcv(i)+pqte(i,k)*(paph(i,k+1)-paph(i,k))
106 IF (k.GE.kcbot(i)) THEN
107 zdqpbl(i)=zdqpbl(i)+pqte(i,k)*(paph(i,k+1)-paph(i,k))
108 zdhpbl(i)=zdhpbl(i)+(RCPD*ptte(i,k)+RLVTT*pqte(i,k)) &
109 *(paph(i,k+1)-paph(i,k))
110 ENDIF
111 ENDDO
112 ENDDO
113
114 DO i = 1, klon
115 ktype(i) = 2
116 if (zdqcv(i).GT.MAX(0.,-1.5*pqhfl(i)*RG)) ktype(i) = 1
117 !cc if (zdqcv(i).GT.MAX(0.,-1.1*pqhfl(i)*RG)) ktype(i) = 1
118 ENDDO
119
120 ! determiner le flux de masse entrant a travers la base.
121 ! on ignore, pour l'instant, l'effet du panache descendant
122
123 DO i = 1, klon
124 ikb=kcbot(i)
125 zqumqe=pqu(i,ikb)+plu(i,ikb)-zqenh(i,ikb)
126 zdqmin=MAX(0.01*zqenh(i,ikb),1.E-10)
127 IF (zdqpbl(i).GT.0..AND.zqumqe.GT.zdqmin.AND.ldcum(i)) THEN
128 zmfub(i) = zdqpbl(i)/(RG*MAX(zqumqe,zdqmin))
129 ELSE
130 zmfub(i) = 0.01
131 ldcum(i)=.FALSE.
132 ENDIF
133 IF (ktype(i).EQ.2) THEN
134 zdh = RCPD*(ptu(i,ikb)-ztenh(i,ikb)) + RLVTT*zqumqe
135 zdh = RG * MAX(zdh,1.0E5*zdqmin)
136 IF (zdhpbl(i).GT.0..AND.ldcum(i))zmfub(i)=zdhpbl(i)/zdh
137 ENDIF
138 zmfmax = (paph(i,ikb)-paph(i,ikb-1)) / (RG*pdtime)
139 zmfub(i) = MIN(zmfub(i),zmfmax)
140 zentr(i) = ENTRSCV
141 IF (ktype(i).EQ.1) zentr(i) = ENTRPEN
142 ENDDO
143
144 ! DETERMINE CLOUD ASCENT FOR ENTRAINING PLUME
145
146 ! (A) calculer d'abord la hauteur "theorique" de la tour convective sans
147 ! considerer l'entrainement ni le detrainement du panache, sachant
148 ! ces derniers peuvent abaisser la hauteur theorique.
149
150 DO i = 1, klon
151 ikb=kcbot(i)
152 zhcbase(i)=RCPD*ptu(i,ikb)+zgeoh(i,ikb)+RLVTT*pqu(i,ikb)
153 ictop0(i)=kcbot(i)-1
154 ENDDO
155
156 zalvdcp=RLVTT/RCPD
157 DO k=klev-1,3,-1
158 DO i = 1, klon
159 zhsat=RCPD*ztenh(i,k)+zgeoh(i,k)+RLVTT*zqsenh(i,k)
160 zgam=R5LES*zalvdcp*zqsenh(i,k)/ &
161 ((1.-RETV *zqsenh(i,k))*(ztenh(i,k)-R4LES)**2)
162 zzz=RCPD*ztenh(i,k)*0.608
163 zhhat=zhsat-(zzz+zgam*zzz)/(1.+zgam*zzz/RLVTT)* &
164 MAX(zqsenh(i,k)-zqenh(i,k),0.)
165 IF(k.LT.ictop0(i).AND.zhcbase(i).GT.zhhat) ictop0(i)=k
166 ENDDO
167 ENDDO
168
169 ! (B) calculer le panache ascendant
170
171 CALL flxasc(pdtime,ztenh, zqenh, pten, pqen, pqsen, &
172 pgeo, zgeoh, pap, paph, pqte, pvervel, &
173 ldland, ldcum, ktype, ilab, &
174 ptu, pqu, plu, pmfu, zmfub, zentr, &
175 zmfus, zmfuq, zmful, plude, zdmfup, &
176 kcbot, kctop, ictop0, kcum, pen_u, pde_u)
177
178 IF (kcum /= 0) then
179 ! verifier l'epaisseur de la convection et changer eventuellement
180 ! le taux d'entrainement/detrainement
181
182 DO i = 1, klon
183 zpbmpt=paph(i,kcbot(i))-paph(i,kctop(i))
184 IF(ldcum(i).AND.ktype(i).EQ.1.AND.zpbmpt.LT.2.E4)ktype(i)=2
185 IF(ldcum(i)) ictop0(i)=kctop(i)
186 IF(ktype(i).EQ.2) zentr(i)=ENTRSCV
187 ENDDO
188
189 IF (lmfdd) THEN ! si l'on considere le panache descendant
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 ENDIF ! fin de test sur lmfdd
262
263 ! calculer de nouveau le panache ascendant
264
265 CALL flxasc(pdtime,ztenh, zqenh, pten, pqen, pqsen, &
266 pgeo, zgeoh, pap, paph, pqte, pvervel, &
267 ldland, ldcum, ktype, ilab, &
268 ptu, pqu, plu, pmfu, zmfub, zentr, &
269 zmfus, zmfuq, zmful, plude, zdmfup, &
270 kcbot, kctop, ictop0, kcum, pen_u, pde_u)
271
272 ! determiner les flux convectifs en forme finale, ainsi que
273 ! la quantite des precipitations
274
275 CALL flxflux(pdtime, pqen, pqsen, ztenh, zqenh, pap, paph, &
276 ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, &
277 pmfu, pmfd, zmfus, zmfds, zmfuq, zmfdq, zmful, plude, &
278 zdmfup, zdmfdp, pten, prsfc, pssfc, zdpmel, itopm2, &
279 pmflxr, pmflxs)
280
281 ! calculer les tendances pour T et Q
282
283 CALL flxdtdq(itopm2, paph, ldcum, pten, &
284 zmfus, zmfds, zmfuq, zmfdq, zmful, zdmfup, zdmfdp, zdpmel, &
285 dt_con,dq_con)
286 end IF
287
288 END SUBROUTINE flxmain
289
290 end module flxmain_m

  ViewVC Help
Powered by ViewVC 1.1.21