/[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 70 - (show annotations)
Mon Jun 24 15:39:52 2013 UTC (10 years, 11 months ago) by guez
File size: 10308 byte(s)
In procedure, "addfi" access directly the module variable "dtphys"
instead of going through an argument.

In "conflx", do not create a local variable for temperature with
reversed order of vertical levels. Instead, give an actual argument
with reversed order in "physiq".

Changed names of variables "rmd" and "rmv" from module "suphec_m" to
"md" and "mv".

In "hgardfou", print only the first temperature out of range found.

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

  ViewVC Help
Powered by ViewVC 1.1.21