/[lmdze]/trunk/Sources/phylmd/Conflx/flxmain.f
ViewVC logotype

Annotation of /trunk/Sources/phylmd/Conflx/flxmain.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 71 - (hide annotations)
Mon Jul 8 18:12:18 2013 UTC (10 years, 11 months ago) by guez
Original Path: trunk/libf/phylmd/Conflx/flxmain.f90
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 guez 62 module flxmain_m
2    
3     IMPLICIT none
4    
5     contains
6    
7 guez 71 SUBROUTINE flxmain(dtime, ten, qen, qsen, pqhfl, pap, paph, pgeo, ldland, &
8     ptte, pqte, pvervel, prsfc, pssfc, kcbot, kctop, kdtop, mfu, mfd, &
9 guez 70 pen_u, pde_u, pen_d, pde_d, dt_con, dq_con, pmflxr, pmflxs)
10 guez 62
11     USE dimphy, ONLY: klev, klon
12 guez 70 use flxasc_m, only: flxasc
13 guez 71 use flxdtdq_m, only: flxdtdq
14 guez 70 use flxflux_m, only: flxflux
15     use flxini_m, only: flxini
16 guez 62 USE suphec_m, ONLY: rcpd, retv, rg, rlvtt
17 guez 70 USE yoecumf, ONLY: flxsetup, cmfdeps, entrpen, entrscv, lmfdd
18 guez 62 USE yoethf_m, ONLY: r4les, r5les
19    
20 guez 70 REAL, intent(in):: dtime
21 guez 71 REAL, intent(in):: ten(klon, klev)
22     real, intent(in):: qen(klon, klev)
23     real, intent(inout):: qsen(klon, klev)
24 guez 70 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 guez 62 REAL prsfc(klon), pssfc(klon)
32 guez 70 INTEGER kcbot(klon), kctop(klon)
33     INTEGER kdtop(klon)
34 guez 71 REAL, intent(out):: mfu(klon, klev)
35     real, intent(out):: mfd(klon, klev)
36 guez 70 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 guez 62
42 guez 70 ! 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 guez 71 REAL mfub(klon), mfub1(klon)
51     REAL mfus(klon, klev), mfuq(klon, klev), mful(klon, klev)
52 guez 70 REAL zdmfup(klon, klev), zdpmel(klon, klev)
53 guez 62 REAL zentr(klon), zhcbase(klon)
54     REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon)
55     REAL zrfl(klon)
56 guez 70 INTEGER ilab(klon, klev), ictop0(klon)
57 guez 64 LOGICAL llo1
58 guez 62 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 guez 70 REAL ptd(klon, klev), pqd(klon, klev)
65     REAL zmfds(klon, klev), zmfdq(klon, klev), zdmfdp(klon, klev)
66 guez 62 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 guez 70 dt_con(i, k) = 0.0
83     dq_con(i, k) = 0.0
84 guez 62 ENDDO
85     ENDDO
86    
87     ! initialiser les variables et faire l'interpolation verticale
88    
89 guez 71 CALL flxini(ten, qen, qsen, pgeo, paph, zgeoh, ztenh, zqenh, zqsenh, &
90     ptu, pqu, ptd, pqd, mfd, zmfds, zmfdq, zdmfdp, mfu, mfus, mfuq, &
91 guez 70 zdmfup, zdpmel, plu, plude, ilab, pen_u, pde_u, pen_d, pde_d)
92 guez 62
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 guez 70 zdqcv(i) = pqte(i, k)*(paph(i, k+1)-paph(i, k))
107 guez 62 zdhpbl(i) = 0.0
108     zdqpbl(i) = 0.0
109     ENDDO
110    
111 guez 70 DO k=2, klev
112 guez 62 DO i = 1, klon
113 guez 70 zdqcv(i)=zdqcv(i)+pqte(i, k)*(paph(i, k+1)-paph(i, k))
114 guez 52 IF (k.GE.kcbot(i)) THEN
115 guez 70 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 guez 52 ENDIF
119 guez 62 ENDDO
120     ENDDO
121    
122     DO i = 1, klon
123 guez 70 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 guez 62 ENDDO
129    
130 guez 70 ! Déterminer le flux de masse entrant à travers la base. On
131     ! ignore, pour l'instant, l'effet du panache descendant
132 guez 62
133     DO i = 1, klon
134     ikb=kcbot(i)
135 guez 70 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 guez 71 mfub(i) = zdqpbl(i)/(RG*MAX(zqumqe, zdqmin))
139 guez 62 ELSE
140 guez 71 mfub(i) = 0.01
141 guez 62 ldcum(i)=.FALSE.
142     ENDIF
143 guez 70 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 guez 71 IF (zdhpbl(i) > 0..AND.ldcum(i))mfub(i)=zdhpbl(i)/zdh
147 guez 62 ENDIF
148 guez 70 zmfmax = (paph(i, ikb)-paph(i, ikb-1)) / (RG*dtime)
149 guez 71 mfub(i) = MIN(mfub(i), zmfmax)
150 guez 62 zentr(i) = ENTRSCV
151 guez 70 IF (ktype(i) == 1) zentr(i) = ENTRPEN
152 guez 62 ENDDO
153    
154     ! DETERMINE CLOUD ASCENT FOR ENTRAINING PLUME
155    
156     ! (A) calculer d'abord la hauteur "theorique" de la tour convective sans
157 guez 64 ! considerer l'entrainement ni le detrainement du panache, sachant
158     ! ces derniers peuvent abaisser la hauteur theorique.
159 guez 62
160     DO i = 1, klon
161     ikb=kcbot(i)
162 guez 70 zhcbase(i)=RCPD*ptu(i, ikb)+zgeoh(i, ikb)+RLVTT*pqu(i, ikb)
163 guez 62 ictop0(i)=kcbot(i)-1
164     ENDDO
165    
166     zalvdcp=RLVTT/RCPD
167 guez 70 DO k=klev-1, 3, -1
168 guez 62 DO i = 1, klon
169 guez 70 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 guez 62 zhhat=zhsat-(zzz+zgam*zzz)/(1.+zgam*zzz/RLVTT)* &
174 guez 70 MAX(zqsenh(i, k)-zqenh(i, k), 0.)
175     IF(k < ictop0(i).AND.zhcbase(i) > zhhat) ictop0(i)=k
176 guez 62 ENDDO
177     ENDDO
178    
179     ! (B) calculer le panache ascendant
180    
181 guez 71 CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, &
182 guez 70 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, &
183 guez 71 mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, &
184 guez 70 kctop, ictop0, kcum, pen_u, pde_u)
185 guez 62
186 guez 71 kcum_not_zero: IF (kcum /= 0) then
187 guez 62 ! verifier l'epaisseur de la convection et changer eventuellement
188     ! le taux d'entrainement/detrainement
189    
190     DO i = 1, klon
191 guez 70 zpbmpt=paph(i, kcbot(i))-paph(i, kctop(i))
192     IF(ldcum(i) .AND. ktype(i) == 1 .AND. zpbmpt < 2E4) ktype(i) = 2
193 guez 62 IF(ldcum(i)) ictop0(i)=kctop(i)
194 guez 70 IF(ktype(i) == 2) zentr(i)=ENTRSCV
195 guez 62 ENDDO
196    
197 guez 64 IF (lmfdd) THEN ! si l'on considere le panache descendant
198 guez 62 ! calculer la precipitation issue du panache ascendant pour
199     ! determiner l'existence du panache descendant dans la convection
200     DO i = 1, klon
201 guez 70 zrfl(i)=zdmfup(i, 1)
202 guez 62 ENDDO
203 guez 70 DO k=2, klev
204 guez 62 DO i = 1, klon
205 guez 70 zrfl(i)=zrfl(i)+zdmfup(i, k)
206 guez 62 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 guez 71 ldcum, kcbot, kctop, mfub, zrfl, &
212 guez 64 ptd, pqd, &
213 guez 71 mfd, zmfds, zmfdq, zdmfdp, &
214 guez 64 kdtop, lddraf)
215 guez 62
216     ! calculer le panache descendant
217 guez 64 CALL flxddraf(ztenh, zqenh, &
218     zgeoh, paph, zrfl, &
219     ptd, pqd, &
220 guez 71 mfd, zmfds, zmfdq, zdmfdp, &
221 guez 62 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 guez 71 llo1 = MFD(i, ikb) < 0.
230 guez 62 zeps = 0.
231 guez 70 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 guez 71 .AND.mfub(i) < zmfmax) THEN
238     mfub1(i) = zdqpbl(i) / (RG*MAX(zqumqe, zdqmin))
239 guez 62 ELSE
240 guez 71 mfub1(i) = mfub(i)
241 guez 62 ENDIF
242 guez 70 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 guez 71 IF (zdhpbl(i) > 0..AND.ldcum(i))mfub1(i)=zdhpbl(i)/zdh
247 guez 62 ENDIF
248 guez 70 IF (.NOT. ((ktype(i) == 1 .OR. ktype(i) == 2) .AND. &
249 guez 71 ABS(mfub1(i)-mfub(i)) < 0.2*mfub(i))) &
250     mfub1(i) = mfub(i)
251 guez 62 ENDIF
252     ENDDO
253     DO k = 1, klev
254     DO i = 1, klon
255     IF (lddraf(i)) THEN
256 guez 71 zfac = mfub1(i)/MAX(mfub(i), 1.E-10)
257     mfd(i, k) = mfd(i, k)*zfac
258 guez 70 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 guez 62 ENDIF
264     ENDDO
265     ENDDO
266     DO i = 1, klon
267 guez 71 IF (lddraf(i)) mfub(i)=mfub1(i)
268 guez 62 ENDDO
269 guez 64 ENDIF ! fin de test sur lmfdd
270 guez 62
271     ! calculer de nouveau le panache ascendant
272    
273 guez 71 CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, &
274 guez 70 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, &
275 guez 71 mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, &
276 guez 70 kctop, ictop0, kcum, pen_u, pde_u)
277 guez 62
278 guez 70 ! Déterminer les flux convectifs en forme finale, ainsi que la
279     ! quantité des précipitations
280 guez 62
281 guez 71 CALL flxflux(dtime, qen, qsen, ztenh, zqenh, pap, paph, &
282 guez 62 ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, &
283 guez 71 mfu, mfd, mfus, zmfds, mfuq, zmfdq, mful, plude, &
284     zdmfup, zdmfdp, ten, prsfc, pssfc, zdpmel, itopm2, &
285 guez 62 pmflxr, pmflxs)
286    
287     ! calculer les tendances pour T et Q
288    
289 guez 71 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 guez 62
293     END SUBROUTINE flxmain
294    
295     end module flxmain_m

  ViewVC Help
Powered by ViewVC 1.1.21