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

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

Replace academic.h, alpale.h, comdissip.h, comdissipn.h, comdissnew.h by modules
Remove unused clesph0.h

  • 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.8 KB
Line 
1! $Id: lmdz_lscp_old.F90 5134 2024-07-26 15:56:37Z 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           ! version creneau de (Li, 1998)
760           do i=1,klon
761              zdelq = min(ratqs(i,k),0.99) * zq(i)
762              rneb(i,k) = (zq(i)+zdelq-zqs(i)) / (2.0*zdelq)
763              zqn(i) = (zq(i)+zdelq+zqs(i))/2.0
764           enddo
765
766        else !  if (iflag_pdf.EQ.0)
767           ! ----------------------------------------------------------------
768           ! P2.A.1> Avec les nouvelles PDFs, calcul des grandeurs nuageuses pour
769           ! les valeurs de T et Q initiales
770           ! ----------------------------------------------------------------
771           do i=1,klon
772              IF(zq(i)<1.e-15) THEN
773                 ncoreczq=ncoreczq+1
774                 zq(i)=1.e-15
775              endif
776           enddo
777
778           IF (iflag_cld_th>=5) THEN
779              IF (iflag_cloudth_vert<=2) THEN
780               CALL cloudth(klon,klev,k,ztv, &
781                   zq,zqta,fraca, &
782                   qcloud,ctot,zpspsk,paprs,pplay,ztla,zthl, &
783                   ratqs,zqs,t, &
784                   cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv)
785
786              elseif (iflag_cloudth_vert>=3 .AND. iflag_cloudth_vert<=5) THEN
787               CALL cloudth_v3(klon,klev,k,ztv, &
788                   zq,zqta,fraca, &
789                   qcloud,ctot,ctot_vol,zpspsk,paprs,pplay,ztla,zthl, &
790                   ratqs,zqs,t, &
791                   cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv)
792              !----------------------------------
793              !Version these Jean Jouhaud, Decembre 2018
794              !----------------------------------             
795              elseif (iflag_cloudth_vert==6) THEN
796               CALL cloudth_v6(klon,klev,k,ztv, &
797                   zq,zqta,fraca, &
798                   qcloud,ctot,ctot_vol,zpspsk,paprs,pplay,ztla,zthl, &
799                   ratqs,zqs,t, &
800                   cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv)
801
802              endif
803              do i=1,klon
804                 rneb(i,k)=ctot(i,k)
805                 rneblsvol(i,k)=ctot_vol(i,k)
806                 zqn(i)=qcloud(i)
807              enddo
808
809           endif
810
811           IF (iflag_cld_th <= 4) THEN
812              lognormale = .TRUE.
813           elseif (iflag_cld_th >= 6) THEN
814              ! lognormale en l'absence des thermiques
815              lognormale = fraca(:,k) < 1e-10
816           else
817              ! Dans le cas iflag_cld_th=5, on prend systématiquement la
818              ! bi-gaussienne
819              lognormale = .FALSE.
820           end if
821
822!CR: variation de qsat avec T en presence de glace ou non
823!initialisations
824           do i=1,klon
825              DT(i) = 0.
826              n_i(i)=0
827              Tbef(i)=zt(i)
828              qlbef(i)=0.
829           enddo
830
831        ! ----------------------------------------------------------------
832        ! P2.A.2> Prise en compte du couplage entre eau condensee et T.
833        ! Calcul des grandeurs nuageuses en tenant compte de l'effet de
834        ! la condensation sur T, et donc sur qsat et sur les grandeurs nuageuses
835        ! qui en dependent. Ce changement de temperature est provisoire, et
836        ! la valeur definitive sera calcule plus tard.
837        ! Variables calculees:
838        !   rneb : nebulosite
839        !   zcond: eau condensee en moyenne dans la maille
840        ! note JLD: si on n'a pas de pdf lognormale, ce qui se passe ne me semble
841        ! pas clair, il n'y a probablement pas de prise en compte de l'effet de
842        ! T sur qsat
843        ! ----------------------------------------------------------------
844
845!Boucle iterative: ATTENTION, l'option -1 n'est plus activable ici
846           IF (iflag_fisrtilp_qsat>=0) THEN
847             ! Iteration pour condensation avec variation de qsat(T)
848             ! -----------------------------------------------------
849             do iter=1,iflag_fisrtilp_qsat+1
850               
851               do i=1,klon
852!                 do while ((abs(DT(i)).gt.DDT0).OR.(n_i(i).EQ.0))
853                 ! !! convergence = .TRUE. tant que l'on n'a pas converge !!
854                 ! ------------------------------
855                 convergence(i)=abs(DT(i))>DDT0
856                 IF ((convergence(i).OR.(n_i(i)==0)).AND.lognormale(i)) THEN
857                 ! si on n'a pas converge
858
859                 ! P2.A.2.1> Calcul de la fraction nuageuse et de la quantite d'eau condensee
860                 ! ---------------------------------------------------------------
861                 ! Variables calculees:
862                 ! rneb : nebulosite
863                 ! zqn : eau condensee, dans le nuage (in cloud water content)
864                 ! zcond: eau condensee en moyenne dans la maille
865                 ! rhcl: humidite relative ciel-clair
866
867                 Tbef(i)=Tbef(i)+DT(i) ! nouvelle temperature
868                 IF (.NOT.ice_thermo) THEN
869                    zdelta = MAX(0.,SIGN(1.,RTT-Tbef(i)))
870                 else
871                    IF (iflag_t_glace==0) THEN
872                    zdelta = MAX(0.,SIGN(1.,t_glace_min_old-Tbef(i)))
873                    ELSE IF (iflag_t_glace>=1) THEN
874                       IF (iflag_oldbug_fisrtilp==0) THEN
875                          zdelta = MAX(0.,SIGN(1.,t_glace_max-Tbef(i)))
876                       else
877                          !avec bug : zdelta = MAX(0.,SIGN(1.,t_glace_min-Tbef(i)))
878                          zdelta = MAX(0.,SIGN(1.,t_glace_min-Tbef(i)))
879                       endif
880                    endif
881                 endif
882                 ! Calcul de rneb, qzn et zcond pour les PDF lognormales
883                 zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
884               IF (fl_cor_ebil > 0) THEN
885                 zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))
886               else
887                 zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))
888               end if
889                 zqs(i) = R2ES*FOEEW(Tbef(i),zdelta)/pplay(i,k)
890                 zqs(i) = MIN(0.5,zqs(i))
891                 zcor = 1./(1.-RETV*zqs(i))
892                 zqs(i) = zqs(i)*zcor
893                 zdqs(i) = FOEDE(Tbef(i),zdelta,zcvm5,zqs(i),zcor)
894                 zpdf_sig(i)=ratqs(i,k)*zq(i)
895                 zpdf_k(i)=-sqrt(log(1.+(zpdf_sig(i)/zq(i))**2))
896                 zpdf_delta(i)=log(zq(i)/zqs(i))
897                 zpdf_a(i)=zpdf_delta(i)/(zpdf_k(i)*sqrt(2.))
898                 zpdf_b(i)=zpdf_k(i)/(2.*sqrt(2.))
899                 zpdf_e1(i)=zpdf_a(i)-zpdf_b(i)
900                 zpdf_e1(i)=sign(min(abs(zpdf_e1(i)),5.),zpdf_e1(i))
901                 zpdf_e1(i)=1.-erf(zpdf_e1(i))
902                 zpdf_e2(i)=zpdf_a(i)+zpdf_b(i)
903                 zpdf_e2(i)=sign(min(abs(zpdf_e2(i)),5.),zpdf_e2(i))
904                 zpdf_e2(i)=1.-erf(zpdf_e2(i))
905             
906                 IF (zpdf_e1(i)<1.e-10) THEN
907                    rneb(i,k)=0.
908                    zqn(i)=zqs(i)
909                 else
910                    rneb(i,k)=0.5*zpdf_e1(i)
911                    zqn(i)=zq(i)*zpdf_e2(i)/zpdf_e1(i)
912                 endif
913
914                 ! If vertical heterogeneity, change fraction by volume as well
915                 IF (iflag_cloudth_vert>=3) THEN
916                   ctot_vol(i,k)=rneb(i,k)
917                   rneblsvol(i,k)=ctot_vol(i,k)
918                 endif
919
920                 endif !convergence
921
922               enddo ! boucle en i
923
924                 ! P2.A.2.2> Calcul APPROCHE de la variation de temperature DT
925                 !         due a la condensation.
926                 ! ---------------------------------------------------------------
927                 ! Variables calculees:
928                 ! DT : variation de temperature due a la condensation
929
930                 IF (.NOT. ice_thermo) THEN
931                 ! --------------------------
932                 do i=1,klon
933                 IF ((convergence(i).OR.(n_i(i)==0)).AND.lognormale(i)) THEN
934                 qlbef(i)=max(0.,zqn(i)-zqs(i))
935               IF (fl_cor_ebil > 0) THEN
936                 num=-Tbef(i)+zt(i)+rneb(i,k)*RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))*qlbef(i)
937               else
938                 num=-Tbef(i)+zt(i)+rneb(i,k)*RLVTT/RCPD/(1.0+RVTMP2*zq(i))*qlbef(i)
939               end if
940                 denom=1.+rneb(i,k)*zdqs(i)
941                 DT(i)=num/denom
942                 n_i(i)=n_i(i)+1
943                 endif
944                 enddo
945
946                 else ! if (.NOT. ice_thermo)
947                 ! --------------------------
948                 IF (iflag_t_glace>=1) THEN
949                 CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
950                 endif
951
952                 do i=1,klon
953                 IF ((convergence(i).OR.(n_i(i)==0)).AND.lognormale(i)) THEN
954                 IF (iflag_t_glace==0) THEN
955                    zfice(i) = 1.0 - (Tbef(i)-t_glace_min_old) / (RTT-t_glace_min_old)
956                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
957                    zfice(i) = zfice(i)**exposant_glace_old
958                    dzfice(i)= exposant_glace_old * zfice(i)**(exposant_glace_old-1) &
959                       / (t_glace_min_old - RTT)
960                 endif
961                 
962                 IF (iflag_t_glace>=1.AND.zfice(i)>0.) THEN
963                 dzfice(i)= exposant_glace * zfice(i)**(exposant_glace-1) &
964                      / (t_glace_min - t_glace_max)
965                 endif
966               
967                 IF ((zfice(i)==0).OR.(zfice(i)==1)) THEN
968                    dzfice(i)=0.
969                 endif
970
971                 IF (zfice(i)<1) THEN
972                    cste=RLVTT
973                 else
974                    cste=RLSTT
975                 endif
976
977                 qlbef(i)=max(0.,zqn(i)-zqs(i))
978               IF (fl_cor_ebil > 0) THEN
979                 num = -Tbef(i)+zt(i)+rneb(i,k)*((1-zfice(i))*RLVTT &
980            +zfice(i)*RLSTT)/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))*qlbef(i)
981                 denom = 1.+rneb(i,k)*((1-zfice(i))*RLVTT+zfice(i)*RLSTT)/cste*zdqs(i) &
982                         -(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))*rneb(i,k)    &
983                 *qlbef(i)*dzfice(i)
984               else
985                 num = -Tbef(i)+zt(i)+rneb(i,k)*((1-zfice(i))*RLVTT &
986           +zfice(i)*RLSTT)/RCPD/(1.0+RVTMP2*zq(i))*qlbef(i)
987                 denom = 1.+rneb(i,k)*((1-zfice(i))*RLVTT+zfice(i)*RLSTT)/cste*zdqs(i) &
988                         -(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*zq(i))*rneb(i,k)*qlbef(i)*dzfice(i)
989               end if
990                 DT(i)=num/denom
991                 n_i(i)=n_i(i)+1
992
993                 endif ! fin convergence
994                 enddo ! fin boucle i
995
996                 endif !ice_thermo
997
998             enddo ! iter=1,iflag_fisrtilp_qsat+1
999             ! Fin d'iteration pour condensation avec variation de qsat(T)
1000             ! -----------------------------------------------------------
1001           endif !  if (iflag_fisrtilp_qsat.ge.0)
1002     ! ----------------------------------------------------------------
1003     ! Fin de P2.A.2> la prise en compte du couplage entre eau condensee et T
1004     ! ----------------------------------------------------------------
1005
1006        endif ! iflag_pdf
1007
1008!        if (iflag_fisrtilp_qsat.EQ.-1) THEN
1009!------------------------------------------
1010!CR: ATTENTION option fausse mais a existe:
1011! pour la re-activer, prendre iflag_fisrtilp_qsat=0 et
1012! activer les lignes suivantes:
1013       IF (1==0) THEN
1014       DO i=1,klon
1015           IF (rneb(i,k) <= 0.0) THEN
1016              zqn(i) = 0.0
1017              rneb(i,k) = 0.0
1018              zcond(i) = 0.0
1019              rhcl(i,k)=zq(i)/zqs(i)
1020           ELSE IF (rneb(i,k) >= 1.0) THEN
1021              zqn(i) = zq(i)
1022              rneb(i,k) = 1.0                 
1023              zcond(i) = MAX(0.0,zqn(i)-zqs(i))/(1+zdqs(i))
1024              rhcl(i,k)=1.0
1025           ELSE
1026              zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1+zdqs(i))
1027              rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
1028           ENDIF
1029       ENDDO
1030       ENDIF
1031!------------------------------------------
1032
1033!        ELSE
1034        ! ----------------------------------------------------------------
1035        ! P2.A.3> Calcul des valeures finales associees a la formation des nuages
1036        ! Variables calculees:
1037        !   rneb : nebulosite
1038        !   zcond: eau condensee en moyenne dans la maille
1039        !   zq : eau vapeur dans la maille
1040        !   zt : temperature de la maille
1041        !   rhcl: humidite relative ciel-clair
1042        ! ----------------------------------------------------------------
1043
1044        ! Bornage de l'eau in-cloud (zqn) et de la fraction nuageuse (rneb)
1045        ! Calcule de l'eau condensee moyenne dans la maille (zcond),
1046        ! et de l'humidite relative ciel-clair (rhcl)
1047        DO i=1,klon
1048           IF (rneb(i,k) <= 0.0) THEN
1049              zqn(i) = 0.0
1050              rneb(i,k) = 0.0
1051              zcond(i) = 0.0
1052              rhcl(i,k)=zq(i)/zqs(i)
1053           ELSE IF (rneb(i,k) >= 1.0) THEN
1054              zqn(i) = zq(i)
1055              rneb(i,k) = 1.0
1056              zcond(i) = MAX(0.0,zqn(i)-zqs(i))
1057              rhcl(i,k)=1.0
1058           ELSE
1059              zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)
1060              rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
1061           ENDIF
1062        ENDDO
1063
1064       
1065        ! If vertical heterogeneity, change fraction by volume as well
1066        IF (iflag_cloudth_vert>=3) THEN
1067          ctot_vol(1:klon,k)=min(max(ctot_vol(1:klon,k),0.),1.)
1068          rneblsvol(1:klon,k)=ctot_vol(1:klon,k)
1069        endif
1070
1071!        ENDIF
1072
1073     ELSE ! de IF (cpartiel)
1074        ! -------------------------
1075        ! P2.B> Nuage "tout ou rien"
1076        ! -------------------------
1077        ! note JLD: attention, rhcl non calcule. Ca peut avoir des consequences?
1078        DO i = 1, klon
1079           IF (zq(i)>zqs(i)) THEN
1080              rneb(i,k) = 1.0
1081           ELSE
1082              rneb(i,k) = 0.0
1083           ENDIF
1084           zcond(i) = MAX(0.0,zq(i)-zqs(i))/(1.+zdqs(i))
1085        ENDDO
1086     ENDIF ! de IF (cpartiel)
1087
1088     ! Mise a jour vapeur d'eau
1089     ! -------------------------
1090     DO i = 1, klon
1091        zq(i) = zq(i) - zcond(i)
1092        !         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD
1093     ENDDO
1094!AJ<
1095     ! ------------------------------------
1096     ! P2.C> Prise en compte de la Chaleur latente apres formation nuage
1097     ! -------------------------------------
1098     ! Variable calcule:
1099     !   zt : temperature de la maille
1100
1101     IF (.NOT. ice_thermo) THEN
1102        IF (iflag_fisrtilp_qsat<1) THEN
1103           DO i = 1, klon
1104             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
1105           ENDDO
1106        ELSE IF (iflag_fisrtilp_qsat>0) THEN
1107           DO i= 1, klon
1108    IF (fl_cor_ebil > 0) THEN
1109             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)+zcond(i)))
1110    else
1111             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i)))
1112    end if
1113           ENDDO
1114        endif
1115     ELSE
1116         IF (iflag_t_glace>=1) THEN
1117            CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
1118         endif
1119         IF (iflag_fisrtilp_qsat<1) THEN
1120           DO i = 1, klon
1121! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
1122!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
1123!                                     t_glace_max, exposant_glace)
1124              IF (iflag_t_glace==0) THEN
1125                    zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (RTT-t_glace_min_old)
1126                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
1127                    zfice(i) = zfice(i)**exposant_glace_old
1128              endif
1129              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) &
1130                       +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*zq(i))
1131           ENDDO
1132         else
1133           DO i=1, klon
1134! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
1135!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
1136!                                     t_glace_max, exposant_glace)
1137              IF (iflag_t_glace==0) THEN
1138                    zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (RTT-t_glace_min_old)
1139                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
1140                    zfice(i) = zfice(i)**exposant_glace_old
1141              endif
1142        IF (fl_cor_ebil > 0) THEN
1143              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) &
1144               * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)+zcond(i))) &
1145                      +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)+zcond(i)))
1146        else
1147              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i))) &
1148                      +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i)))
1149        end if
1150           ENDDO
1151         endif
1152!         PRINT*,zt(i),zrfl(i),zifl(i),'temp1'
1153       ENDIF
1154!>AJ
1155
1156     ! ----------------------------------------------------------------
1157     ! P3> Formation des precipitations
1158     ! ----------------------------------------------------------------
1159
1160     ! Partager l'eau condensee en precipitation et eau liquide nuageuse
1161
1162!<LTP
1163
1164IF (iflag_evap_prec==4) THEN
1165        !Partitionnement des precipitations venant du dessus en précipitations nuageuses
1166        !et précipitations ciel clair
1167
1168        !0) Calculate tot_zneb, la fraction nuageuse totale au-dessus du nuage
1169        !en supposant un recouvrement maximum aléatoire (voir Jakob and Klein, 2000)
1170       
1171        DO i=1, klon
1172                tot_znebn(i) = 1 - (1-tot_zneb(i))*(1 - max(rneb(i,k),zneb(i))) &
1173                        /(1-min(zneb(i),1-smallestreal))
1174                d_tot_zneb(i) = tot_znebn(i) - tot_zneb(i)
1175                tot_zneb(i) = tot_znebn(i)
1176
1177
1178                !1) Cloudy to clear air
1179                d_znebprecip_cld_clr(i) = znebprecipcld(i) - min(rneb(i,k),znebprecipcld(i))
1180                IF (znebprecipcld(i) > 0) THEN
1181                        d_zrfl_cld_clr(i) = d_znebprecip_cld_clr(i)/znebprecipcld(i)*zrflcld(i)
1182                        d_zifl_cld_clr(i) = d_znebprecip_cld_clr(i)/znebprecipcld(i)*ziflcld(i)
1183                ELSE
1184                        d_zrfl_cld_clr(i) = 0.
1185                        d_zifl_cld_clr(i) = 0.
1186                ENDIF
1187
1188                !2) Clear to cloudy air
1189                d_znebprecip_clr_cld(i) = max(0., min(znebprecipclr(i), rneb(i,k) &
1190                        - d_tot_zneb(i) - zneb(i)))
1191                IF (znebprecipclr(i) > 0) THEN
1192                        d_zrfl_clr_cld(i) = d_znebprecip_clr_cld(i)/znebprecipclr(i)*zrflclr(i)
1193                        d_zifl_clr_cld(i) = d_znebprecip_clr_cld(i)/znebprecipclr(i)*ziflclr(i)
1194                ELSE
1195                        d_zrfl_clr_cld(i) = 0.
1196                        d_zifl_clr_cld(i) = 0.
1197                ENDIF
1198
1199                !Update variables
1200                znebprecipcld(i) = znebprecipcld(i) + d_znebprecip_clr_cld(i) - d_znebprecip_cld_clr(i) 
1201                znebprecipclr(i) = znebprecipclr(i) + d_znebprecip_cld_clr(i) - d_znebprecip_clr_cld(i)
1202                zrflcld(i) = zrflcld(i) + d_zrfl_clr_cld(i) - d_zrfl_cld_clr(i)
1203                ziflcld(i) = ziflcld(i) + d_zifl_clr_cld(i) - d_zifl_cld_clr(i)
1204                zrflclr(i) = zrflclr(i) + d_zrfl_cld_clr(i) - d_zrfl_clr_cld(i)
1205                ziflclr(i) = ziflclr(i) + d_zifl_cld_clr(i) - d_zifl_clr_cld(i)
1206
1207        ENDDO
1208ENDIF
1209
1210!>LTP
1211
1212
1213
1214     ! Initialisation de zoliq (eau condensee moyenne dans la maille)
1215     DO i = 1, klon
1216        IF (rneb(i,k)>0.0) THEN
1217           zoliq(i) = zcond(i)
1218           zrho(i) = pplay(i,k) / zt(i) / RD
1219           zdz(i) = (paprs(i,k)-paprs(i,k+1)) / (zrho(i)*RG)
1220        ENDIF
1221     ENDDO
1222!AJ<
1223     IF (.NOT. ice_thermo) THEN
1224       IF (iflag_t_glace==0) THEN
1225         DO i = 1, klon
1226            IF (rneb(i,k)>0.0) THEN
1227               zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (273.13-t_glace_min_old)
1228               zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
1229               zfice(i) = zfice(i)**exposant_glace_old
1230!              zfice(i) = zfice(i)**nexpo
1231         !!      zfice(i)=0.
1232            ENDIF
1233         ENDDO
1234       ELSE ! of IF (iflag_t_glace.EQ.0)
1235         CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
1236!         DO i = 1, klon
1237!            IF (rneb(i,k).GT.0.0) THEN
1238! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
1239!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
1240!                                     t_glace_max, exposant_glace)
1241!            ENDIF
1242!         ENDDO
1243       ENDIF
1244     ENDIF
1245
1246     ! Calcul de radliq (eau condensee pour le rayonnement)
1247     ! Iteration pour realiser une moyenne de l'eau nuageuse lors de la precip
1248     ! Remarque: ce n'est donc pas l'eau restante en fin de precip mais une
1249     ! eau moyenne restante dans le nuage sur la duree du pas de temps qui est
1250     ! transmise au rayonnement;
1251     ! ----------------------------------------------------------------
1252     DO i = 1, klon
1253        IF (rneb(i,k)>0.0) THEN
1254           zneb(i) = MAX(rneb(i,k), seuil_neb)
1255     !      zt(i) = zt(i)+zcond(i)*zfice(i)*RLMLT/RCPD/(1.0+RVTMP2*zq(i)) 
1256!           PRINT*,zt(i),'fractionglace'
1257!>AJ
1258           radliq(i,k) = zoliq(i)/REAL(ninter+1)
1259        ENDIF
1260     ENDDO
1261
1262     DO n = 1, ninter
1263        DO i = 1, klon
1264           IF (rneb(i,k)>0.0) THEN
1265              zrhol(i) = zrho(i) * zoliq(i) / zneb(i)
1266              ! Initialization of zpluie and zice:
1267              zpluie=0
1268              zice=0
1269              IF (zneb(i)==seuil_neb) THEN
1270                 ztot = 0.0
1271              ELSE
1272                 !  quantite d'eau a eliminer: zchau (Sundqvist, 1978)
1273                 !  meme chose pour la glace: zfroi (Zender & Kiehl, 1997)
1274                 IF (ptconv(i,k)) THEN
1275                    zcl   =cld_lc_con
1276                    zct   =1./cld_tau_con
1277                    zfroi    = dtime/REAL(ninter)/zdz(i)*zoliq(i) &
1278                         *fallvc(zrhol(i)) * zfice(i)
1279                 else
1280                    zcl   =cld_lc_lsc
1281                    zct   =1./cld_tau_lsc
1282                    zfroi    = dtime/REAL(ninter)/zdz(i)*zoliq(i) &
1283                         *fallvs(zrhol(i)) * zfice(i)
1284                 endif
1285
1286                 ! si l'heterogeneite verticale est active, on utilise
1287                 ! la fraction volumique "vraie" plutot que la fraction
1288                 ! surfacique modifiee, qui est plus grande et reduit
1289                 ! sinon l'eau in-cloud de facon artificielle
1290                 IF ((iflag_cloudth_vert>=3).AND.(iflag_rain_incloud_vol==1)) THEN
1291                    zchau    = zct   *dtime/REAL(ninter) * zoliq(i) &
1292                         *(1.0-EXP(-(zoliq(i)/ctot_vol(i,k)/zcl   )**2)) *(1.-zfice(i))
1293                 else
1294                    zchau    = zct   *dtime/REAL(ninter) * zoliq(i) &
1295                         *(1.0-EXP(-(zoliq(i)/zneb(i)/zcl   )**2)) *(1.-zfice(i))
1296                 endif
1297!AJ<
1298                 IF (.NOT. ice_thermo) THEN
1299                   ztot    = zchau + zfroi
1300                 ELSE
1301                   zpluie = MIN(MAX(zchau,0.0),zoliq(i)*(1.-zfice(i)))
1302                   zice = MIN(MAX(zfroi,0.0),zoliq(i)*zfice(i))
1303                   ztot    = zpluie    + zice
1304                 ENDIF
1305!>AJ
1306                 ztot    = MAX(ztot   ,0.0)
1307              ENDIF
1308              ztot    = MIN(ztot,zoliq(i))
1309!AJ<
1310     !         zoliqp = MAX(zoliq(i)*(1.-zfice(i))-1.*zpluie   , 0.0)
1311     !         zoliqi = MAX(zoliq(i)*zfice(i)-1.*zice   , 0.0)
1312!JLD : les 2 variables zoliqp et zoliqi crorresponent a des pseudo precip
1313!      temporaires et ne doivent pas etre calcule (alors qu'elles le sont
1314!      si iflag_bergeron <> 2
1315!      A SUPPRIMER A TERME
1316              zoliqp(i) = MAX(zoliq(i)*(1.-zfice(i))-1.*zpluie  , 0.0)
1317              zoliqi(i) = MAX(zoliq(i)*zfice(i)-1.*zice  , 0.0)
1318              zoliq(i) = MAX(zoliq(i)-ztot   , 0.0)
1319!>AJ
1320              radliq(i,k) = radliq(i,k) + zoliq(i)/REAL(ninter+1)
1321           ENDIF
1322        ENDDO  ! i = 1,klon
1323     ENDDO     ! n = 1,ninter
1324
1325     ! ----------------------------------------------------------------
1326
1327     IF (.NOT. ice_thermo) THEN
1328       DO i = 1, klon
1329         IF (rneb(i,k)>0.0) THEN
1330           d_ql(i,k) = zoliq(i)
1331           zrfl(i) = zrfl(i)+ MAX(zcond(i)-zoliq(i),0.0) &
1332                * (paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1333         ENDIF
1334       ENDDO
1335     ELSE
1336
1337!CR&JYG<
1338! On prend en compte l'effet Bergeron dans les flux de precipitation :
1339! Si T < 0 C, alors les precipitations liquides sont converties en glace, ce qui
1340! provoque un accroissement de temperature DeltaT. L'effet de DeltaT sur le condensat
1341! et les precipitations est grossierement pris en compte en linearisant les equations
1342! et en approximant le processus de precipitation liquide par un processus a seuil.
1343! On fait l'hypothese que le condensat nuageux n'est pas modifié dans cette opération.
1344! Le condensat precipitant liquide est supprime (dans la limite DeltaT<273-T).
1345! Le condensat precipitant solide est augmente.
1346! La vapeur d'eau est augmentee.
1347
1348       IF ((iflag_bergeron == 2)) THEN
1349         DO i = 1, klon
1350           IF (rneb(i,k) > 0.0) THEN
1351             zqpreci(i)=(zcond(i)-zoliq(i))*zfice(i)
1352             zqprecl(i)=(zcond(i)-zoliq(i))*(1.-zfice(i))
1353           IF (fl_cor_ebil > 0) THEN
1354             zcp=RCPD*(1.0+RVTMP2*(zq(i)+zmqc(i)+zcond(i)))
1355             coef1 = rneb(i,k)*RLSTT/zcp*zdqsdT_raw(i)
1356!            Calcul de DT si toute les precips liquides congelent
1357             DeltaT = RLMLT*zqprecl(i) / (zcp*(1.+coef1))
1358!            On ne veut pas que T devienne superieur a la temp. de congelation.
1359!            donc que Delta > RTT-zt(i
1360             DeltaT = max( min( RTT-zt(i), DeltaT) , 0. )
1361             zt(i)      = zt(i)      + DeltaT
1362!            Eau vaporisee du fait de l'augmentation de T
1363             Deltaq = rneb(i,k)*zdqsdT_raw(i)*DeltaT
1364!            on reajoute cette eau vaporise a la vapeur et on l'enleve des precips
1365             zq(i) = zq(i) +  Deltaq
1366!            Les 3 max si dessous prtotegent uniquement des erreurs d'arrondies
1367             zcond(i)   = max( zcond(i)- Deltaq, 0. )
1368!            precip liquide qui congele ou qui s'evapore
1369             Deltaqprecl = -zcp/RLMLT*(1.+coef1)*DeltaT
1370             zqprecl(i) = max( zqprecl(i) + Deltaqprecl, 0. )
1371!            bilan eau glacee
1372             zqpreci(i) = max (zqpreci(i) - Deltaqprecl - Deltaq, 0.)
1373           else ! if (fl_cor_ebil .GT. 0)
1374!            ancien calcul
1375             zcp=RCPD*(1.0+RVTMP2*(zq(i)+zcond(i)))
1376             coef1 = RLMLT*zdqs(i)/RLVTT
1377             DeltaT = max( min( RTT-zt(i), RLMLT*zqprecl(i)/zcp/(1.+coef1) ) , 0.)
1378             zqpreci(i) = zqpreci(i) + zcp/RLMLT*DeltaT
1379             zqprecl(i) = max( zqprecl(i) - zcp/RLMLT*(1.+coef1)*DeltaT, 0. )
1380             zcond(i)   = max( zcond(i)   - zcp/RLVTT*zdqs(i)*DeltaT, 0. )
1381             zq(i)      = zq(i)      + zcp/RLVTT*zdqs(i)*DeltaT
1382             zt(i)      = zt(i)      + DeltaT
1383           end if ! if (fl_cor_ebil .GT. 0)
1384           ENDIF  ! rneb(i,k) .GT. 0.0
1385         ENDDO
1386         DO i = 1, klon
1387           IF (rneb(i,k)>0.0) THEN
1388             d_ql(i,k) = (1-zfice(i))*zoliq(i)
1389             d_qi(i,k) = zfice(i)*zoliq(i)
1390!<LTP
1391             IF (iflag_evap_prec == 4) THEN
1392                zrflcld(i) = zrflcld(i)+zqprecl(i) &
1393                 *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1394                ziflcld(i) = ziflcld(i)+ zqpreci(i) &
1395                      *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1396                znebprecipcld(i) = rneb(i,k)
1397                zrfl(i) = zrflcld(i) + zrflclr(i)
1398                zifl(i) = ziflcld(i) + ziflclr(i)       
1399!>LTP
1400             ELSE
1401                zrfl(i) = zrfl(i)+ zqprecl(i) &
1402                 *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1403                zifl(i) = zifl(i)+ zqpreci(i) &
1404                      *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
1405             
1406             ENDIF !iflag_evap_prec==4
1407
1408           ENDIF                     
1409         ENDDO
1410!!
1411       ELSE  ! iflag_bergeron
1412!>CR&JYG
1413!!
1414       DO i = 1, klon
1415         IF (rneb(i,k)>0.0) THEN
1416!CR on prend en compte la phase glace
1417!JLD inutile car on ne passe jamais ici si .NOT.ice_thermo
1418!           if (.NOT.ice_thermo) THEN
1419!           d_ql(i,k) = zoliq(i)
1420!           d_qi(i,k) = 0.
1421!           else
1422           d_ql(i,k) = (1-zfice(i))*zoliq(i)
1423           d_qi(i,k) = zfice(i)*zoliq(i)
1424!           endif
1425!<LTP
1426             IF (iflag_evap_prec == 4) THEN
1427                zrflcld(i) = zrflcld(i)+ MAX(zcond(i)*(1.-zfice(i))-zoliqp(i),0.0) &
1428                       *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1429                ziflcld(i) = ziflcld(i)+ MAX(zcond(i)*zfice(i)-zoliqi(i),0.0) &
1430                        *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
1431                znebprecipcld(i) = rneb(i,k)
1432                zrfl(i) = zrflcld(i) + zrflclr(i)
1433                zifl(i) = ziflcld(i) + ziflclr(i)       
1434!>LTP
1435             ELSE
1436!AJ<
1437                   zrfl(i) = zrfl(i)+ MAX(zcond(i)*(1.-zfice(i))-zoliqp(i),0.0) &
1438                       *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1439                        zifl(i) = zifl(i)+ MAX(zcond(i)*zfice(i)-zoliqi(i),0.0) &
1440                        *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
1441     !      zrfl(i) = zrfl(i)+  zpluie                         &
1442     !          *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
1443     !      zifl(i) = zifl(i)+  zice                    &
1444     !               *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)                                   
1445             ENDIF !iflag_evap_prec == 4             
1446
1447!CR : on prend en compte l'effet Bergeron dans les flux de precipitation
1448           IF ((iflag_bergeron == 1) .AND. (zt(i) < 273.15)) THEN
1449!<LTP
1450                IF (iflag_evap_prec == 4) THEN
1451                     zsolid = zrfl(i)
1452                     ziflclr(i) = ziflclr(i) +zrflclr(i)
1453                     ziflcld(i) = ziflcld(i) +zrflcld(i)
1454                     zifl(i) = ziflclr(i)+ziflcld(i)
1455                     zrflcld(i)=0.
1456                     zrflclr(i)=0.   
1457                     zrfl(i) = zrflclr(i)+zrflcld(i)
1458!>LTP
1459                ELSE
1460                     zsolid = zrfl(i)
1461                     zifl(i) = zifl(i)+zrfl(i)
1462                     zrfl(i) = 0.
1463                 ENDIF!iflag_evap_prec==4
1464
1465           IF (fl_cor_ebil > 0) THEN
1466              zt(i)=zt(i)+zsolid*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
1467                      *(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*(zq(i)+zmqc(i)))
1468           else
1469              zt(i)=zt(i)+zsolid*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
1470                      *(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*zq(i))
1471           end if
1472           ENDIF  ! (iflag_bergeron .EQ. 1) .AND. (zt(i) .LT. 273.15)
1473!RC   
1474
1475         ENDIF ! rneb(i,k).GT.0.0
1476       ENDDO
1477
1478       ENDIF  ! iflag_bergeron .EQ. 2
1479     ENDIF  ! .NOT. ice_thermo
1480
1481!CR: la fonte est faite au debut
1482!      IF (ice_thermo) THEN
1483!       DO i = 1, klon
1484!           zmelt = ((zt(i)-273.15)/(ztfondue-273.15))**2
1485!           zmelt = MIN(MAX(zmelt,0.),1.)
1486!           zrfl(i)=zrfl(i)+zmelt*zifl(i)
1487!           zifl(i)=zifl(i)*(1.-zmelt)
1488!           PRINT*,zt(i),'octavio1'
1489!           zt(i)=zt(i)-zifl(i)*zmelt*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
1490!                      *RLMLT/RCPD/(1.0+RVTMP2*zq(i))
1491!           PRINT*,zt(i),zrfl(i),zifl(i),zmelt,'octavio2'
1492!       ENDDO
1493!     ENDIF
1494
1495
1496!<LTP
1497
1498!Limitation de la fraction surfacique couverte par les précipitations lorsque l'intensité locale du flux de précipitation descend en
1499!dessous de rain_int_min
1500    IF (iflag_evap_prec==4) THEN
1501        DO i=1, klon
1502            IF (zrflclr(i) + ziflclr(i) > 0 ) THEN
1503               znebprecipclr(i) = min(znebprecipclr(i), max(zrflclr(i) &
1504                    /(znebprecipclr(i)*rain_int_min), &
1505                    ziflclr(i)/(znebprecipclr(i)*rain_int_min)))
1506            ELSE
1507                znebprecipclr(i)=0.
1508            ENDIF
1509
1510            IF (zrflcld(i) + ziflcld(i) > 0 ) THEN
1511               znebprecipcld(i) = min(znebprecipcld(i), &
1512                    max(zrflcld(i)/(znebprecipcld(i)*rain_int_min), &
1513                    ziflcld(i)/(znebprecipcld(i)*rain_int_min)))
1514            ELSE
1515                znebprecipcld(i)=0.
1516            ENDIF
1517       ENDDO
1518    ENDIf
1519
1520!>LTP
1521
1522
1523
1524
1525       
1526     IF (.NOT. ice_thermo) THEN
1527       DO i = 1, klon
1528         IF (zt(i)<RTT) THEN
1529           psfl(i,k)=zrfl(i)
1530         ELSE
1531           prfl(i,k)=zrfl(i)
1532         ENDIF
1533       ENDDO
1534     ELSE
1535     ! JAM*************************************************
1536     ! Revoir partie ci-dessous: a quoi servent psfl et prfl?
1537     ! *****************************************************
1538
1539       DO i = 1, klon
1540     !   IF (zt(i).LT.RTT) THEN
1541           psfl(i,k)=zifl(i)
1542     !   ELSE
1543           prfl(i,k)=zrfl(i)
1544     !   ENDIF
1545!>AJ
1546       ENDDO
1547     ENDIF
1548     ! ----------------------------------------------------------------
1549     ! Fin de formation des precipitations
1550     ! ----------------------------------------------------------------
1551
1552     ! Calculer les tendances de q et de t:
1553
1554     DO i = 1, klon
1555        d_q(i,k) = zq(i) - q(i,k)
1556        d_t(i,k) = zt(i) - t(i,k)
1557     ENDDO
1558
1559     !AA--------------- Calcul du lessivage stratiforme  -------------
1560
1561     DO i = 1,klon
1562
1563        IF(zcond(i)>zoliq(i)+1.e-10) THEN
1564         beta(i,k) = (zcond(i)-zoliq(i))/zcond(i)/dtime
1565        else
1566         beta(i,k) = 0.
1567        endif
1568        zprec_cond(i) = MAX(zcond(i)-zoliq(i),0.0) &
1569             * (paprs(i,k)-paprs(i,k+1))/RG
1570        IF (rneb(i,k)>0.0.AND.zprec_cond(i)>0.) THEN
1571           !AA lessivage nucleation LMD5 dans la couche elle-meme
1572          IF (iflag_t_glace==0) THEN
1573           IF (t(i,k) >= t_glace_min_old) THEN
1574              zalpha_tr = a_tr_sca(3)
1575           else
1576              zalpha_tr = a_tr_sca(4)
1577           endif
1578          ELSE ! of IF (iflag_t_glace.EQ.0)
1579           IF (t(i,k) >= t_glace_min) THEN
1580              zalpha_tr = a_tr_sca(3)
1581           else
1582              zalpha_tr = a_tr_sca(4)
1583           endif
1584          ENDIF
1585           zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
1586           pfrac_nucl(i,k)=pfrac_nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
1587           frac_nucl(i,k)= 1.-zneb(i)*zfrac_lessi
1588
1589           ! nucleation avec un facteur -1 au lieu de -0.5
1590           zfrac_lessi = 1. - EXP(-zprec_cond(i)/zneb(i))
1591           pfrac_1nucl(i,k)=pfrac_1nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
1592        ENDIF
1593
1594     ENDDO      ! boucle sur i
1595
1596     !AA Lessivage par impaction dans les couches en-dessous
1597     DO kk = k-1, 1, -1
1598        DO i = 1, klon
1599           IF (rneb(i,k)>0.0.AND.zprec_cond(i)>0.) THEN
1600             IF (iflag_t_glace==0) THEN
1601              IF (t(i,kk) >= t_glace_min_old) THEN
1602                 zalpha_tr = a_tr_sca(1)
1603              else
1604                 zalpha_tr = a_tr_sca(2)
1605              endif
1606             ELSE ! of IF (iflag_t_glace.EQ.0)
1607              IF (t(i,kk) >= t_glace_min) THEN
1608                 zalpha_tr = a_tr_sca(1)
1609              else
1610                 zalpha_tr = a_tr_sca(2)
1611              endif
1612             ENDIF
1613              zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
1614              pfrac_impa(i,kk)=pfrac_impa(i,kk)*(1.-zneb(i)*zfrac_lessi)
1615              frac_impa(i,kk)= 1.-zneb(i)*zfrac_lessi
1616           ENDIF
1617        ENDDO
1618     ENDDO
1619
1620     !AA===============================================================
1621     !                     FIN DE LA BOUCLE VERTICALE 
1622  end DO
1623
1624  !AA==================================================================
1625
1626  ! Pluie ou neige au sol selon la temperature de la 1ere couche
1627
1628!CR: si la thermo de la glace est active, on calcule zifl directement
1629  IF (.NOT.ice_thermo) THEN
1630  DO i = 1, klon
1631     IF ((t(i,1)+d_t(i,1)) < RTT) THEN
1632!AJ<
1633!        snow(i) = zrfl(i)
1634        snow(i) = zrfl(i)+zifl(i)
1635!>AJ
1636        zlh_solid(i) = RLSTT-RLVTT
1637     ELSE
1638        rain(i) = zrfl(i)
1639        zlh_solid(i) = 0.
1640     ENDIF
1641  ENDDO
1642
1643  ELSE
1644     DO i = 1, klon
1645        snow(i) = zifl(i)
1646        rain(i) = zrfl(i)
1647     ENDDO
1648   
1649   ENDIF
1650
1651  ! For energy conservation : when snow is present, the solification
1652  ! latent heat is considered.
1653!CR: si thermo de la glace, neige deja prise en compte
1654  IF (.NOT.ice_thermo) THEN
1655  DO k = 1, klev
1656     DO i = 1, klon
1657        zcpair=RCPD*(1.0+RVTMP2*(q(i,k)+d_q(i,k)))
1658        zmair(i)=(paprs(i,k)-paprs(i,k+1))/RG
1659        zm_solid = (prfl(i,k)-prfl(i,k+1)+psfl(i,k)-psfl(i,k+1))*dtime
1660        d_t(i,k) = d_t(i,k) + zlh_solid(i) *zm_solid / (zcpair*zmair(i))
1661     END DO
1662  END DO
1663  ENDIF
1664
1665  IF (ncoreczq>0) THEN
1666     WRITE(lunout,*)'WARNING : ZQ dans fisrtilp ',ncoreczq,' val < 1.e-15.'
1667  ENDIF
1668
1669
1670END SUBROUTINE fisrtilp
1671END MODULE lmdz_lscp_old
Note: See TracBrowser for help on using the repository browser.