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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.21