/[lmdze]/trunk/phylmd/fisrtilp.f
ViewVC logotype

Diff of /trunk/phylmd/fisrtilp.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.3  
changed lines
  Added in v.68

  ViewVC Help
Powered by ViewVC 1.1.21