/[lmdze]/trunk/phylmd/newmicro.f90
ViewVC logotype

Diff of /trunk/phylmd/newmicro.f90

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

revision 76 by guez, Fri Nov 15 18:45:49 2013 UTC revision 337 by guez, Mon Sep 16 16:54:50 2019 UTC
# Line 4  module newmicro_m Line 4  module newmicro_m
4    
5  contains  contains
6    
7    SUBROUTINE newmicro (paprs, play, t, qlwp, clc, cltau, clemi, cldh, &    SUBROUTINE newmicro (paprs, play, t, qlwp, clc, cldtau, clemi, cldh, cldl, &
8         cldl, cldm, cldt, ctlwp, flwp, fiwp, flwc, fiwc, ok_aie, sulfate, &         cldm, cldt, ctlwp, flwp, fiwp, flwc, fiwc)
        sulfate_pi, bl95_b0, bl95_b1, cldtaupi, re, fl)  
9    
10      ! From LMDZ4/libf/phylmd/newmicro.F, version 1.2 2004/06/03 09:22:43      ! From LMDZ4/libf/phylmd/newmicro.F, version 1.2 2004/06/03 09:22:43
11    
12      ! Authors: Z. X. Li (LMD/CNRS), Johannes Quaas      ! Authors: Z. X. Li (LMD/CNRS), Johannes Quaas
13      ! Date: 1993/09/10      ! Date: 1993/09/10
14      ! Objet: calcul de l'épaisseur optique et de l'émissivité des nuages.      ! Objet: calcul de l'\'epaisseur optique et de l'\'emissivit\'e des nuages.
15    
16      USE conf_phys_m, ONLY: rad_chau1, rad_chau2      USE conf_phys_m, ONLY: rad_chau1, rad_chau2
17      USE dimphy, ONLY: klev, klon      USE dimphy, ONLY: klev, klon
18      USE suphec_m, ONLY: rd, rg      USE histwrite_phy_m, ONLY: histwrite_phy
19      use nr_util, only: pi      USE suphec_m, ONLY: rg
20    
21      REAL, intent(in):: paprs(:, :) ! (klon, klev+1)      REAL, intent(in):: paprs(:, :) ! (klon, klev+1)
22      real, intent(in):: play(:, :) ! (klon, klev)      real, intent(in):: play(:, :) ! (klon, klev)
23      REAL, intent(in):: t(:, :) ! (klon, klev) temperature      REAL, intent(in):: t(:, :) ! (klon, klev) temperature
24    
25      REAL, intent(in):: qlwp(:, :) ! (klon, klev)      REAL, intent(in):: qlwp(:, :) ! (klon, klev)
26      ! eau liquide nuageuse dans l'atmosphère (kg/kg)      ! eau liquide nuageuse dans l'atmosphère (kg / kg)
27    
28      REAL, intent(inout):: clc(:, :) ! (klon, klev)      REAL, intent(inout):: clc(:, :) ! (klon, klev)
29      ! couverture nuageuse pour le rayonnement (0 à 1)      ! couverture nuageuse pour le rayonnement (0 à 1)
30    
31      REAL, intent(out):: cltau(:, :) ! (klon, klev)  épaisseur optique des nuages      REAL, intent(out):: cldtau(:, :) ! (klon, klev)
32      REAL, intent(out):: clemi(:, :) ! (klon, klev) émissivité des nuages (0 à 1)      ! \'epaisseur optique des nuages
33        
34        REAL, intent(out):: clemi(:, :) ! (klon, klev)
35        ! \'emissivit\'e des nuages (0 à 1)
36    
37      REAL, intent(out):: cldh(:), cldl(:), cldm(:), cldt(:) ! (klon)      REAL, intent(out):: cldh(:), cldl(:), cldm(:), cldt(:) ! (klon)
38      REAL, intent(out):: ctlwp(:) ! (klon)      REAL, intent(out):: ctlwp(:) ! (klon)
39      REAL, intent(out):: flwp(:), fiwp(:) ! (klon)      REAL, intent(out):: flwp(:), fiwp(:) ! (klon)
40      REAL, intent(out):: flwc(:, :), fiwc(:, :) ! (klon, klev)      REAL, intent(out):: flwc(:, :), fiwc(:, :) ! (klon, klev)
     LOGICAL, intent(in):: ok_aie ! apply aerosol indirect effect  
41    
42      REAL, intent(in):: sulfate(:, :) ! (klon, klev)      ! Local:
     ! sulfate aerosol mass concentration (micro g m-3)  
   
     REAL, intent(in):: sulfate_pi(:, :) ! (klon, klev)  
     ! sulfate aerosol mass concentration (micro g m-3), pre-industrial value  
   
     REAL, intent(in):: bl95_b0, bl95_b1  
     ! Parameters in equation (D) of Boucher and Lohmann (1995, Tellus  
     ! B). They link cloud droplet number concentration to aerosol mass  
     ! concentration.  
   
     REAL, intent(out):: cldtaupi(:, :) ! (klon, klev)  
     ! pre-industrial value of cloud optical thickness, needed for the  
     ! diagnosis of the aerosol indirect radiative forcing (see  
     ! radlwsw)  
