1 |
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 |