/[lmdze]/trunk/Sources/phylmd/Radlwsw/lwc.f
ViewVC logotype

Annotation of /trunk/Sources/phylmd/Radlwsw/lwc.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 81 - (hide annotations)
Wed Mar 5 14:38:41 2014 UTC (10 years, 3 months ago) by guez
Original Path: trunk/phylmd/Radlwsw/lwc.f90
File size: 9716 byte(s)
 Converted to free source form files which were still in fixed source
form. The conversion was done using the polish mode of the NAG Fortran
Compiler.

In addition to converting to free source form, the processing of the
files also:

-- indented the code (including comments);

-- set Fortran keywords to uppercase, and set all other identifiers
to lower case;

-- added qualifiers to end statements (for example "end subroutine
conflx", instead of "end");

-- changed the terminating statements of all DO loops so that each
loop ends with an ENDDO statement (instead of a labeled continue).

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

  ViewVC Help
Powered by ViewVC 1.1.21