LMDZ
olwc.F90
Go to the documentation of this file.
1 SUBROUTINE olwc ( KIDIA,KFDIA,KLON,KLEV &
2  & , pbint,pbsuin,pcldld,pcldlu,pcntrb,pemis,pfdn,pfup &
3  & , pflux )
4 !
5 !**** *LWC* - LONGWAVE RADIATION, CLOUD EFFECTS
6 !
7 ! PURPOSE.
8 ! --------
9 ! INTRODUCES CLOUD EFFECTS ON LONGWAVE FLUXES OR
10 ! RADIANCES
11 !
12 !** INTERFACE.
13 ! ----------
14 !
15 ! EXPLICIT ARGUMENTS :
16 ! --------------------
17 ! ==== INPUTS ===
18 ! PBINT : (KLON,KLEV+1) ; HALF LEVEL PLANCK FUNCTION
19 ! PBSUIN : (KLON) ; SURFACE PLANCK FUNCTION
20 ! PCLDLD : (KLON,KLEV) ; DOWNWARD EFFECTIVE CLOUD FRACTION
21 ! PCLDLU : (KLON,KLEV) ; UPWARD EFFECTIVE CLOUD FRACTION
22 ! PCNTRB : (KLON,KLEV+1,KLEV+1); CLEAR-SKY ENERGY EXCHANGE
23 ! PEMIS : (KLON) ; SURFACE EMISSIVITY
24 ! PFDN : (KLON,KLEV+1) ; CLEAR-SKY DOWNWARD FLUX
25 ! PFUP : (KLON,KLEV+1) ; CLEAR-SKY UPWARD FLUX
26 ! ==== OUTPUTS ===
27 ! PFLUX(KLON,2,KLEV) ; RADIATIVE FLUXES :
28 ! 1 ==> UPWARD FLUX TOTAL
29 ! 2 ==> DOWNWARD FLUX TOTAL
30 !
31 ! IMPLICIT ARGUMENTS : NONE
32 ! --------------------
33 !
34 ! METHOD.
35 ! -------
36 !
37 ! 1. INITIALIZES ALL FLUXES TO CLEAR-SKY VALUES
38 ! 2. EFFECT OF ONE OVERCAST UNITY EMISSIVITY CLOUD LAYER
39 ! 3. EFFECT OF SEMI-TRANSPARENT, PARTIAL OR MULTI-LAYERED
40 ! CLOUDS
41 !
42 ! EXTERNALS.
43 ! ----------
44 !
45 ! NONE
46 !
47 ! REFERENCE.
48 ! ----------
49 !
50 ! SEE RADIATION'S PART OF THE MODEL'S DOCUMENTATION AND
51 ! ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE IFS
52 !
53 ! AUTHOR.
54 ! -------
55 ! JEAN-JACQUES MORCRETTE *ECMWF*
56 !
57 ! MODIFICATIONS.
58 ! --------------
59 ! ORIGINAL : 89-07-14
60 !-----------------------------------------------------------------------
61 
62 #include "tsmbkind.h"
63 
64 USE yoerad , ONLY : novlp
65 USE yoerdi , ONLY : repclc
66 USE yoedbug , ONLY : ldebug
67 
68 
69 IMPLICIT NONE
70 
71 
72 
73 ! DUMMY INTEGER SCALARS
74 integer_m :: kfdia
75 integer_m :: kidia
76 integer_m :: klev
77 integer_m :: klon
78 
79 !-----------------------------------------------------------------------
80 !
81 !* 0.1 ARGUMENTS
82 ! ---------
83 !
84 real_b :: pbint(klon,klev+1),pbsuin(klon),pcldld(klon,klev) &
85  & , pcldlu(klon,klev) &
86  & , pcntrb(klon,klev+1,klev+1) &
87  & , pfdn(klon,klev+1),pfup(klon,klev+1) &
88  & , pemis(klon)
89 !
90 real_b :: pflux(klon,2,klev+1)
91 !
92 !-----------------------------------------------------------------------
93 !
94 !* 0.2 LOCAL ARRAYS
95 ! ------------
96 !
97 integer_m :: imx(klon), imxp(klon)
98 !
99 real_b :: zclear(klon),zcloud(klon),zdnf(klon,klev+1,klev+1) &
100  & , zfd(klon), zfn10(klon), zfu(klon) &
101  & , zupf(klon,klev+1,klev+1) &
102  & , zclm(klon,klev+1,klev+1)
103 !
104 ! LOCAL INTEGER SCALARS
105 integer_m :: ikcp1, ikm1, ikp1, imaxc, imxm1, imxp1, jcloud,&
106  &jk, jk1, jk2, jkj, jl, imx1, imx2, jkc, jkcp1, jkm1, jkp1
107 
108 ! LOCAL REAL SCALARS
109 real_b :: zcfrac
110 
111 ! ------------------------------------------------------------------
112 !
113 !* 1. INITIALIZATION
114 ! --------------
115 !
116 imaxc = 0
117 !
118 DO jl = kidia,kfdia
119  imx(jl)=0
120  imxp(jl)=0
121  zcloud(jl) = 0.
122 END DO
123 !
124 !* 1.1 SEARCH THE LAYER INDEX OF THE HIGHEST CLOUD
125 ! -------------------------------------------
126 !
127 DO jk = 1 , klev
128  DO jl = kidia,kfdia
129  imx1=imx(jl)
130  imx2=jk
131  IF (pcldlu(jl,jk).GT.repclc) THEN
132  imxp(jl)=imx2
133  ELSE
134  imxp(jl)=imx1
135  END IF
136  imaxc=max(imxp(jl),imaxc)
137  imx(jl)=imxp(jl)
138  END DO
139 END DO
140 !CGM*******
141 imaxc=klev
142 !CGM*******
143 !
144 DO jk = 1 , klev+1
145  DO jl = kidia,kfdia
146  pflux(jl,1,jk) = pfup(jl,jk)
147  pflux(jl,2,jk) = pfdn(jl,jk)
148  END DO
149 END DO
150 !
151 ! ------------------------------------------------------------------
152 !
153 !* 2. EFFECT OF CLOUDINESS ON LONGWAVE FLUXES
154 ! ---------------------------------------
155 !
156 IF (imaxc.GT.0) THEN
157 !
158  imxp1 = imaxc + 1
159  imxm1 = imaxc - 1
160 !
161 !* 2.0 INITIALIZE TO CLEAR-SKY FLUXES
162 ! ------------------------------
163 !
164  DO jk1=1,klev+1
165  DO jk2=1,klev+1
166  DO jl = kidia,kfdia
167  zupf(jl,jk2,jk1)=pfup(jl,jk1)
168  zdnf(jl,jk2,jk1)=pfdn(jl,jk1)
169  END DO
170  END DO
171  END DO
172 !
173 !* 2.1 FLUXES FOR ONE OVERCAST UNITY EMISSIVITY CLOUD
174 ! ----------------------------------------------
175 !
176  DO jkc = 1 , imaxc
177  jcloud=jkc
178  jkcp1=jcloud+1
179 !
180 !* 2.1.1 ABOVE THE CLOUD
181 ! ---------------
182 !
183  DO jk=jkcp1,klev+1
184  jkm1=jk-1
185  DO jl = kidia,kfdia
186  zfu(jl)=0.
187  END DO
188  IF (jk .GT. jkcp1) THEN
189  DO jkj=jkcp1,jkm1
190  DO jl = kidia,kfdia
191  zfu(jl) = zfu(jl) + pcntrb(jl,jk,jkj)
192  END DO
193  END DO
194  END IF
195 !
196  DO jl = kidia,kfdia
197  zupf(jl,jkcp1,jk)=pbint(jl,jk)-zfu(jl)
198  END DO
199  END DO
200 !
201 !* 2.1.2 BELOW THE CLOUD
202 ! ---------------
203 !
204  DO jk=1,jcloud
205  jkp1=jk+1
206  DO jl = kidia,kfdia
207  zfd(jl)=0.
208  END DO
209 !
210  IF (jk .LT. jcloud) THEN
211  DO jkj=jkp1,jcloud
212  DO jl = kidia,kfdia
213  zfd(jl) = zfd(jl) + pcntrb(jl,jk,jkj)
214  END DO
215  END DO
216  END IF
217  DO jl = kidia,kfdia
218  zdnf(jl,jkcp1,jk)=-pbint(jl,jk)-zfd(jl)
219  END DO
220  END DO
221 !
222  END DO
223 !
224 !
225 !* 2.2 CLOUD COVER MATRIX
226 ! ------------------
227 !
228 !* ZCLM(JK1,JK2) IS THE OBSCURATION FACTOR BY CLOUD LAYERS BETWEEN
229 ! HALF-LEVELS JK1 AND JK2 AS SEEN FROM JK1
230 !
231  DO jk1 = 1 , klev+1
232  DO jk2 = 1 , klev+1
233  DO jl = kidia,kfdia
234  zclm(jl,jk1,jk2) = 0.
235  END DO
236  END DO
237  END DO
238 !
239 !
240 !
241 !* 2.4 CLOUD COVER BELOW THE LEVEL OF CALCULATION
242 ! ------------------------------------------
243 !
244  DO jk1 = 2 , klev+1
245  DO jl = kidia,kfdia
246  zclear(jl)=1.
247  zcloud(jl)=0.
248  END DO
249  DO jk = jk1 - 1 , 1 , -1
250  DO jl = kidia,kfdia
251  IF (novlp.EQ.1) THEN
252 !* maximum-random
253  zclear(jl)=zclear(jl)*(1.0-max(pcldlu(jl,jk),zcloud(jl))) &
254  & /(1.0-min(zcloud(jl),1.-repclc))
255  zclm(jl,jk1,jk) = 1.0 - zclear(jl)
256  zcloud(jl) = pcldlu(jl,jk)
257  ELSE IF (novlp.EQ.2) THEN
258 !* maximum
259  zcloud(jl) = max(zcloud(jl) , pcldlu(jl,jk))
260  zclm(jl,jk1,jk) = zcloud(jl)
261  ELSE IF (novlp.EQ.3) THEN
262 !* random
263  zclear(jl) = zclear(jl)*(1.0 - pcldlu(jl,jk))
264  zcloud(jl) = 1.0 - zclear(jl)
265  zclm(jl,jk1,jk) = zcloud(jl)
266  END IF
267  END DO
268  END DO
269  END DO
270 !
271 !
272 !* 2.5 CLOUD COVER ABOVE THE LEVEL OF CALCULATION
273 ! ------------------------------------------
274 !
275  DO jk1 = 1 , klev
276  DO jl = kidia,kfdia
277  zclear(jl)=1.
278  zcloud(jl)=0.
279  END DO
280  DO jk = jk1 , klev
281  DO jl = kidia,kfdia
282  IF (novlp.EQ.1) THEN
283 !* maximum-random
284  zclear(jl)=zclear(jl)*(1.0-max(pcldld(jl,jk),zcloud(jl))) &
285  & /(1.0-min(zcloud(jl),1.-repclc))
286  zclm(jl,jk1,jk) = 1.0 - zclear(jl)
287  zcloud(jl) = pcldld(jl,jk)
288  ELSE IF (novlp.EQ.2) THEN
289 !* maximum
290  zcloud(jl) = max(zcloud(jl) , pcldld(jl,jk))
291  zclm(jl,jk1,jk) = zcloud(jl)
292  ELSE IF (novlp.EQ.3) THEN
293 !* random
294  zclear(jl) = zclear(jl)*(1.0 - pcldld(jl,jk))
295  zcloud(jl) = 1.0 - zclear(jl)
296  zclm(jl,jk1,jk) = zcloud(jl)
297  END IF
298  END DO
299  END DO
300  END DO
301 !
302 !
303 !
304 !* 3. FLUXES FOR PARTIAL/MULTIPLE LAYERED CLOUDINESS
305 ! ----------------------------------------------
306 !
307 !* 3.1 DOWNWARD FLUXES
308 ! ---------------
309 !
310  DO jl = kidia,kfdia
311  pflux(jl,2,klev+1) = 0.
312  END DO
313 !
314  DO jk1 = klev , 1 , -1
315 !
316 !* CONTRIBUTION FROM CLEAR-SKY FRACTION
317 !
318  DO jl = kidia,kfdia
319  zfd(jl) = (1. - zclm(jl,jk1,klev)) * zdnf(jl,1,jk1)
320 !
321 !* CONTRIBUTION FROM ADJACENT CLOUD
322 !
323  zfd(jl) = zfd(jl) + zclm(jl,jk1,jk1) * zdnf(jl,jk1+1,jk1)
324  END DO
325 !
326 !* CONTRIBUTION FROM OTHER CLOUDY FRACTIONS
327 !
328  DO jk = klev-1 , jk1 , -1
329  DO jl = kidia,kfdia
330  zcfrac = zclm(jl,jk1,jk+1) - zclm(jl,jk1,jk)
331  zfd(jl) = zfd(jl) + zcfrac * zdnf(jl,jk+2,jk1)
332  END DO
333  END DO
334 !
335  DO jl = kidia,kfdia
336  pflux(jl,2,jk1) = zfd(jl)
337  END DO
338 !
339  END DO
340 !
341 !
342 !
343 !
344 !* 3.2 UPWARD FLUX AT THE SURFACE
345 ! --------------------------
346 !
347  DO jl = kidia,kfdia
348  pflux(jl,1,1) = pemis(jl)*pbsuin(jl)-(1.-pemis(jl))*pflux(jl,2,1)
349  END DO
350 !
351 !
352 !
353 !* 3.3 UPWARD FLUXES
354 ! -------------
355 !
356  DO jk1 = 2 , klev+1
357 !
358 !* CONTRIBUTION FROM CLEAR-SKY FRACTION
359 !
360  DO jl = kidia,kfdia
361  zfu(jl) = (1. - zclm(jl,jk1,1)) * zupf(jl,1,jk1)
362 !
363 !* CONTRIBUTION FROM ADJACENT CLOUD
364 !
365  zfu(jl) = zfu(jl) + zclm(jl,jk1,jk1-1) * zupf(jl,jk1,jk1)
366  END DO
367 !
368 !* CONTRIBUTION FROM OTHER CLOUDY FRACTIONS
369 !
370  DO jk = 2 , jk1-1
371  DO jl = kidia,kfdia
372  zcfrac = zclm(jl,jk1,jk-1) - zclm(jl,jk1,jk)
373  zfu(jl) = zfu(jl) + zcfrac * zupf(jl,jk ,jk1)
374  END DO
375  END DO
376 !
377  DO jl = kidia,kfdia
378  pflux(jl,1,jk1) = zfu(jl)
379  END DO
380 !
381  END DO
382 !
383 !
384 END IF
385 !
386 !
387 !* 2.3 END OF CLOUD EFFECT COMPUTATIONS
388 !
389 !----------------------------------------------------------------------
390 RETURN
391 END SUBROUTINE olwc
integer, save kidia
Definition: dimphy.F90:6
integer, save klon
Definition: dimphy.F90:3
!$Header!integer imx
Definition: gradsdef.h:4
integer(kind=jpim) novlp
Definition: yoerad.F90:24
integer, save klev
Definition: dimphy.F90:7
Definition: yoerdi.F90:1
integer, save kfdia
Definition: dimphy.F90:5
logical ldebug
Definition: yoedbug.F90:14
Definition: yoerad.F90:1
subroutine olwc(KIDIA, KFDIA, KLON, KLEV, PBINT, PBSUIN, PCLDLD, PCLDLU, PCNTRB, PEMIS, PFDN, PFUP, PFLUX)
Definition: olwc.F90:4
real(kind=jprb) repclc
Definition: yoerdi.F90:21