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

Last change on this file since 5411 was 5226, checked in by abarral, 3 months ago

Merge r5208 r5209

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