source: LMDZ.3.3/trunk/libf/phylmd/nuage.F @ 26

Last change on this file since 26 was 2, checked in by lmdz, 25 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1      SUBROUTINE nuage (paprs, pplay,
2     .                  t, pqlwp, pclc, pcltau, pclemi,
3     .                  pch, pcl, pcm, pct, pctlwp)
4      IMPLICIT none
5c======================================================================
6c Auteur(s): Z.X. Li (LMD/CNRS) date: 19930910
7c Objet: Calculer epaisseur optique et emmissivite des nuages
8c======================================================================
9c Arguments:
10c t-------input-R-temperature
11c pqlwp---input-R-eau liquide nuageuse dans l'atmosphere (kg/kg)
12c pclc----input-R-couverture nuageuse pour le rayonnement (0 a 1)
13c
14c pcltau--output-R-epaisseur optique des nuages
15c pclemi--output-R-emissivite des nuages (0 a 1)
16c======================================================================
17C
18#include "YOMCST.h"
19c
20#include "dimensions.h"
21#include "dimphy.h"
22      REAL paprs(klon,klev+1), pplay(klon,klev)
23      REAL t(klon,klev)
24c
25      REAL pclc(klon,klev)
26      REAL pqlwp(klon,klev)
27      REAL pcltau(klon,klev), pclemi(klon,klev)
28c
29      REAL pct(klon), pctlwp(klon), pch(klon), pcl(klon), pcm(klon)
30c
31      LOGICAL lo
32c
33      REAL cetahb, cetamb
34      PARAMETER (cetahb = 0.45, cetamb = 0.80)
35C
36      INTEGER i, k
37      REAL zflwp, zradef, zfice, zmsac
38c
39      REAL radius, rad_froid, rad_chaud
40      PARAMETER (rad_chaud=10.0, rad_froid=30.0)
41      REAL coef, coef_froi, coef_chau
42      PARAMETER (coef_chau=0.13, coef_froi=0.09)
43      REAL seuil_neb, t_glace
44      PARAMETER (seuil_neb=0.001, t_glace=273.0-15.0)
45      INTEGER nexpo ! exponentiel pour glace/eau
46      PARAMETER (nexpo=6)
47ccc      PARAMETER (nexpo=1)
48c
49c Calculer l'epaisseur optique et l'emmissivite des nuages
50c
51      DO k = 1, klev
52      DO i = 1, klon
53         pclc(i,k) = MAX(pclc(i,k), seuil_neb)
54         zflwp = 1000.*pqlwp(i,k)/RG/pclc(i,k)
55     .          *(paprs(i,k)-paprs(i,k+1))
56         zfice = 1.0 - (t(i,k)-t_glace) / (273.13-t_glace)
57         zfice = MIN(MAX(zfice,0.0),1.0)
58         zfice = zfice**nexpo
59         radius = rad_chaud * (1.-zfice) + rad_froid * zfice
60         coef = coef_chau * (1.-zfice) + coef_froi * zfice
61         pcltau(i,k) = 3.0/2.0 * zflwp / radius
62         pclemi(i,k) = 1.0 - EXP( - coef * zflwp)
63         lo = (pclc(i,k) .LE. seuil_neb)
64         IF (lo) pclc(i,k) = 0.0
65         IF (lo) pcltau(i,k) = 0.0
66         IF (lo) pclemi(i,k) = 0.0
67      ENDDO
68      ENDDO
69ccc      DO k = 1, klev
70ccc      DO i = 1, klon
71ccc         t(i,k) = t(i,k)
72ccc         pclc(i,k) = MAX( 1.e-5 , pclc(i,k) )
73ccc         lo = pclc(i,k) .GT. (2.*1.e-5)
74ccc         zflwp = pqlwp(i,k)*1000.*(paprs(i,k)-paprs(i,k+1))
75ccc     .          /(rg*pclc(i,k))
76ccc         zradef = 10.0 + (1.-sigs(k))*45.0
77ccc         pcltau(i,k) = 1.5 * zflwp / zradef
78ccc         zfice=1.0-MIN(MAX((t(i,k)-263.)/(273.-263.),0.0),1.0)
79ccc         zmsac = 0.13*(1.0-zfice) + 0.08*zfice
80ccc         pclemi(i,k) = 1.-EXP(-zmsac*zflwp)
81ccc         if (.NOT.lo) pclc(i,k) = 0.0
82ccc         if (.NOT.lo) pcltau(i,k) = 0.0
83ccc         if (.NOT.lo) pclemi(i,k) = 0.0
84ccc      ENDDO
85ccc      ENDDO
86cccccc      print*, 'pas de nuage dans le rayonnement'
87cccccc      DO k = 1, klev
88cccccc      DO i = 1, klon
89cccccc         pclc(i,k) = 0.0
90cccccc         pcltau(i,k) = 0.0
91cccccc         pclemi(i,k) = 0.0
92cccccc      ENDDO
93cccccc      ENDDO
94C
95C COMPUTE CLOUD LIQUID PATH AND TOTAL CLOUDINESS
96C
97      DO i = 1, klon
98         pct(i)=1.0
99         pch(i)=1.0
100         pcm(i) = 1.0
101         pcl(i) = 1.0
102         pctlwp(i) = 0.0
103      ENDDO
104C
105      DO k = klev, 1, -1
106      DO i = 1, klon
107         pctlwp(i) = pctlwp(i)
108     .             + pqlwp(i,k)*(paprs(i,k)-paprs(i,k+1))/RG
109         pct(i) = pct(i)*(1.0-pclc(i,k))
110         if (pplay(i,k).LE.cetahb*paprs(i,1))
111     .      pch(i) = pch(i)*(1.0-pclc(i,k))
112         if (pplay(i,k).GT.cetahb*paprs(i,1) .AND.
113     .       pplay(i,k).LE.cetamb*paprs(i,1))
114     .      pcm(i) = pcm(i)*(1.0-pclc(i,k))
115         if (pplay(i,k).GT.cetamb*paprs(i,1))
116     .      pcl(i) = pcl(i)*(1.0-pclc(i,k))
117      ENDDO
118      ENDDO
119C
120      DO i = 1, klon
121         pct(i)=1.-pct(i)
122         pch(i)=1.-pch(i)
123         pcm(i)=1.-pcm(i)
124         pcl(i)=1.-pcl(i)
125      ENDDO
126C
127      RETURN
128      END
129      SUBROUTINE diagcld(paprs,pplay,t,q,rain,snow,kbot,ktop,
130     .                   diafra,dialiq)
131      IMPLICIT none
132c
133c Laurent Li (LMD/CNRS), le 12 octobre 1998
134c                        (adaptation du code ECMWF)
135c
136c Dans certains cas, le schema pronostique des nuages n'est
137c pas suffisament performant. On a donc besoin de diagnostiquer
138c ces nuages. Je dois avouer que c'est une frustration.
139c
140#include "dimensions.h"
141#include "dimphy.h"
142#include "YOMCST.h"
143c
144c Arguments d'entree:
145      REAL paprs(klon,klev+1) ! pression (Pa) a inter-couche
146      REAL pplay(klon,klev) ! pression (Pa) au milieu de couche
147      REAL t(klon,klev) ! temperature (K)
148      REAL q(klon,klev) ! humidite specifique (Kg/Kg)
149      REAL rain(klon) ! pluie convective (kg/m2/s)
150      REAL snow(klon) ! neige convective (kg/m2/s)
151      INTEGER ktop(klon) ! sommet de la convection
152      INTEGER kbot(klon) ! bas de la convection
153c
154c Arguments de sortie:
155      REAL diafra(klon,klev) ! fraction nuageuse diagnostiquee
156      REAL dialiq(klon,klev) ! eau liquide nuageuse
157c
158c Options a choisir:
159      LOGICAL ok_conv ! prendre en compte les nuages convectifs
160      PARAMETER (ok_conv=.TRUE.)
161      LOGICAL ok_inve ! prendre en compte les nuages d'inversion
162CCC      PARAMETER (ok_inve=.TRUE.)
163      PARAMETER (ok_inve=.FALSE.)
164c
165c Constantes ajustables:
166      REAL CANVA, CANVB, CANVH
167      PARAMETER (CANVA=2.0, CANVB=0.3, CANVH=0.4)
168      REAL CCA, CCB, CCC
169      PARAMETER (CCA=0.125, CCB=1.5, CCC=0.8)
170      REAL CCFCT, CCSCAL
171      PARAMETER (CCFCT=0.400)
172      PARAMETER (CCSCAL=1.0E+11)
173      REAL CETAHB, CETAMB
174      PARAMETER (CETAHB=0.45, CETAMB=0.80)
175      REAL CCLWMR
176      PARAMETER (CCLWMR=1.E-04)
177      REAL ZEPSCR
178      PARAMETER (ZEPSCR=1.0E-10)
179      REAL CLOIA, CLOIB, CLOIC, CLOID
180ccc      PARAMETER (CLOIA=1.0E+02, CLOIB=-10.00, CLOIC=-0.6, CLOID=5.0)
181      PARAMETER (CLOIA=1.0E+02, CLOIB=-10.00, CLOIC=-0.9, CLOID=5.0)
182      REAL RGAMMAS
183      PARAMETER (RGAMMAS=0.05)
184      REAL CRHL
185ccc      PARAMETER (CRHL=0.15)
186      PARAMETER (CRHL=0.70)
187      REAL t_coup
188      PARAMETER (t_coup=234.0)
189c
190c Variables locales:
191      INTEGER i, k, kb, invb(klon)
192      REAL zcc(klon), zqs, zrhb, zcll, zdthmin(klon), zdthdp
193      REAL zdelta, zcor
194c
195c Fonctions thermodynamiques:
196#include "YOETHF.h"
197#include "FCTTRE.h"
198c
199c Initialisation:
200c
201      DO k = 1, klev
202      DO i = 1, klon
203         diafra(i,k) = 0.0
204         dialiq(i,k) = 0.0
205      ENDDO
206      ENDDO
207c
208      IF (ok_conv) THEN
209c
210      DO i = 1, klon ! Calculer la fraction nuageuse
211      zcc(i) = 0.0
212      IF((rain(i)+snow(i)).GT.0.) THEN
213         zcc(i)= CCA * LOG(MAX(ZEPSCR,(rain(i)+snow(i))*CCSCAL))-CCB
214         zcc(i)= MIN(CCC,MAX(0.0,zcc(i)))
215      ENDIF
216      ENDDO
217cn
218      DO i = 1, klon ! pour traiter les enclumes
219         diafra(i,ktop(i)) = zcc(i) * CCFCT
220ccc      diafra(i,ktop(i)) = MAX(diafra(i,ktop(i)),zcc(i)*CCFCT)
221      IF ((zcc(i).GE.CANVH) .AND.
222     .    (pplay(i,ktop(i)).LE.CETAHB*paprs(i,1)))
223     .   diafra(i,ktop(i)) = MAX(zcc(i)*CCFCT,CANVA*(zcc(i)-CANVB))     
224cc     . diafra(i,ktop(i)) = MAX(diafra(i,ktop(i)),
225cc     .                         MAX(zcc(i)*CCFCT,CANVA*(zcc(i)-CANVB)))
226      dialiq(i,ktop(i))=CCLWMR*diafra(i,ktop(i))
227      ENDDO
228c
229      DO k = 1, klev ! nuages convectifs (sauf enclumes)
230      DO i = 1, klon
231      IF (k.LT.ktop(i) .AND. k.GE.kbot(i)) THEN
232           diafra(i,k)=zcc(i)*CCFCT
233cc         diafra(i,k)=MAX(diafra(i,k),zcc(i)*CCFCT)
234         dialiq(i,k)=CCLWMR*diafra(i,k)
235      ENDIF
236      ENDDO
237      ENDDO
238c
239      ENDIF ! ok_conv
240c
241      IF (ok_inve) THEN
242
243      DO i = 1, klon
244         invb(i) = klev
245         zdthmin(i)=0.0
246      ENDDO
247
248      DO k = 2, klev/2-1
249      DO i = 1, klon
250         zdthdp = (t(i,k)-t(i,k+1))/(pplay(i,k)-pplay(i,k+1))
251     .          - RD * 0.5*(t(i,k)+t(i,k+1))/RCPD/paprs(i,k+1)
252         zdthdp = zdthdp * CLOIA
253         IF (pplay(i,k).GT.CETAMB*paprs(i,1) .AND.
254     .       zdthdp.LT.zdthmin(i) ) THEN
255            zdthmin(i) = zdthdp
256            invb(i) = k
257         ENDIF
258      ENDDO
259      ENDDO
260
261      DO i = 1, klon
262         kb=invb(i)
263         IF (thermcep) THEN
264           zdelta=MAX(0.,SIGN(1.,RTT-t(i,kb)))
265           zqs= R2ES*FOEEW(t(i,kb),zdelta)/pplay(i,kb)
266           zqs=MIN(0.5,zqs)
267           zcor=1./(1.-RETV*zqs)
268           zqs=zqs*zcor
269         ELSE
270           IF (t(i,kb) .LT. t_coup) THEN
271              zqs = qsats(t(i,kb)) / pplay(i,kb)
272           ELSE
273              zqs = qsatl(t(i,kb)) / pplay(i,kb)
274           ENDIF
275         ENDIF
276         zcll = CLOIB * zdthmin(i) + CLOIC
277         zcll = MIN(1.0,MAX(0.0,zcll))
278         zrhb= q(i,kb)/zqs
279         IF (zcll.GT.0.0.AND.zrhb.LT.CRHL)
280     .   zcll=zcll*(1.-(CRHL-zrhb)*CLOID)
281         zcll=MIN(1.0,MAX(0.0,zcll))
282cc         diafra(i,kb) = MAX(diafra(i,kb),zcll)
283cc         dialiq(i,kb)= diafra(i,kb) * RGAMMAS*zqs
284         diafra(i,kb) = zcll
285         dialiq(i,kb)= zcll* RGAMMAS*zqs       
286      ENDDO
287c
288      ENDIF ! ok_inve
289c
290      END
Note: See TracBrowser for help on using the repository browser.