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

Last change on this file since 2492 was 2466, checked in by fhourdin, 9 years ago

Correction de la fonte des precipitations glacees. Jean-Yves Grandpeix.

  • 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: 38.5 KB
RevLine 
[524]1!
[1403]2! $Id: fisrtilp.F90 2466 2016-03-14 16:56:37Z emillour $
[524]3!
[1472]4!
5SUBROUTINE fisrtilp(dtime,paprs,pplay,t,q,ptconv,ratqs, &
[2086]6     d_t, d_q, d_ql, d_qi, rneb, radliq, rain, snow,          &
[1742]7     pfrac_impa, pfrac_nucl, pfrac_1nucl,               &
8     frac_impa, frac_nucl, beta,                        &
9     prfl, psfl, rhcl, zqta, fraca,                     &
[2236]10     ztv, zpspsk, ztla, zthl, iflag_cld_th,             &
[1849]11     iflag_ice_thermo)
[524]12
[1472]13  !
14  USE dimphy
[2109]15  USE icefrac_lsc_mod ! compute ice fraction (JBM 3/14)
[2311]16  USE print_control_mod, ONLY: prt_level, lunout
[1472]17  IMPLICIT none
18  !======================================================================
19  ! Auteur(s): Z.X. Li (LMD/CNRS)
20  ! Date: le 20 mars 1995
21  ! Objet: condensation et precipitation stratiforme.
22  !        schema de nuage
23  !======================================================================
24  !======================================================================
25  include "YOMCST.h"
26  include "fisrtilp.h"
[2006]27  include "nuage.h" ! JBM (3/14)
[1506]28
[1472]29  !
30  ! Arguments:
31  !
32  REAL dtime ! intervalle du temps (s)
33  REAL paprs(klon,klev+1) ! pression a inter-couche
34  REAL pplay(klon,klev) ! pression au milieu de couche
35  REAL t(klon,klev) ! temperature (K)
36  REAL q(klon,klev) ! humidite specifique (kg/kg)
37  REAL d_t(klon,klev) ! incrementation de la temperature (K)
38  REAL d_q(klon,klev) ! incrementation de la vapeur d'eau
39  REAL d_ql(klon,klev) ! incrementation de l'eau liquide
[2086]40  REAL d_qi(klon,klev) ! incrementation de l'eau glace
[1472]41  REAL rneb(klon,klev) ! fraction nuageuse
42  REAL radliq(klon,klev) ! eau liquide utilisee dans rayonnements
43  REAL rhcl(klon,klev) ! humidite relative en ciel clair
44  REAL rain(klon) ! pluies (mm/s)
45  REAL snow(klon) ! neige (mm/s)
46  REAL prfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
47  REAL psfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
48  REAL ztv(klon,klev)
49  REAL zqta(klon,klev),fraca(klon,klev)
50  REAL sigma1(klon,klev),sigma2(klon,klev)
51  REAL qltot(klon,klev),ctot(klon,klev)
52  REAL zpspsk(klon,klev),ztla(klon,klev)
53  REAL zthl(klon,klev)
[1849]54  REAL ztfondue, qsl, qsi
[1403]55
[1472]56  logical lognormale(klon)
[1849]57  logical ice_thermo
[1411]58
[1472]59  !AA
60  ! Coeffients de fraction lessivee : pour OFF-LINE
61  !
62  REAL pfrac_nucl(klon,klev)
63  REAL pfrac_1nucl(klon,klev)
64  REAL pfrac_impa(klon,klev)
65  !
66  ! Fraction d'aerosols lessivee par impaction et par nucleation
67  ! POur ON-LINE
68  !
69  REAL frac_impa(klon,klev)
70  REAL frac_nucl(klon,klev)
71  real zct      ,zcl
72  !AA
73  !
74  ! Options du programme:
75  !
76  REAL seuil_neb ! un nuage existe vraiment au-dela
77  PARAMETER (seuil_neb=0.001)
[524]78
[1472]79  INTEGER ninter ! sous-intervals pour la precipitation
80  INTEGER ncoreczq 
[2236]81  INTEGER iflag_cld_th
[1849]82  INTEGER iflag_ice_thermo
[1472]83  PARAMETER (ninter=5)
84  LOGICAL evap_prec ! evaporation de la pluie
85  PARAMETER (evap_prec=.TRUE.)
86  REAL ratqs(klon,klev) ! determine la largeur de distribution de vapeur
87  logical ptconv(klon,klev) ! determine la largeur de distribution de vapeur
[524]88
[1472]89  real zpdf_sig(klon),zpdf_k(klon),zpdf_delta(klon)
90  real Zpdf_a(klon),zpdf_b(klon),zpdf_e1(klon),zpdf_e2(klon)
91  real erf   
92  REAL qcloud(klon)
93  !
94  LOGICAL cpartiel ! condensation partielle
95  PARAMETER (cpartiel=.TRUE.)
96  REAL t_coup
97  PARAMETER (t_coup=234.0)
98  !
99  ! Variables locales:
100  !
101  INTEGER i, k, n, kk
[1901]102  REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5 
103  REAL Tbef(klon),qlbef(klon),DT(klon),num,denom
104  LOGICAL convergence(klon)
105  REAL DDT0
106  PARAMETER (DDT0=.01)
[2086]107  INTEGER n_i(klon), iter
108  REAL cste
[1901]109 
[1849]110  REAL zrfl(klon), zrfln(klon), zqev, zqevt
111  REAL zifl(klon), zifln(klon), zqev0,zqevi, zqevti
112  REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq
113  REAL zoliqp(klon), zoliqi(klon)
[2006]114  REAL zt(klon)
115! JBM (3/14) nexpo is replaced by exposant_glace
116! REAL nexpo ! exponentiel pour glace/eau
117! INTEGER, PARAMETER :: nexpo=6
118  INTEGER exposant_glace_old
119  REAL t_glace_min_old
[1472]120  REAL zdz(klon),zrho(klon),ztot      , zrhol(klon)
121  REAL zchau      ,zfroi      ,zfice(klon),zneb(klon)
[1849]122  REAL zmelt, zpluie, zice, zcondold
123  PARAMETER (ztfondue=278.15)
[2086]124  REAL dzfice(klon)
[2415]125  REAL zsolid
[2466]126!!!!
127!  Variables pour Bergeron
128  REAL zcp, coef1, DeltaT
129  REAL zqpreci(klon), zqprecl(klon)
[1472]130  !
131  LOGICAL appel1er
132  SAVE appel1er
133  !$OMP THREADPRIVATE(appel1er)
134  !
135  !---------------------------------------------------------------
136  !
137  !AA Variables traceurs:
138  !AA  Provisoire !!! Parametres alpha du lessivage
139  !AA  A priori on a 4 scavenging # possibles
140  !
141  REAL a_tr_sca(4)
142  save a_tr_sca
143  !$OMP THREADPRIVATE(a_tr_sca)
144  !
145  ! Variables intermediaires
146  !
147  REAL zalpha_tr
148  REAL zfrac_lessi
149  REAL zprec_cond(klon)
150  !AA
[1742]151! RomP >>> 15 nov 2012
152  REAL   beta(klon,klev) ! taux de conversion de l'eau cond
153! RomP <<<
[1472]154  REAL zmair, zcpair, zcpeau
155  !     Pour la conversion eau-neige
156  REAL zlh_solid(klon), zm_solid
157  !IM
158  !ym      INTEGER klevm1
159  !---------------------------------------------------------------
160  !
161  ! Fonctions en ligne:
162  !
163  REAL fallvs,fallvc ! vitesse de chute pour crystaux de glace
164  REAL zzz
165  include "YOETHF.h"
166  include "FCTTRE.h"
167  fallvc (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_con
168  fallvs (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_lsc
169  !
170  DATA appel1er /.TRUE./
171  !ym
[2086]172!CR: pour iflag_ice_thermo=2, on active que la convection
173!  ice_thermo = iflag_ice_thermo .GE. 1
174   ice_thermo = (iflag_ice_thermo .EQ. 1).OR.(iflag_ice_thermo .GE. 3)
[1472]175  zdelq=0.0
[524]176
[1506]177  if (prt_level>9)write(lunout,*)'NUAGES4 A. JAM'
[1472]178  IF (appel1er) THEN
179     !
[1575]180     WRITE(lunout,*) 'fisrtilp, ninter:', ninter
181     WRITE(lunout,*) 'fisrtilp, evap_prec:', evap_prec
182     WRITE(lunout,*) 'fisrtilp, cpartiel:', cpartiel
[1472]183     IF (ABS(dtime/REAL(ninter)-360.0).GT.0.001) THEN
[1575]184        WRITE(lunout,*) 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime
185        WRITE(lunout,*) 'Je prefere un sous-intervalle de 6 minutes'
[1472]186        !         CALL abort
187     ENDIF
188     appel1er = .FALSE.
189     !
190     !AA initialiation provisoire
191     a_tr_sca(1) = -0.5
192     a_tr_sca(2) = -0.5
193     a_tr_sca(3) = -0.5
194     a_tr_sca(4) = -0.5
195     !
196     !AA Initialisation a 1 des coefs des fractions lessivees
197     !
198     !cdir collapse
199     DO k = 1, klev
200        DO i = 1, klon
201           pfrac_nucl(i,k)=1.
202           pfrac_1nucl(i,k)=1.
203           pfrac_impa(i,k)=1.
[1742]204           beta(i,k)=0.  !RomP initialisation
[1472]205        ENDDO
206     ENDDO
[524]207
[1472]208  ENDIF          !  test sur appel1er
209  !
210  !MAf Initialisation a 0 de zoliq
211  !      DO i = 1, klon
212  !         zoliq(i)=0.
213  !      ENDDO
214  ! Determiner les nuages froids par leur temperature
215  !  nexpo regle la raideur de la transition eau liquide / eau glace.
216  !
[2086]217!CR: on est oblige de definir des valeurs fisrt car les valeurs de newmicro ne sont pas les memes par defaut
[2006]218  IF (iflag_t_glace.EQ.0) THEN
219!   ztglace = RTT - 15.0
220    t_glace_min_old = RTT - 15.0
221    !AJ<
222    IF (ice_thermo) THEN
223!     nexpo = 2
224      exposant_glace_old = 2
225    ELSE
226!     nexpo = 6
227      exposant_glace_old = 6
228    ENDIF
[2086]229   
[1849]230  ENDIF
[2006]231 
[1849]232!!  RLVTT = 2.501e6 ! pas de redefinition des constantes physiques (jyg)
233!!  RLSTT = 2.834e6 ! pas de redefinition des constantes physiques (jyg)
234!>AJ
[1472]235  !cc      nexpo = 1
236  !
237  ! Initialiser les sorties:
238  !
239  !cdir collapse
240  DO k = 1, klev+1
241     DO i = 1, klon
242        prfl(i,k) = 0.0
243        psfl(i,k) = 0.0
244     ENDDO
245  ENDDO
[524]246
[1472]247  !cdir collapse
248  DO k = 1, klev
249     DO i = 1, klon
250        d_t(i,k) = 0.0
251        d_q(i,k) = 0.0
252        d_ql(i,k) = 0.0
[2086]253        d_qi(i,k) = 0.0
[1472]254        rneb(i,k) = 0.0
255        radliq(i,k) = 0.0
256        frac_nucl(i,k) = 1.
257        frac_impa(i,k) = 1.
258     ENDDO
259  ENDDO
260  DO i = 1, klon
261     rain(i) = 0.0
262     snow(i) = 0.0
263     zoliq(i)=0.
264     !     ENDDO
265     !
266     ! Initialiser le flux de precipitation a zero
267     !
268     !     DO i = 1, klon
269     zrfl(i) = 0.0
[1849]270     zifl(i) = 0.0
[1472]271     zneb(i) = seuil_neb
272  ENDDO
273  !
274  !
275  !AA Pour plus de securite
[524]276
[1472]277  zalpha_tr   = 0.
278  zfrac_lessi = 0.
[524]279
[1472]280  !AA----------------------------------------------------------
281  !
282  ncoreczq=0
283  ! Boucle verticale (du haut vers le bas)
284  !
285  !IM : klevm1
286  !ym      klevm1=klev-1
287  DO k = klev, 1, -1
288     !
289     !AA----------------------------------------------------------
290     !
291     DO i = 1, klon
292        zt(i)=t(i,k)
293        zq(i)=q(i,k)
294     ENDDO
295     !
296     ! Calculer la varition de temp. de l'air du a la chaleur sensible
297     ! transporter par la pluie.
298     ! Il resterait a rajouter cet effet de la chaleur sensible sur les
299     ! flux de surface, du a la diff. de temp. entre le 1er niveau et la
300     ! surface.
301     !
302     IF(k.LE.klevm1) THEN         
303        DO i = 1, klon
304           !IM
305           zmair=(paprs(i,k)-paprs(i,k+1))/RG
306           zcpair=RCPD*(1.0+RVTMP2*zq(i))
307           zcpeau=RCPD*RVTMP2
308           zt(i) = ( (t(i,k+1)+d_t(i,k+1))*zrfl(i)*dtime*zcpeau &
309                + zmair*zcpair*zt(i) ) &
310                / (zmair*zcpair + zrfl(i)*dtime*zcpeau)
311           !     C        WRITE (6,*) 'cppluie ', zt(i)-(t(i,k+1)+d_t(i,k+1))
312        ENDDO
313     ENDIF
314     !
315     !
316     ! Calculer l'evaporation de la precipitation
317     !
[524]318
319
[1849]320     ! Calculer l'evaporation de la precipitation
321     !
322
323
[1472]324     IF (evap_prec) THEN
325        DO i = 1, klon
[1849]326!AJ<
327!!           IF (zrfl(i) .GT.0.) THEN
328           IF (zrfl(i)+zifl(i).GT.0.) THEN
329!>AJ
[1472]330              IF (thermcep) THEN
331                 zdelta=MAX(0.,SIGN(1.,RTT-zt(i)))
332                 zqs(i)= R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
333                 zqs(i)=MIN(0.5,zqs(i))
334                 zcor=1./(1.-RETV*zqs(i))
335                 zqs(i)=zqs(i)*zcor
336              ELSE
337                 IF (zt(i) .LT. t_coup) THEN
338                    zqs(i) = qsats(zt(i)) / pplay(i,k)
339                 ELSE
340                    zqs(i) = qsatl(zt(i)) / pplay(i,k)
341                 ENDIF
342              ENDIF
[1849]343           ENDIF ! (zrfl(i)+zifl(i).GT.0.)
344        ENDDO
345!AJ<
346       IF (.NOT. ice_thermo) THEN
347        DO i = 1, klon
348!AJ<
349!!           IF (zrfl(i) .GT.0.) THEN
350           IF (zrfl(i)+zifl(i).GT.0.) THEN
351!>AJ
352                zqev = MAX (0.0, (zqs(i)-zq(i))*zneb(i) )
353                zqevt = coef_eva * (1.0-zq(i)/zqs(i)) * SQRT(zrfl(i)) &
354                     * (paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
355                zqevt = MAX(0.0,MIN(zqevt,zrfl(i))) &
356                     * RG*dtime/(paprs(i,k)-paprs(i,k+1))
357                zqev = MIN (zqev, zqevt)
358                zrfln(i) = zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1)) &
359                     /RG/dtime
360       
361                ! pour la glace, on ré-évapore toute la précip dans la
362                ! couche du dessous
363                ! la glace venant de la couche du dessus est simplement
364                ! dans la couche du dessous.
365       
366                IF (zt(i) .LT. t_coup.and.reevap_ice) zrfln(i)=0.
367       
368                zq(i) = zq(i) - (zrfln(i)-zrfl(i)) &
369                     * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
370                zt(i) = zt(i) + (zrfln(i)-zrfl(i)) &
371                     * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
372                     * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
373                zrfl(i) = zrfln(i)
374                zifl(i) = 0.
375           ENDIF ! (zrfl(i)+zifl(i).GT.0.)
376        ENDDO
377!
378       ELSE ! (.NOT. ice_thermo)
379!
380        DO i = 1, klon
381!AJ<
382!!           IF (zrfl(i) .GT.0.) THEN
383           IF (zrfl(i)+zifl(i).GT.0.) THEN
384!>AJ
385     !JAM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
386     ! Modification de l'évaporation avec la glace
387     ! Différentiation entre précipitation liquide et solide
388     ! On suppose que coef_evai=2*coef_eva
389     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
390     
391         zqev0 = MAX (0.0, (zqs(i)-zq(i))*zneb(i) )
392     !    zqev0 = MAX (0.0, zqs(i)-zq(i) )
[524]393
[1849]394     !JAM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
395     ! On différencie qsat pour l'eau et la glace
396     ! Si zdelta=1. --> glace
397     ! Si zdelta=0. --> eau liquide
398     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
399         
400         qsl= R2ES*FOEEW(zt(i),0.)/pplay(i,k)
401         qsl= MIN(0.5,qsl)
402         zcor= 1./(1.-RETV*qsl)
403         qsl= qsl*zcor
404         
405         zqevt = 1.*coef_eva*(1.0-zq(i)/qsl)*SQRT(zrfl(i)) &
406              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
407         zqevt = MAX(0.0,MIN(zqevt,zrfl(i))) &
408              *RG*dtime/(paprs(i,k)-paprs(i,k+1))
[524]409
[1849]410         qsi= R2ES*FOEEW(zt(i),1.)/pplay(i,k)
411         qsi= MIN(0.5,qsi)
412         zcor= 1./(1.-RETV*qsi)
413         qsi= qsi*zcor
[1472]414
[1849]415         zqevti = 1.*coef_eva*(1.0-zq(i)/qsi)*SQRT(zifl(i)) &
416              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
417         zqevti = MAX(0.0,MIN(zqevti,zifl(i))) &
418              *RG*dtime/(paprs(i,k)-paprs(i,k+1))   
419
420             
421     !JAM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
422     ! Vérification sur l'évaporation
423     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
424     
425         IF (zqevt+zqevti.GT.zqev0) THEN
426                  zqev=zqev0*zqevt/(zqevt+zqevti)
427                  zqevi=zqev0*zqevti/(zqevt+zqevti)
428             
429         ELSE
430             IF (zqevt+zqevti.GT.0.) THEN
431                  zqev=MIN(zqev0*zqevt/(zqevt+zqevti),zqevt)
432                  zqevi=MIN(zqev0*zqevti/(zqevt+zqevti),zqevti)
433             ELSE
434             zqev=0.
435             zqevi=0.
436             ENDIF
437         ENDIF
438     
439         zrfln(i) = Max(0.,zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1)) &
440                                 /RG/dtime)
441         zifln(i) = Max(0.,zifl(i) - zqevi*(paprs(i,k)-paprs(i,k+1)) &
442                                 /RG/dtime)
443         
444     ! Pour la glace, on révapore toute la précip dans la couche du dessous
445     ! la glace venant de la couche du dessus est simplement dans la couche
446     ! du dessous.
447     
448     !    IF (zt(i) .LT. t_coup.and.reevap_ice) zrfln(i)=0.
449!         print*,zrfl(i),zrfln(i),zqevt,zqevti,RLMLT,'fluxdeprecip'
450         zq(i) = zq(i) - (zrfln(i)+zifln(i)-zrfl(i)-zifl(i)) &
451                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime
452         zt(i) = zt(i) + (zrfln(i)-zrfl(i)) &
453                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
454                  * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) &
455                  + (zifln(i)-zifl(i)) &
456                  * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime &
457                  * RLSTT/RCPD/(1.0+RVTMP2*zq(i))
458     
459         zrfl(i) = zrfln(i)
460         zifl(i) = zifln(i)
461
[2086]462!CR ATTENTION: deplacement de la fonte de la glace
[2466]463!jyg : Bug !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! jyg
464!!!        zmelt = ((zt(i)-273.15)/(ztfondue-273.15))**2  !!!!!!!!! jyg
465!jyg : Bug !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! jyg
466           zmelt = ((zt(i)-273.15)/(ztfondue-273.15))             ! jyg
[2086]467           zmelt = MIN(MAX(zmelt,0.),1.)
468           zrfl(i)=zrfl(i)+zmelt*zifl(i)
469           zifl(i)=zifl(i)*(1.-zmelt)
470!           print*,zt(i),'octavio1'
471           zt(i)=zt(i)-zifl(i)*zmelt*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
472                      *RLMLT/RCPD/(1.0+RVTMP2*zq(i))
473!           print*,zt(i),zrfl(i),zifl(i),zmelt,'octavio2'
474!fin CR
475
476
477
[1849]478           ENDIF ! (zrfl(i)+zifl(i).GT.0.)
[1472]479        ENDDO
[1849]480
481      ENDIF ! (.NOT. ice_thermo)
482     
483     ENDIF ! (evap_prec)
[1472]484     !
485     ! Calculer Qs et L/Cp*dQs/dT:
486     !
487     IF (thermcep) THEN
488        DO i = 1, klon
[524]489           zdelta = MAX(0.,SIGN(1.,RTT-zt(i)))
490           zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
491           zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))
492           zqs(i) = R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)
493           zqs(i) = MIN(0.5,zqs(i))
494           zcor = 1./(1.-RETV*zqs(i))
495           zqs(i) = zqs(i)*zcor
496           zdqs(i) = FOEDE(zt(i),zdelta,zcvm5,zqs(i),zcor)
[1472]497        ENDDO
498     ELSE
499        DO i = 1, klon
500           IF (zt(i).LT.t_coup) THEN
501              zqs(i) = qsats(zt(i))/pplay(i,k)
502              zdqs(i) = dqsats(zt(i),zqs(i))
503           ELSE
504              zqs(i) = qsatl(zt(i))/pplay(i,k)
505              zdqs(i) = dqsatl(zt(i),zqs(i))
506           ENDIF
507        ENDDO
508     ENDIF
509     !
510     ! Determiner la condensation partielle et calculer la quantite
511     ! de l'eau condensee:
512     !
[1901]513!verification de la valeur de iflag_fisrtilp_qsat pour iflag_ice_thermo=1
[2086]514!       if ((iflag_ice_thermo.eq.1).and.(iflag_fisrtilp_qsat.ne.0)) then
515!         write(*,*) " iflag_ice_thermo==1 requires iflag_fisrtilp_qsat==0", &
516!        " but iflag_fisrtilp_qsat=",iflag_fisrtilp_qsat, ". Might as well stop here."
517!         stop
518!       endif
[1403]519
[1472]520     IF (cpartiel) THEN
[524]521
[1472]522        !        print*,'Dans partiel k=',k
523        !
524        !   Calcul de l'eau condensee et de la fraction nuageuse et de l'eau
525        !   nuageuse a partir des PDF de Sandrine Bony.
526        !   rneb  : fraction nuageuse
527        !   zqn   : eau totale dans le nuage
528        !   zcond : eau condensee moyenne dans la maille.
529        !  on prend en compte le réchauffement qui diminue la partie
530        ! condensee
531        !
532        !   Version avec les raqts
[524]533
[1472]534        if (iflag_pdf.eq.0) then
[524]535
536           do i=1,klon
[1472]537              zdelq = min(ratqs(i,k),0.99) * zq(i)
538              rneb(i,k) = (zq(i)+zdelq-zqs(i)) / (2.0*zdelq)
539              zqn(i) = (zq(i)+zdelq+zqs(i))/2.0
[524]540           enddo
541
[1472]542        else
543           !
544           !   Version avec les nouvelles PDFs.
[524]545           do i=1,klon
546              if(zq(i).lt.1.e-15) then
[1472]547                 ncoreczq=ncoreczq+1
548                 zq(i)=1.e-15
[524]549              endif
[1472]550           enddo
[1403]551
[2236]552           if (iflag_cld_th>=5) then
[1403]553
[1472]554              call cloudth(klon,klev,k,ztv, &
555                   zq,zqta,fraca, &
556                   qcloud,ctot,zpspsk,paprs,ztla,zthl, &
557                   ratqs,zqs,t)
[1403]558
[1472]559              do i=1,klon
[1403]560                 rneb(i,k)=ctot(i,k)
561                 zqn(i)=qcloud(i)
[1472]562              enddo
[1403]563
[1472]564           endif
565
[2236]566           if (iflag_cld_th <= 4) then
[1472]567              lognormale = .true.
[2236]568           elseif (iflag_cld_th >= 6) then
[1472]569              ! lognormale en l'absence des thermiques
570              lognormale = fraca(:,k) < 1e-10
571           else
[2236]572              ! Dans le cas iflag_cld_th=5, on prend systématiquement la
[1472]573              ! bi-gaussienne
574              lognormale = .false.
575           end if
576
[2086]577!CR: variation de qsat avec T en présence de glace ou non
578!initialisations
[1472]579           do i=1,klon
[2086]580              DT(i) = 0.
581              n_i(i)=0
[1901]582              Tbef(i)=zt(i)
[2086]583              qlbef(i)=0.
584           enddo
585
586
587!Boucle iterative: ATTENTION, l'option -1 n'est plus activable ici
588           if (iflag_fisrtilp_qsat.ge.0) then
589             do iter=1,iflag_fisrtilp_qsat+1
590               
591               do i=1,klon
592!                 do while ((abs(DT(i)).gt.DDT0).or.(n_i(i).eq.0))
593                 convergence(i)=abs(DT(i)).gt.DDT0
594                 if ((convergence(i).or.(n_i(i).eq.0)).and.lognormale(i)) then
595                 Tbef(i)=Tbef(i)+DT(i)
596                 if (.not.ice_thermo) then   
597                    zdelta = MAX(0.,SIGN(1.,RTT-Tbef(i)))
598                 else
599                    if (iflag_t_glace.eq.0) then
600                    zdelta = MAX(0.,SIGN(1.,t_glace_min_old-Tbef(i)))
601                    else if (iflag_t_glace.eq.1) then
602                    zdelta = MAX(0.,SIGN(1.,t_glace_min-Tbef(i)))
603                    endif
604                 endif
605                 zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
606                 zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))
607                 zqs(i) = R2ES*FOEEW(Tbef(i),zdelta)/pplay(i,k)
608                 zqs(i) = MIN(0.5,zqs(i))
609                 zcor = 1./(1.-RETV*zqs(i))
610                 zqs(i) = zqs(i)*zcor
611                 zdqs(i) = FOEDE(Tbef(i),zdelta,zcvm5,zqs(i),zcor)
[1472]612                 zpdf_sig(i)=ratqs(i,k)*zq(i)
613                 zpdf_k(i)=-sqrt(log(1.+(zpdf_sig(i)/zq(i))**2))
614                 zpdf_delta(i)=log(zq(i)/zqs(i))
615                 zpdf_a(i)=zpdf_delta(i)/(zpdf_k(i)*sqrt(2.))
616                 zpdf_b(i)=zpdf_k(i)/(2.*sqrt(2.))
617                 zpdf_e1(i)=zpdf_a(i)-zpdf_b(i)
618                 zpdf_e1(i)=sign(min(abs(zpdf_e1(i)),5.),zpdf_e1(i))
619                 zpdf_e1(i)=1.-erf(zpdf_e1(i))
620                 zpdf_e2(i)=zpdf_a(i)+zpdf_b(i)
621                 zpdf_e2(i)=sign(min(abs(zpdf_e2(i)),5.),zpdf_e2(i))
622                 zpdf_e2(i)=1.-erf(zpdf_e2(i))
[1901]623             
624                 if (zpdf_e1(i).lt.1.e-10) then
625                    rneb(i,k)=0.
626                    zqn(i)=zqs(i)
627                 else
628                    rneb(i,k)=0.5*zpdf_e1(i)
629                    zqn(i)=zq(i)*zpdf_e2(i)/zpdf_e1(i)
630                 endif
631
[2086]632                 endif !convergence
633               enddo ! boucle en i
634
635                 if (.not. ice_thermo) then
636
637                 do i=1,klon
638                 if ((convergence(i).or.(n_i(i).eq.0)).and.lognormale(i)) then
639
[1901]640                 qlbef(i)=max(0.,zqn(i)-zqs(i))
641                 num=-Tbef(i)+zt(i)+rneb(i,k)*RLVTT/RCPD/(1.0+RVTMP2*zq(i))*qlbef(i)
642                 denom=1.+rneb(i,k)*zdqs(i)
643                 DT(i)=num/denom
[2086]644                 n_i(i)=n_i(i)+1
645                 endif
646                 enddo
[1403]647
[1472]648                 else
[2086]649
650!calcul de la fraction de glace
651!CR: on utilise la nouvelle fonction de JBM pour l ancien calcul
652!                 zfice(i) = icefrac_lsc(Tbef(i), t_glace_min, &
653!                                     t_glace_max, exposant_glace)
654!                 zfice(i) = 1.0 - (Tbef(i)-ztglace) / (RTT-ztglace)
655!                 zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
656!                 zfice(i) = zfice(i)**nexpo
657                 if (iflag_t_glace.eq.1) then
[2109]658                 CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
[1472]659                 endif
[1411]660
[2086]661                 do i=1,klon
662                 if ((convergence(i).or.(n_i(i).eq.0)).and.lognormale(i)) then
663                 
664                 if (iflag_t_glace.eq.0) then
665                    zfice(i) = 1.0 - (Tbef(i)-t_glace_min_old) / (RTT-t_glace_min_old)
666                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
667                    zfice(i) = zfice(i)**exposant_glace_old
668                    dzfice(i)= exposant_glace_old * zfice(i)**(exposant_glace_old-1) / (t_glace_min_old - RTT)
[1901]669                 endif
[2086]670                 
671                 if (iflag_t_glace.eq.1) then
672                 dzfice(i)= exposant_glace * zfice(i)**(exposant_glace-1) / (t_glace_min - t_glace_max)
673                 endif
674               
675                 if ((zfice(i).eq.0).or.(zfice(i).eq.1)) then
676                    dzfice(i)=0.
677                 endif
[1411]678
[2086]679                 if (zfice(i).lt.1) then
680                    cste=RLVTT
681                 else
682                    cste=RLSTT
683                 endif
684
685                 qlbef(i)=max(0.,zqn(i)-zqs(i))
686                 num=-Tbef(i)+zt(i)+rneb(i,k)*((1-zfice(i))*RLVTT+zfice(i)*RLSTT)/RCPD/(1.0+RVTMP2*zq(i))*qlbef(i)
687                 denom=1.+rneb(i,k)*((1-zfice(i))*RLVTT+zfice(i)*RLSTT)/cste*zdqs(i) &
688                         -(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*zq(i))*rneb(i,k)*qlbef(i)*dzfice(i)
689                 DT(i)=num/denom
690                 n_i(i)=n_i(i)+1
691
692                 endif ! fin convergence
693                 enddo ! fin boucle i
694
695                 endif !ice_thermo
696
697!                 endif
698!               enddo
699 
700         
701             enddo
[1901]702           endif
[524]703
[1901]704
[524]705        endif ! iflag_pdf
706
[2086]707
708!        if (iflag_fisrtilp_qsat.eq.-1) then
709!CR: ATTENTION option fausse mais a existe: pour la re-activer, prendre iflag_fisrtilp_qsat=0 et activer les lignes suivantes:
710       IF (1.eq.0) THEN
711       DO i=1,klon
[1146]712           IF (rneb(i,k) .LE. 0.0) THEN
713              zqn(i) = 0.0
714              rneb(i,k) = 0.0
715              zcond(i) = 0.0
716              rhcl(i,k)=zq(i)/zqs(i)
717           ELSE IF (rneb(i,k) .GE. 1.0) THEN
718              zqn(i) = zq(i)
[1901]719              rneb(i,k) = 1.0                 
720              zcond(i) = MAX(0.0,zqn(i)-zqs(i))/(1+zdqs(i))
[1146]721              rhcl(i,k)=1.0
722           ELSE
[1901]723              zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1+zdqs(i))
[1146]724              rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
725           ENDIF
726        ENDDO
[2086]727        ENDIF
[1901]728
[2086]729!        ELSE
[1901]730
731        DO i=1,klon
732           IF (rneb(i,k) .LE. 0.0) THEN
733              zqn(i) = 0.0
734              rneb(i,k) = 0.0
735              zcond(i) = 0.0
736              rhcl(i,k)=zq(i)/zqs(i)
737           ELSE IF (rneb(i,k) .GE. 1.0) THEN
738              zqn(i) = zq(i)
739              rneb(i,k) = 1.0
740              zcond(i) = MAX(0.0,zqn(i)-zqs(i))
741              rhcl(i,k)=1.0
742           ELSE
743              zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)
744              rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
745           ENDIF
746        ENDDO
747
748
[2086]749!        ENDIF
[1901]750
[1472]751        !         do i=1,klon
752        !            IF (rneb(i,k) .LE. 0.0) zqn(i) = 0.0
753        !            IF (rneb(i,k) .GE. 1.0) zqn(i) = zq(i)
754        !            rneb(i,k) = MAX(0.0,MIN(1.0,rneb(i,k)))
755        !c           zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1.+zdqs(i))
756        !c  On ne divise pas par 1+zdqs pour forcer a avoir l'eau predite par
757        !c  la convection.
758        !c  ATTENTION !!! Il va falloir verifier tout ca.
759        !            zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)
760        !c           print*,'ZDQS ',zdqs(i)
761        !c--Olivier
762        !            rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)
763        !            IF (rneb(i,k) .LE. 0.0) rhcl(i,k)=zq(i)/zqs(i)
764        !            IF (rneb(i,k) .GE. 1.0) rhcl(i,k)=1.0
765        !c--fin
766        !           ENDDO
767     ELSE
768        DO i = 1, klon
769           IF (zq(i).GT.zqs(i)) THEN
770              rneb(i,k) = 1.0
771           ELSE
772              rneb(i,k) = 0.0
773           ENDIF
774           zcond(i) = MAX(0.0,zq(i)-zqs(i))/(1.+zdqs(i))
775        ENDDO
776     ENDIF
777     !
778     DO i = 1, klon
779        zq(i) = zq(i) - zcond(i)
780        !         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD
781     ENDDO
[1849]782!AJ<
783     IF (.NOT. ice_thermo) THEN
[1901]784        if (iflag_fisrtilp_qsat.lt.1) then
785           DO i = 1, klon
786             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i))
787           ENDDO
788        else if (iflag_fisrtilp_qsat.gt.0) then
789           DO i= 1, klon
790             zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i)))
791           ENDDO
792        endif
[1849]793     ELSE
[2086]794         if (iflag_t_glace.eq.1) then
[2109]795            CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
[1901]796         endif
[2006]797         if (iflag_fisrtilp_qsat.lt.1) then
798           DO i = 1, klon
[2109]799! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
[2086]800!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
801!                                     t_glace_max, exposant_glace)
802              if (iflag_t_glace.eq.0) then
[2223]803                    zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (RTT-t_glace_min_old)
[2086]804                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
805                    zfice(i) = zfice(i)**exposant_glace_old
806              endif
[2006]807              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) &
808                       +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*zq(i))
809           ENDDO
810         else
811           DO i=1, klon
[2109]812! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
[2086]813!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
814!                                     t_glace_max, exposant_glace)
815              if (iflag_t_glace.eq.0) then
[2223]816                    zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (RTT-t_glace_min_old)
[2086]817                    zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
818                    zfice(i) = zfice(i)**exposant_glace_old
819              endif
[2006]820              zt(i) = zt(i) + (1.-zfice(i))*zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i))) &
821                       +zfice(i)*zcond(i) * RLSTT/RCPD/(1.0+RVTMP2*(zq(i)+zcond(i)))
822           ENDDO
823         endif
824!         print*,zt(i),zrfl(i),zifl(i),'temp1'
825       ENDIF
[1849]826!>AJ
[1472]827     !
828     ! Partager l'eau condensee en precipitation et eau liquide nuageuse
829     !
830     DO i = 1, klon
831        IF (rneb(i,k).GT.0.0) THEN
832           zoliq(i) = zcond(i)
833           zrho(i) = pplay(i,k) / zt(i) / RD
834           zdz(i) = (paprs(i,k)-paprs(i,k+1)) / (zrho(i)*RG)
[1849]835        ENDIF
836     ENDDO
837!AJ<
838     IF (.NOT. ice_thermo) THEN
[2006]839       IF (iflag_t_glace.EQ.0) THEN
840         DO i = 1, klon
841            IF (rneb(i,k).GT.0.0) THEN
842               zfice(i) = 1.0 - (zt(i)-t_glace_min_old) / (273.13-t_glace_min_old)
843               zfice(i) = MIN(MAX(zfice(i),0.0),1.0)
844               zfice(i) = zfice(i)**exposant_glace_old
845!              zfice(i) = zfice(i)**nexpo
846         !!      zfice(i)=0.
847            ENDIF
848         ENDDO
849       ELSE ! of IF (iflag_t_glace.EQ.0)
[2109]850         CALL icefrac_lsc(klon,zt(:),pplay(:,k)/paprs(:,1),zfice(:))
[2086]851!         DO i = 1, klon
852!            IF (rneb(i,k).GT.0.0) THEN
[2109]853! JBM: icefrac_lsc is now a function contained in icefrac_lsc_mod
[2086]854!              zfice(i) = icefrac_lsc(zt(i), t_glace_min, &
855!                                     t_glace_max, exposant_glace)
856!            ENDIF
857!         ENDDO
[2006]858       ENDIF
[1849]859     ENDIF
860     DO i = 1, klon
861        IF (rneb(i,k).GT.0.0) THEN
[1472]862           zneb(i) = MAX(rneb(i,k), seuil_neb)
[1849]863     !      zt(i) = zt(i)+zcond(i)*zfice(i)*RLMLT/RCPD/(1.0+RVTMP2*zq(i)) 
864!           print*,zt(i),'fractionglace'
865!>AJ
[1472]866           radliq(i,k) = zoliq(i)/REAL(ninter+1)
867        ENDIF
868     ENDDO
869     !
870     DO n = 1, ninter
871        DO i = 1, klon
872           IF (rneb(i,k).GT.0.0) THEN
873              zrhol(i) = zrho(i) * zoliq(i) / zneb(i)
[1855]874              ! Initialization of zpluie and zice:
875              zpluie=0
876              zice=0
[1472]877              IF (zneb(i).EQ.seuil_neb) THEN
878                 ztot = 0.0
879              ELSE
880                 !  quantite d'eau a eliminer: zchau
881                 !  meme chose pour la glace: zfroi
882                 if (ptconv(i,k)) then
883                    zcl   =cld_lc_con
884                    zct   =1./cld_tau_con
885                    zfroi    = dtime/REAL(ninter)/zdz(i)*zoliq(i) &
886                         *fallvc(zrhol(i)) * zfice(i)
887                 else
888                    zcl   =cld_lc_lsc
889                    zct   =1./cld_tau_lsc
890                    zfroi    = dtime/REAL(ninter)/zdz(i)*zoliq(i) &
891                         *fallvs(zrhol(i)) * zfice(i)
892                 endif
893                 zchau    = zct   *dtime/REAL(ninter) * zoliq(i) &
894                      *(1.0-EXP(-(zoliq(i)/zneb(i)/zcl   )**2)) *(1.-zfice(i))
[1849]895!AJ<
896                 IF (.NOT. ice_thermo) THEN
897                   ztot    = zchau + zfroi
898                 ELSE
899                   zpluie = MIN(MAX(zchau,0.0),zoliq(i)*(1.-zfice(i)))
900                   zice = MIN(MAX(zfroi,0.0),zoliq(i)*zfice(i))
901                   ztot    = zpluie    + zice
902                 ENDIF
903!>AJ
[1472]904                 ztot    = MAX(ztot   ,0.0)
905              ENDIF
906              ztot    = MIN(ztot,zoliq(i))
[1849]907!AJ<
908     !         zoliqp = MAX(zoliq(i)*(1.-zfice(i))-1.*zpluie   , 0.0)
909     !         zoliqi = MAX(zoliq(i)*zfice(i)-1.*zice   , 0.0)
910              zoliqp(i) = MAX(zoliq(i)*(1.-zfice(i))-1.*zpluie  , 0.0)
911              zoliqi(i) = MAX(zoliq(i)*zfice(i)-1.*zice  , 0.0)
[1472]912              zoliq(i) = MAX(zoliq(i)-ztot   , 0.0)
[1849]913!>AJ
[1472]914              radliq(i,k) = radliq(i,k) + zoliq(i)/REAL(ninter+1)
915           ENDIF
[2466]916        ENDDO  ! i = 1,klon
917     ENDDO     ! n = 1,ninter
[1472]918     !
[2466]919     IF (.NOT. ice_thermo) THEN
[1849]920       DO i = 1, klon
921         IF (rneb(i,k).GT.0.0) THEN
[1472]922           d_ql(i,k) = zoliq(i)
923           zrfl(i) = zrfl(i)+ MAX(zcond(i)-zoliq(i),0.0) &
924                * (paprs(i,k)-paprs(i,k+1))/(RG*dtime)
[1849]925         ENDIF
926       ENDDO
927     ELSE
[2466]928!
929!CR&JYG<
930! On prend en compte l'effet Bergeron dans les flux de precipitation :
931! Si T < 0 C, alors les precipitations liquides sont converties en glace, ce qui
932! provoque un accroissement de temperature DeltaT. L'effet de DeltaT sur le condensat
933! et les precipitations est grossierement pris en compte en linearisant les equations
934! et en approximant le processus de precipitation liquide par un processus a seuil.
935! On fait l'hypothese que le condensat nuageux n'est pas modifié dans cette opération.
936! Le condensat precipitant liquide est supprime (dans la limite DeltaT<273-T).
937! Le condensat precipitant solide est augmente.
938! La vapeur d'eau est augmentee.
939!
940       IF ((iflag_bergeron .EQ. 2)) THEN
941         DO i = 1, klon
942           IF (rneb(i,k) .GT. 0.0) THEN
943             zqpreci(i)=(zcond(i)-zoliq(i))*zfice(i)
944             zqprecl(i)=(zcond(i)-zoliq(i))*(1.-zfice(i))
945             zcp=RCPD*(1.0+RVTMP2*(zq(i)+zcond(i)))
946             coef1 = RLMLT*zdqs(i)/RLVTT
947             DeltaT = max( min( RTT-zt(i), RLMLT*zqprecl(i)/zcp/(1.+coef1) ) , 0.)
948             zqpreci(i) = zqpreci(i) + zcp/RLMLT*DeltaT
949             zqprecl(i) = max( zqprecl(i) - zcp/RLMLT*(1.+coef1)*DeltaT, 0. )
950             zcond(i)   = max( zcond(i)   - zcp/RLVTT*zdqs(i)*DeltaT, 0. )
951             zq(i)      = zq(i)      + zcp/RLVTT*zdqs(i)*DeltaT
952             zt(i)      = zt(i)      + DeltaT
953           ENDIF  ! rneb(i,k) .GT. 0.0
954         ENDDO
955         DO i = 1, klon
956           IF (rneb(i,k).GT.0.0) THEN
957             d_ql(i,k) = (1-zfice(i))*zoliq(i)
958             d_qi(i,k) = zfice(i)*zoliq(i)
959             zrfl(i) = zrfl(i)+ zqprecl(i) &
960                 *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
961             zifl(i) = zifl(i)+ zqpreci(i) &
962                      *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
963           ENDIF                     
964         ENDDO
965!!
966       ELSE  ! iflag_bergeron
967!>CR&JYG
968!!
[1849]969       DO i = 1, klon
970         IF (rneb(i,k).GT.0.0) THEN
[2086]971!CR on prend en compte la phase glace
972           if (.not.ice_thermo) then
[1849]973           d_ql(i,k) = zoliq(i)
[2086]974           d_qi(i,k) = 0.
975           else
976           d_ql(i,k) = (1-zfice(i))*zoliq(i)
977           d_qi(i,k) = zfice(i)*zoliq(i)
978           endif
[1849]979!AJ<
980           zrfl(i) = zrfl(i)+ MAX(zcond(i)*(1.-zfice(i))-zoliqp(i),0.0) &
981               *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
982           zifl(i) = zifl(i)+ MAX(zcond(i)*zfice(i)-zoliqi(i),0.0) &
983                    *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
984     !      zrfl(i) = zrfl(i)+  zpluie                         &
985     !          *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
986     !      zifl(i) = zifl(i)+  zice                    &
987     !               *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)                                   
988
[2415]989!CR : on prend en compte l'effet Bergeron dans les flux de precipitation
[2466]990           IF ((iflag_bergeron .EQ. 1) .AND. (zt(i) .LT. 273.15)) THEN
[2415]991              zsolid = zrfl(i)
992              zifl(i) = zifl(i)+zrfl(i)
993              zrfl(i) = 0.
994              zt(i)=zt(i)+zsolid*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
995                      *(RLSTT-RLVTT)/RCPD/(1.0+RVTMP2*zq(i))
[2466]996           ENDIF  ! (iflag_bergeron .EQ. 1) .AND. (zt(i) .LT. 273.15)
[2415]997!RC   
998
[2466]999         ENDIF ! rneb(i,k).GT.0.0
[1849]1000       ENDDO
1001
[2466]1002       ENDIF  ! iflag_bergeron .EQ. 2
1003     ENDIF  ! .NOT. ice_thermo
1004
[2086]1005!CR: la fonte est faite au debut
1006!      IF (ice_thermo) THEN
1007!       DO i = 1, klon
1008!           zmelt = ((zt(i)-273.15)/(ztfondue-273.15))**2
1009!           zmelt = MIN(MAX(zmelt,0.),1.)
1010!           zrfl(i)=zrfl(i)+zmelt*zifl(i)
1011!           zifl(i)=zifl(i)*(1.-zmelt)
[1849]1012!           print*,zt(i),'octavio1'
[2086]1013!           zt(i)=zt(i)-zifl(i)*zmelt*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
1014!                      *RLMLT/RCPD/(1.0+RVTMP2*zq(i))
[1849]1015!           print*,zt(i),zrfl(i),zifl(i),zmelt,'octavio2'
[2086]1016!       ENDDO
1017!     ENDIF
[1849]1018
1019       
1020     IF (.NOT. ice_thermo) THEN
1021       DO i = 1, klon
1022         IF (zt(i).LT.RTT) THEN
[1472]1023           psfl(i,k)=zrfl(i)
[1849]1024         ELSE
[1472]1025           prfl(i,k)=zrfl(i)
[1849]1026         ENDIF
1027       ENDDO
1028     ELSE
1029     ! JAM*************************************************
1030     ! Revoir partie ci-dessous: à quoi servent psfl et prfl?
1031     ! *****************************************************
1032
1033       DO i = 1, klon
1034     !   IF (zt(i).LT.RTT) THEN
1035           psfl(i,k)=zifl(i)
1036     !   ELSE
1037           prfl(i,k)=zrfl(i)
1038     !   ENDIF
1039!>AJ
1040       ENDDO
1041     ENDIF
[1472]1042     !
[1849]1043     !
[1472]1044     ! Calculer les tendances de q et de t:
1045     !
1046     DO i = 1, klon
1047        d_q(i,k) = zq(i) - q(i,k)
1048        d_t(i,k) = zt(i) - t(i,k)
1049     ENDDO
1050     !
1051     !AA--------------- Calcul du lessivage stratiforme  -------------
[524]1052
[1472]1053     DO i = 1,klon
1054        !
[1742]1055        if(zcond(i).gt.zoliq(i)+1.e-10) then
1056         beta(i,k) = (zcond(i)-zoliq(i))/zcond(i)/dtime
1057        else
1058         beta(i,k) = 0.
1059        endif
[1472]1060        zprec_cond(i) = MAX(zcond(i)-zoliq(i),0.0) &
1061             * (paprs(i,k)-paprs(i,k+1))/RG
1062        IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN
1063           !AA lessivage nucleation LMD5 dans la couche elle-meme
[2006]1064          IF (iflag_t_glace.EQ.0) THEN
1065           if (t(i,k) .GE. t_glace_min_old) THEN
[1472]1066              zalpha_tr = a_tr_sca(3)
1067           else
1068              zalpha_tr = a_tr_sca(4)
1069           endif
[2006]1070          ELSE ! of IF (iflag_t_glace.EQ.0)
1071           if (t(i,k) .GE. t_glace_min) THEN
1072              zalpha_tr = a_tr_sca(3)
1073           else
1074              zalpha_tr = a_tr_sca(4)
1075           endif
1076          ENDIF
[1472]1077           zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
1078           pfrac_nucl(i,k)=pfrac_nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
1079           frac_nucl(i,k)= 1.-zneb(i)*zfrac_lessi
1080           !
1081           ! nucleation avec un facteur -1 au lieu de -0.5
1082           zfrac_lessi = 1. - EXP(-zprec_cond(i)/zneb(i))
1083           pfrac_1nucl(i,k)=pfrac_1nucl(i,k)*(1.-zneb(i)*zfrac_lessi)
1084        ENDIF
1085        !
1086     ENDDO      ! boucle sur i
1087     !
1088     !AA Lessivage par impaction dans les couches en-dessous
1089     DO kk = k-1, 1, -1
[524]1090        DO i = 1, klon
[1472]1091           IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN
[2006]1092             IF (iflag_t_glace.EQ.0) THEN
1093              if (t(i,kk) .GE. t_glace_min_old) THEN
[1472]1094                 zalpha_tr = a_tr_sca(1)
1095              else
1096                 zalpha_tr = a_tr_sca(2)
1097              endif
[2006]1098             ELSE ! of IF (iflag_t_glace.EQ.0)
1099              if (t(i,kk) .GE. t_glace_min) THEN
1100                 zalpha_tr = a_tr_sca(1)
1101              else
1102                 zalpha_tr = a_tr_sca(2)
1103              endif
1104             ENDIF
[1472]1105              zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))
1106              pfrac_impa(i,kk)=pfrac_impa(i,kk)*(1.-zneb(i)*zfrac_lessi)
1107              frac_impa(i,kk)= 1.-zneb(i)*zfrac_lessi
1108           ENDIF
[524]1109        ENDDO
[1472]1110     ENDDO
1111     !
1112     !AA----------------------------------------------------------
1113     !                     FIN DE BOUCLE SUR K   
1114  end DO
1115  !
1116  !AA-----------------------------------------------------------
1117  !
1118  ! Pluie ou neige au sol selon la temperature de la 1ere couche
1119  !
[2086]1120!CR: si la thermo de la glace est active, on calcule zifl directement
1121  IF (.NOT.ice_thermo) THEN
[1472]1122  DO i = 1, klon
1123     IF ((t(i,1)+d_t(i,1)) .LT. RTT) THEN
[1849]1124!AJ<
[2086]1125!        snow(i) = zrfl(i)
[1849]1126        snow(i) = zrfl(i)+zifl(i)
1127!>AJ
[1472]1128        zlh_solid(i) = RLSTT-RLVTT
1129     ELSE
1130        rain(i) = zrfl(i)
1131        zlh_solid(i) = 0.
1132     ENDIF
1133  ENDDO
[2086]1134
1135  ELSE
1136     DO i = 1, klon
1137        snow(i) = zifl(i)
1138        rain(i) = zrfl(i)
1139     ENDDO
1140   
1141   ENDIF
[1472]1142  !
1143  ! For energy conservation : when snow is present, the solification
1144  ! latent heat is considered.
[2086]1145!CR: si thermo de la glace, neige deja prise en compte
1146  IF (.not.ice_thermo) THEN
[1472]1147  DO k = 1, klev
1148     DO i = 1, klon
1149        zcpair=RCPD*(1.0+RVTMP2*(q(i,k)+d_q(i,k)))
1150        zmair=(paprs(i,k)-paprs(i,k+1))/RG
1151        zm_solid = (prfl(i,k)-prfl(i,k+1)+psfl(i,k)-psfl(i,k+1))*dtime
1152        d_t(i,k) = d_t(i,k) + zlh_solid(i) *zm_solid / (zcpair*zmair)
1153     END DO
1154  END DO
[2086]1155  ENDIF
[1472]1156  !
[883]1157
[1472]1158  if (ncoreczq>0) then
[1575]1159     WRITE(lunout,*)'WARNING : ZQ dans fisrtilp ',ncoreczq,' val < 1.e-15.'
[1472]1160  endif
1161
1162END SUBROUTINE fisrtilp
Note: See TracBrowser for help on using the repository browser.