source: LMDZ4/branches/IPSL-CM4_IPCC_patches/libf/phylmd/fisrtilp.F @ 5373

Last change on this file since 5373 was 524, checked in by lmdzadmin, 21 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.0 KB
Line 
1!
2! $Header$
3!
4c
5      SUBROUTINE fisrtilp(dtime,paprs,pplay,t,q,ptconv,ratqs,
6     s                   d_t, d_q, d_ql, rneb, radliq, rain, snow,
7     s                   pfrac_impa, pfrac_nucl, pfrac_1nucl,
8     s                   frac_impa, frac_nucl,
9     s                   prfl, psfl, rhcl)
10
11c
12      IMPLICIT none
13c======================================================================
14c Auteur(s): Z.X. Li (LMD/CNRS)
15c Date: le 20 mars 1995
16c Objet: condensation et precipitation stratiforme.
17c        schema de nuage
18c======================================================================
19c======================================================================
20#include "dimensions.h"
21#include "dimphy.h"
22#include "YOMCST.h"
23#include "tracstoke.h"
24#include "fisrtilp.h"
25c
26c Arguments:
27c
28      REAL dtime ! intervalle du temps (s)
29      REAL paprs(klon,klev+1) ! pression a inter-couche
30      REAL pplay(klon,klev) ! pression au milieu de couche
31      REAL t(klon,klev) ! temperature (K)
32      REAL q(klon,klev) ! humidite specifique (kg/kg)
33      REAL d_t(klon,klev) ! incrementation de la temperature (K)
34      REAL d_q(klon,klev) ! incrementation de la vapeur d'eau
35      REAL d_ql(klon,klev) ! incrementation de l'eau liquide
36      REAL rneb(klon,klev) ! fraction nuageuse
37      REAL radliq(klon,klev) ! eau liquide utilisee dans rayonnements
38      REAL rhcl(klon,klev) ! humidite relative en ciel clair
39      REAL rain(klon) ! pluies (mm/s)
40      REAL snow(klon) ! neige (mm/s)
41      REAL prfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
42      REAL psfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
43cAA
44c Coeffients de fraction lessivee : pour OFF-LINE
45c
46      REAL pfrac_nucl(klon,klev)
47      REAL pfrac_1nucl(klon,klev)
48      REAL pfrac_impa(klon,klev)
49c
50c Fraction d'aerosols lessivee par impaction et par nucleation
51c POur ON-LINE
52c
53      REAL frac_impa(klon,klev)
54      REAL frac_nucl(klon,klev)
55      real zct(klon),zcl(klon)
56cAA
57c
58c Options du programme:
59c
60      REAL seuil_neb ! un nuage existe vraiment au-dela
61      PARAMETER (seuil_neb=0.001)
62
63      INTEGER ninter ! sous-intervals pour la precipitation
64      PARAMETER (ninter=5)
65      LOGICAL evap_prec ! evaporation de la pluie
66      PARAMETER (evap_prec=.TRUE.)
67      REAL ratqs(klon,klev) ! determine la largeur de distribution de vapeur
68      logical ptconv(klon,klev) ! determine la largeur de distribution de vapeur
69
70      real zpdf_sig(klon),zpdf_k(klon),zpdf_delta(klon)
71      real Zpdf_a(klon),zpdf_b(klon),zpdf_e1(klon),zpdf_e2(klon)
72      real erf
73c
74      LOGICAL cpartiel ! condensation partielle
75      PARAMETER (cpartiel=.TRUE.)
76      REAL t_coup
77      PARAMETER (t_coup=234.0)
78c
79c Variables locales:
80c
81      INTEGER i, k, n, kk
82      REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5
83      REAL zrfl(klon), zrfln(klon), zqev, zqevt
84      REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq
85      REAL ztglace, zt(klon)
86      INTEGER nexpo ! exponentiel pour glace/eau
87      REAL zdz(klon),zrho(klon),ztot(klon), zrhol(klon)
88      REAL zchau(klon),zfroi(klon),zfice(klon),zneb(klon)
89c
90      LOGICAL appel1er
91      SAVE appel1er
92c
93c---------------------------------------------------------------
94c
95cAA Variables traceurs:
96cAA  Provisoire !!! Parametres alpha du lessivage
97cAA  A priori on a 4 scavenging # possibles
98c
99      REAL a_tr_sca(4)
100      save a_tr_sca
101c
102c Variables intermediaires
103c
104      REAL zalpha_tr
105      REAL zfrac_lessi
106      REAL zprec_cond(klon)
107cAA
108      REAL zmair, zcpair, zcpeau
109C     Pour la conversion eau-neige
110      REAL zlh_solid(klon), zm_solid
111cIM
112      INTEGER klevm1
113c---------------------------------------------------------------
114c
115c Fonctions en ligne:
116c
117      REAL fallvs,fallvc ! vitesse de chute pour crystaux de glace
118      REAL zzz
119#include "YOETHF.h"
120#include "FCTTRE.h"
121      fallvc (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_con
122      fallvs (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_lsc
123c
124      DATA appel1er /.TRUE./
125
126      IF (appel1er) THEN
127c
128         PRINT*, 'fisrtilp, ninter:', ninter
129         PRINT*, 'fisrtilp, evap_prec:', evap_prec
130         PRINT*, 'fisrtilp, cpartiel:', cpartiel
131         IF (ABS(dtime/FLOAT(ninter)-360.0).GT.0.001) THEN
132          PRINT*, 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime
133          PRINT*, 'Je prefere un sous-intervalle de 6 minutes'
134c         CALL abort
135         ENDIF
136         appel1er = .FALSE.
137c
138cAA initialiation provisoire
139       a_tr_sca(1) = -0.5
140       a_tr_sca(2) = -0.5
141       a_tr_sca(3) = -0.5
142       a_tr_sca(4) = -0.5
143c
144cAA Initialisation a 1 des coefs des fractions lessivees
145c
146      DO k = 1, klev
147       DO i = 1, klon
148          pfrac_nucl(i,k)=1.
149          pfrac_1nucl(i,k)=1.
150          pfrac_impa(i,k)=1.
151       ENDDO
152      ENDDO
153
154      ENDIF          !  test sur appel1er
155c
156cMAf Initialisation a 0 de zoliq
157       DO i = 1, klon
158          zoliq(i)=0.
159       ENDDO
160c Determiner les nuages froids par leur temperature
161c  nexpo regle la raideur de la transition eau liquide / eau glace.
162c
163      ztglace = RTT - 15.0
164      nexpo = 6
165ccc      nexpo = 1
166c
167c Initialiser les sorties:
168c
169      DO k = 1, klev+1
170      DO i = 1, klon
171         prfl(i,k) = 0.0
172         psfl(i,k) = 0.0
173      ENDDO
174      ENDDO
175
176      DO k = 1, klev
177      DO i = 1, klon
178         d_t(i,k) = 0.0
179         d_q(i,k) = 0.0
180         d_ql(i,k) = 0.0
181         rneb(i,k) = 0.0
182         radliq(i,k) = 0.0
183         frac_nucl(i,k) = 1.
184         frac_impa(i,k) = 1.
185      ENDDO
186      ENDDO
187      DO i = 1, klon
188         rain(i) = 0.0
189         snow(i) = 0.0
190      ENDDO
191c
192c Initialiser le flux de precipitation a zero
193c
194      DO i = 1, klon
195         zrfl(i) = 0.0
196         zneb(i) = seuil_neb
197      ENDDO
198c
199c
200cAA Pour plus de securite
201
202      zalpha_tr   = 0.
203      zfrac_lessi = 0.
204
205cAA----------------------------------------------------------
206c
207c Boucle verticale (du haut vers le bas)
208c
209cIM : klevm1
210      klevm1=klev-1
211      DO 9999 k = klev, 1, -1
212c
213cAA----------------------------------------------------------
214c
215      DO i = 1, klon
216         zt(i)=t(i,k)
217         zq(i)=q(i,k)
218      ENDDO
219c
220c Calculer la varition de temp. de l'air du a la chaleur sensible
221C transporter par la pluie.
222C Il resterait a rajouter cet effet de la chaleur sensible sur les
223C flux de surface, du a la diff. de temp. entre le 1er niveau et la
224C surface.
225C
226      DO i = 1, klon
227cIM
228       IF(k.LE.klevm1) THEN         
229        zmair=(paprs(i,k)-paprs(i,k+1))/RG
230        zcpair=RCPD*(1.0+RVTMP2*zq(i))
231        zcpeau=RCPD*RVTMP2
232        zt(i) = ( (t(i,k+1)+d_t(i,k+1))*zrfl(i)*dtime*zcpeau
233     $      + zmair*zcpair*zt(i) )
234     $      / (zmair*zcpair + zrfl(i)*dtime*zcpeau)
235CC        WRITE (6,*) 'cppluie ', zt(i)-(t(i,k+1)+d_t(i,k+1))
236       ENDIF
237      ENDDO
238c
239c
240c Calculer l'evaporation de la precipitation
241c
242
243
244      IF (evap_prec) THEN
245      DO i = 1, klon
246      IF (zrfl(i) .GT.0.) THEN
247         IF (thermcep) THEN
248           zdelta=MAX(0.,SIGN(1.,RTT-zt(i)))
249           zqs(i)= R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
250           zqs(i)=MIN(0.5,zqs(i))
251           zcor=1./(1.-RETV*zqs(i))
252           zqs(i)=zqs(i)*zcor
253         ELSE
254           IF (zt(i) .LT. t_coup) THEN
255              zqs(i) = qsats(zt(i)) / pplay(i,k)
256           ELSE
257              zqs(i) = qsatl(zt(i)) / pplay(i,k)
258           ENDIF
259         ENDIF
260         zqev = MAX (0.0, (zqs(i)-zq(i))*zneb(i) )
261         zqevt = coef_eva * (1.0-zq(i)/zqs(i)) * SQRT(zrfl(i))
262     .         * (paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
263         zqevt = MAX(0.0,MIN(zqevt,zrfl(i)))
264     .         * RG*dtime/(paprs(i,k)-paprs(i,k+1))
265         zqev = MIN (zqev, zqevt)
266         zrfln(i) = zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1))
267     .                            /RG/dtime
268
269c pour la glace, on réévapore toute la précip dans la couche du dessous
270c la glace venant de la couche du dessus est simplement dans la couche
271c du dessous.
272
273         IF (zt(i) .LT. t_coup.and.reevap_ice) zrfln(i)=0.
274
275         zq(i) = zq(i) - (zrfln(i)-zrfl(i))
276     .             * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
277         zt(i) = zt(i) + (zrfln(i)-zrfl(i))
278     .             * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
279     .             * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
280         zrfl(i) = zrfln(i)
281      ENDIF
282      ENDDO
283      ENDIF
284c
285c Calculer Qs et L/Cp*dQs/dT:
286c
287      IF (thermcep) THEN
288         DO i = 1, klon
289           zdelta = MAX(0.,SIGN(1.,RTT-zt(i)))
290           zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
291           zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))
292           zqs(i) = R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
293           zqs(i) = MIN(0.5,zqs(i))
294           zcor = 1./(1.-RETV*zqs(i))
295           zqs(i) = zqs(i)*zcor
296           zdqs(i) = FOEDE(zt(i),zdelta,zcvm5,zqs(i),zcor)
297         ENDDO
298      ELSE
299         DO i = 1, klon
300            IF (zt(i).LT.t_coup) THEN
301               zqs(i) = qsats(zt(i))/pplay(i,k)
302               zdqs(i) = dqsats(zt(i),zqs(i))
303            ELSE
304               zqs(i) = qsatl(zt(i))/pplay(i,k)
305               zdqs(i) = dqsatl(zt(i),zqs(i))
306            ENDIF
307         ENDDO
308      ENDIF
309c
310c Determiner la condensation partielle et calculer la quantite
311c de l'eau condensee:
312c
313      IF (cpartiel) THEN
314
315c        print*,'Dans partiel k=',k
316c
317c   Calcul de l'eau condensee et de la fraction nuageuse et de l'eau
318c   nuageuse a partir des PDF de Sandrine Bony.
319c   rneb  : fraction nuageuse
320c   zqn   : eau totale dans le nuage
321c   zcond : eau condensee moyenne dans la maille.
322c           on prend en compte le réchauffement qui diminue la partie condensee
323c
324c   Version avec les raqts
325
326         if (iflag_pdf.eq.0) then
327
328           do i=1,klon
329            zdelq = min(ratqs(i,k),0.99) * zq(i)
330            rneb(i,k) = (zq(i)+zdelq-zqs(i)) / (2.0*zdelq)
331            zqn(i) = (zq(i)+zdelq+zqs(i))/2.0
332           enddo
333
334         else
335c
336c   Version avec les nouvelles PDFs.
337           do i=1,klon
338              if(zq(i).lt.1.e-15) then
339                print*,'ZQ(',i,',',k,')=',zq(i)
340                zq(i)=1.e-15
341              endif
342           enddo
343           do i=1,klon
344            zpdf_sig(i)=ratqs(i,k)*zq(i)
345            zpdf_k(i)=-sqrt(log(1.+(zpdf_sig(i)/zq(i))**2))
346            zpdf_delta(i)=log(zq(i)/zqs(i))
347            zpdf_a(i)=zpdf_delta(i)/(zpdf_k(i)*sqrt(2.))
348            zpdf_b(i)=zpdf_k(i)/(2.*sqrt(2.))
349            zpdf_e1(i)=zpdf_a(i)-zpdf_b(i)
350            zpdf_e1(i)=sign(min(abs(zpdf_e1(i)),5.),zpdf_e1(i))
351            zpdf_e1(i)=1.-erf(zpdf_e1(i))
352            zpdf_e2(i)=zpdf_a(i)+zpdf_b(i)
353            zpdf_e2(i)=sign(min(abs(zpdf_e2(i)),5.),zpdf_e2(i))
354            zpdf_e2(i)=1.-erf(zpdf_e2(i))
355            if (zpdf_e1(i).lt.1.e-10) then
356               rneb(i,k)=0.
357               zqn(i)=zqs(i)
358            else
359               rneb(i,k)=0.5*zpdf_e1(i)
360               zqn(i)=zq(i)*zpdf_e2(i)/zpdf_e1(i)
361            endif
362           
363           enddo
364
365        endif ! iflag_pdf
366
367         do i=1,klon
368            IF (rneb(i,k) .LE. 0.0) zqn(i) = 0.0
369            IF (rneb(i,k) .GE. 1.0) zqn(i) = zq(i)
370            rneb(i,k) = MAX(0.0,MIN(1.0,rneb(i,k)))
371c           zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1.+zdqs(i))
372c  On ne divise pas par 1+zdqs pour forcer a avoir l'eau predite par
373c  la convection.
374c  ATTENTION !!! Il va falloir verifier tout ca.
375            zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)
376c           print*,'ZDQS ',zdqs(i)
377c--Olivier
378            rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
379            IF (rneb(i,k) .LE. 0.0) rhcl(i,k)=zq(i)/zqs(i)
380            IF (rneb(i,k) .GE. 1.0) rhcl(i,k)=1.0
381c--fin
382           ENDDO
383      ELSE
384         DO i = 1, klon
385            IF (zq(i).GT.zqs(i)) THEN
386               rneb(i,k) = 1.0
387            ELSE
388               rneb(i,k) = 0.0
389            ENDIF
390            zcond(i) = MAX(0.0,zq(i)-zqs(i))/(1.+zdqs(i))
391         ENDDO
392      ENDIF
393c
394      DO i = 1, klon
395         zq(i) = zq(i) - zcond(i)
396c         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD
397         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
398      ENDDO
399c
400c Partager l'eau condensee en precipitation et eau liquide nuageuse
401c
402      DO i = 1, klon
403      IF (rneb(i,k).GT.0.0) THEN
404         zoliq(i) = zcond(i)
405         zrho(i) = pplay(i,k) / zt(i) / RD
406         zdz(i) = (paprs(i,k)-paprs(i,k+1)) / (zrho(i)*RG)
407         zfice(i) = 1.0 - (zt(i)-ztglace) / (273.13-ztglace)
408         zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
409         zfice(i) = zfice(i)**nexpo
410         zneb(i) = MAX(rneb(i,k), seuil_neb)
411         radliq(i,k) = zoliq(i)/FLOAT(ninter+1)
412      ENDIF
413      ENDDO
414c
415      DO n = 1, ninter
416      DO i = 1, klon
417      IF (rneb(i,k).GT.0.0) THEN
418         zrhol(i) = zrho(i) * zoliq(i) / zneb(i)
419
420         if (ptconv(i,k)) then
421            zcl(i)=cld_lc_con
422            zct(i)=1./cld_tau_con
423         else
424            zcl(i)=cld_lc_lsc
425            zct(i)=1./cld_tau_lsc
426         endif
427c  quantité d'eau à élminier.
428         zchau(i) = zct(i)*dtime/FLOAT(ninter) * zoliq(i)
429     .         *(1.0-EXP(-(zoliq(i)/zneb(i)/zcl(i))**2)) *(1.-zfice(i))
430c  meme chose pour la glace.
431         if (ptconv(i,k)) then
432            zfroi(i) = dtime/FLOAT(ninter)/zdz(i)*zoliq(i)
433     .              *fallvc(zrhol(i)) * zfice(i)
434         else
435            zfroi(i) = dtime/FLOAT(ninter)/zdz(i)*zoliq(i)
436     .              *fallvs(zrhol(i)) * zfice(i)
437         endif
438         ztot(i) = zchau(i) + zfroi(i)
439         IF (zneb(i).EQ.seuil_neb) ztot(i) = 0.0
440         ztot(i) = MIN(MAX(ztot(i),0.0),zoliq(i))
441         zoliq(i) = MAX(zoliq(i)-ztot(i), 0.0)
442         radliq(i,k) = radliq(i,k) + zoliq(i)/FLOAT(ninter+1)
443      ENDIF
444      ENDDO
445      ENDDO
446c
447      DO i = 1, klon
448      IF (rneb(i,k).GT.0.0) THEN
449         d_ql(i,k) = zoliq(i)
450         zrfl(i) = zrfl(i)+ MAX(zcond(i)-zoliq(i),0.0)
451     .                    * (paprs(i,k)-paprs(i,k+1))/(RG*dtime)
452      ENDIF
453      IF (zt(i).LT.RTT) THEN
454        psfl(i,k)=zrfl(i)
455      ELSE
456        prfl(i,k)=zrfl(i)
457      ENDIF
458      ENDDO
459c
460c Calculer les tendances de q et de t:
461c
462      DO i = 1, klon
463         d_q(i,k) = zq(i) - q(i,k)
464         d_t(i,k) = zt(i) - t(i,k)
465      ENDDO
466c
467cAA--------------- Calcul du lessivage stratiforme  -------------
468
469      DO i = 1,klon
470c
471         zprec_cond(i) = MAX(zcond(i)-zoliq(i),0.0)
472     .                * (paprs(i,k)-paprs(i,k+1))/RG
473         IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN
474cAA lessivage nucleation LMD5 dans la couche elle-meme
475            if (t(i,k) .GE. ztglace) THEN
476               zalpha_tr = a_tr_sca(3)
477            else
478               zalpha_tr = a_tr_sca(4)
479            endif
480            zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
481            pfrac_nucl(i,k)=pfrac_nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
482            frac_nucl(i,k)= 1.-zneb(i)*zfrac_lessi
483c
484c nucleation avec un facteur -1 au lieu de -0.5
485            zfrac_lessi = 1. - EXP(-zprec_cond(i)/zneb(i))
486            pfrac_1nucl(i,k)=pfrac_1nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
487         ENDIF
488c
489      ENDDO      ! boucle sur i
490c
491cAA Lessivage par impaction dans les couches en-dessous
492      DO kk = k-1, 1, -1
493        DO i = 1, klon
494          IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN
495            if (t(i,kk) .GE. ztglace) THEN
496              zalpha_tr = a_tr_sca(1)
497            else
498              zalpha_tr = a_tr_sca(2)
499            endif
500            zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
501            pfrac_impa(i,kk)=pfrac_impa(i,kk)*(1.-zneb(i)*zfrac_lessi)
502            frac_impa(i,kk)= 1.-zneb(i)*zfrac_lessi
503          ENDIF
504        ENDDO
505      ENDDO
506c
507cAA----------------------------------------------------------
508c                     FIN DE BOUCLE SUR K   
509 9999 CONTINUE
510c
511cAA-----------------------------------------------------------
512c
513c Pluie ou neige au sol selon la temperature de la 1ere couche
514c
515      DO i = 1, klon
516      IF ((t(i,1)+d_t(i,1)) .LT. RTT) THEN
517         snow(i) = zrfl(i)
518         zlh_solid(i) = RLSTT-RLVTT
519      ELSE
520         rain(i) = zrfl(i)
521         zlh_solid(i) = 0.
522      ENDIF
523      ENDDO
524C
525C For energy conservation : when snow is present, the solification
526c latent heat is considered.
527      DO k = 1, klev
528        DO i = 1, klon
529          zcpair=RCPD*(1.0+RVTMP2*(q(i,k)+d_q(i,k)))
530          zmair=(paprs(i,k)-paprs(i,k+1))/RG
531          zm_solid = (prfl(i,k)-prfl(i,k+1)+psfl(i,k)-psfl(i,k+1))*dtime
532          d_t(i,k) = d_t(i,k) + zlh_solid(i) *zm_solid / (zcpair*zmair)
533        END DO
534      END DO
535c
536      RETURN
537      END
Note: See TracBrowser for help on using the repository browser.