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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62 - (show annotations)
Thu Jul 26 14:37:37 2012 UTC (11 years, 9 months ago) by guez
File size: 10166 byte(s)
Changed handling of compiler in compilation system.

Removed the prefix letters "y", "p", "t" or "z" in some names of variables.

Replaced calls to NetCDF by calls to NetCDF95.

Extracted "ioget_calendar" procedures from "calendar.f90" into a
separate file.

Extracted to a separate file, "mathop2.f90", procedures that were not
part of the generic interface "mathop" in "mathop.f90".

Removed computation of "dq" in "bilan_dyn", which was not used.

In "iniadvtrac", removed schemes 20 Slopes and 30 Prather. Was not
compatible with declarations of array sizes.

In "clcdrag", "ustarhb", "vdif_kcay", "yamada4" and "coefkz", changed
the size of some arrays from "klon" to "knon".

Removed possible call to "conema3" in "physiq".

Removed unused argument "cd" in "yamada".

1 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
16 REAL pten(klon,klev), pqen(klon,klev), pqsen(klon,klev)
17 REAL ptte(klon,klev)
18 REAL pqte(klon,klev)
19 REAL pvervel(klon,klev)
20 REAL pgeo(klon,klev), pap(klon,klev), paph(klon,klev+1)
21 REAL pqhfl(klon)
22
23 REAL ptu(klon,klev), pqu(klon,klev), plu(klon,klev)
24 REAL plude(klon,klev)
25 REAL pmfu(klon,klev)
26 REAL prsfc(klon), pssfc(klon)
27 INTEGER kcbot(klon), kctop(klon), ktype(klon)
28 LOGICAL ldland(klon), ldcum(klon)
29
30 REAL ztenh(klon,klev), zqenh(klon,klev), zqsenh(klon,klev)
31 REAL zgeoh(klon,klev)
32 REAL zmfub(klon), zmfub1(klon)
33 REAL zmfus(klon,klev), zmfuq(klon,klev), zmful(klon,klev)
34 REAL zdmfup(klon,klev), zdpmel(klon,klev)
35 REAL zentr(klon), zhcbase(klon)
36 REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon)
37 REAL zrfl(klon)
38 REAL pmflxr(klon,klev+1)
39 REAL pmflxs(klon,klev+1)
40 INTEGER ilab(klon,klev), ictop0(klon)
41 LOGICAL llo1
42 REAL dt_con(klon,klev), dq_con(klon,klev)
43 REAL zmfmax, zdh
44 REAL, intent(in):: pdtime
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 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 *(paph(i,k+1)-paph(i,k))
109 ENDIF
110 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 !cc if (zdqcv(i).GT.MAX(0.,-1.1*pqhfl(i)*RG)) ktype(i) = 1
117 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 ! considerer l'entrainement ni le detrainement du panache, sachant
147 ! ces derniers peuvent abaisser la hauteur theorique.
148
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 ((1.-RETV *zqsenh(i,k))*(ztenh(i,k)-R4LES)**2)
161 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 IF (lmfdd) THEN ! si l'on considere le panache descendant
189 ! 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 ldcum, kcbot, kctop, zmfub, zrfl, &
203 ptd, pqd, &
204 pmfd, zmfds, zmfdq, zdmfdp, &
205 kdtop, lddraf)
206
207 ! calculer le panache descendant
208 CALL flxddraf(ztenh, zqenh, &
209 zgeoh, paph, zrfl, &
210 ptd, pqd, &
211 pmfd, zmfds, zmfdq, zdmfdp, &
212 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 ENDIF ! fin de test sur lmfdd
261
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 CALL flxflux(pdtime, pqen, pqsen, ztenh, zqenh, pap, paph, &
275 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