source: LMDZ5/trunk/libf/phylmd/fisrtilp.F90 @ 2666

Last change on this file since 2666 was 2664, checked in by fhourdin, 8 years ago

Gros bug petite modif "min" -> "max"

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