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

Diff of /trunk/phylmd/fisrtilp.f

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

revision 76 by guez, Fri Nov 15 18:45:49 2013 UTC revision 78 by guez, Wed Feb 5 17:51:07 2014 UTC
# Line 9  contains Line 9  contains
9         frac_impa, frac_nucl, prfl, psfl, rhcl)         frac_impa, frac_nucl, prfl, psfl, rhcl)
10    
11      ! From phylmd/fisrtilp.F, version 1.2 2004/11/09 16:55:40      ! From phylmd/fisrtilp.F, version 1.2 2004/11/09 16:55:40
12      ! Author: Z. X. Li (LMD/CNRS), 20 mars 1995      ! First author: Z. X. Li (LMD/CNRS), 20 mars 1995
13        ! Other authors: Olivier, AA, IM, YM, MAF
14    
15      ! Objet : condensation et précipitation stratiforme, schéma de      ! Objet : condensation et précipitation stratiforme, schéma de
16      ! nuage, schéma de condensation à grande échelle (pluie).      ! nuage, schéma de condensation à grande échelle (pluie).
17    
     USE dimphy, ONLY: klev, klon  
     USE suphec_m, ONLY: rcpd, rd, retv, rg, rlstt, rlvtt, rtt  
     USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2  
     USE fcttre, ONLY: dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep  
18      USE comfisrtilp, ONLY: cld_lc_con, cld_lc_lsc, cld_tau_con, &      USE comfisrtilp, ONLY: cld_lc_con, cld_lc_lsc, cld_tau_con, &
19           cld_tau_lsc, coef_eva, ffallv_con, ffallv_lsc, iflag_pdf, reevap_ice           cld_tau_lsc, coef_eva, ffallv_con, ffallv_lsc, iflag_pdf, reevap_ice
20        USE dimphy, ONLY: klev, klon
21        USE fcttre, ONLY: dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep
22      USE numer_rec_95, ONLY: nr_erf      USE numer_rec_95, ONLY: nr_erf
23        USE suphec_m, ONLY: rcpd, rd, retv, rg, rlstt, rlvtt, rtt
24        USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2
25    
26      ! Arguments:      ! Arguments:
27    
28      REAL, INTENT (IN):: dtime ! intervalle du temps (s)                      REAL, INTENT (IN):: dtime ! intervalle du temps (s)
29      REAL, INTENT (IN):: paprs(klon, klev+1) ! pression a inter-couche        REAL, INTENT (IN):: paprs(klon, klev+1) ! pression a inter-couche
30      REAL, INTENT (IN):: pplay(klon, klev) ! pression au milieu de couche      REAL, INTENT (IN):: pplay(klon, klev) ! pression au milieu de couche
31      REAL, INTENT (IN):: t(klon, klev) ! temperature (K)      REAL, INTENT (IN):: t(klon, klev) ! temperature (K)
32      REAL, INTENT (IN):: q(klon, klev) ! humidite specifique (kg/kg)      REAL, INTENT (IN):: q(klon, klev) ! humidite specifique (kg/kg)
33      LOGICAL ptconv(klon, klev) ! determine la largeur de distribution de vapeur      LOGICAL, INTENT (IN):: ptconv(klon, klev)
34      REAL ratqs(klon, klev) ! determine la largeur de distribution de vapeur  
35      REAL d_t(klon, klev) ! incrementation de la temperature (K)              REAL, INTENT (IN):: ratqs(klon, klev)
36      REAL d_q(klon, klev) ! incrementation de la vapeur d'eau                ! determine la largeur de distribution de vapeur
37      REAL d_ql(klon, klev) ! incrementation de l'eau liquide              
38      REAL rneb(klon, klev) ! fraction nuageuse                                REAL, INTENT (out):: d_t(klon, klev) ! incrementation de la temperature (K)
39      REAL radliq(klon, klev) ! eau liquide utilisee dans rayonnements        REAL, INTENT (out):: d_q(klon, klev) ! incrementation de la vapeur d'eau
40      REAL rain(klon) ! pluies (mm/s)                                        REAL, INTENT (out):: d_ql(klon, klev) ! incrementation de l'eau liquide
41      REAL snow(klon) ! neige (mm/s)                                          REAL, INTENT (out):: rneb(klon, klev) ! fraction nuageuse
42    
43      ! Coeffients de fraction lessivee : pour OFF-LINE      REAL, INTENT (out):: radliq(klon, klev)
44      REAL pfrac_impa(klon, klev)      ! eau liquide utilisee dans rayonnement
45      REAL pfrac_nucl(klon, klev)  
46      REAL pfrac_1nucl(klon, klev)      REAL, INTENT (out):: rain(klon) ! pluies (mm/s)
47        REAL, INTENT (out):: snow(klon) ! neige (mm/s)
48      ! Fraction d'aerosols lessivee par impaction et par nucleation  
49      ! POur ON-LINE      ! Coeffients de fraction lessivee :
50      REAL frac_nucl(klon, klev)      REAL, INTENT (inout):: pfrac_impa(klon, klev)
51        REAL, INTENT (inout):: pfrac_nucl(klon, klev)
52      REAL prfl(klon, klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)      REAL, INTENT (inout):: pfrac_1nucl(klon, klev)
53      REAL psfl(klon, klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s)  
54      REAL rhcl(klon, klev) ! humidite relative en ciel clair                  ! Fraction d'aerosols lessivee par impaction
55        REAL, INTENT (out):: frac_impa(klon, klev)
56    
57        ! Fraction d'aerosols lessivee par nucleation
58        REAL, INTENT (out):: frac_nucl(klon, klev)
59    
60        REAL, INTENT (out):: prfl(klon, klev+1)
61        ! flux d'eau precipitante aux interfaces (kg/m2/s)
62    
63        REAL, INTENT (out):: psfl(klon, klev+1)
64        ! flux d'eau precipitante aux interfaces (kg/m2/s)
65    
66        REAL, INTENT (out):: rhcl(klon, klev) ! humidite relative en ciel clair
67    
68      ! Local:      ! Local:
69    
     ! Fraction d'aerosols lessivee par impaction et par nucleation  
     ! POur ON-LINE  
     REAL frac_impa(klon, klev)  
