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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 78 - (show annotations)
Wed Feb 5 17:51:07 2014 UTC (10 years, 3 months ago) by guez
File size: 10301 byte(s)
Moved procedure inigeom into module comgeom.

In disvert, renamed s_sampling to vert_sampling, following
LMDZ. Removed choice strato1. In case read, read ap and bp instead of
s (following LMDZ).

Added argument phis to start_init_orog and start_init_dyn, and removed
variable phis of module start_init_orog_m. In etat0 and
start_init_orog, renamed relief to zmea_2d. In start_init_dyn, renamed
psol to ps.

In start_init_orog, renamed relief_hi to relief. No need to set
phis(iim + 1, :) = phis(1, :), already done in grid_noro.

Documentation for massbar out of SVN, in massbar.txt. Documentation
was duplicated in massdair, but not relevant in massdair.

In conflx, no need to initialize pen_[ud] and pde_[ud]. In flxasc,
used intermediary variable fact (following LMDZ).

In grid_noro, added local variable zmea0 for zmea not smoothed and
computed zphi from zmea instead of zmea0 (following LMDZ). This
changes the results of ce0l.

Removed arguments pen_u and pde_d of phytrac and nflxtr, which were
not used.

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

  ViewVC Help
Powered by ViewVC 1.1.21