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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 52 - (hide annotations)
Fri Sep 23 12:28:01 2011 UTC (12 years, 8 months ago) by guez
Original Path: trunk/libf/phylmd/Conflx/flxflux.f90
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 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

  ViewVC Help
Powered by ViewVC 1.1.21