source: LMDZ.3.3/trunk/libf/phylmd/fisrtilp.F @ 26

Last change on this file since 26 was 23, checked in by lmdz, 24 years ago

modif de physiq et fistrlp.F pour recuperer les flux d'eau precipitante (cf Olivier)

  1. Hauglustaine
  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 9.3 KB
Line 
1      SUBROUTINE fisrtilp(dtime,paprs,pplay,t,q,
2     s                   d_t, d_q, d_ql, rneb, radliq, rain, snow,
3     s                   prfl, psfl)
4c
5      IMPLICIT none
6c======================================================================
7c Auteur(s): Z.X. Li (LMD/CNRS)
8c Date: le 20 mars 1995
9c Objet: condensation et precipitation stratiforme.
10c        schema de nuage
11c======================================================================
12c======================================================================
13#include "dimensions.h"
14#include "dimphy.h"
15#include "YOMCST.h"
16c
17c Arguments:
18c
19      REAL dtime ! intervalle du temps (s)
20      REAL paprs(klon,klev+1) ! pression a inter-couche
21      REAL pplay(klon,klev) ! pression au milieu de couche
22      REAL t(klon,klev) ! temperature (K)
23      REAL q(klon,klev) ! humidite specifique (kg/kg)
24      REAL d_t(klon,klev) ! incrementation de la temperature (K)
25      REAL d_q(klon,klev) ! incrementation de la vapeur d'eau
26      REAL d_ql(klon,klev) ! incrementation de l'eau liquide
27      REAL rneb(klon,klev) ! fraction nuageuse
28      REAL radliq(klon,klev) ! eau liquide utilisee dans rayonnements
29      REAL rain(klon) ! pluies (mm/s)
30      REAL snow(klon) ! neige (mm/s)
31      REAL prfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
32      REAL psfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
33c
34c Options du programme:
35c
36      REAL seuil_neb ! un nuage existe vraiment au-dela
37      PARAMETER (seuil_neb=0.001)
38      REAL ct ! inverse du temps pour qu'un nuage precipite
39      PARAMETER (ct=1./1800.)
40      REAL cl ! seuil de precipitation
41      PARAMETER (cl=2.0e-4)
42      INTEGER ninter ! sous-intervals pour la precipitation
43      PARAMETER (ninter=5)
44      LOGICAL evap_prec ! evaporation de la pluie
45      PARAMETER (evap_prec=.TRUE.)
46      REAL coef_eva
47      PARAMETER (coef_eva=2.0E-05)
48      LOGICAL calcrat ! calculer ratqs au lieu de fixer sa valeur
49      REAL ratqs ! determine la largeur de distribution de vapeur
50      PARAMETER (calcrat=.TRUE.)
51      REAL zx_min, rat_max
52      PARAMETER (zx_min=1.0, rat_max=0.01)
53      REAL zx_max, rat_min
54      PARAMETER (zx_max=0.1, rat_min=0.3)
55      REAL zx
56c
57      LOGICAL cpartiel ! condensation partielle
58      PARAMETER (cpartiel=.TRUE.)
59      REAL t_coup
60      PARAMETER (t_coup=234.0)
61c
62c Variables locales:
63c
64      INTEGER i, k, n
65      REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5
66      REAL zrfl(klon), zrfln(klon), zqev, zqevt
67      REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq
68      REAL ztglace, zt(klon)
69      INTEGER nexpo ! exponentiel pour glace/eau
70      REAL zdz(klon),zrho(klon),ztot(klon), zrhol(klon)
71      REAL zchau(klon),zfroi(klon),zfice(klon),zneb(klon)
72c
73      LOGICAL appel1er
74      SAVE appel1er
75c
76c Fonctions en ligne:
77c
78      REAL fallv ! vitesse de chute pour crystaux de glace
79      REAL zzz
80#include "YOETHF.h"
81#include "FCTTRE.h"
82CCC      fallv (zzz) = 3.29/3.0 * ((zzz)**0.
83       fallv (zzz) = 3.29 * ((zzz)**0.16)
84c
85      DATA appel1er /.TRUE./
86c
87      IF (appel1er) THEN
88         PRINT*, 'fisrtilp, calcrat:', calcrat
89         PRINT*, 'fisrtilp, ninter:', ninter
90         PRINT*, 'fisrtilp, evap_prec:', evap_prec
91         PRINT*, 'fisrtilp, cpartiel:', cpartiel
92         IF (ABS(dtime/FLOAT(ninter)-360.0).GT.0.001) THEN
93          PRINT*, 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime
94          PRINT*, 'Je prefere un sous-intervalle de 6 minutes'
95          CALL abort
96         ENDIF
97         appel1er = .FALSE.
98      ENDIF
99c
100c Determiner les nuages froids par leur temperature
101c
102      ztglace = RTT - 15.0
103      nexpo = 6
104ccc      nexpo = 1
105c
106c Initialiser les sorties:
107c
108      DO k = 1, klev+1
109      DO i = 1, klon
110         prfl(i,k) = 0.0
111         psfl(i,k) = 0.0
112      ENDDO
113      ENDDO
114      DO k = 1, klev
115      DO i = 1, klon
116         d_t(i,k) = 0.0
117         d_q(i,k) = 0.0
118         d_ql(i,k) = 0.0
119         rneb(i,k) = 0.0
120         radliq(i,k) = 0.0
121      ENDDO
122      ENDDO
123      DO i = 1, klon
124         rain(i) = 0.0
125         snow(i) = 0.0
126      ENDDO
127c
128c Initialiser le flux de precipitation a zero
129c
130      DO i = 1, klon
131         zrfl(i) = 0.0
132         zneb(i) = seuil_neb
133      ENDDO
134c
135c Boucle verticale (du haut vers le bas)
136c
137      DO 9999 k = klev, 1, -1
138c
139      DO i = 1, klon
140         zt(i)=t(i,k)
141         zq(i)=q(i,k)
142      ENDDO
143c
144c Calculer l'evaporation de la precipitation
145c
146      IF (evap_prec) THEN
147      DO i = 1, klon
148      IF (zrfl(i) .GT.0.) THEN
149         IF (thermcep) THEN
150           zdelta=MAX(0.,SIGN(1.,RTT-zt(i)))
151           zqs(i)= R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
152           zqs(i)=MIN(0.5,zqs(i))
153           zcor=1./(1.-RETV*zqs(i))
154           zqs(i)=zqs(i)*zcor
155         ELSE
156           IF (zt(i) .LT. t_coup) THEN
157              zqs(i) = qsats(zt(i)) / pplay(i,k)
158           ELSE
159              zqs(i) = qsatl(zt(i)) / pplay(i,k)
160           ENDIF
161         ENDIF
162         zqev = MAX (0.0, (zqs(i)-zq(i))*zneb(i) )
163         zqevt = coef_eva * (1.0-zq(i)/zqs(i)) * SQRT(zrfl(i))
164     .         * (paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
165         zqevt = MAX(0.0,MIN(zqevt,zrfl(i)))
166     .         * RG*dtime/(paprs(i,k)-paprs(i,k+1))
167         zqev = MIN (zqev, zqevt)
168         zrfln(i) = zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1))
169     .                            /RG/dtime
170         zq(i) = zq(i) - (zrfln(i)-zrfl(i))
171     .             * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
172         zt(i) = zt(i) + (zrfln(i)-zrfl(i))
173     .             * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
174     .             * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
175         zrfl(i) = zrfln(i)
176      ENDIF
177      ENDDO
178      ENDIF
179c
180c Calculer Qs et L/Cp*dQs/dT:
181c
182      IF (thermcep) THEN
183         DO i = 1, klon
184           zdelta = MAX(0.,SIGN(1.,RTT-zt(i)))
185           zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
186           zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))
187           zqs(i) = R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
188           zqs(i) = MIN(0.5,zqs(i))
189           zcor = 1./(1.-RETV*zqs(i))
190           zqs(i) = zqs(i)*zcor
191           zdqs(i) = FOEDE(zt(i),zdelta,zcvm5,zqs(i),zcor)
192         ENDDO
193      ELSE
194         DO i = 1, klon
195            IF (zt(i).LT.t_coup) THEN
196               zqs(i) = qsats(zt(i))/pplay(i,k)
197               zdqs(i) = dqsats(zt(i),zqs(i))
198            ELSE
199               zqs(i) = qsatl(zt(i))/pplay(i,k)
200               zdqs(i) = dqsatl(zt(i),zqs(i))
201            ENDIF
202         ENDDO
203      ENDIF
204c
205c Determiner la condensation partielle et calculer la quantite
206c de l'eau condensee:
207c
208      IF (cpartiel) THEN
209         DO i = 1, klon
210c
211            zx = pplay(i,k)/paprs(i,1)
212            zx = (zx_max-zx)/(zx_max-zx_min)
213            zx = MIN(MAX(zx,0.0),1.0)
214            zx = zx * zx * zx
215            ratqs = zx * (rat_max-rat_min) + rat_min
216            IF (.NOT.calcrat) ratqs=0.2
217c
218            zdelq = ratqs * zq(i)
219            rneb(i,k) = (zq(i)+zdelq-zqs(i)) / (2.0*zdelq)
220            zqn(i) = (zq(i)+zdelq+zqs(i))/2.0
221            IF (rneb(i,k) .LE. 0.0) zqn(i) = 0.0
222            IF (rneb(i,k) .GE. 1.0) zqn(i) = zq(i)
223            rneb(i,k) = MAX(0.0,MIN(1.0,rneb(i,k)))
224            zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1.+zdqs(i))
225         ENDDO
226      ELSE
227         DO i = 1, klon
228            IF (zq(i).GT.zqs(i)) THEN
229               rneb(i,k) = 1.0
230            ELSE
231               rneb(i,k) = 0.0
232            ENDIF
233            zcond(i) = MAX(0.0,zq(i)-zqs(i))/(1.+zdqs(i))
234         ENDDO
235      ENDIF
236c
237      DO i = 1, klon
238         zq(i) = zq(i) - zcond(i)
239         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD
240      ENDDO
241c
242c Partager l'eau condensee en precipitation et eau liquide nuageuse
243c
244      DO i = 1, klon
245      IF (rneb(i,k).GT.0.0) THEN
246         zoliq(i) = zcond(i)
247         zrho(i) = pplay(i,k) / zt(i) / RD
248         zdz(i) = (paprs(i,k)-paprs(i,k+1)) / (zrho(i)*RG)
249         zfice(i) = 1.0 - (zt(i)-ztglace) / (273.13-ztglace)
250         zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
251         zfice(i) = zfice(i)**nexpo
252         zneb(i) = MAX(rneb(i,k), seuil_neb)
253         radliq(i,k) = zoliq(i)/FLOAT(ninter+1)
254      ENDIF
255      ENDDO
256c
257      DO n = 1, ninter
258      DO i = 1, klon
259      IF (rneb(i,k).GT.0.0) THEN
260         zchau(i) = ct*dtime/FLOAT(ninter) * zoliq(i)
261     .          * (1.0-EXP(-(zoliq(i)/zneb(i)/cl)**2)) *(1.-zfice(i))
262         zrhol(i) = zrho(i) * zoliq(i) / zneb(i)
263         zfroi(i) = dtime/FLOAT(ninter)/zdz(i)*zoliq(i)
264     .              *fallv(zrhol(i)) * zfice(i)
265         ztot(i) = zchau(i) + zfroi(i)
266         IF (zneb(i).EQ.seuil_neb) ztot(i) = 0.0
267         ztot(i) = MIN(MAX(ztot(i),0.0),zoliq(i))
268         zoliq(i) = MAX(zoliq(i)-ztot(i), 0.0)
269         radliq(i,k) = radliq(i,k) + zoliq(i)/FLOAT(ninter+1)
270      ENDIF
271      ENDDO
272      ENDDO
273c
274      DO i = 1, klon
275      IF (rneb(i,k).GT.0.0) THEN
276         d_ql(i,k) = zoliq(i)
277         zrfl(i) = zrfl(i)+ MAX(zcond(i)-zoliq(i),0.0)
278     .                    * (paprs(i,k)-paprs(i,k+1))/(RG*dtime)
279         IF (zt(i).LT.RTT) THEN
280           psfl(i,k)=zrfl(i)
281         ELSE
282           prfl(i,k)=zrfl(i)
283         ENDIF
284      ENDIF
285      ENDDO
286
287c
288c Calculer les tendances de q et de t:
289c
290      DO i = 1, klon
291         d_q(i,k) = zq(i) - q(i,k)
292         d_t(i,k) = zt(i) - t(i,k)
293      ENDDO
294c
295 9999 CONTINUE
296c
297c Pluie ou neige au sol selon la temperature de la 1ere couche
298c
299      DO i = 1, klon
300      IF ((t(i,1)+d_t(i,1)) .LT. RTT) THEN
301         snow(i) = zrfl(i)
302      ELSE
303         rain(i) = zrfl(i)
304      ENDIF
305      ENDDO
306c
307      RETURN
308      END
Note: See TracBrowser for help on using the repository browser.