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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 78 - (hide annotations)
Wed Feb 5 17:51:07 2014 UTC (10 years, 4 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 guez 62 module flxmain_m
2    
3     IMPLICIT none
4    
5     contains
6    
7 guez 71 SUBROUTINE flxmain(dtime, ten, qen, qsen, pqhfl, pap, paph, pgeo, ldland, &
8     ptte, pqte, pvervel, prsfc, pssfc, kcbot, kctop, kdtop, mfu, mfd, &
9 guez 70 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 guez 78 use flxbase_m, only: flxbase
14     use flxddraf_m, only: flxddraf
15     use flxdlfs_m, only: flxdlfs
16 guez 71 use flxdtdq_m, only: flxdtdq
17 guez 70 use flxflux_m, only: flxflux
18     use flxini_m, only: flxini
19 guez 62 USE suphec_m, ONLY: rcpd, retv, rg, rlvtt
20 guez 70 USE yoecumf, ONLY: flxsetup, cmfdeps, entrpen, entrscv, lmfdd
21 guez 62 USE yoethf_m, ONLY: r4les, r5les
22    
23 guez 70 REAL, intent(in):: dtime
24 guez 71 REAL, intent(in):: ten(klon, klev)
25     real, intent(in):: qen(klon, klev)
26     real, intent(inout):: qsen(klon, klev)
27 guez 70 REAL, intent(in):: pqhfl(klon)
28 guez 78 real, intent(in):: pap(klon, klev)
29     real, intent(in):: paph(klon, klev + 1) ! pression aux demi-niveaux
30 guez 70 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 guez 62 REAL prsfc(klon), pssfc(klon)
36 guez 70 INTEGER kcbot(klon), kctop(klon)
37     INTEGER kdtop(klon)
38 guez 71 REAL, intent(out):: mfu(klon, klev)
39     real, intent(out):: mfd(klon, klev)
40 guez 70 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 guez 78 REAL pmflxr(klon, klev + 1)
44     REAL pmflxs(klon, klev + 1)
45 guez 62
46 guez 70 ! 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 guez 71 REAL mfub(klon), mfub1(klon)
55     REAL mfus(klon, klev), mfuq(klon, klev), mful(klon, klev)
56 guez 70 REAL zdmfup(klon, klev), zdpmel(klon, klev)
57 guez 62 REAL zentr(klon), zhcbase(klon)
58     REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon)
59     REAL zrfl(klon)
60 guez 70 INTEGER ilab(klon, klev), ictop0(klon)
61 guez 64 LOGICAL llo1
62 guez 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 guez 70 REAL ptd(klon, klev), pqd(klon, klev)
69     REAL zmfds(klon, klev), zmfdq(klon, klev), zdmfdp(klon, klev)
70 guez 62 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 guez 73 ldcum = .FALSE.
82     dt_con = 0.
83     dq_con = 0.
84 guez 62
85 guez 73 ! Initialiser les variables et faire l'interpolation verticale :
86 guez 71 CALL flxini(ten, qen, qsen, pgeo, paph, zgeoh, ztenh, zqenh, zqsenh, &
87     ptu, pqu, ptd, pqd, mfd, zmfds, zmfdq, zdmfdp, mfu, mfus, mfuq, &
88 guez 70 zdmfup, zdpmel, plu, plude, ilab, pen_u, pde_u, pen_d, pde_d)
89 guez 62
90 guez 73 ! 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 guez 62
93 guez 73 ! 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 guez 62
99 guez 73 zdqcv = pqte(:, 1) * (paph(:, 2) - paph(:, 1))
100     zdhpbl = 0.
101     zdqpbl = 0.
102 guez 62
103 guez 70 DO k=2, klev
104 guez 62 DO i = 1, klon
105 guez 78 zdqcv(i)=zdqcv(i) + pqte(i, k)*(paph(i, k + 1)-paph(i, k))
106 guez 52 IF (k.GE.kcbot(i)) THEN
107 guez 78 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 guez 52 ENDIF
111 guez 62 ENDDO
112     ENDDO
113    
114     DO i = 1, klon
115 guez 70 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 guez 62 ENDDO
121    
122 guez 70 ! Déterminer le flux de masse entrant à travers la base. On
123     ! ignore, pour l'instant, l'effet du panache descendant
124 guez 62
125     DO i = 1, klon
126     ikb=kcbot(i)
127 guez 78 zqumqe=pqu(i, ikb) + plu(i, ikb)-zqenh(i, ikb)
128 guez 70 zdqmin=MAX(0.01*zqenh(i, ikb), 1.E-10)
129     IF (zdqpbl(i) > 0..AND.zqumqe > zdqmin.AND.ldcum(i)) THEN
130 guez 71 mfub(i) = zdqpbl(i)/(RG*MAX(zqumqe, zdqmin))
131 guez 62 ELSE
132 guez 71 mfub(i) = 0.01
133 guez 62 ldcum(i)=.FALSE.
134     ENDIF
135 guez 70 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 guez 71 IF (zdhpbl(i) > 0..AND.ldcum(i))mfub(i)=zdhpbl(i)/zdh
139 guez 62 ENDIF
140 guez 70 zmfmax = (paph(i, ikb)-paph(i, ikb-1)) / (RG*dtime)
141 guez 71 mfub(i) = MIN(mfub(i), zmfmax)
142 guez 62 zentr(i) = ENTRSCV
143 guez 70 IF (ktype(i) == 1) zentr(i) = ENTRPEN
144 guez 62 ENDDO
145    
146     ! DETERMINE CLOUD ASCENT FOR ENTRAINING PLUME
147    
148     ! (A) calculer d'abord la hauteur "theorique" de la tour convective sans
149 guez 64 ! considerer l'entrainement ni le detrainement du panache, sachant
150     ! ces derniers peuvent abaisser la hauteur theorique.
151 guez 62
152     DO i = 1, klon
153     ikb=kcbot(i)
154 guez 78 zhcbase(i)=RCPD*ptu(i, ikb) + zgeoh(i, ikb) + RLVTT*pqu(i, ikb)
155 guez 62 ictop0(i)=kcbot(i)-1
156     ENDDO
157    
158     zalvdcp=RLVTT/RCPD
159 guez 70 DO k=klev-1, 3, -1
160 guez 62 DO i = 1, klon
161 guez 78 zhsat=RCPD*ztenh(i, k) + zgeoh(i, k) + RLVTT*zqsenh(i, k)
162 guez 70 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 guez 78 zhhat=zhsat-(zzz + zgam*zzz)/(1. + zgam*zzz/RLVTT)* &
166 guez 70 MAX(zqsenh(i, k)-zqenh(i, k), 0.)
167     IF(k < ictop0(i).AND.zhcbase(i) > zhhat) ictop0(i)=k
168 guez 62 ENDDO
169     ENDDO
170    
171     ! (B) calculer le panache ascendant
172    
173 guez 71 CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, &
174 guez 70 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, &
175 guez 71 mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, &
176 guez 70 kctop, ictop0, kcum, pen_u, pde_u)
177 guez 62
178 guez 71 kcum_not_zero: IF (kcum /= 0) then
179 guez 62 ! verifier l'epaisseur de la convection et changer eventuellement
180     ! le taux d'entrainement/detrainement
181    
182     DO i = 1, klon
183 guez 70 zpbmpt=paph(i, kcbot(i))-paph(i, kctop(i))
184     IF(ldcum(i) .AND. ktype(i) == 1 .AND. zpbmpt < 2E4) ktype(i) = 2
185 guez 62 IF(ldcum(i)) ictop0(i)=kctop(i)
186 guez 70 IF(ktype(i) == 2) zentr(i)=ENTRSCV
187 guez 62 ENDDO
188    
189 guez 73 downdraft: IF (lmfdd) THEN
190     ! si l'on considere le panache descendant
191 guez 62 ! calculer la precipitation issue du panache ascendant pour
192     ! determiner l'existence du panache descendant dans la convection
193     DO i = 1, klon
194 guez 70 zrfl(i)=zdmfup(i, 1)
195 guez 62 ENDDO
196 guez 70 DO k=2, klev
197 guez 62 DO i = 1, klon
198 guez 78 zrfl(i)=zrfl(i) + zdmfup(i, k)
199 guez 62 ENDDO
200     ENDDO
201    
202     ! determiner le LFS (level of free sinking: niveau de plonge libre)
203 guez 78 CALL flxdlfs(ztenh, zqenh, zgeoh, paph, ptu, pqu, ldcum, kcbot, &
204     kctop, mfub, zrfl, ptd, pqd, mfd, zmfds, zmfdq, zdmfdp, kdtop, &
205     lddraf)
206 guez 62
207     ! calculer le panache descendant
208 guez 78 CALL flxddraf(ztenh, zqenh, zgeoh, paph, zrfl, ptd, pqd, mfd, &
209     zmfds, zmfdq, zdmfdp, lddraf, pen_d, pde_d)
210 guez 62
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 guez 71 llo1 = MFD(i, ikb) < 0.
218 guez 62 zeps = 0.
219 guez 70 IF (llo1) zeps = CMFDEPS
220 guez 78 zqumqe = pqu(i, ikb) + plu(i, ikb)- &
221 guez 70 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 guez 71 .AND.mfub(i) < zmfmax) THEN
226     mfub1(i) = zdqpbl(i) / (RG*MAX(zqumqe, zdqmin))
227 guez 62 ELSE
228 guez 71 mfub1(i) = mfub(i)
229 guez 62 ENDIF
230 guez 70 IF (ktype(i) == 2) THEN
231     zdh = RCPD*(ptu(i, ikb)-zeps*ptd(i, ikb)- &
232 guez 78 (1.-zeps)*ztenh(i, ikb)) + RLVTT*zqumqe
233 guez 70 zdh = RG * MAX(zdh, 1.0E5*zdqmin)
234 guez 71 IF (zdhpbl(i) > 0..AND.ldcum(i))mfub1(i)=zdhpbl(i)/zdh
235 guez 62 ENDIF
236 guez 70 IF (.NOT. ((ktype(i) == 1 .OR. ktype(i) == 2) .AND. &
237 guez 71 ABS(mfub1(i)-mfub(i)) < 0.2*mfub(i))) &
238     mfub1(i) = mfub(i)
239 guez 62 ENDIF
240     ENDDO
241     DO k = 1, klev
242     DO i = 1, klon
243     IF (lddraf(i)) THEN
244 guez 71 zfac = mfub1(i)/MAX(mfub(i), 1.E-10)
245     mfd(i, k) = mfd(i, k)*zfac
246 guez 70 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 guez 62 ENDIF
252     ENDDO
253     ENDDO
254     DO i = 1, klon
255 guez 71 IF (lddraf(i)) mfub(i)=mfub1(i)
256 guez 62 ENDDO
257 guez 73 ENDIF downdraft
258 guez 62
259     ! calculer de nouveau le panache ascendant
260    
261 guez 71 CALL flxasc(dtime, ztenh, zqenh, ten, qen, qsen, pgeo, zgeoh, pap, &
262 guez 70 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, &
263 guez 71 mfu, mfub, zentr, mfus, mfuq, mful, plude, zdmfup, kcbot, &
264 guez 70 kctop, ictop0, kcum, pen_u, pde_u)
265 guez 62
266 guez 70 ! Déterminer les flux convectifs en forme finale, ainsi que la
267     ! quantité des précipitations
268 guez 62
269 guez 71 CALL flxflux(dtime, qen, qsen, ztenh, zqenh, pap, paph, &
270 guez 62 ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, &
271 guez 71 mfu, mfd, mfus, zmfds, mfuq, zmfdq, mful, plude, &
272     zdmfup, zdmfdp, ten, prsfc, pssfc, zdpmel, itopm2, &
273 guez 62 pmflxr, pmflxs)
274    
275     ! calculer les tendances pour T et Q
276    
277 guez 71 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 guez 62
281     END SUBROUTINE flxmain
282    
283     end module flxmain_m

  ViewVC Help
Powered by ViewVC 1.1.21