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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 64 - (hide annotations)
Wed Aug 29 14:47:17 2012 UTC (11 years, 9 months ago) by guez
Original Path: trunk/libf/phylmd/Conflx/flxmain.f90
File size: 10096 byte(s)
Removed variable lstardis in module comdissnew and procedures gradiv
and nxgrarot. lstardir had to be true. gradiv and nxgrarot were called
if lstardis was false. Removed argument iter of procedure
filtreg. iter had to be 1. gradiv and nxgrarot called filtreg with
iter == 2.

Moved procedure flxsetup into module yoecumf. Module yoecumf is only
used in program units of directory Conflx, moved it there.

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

  ViewVC Help
Powered by ViewVC 1.1.21