/[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 71 - (show annotations)
Mon Jul 8 18:12:18 2013 UTC (10 years, 9 months ago) by guez
File size: 10353 byte(s)
No reason to call inidissip in ce0l.

In inidissip, set random seed to 1 beacuse PGI compiler does not
accept all zeros.

dq was computed needlessly in caladvtrac. Arguments masse and dq of
calfis not used.

Replaced real*8 by double precision.

Pass arrays with inverted order of vertical levels to conflx instead
of creating local variables for this inside conflx.

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

  ViewVC Help
Powered by ViewVC 1.1.21