43    
44      REAL, intent(out):: re(:, :) ! (klon, klev)      REAL re(klon, klev)
45      ! cloud droplet effective radius multiplied by fl (micro m)      ! cloud droplet effective radius multiplied by fl (micro m)
46    
47      REAL, intent(out):: fl(:, :) ! (klon, klev)      REAL fl(klon, klev)
48      ! Denominator to re, introduced to avoid problems in the averaging      ! Denominator to re, introduced to avoid problems in the averaging
49      ! of the output. fl is the fraction of liquid water clouds within      ! of the output. fl is the fraction of liquid water clouds within
50      ! a grid cell.      ! a grid cell.
51    
     ! Local:  
   
52      REAL, PARAMETER:: cetahb = 0.45, cetamb = 0.8      REAL, PARAMETER:: cetahb = 0.45, cetamb = 0.8
53      INTEGER i, k      INTEGER i, k
54      REAL zflwp(klon), fice      REAL zflwp
55      REAL radius, rad_chaud      real fice ! fraction of ice in cloud
56        REAL rad_chaud
57      REAL, PARAMETER:: coef_chau = 0.13      REAL, PARAMETER:: coef_chau = 0.13
58      REAL, PARAMETER:: seuil_neb = 0.001, t_glace = 273. - 15.      REAL, PARAMETER:: seuil_neb = 0.001, t_glace = 258.
59      real rel, tc, rei, zfiwp(klon)      real rel, tc, rei, zfiwp
60      real k_ice      real k_ice
61      real, parameter:: k_ice0 = 0.005 ! units=m2/g      real, parameter:: k_ice0 = 0.005 ! units=m2 / g
62      real, parameter:: DF = 1.66 ! diffusivity factor      real, parameter:: DF = 1.66 ! diffusivity factor
     REAL cdnc(klon, klev) ! cloud droplet number concentration (m-3)  
   
     REAL cdnc_pi(klon, klev)  
     ! cloud droplet number concentration, pre-industrial value (m-3)  
63    
64      !-----------------------------------------------------------------      !-----------------------------------------------------------------
65    
66      ! Calculer l'épaisseur optique et l'émissivité des nuages      ! Calculer l'\'epaisseur optique et l'\'emissivit\'e des nuages
67    
68      loop_horizontal: DO i = 1, klon      loop_horizontal: DO i = 1, klon
69         flwp(i) = 0.         flwp(i) = 0.
70         fiwp(i) = 0.         fiwp(i) = 0.
71    
72         DO k = 1, klev         loop_vertical: DO k = 1, klev
73            clc(i, k) = MAX(clc(i, k), seuil_neb)            clc(i, k) = MAX(clc(i, k), seuil_neb)
74    
75            ! liquid/ice cloud water paths:            ! liquid/ice cloud water paths:
76    
77              ! Linear transition:
78            fice = 1. - (t(i, k) - t_glace) / (273.13 - t_glace)            fice = 1. - (t(i, k) - t_glace) / (273.13 - t_glace)
79            fice = MIN(MAX(fice, 0.), 1.)            fice = MIN(MAX(fice, 0.), 1.)
80    
81            zflwp(i) = 1000. * (1. - fice) * qlwp(i, k) / clc(i, k) &            zflwp = 1000. * (1. - fice) * qlwp(i, k) / clc(i, k) &
82                 * (paprs(i, k) - paprs(i, k + 1)) / RG                 * (paprs(i, k) - paprs(i, k + 1)) / RG
83            zfiwp(i) = 1000. * fice * qlwp(i, k) / clc(i, k) &            zfiwp = 1000. * fice * qlwp(i, k) / clc(i, k) &
84                 * (paprs(i, k) - paprs(i, k + 1)) / RG                 * (paprs(i, k) - paprs(i, k + 1)) / RG
85    
86            flwp(i) = flwp(i) &            flwp(i) = flwp(i) &
# Line 113  contains Line 96  contains
96            ! effective cloud droplet radius (microns):            ! effective cloud droplet radius (microns):
97    
98            ! for liquid water clouds:            ! for liquid water clouds:
99            IF (ok_aie) THEN            rad_chaud = merge(rad_chau2, rad_chau1, k <= 3)
100               cdnc(i, k) = 10.**(bl95_b0 + bl95_b1 &            
                   * log10(MAX(sulfate(i, k), 1e-4))) * 1.e6  
              cdnc_pi(i, k) = 10.**(bl95_b0 + bl95_b1 &  
                   * log10(MAX(sulfate_pi(i, k), 1e-4))) * 1e6  
   
              ! Restrict to interval [20, 1000] cm^3:  
              cdnc(i, k) = MIN(1000e6, MAX(20e6, cdnc(i, k)))  
              cdnc_pi(i, k) = MIN(1000e6, MAX(20e6, cdnc_pi(i, k)))  
   
              ! air density: play(i, k) / (RD * T(i, k))  
              ! factor 1.1: derive effective radius from volume-mean radius  
              ! factor 1000 is the water density  
              ! "_chaud" means that this is the CDR for liquid water clouds  
   
              rad_chaud = 1.1 * ((qlwp(i, k) * play(i, k) / (RD * T(i, k))) &  
                   / (4./3. * PI * 1000. * cdnc(i, k)))**(1./3.)  
   
              ! Convert to micro m and set a lower limit:  
              rad_chaud = MAX(rad_chaud * 1e6, 5.)  
   
              ! Pre-industrial cloud optical thickness  
   
              ! "radius" is calculated as rad_chaud above (plus the  
              ! ice cloud contribution) but using cdnc_pi instead of  
              ! cdnc.  
              radius = 1.1 * ((qlwp(i, k) * play(i, k) / (RD * T(i, k))) &  
                   / (4./3. * PI * 1000. * cdnc_pi(i, k)))**(1./3.)  
              radius = MAX(radius * 1e6, 5.)  
   
              tc = t(i, k)-273.15  
              rei = merge(3.5, 0.71 * tc + 61.29, tc <= -81.4)  
              if (zflwp(i) == 0.) radius = 1.  
              if (zfiwp(i) == 0. .or. rei <= 0.) rei = 1.  
              cldtaupi(i, k) = 3. / 2. * zflwp(i) / radius &  
                   + zfiwp(i) * (3.448e-03 + 2.431 / rei)  
           else  
              rad_chaud = merge(rad_chau2, rad_chau1, k <= 3)  
           ENDIF  
