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 |