/[lmdze]/trunk/libf/phylmd/fisrtilp.f90
ViewVC logotype

Diff of /trunk/libf/phylmd/fisrtilp.f90

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

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

Legend:
Removed from v.3  
changed lines
  Added in v.36

  ViewVC Help
Powered by ViewVC 1.1.21