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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 103 - (hide annotations)
Fri Aug 29 13:00:05 2014 UTC (9 years, 9 months ago) by guez
File size: 8849 byte(s)
Renamed module cvparam to cv_param. Deleted procedure
cv_param. Changed variables of module cv_param into parameters.

In procedures cv_driver, cv_uncompress and cv3_uncompress, removed
some arguments giving dimensions and used module variables klon and
klev instead.

In procedures gradiv2, laplacien_gam and laplacien, changed
declarations of local variables because klevel is not always klev.

Removed code for nudging surface pressure.

Removed arguments pim and pjm of tau2alpha. Added assignment of false
to variable first.

Replaced real argument del of procedures foeew and FOEDE by logical
argument.

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 guez 103 REAL ztmsmlt, zqsat
53 guez 70
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 guez 103 zqsat = R2ES * FOEEW(ztmsmlt, RTT >= ztmsmlt) / pap(i, k)
164 guez 70 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 guez 78 pmflxs(i, k + 1)=pmflxs(i, k)-pdpmel(i, k)
172 guez 70 ELSE
173 guez 78 pmflxs(i, k + 1)=pmflxs(i, k) + pdmfup(i, k) + pdmfdp(i, k)
174     pmflxr(i, k + 1)=pmflxr(i, k)
175 guez 70 ENDIF
176     ! si la precipitation est negative, on ajuste le plux du
177     ! panache descendant pour eliminer la negativite
178 guez 78 IF ((pmflxr(i, k + 1) + pmflxs(i, k + 1)) < 0.0) THEN
179 guez 70 pdmfdp(i, k) = -pmflxr(i, k)-pmflxs(i, k)-pdmfup(i, k)
180 guez 78 pmflxr(i, k + 1) = 0.0
181     pmflxs(i, k + 1) = 0.0
182 guez 70 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 guez 52 DO kp = k, klev
202 guez 70 DO i = 1, klon
203 guez 78 maxpdmfdp(i, k)=maxpdmfdp(i, k) + pdmfdp(i, kp)
204 guez 70 ENDDO
205 guez 52 ENDDO
206 guez 70 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 guez 78 zdenom=1.0/MAX(1.0E-20, pmflxr(i, k) + pmflxs(i, k))
231 guez 70 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 guez 78 pmflxr(i, k + 1) = pmflxr(i, k) + zpdr + pdpmel(i, k) &
239 guez 70 + zdrfl*pmflxr(i, k)*zdenom
240 guez 78 pmflxs(i, k + 1) = pmflxs(i, k) + zpds - pdpmel(i, k) &
241 guez 70 + zdrfl*pmflxs(i, k)*zdenom
242     pdmfup(i, k) = pdmfup(i, k) + zdrfl
243     ELSE
244 guez 78 pmflxr(i, k + 1) = 0.0
245     pmflxs(i, k + 1) = 0.0
246 guez 70 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 guez 78 prfl(i) = pmflxr(i, klev + 1)
257     psfl(i) = pmflxs(i, klev + 1)
258 guez 70 end DO
259    
260     RETURN
261     END SUBROUTINE flxflux
262    
263     end module flxflux_m

  ViewVC Help
Powered by ViewVC 1.1.21