70      REAL zct(klon), zcl(klon)      REAL zct(klon), zcl(klon)
     !AA  
71    
72      ! Options du programme:      ! Options du programme:
73    
# Line 67  contains Line 76  contains
76    
77      INTEGER ninter ! sous-intervals pour la precipitation      INTEGER ninter ! sous-intervals pour la precipitation
78      PARAMETER (ninter=5)      PARAMETER (ninter=5)
79      LOGICAL evap_prec ! evaporation de la pluie                            LOGICAL evap_prec ! evaporation de la pluie
80      PARAMETER (evap_prec=.TRUE.)      PARAMETER (evap_prec=.TRUE.)
81      REAL zpdf_sig(klon), zpdf_k(klon), zpdf_delta(klon)      REAL zpdf_sig(klon), zpdf_k(klon), zpdf_delta(klon)
82      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)
83    
84      LOGICAL cpartiel ! condensation partielle                              LOGICAL cpartiel ! condensation partielle
85      PARAMETER (cpartiel=.TRUE.)      PARAMETER (cpartiel=.TRUE.)
86      REAL t_coup      REAL t_coup
87      PARAMETER (t_coup=234.0)      PARAMETER (t_coup=234.0)
88    
     ! Variables locales:  
   
89      INTEGER i, k, n, kk      INTEGER i, k, n, kk
90      REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5      REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5
91      REAL zrfl(klon), zrfln(klon), zqev, zqevt      REAL zrfl(klon), zrfln(klon), zqev, zqevt
92      REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq      REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq
93      REAL ztglace, zt(klon)      REAL ztglace, zt(klon)
94      INTEGER nexpo ! exponentiel pour glace/eau                              INTEGER nexpo ! exponentiel pour glace/eau
95      REAL zdz(klon), zrho(klon), ztot(klon), zrhol(klon)      REAL zdz(klon), zrho(klon), ztot(klon), zrhol(klon)
96      REAL zchau(klon), zfroi(klon), zfice(klon), zneb(klon)      REAL zchau(klon), zfroi(klon), zfice(klon), zneb(klon)
97    
98      LOGICAL appel1er      LOGICAL:: appel1er = .TRUE.
     SAVE appel1er  
