4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE flxmain(dtime, pt, pqen, pqsen, pqhfl, pap, paph, pgeo, ldland, & |
SUBROUTINE flxmain(dtime, ten, qen, qsen, pqhfl, pap, paph, pgeo, ldland, & |
8 |
ptte, pqte, pvervel, prsfc, pssfc, kcbot, kctop, kdtop, pmfu, pmfd, & |
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) |
pen_u, pde_u, pen_d, pde_d, dt_con, dq_con, pmflxr, pmflxs) |
10 |
|
|
11 |
USE dimphy, ONLY: klev, klon |
USE dimphy, ONLY: klev, klon |
12 |
use flxasc_m, only: flxasc |
use flxasc_m, only: flxasc |
13 |
|
use flxdtdq_m, only: flxdtdq |
14 |
use flxflux_m, only: flxflux |
use flxflux_m, only: flxflux |
15 |
use flxini_m, only: flxini |
use flxini_m, only: flxini |
16 |
USE suphec_m, ONLY: rcpd, retv, rg, rlvtt |
USE suphec_m, ONLY: rcpd, retv, rg, rlvtt |
18 |
USE yoethf_m, ONLY: r4les, r5les |
USE yoethf_m, ONLY: r4les, r5les |
19 |
|
|
20 |
REAL, intent(in):: dtime |
REAL, intent(in):: dtime |
21 |
REAL, intent(in):: pt(klon, klev) |
REAL, intent(in):: ten(klon, klev) |
22 |
real pqen(klon, klev) |
real, intent(in):: qen(klon, klev) |
23 |
real, intent(inout):: pqsen(klon, klev) |
real, intent(inout):: qsen(klon, klev) |
24 |
REAL, intent(in):: pqhfl(klon) |
REAL, intent(in):: pqhfl(klon) |
25 |
real pap(klon, klev), paph(klon, klev+1) |
real pap(klon, klev), paph(klon, klev+1) |
26 |
REAL, intent(in):: pgeo(klon, klev) |
REAL, intent(in):: pgeo(klon, klev) |
31 |
REAL prsfc(klon), pssfc(klon) |
REAL prsfc(klon), pssfc(klon) |
32 |
INTEGER kcbot(klon), kctop(klon) |
INTEGER kcbot(klon), kctop(klon) |
33 |
INTEGER kdtop(klon) |
INTEGER kdtop(klon) |
34 |
REAL pmfu(klon, klev) |
REAL, intent(out):: mfu(klon, klev) |
35 |
real pmfd(klon, klev) |
real, intent(out):: mfd(klon, klev) |
36 |
REAL pen_u(klon, klev), pde_u(klon, klev) |
REAL pen_u(klon, klev), pde_u(klon, klev) |
37 |
REAL pen_d(klon, klev), pde_d(klon, klev) |
REAL pen_d(klon, klev), pde_d(klon, klev) |
38 |
REAL dt_con(klon, klev), dq_con(klon, klev) |
REAL dt_con(klon, klev), dq_con(klon, klev) |
47 |
|
|
48 |
REAL ztenh(klon, klev), zqenh(klon, klev), zqsenh(klon, klev) |
REAL ztenh(klon, klev), zqenh(klon, klev), zqsenh(klon, klev) |
49 |
REAL zgeoh(klon, klev) |
REAL zgeoh(klon, klev) |
50 |
REAL zmfub(klon), zmfub1(klon) |
REAL mfub(klon), mfub1(klon) |
51 |
REAL zmfus(klon, klev), zmfuq(klon, klev), zmful(klon, klev) |
REAL mfus(klon, klev), mfuq(klon, klev), mful(klon, klev) |
52 |
REAL zdmfup(klon, klev), zdpmel(klon, klev) |
REAL zdmfup(klon, klev), zdpmel(klon, klev) |
53 |
REAL zentr(klon), zhcbase(klon) |
REAL zentr(klon), zhcbase(klon) |
54 |
REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon) |
REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon) |
86 |
|
|
87 |
! initialiser les variables et faire l'interpolation verticale |
! initialiser les variables et faire l'interpolation verticale |
88 |
|
|
89 |
CALL flxini(pt, pqen, pqsen, pgeo, paph, zgeoh, ztenh, zqenh, zqsenh, & |
CALL flxini(ten, qen, qsen, pgeo, paph, zgeoh, ztenh, zqenh, zqsenh, & |
90 |
ptu, pqu, ptd, pqd, pmfd, zmfds, zmfdq, zdmfdp, pmfu, zmfus, zmfuq, & |
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) |
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 |
! determiner les valeurs au niveau de base de la tour convective |
135 |
zqumqe=pqu(i, ikb)+plu(i, ikb)-zqenh(i, ikb) |
zqumqe=pqu(i, ikb)+plu(i, ikb)-zqenh(i, ikb) |
136 |
zdqmin=MAX(0.01*zqenh(i, ikb), 1.E-10) |
zdqmin=MAX(0.01*zqenh(i, ikb), 1.E-10) |
137 |
IF (zdqpbl(i) > 0..AND.zqumqe > zdqmin.AND.ldcum(i)) THEN |
IF (zdqpbl(i) > 0..AND.zqumqe > zdqmin.AND.ldcum(i)) THEN |
138 |
zmfub(i) = zdqpbl(i)/(RG*MAX(zqumqe, zdqmin)) |
mfub(i) = zdqpbl(i)/(RG*MAX(zqumqe, zdqmin)) |
139 |
ELSE |
ELSE |
140 |
zmfub(i) = 0.01 |
mfub(i) = 0.01 |
141 |
ldcum(i)=.FALSE. |
ldcum(i)=.FALSE. |
142 |
ENDIF |
ENDIF |
143 |
IF (ktype(i) == 2) THEN |
IF (ktype(i) == 2) THEN |
144 |
zdh = RCPD*(ptu(i, ikb)-ztenh(i, ikb)) + RLVTT*zqumqe |
zdh = RCPD*(ptu(i, ikb)-ztenh(i, ikb)) + RLVTT*zqumqe |
145 |
zdh = RG * MAX(zdh, 1.0E5*zdqmin) |
zdh = RG * MAX(zdh, 1.0E5*zdqmin) |
146 |
IF (zdhpbl(i) > 0..AND.ldcum(i))zmfub(i)=zdhpbl(i)/zdh |
IF (zdhpbl(i) > 0..AND.ldcum(i))mfub(i)=zdhpbl(i)/zdh |
147 |
ENDIF |
ENDIF |
148 |
zmfmax = (paph(i, ikb)-paph(i, ikb-1)) / (RG*dtime) |
zmfmax = (paph(i, ikb)-paph(i, ikb-1)) / (RG*dtime) |
149 |
zmfub(i) = MIN(zmfub(i), zmfmax) |
mfub(i) = MIN(mfub(i), zmfmax) |
150 |
zentr(i) = ENTRSCV |
zentr(i) = ENTRSCV |
151 |
IF (ktype(i) == 1) zentr(i) = ENTRPEN |
IF (ktype(i) == 1) zentr(i) = ENTRPEN |
152 |
ENDDO |
ENDDO |
178 |
|
|
179 |
! (B) calculer le panache ascendant |
! (B) calculer le panache ascendant |
180 |
|
|
181 |
CALL flxasc(dtime, ztenh, zqenh, pt, pqen, pqsen, pgeo, zgeoh, pap, & |
CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, & |
182 |
paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, & |
paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, & |
183 |
pmfu, zmfub, zentr, zmfus, zmfuq, zmful, plude, zdmfup, kcbot, & |
mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, & |
184 |
kctop, ictop0, kcum, pen_u, pde_u) |
kctop, ictop0, kcum, pen_u, pde_u) |
185 |
|
|
186 |
IF (kcum /= 0) then |
kcum_not_zero: IF (kcum /= 0) then |
187 |
! verifier l'epaisseur de la convection et changer eventuellement |
! verifier l'epaisseur de la convection et changer eventuellement |
188 |
! le taux d'entrainement/detrainement |
! le taux d'entrainement/detrainement |
189 |
|
|
208 |
|
|
209 |
! determiner le LFS (level of free sinking: niveau de plonge libre) |
! determiner le LFS (level of free sinking: niveau de plonge libre) |
210 |
CALL flxdlfs(ztenh, zqenh, zgeoh, paph, ptu, pqu, & |
CALL flxdlfs(ztenh, zqenh, zgeoh, paph, ptu, pqu, & |
211 |
ldcum, kcbot, kctop, zmfub, zrfl, & |
ldcum, kcbot, kctop, mfub, zrfl, & |
212 |
ptd, pqd, & |
ptd, pqd, & |
213 |
pmfd, zmfds, zmfdq, zdmfdp, & |
mfd, zmfds, zmfdq, zdmfdp, & |
214 |
kdtop, lddraf) |
kdtop, lddraf) |
215 |
|
|
216 |
! calculer le panache descendant |
! calculer le panache descendant |
217 |
CALL flxddraf(ztenh, zqenh, & |
CALL flxddraf(ztenh, zqenh, & |
218 |
zgeoh, paph, zrfl, & |
zgeoh, paph, zrfl, & |
219 |
ptd, pqd, & |
ptd, pqd, & |
220 |
pmfd, zmfds, zmfdq, zdmfdp, & |
mfd, zmfds, zmfdq, zdmfdp, & |
221 |
lddraf, pen_d, pde_d) |
lddraf, pen_d, pde_d) |
222 |
|
|
223 |
! calculer de nouveau le flux de masse entrant a travers la base |
! calculer de nouveau le flux de masse entrant a travers la base |
226 |
DO i = 1, klon |
DO i = 1, klon |
227 |
IF (lddraf(i)) THEN |
IF (lddraf(i)) THEN |
228 |
ikb = kcbot(i) |
ikb = kcbot(i) |
229 |
llo1 = PMFD(i, ikb) < 0. |
llo1 = MFD(i, ikb) < 0. |
230 |
zeps = 0. |
zeps = 0. |
231 |
IF (llo1) zeps = CMFDEPS |
IF (llo1) zeps = CMFDEPS |
232 |
zqumqe = pqu(i, ikb)+plu(i, ikb)- & |
zqumqe = pqu(i, ikb)+plu(i, ikb)- & |
234 |
zdqmin = MAX(0.01*zqenh(i, ikb), 1.E-10) |
zdqmin = MAX(0.01*zqenh(i, ikb), 1.E-10) |
235 |
zmfmax = (paph(i, ikb)-paph(i, ikb-1)) / (RG*dtime) |
zmfmax = (paph(i, ikb)-paph(i, ikb-1)) / (RG*dtime) |
236 |
IF (zdqpbl(i) > 0..AND.zqumqe > zdqmin.AND.ldcum(i) & |
IF (zdqpbl(i) > 0..AND.zqumqe > zdqmin.AND.ldcum(i) & |
237 |
.AND.zmfub(i) < zmfmax) THEN |
.AND.mfub(i) < zmfmax) THEN |
238 |
zmfub1(i) = zdqpbl(i) / (RG*MAX(zqumqe, zdqmin)) |
mfub1(i) = zdqpbl(i) / (RG*MAX(zqumqe, zdqmin)) |
239 |
ELSE |
ELSE |
240 |
zmfub1(i) = zmfub(i) |
mfub1(i) = mfub(i) |
241 |
ENDIF |
ENDIF |
242 |
IF (ktype(i) == 2) THEN |
IF (ktype(i) == 2) THEN |
243 |
zdh = RCPD*(ptu(i, ikb)-zeps*ptd(i, ikb)- & |
zdh = RCPD*(ptu(i, ikb)-zeps*ptd(i, ikb)- & |
244 |
(1.-zeps)*ztenh(i, ikb))+RLVTT*zqumqe |
(1.-zeps)*ztenh(i, ikb))+RLVTT*zqumqe |
245 |
zdh = RG * MAX(zdh, 1.0E5*zdqmin) |
zdh = RG * MAX(zdh, 1.0E5*zdqmin) |
246 |
IF (zdhpbl(i) > 0..AND.ldcum(i))zmfub1(i)=zdhpbl(i)/zdh |
IF (zdhpbl(i) > 0..AND.ldcum(i))mfub1(i)=zdhpbl(i)/zdh |
247 |
ENDIF |
ENDIF |
248 |
IF (.NOT. ((ktype(i) == 1 .OR. ktype(i) == 2) .AND. & |
IF (.NOT. ((ktype(i) == 1 .OR. ktype(i) == 2) .AND. & |
249 |
ABS(zmfub1(i)-zmfub(i)) < 0.2*zmfub(i))) & |
ABS(mfub1(i)-mfub(i)) < 0.2*mfub(i))) & |
250 |
zmfub1(i) = zmfub(i) |
mfub1(i) = mfub(i) |
251 |
ENDIF |
ENDIF |
252 |
ENDDO |
ENDDO |
253 |
DO k = 1, klev |
DO k = 1, klev |
254 |
DO i = 1, klon |
DO i = 1, klon |
255 |
IF (lddraf(i)) THEN |
IF (lddraf(i)) THEN |
256 |
zfac = zmfub1(i)/MAX(zmfub(i), 1.E-10) |
zfac = mfub1(i)/MAX(mfub(i), 1.E-10) |
257 |
pmfd(i, k) = pmfd(i, k)*zfac |
mfd(i, k) = mfd(i, k)*zfac |
258 |
zmfds(i, k) = zmfds(i, k)*zfac |
zmfds(i, k) = zmfds(i, k)*zfac |
259 |
zmfdq(i, k) = zmfdq(i, k)*zfac |
zmfdq(i, k) = zmfdq(i, k)*zfac |
260 |
zdmfdp(i, k) = zdmfdp(i, k)*zfac |
zdmfdp(i, k) = zdmfdp(i, k)*zfac |
264 |
ENDDO |
ENDDO |
265 |
ENDDO |
ENDDO |
266 |
DO i = 1, klon |
DO i = 1, klon |
267 |
IF (lddraf(i)) zmfub(i)=zmfub1(i) |
IF (lddraf(i)) mfub(i)=mfub1(i) |
268 |
ENDDO |
ENDDO |
269 |
ENDIF ! fin de test sur lmfdd |
ENDIF ! fin de test sur lmfdd |
270 |
|
|
271 |
! calculer de nouveau le panache ascendant |
! calculer de nouveau le panache ascendant |
272 |
|
|
273 |
CALL flxasc(dtime, ztenh, zqenh, pt, pqen, pqsen, pgeo, zgeoh, pap, & |
CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, & |
274 |
paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, & |
paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, & |
275 |
pmfu, zmfub, zentr, zmfus, zmfuq, zmful, plude, zdmfup, kcbot, & |
mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, & |
276 |
kctop, ictop0, kcum, pen_u, pde_u) |
kctop, ictop0, kcum, pen_u, pde_u) |
277 |
|
|
278 |
! Déterminer les flux convectifs en forme finale, ainsi que la |
! Déterminer les flux convectifs en forme finale, ainsi que la |
279 |
! quantité des précipitations |
! quantité des précipitations |
280 |
|
|
281 |
CALL flxflux(dtime, pqen, pqsen, ztenh, zqenh, pap, paph, & |
CALL flxflux(dtime, qen, qsen, ztenh, zqenh, pap, paph, & |
282 |
ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, & |
ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, & |
283 |
pmfu, pmfd, zmfus, zmfds, zmfuq, zmfdq, zmful, plude, & |
mfu, mfd, mfus, zmfds, mfuq, zmfdq, mful, plude, & |
284 |
zdmfup, zdmfdp, pt, prsfc, pssfc, zdpmel, itopm2, & |
zdmfup, zdmfdp, ten, prsfc, pssfc, zdpmel, itopm2, & |
285 |
pmflxr, pmflxs) |
pmflxr, pmflxs) |
286 |
|
|
287 |
! calculer les tendances pour T et Q |
! calculer les tendances pour T et Q |
288 |
|
|
289 |
CALL flxdtdq(itopm2, paph, ldcum, pt, zmfus, zmfds, zmfuq, zmfdq, & |
CALL flxdtdq(itopm2, paph, ldcum, ten, mfus, zmfds, mfuq, zmfdq, & |
290 |
zmful, zdmfup, zdmfdp, zdpmel, dt_con, dq_con) |
mful, zdmfup, zdmfdp, zdpmel, dt_con, dq_con) |
291 |
end IF |
end IF kcum_not_zero |
292 |
|
|
293 |
END SUBROUTINE flxmain |
END SUBROUTINE flxmain |
294 |
|
|