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

Last change on this file since 5103 was 5103, checked in by abarral, 8 weeks ago

Handle CPP_INLANDSIS in lmdz_cppkeys_wrapper.F90
Remove obsolete key wrgrads_thermcell, _ADV_HALO, _ADV_HALLO, isminmax
Remove redundant uses of CPPKEY_INCA (thanks acozic)
Remove obsolete misc/write_field.F90
Remove unused ioipsl_* wrappers
Remove calls to WriteField_u with wrong signature
Convert .F -> .[fF]90
(lint) uppercase fortran operators
[note: 1d and iso still broken - working on it]

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