source: LMDZ6/trunk/libf/phylmd/newmicro.F90 @ 3443

Last change on this file since 3443 was 3281, checked in by musat, 7 years ago

Correction commission precedente

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.3 KB
RevLine 
[1279]1! $Id: newmicro.F90 3281 2018-03-16 18:26:14Z oboucher $
[1523]2
[3274]3SUBROUTINE newmicro(flag_aerosol, ok_cdnc, bl95_b0, bl95_b1, paprs, pplay, t, pqlwp, pclc, &
[1992]4    pcltau, pclemi, pch, pcl, pcm, pct, pctlwp, xflwp, xfiwp, xflwc, xfiwc, &
5    mass_solu_aero, mass_solu_aero_pi, pcldtaupi, re, fl, reliq, reice, &
6    reliq_pi, reice_pi)
[524]7
[1992]8  USE dimphy
9  USE phys_local_var_mod, ONLY: scdnc, cldncl, reffclwtop, lcc, reffclws, &
[3274]10      reffclwc, cldnvi, lcc3d, lcc3dcon, lcc3dstra, icc3dcon, icc3dstra,  &
11      zfice, dNovrN
[1992]12  USE phys_state_var_mod, ONLY: rnebcon, clwcon
[2109]13  USE icefrac_lsc_mod ! computes ice fraction (JBM 3/14)
[3245]14  USE ioipsl_getin_p_mod, ONLY : getin_p
[3265]15  USE print_control_mod, ONLY: lunout
[3245]16
[3265]17
[1992]18  IMPLICIT NONE
19  ! ======================================================================
20  ! Auteur(s): Z.X. Li (LMD/CNRS) date: 19930910
21  ! O.   Boucher (LMD/CNRS) mise a jour en 201212
[2596]22  ! I. Musat (LMD/CNRS) : prise en compte de la meme hypothese de recouvrement
23  !                       pour les nuages que pour le rayonnement rrtm via
24  !                       le parametre novlp de radopt.h : 20160721
[1992]25  ! Objet: Calculer epaisseur optique et emmissivite des nuages
26  ! ======================================================================
27  ! Arguments:
28  ! ok_cdnc-input-L-flag pour calculer les rayons a partir des aerosols
[1146]29
[1992]30  ! t-------input-R-temperature
31  ! pqlwp---input-R-eau liquide nuageuse dans l'atmosphere dans la partie
32  ! nuageuse (kg/kg)
33  ! pclc----input-R-couverture nuageuse pour le rayonnement (0 a 1)
34  ! mass_solu_aero-----input-R-total mass concentration for all soluble
35  ! aerosols[ug/m^3]
36  ! mass_solu_aero_pi--input-R-ditto, pre-industrial value
[1279]37
[1992]38  ! bl95_b0-input-R-a PARAMETER, may be varied for tests (s-sea, l-land)
39  ! bl95_b1-input-R-a PARAMETER, may be varied for tests (    -"-      )
40
41  ! re------output-R-Cloud droplet effective radius multiplied by fl [um]
42  ! fl------output-R-Denominator to re, introduced to avoid problems in
43  ! the averaging of the output. fl is the fraction of liquid
44  ! water clouds within a grid cell
45
46  ! pcltau--output-R-epaisseur optique des nuages
47  ! pclemi--output-R-emissivite des nuages (0 a 1)
48  ! pcldtaupi-output-R-pre-industrial value of cloud optical thickness,
49
50  ! pcl-output-R-2D low-level cloud cover
51  ! pcm-output-R-2D mid-level cloud cover
52  ! pch-output-R-2D high-level cloud cover
53  ! pct-output-R-2D total cloud cover
54  ! ======================================================================
55
56  include "YOMCST.h"
57  include "nuage.h"
58  include "radepsi.h"
59  include "radopt.h"
60
[2596]61  ! choix de l'hypothese de recouvrement nuageuse via radopt.h (IM, 19.07.2016)
62  ! !novlp=1: max-random
63  ! !novlp=2: maximum
64  ! !novlp=3: random
65! LOGICAL random, maximum_random, maximum
66! PARAMETER (random=.FALSE., maximum_random=.TRUE., maximum=.FALSE.)
[1992]67
68  LOGICAL, SAVE :: first = .TRUE.
69  !$OMP THREADPRIVATE(FIRST)
70  INTEGER flag_max
71
72  ! threshold PARAMETERs
73  REAL thres_tau, thres_neb
74  PARAMETER (thres_tau=0.3, thres_neb=0.001)
75
76  REAL phase3d(klon, klev)
77  REAL tcc(klon), ftmp(klon), lcc_integrat(klon), height(klon)
78
79  REAL paprs(klon, klev+1)
80  REAL pplay(klon, klev)
81  REAL t(klon, klev)
82  REAL pclc(klon, klev)
83  REAL pqlwp(klon, klev)
84  REAL pcltau(klon, klev)
85  REAL pclemi(klon, klev)
86  REAL pcldtaupi(klon, klev)
87
88  REAL pct(klon)
89  REAL pcl(klon)
90  REAL pcm(klon)
91  REAL pch(klon)
92  REAL pctlwp(klon)
93
94  LOGICAL lo
95
96  ! !Abderr modif JL mail du 19.01.2011 18:31
97  ! REAL cetahb, cetamb
98  ! PARAMETER (cetahb = 0.45, cetamb = 0.80)
99  ! Remplacer
100  ! cetahb*paprs(i,1) par  prmhc
101  ! cetamb*paprs(i,1) par  prlmc
102  REAL prmhc ! Pressure between medium and high level cloud in Pa
103  REAL prlmc ! Pressure between low and medium level cloud in Pa
104  PARAMETER (prmhc=440.*100., prlmc=680.*100.)
105
106  INTEGER i, k
107  REAL xflwp(klon), xfiwp(klon)
108  REAL xflwc(klon, klev), xfiwc(klon, klev)
109
110  REAL radius
111
112  REAL coef_froi, coef_chau
113  PARAMETER (coef_chau=0.13, coef_froi=0.09)
114
115  REAL seuil_neb
116  PARAMETER (seuil_neb=0.001)
117
[2006]118! JBM (3/14) nexpo is replaced by exposant_glace
119! INTEGER nexpo ! exponentiel pour glace/eau
120! PARAMETER (nexpo=6)
121! PARAMETER (nexpo=1)
122! if iflag_t_glace=0, the old values are used:
123  REAL, PARAMETER :: t_glace_min_old = 258.
124  REAL, PARAMETER :: t_glace_max_old = 273.13
[1992]125
126  REAL rel, tc, rei
127  REAL k_ice0, k_ice, df
128  PARAMETER (k_ice0=0.005) ! units=m2/g
129  PARAMETER (df=1.66) ! diffusivity factor
130
131  ! jq for the aerosol indirect effect
132  ! jq introduced by Johannes Quaas (quaas@lmd.jussieu.fr), 27/11/2003
133  ! jq
134  REAL mass_solu_aero(klon, klev) ! total mass concentration for all soluble aerosols [ug m-3]
135  REAL mass_solu_aero_pi(klon, klev) ! - " - (pre-industrial value)
136  REAL cdnc(klon, klev) ! cloud droplet number concentration [m-3]
137  REAL re(klon, klev) ! cloud droplet effective radius [um]
138  REAL cdnc_pi(klon, klev) ! cloud droplet number concentration [m-3] (pi value)
139  REAL re_pi(klon, klev) ! cloud droplet effective radius [um] (pi value)
140
141  REAL fl(klon, klev) ! xliq * rneb (denominator to re; fraction of liquid water clouds
142  ! within the grid cell)
143
[3274]144  INTEGER flag_aerosol
[1992]145  LOGICAL ok_cdnc
146  REAL bl95_b0, bl95_b1 ! Parameter in B&L 95-Formula
147
148  ! jq-end
149  ! IM cf. CR:parametres supplementaires
150  REAL zclear(klon)
151  REAL zcloud(klon)
152  REAL zcloudh(klon)
153  REAL zcloudm(klon)
154  REAL zcloudl(klon)
155  REAL rhodz(klon, klev) !--rho*dz pour la couche
156  REAL zrho(klon, klev) !--rho pour la couche
157  REAL dh(klon, klev) !--dz pour la couche
158  REAL rad_chaud(klon, klev) !--rayon pour les nuages chauds
159  REAL rad_chaud_pi(klon, klev) !--rayon pour les nuages chauds pre-industriels
160  REAL zflwp_var, zfiwp_var
161  REAL d_rei_dt
162
163  ! Abderrahmane oct 2009
164  REAL reliq(klon, klev), reice(klon, klev)
165  REAL reliq_pi(klon, klev), reice_pi(klon, klev)
166
[3245]167  REAL,SAVE :: cdnc_min=-1.
168  REAL,SAVE :: cdnc_min_m3
169  !$OMP THREADPRIVATE(cdnc_min,cdnc_min_m3)
[3280]170  REAL,SAVE :: cdnc_max=-1.
171  REAL,SAVE :: cdnc_max_m3
172  !$OMP THREADPRIVATE(cdnc_max,cdnc_max_m3)
[3245]173
[1992]174  ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
175  ! FH : 2011/05/24
176
177  ! rei = ( rei_max - rei_min ) * T(°C) / 81.4 + rei_max
178  ! to be used for a temperature in celcius T(°C) < 0
179  ! rei=rei_min for T(°C) < -81.4
180
181  ! Calcul de la pente de la relation entre rayon effective des cristaux
182  ! et la température.
183  ! Pour retrouver les résultats numériques de la version d'origine,
184  ! on impose 0.71 quand on est proche de 0.71
185
[3245]186  if (first) THEN
187      call getin_p('cdnc_min',cdnc_min)
[3265]188      cdnc_min_m3=cdnc_min*1.E6
[3245]189      IF (cdnc_min_m3<0.) cdnc_min_m3=20.E6 ! astuce pour retrocompatibilite
[3265]190      write(lunout,*)'cdnc_min=', cdnc_min_m3/1.E6
[3280]191      call getin_p('cdnc_max',cdnc_max)
192      cdnc_max_m3=cdnc_max*1.E6
193      IF (cdnc_max_m3<0.) cdnc_max_m3=1000.E6 ! astuce pour retrocompatibilite
194      write(lunout,*)'cdnc_max=', cdnc_max_m3/1.E6
[3245]195  ENDIF
196
[1992]197  d_rei_dt = (rei_max-rei_min)/81.4
198  IF (abs(d_rei_dt-0.71)<1.E-4) d_rei_dt = 0.71
199  ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
200
201  ! Calculer l'epaisseur optique et l'emmissivite des nuages
202  ! IM inversion des DO
203
204  xflwp = 0.D0
205  xfiwp = 0.D0
206  xflwc = 0.D0
207  xfiwc = 0.D0
208
209  reliq = 0.
210  reice = 0.
211  reliq_pi = 0.
212  reice_pi = 0.
213
[2006]214  IF (iflag_t_glace.EQ.0) THEN
215    DO k = 1, klev
216      DO i = 1, klon
217        ! -layer calculation
218        rhodz(i, k) = (paprs(i,k)-paprs(i,k+1))/rg ! kg/m2
219        zrho(i, k) = pplay(i, k)/t(i, k)/rd ! kg/m3
220        dh(i, k) = rhodz(i, k)/zrho(i, k) ! m
221        ! -Fraction of ice in cloud using a linear transition
222        zfice(i, k) = 1.0 - (t(i,k)-t_glace_min_old)/(t_glace_max_old-t_glace_min_old)
223        zfice(i, k) = min(max(zfice(i,k),0.0), 1.0)
224        ! -IM Total Liquid/Ice water content
225        xflwc(i, k) = (1.-zfice(i,k))*pqlwp(i, k)
226        xfiwc(i, k) = zfice(i, k)*pqlwp(i, k)
[3274]227      ENDDO
228    ENDDO
[2006]229  ELSE ! of IF (iflag_t_glace.EQ.0)
230    DO k = 1, klev
[2109]231        CALL icefrac_lsc(klon,t(:,k),pplay(:,k)/paprs(:,1),zfice(:,k))
[2077]232 
233
[2109]234        ! JBM: icefrac_lsc is now contained icefrac_lsc_mod
[2077]235!       zfice(i, k) = icefrac_lsc(t(i,k), t_glace_min, &
236!                                 t_glace_max, exposant_glace)
[2006]237      DO i = 1, klon
238        ! -layer calculation
239        rhodz(i, k) = (paprs(i,k)-paprs(i,k+1))/rg ! kg/m2
240        zrho(i, k) = pplay(i, k)/t(i, k)/rd ! kg/m3
241        dh(i, k) = rhodz(i, k)/zrho(i, k) ! m
242        ! -IM Total Liquid/Ice water content
243        xflwc(i, k) = (1.-zfice(i,k))*pqlwp(i, k)
244        xfiwc(i, k) = zfice(i, k)*pqlwp(i, k)
[3274]245      ENDDO
246    ENDDO
[2006]247  ENDIF
[1992]248
249  IF (ok_cdnc) THEN
250
251    ! --we compute cloud properties as a function of the aerosol load
252
253    DO k = 1, klev
254      DO i = 1, klon
255        ! Formula "D" of Boucher and Lohmann, Tellus, 1995
256        ! Cloud droplet number concentration (CDNC) is restricted
257        ! to be within [20, 1000 cm^3]
258
259        ! --pre-industrial case
260        cdnc_pi(i, k) = 10.**(bl95_b0+bl95_b1*log(max(mass_solu_aero_pi(i,k), &
261          1.E-4))/log(10.))*1.E6 !-m-3
[3281]262        cdnc_pi(i, k) = min(cdnc_max_m3, max(cdnc_min_m3,cdnc_pi(i,k)))
[1992]263
[3274]264      ENDDO
265    ENDDO
266
267    !--flag_aerosol=7 => MACv2SP climatology
268    !--in this case there is an enhancement factor
269    IF (flag_aerosol .EQ. 7) THEN
270
271      !--present-day
272      DO k = 1, klev
273        DO i = 1, klon
274          cdnc(i, k) = cdnc_pi(i,k)*dNovrN(i)
275        ENDDO
276      ENDDO
277
278    !--standard case
279    ELSE
280
281      DO k = 1, klev
282        DO i = 1, klon
283
284          ! Formula "D" of Boucher and Lohmann, Tellus, 1995
285          ! Cloud droplet number concentration (CDNC) is restricted
286          ! to be within [20, 1000 cm^3]
287
288          ! --present-day case
289          cdnc(i, k) = 10.**(bl95_b0+bl95_b1*log(max(mass_solu_aero(i,k), &
290            1.E-4))/log(10.))*1.E6 !-m-3
[3281]291          cdnc(i, k) = min(cdnc_max_m3, max(cdnc_min_m3,cdnc(i,k)))
[3274]292
293        ENDDO
294      ENDDO
295
296    ENDIF !--flag_aerosol
297
298    !--computing cloud droplet size
299    DO k = 1, klev
300      DO i = 1, klon
301
[1992]302        ! --present-day case
303        rad_chaud(i, k) = 1.1*((pqlwp(i,k)*pplay(i, &
304          k)/(rd*t(i,k)))/(4./3*rpi*1000.*cdnc(i,k)))**(1./3.)
305        rad_chaud(i, k) = max(rad_chaud(i,k)*1.E6, 5.)
306
307        ! --pre-industrial case
308        rad_chaud_pi(i, k) = 1.1*((pqlwp(i,k)*pplay(i, &
309          k)/(rd*t(i,k)))/(4./3.*rpi*1000.*cdnc_pi(i,k)))**(1./3.)
310        rad_chaud_pi(i, k) = max(rad_chaud_pi(i,k)*1.E6, 5.)
311
312        ! --pre-industrial case
313        ! --liquid/ice cloud water paths:
314        IF (pclc(i,k)<=seuil_neb) THEN
315
316          pcldtaupi(i, k) = 0.0
317
318        ELSE
319
320          zflwp_var = 1000.*(1.-zfice(i,k))*pqlwp(i, k)/pclc(i, k)* &
321            rhodz(i, k)
322          zfiwp_var = 1000.*zfice(i, k)*pqlwp(i, k)/pclc(i, k)*rhodz(i, k)
323          tc = t(i, k) - 273.15
324          rei = d_rei_dt*tc + rei_max
325          IF (tc<=-81.4) rei = rei_min
326
327          ! -- cloud optical thickness :
328          ! [for liquid clouds, traditional formula,
329          ! for ice clouds, Ebert & Curry (1992)]
330
331          IF (zfiwp_var==0. .OR. rei<=0.) rei = 1.
332          pcldtaupi(i, k) = 3.0/2.0*zflwp_var/rad_chaud_pi(i, k) + &
333            zfiwp_var*(3.448E-03+2.431/rei)
334
[3274]335        ENDIF
[1992]336
[3274]337      ENDDO
338    ENDDO
[1992]339
340  ELSE !--not ok_cdnc
341
342    ! -prescribed cloud droplet radius
343
344    DO k = 1, min(3, klev)
345      DO i = 1, klon
346        rad_chaud(i, k) = rad_chau2
347        rad_chaud_pi(i, k) = rad_chau2
[3274]348      ENDDO
349    ENDDO
[1992]350    DO k = min(3, klev) + 1, klev
351      DO i = 1, klon
352        rad_chaud(i, k) = rad_chau1
353        rad_chaud_pi(i, k) = rad_chau1
[3274]354      ENDDO
355    ENDDO
[1992]356
[3274]357  ENDIF !--ok_cdnc
[1992]358
359  ! --computation of cloud optical depth and emissivity
360  ! --in the general case
361
362  DO k = 1, klev
363    DO i = 1, klon
364
365      IF (pclc(i,k)<=seuil_neb) THEN
366
367        ! effective cloud droplet radius (microns) for liquid water clouds:
368        ! For output diagnostics cloud droplet effective radius [um]
369        ! we multiply here with f * xl (fraction of liquid water
370        ! clouds in the grid cell) to avoid problems in the averaging of the
371        ! output.
372        ! In the output of IOIPSL, derive the REAL cloud droplet
373        ! effective radius as re/fl
374
375        fl(i, k) = seuil_neb*(1.-zfice(i,k))
376        re(i, k) = rad_chaud(i, k)*fl(i, k)
377        rel = 0.
378        rei = 0.
379        pclc(i, k) = 0.0
380        pcltau(i, k) = 0.0
381        pclemi(i, k) = 0.0
382
383      ELSE
384
385        ! -- liquid/ice cloud water paths:
386
387        zflwp_var = 1000.*(1.-zfice(i,k))*pqlwp(i, k)/pclc(i, k)*rhodz(i, k)
388        zfiwp_var = 1000.*zfice(i, k)*pqlwp(i, k)/pclc(i, k)*rhodz(i, k)
389
390        ! effective cloud droplet radius (microns) for liquid water clouds:
391        ! For output diagnostics cloud droplet effective radius [um]
392        ! we multiply here with f * xl (fraction of liquid water
393        ! clouds in the grid cell) to avoid problems in the averaging of the
394        ! output.
395        ! In the output of IOIPSL, derive the REAL cloud droplet
396        ! effective radius as re/fl
397
398        fl(i, k) = pclc(i, k)*(1.-zfice(i,k))
399        re(i, k) = rad_chaud(i, k)*fl(i, k)
400
401        rel = rad_chaud(i, k)
402
403        ! for ice clouds: as a function of the ambiant temperature
404        ! [formula used by Iacobellis and Somerville (2000), with an
405        ! asymptotical value of 3.5 microns at T<-81.4 C added to be
406        ! consistent with observations of Heymsfield et al. 1986]:
407        ! 2011/05/24 : rei_min = 3.5 becomes a free PARAMETER as well as
408        ! rei_max=61.29
409
410        tc = t(i, k) - 273.15
411        rei = d_rei_dt*tc + rei_max
412        IF (tc<=-81.4) rei = rei_min
413
414        ! -- cloud optical thickness :
415        ! [for liquid clouds, traditional formula,
416        ! for ice clouds, Ebert & Curry (1992)]
417
418        IF (zflwp_var==0.) rel = 1.
419        IF (zfiwp_var==0. .OR. rei<=0.) rei = 1.
420        pcltau(i, k) = 3.0/2.0*(zflwp_var/rel) + zfiwp_var*(3.448E-03+2.431/ &
421          rei)
422
423        ! -- cloud infrared emissivity:
424        ! [the broadband infrared absorption coefficient is PARAMETERized
425        ! as a function of the effective cld droplet radius]
426        ! Ebert and Curry (1992) formula as used by Kiehl & Zender (1995):
427
428        k_ice = k_ice0 + 1.0/rei
429
430        pclemi(i, k) = 1.0 - exp(-coef_chau*zflwp_var-df*k_ice*zfiwp_var)
431
[3274]432      ENDIF
[1992]433
434      reice(i, k) = rei
435
436      xflwp(i) = xflwp(i) + xflwc(i, k)*rhodz(i, k)
437      xfiwp(i) = xfiwp(i) + xfiwc(i, k)*rhodz(i, k)
438
[3274]439    ENDDO
440  ENDDO
[1992]441
442  ! --if cloud droplet radius is fixed, then pcldtaupi=pcltau
443
444  IF (.NOT. ok_cdnc) THEN
445    DO k = 1, klev
446      DO i = 1, klon
447        pcldtaupi(i, k) = pcltau(i, k)
448        reice_pi(i, k) = reice(i, k)
[3274]449      ENDDO
450    ENDDO
451  ENDIF
[1992]452
453  DO k = 1, klev
454    DO i = 1, klon
455      reliq(i, k) = rad_chaud(i, k)
456      reliq_pi(i, k) = rad_chaud_pi(i, k)
457      reice_pi(i, k) = reice(i, k)
[3274]458    ENDDO
459  ENDDO
[1992]460
461  ! COMPUTE CLOUD LIQUID PATH AND TOTAL CLOUDINESS
462  ! IM cf. CR:test: calcul prenant ou non en compte le recouvrement
463  ! initialisations
464
465  DO i = 1, klon
466    zclear(i) = 1.
467    zcloud(i) = 0.
468    zcloudh(i) = 0.
469    zcloudm(i) = 0.
470    zcloudl(i) = 0.
471    pch(i) = 1.0
472    pcm(i) = 1.0
473    pcl(i) = 1.0
474    pctlwp(i) = 0.0
[3274]475  ENDDO
[1992]476
477  ! --calculation of liquid water path
478
479  DO k = klev, 1, -1
480    DO i = 1, klon
481      pctlwp(i) = pctlwp(i) + pqlwp(i, k)*rhodz(i, k)
[3274]482    ENDDO
483  ENDDO
[1992]484
485  ! --calculation of cloud properties with cloud overlap
486
487  IF (novlp==1) THEN
488    DO k = klev, 1, -1
489      DO i = 1, klon
490        zclear(i) = zclear(i)*(1.-max(pclc(i,k),zcloud(i)))/(1.-min(real( &
491          zcloud(i),kind=8),1.-zepsec))
492        pct(i) = 1. - zclear(i)
493        IF (paprs(i,k)<prmhc) THEN
494          pch(i) = pch(i)*(1.-max(pclc(i,k),zcloudh(i)))/(1.-min(real(zcloudh &
495            (i),kind=8),1.-zepsec))
496          zcloudh(i) = pclc(i, k)
497        ELSE IF (paprs(i,k)>=prmhc .AND. paprs(i,k)<prlmc) THEN
498          pcm(i) = pcm(i)*(1.-max(pclc(i,k),zcloudm(i)))/(1.-min(real(zcloudm &
499            (i),kind=8),1.-zepsec))
500          zcloudm(i) = pclc(i, k)
501        ELSE IF (paprs(i,k)>=prlmc) THEN
502          pcl(i) = pcl(i)*(1.-max(pclc(i,k),zcloudl(i)))/(1.-min(real(zcloudl &
503            (i),kind=8),1.-zepsec))
504          zcloudl(i) = pclc(i, k)
[3274]505        ENDIF
[1992]506        zcloud(i) = pclc(i, k)
[3274]507      ENDDO
508    ENDDO
[1992]509  ELSE IF (novlp==2) THEN
510    DO k = klev, 1, -1
511      DO i = 1, klon
512        zcloud(i) = max(pclc(i,k), zcloud(i))
513        pct(i) = zcloud(i)
514        IF (paprs(i,k)<prmhc) THEN
515          pch(i) = min(pclc(i,k), pch(i))
516        ELSE IF (paprs(i,k)>=prmhc .AND. paprs(i,k)<prlmc) THEN
517          pcm(i) = min(pclc(i,k), pcm(i))
518        ELSE IF (paprs(i,k)>=prlmc) THEN
519          pcl(i) = min(pclc(i,k), pcl(i))
[3274]520        ENDIF
521      ENDDO
522    ENDDO
[1992]523  ELSE IF (novlp==3) THEN
524    DO k = klev, 1, -1
525      DO i = 1, klon
526        zclear(i) = zclear(i)*(1.-pclc(i,k))
527        pct(i) = 1 - zclear(i)
528        IF (paprs(i,k)<prmhc) THEN
529          pch(i) = pch(i)*(1.0-pclc(i,k))
530        ELSE IF (paprs(i,k)>=prmhc .AND. paprs(i,k)<prlmc) THEN
531          pcm(i) = pcm(i)*(1.0-pclc(i,k))
532        ELSE IF (paprs(i,k)>=prlmc) THEN
533          pcl(i) = pcl(i)*(1.0-pclc(i,k))
[3274]534        ENDIF
535      ENDDO
536    ENDDO
537  ENDIF
[1992]538
539  DO i = 1, klon
540    pch(i) = 1. - pch(i)
541    pcm(i) = 1. - pcm(i)
542    pcl(i) = 1. - pcl(i)
[3274]543  ENDDO
[1992]544
545  ! ========================================================
546  ! DIAGNOSTICS CALCULATION FOR CMIP5 PROTOCOL
547  ! ========================================================
548  ! change by Nicolas Yan (LSCE)
549  ! Cloud Droplet Number Concentration (CDNC) : 3D variable
550  ! Fractionnal cover by liquid water cloud (LCC3D) : 3D variable
551  ! Cloud Droplet Number Concentration at top of cloud (CLDNCL) : 2D variable
552  ! Droplet effective radius at top of cloud (REFFCLWTOP) : 2D variable
553  ! Fractionnal cover by liquid water at top of clouds (LCC) : 2D variable
554
555  IF (ok_cdnc) THEN
556
557    DO k = 1, klev
558      DO i = 1, klon
559        phase3d(i, k) = 1 - zfice(i, k)
560        IF (pclc(i,k)<=seuil_neb) THEN
561          lcc3d(i, k) = seuil_neb*phase3d(i, k)
562        ELSE
563          lcc3d(i, k) = pclc(i, k)*phase3d(i, k)
[3274]564        ENDIF
[1992]565        scdnc(i, k) = lcc3d(i, k)*cdnc(i, k) ! m-3
[3274]566      ENDDO
567    ENDDO
[1992]568
569    DO i = 1, klon
570      lcc(i) = 0.
571      reffclwtop(i) = 0.
572      cldncl(i) = 0.
[2596]573      IF (novlp.EQ.3 .OR. novlp.EQ.1) tcc(i) = 1.
574      IF (novlp.EQ.2) tcc(i) = 0.
[3274]575    ENDDO
[1992]576
577    DO i = 1, klon
578      DO k = klev - 1, 1, -1 !From TOA down
579
580          ! Test, if the cloud optical depth exceeds the necessary
581          ! threshold:
582
583        IF (pcltau(i,k)>thres_tau .AND. pclc(i,k)>thres_neb) THEN
584
[2596]585          IF (novlp.EQ.2) THEN
[1992]586            IF (first) THEN
587              WRITE (*, *) 'Hypothese de recouvrement: MAXIMUM'
588              first = .FALSE.
[3274]589            ENDIF
[1992]590            flag_max = -1.
591            ftmp(i) = max(tcc(i), pclc(i,k))
[3274]592          ENDIF
[1992]593
[2596]594          IF (novlp.EQ.3) THEN
[1992]595            IF (first) THEN
596              WRITE (*, *) 'Hypothese de recouvrement: RANDOM'
597              first = .FALSE.
[3274]598            ENDIF
[1992]599            flag_max = 1.
600            ftmp(i) = tcc(i)*(1-pclc(i,k))
[3274]601          ENDIF
[1992]602
[2596]603          IF (novlp.EQ.1) THEN
[1992]604            IF (first) THEN
605              WRITE (*, *) 'Hypothese de recouvrement: MAXIMUM_ &
606                &                                             &
607                &                                          RANDOM'
608              first = .FALSE.
[3274]609            ENDIF
[1992]610            flag_max = 1.
611            ftmp(i) = tcc(i)*(1.-max(pclc(i,k),pclc(i,k+1)))/(1.-min(pclc(i, &
612              k+1),1.-thres_neb))
[3274]613          ENDIF
[1992]614          ! Effective radius of cloud droplet at top of cloud (m)
615          reffclwtop(i) = reffclwtop(i) + rad_chaud(i, k)*1.0E-06*phase3d(i, &
616            k)*(tcc(i)-ftmp(i))*flag_max
617          ! CDNC at top of cloud (m-3)
618          cldncl(i) = cldncl(i) + cdnc(i, k)*phase3d(i, k)*(tcc(i)-ftmp(i))* &
619            flag_max
620          ! Liquid Cloud Content at top of cloud
621          lcc(i) = lcc(i) + phase3d(i, k)*(tcc(i)-ftmp(i))*flag_max
622          ! Total Cloud Content at top of cloud
623          tcc(i) = ftmp(i)
624
[3274]625        ENDIF ! is there a visible, not-too-small cloud?
626      ENDDO ! loop over k
[1992]627
[2596]628      IF (novlp.EQ.3 .OR. novlp.EQ.1) tcc(i) = 1. - tcc(i)
[1992]629
[3274]630    ENDDO ! loop over i
[1992]631
632    ! ! Convective and Stratiform Cloud Droplet Effective Radius (REFFCLWC
633    ! REFFCLWS)
634    DO i = 1, klon
[524]635      DO k = 1, klev
[1992]636        ! Weight to be used for outputs: eau_liquide*couverture nuageuse
637        lcc3dcon(i, k) = rnebcon(i, k)*phase3d(i, k)*clwcon(i, k) ! eau liquide convective
638        lcc3dstra(i, k) = pclc(i, k)*pqlwp(i, k)*phase3d(i, k)
639        lcc3dstra(i, k) = lcc3dstra(i, k) - lcc3dcon(i, k) ! eau liquide stratiforme
640        lcc3dstra(i, k) = max(lcc3dstra(i,k), 0.0)
[3121]641        !FC pour la glace (CAUSES)
642        icc3dcon(i, k) = rnebcon(i, k)*(1-phase3d(i, k))*clwcon(i, k) !  glace convective
643        icc3dstra(i, k)= pclc(i, k)*pqlwp(i, k)*(1-phase3d(i, k))
644        icc3dstra(i, k) = icc3dstra(i, k) - icc3dcon(i, k) ! glace stratiforme
645        icc3dstra(i, k) = max( icc3dstra(i, k), 0.0)
646        !FC (CAUSES)
647
[1992]648        ! Compute cloud droplet radius as above in meter
649        radius = 1.1*((pqlwp(i,k)*pplay(i,k)/(rd*t(i,k)))/(4./3*rpi*1000.* &
650          cdnc(i,k)))**(1./3.)
651        radius = max(radius, 5.E-6)
652        ! Convective Cloud Droplet Effective Radius (REFFCLWC) : variable 3D
653        reffclwc(i, k) = radius
654        reffclwc(i, k) = reffclwc(i, k)*lcc3dcon(i, k)
655        ! Stratiform Cloud Droplet Effective Radius (REFFCLWS) : variable 3D
656        reffclws(i, k) = radius
657        reffclws(i, k) = reffclws(i, k)*lcc3dstra(i, k)
[3274]658      ENDDO !klev
659    ENDDO !klon
[524]660
[1992]661    ! Column Integrated Cloud Droplet Number (CLDNVI) : variable 2D
[524]662
[1992]663    DO i = 1, klon
664      cldnvi(i) = 0.
665      lcc_integrat(i) = 0.
666      height(i) = 0.
[1989]667      DO k = 1, klev
[1992]668        cldnvi(i) = cldnvi(i) + cdnc(i, k)*lcc3d(i, k)*dh(i, k)
669        lcc_integrat(i) = lcc_integrat(i) + lcc3d(i, k)*dh(i, k)
670        height(i) = height(i) + dh(i, k)
[3274]671      ENDDO ! klev
[1992]672      lcc_integrat(i) = lcc_integrat(i)/height(i)
673      IF (lcc_integrat(i)<=1.0E-03) THEN
674        cldnvi(i) = cldnvi(i)*lcc(i)/seuil_neb
675      ELSE
676        cldnvi(i) = cldnvi(i)*lcc(i)/lcc_integrat(i)
[3274]677      ENDIF
678    ENDDO ! klon
[1337]679
[1992]680    DO i = 1, klon
681      DO k = 1, klev
682        IF (scdnc(i,k)<=0.0) scdnc(i, k) = 0.0
683        IF (reffclws(i,k)<=0.0) reffclws(i, k) = 0.0
684        IF (reffclwc(i,k)<=0.0) reffclwc(i, k) = 0.0
685        IF (lcc3d(i,k)<=0.0) lcc3d(i, k) = 0.0
686        IF (lcc3dcon(i,k)<=0.0) lcc3dcon(i, k) = 0.0
687        IF (lcc3dstra(i,k)<=0.0) lcc3dstra(i, k) = 0.0
[3121]688!FC (CAUSES)
689        IF (icc3dcon(i,k)<=0.0) icc3dcon(i, k) = 0.0
690        IF (icc3dstra(i,k)<=0.0) icc3dstra(i, k) = 0.0
691!FC (CAUSES)
[3274]692      ENDDO
[1992]693      IF (reffclwtop(i)<=0.0) reffclwtop(i) = 0.0
694      IF (cldncl(i)<=0.0) cldncl(i) = 0.0
695      IF (cldnvi(i)<=0.0) cldnvi(i) = 0.0
696      IF (lcc(i)<=0.0) lcc(i) = 0.0
[3274]697    ENDDO
[1337]698
[3274]699  ENDIF !ok_cdnc
[1337]700
[3245]701  first=.false. !to be sure
702
[1992]703  RETURN
[1337]704
[1992]705END SUBROUTINE newmicro
Note: See TracBrowser for help on using the repository browser.