source: LMDZ5/branches/AI-cosp/libf/phylmd/fisrtilp.F90 @ 3931

Last change on this file since 3931 was 2415, checked in by crio, 9 years ago

Prise en compte de l'effet Bergeron dans les flux de pluie grande-echelle
Activer en mettant iflag_bergeron=1 dans physiq.def (valeur par defaut 0)
Representation of the Bergeron effect in the large-scale precipitation fluxes
Activate by iflag_bergeron=1 in physiq.def (standard value 0)

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 36.2 KB
Line 
1!
2! $Id: fisrtilp.F90 2415 2015-12-23 18:13:53Z oboucher $
3!
4!
5SUBROUTINE fisrtilp(dtime,paprs,pplay,t,q,ptconv,ratqs, &
6     d_t, d_q, d_ql, d_qi, rneb, radliq, rain, snow,          &
7     pfrac_impa, pfrac_nucl, pfrac_1nucl,               &
8     frac_impa, frac_nucl, beta,                        &
9     prfl, psfl, rhcl, zqta, fraca,                     &
10     ztv, zpspsk, ztla, zthl, iflag_cld_th,             &
11     iflag_ice_thermo)
12
13  !
14  USE dimphy
15  USE icefrac_lsc_mod ! compute ice fraction (JBM 3/14)
16  USE print_control_mod, ONLY: prt_level, lunout
17  IMPLICIT none
18  !======================================================================
19  ! Auteur(s): Z.X. Li (LMD/CNRS)
20  ! Date: le 20 mars 1995
21  ! Objet: condensation et precipitation stratiforme.
22  !        schema de nuage
23  !======================================================================
24  !======================================================================
25  include "YOMCST.h"
26  include "fisrtilp.h"
27  include "nuage.h" ! JBM (3/14)
28
29  !
30  ! Arguments:
31  !
32  REAL dtime ! intervalle du temps (s)
33  REAL paprs(klon,klev+1) ! pression a inter-couche
34  REAL pplay(klon,klev) ! pression au milieu de couche
35  REAL t(klon,klev) ! temperature (K)
36  REAL q(klon,klev) ! humidite specifique (kg/kg)
37  REAL d_t(klon,klev) ! incrementation de la temperature (K)
38  REAL d_q(klon,klev) ! incrementation de la vapeur d'eau
39  REAL d_ql(klon,klev) ! incrementation de l'eau liquide
40  REAL d_qi(klon,klev) ! incrementation de l'eau glace
41  REAL rneb(klon,klev) ! fraction nuageuse
42  REAL radliq(klon,klev) ! eau liquide utilisee dans rayonnements
43  REAL rhcl(klon,klev) ! humidite relative en ciel clair
44  REAL rain(klon) ! pluies (mm/s)
45  REAL snow(klon) ! neige (mm/s)
46  REAL prfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
47  REAL psfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
48  REAL ztv(klon,klev)
49  REAL zqta(klon,klev),fraca(klon,klev)
50  REAL sigma1(klon,klev),sigma2(klon,klev)
51  REAL qltot(klon,klev),ctot(klon,klev)
52  REAL zpspsk(klon,klev),ztla(klon,klev)
53  REAL zthl(klon,klev)
54  REAL ztfondue, qsl, qsi
55
56  logical lognormale(klon)
57  logical ice_thermo
58
59  !AA
60  ! Coeffients de fraction lessivee : pour OFF-LINE
61  !
62  REAL pfrac_nucl(klon,klev)
63  REAL pfrac_1nucl(klon,klev)
64  REAL pfrac_impa(klon,klev)
65  !
66  ! Fraction d'aerosols lessivee par impaction et par nucleation
67  ! POur ON-LINE
68  !
69  REAL frac_impa(klon,klev)
70  REAL frac_nucl(klon,klev)
71  real zct      ,zcl
72  !AA
73  !
74  ! Options du programme:
75  !
76  REAL seuil_neb ! un nuage existe vraiment au-dela
77  PARAMETER (seuil_neb=0.001)
78
79  INTEGER ninter ! sous-intervals pour la precipitation
80  INTEGER ncoreczq 
81  INTEGER iflag_cld_th
82  INTEGER iflag_ice_thermo
83  PARAMETER (ninter=5)
84  LOGICAL evap_prec ! evaporation de la pluie
85  PARAMETER (evap_prec=.TRUE.)
86  REAL ratqs(klon,klev) ! determine la largeur de distribution de vapeur
87  logical ptconv(klon,klev) ! determine la largeur de distribution de vapeur
88
89  real zpdf_sig(klon),zpdf_k(klon),zpdf_delta(klon)
90  real Zpdf_a(klon),zpdf_b(klon),zpdf_e1(klon),zpdf_e2(klon)
91  real erf   
92  REAL qcloud(klon)
93  !
94  LOGICAL cpartiel ! condensation partielle
95  PARAMETER (cpartiel=.TRUE.)
96  REAL t_coup
97  PARAMETER (t_coup=234.0)
98  !
99  ! Variables locales:
100  !
101  INTEGER i, k, n, kk
102  REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5 
103  REAL Tbef(klon),qlbef(klon),DT(klon),num,denom
104  LOGICAL convergence(klon)
105  REAL DDT0
106  PARAMETER (DDT0=.01)
107  INTEGER n_i(klon), iter
108  REAL cste
109 
110  REAL zrfl(klon), zrfln(klon), zqev, zqevt
111  REAL zifl(klon), zifln(klon), zqev0,zqevi, zqevti
112  REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq
113  REAL zoliqp(klon), zoliqi(klon)
114  REAL zt(klon)
115! JBM (3/14) nexpo is replaced by exposant_glace
116! REAL nexpo ! exponentiel pour glace/eau
117! INTEGER, PARAMETER :: nexpo=6
118  INTEGER exposant_glace_old
119  REAL t_glace_min_old
120  REAL zdz(klon),zrho(klon),ztot      , zrhol(klon)
121  REAL zchau      ,zfroi      ,zfice(klon),zneb(klon)
122  REAL zmelt, zpluie, zice, zcondold
123  PARAMETER (ztfondue=278.15)
124  REAL dzfice(klon)
125  REAL zsolid
126  !
127  LOGICAL appel1er
128  SAVE appel1er
129  !$OMP THREADPRIVATE(appel1er)
130  !
131  !---------------------------------------------------------------
132  !
133  !AA Variables traceurs:
134  !AA  Provisoire !!! Parametres alpha du lessivage
135  !AA  A priori on a 4 scavenging # possibles
136  !
137  REAL a_tr_sca(4)
138  save a_tr_sca
139  !$OMP THREADPRIVATE(a_tr_sca)
140  !
141  ! Variables intermediaires
142  !
143  REAL zalpha_tr
144  REAL zfrac_lessi
145  REAL zprec_cond(klon)
146  !AA
147! RomP >>> 15 nov 2012
148  REAL   beta(klon,klev) ! taux de conversion de l'eau cond
149! RomP <<<
150  REAL zmair, zcpair, zcpeau
151  !     Pour la conversion eau-neige
152  REAL zlh_solid(klon), zm_solid
153  !IM
154  !ym      INTEGER klevm1
155  !---------------------------------------------------------------
156  !
157  ! Fonctions en ligne:
158  !
159  REAL fallvs,fallvc ! vitesse de chute pour crystaux de glace
160  REAL zzz
161  include "YOETHF.h"
162  include "FCTTRE.h"
163  fallvc (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_con
164  fallvs (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_lsc
165  !
166  DATA appel1er /.TRUE./
167  !ym
168!CR: pour iflag_ice_thermo=2, on active que la convection
169!  ice_thermo = iflag_ice_thermo .GE. 1
170   ice_thermo = (iflag_ice_thermo .EQ. 1).OR.(iflag_ice_thermo .GE. 3)
171  zdelq=0.0
172
173  if (prt_level>9)write(lunout,*)'NUAGES4 A. JAM'
174  IF (appel1er) THEN
175     !
176     WRITE(lunout,*) 'fisrtilp, ninter:', ninter
177     WRITE(lunout,*) 'fisrtilp, evap_prec:', evap_prec
178     WRITE(lunout,*) 'fisrtilp, cpartiel:', cpartiel
179     IF (ABS(dtime/REAL(ninter)-360.0).GT.0.001) THEN
180        WRITE(lunout,*) 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime
181        WRITE(lunout,*) 'Je prefere un sous-intervalle de 6 minutes'
182        !         CALL abort
183     ENDIF
184     appel1er = .FALSE.
185     !
186     !AA initialiation provisoire
187     a_tr_sca(1) = -0.5
188     a_tr_sca(2) = -0.5
189     a_tr_sca(3) = -0.5
190     a_tr_sca(4) = -0.5
191     !
192     !AA Initialisation a 1 des coefs des fractions lessivees
193     !
194     !cdir collapse
195     DO k = 1, klev
196        DO i = 1, klon
197           pfrac_nucl(i,k)=1.
198           pfrac_1nucl(i,k)=1.
199           pfrac_impa(i,k)=1.
200           beta(i,k)=0.  !RomP initialisation
201        ENDDO
202     ENDDO
203
204  ENDIF          !  test sur appel1er
205  !
206  !MAf Initialisation a 0 de zoliq
207  !      DO i = 1, klon
208  !         zoliq(i)=0.
209  !      ENDDO
210  ! Determiner les nuages froids par leur temperature
211  !  nexpo regle la raideur de la transition eau liquide / eau glace.
212  !
213!CR: on est oblige de definir des valeurs fisrt car les valeurs de newmicro ne sont pas les memes par defaut
214  IF (iflag_t_glace.EQ.0) THEN
215!   ztglace = RTT - 15.0
216    t_glace_min_old = RTT - 15.0
217    !AJ<
218    IF (ice_thermo) THEN
219!     nexpo = 2
220      exposant_glace_old = 2
221    ELSE
222!     nexpo = 6
223      exposant_glace_old = 6
224    ENDIF
225   
226  ENDIF
227 
228!!  RLVTT = 2.501e6 ! pas de redefinition des constantes physiques (jyg)
229!!  RLSTT = 2.834e6 ! pas de redefinition des constantes physiques (jyg)
230!>AJ
231  !cc      nexpo = 1
232  !
233  ! Initialiser les sorties:
234  !
235  !cdir collapse
236  DO k = 1, klev+1
237     DO i = 1, klon
238        prfl(i,k) = 0.0
239        psfl(i,k) = 0.0
240     ENDDO
241  ENDDO
242
243  !cdir collapse
244  DO k = 1, klev
245     DO i = 1, klon
246        d_t(i,k) = 0.0
247        d_q(i,k) = 0.0
248        d_ql(i,k) = 0.0
249        d_qi(i,k) = 0.0
250        rneb(i,k) = 0.0
251        radliq(i,k) = 0.0
252        frac_nucl(i,k) = 1.
253        frac_impa(i,k) = 1.
254     ENDDO
255  ENDDO
256  DO i = 1, klon
257     rain(i) = 0.0
258     snow(i) = 0.0
259     zoliq(i)=0.
260     !     ENDDO
261     !
262     ! Initialiser le flux de precipitation a zero
263     !
264     !     DO i = 1, klon
265     zrfl(i) = 0.0
266     zifl(i) = 0.0
267     zneb(i) = seuil_neb
268  ENDDO
269  !
270  !
271  !AA Pour plus de securite
272
273  zalpha_tr   = 0.
274  zfrac_lessi = 0.
275
276  !AA----------------------------------------------------------
277  !
278  ncoreczq=0
279  ! Boucle verticale (du haut vers le bas)
280  !
281  !IM : klevm1
282  !ym      klevm1=klev-1
283  DO k = klev, 1, -1
284     !
285     !AA----------------------------------------------------------
286     !
287     DO i = 1, klon
288        zt(i)=t(i,k)
289        zq(i)=q(i,k)
290     ENDDO
291     !
292     ! Calculer la varition de temp. de l'air du a la chaleur sensible
293     ! transporter par la pluie.
294     ! Il resterait a rajouter cet effet de la chaleur sensible sur les
295     ! flux de surface, du a la diff. de temp. entre le 1er niveau et la
296     ! surface.
297     !
298     IF(k.LE.klevm1) THEN         
299        DO i = 1, klon
300           !IM
301           zmair=(paprs(i,k)-paprs(i,k+1))/RG
302           zcpair=RCPD*(1.0+RVTMP2*zq(i))
303           zcpeau=RCPD*RVTMP2
304           zt(i) = ( (t(i,k+1)+d_t(i,k+1))*zrfl(i)*dtime*zcpeau &
305                + zmair*zcpair*zt(i) ) &
306                / (zmair*zcpair + zrfl(i)*dtime*zcpeau)
307           !     C        WRITE (6,*) 'cppluie ', zt(i)-(t(i,k+1)+d_t(i,k+1))
308        ENDDO
309     ENDIF
310     !
311     !
312     ! Calculer l'evaporation de la precipitation
313     !
314
315
316     ! Calculer l'evaporation de la precipitation
317     !
318
319
320     IF (evap_prec) THEN
321        DO i = 1, klon
322!AJ<
323!!           IF (zrfl(i) .GT.0.) THEN
324           IF (zrfl(i)+zifl(i).GT.0.) THEN
325!>AJ
326              IF (thermcep) THEN
327                 zdelta=MAX(0.,SIGN(1.,RTT-zt(i)))
328                 zqs(i)= R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
329                 zqs(i)=MIN(0.5,zqs(i))
330                 zcor=1./(1.-RETV*zqs(i))
331                 zqs(i)=zqs(i)*zcor
332              ELSE
333                 IF (zt(i) .LT. t_coup) THEN
334                    zqs(i) = qsats(zt(i)) / pplay(i,k)
335                 ELSE
336                    zqs(i) = qsatl(zt(i)) / pplay(i,k)
337                 ENDIF
338              ENDIF
339           ENDIF ! (zrfl(i)+zifl(i).GT.0.)
340        ENDDO
341!AJ<
342       IF (.NOT. ice_thermo) THEN
343        DO i = 1, klon
344!AJ<
345!!           IF (zrfl(i) .GT.0.) THEN
346           IF (zrfl(i)+zifl(i).GT.0.) THEN
347!>AJ
348                zqev = MAX (0.0, (zqs(i)-zq(i))*zneb(i) )
349                zqevt = coef_eva * (1.0-zq(i)/zqs(i)) * SQRT(zrfl(i)) &
350                     * (paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
351                zqevt = MAX(0.0,MIN(zqevt,zrfl(i))) &
352                     * RG*dtime/(paprs(i,k)-paprs(i,k+1))
353                zqev = MIN (zqev, zqevt)
354                zrfln(i) = zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1)) &
355                     /RG/dtime
356       
357                ! pour la glace, on ré-évapore toute la précip dans la
358                ! couche du dessous
359                ! la glace venant de la couche du dessus est simplement
360                ! dans la couche du dessous.
361       
362                IF (zt(i) .LT. t_coup.and.reevap_ice) zrfln(i)=0.
363       
364                zq(i) = zq(i) - (zrfln(i)-zrfl(i)) &
365                     * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
366                zt(i) = zt(i) + (zrfln(i)-zrfl(i)) &
367                     * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
368                     * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
369                zrfl(i) = zrfln(i)
370                zifl(i) = 0.
371           ENDIF ! (zrfl(i)+zifl(i).GT.0.)
372        ENDDO
373!
374       ELSE ! (.NOT. ice_thermo)
375!
376        DO i = 1, klon
377!AJ<
378!!           IF (zrfl(i) .GT.0.) THEN
379           IF (zrfl(i)+zifl(i).GT.0.) THEN
380!>AJ
381     !JAM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
382     ! Modification de l'évaporation avec la glace
383     ! Différentiation entre précipitation liquide et solide
384     ! On suppose que coef_evai=2*coef_eva
385     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
386     
387         zqev0 = MAX (0.0, (zqs(i)-zq(i))*zneb(i) )
388     !    zqev0 = MAX (0.0, zqs(i)-zq(i) )
389
390     !JAM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
391     ! On différencie qsat pour l'eau et la glace
392     ! Si zdelta=1. --> glace
393     ! Si zdelta=0. --> eau liquide
394     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
395         
396         qsl= R2ES*FOEEW(zt(i),0.)/pplay(i,k)
397         qsl= MIN(0.5,qsl)
398         zcor= 1./(1.-RETV*qsl)
399         qsl= qsl*zcor
400         
401         zqevt = 1.*coef_eva*(1.0-zq(i)/qsl)*SQRT(zrfl(i)) &
402              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
403         zqevt = MAX(0.0,MIN(zqevt,zrfl(i))) &
404              *RG*dtime/(paprs(i,k)-paprs(i,k+1))
405
406         qsi= R2ES*FOEEW(zt(i),1.)/pplay(i,k)
407         qsi= MIN(0.5,qsi)
408         zcor= 1./(1.-RETV*qsi)
409         qsi= qsi*zcor
410
411         zqevti = 1.*coef_eva*(1.0-zq(i)/qsi)*SQRT(zifl(i)) &
412              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
413         zqevti = MAX(0.0,MIN(zqevti,zifl(i))) &
414              *RG*dtime/(paprs(i,k)-paprs(i,k+1))   
415
416             
417     !JAM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
418     ! Vérification sur l'évaporation
419     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
420     
421         IF (zqevt+zqevti.GT.zqev0) THEN
422                  zqev=zqev0*zqevt/(zqevt+zqevti)
423                  zqevi=zqev0*zqevti/(zqevt+zqevti)
424             
425         ELSE
426             IF (zqevt+zqevti.GT.0.) THEN
427                  zqev=MIN(zqev0*zqevt/(zqevt+zqevti),zqevt)
428                  zqevi=MIN(zqev0*zqevti/(zqevt+zqevti),zqevti)
429             ELSE
430             zqev=0.
431             zqevi=0.
432             ENDIF
433         ENDIF
434     
435         zrfln(i) = Max(0.,zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1)) &
436                                 /RG/dtime)
437         zifln(i) = Max(0.,zifl(i) - zqevi*(paprs(i,k)-paprs(i,k+1)) &
438                                 /RG/dtime)
439         
440     ! Pour la glace, on révapore toute la précip dans la couche du dessous
441     ! la glace venant de la couche du dessus est simplement dans la couche
442     ! du dessous.
443     
444     !    IF (zt(i) .LT. t_coup.and.reevap_ice) zrfln(i)=0.
445!         print*,zrfl(i),zrfln(i),zqevt,zqevti,RLMLT,'fluxdeprecip'
446         zq(i) = zq(i) - (zrfln(i)+zifln(i)-zrfl(i)-zifl(i)) &
447                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
448         zt(i) = zt(i) + (zrfln(i)-zrfl(i)) &
449                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
450                  * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) &
451                  + (zifln(i)-zifl(i)) &
452                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
453                  * RLSTT/RCPD/(1.0+RVTMP2*zq(i))
454     
455         zrfl(i) = zrfln(i)
456         zifl(i) = zifln(i)
457
458!CR ATTENTION: deplacement de la fonte de la glace
459           zmelt = ((zt(i)-273.15)/(ztfondue-273.15))**2
460           zmelt = MIN(MAX(zmelt,0.),1.)
461           zrfl(i)=zrfl(i)+zmelt*zifl(i)
462           zifl(i)=zifl(i)*(1.-zmelt)
463!           print*,zt(i),'octavio1'
464           zt(i)=zt(i)-zifl(i)*zmelt*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
465                      *RLMLT/RCPD/(1.0+RVTMP2*zq(i))
466!           print*,zt(i),zrfl(i),zifl(i),zmelt,'octavio2'
467!fin CR
468
469
470
471           ENDIF ! (zrfl(i)+zifl(i).GT.0.)
472        ENDDO
473
474      ENDIF ! (.NOT. ice_thermo)
475     
476     ENDIF ! (evap_prec)
477     !
478     ! Calculer Qs et L/Cp*dQs/dT:
479     !
480     IF (thermcep) THEN
481        DO i = 1, klon
482           zdelta = MAX(0.,SIGN(1.,RTT-zt(i)))
483           zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
484           zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))
485           zqs(i) = R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
486           zqs(i) = MIN(0.5,zqs(i))
487           zcor = 1./(1.-RETV*zqs(i))
488           zqs(i) = zqs(i)*zcor
489           zdqs(i) = FOEDE(zt(i),zdelta,zcvm5,zqs(i),zcor)
490        ENDDO
491     ELSE
492        DO i = 1, klon
493           IF (zt(i).LT.t_coup) THEN
494              zqs(i) = qsats(zt(i))/pplay(i,k)
495              zdqs(i) = dqsats(zt(i),zqs(i))
496           ELSE
497              zqs(i) = qsatl(zt(i))/pplay(i,k)
498              zdqs(i) = dqsatl(zt(i),zqs(i))
499           ENDIF
500        ENDDO
501     ENDIF
502     !
503     ! Determiner la condensation partielle et calculer la quantite
504     ! de l'eau condensee:
505     !
506!verification de la valeur de iflag_fisrtilp_qsat pour iflag_ice_thermo=1
507!       if ((iflag_ice_thermo.eq.1).and.(iflag_fisrtilp_qsat.ne.0)) then
508!         write(*,*) " iflag_ice_thermo==1 requires iflag_fisrtilp_qsat==0", &
509!        " but iflag_fisrtilp_qsat=",iflag_fisrtilp_qsat, ". Might as well stop here."
510!         stop
511!       endif
512
513     IF (cpartiel) THEN
514
515        !        print*,'Dans partiel k=',k
516        !
517        !   Calcul de l'eau condensee et de la fraction nuageuse et de l'eau
518        !   nuageuse a partir des PDF de Sandrine Bony.
519        !   rneb  : fraction nuageuse
520        !   zqn   : eau totale dans le nuage
521        !   zcond : eau condensee moyenne dans la maille.
522        !  on prend en compte le réchauffement qui diminue la partie
523        ! condensee
524        !
525        !   Version avec les raqts
526
527        if (iflag_pdf.eq.0) then
528
529           do i=1,klon
530              zdelq = min(ratqs(i,k),0.99) * zq(i)
531              rneb(i,k) = (zq(i)+zdelq-zqs(i)) / (2.0*zdelq)
532              zqn(i) = (zq(i)+zdelq+zqs(i))/2.0
533           enddo
534
535        else
536           !
537           !   Version avec les nouvelles PDFs.
538           do i=1,klon
539              if(zq(i).lt.1.e-15) then
540                 ncoreczq=ncoreczq+1
541                 zq(i)=1.e-15
542              endif
543           enddo
544
545           if (iflag_cld_th>=5) then
546
547              call cloudth(klon,klev,k,ztv, &
548                   zq,zqta,fraca, &
549                   qcloud,ctot,zpspsk,paprs,ztla,zthl, &
550                   ratqs,zqs,t)
551
552              do i=1,klon
553                 rneb(i,k)=ctot(i,k)
554                 zqn(i)=qcloud(i)
555              enddo
556
557           endif
558
559           if (iflag_cld_th <= 4) then
560              lognormale = .true.
561           elseif (iflag_cld_th >= 6) then
562              ! lognormale en l'absence des thermiques
563              lognormale = fraca(:,k) < 1e-10
564           else
565              ! Dans le cas iflag_cld_th=5, on prend systématiquement la
566              ! bi-gaussienne
567              lognormale = .false.
568           end if
569
570!CR: variation de qsat avec T en présence de glace ou non
571!initialisations
572           do i=1,klon
573              DT(i) = 0.
574              n_i(i)=0
575              Tbef(i)=zt(i)
576              qlbef(i)=0.
577           enddo
578
579
580!Boucle iterative: ATTENTION, l'option -1 n'est plus activable ici
581           if (iflag_fisrtilp_qsat.ge.0) then
582             do iter=1,iflag_fisrtilp_qsat+1
583               
584               do i=1,klon
585!                 do while ((abs(DT(i)).gt.DDT0).or.(n_i(i).eq.0))
586                 convergence(i)=abs(DT(i)).gt.DDT0
587                 if ((convergence(i).or.(n_i(i).eq.0)).and.lognormale(i)) then
588                 Tbef(i)=Tbef(i)+DT(i)
589                 if (.not.ice_thermo) then   
590                    zdelta = MAX(0.,SIGN(1.,RTT-Tbef(i)))
591                 else
592                    if (iflag_t_glace.eq.0) then
593                    zdelta = MAX(0.,SIGN(1.,t_glace_min_old-Tbef(i)))
594                    else if (iflag_t_glace.eq.1) then
595                    zdelta = MAX(0.,SIGN(1.,t_glace_min-Tbef(i)))
596                    endif
597                 endif
598                 zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
599                 zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))
600                 zqs(i) = R2ES*FOEEW(Tbef(i),zdelta)/pplay(i,k)
601                 zqs(i) = MIN(0.5,zqs(i))
602                 zcor = 1./(1.-RETV*zqs(i))
603                 zqs(i) = zqs(i)*zcor
604                 zdqs(i) = FOEDE(Tbef(i),zdelta,zcvm5,zqs(i),zcor)
605                 zpdf_sig(i)=ratqs(i,k)*zq(i)
606                 zpdf_k(i)=-sqrt(log(1.+(zpdf_sig(i)/zq(i))**2))
607                 zpdf_delta(i)=log(zq(i)/zqs(i))
608                 zpdf_a(i)=zpdf_delta(i)/(zpdf_k(i)*sqrt(2.))
609                 zpdf_b(i)=zpdf_k(i)/(2.*sqrt(2.))
610                 zpdf_e1(i)=zpdf_a(i)-zpdf_b(i)
611                 zpdf_e1(i)=sign(min(abs(zpdf_e1(i)),5.),zpdf_e1(i))
612                 zpdf_e1(i)=1.-erf(zpdf_e1(i))
613                 zpdf_e2(i)=zpdf_a(i)+zpdf_b(i)
614                 zpdf_e2(i)=sign(min(abs(zpdf_e2(i)),5.),zpdf_e2(i))
615                 zpdf_e2(i)=1.-erf(zpdf_e2(i))
616             
617                 if (zpdf_e1(i).lt.1.e-10) then
618                    rneb(i,k)=0.
619                    zqn(i)=zqs(i)
620                 else
621                    rneb(i,k)=0.5*zpdf_e1(i)
622                    zqn(i)=zq(i)*zpdf_e2(i)/zpdf_e1(i)
623                 endif
624
625                 endif !convergence
626               enddo ! boucle en i
627
628                 if (.not. ice_thermo) then
629
630                 do i=1,klon
631                 if ((convergence(i).or.(n_i(i).eq.0)).and.lognormale(i)) then
632
633                 qlbef(i)=max(0.,zqn(i)-zqs(i))
634                 num=-Tbef(i)+zt(i)+rneb(i,k)*RLVTT/RCPD/(1.0+RVTMP2*zq(i))*qlbef(i)
635                 denom=1.+rneb(i,k)*zdqs(i)
636                 DT(i)=num/denom
637                 n_i(i)=n_i(i)+1
638                 endif
639                 enddo
640
641                 else
642
643!calcul de la fraction de glace
644!CR: on utilise la nouvelle fonction de JBM pour l ancien calcul
645!                 zfice(i) = icefrac_lsc(Tbef(i), t_glace_min, &
646!                                     t_glace_max, exposant_glace)
647!                 zfice(i) = 1.0 - (Tbef(i)-ztglace) / (RTT-ztglace)
648!                 zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
649!                 zfice(i) = zfice(i)**nexpo
650                 if (iflag_t_glace.eq.1) then
651                 CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
652                 endif
653
654                 do i=1,klon
655                 if ((convergence(i).or.(n_i(i).eq.0)).and.lognormale(i)) then
656                 
657                 if (iflag_t_glace.eq.0) then
658                    zfice(i) = 1.0 - (Tbef(i)-t_glace_min_old) / (RTT-t_glace_min_old)
659                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
660                    zfice(i) = zfice(i)**exposant_glace_old
661                    dzfice(i)= exposant_glace_old * zfice(i)**(exposant_glace_old-1) / (t_glace_min_old - RTT)
662                 endif
663                 
664                 if (iflag_t_glace.eq.1) then
665                 dzfice(i)= exposant_glace * zfice(i)**(exposant_glace-1) / (t_glace_min - t_glace_max)
666                 endif
667               
668                 if ((zfice(i).eq.0).or.(zfice(i).eq.1)) then
669                    dzfice(i)=0.
670                 endif
671
672                 if (zfice(i).lt.1) then
673                    cste=RLVTT
674                 else
675                    cste=RLSTT
676                 endif
677
678                 qlbef(i)=max(0.,zqn(i)-zqs(i))
679                 num=-Tbef(i)+zt(i)+rneb(i,k)*((1-zfice(i))*RLVTT+zfice(i)*RLSTT)/RCPD/(1.0+RVTMP2*zq(i))*qlbef(i)
680                 denom=1.+rneb(i,k)*((1-zfice(i))*RLVTT+zfice(i)*RLSTT)/cste*zdqs(i) &
681                         -(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*zq(i))*rneb(i,k)*qlbef(i)*dzfice(i)
682                 DT(i)=num/denom
683                 n_i(i)=n_i(i)+1
684
685                 endif ! fin convergence
686                 enddo ! fin boucle i
687
688                 endif !ice_thermo
689
690!                 endif
691!               enddo
692 
693         
694             enddo
695           endif
696
697
698        endif ! iflag_pdf
699
700
701!        if (iflag_fisrtilp_qsat.eq.-1) then
702!CR: ATTENTION option fausse mais a existe: pour la re-activer, prendre iflag_fisrtilp_qsat=0 et activer les lignes suivantes:
703       IF (1.eq.0) THEN
704       DO i=1,klon
705           IF (rneb(i,k) .LE. 0.0) THEN
706              zqn(i) = 0.0
707              rneb(i,k) = 0.0
708              zcond(i) = 0.0
709              rhcl(i,k)=zq(i)/zqs(i)
710           ELSE IF (rneb(i,k) .GE. 1.0) THEN
711              zqn(i) = zq(i)
712              rneb(i,k) = 1.0                 
713              zcond(i) = MAX(0.0,zqn(i)-zqs(i))/(1+zdqs(i))
714              rhcl(i,k)=1.0
715           ELSE
716              zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1+zdqs(i))
717              rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
718           ENDIF
719        ENDDO
720        ENDIF
721
722!        ELSE
723
724        DO i=1,klon
725           IF (rneb(i,k) .LE. 0.0) THEN
726              zqn(i) = 0.0
727              rneb(i,k) = 0.0
728              zcond(i) = 0.0
729              rhcl(i,k)=zq(i)/zqs(i)
730           ELSE IF (rneb(i,k) .GE. 1.0) THEN
731              zqn(i) = zq(i)
732              rneb(i,k) = 1.0
733              zcond(i) = MAX(0.0,zqn(i)-zqs(i))
734              rhcl(i,k)=1.0
735           ELSE
736              zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)
737              rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
738           ENDIF
739        ENDDO
740
741
742!        ENDIF
743
744        !         do i=1,klon
745        !            IF (rneb(i,k) .LE. 0.0) zqn(i) = 0.0
746        !            IF (rneb(i,k) .GE. 1.0) zqn(i) = zq(i)
747        !            rneb(i,k) = MAX(0.0,MIN(1.0,rneb(i,k)))
748        !c           zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1.+zdqs(i))
749        !c  On ne divise pas par 1+zdqs pour forcer a avoir l'eau predite par
750        !c  la convection.
751        !c  ATTENTION !!! Il va falloir verifier tout ca.
752        !            zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)
753        !c           print*,'ZDQS ',zdqs(i)
754        !c--Olivier
755        !            rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
756        !            IF (rneb(i,k) .LE. 0.0) rhcl(i,k)=zq(i)/zqs(i)
757        !            IF (rneb(i,k) .GE. 1.0) rhcl(i,k)=1.0
758        !c--fin
759        !           ENDDO
760     ELSE
761        DO i = 1, klon
762           IF (zq(i).GT.zqs(i)) THEN
763              rneb(i,k) = 1.0
764           ELSE
765              rneb(i,k) = 0.0
766           ENDIF
767           zcond(i) = MAX(0.0,zq(i)-zqs(i))/(1.+zdqs(i))
768        ENDDO
769     ENDIF
770     !
771     DO i = 1, klon
772        zq(i) = zq(i) - zcond(i)
773        !         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD
774     ENDDO
775!AJ<
776     IF (.NOT. ice_thermo) THEN
777        if (iflag_fisrtilp_qsat.lt.1) then
778           DO i = 1, klon
779             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
780           ENDDO
781        else if (iflag_fisrtilp_qsat.gt.0) then
782           DO i= 1, klon
783             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i)))
784           ENDDO
785        endif
786     ELSE
787         if (iflag_t_glace.eq.1) then
788            CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
789         endif
790         if (iflag_fisrtilp_qsat.lt.1) then
791           DO i = 1, klon
792! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
793!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
794!                                     t_glace_max, exposant_glace)
795              if (iflag_t_glace.eq.0) then
796                    zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (RTT-t_glace_min_old)
797                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
798                    zfice(i) = zfice(i)**exposant_glace_old
799              endif
800              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) &
801                       +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*zq(i))
802           ENDDO
803         else
804           DO i=1, klon
805! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
806!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
807!                                     t_glace_max, exposant_glace)
808              if (iflag_t_glace.eq.0) then
809                    zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (RTT-t_glace_min_old)
810                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
811                    zfice(i) = zfice(i)**exposant_glace_old
812              endif
813              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i))) &
814                       +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i)))
815           ENDDO
816         endif
817!         print*,zt(i),zrfl(i),zifl(i),'temp1'
818       ENDIF
819!>AJ
820     !
821     ! Partager l'eau condensee en precipitation et eau liquide nuageuse
822     !
823     DO i = 1, klon
824        IF (rneb(i,k).GT.0.0) THEN
825           zoliq(i) = zcond(i)
826           zrho(i) = pplay(i,k) / zt(i) / RD
827           zdz(i) = (paprs(i,k)-paprs(i,k+1)) / (zrho(i)*RG)
828        ENDIF
829     ENDDO
830!AJ<
831     IF (.NOT. ice_thermo) THEN
832       IF (iflag_t_glace.EQ.0) THEN
833         DO i = 1, klon
834            IF (rneb(i,k).GT.0.0) THEN
835               zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (273.13-t_glace_min_old)
836               zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
837               zfice(i) = zfice(i)**exposant_glace_old
838!              zfice(i) = zfice(i)**nexpo
839         !!      zfice(i)=0.
840            ENDIF
841         ENDDO
842       ELSE ! of IF (iflag_t_glace.EQ.0)
843         CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
844!         DO i = 1, klon
845!            IF (rneb(i,k).GT.0.0) THEN
846! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
847!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
848!                                     t_glace_max, exposant_glace)
849!            ENDIF
850!         ENDDO
851       ENDIF
852     ENDIF
853     DO i = 1, klon
854        IF (rneb(i,k).GT.0.0) THEN
855           zneb(i) = MAX(rneb(i,k), seuil_neb)
856     !      zt(i) = zt(i)+zcond(i)*zfice(i)*RLMLT/RCPD/(1.0+RVTMP2*zq(i)) 
857!           print*,zt(i),'fractionglace'
858!>AJ
859           radliq(i,k) = zoliq(i)/REAL(ninter+1)
860        ENDIF
861     ENDDO
862     !
863     DO n = 1, ninter
864        DO i = 1, klon
865           IF (rneb(i,k).GT.0.0) THEN
866              zrhol(i) = zrho(i) * zoliq(i) / zneb(i)
867              ! Initialization of zpluie and zice:
868              zpluie=0
869              zice=0
870              IF (zneb(i).EQ.seuil_neb) THEN
871                 ztot = 0.0
872              ELSE
873                 !  quantite d'eau a eliminer: zchau
874                 !  meme chose pour la glace: zfroi
875                 if (ptconv(i,k)) then
876                    zcl   =cld_lc_con
877                    zct   =1./cld_tau_con
878                    zfroi    = dtime/REAL(ninter)/zdz(i)*zoliq(i) &
879                         *fallvc(zrhol(i)) * zfice(i)
880                 else
881                    zcl   =cld_lc_lsc
882                    zct   =1./cld_tau_lsc
883                    zfroi    = dtime/REAL(ninter)/zdz(i)*zoliq(i) &
884                         *fallvs(zrhol(i)) * zfice(i)
885                 endif
886                 zchau    = zct   *dtime/REAL(ninter) * zoliq(i) &
887                      *(1.0-EXP(-(zoliq(i)/zneb(i)/zcl   )**2)) *(1.-zfice(i))
888!AJ<
889                 IF (.NOT. ice_thermo) THEN
890                   ztot    = zchau + zfroi
891                 ELSE
892                   zpluie = MIN(MAX(zchau,0.0),zoliq(i)*(1.-zfice(i)))
893                   zice = MIN(MAX(zfroi,0.0),zoliq(i)*zfice(i))
894                   ztot    = zpluie    + zice
895                 ENDIF
896!>AJ
897                 ztot    = MAX(ztot   ,0.0)
898              ENDIF
899              ztot    = MIN(ztot,zoliq(i))
900!AJ<
901     !         zoliqp = MAX(zoliq(i)*(1.-zfice(i))-1.*zpluie   , 0.0)
902     !         zoliqi = MAX(zoliq(i)*zfice(i)-1.*zice   , 0.0)
903              zoliqp(i) = MAX(zoliq(i)*(1.-zfice(i))-1.*zpluie  , 0.0)
904              zoliqi(i) = MAX(zoliq(i)*zfice(i)-1.*zice  , 0.0)
905              zoliq(i) = MAX(zoliq(i)-ztot   , 0.0)
906!>AJ
907              radliq(i,k) = radliq(i,k) + zoliq(i)/REAL(ninter+1)
908           ENDIF
909        ENDDO
910     ENDDO
911     !
912         IF (.NOT. ice_thermo) THEN
913       DO i = 1, klon
914         IF (rneb(i,k).GT.0.0) THEN
915           d_ql(i,k) = zoliq(i)
916           zrfl(i) = zrfl(i)+ MAX(zcond(i)-zoliq(i),0.0) &
917                * (paprs(i,k)-paprs(i,k+1))/(RG*dtime)
918         ENDIF
919       ENDDO
920     ELSE
921       DO i = 1, klon
922         IF (rneb(i,k).GT.0.0) THEN
923!CR on prend en compte la phase glace
924           if (.not.ice_thermo) then
925           d_ql(i,k) = zoliq(i)
926           d_qi(i,k) = 0.
927           else
928           d_ql(i,k) = (1-zfice(i))*zoliq(i)
929           d_qi(i,k) = zfice(i)*zoliq(i)
930           endif
931!AJ<
932           zrfl(i) = zrfl(i)+ MAX(zcond(i)*(1.-zfice(i))-zoliqp(i),0.0) &
933               *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
934           zifl(i) = zifl(i)+ MAX(zcond(i)*zfice(i)-zoliqi(i),0.0) &
935                    *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
936     !      zrfl(i) = zrfl(i)+  zpluie                         &
937     !          *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
938     !      zifl(i) = zifl(i)+  zice                    &
939     !               *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)                                   
940
941!CR : on prend en compte l'effet Bergeron dans les flux de precipitation
942           if ((iflag_bergeron.eq.1).and.(zt(i).LT.273.15)) then
943              zsolid = zrfl(i)
944              zifl(i) = zifl(i)+zrfl(i)
945              zrfl(i) = 0.
946              zt(i)=zt(i)+zsolid*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
947                      *(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*zq(i))
948           endif
949!RC   
950
951         ENDIF                     
952       ENDDO
953     ENDIF
954
955!CR: la fonte est faite au debut
956!      IF (ice_thermo) THEN
957!       DO i = 1, klon
958!           zmelt = ((zt(i)-273.15)/(ztfondue-273.15))**2
959!           zmelt = MIN(MAX(zmelt,0.),1.)
960!           zrfl(i)=zrfl(i)+zmelt*zifl(i)
961!           zifl(i)=zifl(i)*(1.-zmelt)
962!           print*,zt(i),'octavio1'
963!           zt(i)=zt(i)-zifl(i)*zmelt*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
964!                      *RLMLT/RCPD/(1.0+RVTMP2*zq(i))
965!           print*,zt(i),zrfl(i),zifl(i),zmelt,'octavio2'
966!       ENDDO
967!     ENDIF
968
969       
970     IF (.NOT. ice_thermo) THEN
971       DO i = 1, klon
972         IF (zt(i).LT.RTT) THEN
973           psfl(i,k)=zrfl(i)
974         ELSE
975           prfl(i,k)=zrfl(i)
976         ENDIF
977       ENDDO
978     ELSE
979     ! JAM*************************************************
980     ! Revoir partie ci-dessous: à quoi servent psfl et prfl?
981     ! *****************************************************
982
983       DO i = 1, klon
984     !   IF (zt(i).LT.RTT) THEN
985           psfl(i,k)=zifl(i)
986     !   ELSE
987           prfl(i,k)=zrfl(i)
988     !   ENDIF
989!>AJ
990       ENDDO
991     ENDIF
992     !
993     !
994     ! Calculer les tendances de q et de t:
995     !
996     DO i = 1, klon
997        d_q(i,k) = zq(i) - q(i,k)
998        d_t(i,k) = zt(i) - t(i,k)
999     ENDDO
1000     !
1001     !AA--------------- Calcul du lessivage stratiforme  -------------
1002
1003     DO i = 1,klon
1004        !
1005        if(zcond(i).gt.zoliq(i)+1.e-10) then
1006         beta(i,k) = (zcond(i)-zoliq(i))/zcond(i)/dtime
1007        else
1008         beta(i,k) = 0.
1009        endif
1010        zprec_cond(i) = MAX(zcond(i)-zoliq(i),0.0) &
1011             * (paprs(i,k)-paprs(i,k+1))/RG
1012        IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN
1013           !AA lessivage nucleation LMD5 dans la couche elle-meme
1014          IF (iflag_t_glace.EQ.0) THEN
1015           if (t(i,k) .GE. t_glace_min_old) THEN
1016              zalpha_tr = a_tr_sca(3)
1017           else
1018              zalpha_tr = a_tr_sca(4)
1019           endif
1020          ELSE ! of IF (iflag_t_glace.EQ.0)
1021           if (t(i,k) .GE. t_glace_min) THEN
1022              zalpha_tr = a_tr_sca(3)
1023           else
1024              zalpha_tr = a_tr_sca(4)
1025           endif
1026          ENDIF
1027           zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
1028           pfrac_nucl(i,k)=pfrac_nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
1029           frac_nucl(i,k)= 1.-zneb(i)*zfrac_lessi
1030           !
1031           ! nucleation avec un facteur -1 au lieu de -0.5
1032           zfrac_lessi = 1. - EXP(-zprec_cond(i)/zneb(i))
1033           pfrac_1nucl(i,k)=pfrac_1nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
1034        ENDIF
1035        !
1036     ENDDO      ! boucle sur i
1037     !
1038     !AA Lessivage par impaction dans les couches en-dessous
1039     DO kk = k-1, 1, -1
1040        DO i = 1, klon
1041           IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN
1042             IF (iflag_t_glace.EQ.0) THEN
1043              if (t(i,kk) .GE. t_glace_min_old) THEN
1044                 zalpha_tr = a_tr_sca(1)
1045              else
1046                 zalpha_tr = a_tr_sca(2)
1047              endif
1048             ELSE ! of IF (iflag_t_glace.EQ.0)
1049              if (t(i,kk) .GE. t_glace_min) THEN
1050                 zalpha_tr = a_tr_sca(1)
1051              else
1052                 zalpha_tr = a_tr_sca(2)
1053              endif
1054             ENDIF
1055              zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
1056              pfrac_impa(i,kk)=pfrac_impa(i,kk)*(1.-zneb(i)*zfrac_lessi)
1057              frac_impa(i,kk)= 1.-zneb(i)*zfrac_lessi
1058           ENDIF
1059        ENDDO
1060     ENDDO
1061     !
1062     !AA----------------------------------------------------------
1063     !                     FIN DE BOUCLE SUR K   
1064  end DO
1065  !
1066  !AA-----------------------------------------------------------
1067  !
1068  ! Pluie ou neige au sol selon la temperature de la 1ere couche
1069  !
1070!CR: si la thermo de la glace est active, on calcule zifl directement
1071  IF (.NOT.ice_thermo) THEN
1072  DO i = 1, klon
1073     IF ((t(i,1)+d_t(i,1)) .LT. RTT) THEN
1074!AJ<
1075!        snow(i) = zrfl(i)
1076        snow(i) = zrfl(i)+zifl(i)
1077!>AJ
1078        zlh_solid(i) = RLSTT-RLVTT
1079     ELSE
1080        rain(i) = zrfl(i)
1081        zlh_solid(i) = 0.
1082     ENDIF
1083  ENDDO
1084
1085  ELSE
1086     DO i = 1, klon
1087        snow(i) = zifl(i)
1088        rain(i) = zrfl(i)
1089     ENDDO
1090   
1091   ENDIF
1092  !
1093  ! For energy conservation : when snow is present, the solification
1094  ! latent heat is considered.
1095!CR: si thermo de la glace, neige deja prise en compte
1096  IF (.not.ice_thermo) THEN
1097  DO k = 1, klev
1098     DO i = 1, klon
1099        zcpair=RCPD*(1.0+RVTMP2*(q(i,k)+d_q(i,k)))
1100        zmair=(paprs(i,k)-paprs(i,k+1))/RG
1101        zm_solid = (prfl(i,k)-prfl(i,k+1)+psfl(i,k)-psfl(i,k+1))*dtime
1102        d_t(i,k) = d_t(i,k) + zlh_solid(i) *zm_solid / (zcpair*zmair)
1103     END DO
1104  END DO
1105  ENDIF
1106  !
1107
1108  if (ncoreczq>0) then
1109     WRITE(lunout,*)'WARNING : ZQ dans fisrtilp ',ncoreczq,' val < 1.e-15.'
1110  endif
1111
1112END SUBROUTINE fisrtilp
Note: See TracBrowser for help on using the repository browser.