/[lmdze]/trunk/Sources/phylmd/Conflx/flxflux.f
ViewVC logotype

Contents of /trunk/Sources/phylmd/Conflx/flxflux.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 134 - (show annotations)
Wed Apr 29 15:47:56 2015 UTC (9 years, 1 month ago) by guez
File size: 8849 byte(s)
Sources inside, compilation outside.
1 module flxflux_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE flxflux(pdtime, pqen, pqsen, ptenh, pqenh, pap, paph, ldland, &
8 pgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, mfu, pmfd, mfus, &
9 pmfds, mfuq, pmfdq, mful, plude, pdmfup, pdmfdp, pten, prfl, psfl, &
10 pdpmel, ktopm2, pmflxr, pmflxs)
11
12 ! This routine does the final calculation of convective fluxes in
13 ! the cloud layer and in the subcloud layer.
14
15 USE dimphy, ONLY: klev, klon
16 USE suphec_m, ONLY: rcpd, retv, rg, rlmlt, rtt
17 USE yoethf_m, ONLY: r2es
18 USE fcttre, ONLY: foeew
19
20 REAL, intent(in):: pdtime
21 REAL, intent(in):: pqen(klon, klev)
22 real, intent(inout):: pqsen(klon, klev)
23 REAL, intent(in):: ptenh(klon, klev)
24 REAL, intent(in):: pqenh(klon, klev)
25 REAL, intent(in):: pap(klon, klev)
26 REAL, intent(in):: paph(klon, klev + 1)
27 LOGICAL ldland(klon)
28 real pgeoh(klon, klev)
29 INTEGER, intent(in):: kcbot(klon), kctop(klon)
30 LOGICAL lddraf(klon)
31 INTEGER kdtop(klon)
32 INTEGER, intent(inout):: ktype(klon)
33 LOGICAL, intent(in):: ldcum(klon)
34 REAL mfu(klon, klev)
35 REAL pmfd(klon, klev)
36 real, intent(inout):: mfus(klon, klev)
37 real pmfds(klon, klev)
38 REAL mfuq(klon, klev)
39 REAL pmfdq(klon, klev)
40 real mful(klon, klev)
41 REAL plude(klon, klev)
42 REAL pdmfup(klon, klev)
43 REAL pdmfdp(klon, klev)
44 REAL, intent(in):: pten(klon, klev)
45 REAL prfl(klon), psfl(klon)
46 real pdpmel(klon, klev)
47 INTEGER, intent(out):: ktopm2
48 REAL pmflxr(klon, klev + 1), pmflxs(klon, klev + 1)
49
50 ! Local:
51 REAL cevapcu(klev)
52 REAL ztmsmlt, zqsat
53
54 !jq The variable maxpdmfdp(klon) has been introduced by Olivier Boucher
55 !jq 14/11/00 to fix the problem with the negative precipitation.
56 real maxpdmfdp(klon, klev)
57
58 INTEGER k, kp, i
59 REAL zcons1, zcons2, zcucov, ztmelp2
60 real zdp, zzp, zfac, zsnmlt, zrfl, zrnew
61 REAL zrmin, zrfln, zdrfl
62 REAL zpds, zpdr, zdenom
63 INTEGER ikb
64
65 !---------------------------------------------------------------
66
67 DO k=1, klev
68 CEVAPCU(k)=1.93E-6*261.*SQRT(1.E3/(38.3*0.293) &
69 *SQRT(0.5*(paph(1, k) + paph(1, k + 1))/paph(1, klev + 1))) * 0.5/RG
70 end DO
71
72 ! SPECIFY CONSTANTS
73
74 zcons1 = RCPD/(RLMLT*RG*pdtime)
75 zcons2 = 1./(RG*pdtime)
76 zcucov = 0.05
77 ztmelp2 = RTT + 2.
78
79 ! DETERMINE FINAL CONVECTIVE FLUXES
80
81 DO i = 1, klon
82 IF (.NOT. ldcum(i) .OR. kdtop(i) < kctop(i)) lddraf(i)=.FALSE.
83 IF (.NOT. ldcum(i)) ktype(i) = 0
84 end DO
85
86 ktopm2 = min(klev, minval(kctop)) - 2
87
88 DO k = ktopm2, klev
89 DO i = 1, klon
90 IF (ldcum(i) .AND. k >= kctop(i) - 1) THEN
91 mfus(i, k) = mfus(i, k) &
92 - mfu(i, k) * (RCPD * ptenh(i, k) + pgeoh(i, k))
93 mfuq(i, k)=mfuq(i, k)-mfu(i, k)*pqenh(i, k)
94 zdp = 1.5E4
95 IF (ldland(i)) zdp = 3.E4
96
97 ! L'eau liquide détrainée est precipitée quand certaines
98 ! conditions sont réunies (sinon, elle est considérée
99 ! évaporée dans l'environnement)
100
101 IF (paph(i, kcbot(i)) - paph(i, kctop(i)) >= zdp &
102 .AND. pqen(i, k - 1) > 0.8 * pqsen(i, k - 1)) &
103 pdmfup(i, k - 1) = pdmfup(i, k - 1) + plude(i, k - 1)
104
105 IF (lddraf(i).AND.k >= kdtop(i)) THEN
106 pmfds(i, k)=pmfds(i, k)-pmfd(i, k)* &
107 (RCPD*ptenh(i, k) + pgeoh(i, k))
108 pmfdq(i, k)=pmfdq(i, k)-pmfd(i, k)*pqenh(i, k)
109 ELSE
110 pmfd(i, k)=0.
111 pmfds(i, k)=0.
112 pmfdq(i, k)=0.
113 pdmfdp(i, k-1)=0.
114 END IF
115 ELSE
116 mfu(i, k)=0.
117 mfus(i, k)=0.
118 mfuq(i, k)=0.
119 mful(i, k)=0.
120 pdmfup(i, k-1)=0.
121 plude(i, k-1)=0.
122 pmfd(i, k)=0.
123 pmfds(i, k)=0.
124 pmfdq(i, k)=0.
125 pdmfdp(i, k-1)=0.
126 ENDIF
127 end DO
128 end DO
129
130 DO k=ktopm2, klev
131 DO i = 1, klon
132 IF (ldcum(i) .AND. k > kcbot(i)) THEN
133 ikb=kcbot(i)
134 zzp = ((paph(i, klev + 1) - paph(i, k)) &
135 / (paph(i, klev + 1) - paph(i, ikb)))
136 IF (ktype(i) == 3) zzp = zzp**2
137 mfu(i, k)=mfu(i, ikb)*zzp
138 mfus(i, k)=mfus(i, ikb)*zzp
139 mfuq(i, k)=mfuq(i, ikb)*zzp
140 mful(i, k)=mful(i, ikb)*zzp
141 ENDIF
142 end DO
143 end DO
144
145 ! CALCULATE RAIN/SNOW FALL RATES
146 ! CALCULATE MELTING OF SNOW
147 ! CALCULATE EVAPORATION OF PRECIP
148
149 DO k = 1, klev + 1
150 DO i = 1, klon
151 pmflxr(i, k) = 0.0
152 pmflxs(i, k) = 0.0
153 ENDDO
154 ENDDO
155 DO k = ktopm2, klev
156 DO i = 1, klon
157 IF (ldcum(i)) THEN
158 IF (pmflxs(i, k) > 0.0 .AND. pten(i, k) > ztmelp2) THEN
159 zfac=zcons1*(paph(i, k + 1)-paph(i, k))
160 zsnmlt=MIN(pmflxs(i, k), zfac*(pten(i, k)-ztmelp2))
161 pdpmel(i, k)=zsnmlt
162 ztmsmlt=pten(i, k)-zsnmlt/zfac
163 zqsat = R2ES * FOEEW(ztmsmlt, RTT >= ztmsmlt) / pap(i, k)
164 zqsat = MIN(0.5, zqsat)
165 zqsat = zqsat / (1. - RETV * zqsat)
166 pqsen(i, k) = zqsat
167 ENDIF
168 IF (pten(i, k) > RTT) THEN
169 pmflxr(i, k + 1) = pmflxr(i, k) + pdmfup(i, k) + pdmfdp(i, k) &
170 + pdpmel(i, k)
171 pmflxs(i, k + 1)=pmflxs(i, k)-pdpmel(i, k)
172 ELSE
173 pmflxs(i, k + 1)=pmflxs(i, k) + pdmfup(i, k) + pdmfdp(i, k)
174 pmflxr(i, k + 1)=pmflxr(i, k)
175 ENDIF
176 ! si la precipitation est negative, on ajuste le plux du
177 ! panache descendant pour eliminer la negativite
178 IF ((pmflxr(i, k + 1) + pmflxs(i, k + 1)) < 0.0) THEN
179 pdmfdp(i, k) = -pmflxr(i, k)-pmflxs(i, k)-pdmfup(i, k)
180 pmflxr(i, k + 1) = 0.0
181 pmflxs(i, k + 1) = 0.0
182 pdpmel(i, k) = 0.0
183 ENDIF
184 ENDIF
185 ENDDO
186 ENDDO
187
188 ! The new variable is initialized here. It contains the
189 ! humidity which is fed to the downdraft by evaporation of
190 ! precipitation in the column below the base of convection.
191
192 ! In the former version, this term has been subtracted from precip
193 ! as well as the evaporation.
194
195 DO k = 1, klev
196 DO i = 1, klon
197 maxpdmfdp(i, k)=0.0
198 ENDDO
199 ENDDO
200 DO k = 1, klev
201 DO kp = k, klev
202 DO i = 1, klon
203 maxpdmfdp(i, k)=maxpdmfdp(i, k) + pdmfdp(i, kp)
204 ENDDO
205 ENDDO
206 ENDDO
207 ! End of initialization
208
209 DO k = ktopm2, klev
210 DO i = 1, klon
211 IF (ldcum(i) .AND. k >= kcbot(i)) THEN
212 zrfl = pmflxr(i, k) + pmflxs(i, k)
213 IF (zrfl > 1.0E-20) THEN
214 zrnew = (MAX(0., SQRT(zrfl / zcucov) - CEVAPCU(k) &
215 * (paph(i, k + 1) - paph(i, k)) &
216 * MAX(0., pqsen(i, k) - pqen(i, k))))**2 * zcucov
217 zrmin = zrfl - zcucov &
218 * MAX(0., 0.8 * pqsen(i, k) - pqen(i, k)) &
219 * zcons2 * (paph(i, k + 1) - paph(i, k))
220 zrnew=MAX(zrnew, zrmin)
221 zrfln=MAX(zrnew, 0.)
222 zdrfl=MIN(0., zrfln-zrfl)
223 ! At least the amount of precipiation needed to feed
224 ! the downdraft with humidity below the base of
225 ! convection has to be left and can't be evaporated
226 ! (surely the evaporation can't be positive):
227 zdrfl=MAX(zdrfl, &
228 MIN(-pmflxr(i, k)-pmflxs(i, k)-maxpdmfdp(i, k), 0.0))
229
230 zdenom=1.0/MAX(1.0E-20, pmflxr(i, k) + pmflxs(i, k))
231 IF (pten(i, k) > RTT) THEN
232 zpdr = pdmfdp(i, k)
233 zpds = 0.0
234 ELSE
235 zpdr = 0.0
236 zpds = pdmfdp(i, k)
237 ENDIF
238 pmflxr(i, k + 1) = pmflxr(i, k) + zpdr + pdpmel(i, k) &
239 + zdrfl*pmflxr(i, k)*zdenom
240 pmflxs(i, k + 1) = pmflxs(i, k) + zpds - pdpmel(i, k) &
241 + zdrfl*pmflxs(i, k)*zdenom
242 pdmfup(i, k) = pdmfup(i, k) + zdrfl
243 ELSE
244 pmflxr(i, k + 1) = 0.0
245 pmflxs(i, k + 1) = 0.0
246 pdmfdp(i, k) = 0.0
247 pdpmel(i, k) = 0.0
248 ENDIF
249 if (pmflxr(i, k) + pmflxs(i, k) < -1.e-26) &
250 write(*, *) 'precip. < 1e-16 ', pmflxr(i, k) + pmflxs(i, k)
251 ENDIF
252 ENDDO
253 ENDDO
254
255 DO i = 1, klon
256 prfl(i) = pmflxr(i, klev + 1)
257 psfl(i) = pmflxs(i, klev + 1)
258 end DO
259
260 RETURN
261 END SUBROUTINE flxflux
262
263 end module flxflux_m

  ViewVC Help
Powered by ViewVC 1.1.21