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