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

Contents of /trunk/Sources/phylmd/Radlwsw/swclr.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (show annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 2 months ago) by guez
File size: 9075 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

1 module swclr_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE swclr(knu, flag_aer, tauae, pizae, cgae, palbp, pdsig, &
8 prayl, psec, pcgaz, ppizaz, pray1, pray2, prefz, prj, prk, prmu0, ptauaz, &
9 ptra1, ptra2)
10 USE dimens_m
11 USE dimphy
12 USE raddim
13 USE radepsi
14 USE radopt
15
16 ! ------------------------------------------------------------------
17 ! PURPOSE.
18 ! --------
19 ! COMPUTES THE REFLECTIVITY AND TRANSMISSIVITY IN CASE OF
20 ! CLEAR-SKY COLUMN
21
22 ! REFERENCE.
23 ! ----------
24
25 ! SEE RADIATION'S PART OF THE ECMWF RESEARCH DEPARTMENT
26 ! DOCUMENTATION, AND FOUQUART AND BONNEL (1980)
27
28 ! AUTHOR.
29 ! -------
30 ! JEAN-JACQUES MORCRETTE *ECMWF*
31
32 ! MODIFICATIONS.
33 ! --------------
34 ! ORIGINAL : 94-11-15
35 ! ------------------------------------------------------------------
36 ! * ARGUMENTS:
37
38 INTEGER knu
39 ! -OB
40 DOUBLE PRECISION flag_aer
41 DOUBLE PRECISION tauae(kdlon, kflev, 2)
42 DOUBLE PRECISION pizae(kdlon, kflev, 2)
43 DOUBLE PRECISION cgae(kdlon, kflev, 2)
44 DOUBLE PRECISION palbp(kdlon, 2)
45 DOUBLE PRECISION pdsig(kdlon, kflev)
46 DOUBLE PRECISION prayl(kdlon)
47 DOUBLE PRECISION psec(kdlon)
48
49 DOUBLE PRECISION pcgaz(kdlon, kflev)
50 DOUBLE PRECISION ppizaz(kdlon, kflev)
51 DOUBLE PRECISION pray1(kdlon, kflev+1)
52 DOUBLE PRECISION pray2(kdlon, kflev+1)
53 DOUBLE PRECISION prefz(kdlon, 2, kflev+1)
54 DOUBLE PRECISION prj(kdlon, 6, kflev+1)
55 DOUBLE PRECISION prk(kdlon, 6, kflev+1)
56 DOUBLE PRECISION prmu0(kdlon, kflev+1)
57 DOUBLE PRECISION ptauaz(kdlon, kflev)
58 DOUBLE PRECISION ptra1(kdlon, kflev+1)
59 DOUBLE PRECISION ptra2(kdlon, kflev+1)
60
61 ! * LOCAL VARIABLES:
62
63 DOUBLE PRECISION zc0i(kdlon, kflev+1)
64 DOUBLE PRECISION zclear(kdlon)
65 DOUBLE PRECISION zr21(kdlon)
66 DOUBLE PRECISION zss0(kdlon)
67 DOUBLE PRECISION zscat(kdlon)
68 DOUBLE PRECISION ztr(kdlon, 2, kflev+1)
69
70 INTEGER jl, jk, ja, jkl, jklp1, jaj, jkm1
71 DOUBLE PRECISION ztray, zgar, zratio, zff, zfacoa, zcorae
72 DOUBLE PRECISION zmue, zgap, zww, zto, zden, zmu1, zden1
73 DOUBLE PRECISION zbmu0, zbmu1, zre11
74
75 ! ------------------------------------------------------------------
76
77 ! * 1. OPTICAL PARAMETERS FOR AEROSOLS AND RAYLEIGH
78 ! --------------------------------------------
79
80
81 DO jk = 1, kflev + 1
82 DO ja = 1, 6
83 DO jl = 1, kdlon
84 prj(jl, ja, jk) = 0.
85 prk(jl, ja, jk) = 0.
86 END DO
87 END DO
88 END DO
89
90 DO jk = 1, kflev
91 DO jl = 1, kdlon
92 ptauaz(jl, jk) = flag_aer*tauae(jl, jk, knu)
93 ppizaz(jl, jk) = flag_aer*pizae(jl, jk, knu)
94 pcgaz(jl, jk) = flag_aer*cgae(jl, jk, knu)
95 END DO
96
97 IF (flag_aer>0) THEN
98 ! -OB
99 DO jl = 1, kdlon
100 ! PCGAZ(JL,JK)=PCGAZ(JL,JK)/PPIZAZ(JL,JK)
101 ! PPIZAZ(JL,JK)=PPIZAZ(JL,JK)/PTAUAZ(JL,JK)
102 ztray = prayl(jl)*pdsig(jl, jk)
103 zratio = ztray/(ztray+ptauaz(jl,jk))
104 zgar = pcgaz(jl, jk)
105 zff = zgar*zgar
106 ptauaz(jl, jk) = ztray + ptauaz(jl, jk)*(1.-ppizaz(jl,jk)*zff)
107 pcgaz(jl, jk) = zgar*(1.-zratio)/(1.+zgar)
108 ppizaz(jl, jk) = zratio + (1.-zratio)*ppizaz(jl, jk)*(1.-zff)/(1.- &
109 ppizaz(jl,jk)*zff)
110 END DO
111 ELSE
112 DO jl = 1, kdlon
113 ztray = prayl(jl)*pdsig(jl, jk)
114 ptauaz(jl, jk) = ztray
115 pcgaz(jl, jk) = 0.
116 ppizaz(jl, jk) = 1. - repsct
117 END DO
118 END IF ! check flag_aer
119 END DO
120
121 ! ------------------------------------------------------------------
122
123 ! * 2. TOTAL EFFECTIVE CLOUDINESS ABOVE A GIVEN LEVEL
124 ! ----------------------------------------------
125
126
127 DO jl = 1, kdlon
128 zc0i(jl, kflev+1) = 0.
129 zclear(jl) = 1.
130 zscat(jl) = 0.
131 END DO
132
133 jk = 1
134 jkl = kflev + 1 - jk
135 jklp1 = jkl + 1
136 DO jl = 1, kdlon
137 zfacoa = 1. - ppizaz(jl, jkl)*pcgaz(jl, jkl)*pcgaz(jl, jkl)
138 zcorae = zfacoa*ptauaz(jl, jkl)*psec(jl)
139 zr21(jl) = exp(-zcorae)
140 zss0(jl) = 1. - zr21(jl)
141
142 IF (novlp==1) THEN
143 ! * maximum-random
144 zclear(jl) = zclear(jl)*(1.0-max(zss0(jl),zscat(jl)))/ &
145 (1.0-min(zscat(jl),1.-zepsec))
146 zc0i(jl, jkl) = 1.0 - zclear(jl)
147 zscat(jl) = zss0(jl)
148 ELSE IF (novlp==2) THEN
149 ! * maximum
150 zscat(jl) = max(zss0(jl), zscat(jl))
151 zc0i(jl, jkl) = zscat(jl)
152 ELSE IF (novlp==3) THEN
153 ! * random
154 zclear(jl) = zclear(jl)*(1.0-zss0(jl))
155 zscat(jl) = 1.0 - zclear(jl)
156 zc0i(jl, jkl) = zscat(jl)
157 END IF
158 END DO
159
160 DO jk = 2, kflev
161 jkl = kflev + 1 - jk
162 jklp1 = jkl + 1
163 DO jl = 1, kdlon
164 zfacoa = 1. - ppizaz(jl, jkl)*pcgaz(jl, jkl)*pcgaz(jl, jkl)
165 zcorae = zfacoa*ptauaz(jl, jkl)*psec(jl)
166 zr21(jl) = exp(-zcorae)
167 zss0(jl) = 1. - zr21(jl)
168
169 IF (novlp==1) THEN
170 ! * maximum-random
171 zclear(jl) = zclear(jl)*(1.0-max(zss0(jl),zscat(jl)))/ &
172 (1.0-min(zscat(jl),1.-zepsec))
173 zc0i(jl, jkl) = 1.0 - zclear(jl)
174 zscat(jl) = zss0(jl)
175 ELSE IF (novlp==2) THEN
176 ! * maximum
177 zscat(jl) = max(zss0(jl), zscat(jl))
178 zc0i(jl, jkl) = zscat(jl)
179 ELSE IF (novlp==3) THEN
180 ! * random
181 zclear(jl) = zclear(jl)*(1.0-zss0(jl))
182 zscat(jl) = 1.0 - zclear(jl)
183 zc0i(jl, jkl) = zscat(jl)
184 END IF
185 END DO
186 END DO
187
188 ! ------------------------------------------------------------------
189
190 ! * 3. REFLECTIVITY/TRANSMISSIVITY FOR PURE SCATTERING
191 ! -----------------------------------------------
192
193
194 DO jl = 1, kdlon
195 pray1(jl, kflev+1) = 0.
196 pray2(jl, kflev+1) = 0.
197 prefz(jl, 2, 1) = palbp(jl, knu)
198 prefz(jl, 1, 1) = palbp(jl, knu)
199 ptra1(jl, kflev+1) = 1.
200 ptra2(jl, kflev+1) = 1.
201 END DO
202
203 DO jk = 2, kflev + 1
204 jkm1 = jk - 1
205 DO jl = 1, kdlon
206
207
208 ! ------------------------------------------------------------------
209
210 ! * 3.1 EQUIVALENT ZENITH ANGLE
211 ! -----------------------
212
213
214 zmue = (1.-zc0i(jl,jk))*psec(jl) + zc0i(jl, jk)*1.66
215 prmu0(jl, jk) = 1./zmue
216
217
218 ! ------------------------------------------------------------------
219
220 ! * 3.2 REFLECT./TRANSMISSIVITY DUE TO RAYLEIGH AND AEROSOLS
221 ! ----------------------------------------------------
222
223
224 zgap = pcgaz(jl, jkm1)
225 zbmu0 = 0.5 - 0.75*zgap/zmue
226 zww = ppizaz(jl, jkm1)
227 zto = ptauaz(jl, jkm1)
228 zden = 1. + (1.-zww+zbmu0*zww)*zto*zmue + (1-zww)*(1.-zww+2.*zbmu0*zww) &
229 *zto*zto*zmue*zmue
230 pray1(jl, jkm1) = zbmu0*zww*zto*zmue/zden
231 ptra1(jl, jkm1) = 1./zden
232
233 zmu1 = 0.5
234 zbmu1 = 0.5 - 0.75*zgap*zmu1
235 zden1 = 1. + (1.-zww+zbmu1*zww)*zto/zmu1 + (1-zww)*(1.-zww+2.*zbmu1*zww &
236 )*zto*zto/zmu1/zmu1
237 pray2(jl, jkm1) = zbmu1*zww*zto/zmu1/zden1
238 ptra2(jl, jkm1) = 1./zden1
239
240
241
242 prefz(jl, 1, jk) = (pray1(jl,jkm1)+prefz(jl,1,jkm1)*ptra1(jl,jkm1)* &
243 ptra2(jl,jkm1)/(1.-pray2(jl,jkm1)*prefz(jl,1,jkm1)))
244
245 ztr(jl, 1, jkm1) = (ptra1(jl,jkm1)/(1.-pray2(jl,jkm1)*prefz(jl,1, &
246 jkm1)))
247
248 prefz(jl, 2, jk) = (pray1(jl,jkm1)+prefz(jl,2,jkm1)*ptra1(jl,jkm1)* &
249 ptra2(jl,jkm1))
250
251 ztr(jl, 2, jkm1) = ptra1(jl, jkm1)
252
253 END DO
254 END DO
255 DO jl = 1, kdlon
256 zmue = (1.-zc0i(jl,1))*psec(jl) + zc0i(jl, 1)*1.66
257 prmu0(jl, 1) = 1./zmue
258 END DO
259
260
261 ! ------------------------------------------------------------------
262
263 ! * 3.5 REFLECT./TRANSMISSIVITY BETWEEN SURFACE AND LEVEL
264 ! -------------------------------------------------
265
266
267 IF (knu==1) THEN
268 jaj = 2
269 DO jl = 1, kdlon
270 prj(jl, jaj, kflev+1) = 1.
271 prk(jl, jaj, kflev+1) = prefz(jl, 1, kflev+1)
272 END DO
273
274 DO jk = 1, kflev
275 jkl = kflev + 1 - jk
276 jklp1 = jkl + 1
277 DO jl = 1, kdlon
278 zre11 = prj(jl, jaj, jklp1)*ztr(jl, 1, jkl)
279 prj(jl, jaj, jkl) = zre11
280 prk(jl, jaj, jkl) = zre11*prefz(jl, 1, jkl)
281 END DO
282 END DO
283
284 ELSE
285
286 DO jaj = 1, 2
287 DO jl = 1, kdlon
288 prj(jl, jaj, kflev+1) = 1.
289 prk(jl, jaj, kflev+1) = prefz(jl, jaj, kflev+1)
290 END DO
291
292 DO jk = 1, kflev
293 jkl = kflev + 1 - jk
294 jklp1 = jkl + 1
295 DO jl = 1, kdlon
296 zre11 = prj(jl, jaj, jklp1)*ztr(jl, jaj, jkl)
297 prj(jl, jaj, jkl) = zre11
298 prk(jl, jaj, jkl) = zre11*prefz(jl, jaj, jkl)
299 END DO
300 END DO
301 END DO
302
303 END IF
304
305 END SUBROUTINE swclr
306
307 end module swclr_m

  ViewVC Help
Powered by ViewVC 1.1.21