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

Annotation of /trunk/phylmd/Conflx/flxflux.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 82 - (hide annotations)
Wed Mar 5 14:57:53 2014 UTC (10 years, 2 months ago) by guez
File size: 8903 byte(s)
Changed all ".f90" suffixes to ".f".
1 guez 70 module flxflux_m
2    
3     IMPLICIT none
4    
5     contains
6    
7     SUBROUTINE flxflux(pdtime, pqen, pqsen, ptenh, pqenh, pap, paph, ldland, &
8 guez 71 pgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, mfu, pmfd, mfus, &
9     pmfds, mfuq, pmfdq, mful, plude, pdmfup, pdmfdp, pten, prfl, psfl, &
10 guez 70 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 guez 78 REAL, intent(in):: pap(klon, klev)
26     REAL, intent(in):: paph(klon, klev + 1)
27 guez 70 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 guez 71 REAL mfu(klon, klev)
35 guez 70 REAL pmfd(klon, klev)
36 guez 71 real, intent(inout):: mfus(klon, klev)
37 guez 70 real pmfds(klon, klev)
38 guez 71 REAL mfuq(klon, klev)
39 guez 70 REAL pmfdq(klon, klev)
40 guez 71 real mful(klon, klev)
41 guez 70 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 guez 78 REAL pmflxr(klon, klev + 1), pmflxs(klon, klev + 1)
49 guez 70
50     ! Local:
51     REAL cevapcu(klev)
52     REAL ztmsmlt, zdelta, 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 guez 78 *SQRT(0.5*(paph(1, k) + paph(1, k + 1))/paph(1, klev + 1))) * 0.5/RG
70 guez 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 guez 71 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 guez 70 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 guez 78 (RCPD*ptenh(i, k) + pgeoh(i, k))
108 guez 70 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 guez 71 mfu(i, k)=0.
117     mfus(i, k)=0.
118     mfuq(i, k)=0.
119     mful(i, k)=0.
120 guez 70 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 guez 71 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 guez 70 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 guez 78 DO k = 1, klev + 1
150 guez 70 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 guez 78 zfac=zcons1*(paph(i, k + 1)-paph(i, k))
160 guez 70 zsnmlt=MIN(pmflxs(i, k), zfac*(pten(i, k)-ztmelp2))
161     pdpmel(i, k)=zsnmlt
162     ztmsmlt=pten(i, k)-zsnmlt/zfac
163     zdelta=MAX(0., SIGN(1., RTT-ztmsmlt))
164     zqsat = R2ES * FOEEW(ztmsmlt, zdelta) / pap(i, k)
165     zqsat = MIN(0.5, zqsat)
166     zqsat = zqsat / (1. - RETV * zqsat)
167     pqsen(i, k) = zqsat
168     ENDIF
169     IF (pten(i, k) > RTT) THEN
170     pmflxr(i, k + 1) = pmflxr(i, k) + pdmfup(i, k) + pdmfdp(i, k) &
171     + pdpmel(i, k)
172 guez 78 pmflxs(i, k + 1)=pmflxs(i, k)-pdpmel(i, k)
173 guez 70 ELSE
174 guez 78 pmflxs(i, k + 1)=pmflxs(i, k) + pdmfup(i, k) + pdmfdp(i, k)
175     pmflxr(i, k + 1)=pmflxr(i, k)
176 guez 70 ENDIF
177     ! si la precipitation est negative, on ajuste le plux du
178     ! panache descendant pour eliminer la negativite
179 guez 78 IF ((pmflxr(i, k + 1) + pmflxs(i, k + 1)) < 0.0) THEN
180 guez 70 pdmfdp(i, k) = -pmflxr(i, k)-pmflxs(i, k)-pdmfup(i, k)
181 guez 78 pmflxr(i, k + 1) = 0.0
182     pmflxs(i, k + 1) = 0.0
183 guez 70 pdpmel(i, k) = 0.0
184     ENDIF
185     ENDIF
186     ENDDO
187     ENDDO
188    
189     ! The new variable is initialized here. It contains the
190     ! humidity which is fed to the downdraft by evaporation of
191     ! precipitation in the column below the base of convection.
192    
193     ! In the former version, this term has been subtracted from precip
194     ! as well as the evaporation.
195    
196     DO k = 1, klev
197     DO i = 1, klon
198     maxpdmfdp(i, k)=0.0
199     ENDDO
200     ENDDO
201     DO k = 1, klev
202 guez 52 DO kp = k, klev
203 guez 70 DO i = 1, klon
204 guez 78 maxpdmfdp(i, k)=maxpdmfdp(i, k) + pdmfdp(i, kp)
205 guez 70 ENDDO
206 guez 52 ENDDO
207 guez 70 ENDDO
208     ! End of initialization
209    
210     DO k = ktopm2, klev
211     DO i = 1, klon
212     IF (ldcum(i) .AND. k >= kcbot(i)) THEN
213     zrfl = pmflxr(i, k) + pmflxs(i, k)
214     IF (zrfl > 1.0E-20) THEN
215     zrnew = (MAX(0., SQRT(zrfl / zcucov) - CEVAPCU(k) &
216     * (paph(i, k + 1) - paph(i, k)) &
217     * MAX(0., pqsen(i, k) - pqen(i, k))))**2 * zcucov
218     zrmin = zrfl - zcucov &
219     * MAX(0., 0.8 * pqsen(i, k) - pqen(i, k)) &
220     * zcons2 * (paph(i, k + 1) - paph(i, k))
221     zrnew=MAX(zrnew, zrmin)
222     zrfln=MAX(zrnew, 0.)
223     zdrfl=MIN(0., zrfln-zrfl)
224     ! At least the amount of precipiation needed to feed
225     ! the downdraft with humidity below the base of
226     ! convection has to be left and can't be evaporated
227     ! (surely the evaporation can't be positive):
228     zdrfl=MAX(zdrfl, &
229     MIN(-pmflxr(i, k)-pmflxs(i, k)-maxpdmfdp(i, k), 0.0))
230    
231 guez 78 zdenom=1.0/MAX(1.0E-20, pmflxr(i, k) + pmflxs(i, k))
232 guez 70 IF (pten(i, k) > RTT) THEN
233     zpdr = pdmfdp(i, k)
234     zpds = 0.0
235     ELSE
236     zpdr = 0.0
237     zpds = pdmfdp(i, k)
238     ENDIF
239 guez 78 pmflxr(i, k + 1) = pmflxr(i, k) + zpdr + pdpmel(i, k) &
240 guez 70 + zdrfl*pmflxr(i, k)*zdenom
241 guez 78 pmflxs(i, k + 1) = pmflxs(i, k) + zpds - pdpmel(i, k) &
242 guez 70 + zdrfl*pmflxs(i, k)*zdenom
243     pdmfup(i, k) = pdmfup(i, k) + zdrfl
244     ELSE
245 guez 78 pmflxr(i, k + 1) = 0.0
246     pmflxs(i, k + 1) = 0.0
247 guez 70 pdmfdp(i, k) = 0.0
248     pdpmel(i, k) = 0.0
249     ENDIF
250     if (pmflxr(i, k) + pmflxs(i, k) < -1.e-26) &
251     write(*, *) 'precip. < 1e-16 ', pmflxr(i, k) + pmflxs(i, k)
252     ENDIF
253     ENDDO
254     ENDDO
255    
256     DO i = 1, klon
257 guez 78 prfl(i) = pmflxr(i, klev + 1)
258     psfl(i) = pmflxs(i, klev + 1)
259 guez 70 end DO
260    
261     RETURN
262     END SUBROUTINE flxflux
263    
264     end module flxflux_m

  ViewVC Help
Powered by ViewVC 1.1.21