99    
100      !---------------------------------------------------------------      ! Variables traceurs:
101        ! Provisoire !!! Parametres alpha du lessivage
102        ! A priori on a 4 scavenging numbers possibles
103    
104      !AA Variables traceurs:      REAL, save:: a_tr_sca(4)
     !AA  Provisoire !!! Parametres alpha du lessivage  
     !AA  A priori on a 4 scavenging numbers possibles  
   
     REAL a_tr_sca(4)  
     SAVE a_tr_sca  
105    
106      ! Variables intermediaires      ! Variables intermediaires
107    
108      REAL zalpha_tr      REAL zalpha_tr
109      REAL zfrac_lessi      REAL zfrac_lessi
110      REAL zprec_cond(klon)      REAL zprec_cond(klon)
     !AA  
111      REAL zmair, zcpair, zcpeau      REAL zmair, zcpair, zcpeau
112      !     Pour la conversion eau-neige      ! Pour la conversion eau-neige
113      REAL zlh_solid(klon), zm_solid      REAL zlh_solid(klon), zm_solid
     !IM  
     INTEGER klevm1  
     !---------------------------------------------------------------  
114    
115      ! Fonctions en ligne:      ! Fonctions en ligne:
116    
117      REAL fallvs, fallvc ! vitesse de chute pour crystaux de glace            REAL fallvs, fallvc ! vitesse de chute pour crystaux de glace
118      REAL zzz      REAL zzz
119    
120      fallvc(zzz) = 3.29/2.0*((zzz)**0.16)*ffallv_con      fallvc(zzz) = 3.29/2.0*((zzz)**0.16)*ffallv_con
121      fallvs(zzz) = 3.29/2.0*((zzz)**0.16)*ffallv_lsc      fallvs(zzz) = 3.29/2.0*((zzz)**0.16)*ffallv_lsc
122    
123      DATA appel1er/ .TRUE./      !---------------------------------------------------------------
124      !ym  
125      zdelq = 0.0      zdelq = 0.0
126    
127      IF (appel1er) THEN      IF (appel1er) THEN
   
128         PRINT *, 'fisrtilp, ninter:', ninter         PRINT *, 'fisrtilp, ninter:', ninter
129         PRINT *, 'fisrtilp, evap_prec:', evap_prec         PRINT *, 'fisrtilp, evap_prec:', evap_prec
130         PRINT *, 'fisrtilp, cpartiel:', cpartiel         PRINT *, 'fisrtilp, cpartiel:', cpartiel
# Line 136  contains Line 134  contains
134         END IF         END IF
135         appel1er = .FALSE.         appel1er = .FALSE.
136    
137         !AA initialiation provisoire         ! initialiation provisoire
138         a_tr_sca(1) = -0.5         a_tr_sca(1) = -0.5
139         a_tr_sca(2) = -0.5         a_tr_sca(2) = -0.5
140         a_tr_sca(3) = -0.5         a_tr_sca(3) = -0.5
141         a_tr_sca(4) = -0.5         a_tr_sca(4) = -0.5
142    
143         !AA Initialisation a 1 des coefs des fractions lessivees         ! Initialisation a 1 des coefs des fractions lessivees
   
144         DO k = 1, klev         DO k = 1, klev
145            DO i = 1, klon            DO i = 1, klon
146               pfrac_nucl(i, k) = 1.               pfrac_nucl(i, k) = 1.
# Line 151  contains Line 148  contains
148               pfrac_impa(i, k) = 1.               pfrac_impa(i, k) = 1.
149            END DO            END DO
150         END DO         END DO
151        END IF
152    
153        ! Initialisation a 0 de zoliq
     END IF !  test sur appel1er  
     !MAf Initialisation a 0 de zoliq  
