/[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 70 - (hide annotations)
Mon Jun 24 15:39:52 2013 UTC (11 years ago) by guez
File size: 10308 byte(s)
In procedure, "addfi" access directly the module variable "dtphys"
instead of going through an argument.

In "conflx", do not create a local variable for temperature with
reversed order of vertical levels. Instead, give an actual argument
with reversed order in "physiq".

Changed names of variables "rmd" and "rmv" from module "suphec_m" to
"md" and "mv".

In "hgardfou", print only the first temperature out of range found.

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

  ViewVC Help
Powered by ViewVC 1.1.21