source: LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_lscp_old.F90 @ 5151

Last change on this file since 5151 was 5144, checked in by abarral, 3 months ago

Put YOMCST.h into modules

  • 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: 63.9 KB
Line 
1! $Id: lmdz_lscp_old.F90 5144 2024-07-29 21:01:04Z abarral $
2
3
4MODULE lmdz_lscp_old
5CONTAINS
6SUBROUTINE fisrtilp(klon,klev,dtime,paprs,pplay,t,q,ptconv,ratqs, &
7     d_t, d_q, d_ql, d_qi, rneb,rneblsvol,radliq, rain, snow,          &
8     pfrac_impa, pfrac_nucl, pfrac_1nucl,               &
9     frac_impa, frac_nucl, beta,                        &
10     prfl, psfl, rhcl, zqta, fraca,                     &
11     ztv, zpspsk, ztla, zthl, iflag_cld_th,             &
12     iflag_ice_thermo,                                  &
13     cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv)
14
15  USE icefrac_lsc_mod ! compute ice fraction (JBM 3/14)
16  USE lmdz_cloudth, ONLY: cloudth, cloudth_v3, cloudth_v6
17
18  USE lmdz_lscp_ini, ONLY: prt_level, lunout
19  USE lmdz_lscp_ini, ONLY: fl_cor_ebil
20  USE lmdz_lscp_ini, ONLY: iflag_t_glace,t_glace_min, t_glace_max, exposant_glace
21  USE lmdz_lscp_ini, ONLY: seuil_neb, rain_int_min, iflag_evap_prec, iflag_oldbug_fisrtilp,a_tr_sca
22  USE lmdz_lscp_ini, ONLY: iflag_cloudth_vert, iflag_rain_incloud_vol
23  USE lmdz_lscp_ini, ONLY: coef_eva, ffallv_lsc, ffallv_con
24  USE lmdz_lscp_ini, ONLY: cld_tau_lsc, cld_tau_con, cld_lc_lsc, cld_lc_con
25  USE lmdz_lscp_ini, ONLY: reevap_ice, iflag_bergeron, iflag_fisrtilp_qsat, iflag_pdf
26  USE lmdz_yoethf
27  USE lmdz_fcttre, ONLY: foeew, foede, qsats, qsatl, dqsats, dqsatl, thermcep
28  USE lmdz_yomcst
29
30  IMPLICIT NONE
31  !======================================================================
32  ! Auteur(s): Z.X. Li (LMD/CNRS)
33  ! Date: le 20 mars 1995
34  ! Objet: condensation et precipitation stratiforme.
35  !        schema de nuage
36  ! Fusion de fisrt (physique sursaturation, P. LeVan K. Laval)
37  !             et ilp (il pleut, L. Li)
38  ! Principales parties:
39  ! P0> Thermalisation des precipitations venant de la couche du dessus
40  ! P1> Evaporation de la precipitation (qui vient du niveau k+1)
41  ! P2> Formation du nuage (en k)
42  ! P2.A.0> Calcul des grandeurs nuageuses une pdf en creneau
43  ! P2.A.1> Avec les nouvelles PDFs, calcul des grandeurs nuageuses pour
44  ! les valeurs de T et Q initiales
45  ! P2.A.2> Prise en compte du couplage entre eau condensee et T.
46  ! P2.A.3> Calcul des valeures finales associees a la formation des nuages
47  ! P2.B> Nuage "tout ou rien"
48  ! P2.C> Prise en compte de la Chaleur latente apres formation nuage
49  ! P3> Formation de la precipitation (en k)
50  !======================================================================
51  ! JLD:
52  ! * Routine probablement fausse (au moins incoherente) si thermcep = .FALSE.
53  ! * fl_cor_ebil doit etre > 0 ;
54  !   fl_cor_ebil= 0 pour reproduire anciens bugs
55  !======================================================================
56
57  ! Principaux inputs:
58
59  REAL, INTENT(IN)                              :: dtime  ! intervalle du temps (s)
60  INTEGER, INTENT(IN)                           :: klon, klev
61  REAL, DIMENSION(klon,klev+1),    INTENT(IN)   :: paprs  ! pression a inter-couche
62  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: pplay  ! pression au milieu de couche
63  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: t      ! temperature (K)
64  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: q      ! humidite specifique (kg/kg)
65  LOGICAL, DIMENSION(klon,klev),   INTENT(IN)   :: ptconv ! points ou le schema de conv. prof. est actif
66  INTEGER,                         INTENT(IN)   :: iflag_cld_th
67  INTEGER,                         INTENT(IN)   :: iflag_ice_thermo
68
69  ! Inputs lies aux thermiques
70
71  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: ztv
72  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: zqta, fraca
73  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: zpspsk, ztla
74  REAL, DIMENSION(klon,klev),      INTENT(INOUT)   :: zthl
75
76  !  Input/output
77  REAL, DIMENSION(klon,klev),      INTENT(INOUT):: ratqs  ! determine la largeur de distribution de vapeur
78
79  ! Principaux outputs:
80
81  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: d_t  ! incrementation de la temperature (K)
82  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: d_q  ! incrementation de la vapeur d'eau
83  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: d_ql ! incrementation de l'eau liquide
84  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: d_qi ! incrementation de l'eau glace
85  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: rneb, rneblsvol ! fraction nuageuse
86  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: beta ! taux de conversion de l'eau cond
87  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: radliq ! eau liquide utilisee dans rayonnements
88  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: rhcl ! humidite relative en ciel clair
89  REAL, DIMENSION(klon),           INTENT(OUT)  :: rain
90  REAL, DIMENSION(klon),           INTENT(OUT)  :: snow
91  REAL, DIMENSION(klon,klev+1),    INTENT(OUT)  :: prfl
92  REAL, DIMENSION(klon,klev+1),    INTENT(OUT)  :: psfl
93
94  !AA
95  ! Coeffients de fraction lessivee : pour OFF-LINE
96
97  REAL, DIMENSION(klon,klev),      INTENT(INOUT)  :: pfrac_nucl
98  REAL, DIMENSION(klon,klev),      INTENT(INOUT)  :: pfrac_1nucl
99  REAL, DIMENSION(klon,klev),      INTENT(INOUT)  :: pfrac_impa
100
101  ! Fraction d'aerosols lessivee par impaction et par nucleation
102  ! POur ON-LINE
103
104  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: frac_impa
105  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: frac_nucl
106  REAL, DIMENSION(klon,klev), INTENT(OUT) :: cloudth_sth,cloudth_senv
107  REAL, DIMENSION(klon,klev), INTENT(OUT) :: cloudth_sigmath,cloudth_sigmaenv
108  !AA
109  ! --------------------------------------------------------------------------------
110
111  ! Options du programme:
112
113  REAL :: smallestreal
114
115  INTEGER, PARAMETER :: ninter=5 ! sous-intervals pour la precipitation
116  LOGICAL, PARAMETER :: cpartiel=.TRUE. ! condensation partielle
117  REAL, PARAMETER :: t_coup=234.0
118  REAL, PARAMETER :: DDT0=.01
119  REAL, PARAMETER :: ztfondue=278.15
120  ! --------------------------------------------------------------------------------
121
122  ! Variables locales:
123
124  INTEGER :: i, k, n, kk
125  REAL :: qsl, qsi
126  REAL :: zct      ,zcl
127  INTEGER :: ncoreczq 
128  REAL, DIMENSION(klon,klev) :: ctot,ctot_vol
129  REAL, DIMENSION(klon) :: zqs, zdqs, zdqsdT_raw, Tbef,qlbef,DT
130  REAL :: zdelta, zcor, zcvm5 
131  REAL ::num,denom
132
133  LOGICAL, DIMENSION(klon) :: lognormale,convergence
134  LOGICAL :: ice_thermo
135  INTEGER, DIMENSION(klon) :: n_i
136  INTEGER :: iter
137  REAL :: cste
138
139  REAL, DIMENSION(klon) :: zpdf_sig,zpdf_k,zpdf_delta, Zpdf_a,zpdf_b,zpdf_e1,zpdf_e2, qcloud
140  REAL :: erf   
141 
142  REAL :: zqev, zqevt, zqev0,zqevi, zqevti, zdelq
143  REAL, DIMENSION(klon) :: zrfl(klon), zrfln(klon), zrflclr(klon), zrflcld(klon), d_zrfl_clr_cld(klon), d_zifl_clr_cld(klon), d_zrfl_cld_clr(klon), d_zifl_cld_clr(klon)
144
145  REAL, DIMENSION(klon) :: zifl, zifln, ziflclr, ziflcld, zoliq, zcond, zq, zqn, zoliqp, zoliqi, zt
146! JBM (3/14) nexpo is replaced by exposant_glace
147! REAL nexpo ! exponentiel pour glace/eau
148! INTEGER, PARAMETER :: nexpo=6
149  INTEGER :: exposant_glace_old
150  REAL :: t_glace_min_old, ztot
151  REAL, DIMENSION(klon) ::  zdz,zrho , zrhol, zfice,zneb,znebprecip
152  REAL :: zchau      ,zfroi     
153  REAL, DIMENSION(klon) :: znebprecipclr, znebprecipcld, tot_zneb, tot_znebn, d_tot_zneb, d_znebprecip_clr_cld, d_znebprecip_cld_clr, dzfice
154  REAL :: zmelt, zpluie, zice
155  REAL :: zsolid
156!!!!
157!  Variables pour Bergeron
158  REAL :: zcp, coef1, DeltaT, Deltaq, Deltaqprecl
159  REAL, DIMENSION(klon) :: zqpreci, zqprecl
160! Variable pour conservation enegie des precipitations
161  REAL, DIMENSION(klon) :: zmqc
162
163  LOGICAL, SAVE :: appel1er=.TRUE.
164  !$OMP THREADPRIVATE(appel1er)
165
166! iflag_oldbug_fisrtilp=0 enleve le BUG par JYG : tglace_min -> tglace_max
167! iflag_oldbug_fisrtilp=1 ajoute le BUG
168  !---------------------------------------------------------------
169
170  ! Fonctions en ligne:
171
172  REAL ::  fallvs,fallvc, zzz ! Vitesse de chute pour cristaux de glace
173                     ! (Heymsfield & Donner, 1990)
174  fallvc (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_con
175  fallvs (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_lsc
176
177  !---------------------------------------------------------------
178  !AA Variables traceurs:
179  !AA  Provisoire !!! Parametres alpha du lessivage
180  !AA  A priori on a 4 scavenging # possibles
181
182  ! Variables intermediaires
183
184  REAL :: zalpha_tr, zfrac_lessi
185  REAL, DIMENSION(klon) :: zprec_cond
186  !AA
187! RomP >>> 15 nov 2012
188! RomP <<<
189  REAL, DIMENSION(klon) :: zmair
190  REAL :: zcpair, zcpeau
191  !     Pour la conversion eau-neige
192  REAL, DIMENSION(klon) :: zlh_solid
193  REAL :: zm_solid
194
195  !ym
196!CR: pour iflag_ice_thermo=2, on active que la convection
197!  ice_thermo = iflag_ice_thermo .GE. 1
198
199 
200  znebprecip(:)=0.
201
202!<LTP
203  smallestreal=1.e-9
204  znebprecipclr(:)=0.
205  znebprecipcld(:)=0.
206!>LTP
207
208  ice_thermo = (iflag_ice_thermo == 1).OR.(iflag_ice_thermo >= 3)
209  zdelq=0.0
210  ctot_vol(1:klon,1:klev)=0.0
211  rneblsvol(1:klon,1:klev)=0.0
212
213  IF (prt_level>9)WRITE(lunout,*)'NUAGES4 A. JAM'
214  IF (appel1er) THEN
215     WRITE(lunout,*) 'fisrtilp, ninter:', ninter
216     WRITE(lunout,*) 'fisrtilp, cpartiel:', cpartiel
217     WRITE(lunout,*) 'FISRTILP VERSION LUDO'
218     
219     IF (ABS(dtime/REAL(ninter)-360.0)>0.001) THEN
220        WRITE(lunout,*) 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime
221        WRITE(lunout,*) 'Je prefere un sous-intervalle de 6 minutes'
222        !         CALL abort
223     ENDIF
224     appel1er = .FALSE.
225
226     !cdir collapse
227     DO k = 1, klev
228        DO i = 1, klon
229           pfrac_nucl(i,k)=1.
230           pfrac_1nucl(i,k)=1.
231           pfrac_impa(i,k)=1.
232           beta(i,k)=0.  !RomP initialisation
233        ENDDO
234     ENDDO
235
236  ENDIF          !  test sur appel1er
237
238  !MAf Initialisation a 0 de zoliq
239  !      DO i = 1, klon
240  !         zoliq(i)=0.
241  !      ENDDO
242  ! Determiner les nuages froids par leur temperature
243  !  nexpo regle la raideur de la transition eau liquide / eau glace.
244
245!CR: on est oblige de definir des valeurs fisrt car les valeurs de newmicro ne sont pas les memes par defaut
246  IF (iflag_t_glace==0) THEN
247!   ztglace = RTT - 15.0
248    t_glace_min_old = RTT - 15.0
249    !AJ<
250    IF (ice_thermo) THEN
251!     nexpo = 2
252      exposant_glace_old = 2
253    ELSE
254!     nexpo = 6
255      exposant_glace_old = 6
256    ENDIF
257   
258  ENDIF
259 
260!!  RLVTT = 2.501e6 ! pas de redefinition des constantes physiques (jyg)
261!!  RLSTT = 2.834e6 ! pas de redefinition des constantes physiques (jyg)
262!>AJ
263  !cc      nexpo = 1
264
265  ! Initialiser les sorties:
266
267  !cdir collapse
268  DO k = 1, klev+1
269     DO i = 1, klon
270        prfl(i,k) = 0.0
271        psfl(i,k) = 0.0
272     ENDDO
273  ENDDO
274
275  !cdir collapse
276
277  DO k = 1, klev
278     DO i = 1, klon
279        d_t(i,k) = 0.0
280        d_q(i,k) = 0.0
281        d_ql(i,k) = 0.0
282        d_qi(i,k) = 0.0
283        rneb(i,k) = 0.0
284        radliq(i,k) = 0.0
285        frac_nucl(i,k) = 1.
286        frac_impa(i,k) = 1.
287     ENDDO
288  ENDDO
289  DO i = 1, klon
290     rain(i) = 0.0
291     snow(i) = 0.0
292     zoliq(i)=0.
293     !     ENDDO
294
295     ! Initialiser le flux de precipitation a zero
296
297     !     DO i = 1, klon
298     zrfl(i) = 0.0
299     zifl(i) = 0.0
300!<LTP
301     zrflclr(i) = 0.0
302     ziflclr(i) = 0.0
303     zrflcld(i) = 0.0
304     ziflcld(i) = 0.0
305     tot_zneb(i) = 0.0
306     tot_znebn(i) = 0.0
307     d_tot_zneb(i) = 0.0
308!>LTP
309
310     zneb(i) = seuil_neb
311  ENDDO
312
313
314  !AA Pour plus de securite
315
316  zalpha_tr   = 0.
317  zfrac_lessi = 0.
318
319  !AA==================================================================
320
321  ncoreczq=0
322  ! BOUCLE VERTICALE (DU HAUT VERS LE BAS)
323
324  DO k = klev, 1, -1
325
326     !AA===============================================================
327
328     ! Initialisation temperature et vapeur
329     DO i = 1, klon
330        zt(i)=t(i,k)
331        zq(i)=q(i,k)
332     ENDDO
333
334     ! ----------------------------------------------------------------
335     ! P0> Thermalisation des precipitations venant de la couche du dessus
336     ! ----------------------------------------------------------------
337     ! Calculer la varition de temp. de l'air du a la chaleur sensible
338     ! transporter par la pluie. On thermalise la pluie avec l'air de la couche.
339     ! Cette quantite de pluie qui est thermalisee, et devra continue a l'etre lors
340     ! des differentes transformations thermodynamiques. Cette masse d'eau doit
341     ! donc etre ajoute a l'humidite de la couche lorsque l'on calcule la variation
342     ! de l'enthalpie  de la couche avec la temperature
343     ! Variables calculees ou modifiees:
344     !   -  zt: temperature de la cocuhe
345     !   - zmqc: masse de precip qui doit etre thermalisee
346
347     IF(k<=klev-1) THEN
348        DO i = 1, klon
349           !IM
350           zmair(i)=(paprs(i,k)-paprs(i,k+1))/RG
351           ! il n'y a pas encore d'eau liquide ni glace dans la maiille, donc zq suffit
352           zcpair=RCPD*(1.0+RVTMP2*zq(i))
353           zcpeau=RCPD*RVTMP2
354         IF (fl_cor_ebil > 0) THEN
355           ! zmqc: masse de precip qui doit etre thermalisee avec l'air de la couche atm
356           ! pour s'assurer que la precip arrivant au sol aura bien la temperature de la
357           ! derniere couche
358           zmqc(i) = (zrfl(i)+zifl(i))*dtime/zmair(i)
359           ! t(i,k+1)+d_t(i,k+1): nouvelle temp de la couche au dessus
360           zt(i) = ( (t(i,k+1)+d_t(i,k+1))*zmqc(i)*zcpeau + zcpair*zt(i) ) &
361                 / (zcpair + zmqc(i)*zcpeau)
362         else ! si on maintient les anciennes erreurs
363           zt(i) = ( (t(i,k+1)+d_t(i,k+1))*zrfl(i)*dtime*zcpeau &
364                + zmair(i)*zcpair*zt(i) ) &
365                / (zmair(i)*zcpair + zrfl(i)*dtime*zcpeau)
366         end if
367        ENDDO
368     ELSE  ! IF(k.LE.klev-1)
369        DO i = 1, klon
370           zmair(i)=(paprs(i,k)-paprs(i,k+1))/RG
371           zmqc(i) = 0.
372        ENDDO
373     ENDIF ! end IF(k.LE.klev-1)
374
375     ! ----------------------------------------------------------------
376     ! P1> Calcul de l'evaporation de la precipitation
377     ! ----------------------------------------------------------------
378     ! On evapore une partie des precipitations venant de la maille du dessus.
379     ! On calcule l'evaporation et la sublimation des precipitations, jusqu'a
380     ! ce que la fraction de cette couche qui est sous le nuage soit saturee.
381     ! Variables calculees ou modifiees:
382     !   - zrfl et zifl: flux de precip liquide et glace
383     !   - zq, zt: humidite et temperature de la cocuhe
384     !   - zmqc: masse de precip qui doit etre thermalisee
385
386     IF (iflag_evap_prec>=1) THEN
387        DO i = 1, klon
388!          S'il y a des precipitations
389           IF (zrfl(i)+zifl(i)>0.) THEN
390              ! Calcul du qsat
391              IF (thermcep) THEN
392                 zdelta=MAX(0.,SIGN(1.,RTT-zt(i)))
393                 zqs(i)= R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
394                 zqs(i)=MIN(0.5,zqs(i))
395                 zcor=1./(1.-RETV*zqs(i))
396                 zqs(i)=zqs(i)*zcor
397              ELSE
398                 IF (zt(i) < t_coup) THEN
399                    zqs(i) = qsats(zt(i)) / pplay(i,k)
400                 ELSE
401                    zqs(i) = qsatl(zt(i)) / pplay(i,k)
402                 ENDIF
403              ENDIF
404           ENDIF ! (zrfl(i)+zifl(i).GT.0.)
405        ENDDO
406!AJ<
407
408       IF (.NOT. ice_thermo) THEN
409        DO i = 1, klon
410!          S'il y a des precipitations
411           IF (zrfl(i)+zifl(i)>0.) THEN
412                ! Evap max pour ne pas saturer la fraction sous le nuage
413                ! Evap max jusqu'à atteindre la saturation dans la partie
414                ! de la maille qui est sous le nuage de la couche du dessus
415                !!! On ne tient compte de cette fraction que sous une seule
416                !!! couche sous le nuage
417                zqev = MAX (0.0, (zqs(i)-zq(i))*zneb(i) )
418             ! Ajout de la prise en compte des precip a thermiser
419             ! avec petite reecriture
420             IF  (fl_cor_ebil > 0) then ! nouveau
421                ! Calcul de l'evaporation du flux de precip herite
422                !   d'au-dessus
423                zqevt = coef_eva * (1.0-zq(i)/zqs(i)) * SQRT(zrfl(i)) &
424                     * zmair(i)/pplay(i,k)*zt(i)*RD
425                zqevt = MAX(0.0,MIN(zqevt,zrfl(i))) * dtime/zmair(i)
426
427                ! Seuil pour ne pas saturer la fraction sous le nuage
428                zqev = MIN (zqev, zqevt)
429                ! Nouveau flux de precip
430                zrfln(i) = zrfl(i) - zqev*zmair(i)/dtime
431                ! Aucun flux liquide pour T < t_coup, on reevapore tout.
432                IF (zt(i) < t_coup.AND.reevap_ice) THEN
433                  zrfln(i)=0.
434                  zqev = (zrfl(i)-zrfln(i))/zmair(i)*dtime
435                END IF
436                ! Nouvelle vapeur
437                zq(i) = zq(i) + zqev
438                zmqc(i) = zmqc(i)-zqev
439                ! Nouvelle temperature (chaleur latente)
440                zt(i) = zt(i) - zqev &
441                     * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))
442!!JLD debut de partie a supprimer a terme
443            else ! if  (fl_cor_ebil .GT. 0)
444                ! Calcul de l'evaporation du flux de precip herite
445                !   d'au-dessus
446                zqevt = coef_eva * (1.0-zq(i)/zqs(i)) * SQRT(zrfl(i)) &
447                     * (paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
448                zqevt = MAX(0.0,MIN(zqevt,zrfl(i))) &
449                     * RG*dtime/(paprs(i,k)-paprs(i,k+1))
450                ! Seuil pour ne pas saturer la fraction sous le nuage
451                zqev = MIN (zqev, zqevt)
452                ! Nouveau flux de precip
453                zrfln(i) = zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1)) &
454                     /RG/dtime
455                ! Aucun flux liquide pour T < t_coup
456                IF (zt(i) < t_coup.AND.reevap_ice) zrfln(i)=0.
457                ! Nouvelle vapeur
458                zq(i) = zq(i) - (zrfln(i)-zrfl(i)) &
459                     * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
460                ! Nouvelle temperature (chaleur latente)
461                zt(i) = zt(i) + (zrfln(i)-zrfl(i)) &
462                     * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
463                     * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
464              end if ! if  (fl_cor_ebil .GT. 0)
465!!JLD fin de partie a supprimer a terme
466                zrfl(i) = zrfln(i)
467                zifl(i) = 0.
468           ENDIF ! (zrfl(i)+zifl(i).GT.0.)
469        ENDDO
470
471       ELSE ! (.NOT. ice_thermo)
472!      ================================
473!      Avec thermodynamique de la glace
474!      ================================
475        DO i = 1, klon
476
477
478!AJ<
479!        S'il y a des precipitations
480         IF (zrfl(i)+zifl(i)>0.) THEN
481
482        !LTP<
483        !On ne tient compte que du flux de précipitation en ciel clair dans le calcul de l'évaporation.
484                IF (iflag_evap_prec==4) THEN
485                        zrfl(i) = zrflclr(i)
486                        zifl(i) = ziflclr(i)
487                ENDIF
488       
489        !>LTP
490
491         IF (iflag_evap_prec==1) THEN
492            znebprecip(i)=zneb(i)
493         ELSE
494            znebprecip(i)=MAX(zneb(i),znebprecip(i))
495         ENDIF
496         
497         IF (iflag_evap_prec==4) THEN
498        ! Evap max pour ne pas saturer toute la maille
499         zqev0 = MAX (0.0, zqs(i)-zq(i))
500         ELSE
501        ! Evap max pour ne pas saturer la fraction sous le nuage
502         zqev0 = MAX (0.0, (zqs(i)-zq(i))*znebprecip(i) )
503         ENDIF
504
505         !JAM
506         ! On differencie qsat pour l'eau et la glace
507         ! Si zdelta=1. --> glace
508         ! Si zdelta=0. --> eau liquide
509       
510         ! Calcul du qsat par rapport a l'eau liquide
511         qsl= R2ES*FOEEW(zt(i),0.)/pplay(i,k)
512         qsl= MIN(0.5,qsl)
513         zcor= 1./(1.-RETV*qsl)
514         qsl= qsl*zcor
515         
516         ! Calcul de l'evaporation du flux de precip venant du dessus
517         ! Formulation en racine du flux de precip
518         ! (Klemp & Wilhelmson, 1978; Sundqvist, 1988)
519         IF (iflag_evap_prec==3) THEN
520         zqevt = znebprecip(i)*coef_eva*(1.0-zq(i)/qsl) &
521              *SQRT(zrfl(i)/max(1.e-4,znebprecip(i))) &
522              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
523!<LTP
524         ELSE IF (iflag_evap_prec==4) THEN
525         zqevt = znebprecipclr(i)*coef_eva*(1.0-zq(i)/qsl) &
526              *SQRT(zrfl(i)/max(1.e-8,znebprecipclr(i))) &
527              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
528!>LTP
529        ELSE
530         zqevt = 1.*coef_eva*(1.0-zq(i)/qsl)*SQRT(zrfl(i)) &
531              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
532         ENDIF
533
534
535         zqevt = MAX(0.0,MIN(zqevt,zrfl(i))) &
536              *RG*dtime/(paprs(i,k)-paprs(i,k+1))
537         
538         ! Calcul du qsat par rapport a la glace
539         qsi= R2ES*FOEEW(zt(i),1.)/pplay(i,k)
540         qsi= MIN(0.5,qsi)
541         zcor= 1./(1.-RETV*qsi)
542         qsi= qsi*zcor
543
544         ! Calcul de la sublimation du flux de precip solide herite
545         !   d'au-dessus
546         IF (iflag_evap_prec==3) THEN
547         zqevti = znebprecip(i)*coef_eva*(1.0-zq(i)/qsi) &
548              *SQRT(zifl(i)/max(1.e-4,znebprecip(i))) &
549              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
550!<LTP
551         ELSE IF (iflag_evap_prec==4) THEN
552         zqevti = znebprecipclr(i)*coef_eva*(1.0-zq(i)/qsi) &
553              *SQRT(zifl(i)/max(1.e-8,znebprecipclr(i))) &
554              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
555!>LTP
556         ELSE
557         zqevti = 1.*coef_eva*(1.0-zq(i)/qsi)*SQRT(zifl(i)) &
558              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
559         ENDIF
560         zqevti = MAX(0.0,MIN(zqevti,zifl(i))) &
561              *RG*dtime/(paprs(i,k)-paprs(i,k+1))   
562
563       
564        !JAM
565        ! Limitation de l'evaporation. On s'assure qu'on ne sature pas
566        ! la fraction de la couche sous le nuage sinon on repartit zqev0
567        ! en conservant la proportion liquide / glace
568     
569         IF (zqevt+zqevti>zqev0) THEN
570            zqev=zqev0*zqevt/(zqevt+zqevti)
571            zqevi=zqev0*zqevti/(zqevt+zqevti)
572         ELSE
573!JLD je ne comprends pas les lignes ci-dessous. On repartit les precips
574!       liquides et solides meme si on ne sature pas la couche.
575!       A mon avis, le test est inutile, et il faudrait tout remplacer par:
576!            zqev=zqevt
577!            zqevi=zqevti
578             IF (zqevt+zqevti>0.) THEN
579                zqev=MIN(zqev0*zqevt/(zqevt+zqevti),zqevt)
580                zqevi=MIN(zqev0*zqevti/(zqevt+zqevti),zqevti)
581             ELSE
582             zqev=0.
583             zqevi=0.
584             ENDIF
585         ENDIF
586
587         ! Nouveaux flux de precip liquide et solide
588         zrfln(i) = Max(0.,zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1)) &
589                                 /RG/dtime)
590         zifln(i) = Max(0.,zifl(i) - zqevi*(paprs(i,k)-paprs(i,k+1)) &
591                                 /RG/dtime)
592
593         ! Mise a jour de la vapeur, temperature et flux de precip
594         zq(i) = zq(i) - (zrfln(i)+zifln(i)-zrfl(i)-zifl(i)) &
595                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
596       IF (fl_cor_ebil > 0) then ! avec correction thermalisation des precips
597         zmqc(i) = zmqc(i) + (zrfln(i)+zifln(i)-zrfl(i)-zifl(i)) &
598                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
599         zt(i) = zt(i) + (zrfln(i)-zrfl(i)) &
600                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
601                  * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i))) &
602                  + (zifln(i)-zifl(i)) &
603                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
604                  * RLSTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))
605       else ! sans correction thermalisation des precips
606         zt(i) = zt(i) + (zrfln(i)-zrfl(i)) &
607                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
608                  * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) &
609                  + (zifln(i)-zifl(i)) &
610                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
611                  * RLSTT/RCPD/(1.0+RVTMP2*zq(i))
612       end if
613        ! Nouvelles vaeleurs des precips liquides et solides
614         zrfl(i) = zrfln(i)
615         zifl(i) = zifln(i)
616
617!<LTP
618        IF (iflag_evap_prec==4) THEN
619                zrflclr(i) = zrfl(i)
620                ziflclr(i) = zifl(i)   
621                IF(zrflclr(i) + ziflclr(i) <= 0) THEN
622                        znebprecipclr(i) = 0.
623                ENDIF   
624                zrfl(i) = zrflclr(i) + zrflcld(i)
625                zifl(i) = ziflclr(i) + ziflcld(i)
626        ENDIF
627!>LTP       
628
629
630!CR ATTENTION: deplacement de la fonte de la glace
631!jyg : Bug !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! jyg
632!!!        zmelt = ((zt(i)-273.15)/(ztfondue-273.15))**2  !!!!!!!!! jyg
633!jyg : Bug !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! jyg
634           zmelt = ((zt(i)-273.15)/(ztfondue-273.15))             ! jyg
635           ! fraction de la precip solide qui est fondue
636           zmelt = MIN(MAX(zmelt,0.),1.)
637           ! Fusion de la glace
638!<LTP
639           IF (iflag_evap_prec==4) THEN
640                   zrflclr(i)=zrflclr(i)+zmelt*ziflclr(i)
641                   zrflcld(i)=zrflcld(i)+zmelt*ziflcld(i)
642                   zrfl(i)=zrflclr(i)+zrflcld(i)
643!>LTP       
644           ELSE
645                   zrfl(i)=zrfl(i)+zmelt*zifl(i)
646           ENDIF
647           IF (fl_cor_ebil <= 0) THEN
648             ! the following line should not be here. Indeed, if zifl is modified
649             ! now, zifl(i)*zmelt is no more the amount of ice that has melt
650             ! and therefore the change in temperature computed below is wrong
651             zifl(i)=zifl(i)*(1.-zmelt)
652           end if
653           ! Chaleur latente de fusion
654        IF (fl_cor_ebil > 0) then ! avec correction thermalisation des precips
655           zt(i)=zt(i)-zifl(i)*zmelt*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
656                      *RLMLT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))
657        else ! sans correction thermalisation des precips
658           zt(i)=zt(i)-zifl(i)*zmelt*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
659                      *RLMLT/RCPD/(1.0+RVTMP2*zq(i))
660        end if
661           IF (fl_cor_ebil > 0) then ! correction bug, deplacement ligne precedente
662!<LTP
663             IF (iflag_evap_prec==4) THEN
664                   ziflclr(i)=ziflclr(i)*(1.-zmelt)
665                   ziflcld(i)=ziflcld(i)*(1.-zmelt)
666                   zifl(i)=ziflclr(i)+ziflcld(i)
667!>LTP       
668             ELSE
669                   zifl(i)=zifl(i)*(1.-zmelt)
670             ENDIF
671           end if
672
673           ELSE
674              ! Si on n'a plus de pluies, on reinitialise a 0 la farcion
675              ! sous nuageuse utilisee pour la pluie.
676              znebprecip(i)=0.
677           ENDIF ! (zrfl(i)+zifl(i).GT.0.)
678        ENDDO
679
680      ENDIF ! (.NOT. ice_thermo)
681     
682     ! ----------------------------------------------------------------
683     ! Fin evaporation de la precipitation
684     ! ----------------------------------------------------------------
685     ENDIF ! (iflag_evap_prec>=1)
686
687     ! Calculer Qs et L/Cp*dQs/dT:
688
689     IF (thermcep) THEN
690        DO i = 1, klon
691           zdelta = MAX(0.,SIGN(1.,RTT-zt(i)))
692           zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
693       IF  (fl_cor_ebil > 0) then ! nouveau
694           zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))
695       else   
696           zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))
697       endif
698           zqs(i) = R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
699           zqs(i) = MIN(0.5,zqs(i))
700           zcor = 1./(1.-RETV*zqs(i))
701           zqs(i) = zqs(i)*zcor
702           zdqs(i) = FOEDE(zt(i),zdelta,zcvm5,zqs(i),zcor)
703           zdqsdT_raw(i) = zdqs(i)*  &
704           RCPD*(1.0+RVTMP2*zq(i)) / (RLVTT*(1.-zdelta) + RLSTT*zdelta)
705        ENDDO
706     ELSE
707        DO i = 1, klon
708           IF (zt(i)<t_coup) THEN
709              zqs(i) = qsats(zt(i))/pplay(i,k)
710              zdqs(i) = dqsats(zt(i),zqs(i))
711           ELSE
712              zqs(i) = qsatl(zt(i))/pplay(i,k)
713              zdqs(i) = dqsatl(zt(i),zqs(i))
714           ENDIF
715        ENDDO
716     ENDIF
717
718     ! Determiner la condensation partielle et calculer la quantite
719     ! de l'eau condensee:
720
721!verification de la valeur de iflag_fisrtilp_qsat pour iflag_ice_thermo=1
722!       if ((iflag_ice_thermo.EQ.1).AND.(iflag_fisrtilp_qsat.NE.0)) THEN
723!         WRITE(*,*) " iflag_ice_thermo==1 requires iflag_fisrtilp_qsat==0", &
724!        " but iflag_fisrtilp_qsat=",iflag_fisrtilp_qsat, ". Might as well stop here."
725!         stop
726!       endif
727
728     ! ----------------------------------------------------------------
729     ! P2> Formation du nuage
730     ! ----------------------------------------------------------------
731     ! Variables calculees:
732     !   rneb  : fraction nuageuse
733     !   zcond : eau condensee moyenne dans la maille.
734     !   rhcl: humidite relative ciel-clair
735     !   zt : temperature de la maille
736     ! ----------------------------------------------------------------
737
738     IF (cpartiel) THEN
739        ! -------------------------
740        ! P2.A> Nuage fractionnaire
741        ! -------------------------
742
743        !   Calcul de l'eau condensee et de la fraction nuageuse et de l'eau
744        !   nuageuse a partir des PDF de Sandrine Bony.
745        !   rneb  : fraction nuageuse
746        !   zqn   : eau totale dans le nuage
747        !   zcond : eau condensee moyenne dans la maille.
748        !  on prend en compte le réchauffement qui diminue la partie
749        ! condensee
750
751        !   Version avec les raqts
752
753        ! ----------------------------------------------------------------
754        ! P2.A.0> Calcul des grandeurs nuageuses une pdf en creneau
755        ! ----------------------------------------------------------------
756        IF (iflag_pdf==0) THEN
757           ! version creneau de (Li, 1998)
758           do i=1,klon
759              zdelq = min(ratqs(i,k),0.99) * zq(i)
760              rneb(i,k) = (zq(i)+zdelq-zqs(i)) / (2.0*zdelq)
761              zqn(i) = (zq(i)+zdelq+zqs(i))/2.0
762           enddo
763
764        else !  if (iflag_pdf.EQ.0)
765           ! ----------------------------------------------------------------
766           ! P2.A.1> Avec les nouvelles PDFs, calcul des grandeurs nuageuses pour
767           ! les valeurs de T et Q initiales
768           ! ----------------------------------------------------------------
769           do i=1,klon
770              IF(zq(i)<1.e-15) THEN
771                 ncoreczq=ncoreczq+1
772                 zq(i)=1.e-15
773              endif
774           enddo
775
776           IF (iflag_cld_th>=5) THEN
777              IF (iflag_cloudth_vert<=2) THEN
778               CALL cloudth(klon,klev,k,ztv, &
779                   zq,zqta,fraca, &
780                   qcloud,ctot,zpspsk,paprs,pplay,ztla,zthl, &
781                   ratqs,zqs,t, &
782                   cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv)
783
784              elseif (iflag_cloudth_vert>=3 .AND. iflag_cloudth_vert<=5) THEN
785               CALL cloudth_v3(klon,klev,k,ztv, &
786                   zq,zqta,fraca, &
787                   qcloud,ctot,ctot_vol,zpspsk,paprs,pplay,ztla,zthl, &
788                   ratqs,zqs,t, &
789                   cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv)
790              !----------------------------------
791              !Version these Jean Jouhaud, Decembre 2018
792              !----------------------------------             
793              elseif (iflag_cloudth_vert==6) THEN
794               CALL cloudth_v6(klon,klev,k,ztv, &
795                   zq,zqta,fraca, &
796                   qcloud,ctot,ctot_vol,zpspsk,paprs,pplay,ztla,zthl, &
797                   ratqs,zqs,t, &
798                   cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv)
799
800              endif
801              do i=1,klon
802                 rneb(i,k)=ctot(i,k)
803                 rneblsvol(i,k)=ctot_vol(i,k)
804                 zqn(i)=qcloud(i)
805              enddo
806
807           endif
808
809           IF (iflag_cld_th <= 4) THEN
810              lognormale = .TRUE.
811           elseif (iflag_cld_th >= 6) THEN
812              ! lognormale en l'absence des thermiques
813              lognormale = fraca(:,k) < 1e-10
814           else
815              ! Dans le cas iflag_cld_th=5, on prend systématiquement la
816              ! bi-gaussienne
817              lognormale = .FALSE.
818           end if
819
820!CR: variation de qsat avec T en presence de glace ou non
821!initialisations
822           do i=1,klon
823              DT(i) = 0.
824              n_i(i)=0
825              Tbef(i)=zt(i)
826              qlbef(i)=0.
827           enddo
828
829        ! ----------------------------------------------------------------
830        ! P2.A.2> Prise en compte du couplage entre eau condensee et T.
831        ! Calcul des grandeurs nuageuses en tenant compte de l'effet de
832        ! la condensation sur T, et donc sur qsat et sur les grandeurs nuageuses
833        ! qui en dependent. Ce changement de temperature est provisoire, et
834        ! la valeur definitive sera calcule plus tard.
835        ! Variables calculees:
836        !   rneb : nebulosite
837        !   zcond: eau condensee en moyenne dans la maille
838        ! note JLD: si on n'a pas de pdf lognormale, ce qui se passe ne me semble
839        ! pas clair, il n'y a probablement pas de prise en compte de l'effet de
840        ! T sur qsat
841        ! ----------------------------------------------------------------
842
843!Boucle iterative: ATTENTION, l'option -1 n'est plus activable ici
844           IF (iflag_fisrtilp_qsat>=0) THEN
845             ! Iteration pour condensation avec variation de qsat(T)
846             ! -----------------------------------------------------
847             do iter=1,iflag_fisrtilp_qsat+1
848               
849               do i=1,klon
850!                 do while ((abs(DT(i)).gt.DDT0).OR.(n_i(i).EQ.0))
851                 ! !! convergence = .TRUE. tant que l'on n'a pas converge !!
852                 ! ------------------------------
853                 convergence(i)=abs(DT(i))>DDT0
854                 IF ((convergence(i).OR.(n_i(i)==0)).AND.lognormale(i)) THEN
855                 ! si on n'a pas converge
856
857                 ! P2.A.2.1> Calcul de la fraction nuageuse et de la quantite d'eau condensee
858                 ! ---------------------------------------------------------------
859                 ! Variables calculees:
860                 ! rneb : nebulosite
861                 ! zqn : eau condensee, dans le nuage (in cloud water content)
862                 ! zcond: eau condensee en moyenne dans la maille
863                 ! rhcl: humidite relative ciel-clair
864
865                 Tbef(i)=Tbef(i)+DT(i) ! nouvelle temperature
866                 IF (.NOT.ice_thermo) THEN
867                    zdelta = MAX(0.,SIGN(1.,RTT-Tbef(i)))
868                 else
869                    IF (iflag_t_glace==0) THEN
870                    zdelta = MAX(0.,SIGN(1.,t_glace_min_old-Tbef(i)))
871                    ELSE IF (iflag_t_glace>=1) THEN
872                       IF (iflag_oldbug_fisrtilp==0) THEN
873                          zdelta = MAX(0.,SIGN(1.,t_glace_max-Tbef(i)))
874                       else
875                          !avec bug : zdelta = MAX(0.,SIGN(1.,t_glace_min-Tbef(i)))
876                          zdelta = MAX(0.,SIGN(1.,t_glace_min-Tbef(i)))
877                       endif
878                    endif
879                 endif
880                 ! Calcul de rneb, qzn et zcond pour les PDF lognormales
881                 zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
882               IF (fl_cor_ebil > 0) THEN
883                 zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))
884               else
885                 zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))
886               end if
887                 zqs(i) = R2ES*FOEEW(Tbef(i),zdelta)/pplay(i,k)
888                 zqs(i) = MIN(0.5,zqs(i))
889                 zcor = 1./(1.-RETV*zqs(i))
890                 zqs(i) = zqs(i)*zcor
891                 zdqs(i) = FOEDE(Tbef(i),zdelta,zcvm5,zqs(i),zcor)
892                 zpdf_sig(i)=ratqs(i,k)*zq(i)
893                 zpdf_k(i)=-sqrt(log(1.+(zpdf_sig(i)/zq(i))**2))
894                 zpdf_delta(i)=log(zq(i)/zqs(i))
895                 zpdf_a(i)=zpdf_delta(i)/(zpdf_k(i)*sqrt(2.))
896                 zpdf_b(i)=zpdf_k(i)/(2.*sqrt(2.))
897                 zpdf_e1(i)=zpdf_a(i)-zpdf_b(i)
898                 zpdf_e1(i)=sign(min(abs(zpdf_e1(i)),5.),zpdf_e1(i))
899                 zpdf_e1(i)=1.-erf(zpdf_e1(i))
900                 zpdf_e2(i)=zpdf_a(i)+zpdf_b(i)
901                 zpdf_e2(i)=sign(min(abs(zpdf_e2(i)),5.),zpdf_e2(i))
902                 zpdf_e2(i)=1.-erf(zpdf_e2(i))
903             
904                 IF (zpdf_e1(i)<1.e-10) THEN
905                    rneb(i,k)=0.
906                    zqn(i)=zqs(i)
907                 else
908                    rneb(i,k)=0.5*zpdf_e1(i)
909                    zqn(i)=zq(i)*zpdf_e2(i)/zpdf_e1(i)
910                 endif
911
912                 ! If vertical heterogeneity, change fraction by volume as well
913                 IF (iflag_cloudth_vert>=3) THEN
914                   ctot_vol(i,k)=rneb(i,k)
915                   rneblsvol(i,k)=ctot_vol(i,k)
916                 endif
917
918                 endif !convergence
919
920               enddo ! boucle en i
921
922                 ! P2.A.2.2> Calcul APPROCHE de la variation de temperature DT
923                 !         due a la condensation.
924                 ! ---------------------------------------------------------------
925                 ! Variables calculees:
926                 ! DT : variation de temperature due a la condensation
927
928                 IF (.NOT. ice_thermo) THEN
929                 ! --------------------------
930                 do i=1,klon
931                 IF ((convergence(i).OR.(n_i(i)==0)).AND.lognormale(i)) THEN
932                 qlbef(i)=max(0.,zqn(i)-zqs(i))
933               IF (fl_cor_ebil > 0) THEN
934                 num=-Tbef(i)+zt(i)+rneb(i,k)*RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))*qlbef(i)
935               else
936                 num=-Tbef(i)+zt(i)+rneb(i,k)*RLVTT/RCPD/(1.0+RVTMP2*zq(i))*qlbef(i)
937               end if
938                 denom=1.+rneb(i,k)*zdqs(i)
939                 DT(i)=num/denom
940                 n_i(i)=n_i(i)+1
941                 endif
942                 enddo
943
944                 else ! if (.NOT. ice_thermo)
945                 ! --------------------------
946                 IF (iflag_t_glace>=1) THEN
947                 CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
948                 endif
949
950                 do i=1,klon
951                 IF ((convergence(i).OR.(n_i(i)==0)).AND.lognormale(i)) THEN
952                 IF (iflag_t_glace==0) THEN
953                    zfice(i) = 1.0 - (Tbef(i)-t_glace_min_old) / (RTT-t_glace_min_old)
954                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
955                    zfice(i) = zfice(i)**exposant_glace_old
956                    dzfice(i)= exposant_glace_old * zfice(i)**(exposant_glace_old-1) &
957                       / (t_glace_min_old - RTT)
958                 endif
959                 
960                 IF (iflag_t_glace>=1.AND.zfice(i)>0.) THEN
961                 dzfice(i)= exposant_glace * zfice(i)**(exposant_glace-1) &
962                      / (t_glace_min - t_glace_max)
963                 endif
964               
965                 IF ((zfice(i)==0).OR.(zfice(i)==1)) THEN
966                    dzfice(i)=0.
967                 endif
968
969                 IF (zfice(i)<1) THEN
970                    cste=RLVTT
971                 else
972                    cste=RLSTT
973                 endif
974
975                 qlbef(i)=max(0.,zqn(i)-zqs(i))
976               IF (fl_cor_ebil > 0) THEN
977                 num = -Tbef(i)+zt(i)+rneb(i,k)*((1-zfice(i))*RLVTT &
978            +zfice(i)*RLSTT)/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))*qlbef(i)
979                 denom = 1.+rneb(i,k)*((1-zfice(i))*RLVTT+zfice(i)*RLSTT)/cste*zdqs(i) &
980                         -(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))*rneb(i,k)    &
981                 *qlbef(i)*dzfice(i)
982               else
983                 num = -Tbef(i)+zt(i)+rneb(i,k)*((1-zfice(i))*RLVTT &
984           +zfice(i)*RLSTT)/RCPD/(1.0+RVTMP2*zq(i))*qlbef(i)
985                 denom = 1.+rneb(i,k)*((1-zfice(i))*RLVTT+zfice(i)*RLSTT)/cste*zdqs(i) &
986                         -(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*zq(i))*rneb(i,k)*qlbef(i)*dzfice(i)
987               end if
988                 DT(i)=num/denom
989                 n_i(i)=n_i(i)+1
990
991                 endif ! fin convergence
992                 enddo ! fin boucle i
993
994                 endif !ice_thermo
995
996             enddo ! iter=1,iflag_fisrtilp_qsat+1
997             ! Fin d'iteration pour condensation avec variation de qsat(T)
998             ! -----------------------------------------------------------
999           endif !  if (iflag_fisrtilp_qsat.ge.0)
1000     ! ----------------------------------------------------------------
1001     ! Fin de P2.A.2> la prise en compte du couplage entre eau condensee et T
1002     ! ----------------------------------------------------------------
1003
1004        endif ! iflag_pdf
1005
1006!        if (iflag_fisrtilp_qsat.EQ.-1) THEN
1007!------------------------------------------
1008!CR: ATTENTION option fausse mais a existe:
1009! pour la re-activer, prendre iflag_fisrtilp_qsat=0 et
1010! activer les lignes suivantes:
1011       IF (1==0) THEN
1012       DO i=1,klon
1013           IF (rneb(i,k) <= 0.0) THEN
1014              zqn(i) = 0.0
1015              rneb(i,k) = 0.0
1016              zcond(i) = 0.0
1017              rhcl(i,k)=zq(i)/zqs(i)
1018           ELSE IF (rneb(i,k) >= 1.0) THEN
1019              zqn(i) = zq(i)
1020              rneb(i,k) = 1.0                 
1021              zcond(i) = MAX(0.0,zqn(i)-zqs(i))/(1+zdqs(i))
1022              rhcl(i,k)=1.0
1023           ELSE
1024              zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1+zdqs(i))
1025              rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
1026           ENDIF
1027       ENDDO
1028       ENDIF
1029!------------------------------------------
1030
1031!        ELSE
1032        ! ----------------------------------------------------------------
1033        ! P2.A.3> Calcul des valeures finales associees a la formation des nuages
1034        ! Variables calculees:
1035        !   rneb : nebulosite
1036        !   zcond: eau condensee en moyenne dans la maille
1037        !   zq : eau vapeur dans la maille
1038        !   zt : temperature de la maille
1039        !   rhcl: humidite relative ciel-clair
1040        ! ----------------------------------------------------------------
1041
1042        ! Bornage de l'eau in-cloud (zqn) et de la fraction nuageuse (rneb)
1043        ! Calcule de l'eau condensee moyenne dans la maille (zcond),
1044        ! et de l'humidite relative ciel-clair (rhcl)
1045        DO i=1,klon
1046           IF (rneb(i,k) <= 0.0) THEN
1047              zqn(i) = 0.0
1048              rneb(i,k) = 0.0
1049              zcond(i) = 0.0
1050              rhcl(i,k)=zq(i)/zqs(i)
1051           ELSE IF (rneb(i,k) >= 1.0) THEN
1052              zqn(i) = zq(i)
1053              rneb(i,k) = 1.0
1054              zcond(i) = MAX(0.0,zqn(i)-zqs(i))
1055              rhcl(i,k)=1.0
1056           ELSE
1057              zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)
1058              rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
1059           ENDIF
1060        ENDDO
1061
1062       
1063        ! If vertical heterogeneity, change fraction by volume as well
1064        IF (iflag_cloudth_vert>=3) THEN
1065          ctot_vol(1:klon,k)=min(max(ctot_vol(1:klon,k),0.),1.)
1066          rneblsvol(1:klon,k)=ctot_vol(1:klon,k)
1067        endif
1068
1069!        ENDIF
1070
1071     ELSE ! de IF (cpartiel)
1072        ! -------------------------
1073        ! P2.B> Nuage "tout ou rien"
1074        ! -------------------------
1075        ! note JLD: attention, rhcl non calcule. Ca peut avoir des consequences?
1076        DO i = 1, klon
1077           IF (zq(i)>zqs(i)) THEN
1078              rneb(i,k) = 1.0
1079           ELSE
1080              rneb(i,k) = 0.0
1081           ENDIF
1082           zcond(i) = MAX(0.0,zq(i)-zqs(i))/(1.+zdqs(i))
1083        ENDDO
1084     ENDIF ! de IF (cpartiel)
1085
1086     ! Mise a jour vapeur d'eau
1087     ! -------------------------
1088     DO i = 1, klon
1089        zq(i) = zq(i) - zcond(i)
1090        !         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD
1091     ENDDO
1092!AJ<
1093     ! ------------------------------------
1094     ! P2.C> Prise en compte de la Chaleur latente apres formation nuage
1095     ! -------------------------------------
1096     ! Variable calcule:
1097     !   zt : temperature de la maille
1098
1099     IF (.NOT. ice_thermo) THEN
1100        IF (iflag_fisrtilp_qsat<1) THEN
1101           DO i = 1, klon
1102             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
1103           ENDDO
1104        ELSE IF (iflag_fisrtilp_qsat>0) THEN
1105           DO i= 1, klon
1106    IF (fl_cor_ebil > 0) THEN
1107             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)+zcond(i)))
1108    else
1109             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i)))
1110    end if
1111           ENDDO
1112        endif
1113     ELSE
1114         IF (iflag_t_glace>=1) THEN
1115            CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
1116         endif
1117         IF (iflag_fisrtilp_qsat<1) THEN
1118           DO i = 1, klon
1119! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
1120!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
1121!                                     t_glace_max, exposant_glace)
1122              IF (iflag_t_glace==0) THEN
1123                    zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (RTT-t_glace_min_old)
1124                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
1125                    zfice(i) = zfice(i)**exposant_glace_old
1126              endif
1127              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) &
1128                       +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*zq(i))
1129           ENDDO
1130         else
1131           DO i=1, klon
1132! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
1133!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
1134!                                     t_glace_max, exposant_glace)
1135              IF (iflag_t_glace==0) THEN
1136                    zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (RTT-t_glace_min_old)
1137                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
1138                    zfice(i) = zfice(i)**exposant_glace_old
1139              endif
1140        IF (fl_cor_ebil > 0) THEN
1141              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) &
1142               * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)+zcond(i))) &
1143                      +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)+zcond(i)))
1144        else
1145              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i))) &
1146                      +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i)))
1147        end if
1148           ENDDO
1149         endif
1150!         PRINT*,zt(i),zrfl(i),zifl(i),'temp1'
1151       ENDIF
1152!>AJ
1153
1154     ! ----------------------------------------------------------------
1155     ! P3> Formation des precipitations
1156     ! ----------------------------------------------------------------
1157
1158     ! Partager l'eau condensee en precipitation et eau liquide nuageuse
1159
1160!<LTP
1161
1162IF (iflag_evap_prec==4) THEN
1163        !Partitionnement des precipitations venant du dessus en précipitations nuageuses
1164        !et précipitations ciel clair
1165
1166        !0) Calculate tot_zneb, la fraction nuageuse totale au-dessus du nuage
1167        !en supposant un recouvrement maximum aléatoire (voir Jakob and Klein, 2000)
1168       
1169        DO i=1, klon
1170                tot_znebn(i) = 1 - (1-tot_zneb(i))*(1 - max(rneb(i,k),zneb(i))) &
1171                        /(1-min(zneb(i),1-smallestreal))
1172                d_tot_zneb(i) = tot_znebn(i) - tot_zneb(i)
1173                tot_zneb(i) = tot_znebn(i)
1174
1175
1176                !1) Cloudy to clear air
1177                d_znebprecip_cld_clr(i) = znebprecipcld(i) - min(rneb(i,k),znebprecipcld(i))
1178                IF (znebprecipcld(i) > 0) THEN
1179                        d_zrfl_cld_clr(i) = d_znebprecip_cld_clr(i)/znebprecipcld(i)*zrflcld(i)
1180                        d_zifl_cld_clr(i) = d_znebprecip_cld_clr(i)/znebprecipcld(i)*ziflcld(i)
1181                ELSE
1182                        d_zrfl_cld_clr(i) = 0.
1183                        d_zifl_cld_clr(i) = 0.
1184                ENDIF
1185
1186                !2) Clear to cloudy air
1187                d_znebprecip_clr_cld(i) = max(0., min(znebprecipclr(i), rneb(i,k) &
1188                        - d_tot_zneb(i) - zneb(i)))
1189                IF (znebprecipclr(i) > 0) THEN
1190                        d_zrfl_clr_cld(i) = d_znebprecip_clr_cld(i)/znebprecipclr(i)*zrflclr(i)
1191                        d_zifl_clr_cld(i) = d_znebprecip_clr_cld(i)/znebprecipclr(i)*ziflclr(i)
1192                ELSE
1193                        d_zrfl_clr_cld(i) = 0.
1194                        d_zifl_clr_cld(i) = 0.
1195                ENDIF
1196
1197                !Update variables
1198                znebprecipcld(i) = znebprecipcld(i) + d_znebprecip_clr_cld(i) - d_znebprecip_cld_clr(i) 
1199                znebprecipclr(i) = znebprecipclr(i) + d_znebprecip_cld_clr(i) - d_znebprecip_clr_cld(i)
1200                zrflcld(i) = zrflcld(i) + d_zrfl_clr_cld(i) - d_zrfl_cld_clr(i)
1201                ziflcld(i) = ziflcld(i) + d_zifl_clr_cld(i) - d_zifl_cld_clr(i)
1202                zrflclr(i) = zrflclr(i) + d_zrfl_cld_clr(i) - d_zrfl_clr_cld(i)
1203                ziflclr(i) = ziflclr(i) + d_zifl_cld_clr(i) - d_zifl_clr_cld(i)
1204
1205        ENDDO
1206ENDIF
1207
1208!>LTP
1209
1210
1211
1212     ! Initialisation de zoliq (eau condensee moyenne dans la maille)
1213     DO i = 1, klon
1214        IF (rneb(i,k)>0.0) THEN
1215           zoliq(i) = zcond(i)
1216           zrho(i) = pplay(i,k) / zt(i) / RD
1217           zdz(i) = (paprs(i,k)-paprs(i,k+1)) / (zrho(i)*RG)
1218        ENDIF
1219     ENDDO
1220!AJ<
1221     IF (.NOT. ice_thermo) THEN
1222       IF (iflag_t_glace==0) THEN
1223         DO i = 1, klon
1224            IF (rneb(i,k)>0.0) THEN
1225               zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (273.13-t_glace_min_old)
1226               zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
1227               zfice(i) = zfice(i)**exposant_glace_old
1228!              zfice(i) = zfice(i)**nexpo
1229         !!      zfice(i)=0.
1230            ENDIF
1231         ENDDO
1232       ELSE ! of IF (iflag_t_glace.EQ.0)
1233         CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
1234!         DO i = 1, klon
1235!            IF (rneb(i,k).GT.0.0) THEN
1236! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
1237!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
1238!                                     t_glace_max, exposant_glace)
1239!            ENDIF
1240!         ENDDO
1241       ENDIF
1242     ENDIF
1243
1244     ! Calcul de radliq (eau condensee pour le rayonnement)
1245     ! Iteration pour realiser une moyenne de l'eau nuageuse lors de la precip
1246     ! Remarque: ce n'est donc pas l'eau restante en fin de precip mais une
1247     ! eau moyenne restante dans le nuage sur la duree du pas de temps qui est
1248     ! transmise au rayonnement;
1249     ! ----------------------------------------------------------------
1250     DO i = 1, klon
1251        IF (rneb(i,k)>0.0) THEN
1252           zneb(i) = MAX(rneb(i,k), seuil_neb)
1253     !      zt(i) = zt(i)+zcond(i)*zfice(i)*RLMLT/RCPD/(1.0+RVTMP2*zq(i)) 
1254!           PRINT*,zt(i),'fractionglace'
1255!>AJ
1256           radliq(i,k) = zoliq(i)/REAL(ninter+1)
1257        ENDIF
1258     ENDDO
1259
1260     DO n = 1, ninter
1261        DO i = 1, klon
1262           IF (rneb(i,k)>0.0) THEN
1263              zrhol(i) = zrho(i) * zoliq(i) / zneb(i)
1264              ! Initialization of zpluie and zice:
1265              zpluie=0
1266              zice=0
1267              IF (zneb(i)==seuil_neb) THEN
1268                 ztot = 0.0
1269              ELSE
1270                 !  quantite d'eau a eliminer: zchau (Sundqvist, 1978)
1271                 !  meme chose pour la glace: zfroi (Zender & Kiehl, 1997)
1272                 IF (ptconv(i,k)) THEN
1273                    zcl   =cld_lc_con
1274                    zct   =1./cld_tau_con
1275                    zfroi    = dtime/REAL(ninter)/zdz(i)*zoliq(i) &
1276                         *fallvc(zrhol(i)) * zfice(i)
1277                 else
1278                    zcl   =cld_lc_lsc
1279                    zct   =1./cld_tau_lsc
1280                    zfroi    = dtime/REAL(ninter)/zdz(i)*zoliq(i) &
1281                         *fallvs(zrhol(i)) * zfice(i)
1282                 endif
1283
1284                 ! si l'heterogeneite verticale est active, on utilise
1285                 ! la fraction volumique "vraie" plutot que la fraction
1286                 ! surfacique modifiee, qui est plus grande et reduit
1287                 ! sinon l'eau in-cloud de facon artificielle
1288                 IF ((iflag_cloudth_vert>=3).AND.(iflag_rain_incloud_vol==1)) THEN
1289                    zchau    = zct   *dtime/REAL(ninter) * zoliq(i) &
1290                         *(1.0-EXP(-(zoliq(i)/ctot_vol(i,k)/zcl   )**2)) *(1.-zfice(i))
1291                 else
1292                    zchau    = zct   *dtime/REAL(ninter) * zoliq(i) &
1293                         *(1.0-EXP(-(zoliq(i)/zneb(i)/zcl   )**2)) *(1.-zfice(i))
1294                 endif
1295!AJ<
1296                 IF (.NOT. ice_thermo) THEN
1297                   ztot    = zchau + zfroi
1298                 ELSE
1299                   zpluie = MIN(MAX(zchau,0.0),zoliq(i)*(1.-zfice(i)))
1300                   zice = MIN(MAX(zfroi,0.0),zoliq(i)*zfice(i))
1301                   ztot    = zpluie    + zice
1302                 ENDIF
1303!>AJ
1304                 ztot    = MAX(ztot   ,0.0)
1305              ENDIF
1306              ztot    = MIN(ztot,zoliq(i))
1307!AJ<
1308     !         zoliqp = MAX(zoliq(i)*(1.-zfice(i))-1.*zpluie   , 0.0)
1309     !         zoliqi = MAX(zoliq(i)*zfice(i)-1.*zice   , 0.0)
1310!JLD : les 2 variables zoliqp et zoliqi crorresponent a des pseudo precip
1311!      temporaires et ne doivent pas etre calcule (alors qu'elles le sont
1312!      si iflag_bergeron <> 2
1313!      A SUPPRIMER A TERME
1314              zoliqp(i) = MAX(zoliq(i)*(1.-zfice(i))-1.*zpluie  , 0.0)
1315              zoliqi(i) = MAX(zoliq(i)*zfice(i)-1.*zice  , 0.0)
1316              zoliq(i) = MAX(zoliq(i)-ztot   , 0.0)
1317!>AJ
1318              radliq(i,k) = radliq(i,k) + zoliq(i)/REAL(ninter+1)
1319           ENDIF
1320        ENDDO  ! i = 1,klon
1321     ENDDO     ! n = 1,ninter
1322
1323     ! ----------------------------------------------------------------
1324
1325     IF (.NOT. ice_thermo) THEN
1326       DO i = 1, klon
1327         IF (rneb(i,k)>0.0) THEN
1328           d_ql(i,k) = zoliq(i)
1329           zrfl(i) = zrfl(i)+ MAX(zcond(i)-zoliq(i),0.0) &
1330                * (paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1331         ENDIF
1332       ENDDO
1333     ELSE
1334
1335!CR&JYG<
1336! On prend en compte l'effet Bergeron dans les flux de precipitation :
1337! Si T < 0 C, alors les precipitations liquides sont converties en glace, ce qui
1338! provoque un accroissement de temperature DeltaT. L'effet de DeltaT sur le condensat
1339! et les precipitations est grossierement pris en compte en linearisant les equations
1340! et en approximant le processus de precipitation liquide par un processus a seuil.
1341! On fait l'hypothese que le condensat nuageux n'est pas modifié dans cette opération.
1342! Le condensat precipitant liquide est supprime (dans la limite DeltaT<273-T).
1343! Le condensat precipitant solide est augmente.
1344! La vapeur d'eau est augmentee.
1345
1346       IF ((iflag_bergeron == 2)) THEN
1347         DO i = 1, klon
1348           IF (rneb(i,k) > 0.0) THEN
1349             zqpreci(i)=(zcond(i)-zoliq(i))*zfice(i)
1350             zqprecl(i)=(zcond(i)-zoliq(i))*(1.-zfice(i))
1351           IF (fl_cor_ebil > 0) THEN
1352             zcp=RCPD*(1.0+RVTMP2*(zq(i)+zmqc(i)+zcond(i)))
1353             coef1 = rneb(i,k)*RLSTT/zcp*zdqsdT_raw(i)
1354!            Calcul de DT si toute les precips liquides congelent
1355             DeltaT = RLMLT*zqprecl(i) / (zcp*(1.+coef1))
1356!            On ne veut pas que T devienne superieur a la temp. de congelation.
1357!            donc que Delta > RTT-zt(i
1358             DeltaT = max( min( RTT-zt(i), DeltaT) , 0. )
1359             zt(i)      = zt(i)      + DeltaT
1360!            Eau vaporisee du fait de l'augmentation de T
1361             Deltaq = rneb(i,k)*zdqsdT_raw(i)*DeltaT
1362!            on reajoute cette eau vaporise a la vapeur et on l'enleve des precips
1363             zq(i) = zq(i) +  Deltaq
1364!            Les 3 max si dessous prtotegent uniquement des erreurs d'arrondies
1365             zcond(i)   = max( zcond(i)- Deltaq, 0. )
1366!            precip liquide qui congele ou qui s'evapore
1367             Deltaqprecl = -zcp/RLMLT*(1.+coef1)*DeltaT
1368             zqprecl(i) = max( zqprecl(i) + Deltaqprecl, 0. )
1369!            bilan eau glacee
1370             zqpreci(i) = max (zqpreci(i) - Deltaqprecl - Deltaq, 0.)
1371           else ! if (fl_cor_ebil .GT. 0)
1372!            ancien calcul
1373             zcp=RCPD*(1.0+RVTMP2*(zq(i)+zcond(i)))
1374             coef1 = RLMLT*zdqs(i)/RLVTT
1375             DeltaT = max( min( RTT-zt(i), RLMLT*zqprecl(i)/zcp/(1.+coef1) ) , 0.)
1376             zqpreci(i) = zqpreci(i) + zcp/RLMLT*DeltaT
1377             zqprecl(i) = max( zqprecl(i) - zcp/RLMLT*(1.+coef1)*DeltaT, 0. )
1378             zcond(i)   = max( zcond(i)   - zcp/RLVTT*zdqs(i)*DeltaT, 0. )
1379             zq(i)      = zq(i)      + zcp/RLVTT*zdqs(i)*DeltaT
1380             zt(i)      = zt(i)      + DeltaT
1381           end if ! if (fl_cor_ebil .GT. 0)
1382           ENDIF  ! rneb(i,k) .GT. 0.0
1383         ENDDO
1384         DO i = 1, klon
1385           IF (rneb(i,k)>0.0) THEN
1386             d_ql(i,k) = (1-zfice(i))*zoliq(i)
1387             d_qi(i,k) = zfice(i)*zoliq(i)
1388!<LTP
1389             IF (iflag_evap_prec == 4) THEN
1390                zrflcld(i) = zrflcld(i)+zqprecl(i) &
1391                 *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1392                ziflcld(i) = ziflcld(i)+ zqpreci(i) &
1393                      *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1394                znebprecipcld(i) = rneb(i,k)
1395                zrfl(i) = zrflcld(i) + zrflclr(i)
1396                zifl(i) = ziflcld(i) + ziflclr(i)       
1397!>LTP
1398             ELSE
1399                zrfl(i) = zrfl(i)+ zqprecl(i) &
1400                 *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1401                zifl(i) = zifl(i)+ zqpreci(i) &
1402                      *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
1403             
1404             ENDIF !iflag_evap_prec==4
1405
1406           ENDIF                     
1407         ENDDO
1408!!
1409       ELSE  ! iflag_bergeron
1410!>CR&JYG
1411!!
1412       DO i = 1, klon
1413         IF (rneb(i,k)>0.0) THEN
1414!CR on prend en compte la phase glace
1415!JLD inutile car on ne passe jamais ici si .NOT.ice_thermo
1416!           if (.NOT.ice_thermo) THEN
1417!           d_ql(i,k) = zoliq(i)
1418!           d_qi(i,k) = 0.
1419!           else
1420           d_ql(i,k) = (1-zfice(i))*zoliq(i)
1421           d_qi(i,k) = zfice(i)*zoliq(i)
1422!           endif
1423!<LTP
1424             IF (iflag_evap_prec == 4) THEN
1425                zrflcld(i) = zrflcld(i)+ MAX(zcond(i)*(1.-zfice(i))-zoliqp(i),0.0) &
1426                       *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1427                ziflcld(i) = ziflcld(i)+ MAX(zcond(i)*zfice(i)-zoliqi(i),0.0) &
1428                        *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
1429                znebprecipcld(i) = rneb(i,k)
1430                zrfl(i) = zrflcld(i) + zrflclr(i)
1431                zifl(i) = ziflcld(i) + ziflclr(i)       
1432!>LTP
1433             ELSE
1434!AJ<
1435                   zrfl(i) = zrfl(i)+ MAX(zcond(i)*(1.-zfice(i))-zoliqp(i),0.0) &
1436                       *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1437                        zifl(i) = zifl(i)+ MAX(zcond(i)*zfice(i)-zoliqi(i),0.0) &
1438                        *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
1439     !      zrfl(i) = zrfl(i)+  zpluie                         &
1440     !          *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1441     !      zifl(i) = zifl(i)+  zice                    &
1442     !               *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)                                   
1443             ENDIF !iflag_evap_prec == 4             
1444
1445!CR : on prend en compte l'effet Bergeron dans les flux de precipitation
1446           IF ((iflag_bergeron == 1) .AND. (zt(i) < 273.15)) THEN
1447!<LTP
1448                IF (iflag_evap_prec == 4) THEN
1449                     zsolid = zrfl(i)
1450                     ziflclr(i) = ziflclr(i) +zrflclr(i)
1451                     ziflcld(i) = ziflcld(i) +zrflcld(i)
1452                     zifl(i) = ziflclr(i)+ziflcld(i)
1453                     zrflcld(i)=0.
1454                     zrflclr(i)=0.   
1455                     zrfl(i) = zrflclr(i)+zrflcld(i)
1456!>LTP
1457                ELSE
1458                     zsolid = zrfl(i)
1459                     zifl(i) = zifl(i)+zrfl(i)
1460                     zrfl(i) = 0.
1461                 ENDIF!iflag_evap_prec==4
1462
1463           IF (fl_cor_ebil > 0) THEN
1464              zt(i)=zt(i)+zsolid*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
1465                      *(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))
1466           else
1467              zt(i)=zt(i)+zsolid*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
1468                      *(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*zq(i))
1469           end if
1470           ENDIF  ! (iflag_bergeron .EQ. 1) .AND. (zt(i) .LT. 273.15)
1471!RC   
1472
1473         ENDIF ! rneb(i,k).GT.0.0
1474       ENDDO
1475
1476       ENDIF  ! iflag_bergeron .EQ. 2
1477     ENDIF  ! .NOT. ice_thermo
1478
1479!CR: la fonte est faite au debut
1480!      IF (ice_thermo) THEN
1481!       DO i = 1, klon
1482!           zmelt = ((zt(i)-273.15)/(ztfondue-273.15))**2
1483!           zmelt = MIN(MAX(zmelt,0.),1.)
1484!           zrfl(i)=zrfl(i)+zmelt*zifl(i)
1485!           zifl(i)=zifl(i)*(1.-zmelt)
1486!           PRINT*,zt(i),'octavio1'
1487!           zt(i)=zt(i)-zifl(i)*zmelt*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
1488!                      *RLMLT/RCPD/(1.0+RVTMP2*zq(i))
1489!           PRINT*,zt(i),zrfl(i),zifl(i),zmelt,'octavio2'
1490!       ENDDO
1491!     ENDIF
1492
1493
1494!<LTP
1495
1496!Limitation de la fraction surfacique couverte par les précipitations lorsque l'intensité locale du flux de précipitation descend en
1497!dessous de rain_int_min
1498    IF (iflag_evap_prec==4) THEN
1499        DO i=1, klon
1500            IF (zrflclr(i) + ziflclr(i) > 0 ) THEN
1501               znebprecipclr(i) = min(znebprecipclr(i), max(zrflclr(i) &
1502                    /(znebprecipclr(i)*rain_int_min), &
1503                    ziflclr(i)/(znebprecipclr(i)*rain_int_min)))
1504            ELSE
1505                znebprecipclr(i)=0.
1506            ENDIF
1507
1508            IF (zrflcld(i) + ziflcld(i) > 0 ) THEN
1509               znebprecipcld(i) = min(znebprecipcld(i), &
1510                    max(zrflcld(i)/(znebprecipcld(i)*rain_int_min), &
1511                    ziflcld(i)/(znebprecipcld(i)*rain_int_min)))
1512            ELSE
1513                znebprecipcld(i)=0.
1514            ENDIF
1515       ENDDO
1516    ENDIf
1517
1518!>LTP
1519
1520
1521
1522
1523       
1524     IF (.NOT. ice_thermo) THEN
1525       DO i = 1, klon
1526         IF (zt(i)<RTT) THEN
1527           psfl(i,k)=zrfl(i)
1528         ELSE
1529           prfl(i,k)=zrfl(i)
1530         ENDIF
1531       ENDDO
1532     ELSE
1533     ! JAM*************************************************
1534     ! Revoir partie ci-dessous: a quoi servent psfl et prfl?
1535     ! *****************************************************
1536
1537       DO i = 1, klon
1538     !   IF (zt(i).LT.RTT) THEN
1539           psfl(i,k)=zifl(i)
1540     !   ELSE
1541           prfl(i,k)=zrfl(i)
1542     !   ENDIF
1543!>AJ
1544       ENDDO
1545     ENDIF
1546     ! ----------------------------------------------------------------
1547     ! Fin de formation des precipitations
1548     ! ----------------------------------------------------------------
1549
1550     ! Calculer les tendances de q et de t:
1551
1552     DO i = 1, klon
1553        d_q(i,k) = zq(i) - q(i,k)
1554        d_t(i,k) = zt(i) - t(i,k)
1555     ENDDO
1556
1557     !AA--------------- Calcul du lessivage stratiforme  -------------
1558
1559     DO i = 1,klon
1560
1561        IF(zcond(i)>zoliq(i)+1.e-10) THEN
1562         beta(i,k) = (zcond(i)-zoliq(i))/zcond(i)/dtime
1563        else
1564         beta(i,k) = 0.
1565        endif
1566        zprec_cond(i) = MAX(zcond(i)-zoliq(i),0.0) &
1567             * (paprs(i,k)-paprs(i,k+1))/RG
1568        IF (rneb(i,k)>0.0.AND.zprec_cond(i)>0.) THEN
1569           !AA lessivage nucleation LMD5 dans la couche elle-meme
1570          IF (iflag_t_glace==0) THEN
1571           IF (t(i,k) >= t_glace_min_old) THEN
1572              zalpha_tr = a_tr_sca(3)
1573           else
1574              zalpha_tr = a_tr_sca(4)
1575           endif
1576          ELSE ! of IF (iflag_t_glace.EQ.0)
1577           IF (t(i,k) >= t_glace_min) THEN
1578              zalpha_tr = a_tr_sca(3)
1579           else
1580              zalpha_tr = a_tr_sca(4)
1581           endif
1582          ENDIF
1583           zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
1584           pfrac_nucl(i,k)=pfrac_nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
1585           frac_nucl(i,k)= 1.-zneb(i)*zfrac_lessi
1586
1587           ! nucleation avec un facteur -1 au lieu de -0.5
1588           zfrac_lessi = 1. - EXP(-zprec_cond(i)/zneb(i))
1589           pfrac_1nucl(i,k)=pfrac_1nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
1590        ENDIF
1591
1592     ENDDO      ! boucle sur i
1593
1594     !AA Lessivage par impaction dans les couches en-dessous
1595     DO kk = k-1, 1, -1
1596        DO i = 1, klon
1597           IF (rneb(i,k)>0.0.AND.zprec_cond(i)>0.) THEN
1598             IF (iflag_t_glace==0) THEN
1599              IF (t(i,kk) >= t_glace_min_old) THEN
1600                 zalpha_tr = a_tr_sca(1)
1601              else
1602                 zalpha_tr = a_tr_sca(2)
1603              endif
1604             ELSE ! of IF (iflag_t_glace.EQ.0)
1605              IF (t(i,kk) >= t_glace_min) THEN
1606                 zalpha_tr = a_tr_sca(1)
1607              else
1608                 zalpha_tr = a_tr_sca(2)
1609              endif
1610             ENDIF
1611              zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
1612              pfrac_impa(i,kk)=pfrac_impa(i,kk)*(1.-zneb(i)*zfrac_lessi)
1613              frac_impa(i,kk)= 1.-zneb(i)*zfrac_lessi
1614           ENDIF
1615        ENDDO
1616     ENDDO
1617
1618     !AA===============================================================
1619     !                     FIN DE LA BOUCLE VERTICALE 
1620  end DO
1621
1622  !AA==================================================================
1623
1624  ! Pluie ou neige au sol selon la temperature de la 1ere couche
1625
1626!CR: si la thermo de la glace est active, on calcule zifl directement
1627  IF (.NOT.ice_thermo) THEN
1628  DO i = 1, klon
1629     IF ((t(i,1)+d_t(i,1)) < RTT) THEN
1630!AJ<
1631!        snow(i) = zrfl(i)
1632        snow(i) = zrfl(i)+zifl(i)
1633!>AJ
1634        zlh_solid(i) = RLSTT-RLVTT
1635     ELSE
1636        rain(i) = zrfl(i)
1637        zlh_solid(i) = 0.
1638     ENDIF
1639  ENDDO
1640
1641  ELSE
1642     DO i = 1, klon
1643        snow(i) = zifl(i)
1644        rain(i) = zrfl(i)
1645     ENDDO
1646   
1647   ENDIF
1648
1649  ! For energy conservation : when snow is present, the solification
1650  ! latent heat is considered.
1651!CR: si thermo de la glace, neige deja prise en compte
1652  IF (.NOT.ice_thermo) THEN
1653  DO k = 1, klev
1654     DO i = 1, klon
1655        zcpair=RCPD*(1.0+RVTMP2*(q(i,k)+d_q(i,k)))
1656        zmair(i)=(paprs(i,k)-paprs(i,k+1))/RG
1657        zm_solid = (prfl(i,k)-prfl(i,k+1)+psfl(i,k)-psfl(i,k+1))*dtime
1658        d_t(i,k) = d_t(i,k) + zlh_solid(i) *zm_solid / (zcpair*zmair(i))
1659     END DO
1660  END DO
1661  ENDIF
1662
1663  IF (ncoreczq>0) THEN
1664     WRITE(lunout,*)'WARNING : ZQ dans fisrtilp ',ncoreczq,' val < 1.e-15.'
1665  ENDIF
1666
1667
1668END SUBROUTINE fisrtilp
1669END MODULE lmdz_lscp_old
Note: See TracBrowser for help on using the repository browser.