154      DO i = 1, klon      DO i = 1, klon
155         zoliq(i) = 0.         zoliq(i) = 0.
156      END DO      END DO
157      ! Determiner les nuages froids par leur temperature      ! Determiner les nuages froids par leur temperature
158      !  nexpo regle la raideur de la transition eau liquide / eau glace.      ! nexpo regle la raideur de la transition eau liquide / eau glace.
159    
160      ztglace = rtt - 15.0      ztglace = rtt - 15.0
161      nexpo = 6      nexpo = 6
     !cc      nexpo = 1  
162    
163      ! Initialiser les sorties:      ! Initialiser les sorties:
164    
# Line 197  contains Line 192  contains
192         zneb(i) = seuil_neb         zneb(i) = seuil_neb
193      END DO      END DO
194    
195        ! Pour plus de securite
     !AA Pour plus de securite  
196    
197      zalpha_tr = 0.      zalpha_tr = 0.
198      zfrac_lessi = 0.      zfrac_lessi = 0.
199    
200      !AA----------------------------------------------------------      loop_vertical: DO k = klev, 1, -1
   
     ! Boucle verticale (du haut vers le bas)  
   
     !IM : klevm1  
     klevm1 = klev - 1  
     DO  k = klev, 1, -1  
   
        !AA----------------------------------------------------------  
   
201         DO i = 1, klon         DO i = 1, klon
202            zt(i) = t(i, k)            zt(i) = t(i, k)
203            zq(i) = q(i, k)            zq(i) = q(i, k)
# Line 225  contains Line 210  contains
210         ! surface.         ! surface.
211    
212         DO i = 1, klon         DO i = 1, klon
213            IF (k<=klevm1) THEN            IF (k <= klev - 1) THEN
214               zmair = (paprs(i, k)-paprs(i, k+1))/rg               zmair = (paprs(i, k)-paprs(i, k+1))/rg
215               zcpair = rcpd*(1.0+rvtmp2*zq(i))               zcpair = rcpd*(1.0+rvtmp2*zq(i))
216               zcpeau = rcpd*rvtmp2               zcpeau = rcpd*rvtmp2
# Line 235  contains Line 220  contains
220            END IF            END IF
221         END DO         END DO
222    
        ! Calculer l'evaporation de la precipitation  
   
   
   
223         IF (evap_prec) THEN         IF (evap_prec) THEN
224              ! Calculer l'evaporation de la precipitation
225            DO i = 1, klon            DO i = 1, klon
226               IF (zrfl(i)>0.) THEN               IF (zrfl(i)>0.) THEN
227                  IF (thermcep) THEN                  IF (thermcep) THEN
# Line 307  contains Line 289  contains
289         ! de l'eau condensee:         ! de l'eau condensee:
290    
291         IF (cpartiel) THEN         IF (cpartiel) THEN
292              ! Calcul de l'eau condensee et de la fraction nuageuse et de l'eau
293              ! nuageuse a partir des PDF de Sandrine Bony.
294              ! rneb : fraction nuageuse
295              ! zqn : eau totale dans le nuage
296              ! zcond : eau condensee moyenne dans la maille.
297    
298            !        print*, 'Dans partiel k=', k            ! on prend en compte le réchauffement qui diminue
299              ! la partie condensée
           !   Calcul de l'eau condensee et de la fraction nuageuse et de l'eau  
           !   nuageuse a partir des PDF de Sandrine Bony.  
           !   rneb  : fraction nuageuse  
           !   zqn   : eau totale dans le nuage  
           !   zcond : eau condensee moyenne dans la maille.  
300    
301            !           on prend en compte le réchauffement qui diminue            ! Version avec les ratqs
           !           la partie condensee  
   
           !   Version avec les raqts  
302    
303            IF (iflag_pdf==0) THEN            IF (iflag_pdf==0) THEN
   
304               DO i = 1, klon               DO i = 1, klon
305                  zdelq = min(ratqs(i, k), 0.99)*zq(i)                  zdelq = min(ratqs(i, k), 0.99)*zq(i)
306                  rneb(i, k) = (zq(i)+zdelq-zqs(i))/(2.0*zdelq)                  rneb(i, k) = (zq(i)+zdelq-zqs(i))/(2.0*zdelq)
307                  zqn(i) = (zq(i)+zdelq+zqs(i))/2.0                  zqn(i) = (zq(i)+zdelq+zqs(i))/2.0
308               END DO               END DO
   
