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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 52 - (show annotations)
Fri Sep 23 12:28:01 2011 UTC (12 years, 7 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 !--------------------------------------------------------------------
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