/[lmdze]/trunk/libf/phylmd/Conflx/flxflux.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/Conflx/flxflux.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 52 - (show annotations)
Fri Sep 23 12:28:01 2011 UTC (12 years, 7 months ago) by guez
File size: 8035 byte(s)
Split "conflx.f" into single-procedure files in directory "Conflx".

Split "cv_routines.f" into single-procedure files in directory
"CV_routines". Made module "cvparam" from included file
"cvparam.h". No included file other than "netcdf.inc" left in LMDZE.

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

  ViewVC Help
Powered by ViewVC 1.1.21