/[lmdze]/trunk/Sources/phylmd/fisrtilp.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/fisrtilp.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/phylmd/fisrtilp.f revision 10 by guez, Fri Apr 18 14:45:53 2008 UTC trunk/libf/phylmd/fisrtilp.f90 revision 73 by guez, Fri Nov 15 17:48:30 2013 UTC
# Line 1  Line 1 
1  !  module fisrtilp_m
2  ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/fisrtilp.F,v 1.2 2004/11/09 16:55:40 lmdzadmin Exp $  
3  !    IMPLICIT NONE
4  c  
5        SUBROUTINE fisrtilp(dtime,paprs,pplay,t,q,ptconv,ratqs,  contains
6       s                   d_t, d_q, d_ql, rneb, radliq, rain, snow,  
7       s                   pfrac_impa, pfrac_nucl, pfrac_1nucl,    SUBROUTINE fisrtilp(dtime, paprs, pplay, t, q, ptconv, ratqs, d_t, d_q, &
8       s                   frac_impa, frac_nucl,         d_ql, rneb, radliq, rain, snow, pfrac_impa, pfrac_nucl, pfrac_1nucl, &
9       s                   prfl, psfl, rhcl)         frac_impa, frac_nucl, prfl, psfl, rhcl)
10    
11  c      ! From phylmd/fisrtilp.F, version 1.2 2004/11/09 16:55:40
12        use dimens_m      ! Author: Z. X. Li (LMD/CNRS), 20 mars 1995
13        use dimphy  
14        use tracstoke      ! Objet : condensation et précipitation stratiforme, schéma de
15        use YOMCST      ! nuage, schéma de condensation à grande échelle (pluie).
16        use yoethf  
17        use fcttre      USE dimphy, ONLY: klev, klon
18        use comfisrtilp      USE suphec_m, ONLY: rcpd, rd, retv, rg, rlstt, rlvtt, rtt
19        IMPLICIT none      USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2
20  c======================================================================      USE fcttre, ONLY: dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep
21  c Auteur(s): Z.X. Li (LMD/CNRS)      USE comfisrtilp, ONLY: cld_lc_con, cld_lc_lsc, cld_tau_con, &
22  c Date: le 20 mars 1995           cld_tau_lsc, coef_eva, ffallv_con, ffallv_lsc, iflag_pdf, reevap_ice
23  c Objet: condensation et precipitation stratiforme.      USE numer_rec_95, ONLY: nr_erf
24  c        schema de nuage  
25  c======================================================================      ! Arguments:
26  c======================================================================  
27  c      REAL, INTENT (IN):: dtime ! intervalle du temps (s)                
28  c Arguments:      REAL, INTENT (IN):: paprs(klon, klev+1) ! pression a inter-couche  
29  c      REAL, INTENT (IN):: pplay(klon, klev) ! pression au milieu de couche
30        REAL dtime ! intervalle du temps (s)      REAL, INTENT (IN):: t(klon, klev) ! temperature (K)
31        REAL, intent(in):: paprs(klon,klev+1) ! pression a inter-couche      REAL, INTENT (IN):: q(klon, klev) ! humidite specifique (kg/kg)
32        REAL, intent(in):: pplay(klon,klev) ! pression au milieu de couche      LOGICAL ptconv(klon, klev) ! determine la largeur de distribution de vapeur
33        REAL t(klon,klev) ! temperature (K)      REAL ratqs(klon, klev) ! determine la largeur de distribution de vapeur
34        REAL q(klon,klev) ! humidite specifique (kg/kg)      REAL d_t(klon, klev) ! incrementation de la temperature (K)        
35        REAL d_t(klon,klev) ! incrementation de la temperature (K)      REAL d_q(klon, klev) ! incrementation de la vapeur d'eau          
36        REAL d_q(klon,klev) ! incrementation de la vapeur d'eau      REAL d_ql(klon, klev) ! incrementation de l'eau liquide            
37        REAL d_ql(klon,klev) ! incrementation de l'eau liquide      REAL rneb(klon, klev) ! fraction nuageuse                          
38        REAL rneb(klon,klev) ! fraction nuageuse      REAL radliq(klon, klev) ! eau liquide utilisee dans rayonnements  
39        REAL radliq(klon,klev) ! eau liquide utilisee dans rayonnements      REAL rain(klon) ! pluies (mm/s)                                  
40        REAL rhcl(klon,klev) ! humidite relative en ciel clair      REAL snow(klon) ! neige (mm/s)                                    
41        REAL rain(klon) ! pluies (mm/s)  
42        REAL snow(klon) ! neige (mm/s)      ! Coeffients de fraction lessivee : pour OFF-LINE
43        REAL prfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)      REAL pfrac_impa(klon, klev)
44        REAL psfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)      REAL pfrac_nucl(klon, klev)
45  cAA      REAL pfrac_1nucl(klon, klev)
46  c Coeffients de fraction lessivee : pour OFF-LINE  
47  c      ! Fraction d'aerosols lessivee par impaction et par nucleation
48        REAL pfrac_nucl(klon,klev)      ! POur ON-LINE
49        REAL pfrac_1nucl(klon,klev)      REAL frac_nucl(klon, klev)
50        REAL pfrac_impa(klon,klev)  
51  c      REAL prfl(klon, klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
52  c Fraction d'aerosols lessivee par impaction et par nucleation      REAL psfl(klon, klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)
53  c POur ON-LINE      REAL rhcl(klon, klev) ! humidite relative en ciel clair            
54  c  
55        REAL frac_impa(klon,klev)      ! Local:
56        REAL frac_nucl(klon,klev)  
57        real zct(klon),zcl(klon)      ! Fraction d'aerosols lessivee par impaction et par nucleation
58  cAA      ! POur ON-LINE
59  c      REAL frac_impa(klon, klev)
60  c Options du programme:      REAL zct(klon), zcl(klon)
61  c      !AA
62        REAL seuil_neb ! un nuage existe vraiment au-dela  
63        PARAMETER (seuil_neb=0.001)      ! Options du programme:
64    
65        INTEGER ninter ! sous-intervals pour la precipitation      REAL seuil_neb ! un nuage existe vraiment au-dela
66        PARAMETER (ninter=5)      PARAMETER (seuil_neb=0.001)
67        LOGICAL evap_prec ! evaporation de la pluie  
68        PARAMETER (evap_prec=.TRUE.)      INTEGER ninter ! sous-intervals pour la precipitation
69        REAL ratqs(klon,klev) ! determine la largeur de distribution de vapeur      PARAMETER (ninter=5)
70        logical ptconv(klon,klev) ! determine la largeur de distribution de vapeur      LOGICAL evap_prec ! evaporation de la pluie                      
71        PARAMETER (evap_prec=.TRUE.)
72        real zpdf_sig(klon),zpdf_k(klon),zpdf_delta(klon)      REAL zpdf_sig(klon), zpdf_k(klon), zpdf_delta(klon)
73        real Zpdf_a(klon),zpdf_b(klon),zpdf_e1(klon),zpdf_e2(klon)      REAL zpdf_a(klon), zpdf_b(klon), zpdf_e1(klon), zpdf_e2(klon)
74        real erf  
75  c      LOGICAL cpartiel ! condensation partielle                        
76        LOGICAL cpartiel ! condensation partielle      PARAMETER (cpartiel=.TRUE.)
77        PARAMETER (cpartiel=.TRUE.)      REAL t_coup
78        REAL t_coup      PARAMETER (t_coup=234.0)
79        PARAMETER (t_coup=234.0)  
80  c      ! Variables locales:
81  c Variables locales:  
82  c      INTEGER i, k, n, kk
83        INTEGER i, k, n, kk      REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5
84        REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5      REAL zrfl(klon), zrfln(klon), zqev, zqevt
85        REAL zrfl(klon), zrfln(klon), zqev, zqevt      REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq
86        REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq      REAL ztglace, zt(klon)
87        REAL ztglace, zt(klon)      INTEGER nexpo ! exponentiel pour glace/eau                        
88        INTEGER nexpo ! exponentiel pour glace/eau      REAL zdz(klon), zrho(klon), ztot(klon), zrhol(klon)
89        REAL zdz(klon),zrho(klon),ztot(klon), zrhol(klon)      REAL zchau(klon), zfroi(klon), zfice(klon), zneb(klon)
90        REAL zchau(klon),zfroi(klon),zfice(klon),zneb(klon)  
91  c      LOGICAL appel1er
92        LOGICAL appel1er      SAVE appel1er
93        SAVE appel1er  
94  c      !---------------------------------------------------------------
95  c---------------------------------------------------------------  
96  c      !AA Variables traceurs:
97  cAA Variables traceurs:      !AA  Provisoire !!! Parametres alpha du lessivage
98  cAA  Provisoire !!! Parametres alpha du lessivage      !AA  A priori on a 4 scavenging numbers possibles
99  cAA  A priori on a 4 scavenging numbers possibles  
100  c      REAL a_tr_sca(4)
101        REAL a_tr_sca(4)      SAVE a_tr_sca
102        save a_tr_sca  
103  c      ! Variables intermediaires
104  c Variables intermediaires  
105  c      REAL zalpha_tr
106        REAL zalpha_tr      REAL zfrac_lessi
107        REAL zfrac_lessi      REAL zprec_cond(klon)
108        REAL zprec_cond(klon)      !AA
109  cAA      REAL zmair, zcpair, zcpeau
110        REAL zmair, zcpair, zcpeau      !     Pour la conversion eau-neige
111  C     Pour la conversion eau-neige      REAL zlh_solid(klon), zm_solid
112        REAL zlh_solid(klon), zm_solid      !IM
113  cIM      INTEGER klevm1
114        INTEGER klevm1      !---------------------------------------------------------------
115  c---------------------------------------------------------------  
116  c      ! Fonctions en ligne:
117  c Fonctions en ligne:  
118  c      REAL fallvs, fallvc ! vitesse de chute pour crystaux de glace      
119        REAL fallvs,fallvc ! vitesse de chute pour crystaux de glace      REAL zzz
120        REAL zzz  
121        fallvc (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_con      fallvc(zzz) = 3.29/2.0*((zzz)**0.16)*ffallv_con
122        fallvs (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_lsc      fallvs(zzz) = 3.29/2.0*((zzz)**0.16)*ffallv_lsc
123  c  
124        DATA appel1er /.TRUE./      DATA appel1er/ .TRUE./
125  cym      !ym
126        zdelq=0.0      zdelq = 0.0
127          
128        IF (appel1er) THEN      IF (appel1er) THEN
129  c  
130           PRINT*, 'fisrtilp, ninter:', ninter         PRINT *, 'fisrtilp, ninter:', ninter
131           PRINT*, 'fisrtilp, evap_prec:', evap_prec         PRINT *, 'fisrtilp, evap_prec:', evap_prec
132           PRINT*, 'fisrtilp, cpartiel:', cpartiel         PRINT *, 'fisrtilp, cpartiel:', cpartiel
133           IF (ABS(dtime/FLOAT(ninter)-360.0).GT.0.001) THEN         IF (abs(dtime / real(ninter) - 360.) > 0.001) THEN
134            PRINT*, 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime            PRINT *, "fisrtilp : ce n'est pas prévu, voir Z. X. Li", dtime
135            PRINT*, 'Je prefere un sous-intervalle de 6 minutes'            PRINT *, 'Je préfère un sous-intervalle de 6 minutes.'
136  c         stop 1         END IF
137           ENDIF         appel1er = .FALSE.
138           appel1er = .FALSE.  
139  c         !AA initialiation provisoire
 cAA initialiation provisoire  
140         a_tr_sca(1) = -0.5         a_tr_sca(1) = -0.5
141         a_tr_sca(2) = -0.5         a_tr_sca(2) = -0.5
142         a_tr_sca(3) = -0.5         a_tr_sca(3) = -0.5
143         a_tr_sca(4) = -0.5         a_tr_sca(4) = -0.5
144  c  
145  cAA Initialisation a 1 des coefs des fractions lessivees         !AA Initialisation a 1 des coefs des fractions lessivees
146  c  
147        DO k = 1, klev         DO k = 1, klev
148              DO i = 1, klon
149                 pfrac_nucl(i, k) = 1.
150                 pfrac_1nucl(i, k) = 1.
151                 pfrac_impa(i, k) = 1.
152              END DO
153           END DO
154    
155    
156        END IF !  test sur appel1er
157        !MAf Initialisation a 0 de zoliq
158        DO i = 1, klon
159           zoliq(i) = 0.
160        END DO
161        ! Determiner les nuages froids par leur temperature
162        !  nexpo regle la raideur de la transition eau liquide / eau glace.
163    
164        ztglace = rtt - 15.0
165        nexpo = 6
166        !cc      nexpo = 1
167    
168        ! Initialiser les sorties:
169    
170        DO k = 1, klev + 1
171           DO i = 1, klon
172              prfl(i, k) = 0.0
173              psfl(i, k) = 0.0
174           END DO
175        END DO
176    
177        DO k = 1, klev
178           DO i = 1, klon
179              d_t(i, k) = 0.0
180              d_q(i, k) = 0.0
181              d_ql(i, k) = 0.0
182              rneb(i, k) = 0.0
183              radliq(i, k) = 0.0
184              frac_nucl(i, k) = 1.
185              frac_impa(i, k) = 1.
186           END DO
187        END DO
188        DO i = 1, klon
189           rain(i) = 0.0
190           snow(i) = 0.0
191        END DO
192    
193        ! Initialiser le flux de precipitation a zero
194    
195        DO i = 1, klon
196           zrfl(i) = 0.0
197           zneb(i) = seuil_neb
198        END DO
199    
200    
201        !AA Pour plus de securite
202    
203        zalpha_tr = 0.
204        zfrac_lessi = 0.
205    
206        !AA----------------------------------------------------------
207    
208        ! Boucle verticale (du haut vers le bas)
209    
210        !IM : klevm1
211        klevm1 = klev - 1
212        DO  k = klev, 1, -1
213    
214           !AA----------------------------------------------------------
215    
216           DO i = 1, klon
217              zt(i) = t(i, k)
218              zq(i) = q(i, k)
219           END DO
220    
221           ! Calculer la varition de temp. de l'air du a la chaleur sensible
222           ! transporter par la pluie.
223           ! Il resterait a rajouter cet effet de la chaleur sensible sur les
224           ! flux de surface, du a la diff. de temp. entre le 1er niveau et la
225           ! surface.
226    
227         DO i = 1, klon         DO i = 1, klon
228            pfrac_nucl(i,k)=1.            IF (k<=klevm1) THEN
229            pfrac_1nucl(i,k)=1.               zmair = (paprs(i, k)-paprs(i, k+1))/rg
230            pfrac_impa(i,k)=1.               zcpair = rcpd*(1.0+rvtmp2*zq(i))
231         ENDDO               zcpeau = rcpd*rvtmp2
232        ENDDO               zt(i) = ((t(i, k + 1) + d_t(i, k + 1)) * zrfl(i) * dtime &
233                      * zcpeau + zmair * zcpair* zt(i)) &
234        ENDIF          !  test sur appel1er                    / (zmair * zcpair + zrfl(i) * dtime * zcpeau)
235  c            END IF
236  cMAf Initialisation a 0 de zoliq         END DO
237    
238           ! Calculer l'evaporation de la precipitation
239    
240    
241    
242           IF (evap_prec) THEN
243              DO i = 1, klon
244                 IF (zrfl(i)>0.) THEN
245                    IF (thermcep) THEN
246                       zdelta = max(0., sign(1., rtt-zt(i)))
247                       zqs(i) = r2es*foeew(zt(i), zdelta)/pplay(i, k)
248                       zqs(i) = min(0.5, zqs(i))
249                       zcor = 1./(1.-retv*zqs(i))
250                       zqs(i) = zqs(i)*zcor
251                    ELSE
252                       IF (zt(i)<t_coup) THEN
253                          zqs(i) = qsats(zt(i))/pplay(i, k)
254                       ELSE
255                          zqs(i) = qsatl(zt(i))/pplay(i, k)
256                       END IF
257                    END IF
258                    zqev = max(0.0, (zqs(i)-zq(i))*zneb(i))
259                    zqevt = coef_eva*(1.0-zq(i)/zqs(i))*sqrt(zrfl(i))* &
260                         (paprs(i, k)-paprs(i, k+1))/pplay(i, k)*zt(i)*rd/rg
261                    zqevt = max(0.0, min(zqevt, zrfl(i)))*rg*dtime/ &
262                         (paprs(i, k)-paprs(i, k+1))
263                    zqev = min(zqev, zqevt)
264                    zrfln(i) = zrfl(i) - zqev*(paprs(i, k)-paprs(i, k+1))/rg/dtime
265    
266                    ! pour la glace, on réévapore toute la précip dans la
267                    ! couche du dessous la glace venant de la couche du
268                    ! dessus est simplement dans la couche du dessous.
269    
270                    IF (zt(i)<t_coup .AND. reevap_ice) zrfln(i) = 0.
271    
272                    zq(i) = zq(i) - (zrfln(i)-zrfl(i))*(rg/(paprs(i, k)-paprs(i, &
273                         k+1)))*dtime
274                    zt(i) = zt(i) + (zrfln(i)-zrfl(i))*(rg/(paprs(i, k)-paprs(i, &
275                         k+1)))*dtime*rlvtt/rcpd/(1.0+rvtmp2*zq(i))
276                    zrfl(i) = zrfln(i)
277                 END IF
278              END DO
279           END IF
280    
281           ! Calculer Qs et L/Cp*dQs/dT:
282    
283           IF (thermcep) THEN
284              DO i = 1, klon
285                 zdelta = max(0., sign(1., rtt-zt(i)))
286                 zcvm5 = r5les*rlvtt*(1.-zdelta) + r5ies*rlstt*zdelta
287                 zcvm5 = zcvm5/rcpd/(1.0+rvtmp2*zq(i))
288                 zqs(i) = r2es*foeew(zt(i), zdelta)/pplay(i, k)
289                 zqs(i) = min(0.5, zqs(i))
290                 zcor = 1./(1.-retv*zqs(i))
291                 zqs(i) = zqs(i)*zcor
292                 zdqs(i) = foede(zt(i), zdelta, zcvm5, zqs(i), zcor)
293              END DO
294           ELSE
295              DO i = 1, klon
296                 IF (zt(i)<t_coup) THEN
297                    zqs(i) = qsats(zt(i))/pplay(i, k)
298                    zdqs(i) = dqsats(zt(i), zqs(i))
299                 ELSE
300                    zqs(i) = qsatl(zt(i))/pplay(i, k)
301                    zdqs(i) = dqsatl(zt(i), zqs(i))
302                 END IF
303              END DO
304           END IF
305    
306           ! Determiner la condensation partielle et calculer la quantite
307           ! de l'eau condensee:
308    
309           IF (cpartiel) THEN
310    
311              !        print*, 'Dans partiel k=', k
312    
313              !   Calcul de l'eau condensee et de la fraction nuageuse et de l'eau
314              !   nuageuse a partir des PDF de Sandrine Bony.
315              !   rneb  : fraction nuageuse
316              !   zqn   : eau totale dans le nuage
317              !   zcond : eau condensee moyenne dans la maille.
318    
319              !           on prend en compte le réchauffement qui diminue
320              !           la partie condensee
321    
322              !   Version avec les raqts
323    
324              IF (iflag_pdf==0) THEN
325    
326                 DO i = 1, klon
327                    zdelq = min(ratqs(i, k), 0.99)*zq(i)
328                    rneb(i, k) = (zq(i)+zdelq-zqs(i))/(2.0*zdelq)
329                    zqn(i) = (zq(i)+zdelq+zqs(i))/2.0
330                 END DO
331    
332              ELSE
333    
334                 !   Version avec les nouvelles PDFs.
335                 DO i = 1, klon
336                    IF (zq(i)<1.E-15) THEN
337                       zq(i) = 1.E-15
338                    END IF
339                 END DO
340                 DO i = 1, klon
341                    zpdf_sig(i) = ratqs(i, k)*zq(i)
342                    zpdf_k(i) = -sqrt(log(1.+(zpdf_sig(i)/zq(i))**2))
343                    zpdf_delta(i) = log(zq(i)/zqs(i))
344                    zpdf_a(i) = zpdf_delta(i)/(zpdf_k(i)*sqrt(2.))
345                    zpdf_b(i) = zpdf_k(i)/(2.*sqrt(2.))
346                    zpdf_e1(i) = zpdf_a(i) - zpdf_b(i)
347                    zpdf_e1(i) = sign(min(abs(zpdf_e1(i)), 5.), zpdf_e1(i))
348                    zpdf_e1(i) = 1. - nr_erf(zpdf_e1(i))
349                    zpdf_e2(i) = zpdf_a(i) + zpdf_b(i)
350                    zpdf_e2(i) = sign(min(abs(zpdf_e2(i)), 5.), zpdf_e2(i))
351                    zpdf_e2(i) = 1. - nr_erf(zpdf_e2(i))
352                    IF (zpdf_e1(i)<1.E-10) THEN
353                       rneb(i, k) = 0.
354                       zqn(i) = zqs(i)
355                    ELSE
356                       rneb(i, k) = 0.5*zpdf_e1(i)
357                       zqn(i) = zq(i)*zpdf_e2(i)/zpdf_e1(i)
358                    END IF
359    
360                 END DO
361    
362    
363              END IF
364              ! iflag_pdf                                              
365              DO i = 1, klon
366                 IF (rneb(i, k)<=0.0) zqn(i) = 0.0
367                 IF (rneb(i, k)>=1.0) zqn(i) = zq(i)
368                 rneb(i, k) = max(0.0, min(1.0, rneb(i, k)))
369                 !  On ne divise pas par 1+zdqs pour forcer a avoir l'eau
370                 !  predite par la convection.  ATTENTION !!! Il va
371                 !  falloir verifier tout ca.
372                 zcond(i) = max(0.0, zqn(i)-zqs(i))*rneb(i, k)
373                 !           print*, 'ZDQS ', zdqs(i)
374                 !--Olivier
375                 rhcl(i, k) = (zqs(i)+zq(i)-zdelq)/2./zqs(i)
376                 IF (rneb(i, k)<=0.0) rhcl(i, k) = zq(i)/zqs(i)
377                 IF (rneb(i, k)>=1.0) rhcl(i, k) = 1.0
378                 !--fin
379              END DO
380           ELSE
381              DO i = 1, klon
382                 IF (zq(i)>zqs(i)) THEN
383                    rneb(i, k) = 1.0
384                 ELSE
385                    rneb(i, k) = 0.0
386                 END IF
387                 zcond(i) = max(0.0, zq(i)-zqs(i))/(1.+zdqs(i))
388              END DO
389           END IF
390    
391           DO i = 1, klon
392              zq(i) = zq(i) - zcond(i)
393              !         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD
394              zt(i) = zt(i) + zcond(i)*rlvtt/rcpd/(1.0+rvtmp2*zq(i))
395           END DO
396    
397           ! Partager l'eau condensee en precipitation et eau liquide nuageuse
398    
399         DO i = 1, klon         DO i = 1, klon
400            zoliq(i)=0.            IF (rneb(i, k)>0.0) THEN
401         ENDDO               zoliq(i) = zcond(i)
402  c Determiner les nuages froids par leur temperature               zrho(i) = pplay(i, k)/zt(i)/rd
403  c  nexpo regle la raideur de la transition eau liquide / eau glace.               zdz(i) = (paprs(i, k)-paprs(i, k+1))/(zrho(i)*rg)
404  c               zfice(i) = 1.0 - (zt(i)-ztglace)/(273.13-ztglace)
405        ztglace = RTT - 15.0               zfice(i) = min(max(zfice(i), 0.0), 1.0)
406        nexpo = 6               zfice(i) = zfice(i)**nexpo
407  ccc      nexpo = 1               zneb(i) = max(rneb(i, k), seuil_neb)
408  c               radliq(i, k) = zoliq(i)/real(ninter+1)
409  c Initialiser les sorties:            END IF
410  c         END DO
411        DO k = 1, klev+1  
412        DO i = 1, klon         DO n = 1, ninter
413           prfl(i,k) = 0.0            DO i = 1, klon
414           psfl(i,k) = 0.0               IF (rneb(i, k)>0.0) THEN
415        ENDDO                  zrhol(i) = zrho(i)*zoliq(i)/zneb(i)
416        ENDDO  
417                    IF (ptconv(i, k)) THEN
418        DO k = 1, klev                     zcl(i) = cld_lc_con
419        DO i = 1, klon                     zct(i) = 1./cld_tau_con
420           d_t(i,k) = 0.0                  ELSE
421           d_q(i,k) = 0.0                     zcl(i) = cld_lc_lsc
422           d_ql(i,k) = 0.0                     zct(i) = 1./cld_tau_lsc
423           rneb(i,k) = 0.0                  END IF
424           radliq(i,k) = 0.0                  !  quantité d'eau à élminier.
425           frac_nucl(i,k) = 1.                  zchau(i) = zct(i)*dtime/real(ninter)*zoliq(i)* &
426           frac_impa(i,k) = 1.                       (1.0-exp(-(zoliq(i)/zneb(i)/zcl(i))**2))*(1.-zfice(i))
427        ENDDO                  !  meme chose pour la glace.
428        ENDDO                  IF (ptconv(i, k)) THEN
429        DO i = 1, klon                     zfroi(i) = dtime/real(ninter)/zdz(i)*zoliq(i)* &
430           rain(i) = 0.0                          fallvc(zrhol(i))*zfice(i)
431           snow(i) = 0.0                  ELSE
432        ENDDO                     zfroi(i) = dtime/real(ninter)/zdz(i)*zoliq(i)* &
433  c                          fallvs(zrhol(i))*zfice(i)
434  c Initialiser le flux de precipitation a zero                  END IF
435  c                  ztot(i) = zchau(i) + zfroi(i)
436        DO i = 1, klon                  IF (zneb(i)==seuil_neb) ztot(i) = 0.0
437           zrfl(i) = 0.0                  ztot(i) = min(max(ztot(i), 0.0), zoliq(i))
438           zneb(i) = seuil_neb                  zoliq(i) = max(zoliq(i)-ztot(i), 0.0)
439        ENDDO                  radliq(i, k) = radliq(i, k) + zoliq(i)/real(ninter+1)
440  c               END IF
441  c            END DO
442  cAA Pour plus de securite         END DO
443    
444        zalpha_tr   = 0.         DO i = 1, klon
445        zfrac_lessi = 0.            IF (rneb(i, k)>0.0) THEN
446                 d_ql(i, k) = zoliq(i)
447  cAA----------------------------------------------------------               zrfl(i) = zrfl(i) + max(zcond(i) - zoliq(i), 0.) &
448  c                    * (paprs(i, k) - paprs(i, k + 1)) / (rg * dtime)
449  c Boucle verticale (du haut vers le bas)            END IF
450  c            IF (zt(i)<rtt) THEN
451  cIM : klevm1               psfl(i, k) = zrfl(i)
452        klevm1=klev-1            ELSE
453        DO 9999 k = klev, 1, -1               prfl(i, k) = zrfl(i)
454  c            END IF
455  cAA----------------------------------------------------------         END DO
456  c  
457        DO i = 1, klon         ! Calculer les tendances de q et de t:
458           zt(i)=t(i,k)  
459           zq(i)=q(i,k)         DO i = 1, klon
460        ENDDO            d_q(i, k) = zq(i) - q(i, k)
461  c            d_t(i, k) = zt(i) - t(i, k)
462  c Calculer la varition de temp. de l'air du a la chaleur sensible         END DO
463  C transporter par la pluie.  
464  C Il resterait a rajouter cet effet de la chaleur sensible sur les         !AA--------------- Calcul du lessivage stratiforme  -------------
465  C flux de surface, du a la diff. de temp. entre le 1er niveau et la  
466  C surface.         DO i = 1, klon
467  C            zprec_cond(i) = max(zcond(i)-zoliq(i), 0.0)* &
468        DO i = 1, klon                 (paprs(i, k)-paprs(i, k+1))/rg
469  cIM            IF (rneb(i, k)>0.0 .AND. zprec_cond(i)>0.) THEN
470         IF(k.LE.klevm1) THEN                       !AA lessivage nucleation LMD5 dans la couche elle-meme
471          zmair=(paprs(i,k)-paprs(i,k+1))/RG               IF (t(i, k)>=ztglace) THEN
472          zcpair=RCPD*(1.0+RVTMP2*zq(i))                  zalpha_tr = a_tr_sca(3)
473          zcpeau=RCPD*RVTMP2               ELSE
474          zt(i) = ( (t(i,k+1)+d_t(i,k+1))*zrfl(i)*dtime*zcpeau                  zalpha_tr = a_tr_sca(4)
475       $      + zmair*zcpair*zt(i) )               END IF
476       $      / (zmair*zcpair + zrfl(i)*dtime*zcpeau)               zfrac_lessi = 1. - exp(zalpha_tr*zprec_cond(i)/zneb(i))
477  CC        WRITE (6,*) 'cppluie ', zt(i)-(t(i,k+1)+d_t(i,k+1))               pfrac_nucl(i, k) = pfrac_nucl(i, k)*(1.-zneb(i)*zfrac_lessi)
478         ENDIF               frac_nucl(i, k) = 1. - zneb(i)*zfrac_lessi
479        ENDDO  
480  c               ! nucleation avec un facteur -1 au lieu de -0.5
481  c               zfrac_lessi = 1. - exp(-zprec_cond(i)/zneb(i))
482  c Calculer l'evaporation de la precipitation               pfrac_1nucl(i, k) = pfrac_1nucl(i, k)*(1.-zneb(i)*zfrac_lessi)
483  c            END IF
484    
485    
486        IF (evap_prec) THEN         END DO
487        DO i = 1, klon         !AA Lessivage par impaction dans les couches en-dessous
488        IF (zrfl(i) .GT.0.) THEN         ! boucle sur i                                        
489           IF (thermcep) THEN         DO kk = k - 1, 1, -1
490             zdelta=MAX(0.,SIGN(1.,RTT-zt(i)))            DO i = 1, klon
491             zqs(i)= R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)               IF (rneb(i, k)>0.0 .AND. zprec_cond(i)>0.) THEN
492             zqs(i)=MIN(0.5,zqs(i))                  IF (t(i, kk)>=ztglace) THEN
493             zcor=1./(1.-RETV*zqs(i))                     zalpha_tr = a_tr_sca(1)
494             zqs(i)=zqs(i)*zcor                  ELSE
495           ELSE                     zalpha_tr = a_tr_sca(2)
496             IF (zt(i) .LT. t_coup) THEN                  END IF
497                zqs(i) = qsats(zt(i)) / pplay(i,k)                  zfrac_lessi = 1. - exp(zalpha_tr*zprec_cond(i)/zneb(i))
498             ELSE                  pfrac_impa(i, kk) = pfrac_impa(i, kk)*(1.-zneb(i)*zfrac_lessi)
499                zqs(i) = qsatl(zt(i)) / pplay(i,k)                  frac_impa(i, kk) = 1. - zneb(i)*zfrac_lessi
500             ENDIF               END IF
501           ENDIF            END DO
502           zqev = MAX (0.0, (zqs(i)-zq(i))*zneb(i) )         END DO
503           zqevt = coef_eva * (1.0-zq(i)/zqs(i)) * SQRT(zrfl(i))  
504       .         * (paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG         !AA----------------------------------------------------------
505           zqevt = MAX(0.0,MIN(zqevt,zrfl(i)))         !                     FIN DE BOUCLE SUR K
506       .         * RG*dtime/(paprs(i,k)-paprs(i,k+1))      end DO
507           zqev = MIN (zqev, zqevt)  
508           zrfln(i) = zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1))      !AA-----------------------------------------------------------
509       .                            /RG/dtime  
510        ! Pluie ou neige au sol selon la temperature de la 1ere couche
511  c pour la glace, on réévapore toute la précip dans la couche du dessous  
512  c la glace venant de la couche du dessus est simplement dans la couche      DO i = 1, klon
513  c du dessous.         IF ((t(i, 1)+d_t(i, 1))<rtt) THEN
514              snow(i) = zrfl(i)
515           IF (zt(i) .LT. t_coup.and.reevap_ice) zrfln(i)=0.            zlh_solid(i) = rlstt - rlvtt
516           ELSE
517           zq(i) = zq(i) - (zrfln(i)-zrfl(i))            rain(i) = zrfl(i)
518       .             * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime            zlh_solid(i) = 0.
519           zt(i) = zt(i) + (zrfln(i)-zrfl(i))         END IF
520       .             * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime      END DO
521       .             * RLVTT/RCPD/(1.0+RVTMP2*zq(i))  
522           zrfl(i) = zrfln(i)      ! For energy conservation: when snow is present, the solification
523        ENDIF      ! latent heat is considered.
524        ENDDO      DO k = 1, klev
525        ENDIF         DO i = 1, klon
526  c            zcpair = rcpd*(1.0+rvtmp2*(q(i, k)+d_q(i, k)))
527  c Calculer Qs et L/Cp*dQs/dT:            zmair = (paprs(i, k)-paprs(i, k+1))/rg
528  c            zm_solid = (prfl(i, k)-prfl(i, k+1)+psfl(i, k)-psfl(i, k+1))*dtime
529        IF (thermcep) THEN            d_t(i, k) = d_t(i, k) + zlh_solid(i)*zm_solid/(zcpair*zmair)
530           DO i = 1, klon         END DO
531             zdelta = MAX(0.,SIGN(1.,RTT-zt(i)))      END DO
532             zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta  
533             zcvm5 = zcvm5 /RCPD/(1.0+RVTMP2*zq(i))    END SUBROUTINE fisrtilp
534             zqs(i) = R2ES*FOEEW(zt(i),zdelta)/pplay(i,k)  
535             zqs(i) = MIN(0.5,zqs(i))  end module fisrtilp_m
            zcor = 1./(1.-RETV*zqs(i))  
            zqs(i) = zqs(i)*zcor  
            zdqs(i) = FOEDE(zt(i),zdelta,zcvm5,zqs(i),zcor)  
          ENDDO  
       ELSE  
          DO i = 1, klon  
             IF (zt(i).LT.t_coup) THEN  
                zqs(i) = qsats(zt(i))/pplay(i,k)  
                zdqs(i) = dqsats(zt(i),zqs(i))  
             ELSE  
                zqs(i) = qsatl(zt(i))/pplay(i,k)  
                zdqs(i) = dqsatl(zt(i),zqs(i))  
             ENDIF  
          ENDDO  
       ENDIF  
 c  
 c Determiner la condensation partielle et calculer la quantite  
 c de l'eau condensee:  
 c  
       IF (cpartiel) THEN  
   
 c        print*,'Dans partiel k=',k  
 c  
 c   Calcul de l'eau condensee et de la fraction nuageuse et de l'eau  
 c   nuageuse a partir des PDF de Sandrine Bony.  
 c   rneb  : fraction nuageuse  
 c   zqn   : eau totale dans le nuage  
 c   zcond : eau condensee moyenne dans la maille.  
 c           on prend en compte le réchauffement qui diminue la partie condensee  
 c  
 c   Version avec les raqts  
   
          if (iflag_pdf.eq.0) then  
   
            do i=1,klon  
             zdelq = min(ratqs(i,k),0.99) * zq(i)  
             rneb(i,k) = (zq(i)+zdelq-zqs(i)) / (2.0*zdelq)  
             zqn(i) = (zq(i)+zdelq+zqs(i))/2.0  
            enddo  
   
          else  
 c  
 c   Version avec les nouvelles PDFs.  
            do i=1,klon  
               if(zq(i).lt.1.e-15) then  
 CC Lionel GUEZ                print*,'ZQ(',i,',',k,')=',zq(i)  
                 zq(i)=1.e-15  
               endif  
            enddo  
            do i=1,klon  
             zpdf_sig(i)=ratqs(i,k)*zq(i)  
             zpdf_k(i)=-sqrt(log(1.+(zpdf_sig(i)/zq(i))**2))  
             zpdf_delta(i)=log(zq(i)/zqs(i))  
             zpdf_a(i)=zpdf_delta(i)/(zpdf_k(i)*sqrt(2.))  
             zpdf_b(i)=zpdf_k(i)/(2.*sqrt(2.))  
             zpdf_e1(i)=zpdf_a(i)-zpdf_b(i)  
             zpdf_e1(i)=sign(min(abs(zpdf_e1(i)),5.),zpdf_e1(i))  
             zpdf_e1(i)=1.-erf(zpdf_e1(i))  
             zpdf_e2(i)=zpdf_a(i)+zpdf_b(i)  
             zpdf_e2(i)=sign(min(abs(zpdf_e2(i)),5.),zpdf_e2(i))  
             zpdf_e2(i)=1.-erf(zpdf_e2(i))  
             if (zpdf_e1(i).lt.1.e-10) then  
                rneb(i,k)=0.  
                zqn(i)=zqs(i)  
             else  
                rneb(i,k)=0.5*zpdf_e1(i)  
                zqn(i)=zq(i)*zpdf_e2(i)/zpdf_e1(i)  
             endif  
               
            enddo  
   
         endif ! iflag_pdf  
   
          do i=1,klon  
             IF (rneb(i,k) .LE. 0.0) zqn(i) = 0.0  
             IF (rneb(i,k) .GE. 1.0) zqn(i) = zq(i)  
             rneb(i,k) = MAX(0.0,MIN(1.0,rneb(i,k)))  
 c           zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1.+zdqs(i))  
 c  On ne divise pas par 1+zdqs pour forcer a avoir l'eau predite par  
 c  la convection.  
 c  ATTENTION !!! Il va falloir verifier tout ca.  
             zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)  
 c           print*,'ZDQS ',zdqs(i)  
 c--Olivier  
             rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)  
             IF (rneb(i,k) .LE. 0.0) rhcl(i,k)=zq(i)/zqs(i)  
             IF (rneb(i,k) .GE. 1.0) rhcl(i,k)=1.0  
 c--fin  
            ENDDO  
       ELSE  
          DO i = 1, klon  
             IF (zq(i).GT.zqs(i)) THEN  
                rneb(i,k) = 1.0  
             ELSE  
                rneb(i,k) = 0.0  
             ENDIF  
             zcond(i) = MAX(0.0,zq(i)-zqs(i))/(1.+zdqs(i))  
          ENDDO  
       ENDIF  
 c  
       DO i = 1, klon  
          zq(i) = zq(i) - zcond(i)  
 c         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD  
          zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i))  
       ENDDO  
 c  
 c Partager l'eau condensee en precipitation et eau liquide nuageuse  
 c  
       DO i = 1, klon  
       IF (rneb(i,k).GT.0.0) THEN  
          zoliq(i) = zcond(i)  
          zrho(i) = pplay(i,k) / zt(i) / RD  
          zdz(i) = (paprs(i,k)-paprs(i,k+1)) / (zrho(i)*RG)  
          zfice(i) = 1.0 - (zt(i)-ztglace) / (273.13-ztglace)  
          zfice(i) = MIN(MAX(zfice(i),0.0),1.0)  
          zfice(i) = zfice(i)**nexpo  
          zneb(i) = MAX(rneb(i,k), seuil_neb)  
          radliq(i,k) = zoliq(i)/FLOAT(ninter+1)  
       ENDIF  
       ENDDO  
 c  
       DO n = 1, ninter  
       DO i = 1, klon  
       IF (rneb(i,k).GT.0.0) THEN  
          zrhol(i) = zrho(i) * zoliq(i) / zneb(i)  
   
          if (ptconv(i,k)) then  
             zcl(i)=cld_lc_con  
             zct(i)=1./cld_tau_con  
          else  
             zcl(i)=cld_lc_lsc  
             zct(i)=1./cld_tau_lsc  
          endif  
 c  quantité d'eau à élminier.  
          zchau(i) = zct(i)*dtime/FLOAT(ninter) * zoliq(i)  
      .         *(1.0-EXP(-(zoliq(i)/zneb(i)/zcl(i))**2)) *(1.-zfice(i))  
 c  meme chose pour la glace.  
          if (ptconv(i,k)) then  
             zfroi(i) = dtime/FLOAT(ninter)/zdz(i)*zoliq(i)  
      .              *fallvc(zrhol(i)) * zfice(i)  
          else  
             zfroi(i) = dtime/FLOAT(ninter)/zdz(i)*zoliq(i)  
      .              *fallvs(zrhol(i)) * zfice(i)  
          endif  
          ztot(i) = zchau(i) + zfroi(i)  
          IF (zneb(i).EQ.seuil_neb) ztot(i) = 0.0  
          ztot(i) = MIN(MAX(ztot(i),0.0),zoliq(i))  
          zoliq(i) = MAX(zoliq(i)-ztot(i), 0.0)  
          radliq(i,k) = radliq(i,k) + zoliq(i)/FLOAT(ninter+1)  
       ENDIF  
       ENDDO  
       ENDDO  
 c  
       DO i = 1, klon  
       IF (rneb(i,k).GT.0.0) THEN  
          d_ql(i,k) = zoliq(i)  
          zrfl(i) = zrfl(i)+ MAX(zcond(i)-zoliq(i),0.0)  
      .                    * (paprs(i,k)-paprs(i,k+1))/(RG*dtime)  
       ENDIF  
       IF (zt(i).LT.RTT) THEN  
         psfl(i,k)=zrfl(i)  
       ELSE  
         prfl(i,k)=zrfl(i)  
       ENDIF  
       ENDDO  
 c  
 c Calculer les tendances de q et de t:  
 c  
       DO i = 1, klon  
          d_q(i,k) = zq(i) - q(i,k)  
          d_t(i,k) = zt(i) - t(i,k)  
       ENDDO  
 c  
 cAA--------------- Calcul du lessivage stratiforme  -------------  
   
       DO i = 1,klon  
 c  
          zprec_cond(i) = MAX(zcond(i)-zoliq(i),0.0)  
      .                * (paprs(i,k)-paprs(i,k+1))/RG  
          IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN  
 cAA lessivage nucleation LMD5 dans la couche elle-meme  
             if (t(i,k) .GE. ztglace) THEN  
                zalpha_tr = a_tr_sca(3)  
             else  
                zalpha_tr = a_tr_sca(4)  
             endif  
             zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))  
             pfrac_nucl(i,k)=pfrac_nucl(i,k)*(1.-zneb(i)*zfrac_lessi)  
             frac_nucl(i,k)= 1.-zneb(i)*zfrac_lessi  
 c  
 c nucleation avec un facteur -1 au lieu de -0.5  
             zfrac_lessi = 1. - EXP(-zprec_cond(i)/zneb(i))  
             pfrac_1nucl(i,k)=pfrac_1nucl(i,k)*(1.-zneb(i)*zfrac_lessi)  
          ENDIF  
 c  
       ENDDO      ! boucle sur i  
 c  
 cAA Lessivage par impaction dans les couches en-dessous  
       DO kk = k-1, 1, -1  
         DO i = 1, klon  
           IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN  
             if (t(i,kk) .GE. ztglace) THEN  
               zalpha_tr = a_tr_sca(1)  
             else  
               zalpha_tr = a_tr_sca(2)  
             endif  
             zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))  
             pfrac_impa(i,kk)=pfrac_impa(i,kk)*(1.-zneb(i)*zfrac_lessi)  
             frac_impa(i,kk)= 1.-zneb(i)*zfrac_lessi  
           ENDIF  
         ENDDO  
       ENDDO  
 c  
 cAA----------------------------------------------------------  
 c                     FIN DE BOUCLE SUR K    
  9999 CONTINUE  
 c  
 cAA-----------------------------------------------------------  
 c  
 c Pluie ou neige au sol selon la temperature de la 1ere couche  
 c  
       DO i = 1, klon  
       IF ((t(i,1)+d_t(i,1)) .LT. RTT) THEN  
          snow(i) = zrfl(i)  
          zlh_solid(i) = RLSTT-RLVTT  
       ELSE  
          rain(i) = zrfl(i)  
          zlh_solid(i) = 0.  
       ENDIF  
       ENDDO  
 C  
 C For energy conservation : when snow is present, the solification  
 c latent heat is considered.  
       DO k = 1, klev  
         DO i = 1, klon  
           zcpair=RCPD*(1.0+RVTMP2*(q(i,k)+d_q(i,k)))  
           zmair=(paprs(i,k)-paprs(i,k+1))/RG  
           zm_solid = (prfl(i,k)-prfl(i,k+1)+psfl(i,k)-psfl(i,k+1))*dtime  
           d_t(i,k) = d_t(i,k) + zlh_solid(i) *zm_solid / (zcpair*zmair)  
         END DO  
       END DO  
 c  
       RETURN  
       END  

Legend:
Removed from v.10  
changed lines
  Added in v.73

  ViewVC Help
Powered by ViewVC 1.1.21