309            ELSE            ELSE
310                 ! Version avec les nouvelles PDFs.
              !   Version avec les nouvelles PDFs.  
311               DO i = 1, klon               DO i = 1, klon
312                  IF (zq(i)<1.E-15) THEN                  IF (zq(i) < 1E-15) THEN
313                     zq(i) = 1.E-15                     zq(i) = 1E-15
314                  END IF                  END IF
315               END DO               END DO
316               DO i = 1, klon               DO i = 1, klon
# Line 356  contains Line 332  contains
332                     rneb(i, k) = 0.5*zpdf_e1(i)                     rneb(i, k) = 0.5*zpdf_e1(i)
333                     zqn(i) = zq(i)*zpdf_e2(i)/zpdf_e1(i)                     zqn(i) = zq(i)*zpdf_e2(i)/zpdf_e1(i)
334                  END IF                  END IF
   
335               END DO               END DO
   
   
336            END IF            END IF
337            ! iflag_pdf                                                
338            DO i = 1, klon            DO i = 1, klon
339               IF (rneb(i, k)<=0.0) zqn(i) = 0.0               IF (rneb(i, k)<=0.0) zqn(i) = 0.0
340               IF (rneb(i, k)>=1.0) zqn(i) = zq(i)               IF (rneb(i, k)>=1.0) zqn(i) = zq(i)
341               rneb(i, k) = max(0.0, min(1.0, rneb(i, k)))               rneb(i, k) = max(0., min(1., rneb(i, k)))
342               !  On ne divise pas par 1+zdqs pour forcer a avoir l'eau               ! On ne divise pas par 1 + zdqs pour forcer à avoir l'eau
343               !  predite par la convection.  ATTENTION !!! Il va               ! prédite par la convection. Attention : il va falloir
344               !  falloir verifier tout ca.               ! verifier tout ca.
345               zcond(i) = max(0.0, zqn(i)-zqs(i))*rneb(i, k)               zcond(i) = max(0., zqn(i)-zqs(i))*rneb(i, k)
              !           print*, 'ZDQS ', zdqs(i)  
              !--Olivier  
346               rhcl(i, k) = (zqs(i)+zq(i)-zdelq)/2./zqs(i)               rhcl(i, k) = (zqs(i)+zq(i)-zdelq)/2./zqs(i)
347               IF (rneb(i, k)<=0.0) rhcl(i, k) = zq(i)/zqs(i)               IF (rneb(i, k) <= 0.) rhcl(i, k) = zq(i) / zqs(i)
348               IF (rneb(i, k)>=1.0) rhcl(i, k) = 1.0               IF (rneb(i, k) >= 1.) rhcl(i, k) = 1.
              !--fin  
349            END DO            END DO
350         ELSE         ELSE
351            DO i = 1, klon            DO i = 1, klon
# Line 390  contains Line 360  contains
360    
361         DO i = 1, klon         DO i = 1, klon
362            zq(i) = zq(i) - zcond(i)            zq(i) = zq(i) - zcond(i)
           !         zt(i) = zt(i) + zcond(i) * RLVTT/RCPD  
363            zt(i) = zt(i) + zcond(i)*rlvtt/rcpd/(1.0+rvtmp2*zq(i))            zt(i) = zt(i) + zcond(i)*rlvtt/rcpd/(1.0+rvtmp2*zq(i))
364         END DO         END DO
365    
# Line 421  contains Line 390  contains
390                     zcl(i) = cld_lc_lsc                     zcl(i) = cld_lc_lsc
391                     zct(i) = 1./cld_tau_lsc                     zct(i) = 1./cld_tau_lsc
392                  END IF                  END IF
393                  !  quantité d'eau à élminier.                  ! quantité d'eau à élminier.
394                  zchau(i) = zct(i)*dtime/real(ninter)*zoliq(i)* &                  zchau(i) = zct(i)*dtime/real(ninter)*zoliq(i)* &
395                       (1.0-exp(-(zoliq(i)/zneb(i)/zcl(i))**2))*(1.-zfice(i))                       (1.0-exp(-(zoliq(i)/zneb(i)/zcl(i))**2))*(1.-zfice(i))
396                  !  meme chose pour la glace.                  ! meme chose pour la glace.
397                  IF (ptconv(i, k)) THEN                  IF (ptconv(i, k)) THEN
398                     zfroi(i) = dtime/real(ninter)/zdz(i)*zoliq(i)* &                     zfroi(i) = dtime/real(ninter)/zdz(i)*zoliq(i)* &
399                          fallvc(zrhol(i))*zfice(i)                          fallvc(zrhol(i))*zfice(i)
# Line 455  contains Line 424  contains
424         END DO         END DO
425    
426         ! Calculer les tendances de q et de t:         ! Calculer les tendances de q et de t:
   
