/[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 73 - (show annotations)
Fri Nov 15 17:48:30 2013 UTC (10 years, 7 months ago) by guez
File size: 10181 byte(s)
Renamed tpot to teta and psol to ps in etat0.

Replaced calls to flincom by calls to NetCDF95 in startdyn. lon_ini,
lat_ini and levdyn_ini are now pointers.
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 ldcum = .FALSE.
78 dt_con = 0.
79 dq_con = 0.
80
81 ! Initialiser les variables et faire l'interpolation verticale :
82 CALL flxini(ten, qen, qsen, pgeo, paph, zgeoh, ztenh, zqenh, zqsenh, &
83 ptu, pqu, ptd, pqd, mfd, zmfds, zmfdq, zdmfdp, mfu, mfus, mfuq, &
84 zdmfup, zdpmel, plu, plude, ilab, pen_u, pde_u, pen_d, pde_d)
85
86 ! Déterminer les valeurs au niveau de base de la tour convective :
87 CALL flxbase(ztenh, zqenh, zgeoh, paph, ptu, pqu, plu, ldcum, kcbot, ilab)
88
89 ! Calculer la convergence totale de l'humidité et celle en
90 ! provenance de la couche limite, plus précisément, la convergence
91 ! intégrée entre le sol et la base de la convection. Cette
92 ! dernière convergence est comparée avec l'&vaporation obtenue
93 ! dans la couche limite pour déterminer le type de la convection.
94
95 zdqcv = pqte(:, 1) * (paph(:, 2) - paph(:, 1))
96 zdhpbl = 0.
97 zdqpbl = 0.
98
99 DO k=2, klev
100 DO i = 1, klon
101 zdqcv(i)=zdqcv(i)+pqte(i, k)*(paph(i, k+1)-paph(i, k))
102 IF (k.GE.kcbot(i)) THEN
103 zdqpbl(i)=zdqpbl(i)+pqte(i, k)*(paph(i, k+1)-paph(i, k))
104 zdhpbl(i)=zdhpbl(i)+(RCPD*ptte(i, k)+RLVTT*pqte(i, k)) &
105 *(paph(i, k+1)-paph(i, k))
106 ENDIF
107 ENDDO
108 ENDDO
109
110 DO i = 1, klon
111 if (zdqcv(i) > MAX(0., - 1.5 * pqhfl(i) * RG)) then
112 ktype(i) = 1
113 else
114 ktype(i) = 2
115 end if
116 ENDDO
117
118 ! Déterminer le flux de masse entrant à travers la base. On
119 ! ignore, pour l'instant, l'effet du panache descendant
120
121 DO i = 1, klon
122 ikb=kcbot(i)
123 zqumqe=pqu(i, ikb)+plu(i, ikb)-zqenh(i, ikb)
124 zdqmin=MAX(0.01*zqenh(i, ikb), 1.E-10)
125 IF (zdqpbl(i) > 0..AND.zqumqe > zdqmin.AND.ldcum(i)) THEN
126 mfub(i) = zdqpbl(i)/(RG*MAX(zqumqe, zdqmin))
127 ELSE
128 mfub(i) = 0.01
129 ldcum(i)=.FALSE.
130 ENDIF
131 IF (ktype(i) == 2) THEN
132 zdh = RCPD*(ptu(i, ikb)-ztenh(i, ikb)) + RLVTT*zqumqe
133 zdh = RG * MAX(zdh, 1.0E5*zdqmin)
134 IF (zdhpbl(i) > 0..AND.ldcum(i))mfub(i)=zdhpbl(i)/zdh
135 ENDIF
136 zmfmax = (paph(i, ikb)-paph(i, ikb-1)) / (RG*dtime)
137 mfub(i) = MIN(mfub(i), zmfmax)
138 zentr(i) = ENTRSCV
139 IF (ktype(i) == 1) zentr(i) = ENTRPEN
140 ENDDO
141
142 ! DETERMINE CLOUD ASCENT FOR ENTRAINING PLUME
143
144 ! (A) calculer d'abord la hauteur "theorique" de la tour convective sans
145 ! considerer l'entrainement ni le detrainement du panache, sachant
146 ! ces derniers peuvent abaisser la hauteur theorique.
147
148 DO i = 1, klon
149 ikb=kcbot(i)
150 zhcbase(i)=RCPD*ptu(i, ikb)+zgeoh(i, ikb)+RLVTT*pqu(i, ikb)
151 ictop0(i)=kcbot(i)-1
152 ENDDO
153
154 zalvdcp=RLVTT/RCPD
155 DO k=klev-1, 3, -1
156 DO i = 1, klon
157 zhsat=RCPD*ztenh(i, k)+zgeoh(i, k)+RLVTT*zqsenh(i, k)
158 zgam=R5LES*zalvdcp*zqsenh(i, k)/ &
159 ((1.-RETV *zqsenh(i, k))*(ztenh(i, k)-R4LES)**2)
160 zzz=RCPD*ztenh(i, k)*0.608
161 zhhat=zhsat-(zzz+zgam*zzz)/(1.+zgam*zzz/RLVTT)* &
162 MAX(zqsenh(i, k)-zqenh(i, k), 0.)
163 IF(k < ictop0(i).AND.zhcbase(i) > zhhat) ictop0(i)=k
164 ENDDO
165 ENDDO
166
167 ! (B) calculer le panache ascendant
168
169 CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, &
170 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, &
171 mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, &
172 kctop, ictop0, kcum, pen_u, pde_u)
173
174 kcum_not_zero: IF (kcum /= 0) then
175 ! verifier l'epaisseur de la convection et changer eventuellement
176 ! le taux d'entrainement/detrainement
177
178 DO i = 1, klon
179 zpbmpt=paph(i, kcbot(i))-paph(i, kctop(i))
180 IF(ldcum(i) .AND. ktype(i) == 1 .AND. zpbmpt < 2E4) ktype(i) = 2
181 IF(ldcum(i)) ictop0(i)=kctop(i)
182 IF(ktype(i) == 2) zentr(i)=ENTRSCV
183 ENDDO
184
185 downdraft: IF (lmfdd) THEN
186 ! si l'on considere le panache descendant
187 ! calculer la precipitation issue du panache ascendant pour
188 ! determiner l'existence du panache descendant dans la convection
189 DO i = 1, klon
190 zrfl(i)=zdmfup(i, 1)
191 ENDDO
192 DO k=2, klev
193 DO i = 1, klon
194 zrfl(i)=zrfl(i)+zdmfup(i, k)
195 ENDDO
196 ENDDO
197
198 ! determiner le LFS (level of free sinking: niveau de plonge libre)
199 CALL flxdlfs(ztenh, zqenh, zgeoh, paph, ptu, pqu, &
200 ldcum, kcbot, kctop, mfub, zrfl, &
201 ptd, pqd, &
202 mfd, zmfds, zmfdq, zdmfdp, &
203 kdtop, lddraf)
204
205 ! calculer le panache descendant
206 CALL flxddraf(ztenh, zqenh, &
207 zgeoh, paph, zrfl, &
208 ptd, pqd, &
209 mfd, zmfds, zmfdq, zdmfdp, &
210 lddraf, pen_d, pde_d)
211
212 ! calculer de nouveau le flux de masse entrant a travers la base
213 ! de la convection, sachant qu'il a ete modifie par le panache
214 ! descendant
215 DO i = 1, klon
216 IF (lddraf(i)) THEN
217 ikb = kcbot(i)
218 llo1 = MFD(i, ikb) < 0.
219 zeps = 0.
220 IF (llo1) zeps = CMFDEPS
221 zqumqe = pqu(i, ikb)+plu(i, ikb)- &
222 zeps*pqd(i, ikb)-(1.-zeps)*zqenh(i, ikb)
223 zdqmin = MAX(0.01*zqenh(i, ikb), 1.E-10)
224 zmfmax = (paph(i, ikb)-paph(i, ikb-1)) / (RG*dtime)
225 IF (zdqpbl(i) > 0..AND.zqumqe > zdqmin.AND.ldcum(i) &
226 .AND.mfub(i) < zmfmax) THEN
227 mfub1(i) = zdqpbl(i) / (RG*MAX(zqumqe, zdqmin))
228 ELSE
229 mfub1(i) = mfub(i)
230 ENDIF
231 IF (ktype(i) == 2) THEN
232 zdh = RCPD*(ptu(i, ikb)-zeps*ptd(i, ikb)- &
233 (1.-zeps)*ztenh(i, ikb))+RLVTT*zqumqe
234 zdh = RG * MAX(zdh, 1.0E5*zdqmin)
235 IF (zdhpbl(i) > 0..AND.ldcum(i))mfub1(i)=zdhpbl(i)/zdh
236 ENDIF
237 IF (.NOT. ((ktype(i) == 1 .OR. ktype(i) == 2) .AND. &
238 ABS(mfub1(i)-mfub(i)) < 0.2*mfub(i))) &
239 mfub1(i) = mfub(i)
240 ENDIF
241 ENDDO
242 DO k = 1, klev
243 DO i = 1, klon
244 IF (lddraf(i)) THEN
245 zfac = mfub1(i)/MAX(mfub(i), 1.E-10)
246 mfd(i, k) = mfd(i, k)*zfac
247 zmfds(i, k) = zmfds(i, k)*zfac
248 zmfdq(i, k) = zmfdq(i, k)*zfac
249 zdmfdp(i, k) = zdmfdp(i, k)*zfac
250 pen_d(i, k) = pen_d(i, k)*zfac
251 pde_d(i, k) = pde_d(i, k)*zfac
252 ENDIF
253 ENDDO
254 ENDDO
255 DO i = 1, klon
256 IF (lddraf(i)) mfub(i)=mfub1(i)
257 ENDDO
258 ENDIF downdraft
259
260 ! calculer de nouveau le panache ascendant
261
262 CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, &
263 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, &
264 mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, &
265 kctop, ictop0, kcum, pen_u, pde_u)
266
267 ! Déterminer les flux convectifs en forme finale, ainsi que la
268 ! quantité des précipitations
269
270 CALL flxflux(dtime, qen, qsen, ztenh, zqenh, pap, paph, &
271 ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, &
272 mfu, mfd, mfus, zmfds, mfuq, zmfdq, mful, plude, &
273 zdmfup, zdmfdp, ten, prsfc, pssfc, zdpmel, itopm2, &
274 pmflxr, pmflxs)
275
276 ! calculer les tendances pour T et Q
277
278 CALL flxdtdq(itopm2, paph, ldcum, ten, mfus, zmfds, mfuq, zmfdq, &
279 mful, zdmfup, zdmfdp, zdpmel, dt_con, dq_con)
280 end IF kcum_not_zero
281
282 END SUBROUTINE flxmain
283
284 end module flxmain_m

  ViewVC Help
Powered by ViewVC 1.1.21