101            ! For output diagnostics            ! For output diagnostics
102    
103            ! Cloud droplet effective radius (micro m)            ! Cloud droplet effective radius (micro m)
# Line 173  contains Line 119  contains
119            tc = t(i, k)-273.15            tc = t(i, k)-273.15
120            rei = merge(3.5, 0.71 * tc + 61.29, tc <= -81.4)            rei = merge(3.5, 0.71 * tc + 61.29, tc <= -81.4)
121    
122            ! cloud optical thickness:            ! Cloud optical thickness:
123              ! (for liquid clouds, traditional formula, for ice clouds,
124            ! (for liquid clouds, traditional formula,            ! Ebert and Curry (1992))
125            ! for ice clouds, Ebert & Curry (1992))            if (zflwp == 0.) rel = 1.
126              if (zfiwp == 0. .or. rei <= 0.) rei = 1.
127            if (zflwp(i) == 0.) rel = 1.            cldtau(i, k) = 3. / 2. * (zflwp / rel) &
128            if (zfiwp(i) == 0. .or. rei <= 0.) rei = 1.                 + zfiwp * (3.448e-03 + 2.431 / rei)
           cltau(i, k) = 3./2. * (zflwp(i)/rel) &  
                + zfiwp(i) * (3.448e-03 + 2.431/rei)  
129    
130            ! cloud infrared emissivity:            ! cloud infrared emissivity:
131    
# Line 191  contains Line 135  contains
135            ! Ebert and Curry (1992) formula as used by Kiehl & Zender (1995):            ! Ebert and Curry (1992) formula as used by Kiehl & Zender (1995):
136            k_ice = k_ice0 + 1. / rei            k_ice = k_ice0 + 1. / rei
137    
138            clemi(i, k) = 1. - EXP(- coef_chau * zflwp(i) - DF * k_ice * zfiwp(i))            clemi(i, k) = 1. - EXP(- coef_chau * zflwp - DF * k_ice * zfiwp)
139    
140            if (clc(i, k) <= seuil_neb) then            if (clc(i, k) <= seuil_neb) then
141               clc(i, k) = 0.               clc(i, k) = 0.
142               cltau(i, k) = 0.               cldtau(i, k) = 0.
143               clemi(i, k) = 0.               clemi(i, k) = 0.
              cldtaupi(i, k) = 0.  
144            end if            end if
145           ENDDO loop_vertical
           IF (.NOT. ok_aie) cldtaupi(i, k) = cltau(i, k)  
        ENDDO  
146      ENDDO loop_horizontal      ENDDO loop_horizontal
147    
148      ! COMPUTE CLOUD LIQUID PATH AND TOTAL CLOUDINESS      ! COMPUTE CLOUD LIQUID PATH AND TOTAL CLOUDINESS
# Line 236  contains Line 177  contains
177         cldl(i)=1.-cldl(i)         cldl(i)=1.-cldl(i)
178      ENDDO      ENDDO
179    
180        CALL histwrite_phy("re", re)
181        CALL histwrite_phy("fl", fl)
182    
183    END SUBROUTINE newmicro    END SUBROUTINE newmicro
184    
185  end module newmicro_m  end module newmicro_m

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

  ViewVC Help
Powered by ViewVC 1.1.21