427         DO i = 1, klon         DO i = 1, klon
428            d_q(i, k) = zq(i) - q(i, k)            d_q(i, k) = zq(i) - q(i, k)
429            d_t(i, k) = zt(i) - t(i, k)            d_t(i, k) = zt(i) - t(i, k)
430         END DO         END DO
431    
432         !AA--------------- Calcul du lessivage stratiforme  -------------         ! Calcul du lessivage stratiforme
   
433         DO i = 1, klon         DO i = 1, klon
434            zprec_cond(i) = max(zcond(i)-zoliq(i), 0.0)* &            zprec_cond(i) = max(zcond(i)-zoliq(i), 0.0)* &
435                 (paprs(i, k)-paprs(i, k+1))/rg                 (paprs(i, k)-paprs(i, k+1))/rg
436            IF (rneb(i, k)>0.0 .AND. zprec_cond(i)>0.) THEN            IF (rneb(i, k)>0.0 .AND. zprec_cond(i)>0.) THEN
437               !AA lessivage nucleation LMD5 dans la couche elle-meme               ! lessivage nucleation LMD5 dans la couche elle-meme
438               IF (t(i, k)>=ztglace) THEN               IF (t(i, k)>=ztglace) THEN
439                  zalpha_tr = a_tr_sca(3)                  zalpha_tr = a_tr_sca(3)
440               ELSE               ELSE
# Line 481  contains Line 448  contains
448               zfrac_lessi = 1. - exp(-zprec_cond(i)/zneb(i))               zfrac_lessi = 1. - exp(-zprec_cond(i)/zneb(i))
449               pfrac_1nucl(i, k) = pfrac_1nucl(i, k)*(1.-zneb(i)*zfrac_lessi)               pfrac_1nucl(i, k) = pfrac_1nucl(i, k)*(1.-zneb(i)*zfrac_lessi)
450            END IF            END IF
   
   
451         END DO         END DO
452         !AA Lessivage par impaction dans les couches en-dessous  
453         ! boucle sur i                                                 ! Lessivage par impaction dans les couches en-dessous
454           ! boucle sur i
455         DO kk = k - 1, 1, -1         DO kk = k - 1, 1, -1
456            DO i = 1, klon            DO i = 1, klon
457               IF (rneb(i, k)>0.0 .AND. zprec_cond(i)>0.) THEN               IF (rneb(i, k)>0. .AND. zprec_cond(i)>0.) THEN
458                  IF (t(i, kk)>=ztglace) THEN                  IF (t(i, kk)>=ztglace) THEN
459                     zalpha_tr = a_tr_sca(1)                     zalpha_tr = a_tr_sca(1)
460                  ELSE                  ELSE
# Line 500  contains Line 466  contains
466               END IF               END IF
467            END DO            END DO
468         END DO         END DO
469        end DO loop_vertical
        !AA----------------------------------------------------------  
        !                     FIN DE BOUCLE SUR K  
     end DO  
   
     !AA-----------------------------------------------------------  
470    
471      ! Pluie ou neige au sol selon la temperature de la 1ere couche      ! Pluie ou neige au sol selon la temperature de la 1ere couche
472    

Legend:
Removed from v.76  
changed lines
  Added in v.78

  ViewVC Help
Powered by ViewVC 1.1.21