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

Last change on this file since 2954 was 2945, checked in by jbmadeleine, 7 years ago
  • Added a new output called rneblsvol which is the cloud fraction by volume

computed in the thermals (see cloudth_vert in cloudth_mod.F90)

  • Added an option called iflag_rain_incloud_vol that computes the conversion

of cloud water to rain using the cloud fraction by volume instead of the cloud
fraction by area, which is larger and otherwise erroneously reduces the in-cloud
water content; iflag_rain_incloud_vol can only be used for iflag_cloudth_vert>=3

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