source: LMDZ.3.3/branches/LF/libf/phylmd/fisrtilp.F @ 400

Last change on this file since 400 was 2, checked in by lmdz, 25 years ago

Initial revision

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