/[lmdze]/trunk/phylmd/Conflx/flxmain.f90
ViewVC logotype

Annotation of /trunk/phylmd/Conflx/flxmain.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 76 - (hide annotations)
Fri Nov 15 18:45:49 2013 UTC (10 years, 7 months ago) by guez
File size: 10181 byte(s)
Moved everything out of libf.
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 guez 73 ldcum = .FALSE.
78     dt_con = 0.
79     dq_con = 0.
80 guez 62
81 guez 73 ! Initialiser les variables et faire l'interpolation verticale :
82 guez 71 CALL flxini(ten, qen, qsen, pgeo, paph, zgeoh, ztenh, zqenh, zqsenh, &
83     ptu, pqu, ptd, pqd, mfd, zmfds, zmfdq, zdmfdp, mfu, mfus, mfuq, &
84 guez 70 zdmfup, zdpmel, plu, plude, ilab, pen_u, pde_u, pen_d, pde_d)
85 guez 62
86 guez 73 ! 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 guez 62
89 guez 73 ! 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 guez 62
95 guez 73 zdqcv = pqte(:, 1) * (paph(:, 2) - paph(:, 1))
96     zdhpbl = 0.
97     zdqpbl = 0.
98 guez 62
99 guez 70 DO k=2, klev
100 guez 62 DO i = 1, klon
101 guez 70 zdqcv(i)=zdqcv(i)+pqte(i, k)*(paph(i, k+1)-paph(i, k))
102 guez 52 IF (k.GE.kcbot(i)) THEN
103 guez 70 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 guez 52 ENDIF
107 guez 62 ENDDO
108     ENDDO
109    
110     DO i = 1, klon
111 guez 70 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 guez 62 ENDDO
117    
118 guez 70 ! Déterminer le flux de masse entrant à travers la base. On
119     ! ignore, pour l'instant, l'effet du panache descendant
120 guez 62
121     DO i = 1, klon
122     ikb=kcbot(i)
123 guez 70 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 guez 71 mfub(i) = zdqpbl(i)/(RG*MAX(zqumqe, zdqmin))
127 guez 62 ELSE
128 guez 71 mfub(i) = 0.01
129 guez 62 ldcum(i)=.FALSE.
130     ENDIF
131 guez 70 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 guez 71 IF (zdhpbl(i) > 0..AND.ldcum(i))mfub(i)=zdhpbl(i)/zdh
135 guez 62 ENDIF
136 guez 70 zmfmax = (paph(i, ikb)-paph(i, ikb-1)) / (RG*dtime)
137 guez 71 mfub(i) = MIN(mfub(i), zmfmax)
138 guez 62 zentr(i) = ENTRSCV
139 guez 70 IF (ktype(i) == 1) zentr(i) = ENTRPEN
140 guez 62 ENDDO
141    
142     ! DETERMINE CLOUD ASCENT FOR ENTRAINING PLUME
143    
144     ! (A) calculer d'abord la hauteur "theorique" de la tour convective sans
145 guez 64 ! considerer l'entrainement ni le detrainement du panache, sachant
146     ! ces derniers peuvent abaisser la hauteur theorique.
147 guez 62
148     DO i = 1, klon
149     ikb=kcbot(i)
150 guez 70 zhcbase(i)=RCPD*ptu(i, ikb)+zgeoh(i, ikb)+RLVTT*pqu(i, ikb)
151 guez 62 ictop0(i)=kcbot(i)-1
152     ENDDO
153    
154     zalvdcp=RLVTT/RCPD
155 guez 70 DO k=klev-1, 3, -1
156 guez 62 DO i = 1, klon
157 guez 70 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 guez 62 zhhat=zhsat-(zzz+zgam*zzz)/(1.+zgam*zzz/RLVTT)* &
162 guez 70 MAX(zqsenh(i, k)-zqenh(i, k), 0.)
163     IF(k < ictop0(i).AND.zhcbase(i) > zhhat) ictop0(i)=k
164 guez 62 ENDDO
165     ENDDO
166    
167     ! (B) calculer le panache ascendant
168    
169 guez 71 CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, &
170 guez 70 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, &
171 guez 71 mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, &
172 guez 70 kctop, ictop0, kcum, pen_u, pde_u)
173 guez 62
174 guez 71 kcum_not_zero: IF (kcum /= 0) then
175 guez 62 ! verifier l'epaisseur de la convection et changer eventuellement
176     ! le taux d'entrainement/detrainement
177    
178     DO i = 1, klon
179 guez 70 zpbmpt=paph(i, kcbot(i))-paph(i, kctop(i))
180     IF(ldcum(i) .AND. ktype(i) == 1 .AND. zpbmpt < 2E4) ktype(i) = 2
181 guez 62 IF(ldcum(i)) ictop0(i)=kctop(i)
182 guez 70 IF(ktype(i) == 2) zentr(i)=ENTRSCV
183 guez 62 ENDDO
184    
185 guez 73 downdraft: IF (lmfdd) THEN
186     ! si l'on considere le panache descendant
187 guez 62 ! calculer la precipitation issue du panache ascendant pour
188     ! determiner l'existence du panache descendant dans la convection
189     DO i = 1, klon
190 guez 70 zrfl(i)=zdmfup(i, 1)
191 guez 62 ENDDO
192 guez 70 DO k=2, klev
193 guez 62 DO i = 1, klon
194 guez 70 zrfl(i)=zrfl(i)+zdmfup(i, k)
195 guez 62 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 guez 71 ldcum, kcbot, kctop, mfub, zrfl, &
201 guez 64 ptd, pqd, &
202 guez 71 mfd, zmfds, zmfdq, zdmfdp, &
203 guez 64 kdtop, lddraf)
204 guez 62
205     ! calculer le panache descendant
206 guez 64 CALL flxddraf(ztenh, zqenh, &
207     zgeoh, paph, zrfl, &
208     ptd, pqd, &
209 guez 71 mfd, zmfds, zmfdq, zdmfdp, &
210 guez 62 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 guez 71 llo1 = MFD(i, ikb) < 0.
219 guez 62 zeps = 0.
220 guez 70 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 guez 71 .AND.mfub(i) < zmfmax) THEN
227     mfub1(i) = zdqpbl(i) / (RG*MAX(zqumqe, zdqmin))
228 guez 62 ELSE
229 guez 71 mfub1(i) = mfub(i)
230 guez 62 ENDIF
231 guez 70 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 guez 71 IF (zdhpbl(i) > 0..AND.ldcum(i))mfub1(i)=zdhpbl(i)/zdh
236 guez 62 ENDIF
237 guez 70 IF (.NOT. ((ktype(i) == 1 .OR. ktype(i) == 2) .AND. &
238 guez 71 ABS(mfub1(i)-mfub(i)) < 0.2*mfub(i))) &
239     mfub1(i) = mfub(i)
240 guez 62 ENDIF
241     ENDDO
242     DO k = 1, klev
243     DO i = 1, klon
244     IF (lddraf(i)) THEN
245 guez 71 zfac = mfub1(i)/MAX(mfub(i), 1.E-10)
246     mfd(i, k) = mfd(i, k)*zfac
247 guez 70 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 guez 62 ENDIF
253     ENDDO
254     ENDDO
255     DO i = 1, klon
256 guez 71 IF (lddraf(i)) mfub(i)=mfub1(i)
257 guez 62 ENDDO
258 guez 73 ENDIF downdraft
259 guez 62
260     ! calculer de nouveau le panache ascendant
261    
262 guez 71 CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, &
263 guez 70 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, &
264 guez 71 mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, &
265 guez 70 kctop, ictop0, kcum, pen_u, pde_u)
266 guez 62
267 guez 70 ! Déterminer les flux convectifs en forme finale, ainsi que la
268     ! quantité des précipitations
269 guez 62
270 guez 71 CALL flxflux(dtime, qen, qsen, ztenh, zqenh, pap, paph, &
271 guez 62 ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, &
272 guez 71 mfu, mfd, mfus, zmfds, mfuq, zmfdq, mful, plude, &
273     zdmfup, zdmfdp, ten, prsfc, pssfc, zdpmel, itopm2, &
274 guez 62 pmflxr, pmflxs)
275    
276     ! calculer les tendances pour T et Q
277    
278 guez 71 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 guez 62
282     END SUBROUTINE flxmain
283    
284     end module flxmain_m

  ViewVC Help
Powered by ViewVC 1.1.21