/[lmdze]/trunk/phylmd/Radlwsw/sw2s.f
ViewVC logotype

Contents of /trunk/phylmd/Radlwsw/sw2s.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 265 - (show annotations)
Tue Mar 20 09:35:59 2018 UTC (6 years, 2 months ago) by guez
File size: 14866 byte(s)
Rename module dimens_m to dimensions.
1 module sw2s_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE sw2s(knu, paki, palbd, palbp, pcg, pcld, pclear, pdsig, pomega, &
8 poz, prmu, psec, ptau, pud, pwv, pqs, pfdown, pfup)
9
10 USE dimensions
11 USE dimphy
12 USE raddim
13 USE radepsi
14 use swclr_m, only: swclr
15 use swde_m, only: swde
16 use swr_m, only: swr
17
18 ! ------------------------------------------------------------------
19 ! PURPOSE.
20 ! --------
21
22 ! THIS ROUTINE COMPUTES THE SHORTWAVE RADIATION FLUXES IN THE
23 ! SECOND SPECTRAL INTERVAL FOLLOWING FOUQUART AND BONNEL (1980).
24
25 ! METHOD.
26 ! -------
27
28 ! 1. COMPUTES REFLECTIVITY/TRANSMISSIVITY CORRESPONDING TO
29 ! CONTINUUM SCATTERING
30 ! 2. COMPUTES REFLECTIVITY/TRANSMISSIVITY CORRESPONDING FOR
31 ! A GREY MOLECULAR ABSORPTION
32 ! 3. LAPLACE TRANSFORM ON THE PREVIOUS TO GET EFFECTIVE AMOUNTS
33 ! OF ABSORBERS
34 ! 4. APPLY H2O AND U.M.G. TRANSMISSION FUNCTIONS
35 ! 5. MULTIPLY BY OZONE TRANSMISSION FUNCTION
36
37 ! REFERENCE.
38 ! ----------
39
40 ! SEE RADIATION'S PART OF THE ECMWF RESEARCH DEPARTMENT
41 ! DOCUMENTATION, AND FOUQUART AND BONNEL (1980)
42
43 ! AUTHOR.
44 ! -------
45 ! JEAN-JACQUES MORCRETTE *ECMWF*
46
47 ! MODIFICATIONS.
48 ! --------------
49 ! ORIGINAL : 89-07-14
50 ! 94-11-15 J.-J. MORCRETTE DIRECT/DIFFUSE ALBEDO
51 ! ------------------------------------------------------------------
52 ! * ARGUMENTS:
53
54 INTEGER knu
55 DOUBLE PRECISION paki(kdlon, 2)
56 DOUBLE PRECISION palbd(kdlon, 2)
57 DOUBLE PRECISION palbp(kdlon, 2)
58 DOUBLE PRECISION pcg(kdlon, 2, kflev)
59 DOUBLE PRECISION pcld(kdlon, kflev)
60 DOUBLE PRECISION pclear(kdlon)
61 DOUBLE PRECISION pdsig(kdlon, kflev)
62 DOUBLE PRECISION pomega(kdlon, 2, kflev)
63 DOUBLE PRECISION poz(kdlon, kflev)
64 DOUBLE PRECISION pqs(kdlon, kflev)
65 DOUBLE PRECISION prmu(kdlon)
66 DOUBLE PRECISION psec(kdlon)
67 DOUBLE PRECISION ptau(kdlon, 2, kflev)
68 DOUBLE PRECISION pud(kdlon, 5, kflev+1)
69 DOUBLE PRECISION pwv(kdlon, kflev)
70
71 DOUBLE PRECISION pfdown(kdlon, kflev+1)
72 DOUBLE PRECISION pfup(kdlon, kflev+1)
73
74 ! * LOCAL VARIABLES:
75
76 INTEGER iind2(2), iind3(3)
77 DOUBLE PRECISION zcgaz(kdlon, kflev)
78 DOUBLE PRECISION zfd(kdlon, kflev+1)
79 DOUBLE PRECISION zfu(kdlon, kflev+1)
80 DOUBLE PRECISION zg(kdlon)
81 DOUBLE PRECISION zgg(kdlon)
82 DOUBLE PRECISION zpizaz(kdlon, kflev)
83 DOUBLE PRECISION zrayl(kdlon)
84 DOUBLE PRECISION zray1(kdlon, kflev+1)
85 DOUBLE PRECISION zray2(kdlon, kflev+1)
86 DOUBLE PRECISION zref(kdlon)
87 DOUBLE PRECISION zrefz(kdlon, 2, kflev+1)
88 DOUBLE PRECISION zre1(kdlon)
89 DOUBLE PRECISION zre2(kdlon)
90 DOUBLE PRECISION zrj(kdlon, 6, kflev+1)
91 DOUBLE PRECISION zrj0(kdlon, 6, kflev+1)
92 DOUBLE PRECISION zrk(kdlon, 6, kflev+1)
93 DOUBLE PRECISION zrk0(kdlon, 6, kflev+1)
94 DOUBLE PRECISION zrl(kdlon, 8)
95 DOUBLE PRECISION zrmue(kdlon, kflev+1)
96 DOUBLE PRECISION zrmu0(kdlon, kflev+1)
97 DOUBLE PRECISION zrmuz(kdlon)
98 DOUBLE PRECISION zrneb(kdlon)
99 DOUBLE PRECISION zr1(kdlon)
100 DOUBLE PRECISION zr2(kdlon, 2)
101 DOUBLE PRECISION zr3(kdlon, 3)
102 DOUBLE PRECISION zr4(kdlon)
103 DOUBLE PRECISION zr21(kdlon)
104 DOUBLE PRECISION zr22(kdlon)
105 DOUBLE PRECISION zs(kdlon)
106 DOUBLE PRECISION ztauaz(kdlon, kflev)
107 DOUBLE PRECISION zto1(kdlon)
108 DOUBLE PRECISION ztr(kdlon, 2, kflev+1)
109 DOUBLE PRECISION ztra1(kdlon, kflev+1)
110 DOUBLE PRECISION ztra2(kdlon, kflev+1)
111 DOUBLE PRECISION ztr1(kdlon)
112 DOUBLE PRECISION ztr2(kdlon)
113 DOUBLE PRECISION zw(kdlon)
114 DOUBLE PRECISION zw1(kdlon)
115 DOUBLE PRECISION zw2(kdlon, 2)
116 DOUBLE PRECISION zw3(kdlon, 3)
117 DOUBLE PRECISION zw4(kdlon)
118 DOUBLE PRECISION zw5(kdlon)
119
120 INTEGER jl, jk, k, jaj, ikm1, ikl, jn, jabs, jkm1
121 INTEGER jref, jkl, jklp1, jajp, jkki, jkkp4, jn2j, iabs
122 DOUBLE PRECISION zrmum1, zwh2o, zcneb, zaa, zbb, zrki, zre11
123
124 ! * Prescribed Data:
125
126 DOUBLE PRECISION rsun(2)
127 SAVE rsun
128 DOUBLE PRECISION rray(2, 6)
129 SAVE rray
130 DATA rsun(1)/0.441676d0/
131 DATA rsun(2)/0.558324d0/
132 DATA (rray(1,k), k=1, 6)/.428937d-01, .890743d+00, -.288555d+01, &
133 .522744d+01, -.469173d+01, .161645d+01/
134 DATA (rray(2,k), k=1, 6)/.697200d-02, .173297d-01, -.850903d-01, &
135 .248261d+00, -.302031d+00, .129662d+00/
136
137 ! ------------------------------------------------------------------
138
139 ! * 1. SECOND SPECTRAL INTERVAL (0.68-4.00 MICRON)
140 ! -------------------------------------------
141
142
143
144 ! * 1.1 OPTICAL THICKNESS FOR RAYLEIGH SCATTERING
145 ! -----------------------------------------
146
147
148 DO jl = 1, kdlon
149 zrmum1 = 1. - prmu(jl)
150 zrayl(jl) = rray(knu, 1) + zrmum1*(rray(knu,2)+zrmum1*(rray(knu, &
151 3)+zrmum1*(rray(knu,4)+zrmum1*(rray(knu,5)+zrmum1*rray(knu,6)))))
152 END DO
153
154
155 ! ------------------------------------------------------------------
156
157 ! * 2. CONTINUUM SCATTERING CALCULATIONS
158 ! ---------------------------------
159
160
161 ! * 2.1 CLEAR-SKY FRACTION OF THE COLUMN
162 ! --------------------------------
163
164
165 CALL swclr(knu, palbp, pdsig, zrayl, psec, zpizaz, zray1, zray2, zrefz, &
166 zrj0, zrk0, zrmu0, ztauaz, ztra1, ztra2)
167
168
169 ! * 2.2 CLOUDY FRACTION OF THE COLUMN
170 ! -----------------------------
171
172
173 zcgaz = 0d0
174 CALL swr(knu, palbd, pcg, pcld, pomega, psec, ptau, zcgaz, &
175 zpizaz, zray1, zray2, zrefz, zrj, zrk, zrmue, ztauaz, ztra1, ztra2)
176
177
178 ! ------------------------------------------------------------------
179
180 ! * 3. SCATTERING CALCULATIONS WITH GREY MOLECULAR ABSORPTION
181 ! ------------------------------------------------------
182
183
184 jn = 2
185
186 DO jabs = 1, 2
187
188
189 ! * 3.1 SURFACE CONDITIONS
190 ! ------------------
191
192
193 DO jl = 1, kdlon
194 zrefz(jl, 2, 1) = palbd(jl, knu)
195 zrefz(jl, 1, 1) = palbd(jl, knu)
196 END DO
197
198
199 ! * 3.2 INTRODUCING CLOUD EFFECTS
200 ! -------------------------
201
202
203 DO jk = 2, kflev + 1
204 jkm1 = jk - 1
205 ikl = kflev + 1 - jkm1
206 DO jl = 1, kdlon
207 zrneb(jl) = pcld(jl, jkm1)
208 IF (jabs==1 .AND. zrneb(jl)>2.*zeelog) THEN
209 zwh2o = max(pwv(jl,jkm1), zeelog)
210 zcneb = max(zeelog, min(zrneb(jl),1.-zeelog))
211 zbb = pud(jl, jabs, jkm1)*pqs(jl, jkm1)/zwh2o
212 zaa = max((pud(jl,jabs,jkm1)-zcneb*zbb)/(1.-zcneb), zeelog)
213 ELSE
214 zaa = pud(jl, jabs, jkm1)
215 zbb = zaa
216 END IF
217 zrki = paki(jl, jabs)
218 zs(jl) = exp(-zrki*zaa*1.66)
219 zg(jl) = exp(-zrki*zaa/zrmue(jl,jk))
220 ztr1(jl) = 0.
221 zre1(jl) = 0.
222 ztr2(jl) = 0.
223 zre2(jl) = 0.
224
225 zw(jl) = pomega(jl, knu, jkm1)
226 zto1(jl) = ptau(jl, knu, jkm1)/zw(jl) + ztauaz(jl, jkm1)/zpizaz(jl, &
227 jkm1) + zbb*zrki
228
229 zr21(jl) = ptau(jl, knu, jkm1) + ztauaz(jl, jkm1)
230 zr22(jl) = ptau(jl, knu, jkm1)/zr21(jl)
231 zgg(jl) = zr22(jl)*pcg(jl, knu, jkm1) + (1.-zr22(jl))*zcgaz(jl, jkm1)
232 zw(jl) = zr21(jl)/zto1(jl)
233 zref(jl) = zrefz(jl, 1, jkm1)
234 zrmuz(jl) = zrmue(jl, jk)
235 END DO
236
237 CALL swde(zgg, zref, zrmuz, zto1, zw, zre1, zre2, ztr1, ztr2)
238
239 DO jl = 1, kdlon
240
241 zrefz(jl, 2, jk) = (1.-zrneb(jl))*(zray1(jl,jkm1)+zrefz(jl,2,jkm1)* &
242 ztra1(jl,jkm1)*ztra2(jl,jkm1))*zg(jl)*zs(jl) + zrneb(jl)*zre1(jl)
243
244 ztr(jl, 2, jkm1) = zrneb(jl)*ztr1(jl) + (ztra1(jl,jkm1))*zg(jl)*(1.- &
245 zrneb(jl))
246
247 zrefz(jl, 1, jk) = (1.-zrneb(jl))*(zray1(jl,jkm1)+zrefz(jl,1,jkm1)* &
248 ztra1(jl,jkm1)*ztra2(jl,jkm1)/(1.-zray2(jl,jkm1)*zrefz(jl,1, &
249 jkm1)))*zg(jl)*zs(jl) + zrneb(jl)*zre2(jl)
250
251 ztr(jl, 1, jkm1) = zrneb(jl)*ztr2(jl) + (ztra1(jl,jkm1)/(1.-zray2(jl, &
252 jkm1)*zrefz(jl,1,jkm1)))*zg(jl)*(1.-zrneb(jl))
253
254 END DO
255 END DO
256
257 ! * 3.3 REFLECT./TRANSMISSIVITY BETWEEN SURFACE AND LEVEL
258 ! -------------------------------------------------
259
260
261 DO jref = 1, 2
262
263 jn = jn + 1
264
265 DO jl = 1, kdlon
266 zrj(jl, jn, kflev+1) = 1.
267 zrk(jl, jn, kflev+1) = zrefz(jl, jref, kflev+1)
268 END DO
269
270 DO jk = 1, kflev
271 jkl = kflev + 1 - jk
272 jklp1 = jkl + 1
273 DO jl = 1, kdlon
274 zre11 = zrj(jl, jn, jklp1)*ztr(jl, jref, jkl)
275 zrj(jl, jn, jkl) = zre11
276 zrk(jl, jn, jkl) = zre11*zrefz(jl, jref, jkl)
277 END DO
278 END DO
279 END DO
280 END DO
281
282
283 ! ------------------------------------------------------------------
284
285 ! * 4. INVERT GREY AND CONTINUUM FLUXES
286 ! --------------------------------
287
288
289
290 ! * 4.1 UPWARD (ZRK) AND DOWNWARD (ZRJ) PSEUDO-FLUXES
291 ! ---------------------------------------------
292
293
294 DO jk = 1, kflev + 1
295 DO jaj = 1, 5, 2
296 jajp = jaj + 1
297 DO jl = 1, kdlon
298 zrj(jl, jaj, jk) = zrj(jl, jaj, jk) - zrj(jl, jajp, jk)
299 zrk(jl, jaj, jk) = zrk(jl, jaj, jk) - zrk(jl, jajp, jk)
300 zrj(jl, jaj, jk) = max(zrj(jl,jaj,jk), zeelog)
301 zrk(jl, jaj, jk) = max(zrk(jl,jaj,jk), zeelog)
302 END DO
303 END DO
304 END DO
305
306 DO jk = 1, kflev + 1
307 DO jaj = 2, 6, 2
308 DO jl = 1, kdlon
309 zrj(jl, jaj, jk) = max(zrj(jl,jaj,jk), zeelog)
310 zrk(jl, jaj, jk) = max(zrk(jl,jaj,jk), zeelog)
311 END DO
312 END DO
313 END DO
314
315 ! * 4.2 EFFECTIVE ABSORBER AMOUNTS BY INVERSE LAPLACE
316 ! ---------------------------------------------
317
318
319 DO jk = 1, kflev + 1
320 jkki = 1
321 DO jaj = 1, 2
322 iind2(1) = jaj
323 iind2(2) = jaj
324 DO jn = 1, 2
325 jn2j = jn + 2*jaj
326 jkkp4 = jkki + 4
327
328 ! * 4.2.1 EFFECTIVE ABSORBER AMOUNTS
329 ! --------------------------
330
331
332 DO jl = 1, kdlon
333 zw2(jl, 1) = log(zrj(jl,jn,jk)/zrj(jl,jn2j,jk))/paki(jl, jaj)
334 zw2(jl, 2) = log(zrk(jl,jn,jk)/zrk(jl,jn2j,jk))/paki(jl, jaj)
335 END DO
336
337 ! * 4.2.2 TRANSMISSION FUNCTION
338 ! ---------------------
339
340
341 CALL swtt1(knu, 2, iind2, zw2, zr2)
342
343 DO jl = 1, kdlon
344 zrl(jl, jkki) = zr2(jl, 1)
345 zrl(jl, jkkp4) = zr2(jl, 2)
346 END DO
347
348 jkki = jkki + 1
349 END DO
350 END DO
351
352 ! * 4.3 UPWARD AND DOWNWARD FLUXES WITH H2O AND UMG ABSORPTION
353 ! ------------------------------------------------------
354
355
356 DO jl = 1, kdlon
357 pfdown(jl, jk) = zrj(jl, 1, jk)*zrl(jl, 1)*zrl(jl, 3) + &
358 zrj(jl, 2, jk)*zrl(jl, 2)*zrl(jl, 4)
359 pfup(jl, jk) = zrk(jl, 1, jk)*zrl(jl, 5)*zrl(jl, 7) + &
360 zrk(jl, 2, jk)*zrl(jl, 6)*zrl(jl, 8)
361 END DO
362 END DO
363
364
365 ! ------------------------------------------------------------------
366
367 ! * 5. MOLECULAR ABSORPTION ON CLEAR-SKY FLUXES
368 ! ----------------------------------------
369
370
371
372 ! * 5.1 DOWNWARD FLUXES
373 ! ---------------
374
375
376 jaj = 2
377 iind3(1) = 1
378 iind3(2) = 2
379 iind3(3) = 3
380
381 DO jl = 1, kdlon
382 zw3(jl, 1) = 0.
383 zw3(jl, 2) = 0.
384 zw3(jl, 3) = 0.
385 zw4(jl) = 0.
386 zw5(jl) = 0.
387 zr4(jl) = 1.
388 zfd(jl, kflev+1) = zrj0(jl, jaj, kflev+1)
389 END DO
390 DO jk = 1, kflev
391 ikl = kflev + 1 - jk
392 DO jl = 1, kdlon
393 zw3(jl, 1) = zw3(jl, 1) + pud(jl, 1, ikl)/zrmu0(jl, ikl)
394 zw3(jl, 2) = zw3(jl, 2) + pud(jl, 2, ikl)/zrmu0(jl, ikl)
395 zw3(jl, 3) = zw3(jl, 3) + poz(jl, ikl)/zrmu0(jl, ikl)
396 zw4(jl) = zw4(jl) + pud(jl, 4, ikl)/zrmu0(jl, ikl)
397 zw5(jl) = zw5(jl) + pud(jl, 5, ikl)/zrmu0(jl, ikl)
398 END DO
399
400 CALL swtt1(knu, 3, iind3, zw3, zr3)
401
402 DO jl = 1, kdlon
403 ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))
404 zfd(jl, ikl) = zr3(jl, 1)*zr3(jl, 2)*zr3(jl, 3)*zr4(jl)* &
405 zrj0(jl, jaj, ikl)
406 END DO
407 END DO
408
409
410 ! * 5.2 UPWARD FLUXES
411 ! -------------
412
413
414 DO jl = 1, kdlon
415 zfu(jl, 1) = zfd(jl, 1)*palbp(jl, knu)
416 END DO
417
418 DO jk = 2, kflev + 1
419 ikm1 = jk - 1
420 DO jl = 1, kdlon
421 zw3(jl, 1) = zw3(jl, 1) + pud(jl, 1, ikm1)*1.66
422 zw3(jl, 2) = zw3(jl, 2) + pud(jl, 2, ikm1)*1.66
423 zw3(jl, 3) = zw3(jl, 3) + poz(jl, ikm1)*1.66
424 zw4(jl) = zw4(jl) + pud(jl, 4, ikm1)*1.66
425 zw5(jl) = zw5(jl) + pud(jl, 5, ikm1)*1.66
426 END DO
427
428 CALL swtt1(knu, 3, iind3, zw3, zr3)
429
430 DO jl = 1, kdlon
431 ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))
432 zfu(jl, jk) = zr3(jl, 1)*zr3(jl, 2)*zr3(jl, 3)*zr4(jl)* &
433 zrk0(jl, jaj, jk)
434 END DO
435 END DO
436
437
438 ! ------------------------------------------------------------------
439
440 ! * 6. INTRODUCTION OF OZONE AND H2O CONTINUUM ABSORPTION
441 ! --------------------------------------------------
442
443 iabs = 3
444
445 ! * 6.1 DOWNWARD FLUXES
446 ! ---------------
447
448 DO jl = 1, kdlon
449 zw1(jl) = 0.
450 zw4(jl) = 0.
451 zw5(jl) = 0.
452 zr1(jl) = 0.
453 pfdown(jl, kflev+1) = ((1.-pclear(jl))*pfdown(jl,kflev+1)+pclear(jl)*zfd( &
454 jl,kflev+1))*rsun(knu)
455 END DO
456
457 DO jk = 1, kflev
458 ikl = kflev + 1 - jk
459 DO jl = 1, kdlon
460 zw1(jl) = zw1(jl) + poz(jl, ikl)/zrmue(jl, ikl)
461 zw4(jl) = zw4(jl) + pud(jl, 4, ikl)/zrmue(jl, ikl)
462 zw5(jl) = zw5(jl) + pud(jl, 5, ikl)/zrmue(jl, ikl)
463 ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))
464 END DO
465
466 CALL swtt(knu, iabs, zw1, zr1)
467
468 DO jl = 1, kdlon
469 pfdown(jl, ikl) = ((1.-pclear(jl))*zr1(jl)*zr4(jl)*pfdown(jl,ikl)+ &
470 pclear(jl)*zfd(jl,ikl))*rsun(knu)
471 END DO
472 END DO
473
474
475 ! * 6.2 UPWARD FLUXES
476 ! -------------
477
478 DO jl = 1, kdlon
479 pfup(jl, 1) = ((1.-pclear(jl))*zr1(jl)*zr4(jl)*pfup(jl,1)+pclear(jl)*zfu( &
480 jl,1))*rsun(knu)
481 END DO
482
483 DO jk = 2, kflev + 1
484 ikm1 = jk - 1
485 DO jl = 1, kdlon
486 zw1(jl) = zw1(jl) + poz(jl, ikm1)*1.66
487 zw4(jl) = zw4(jl) + pud(jl, 4, ikm1)*1.66
488 zw5(jl) = zw5(jl) + pud(jl, 5, ikm1)*1.66
489 ! ZR4(JL) = EXP(-RSWCE*ZW4(JL)-RSWCP*ZW5(JL))
490 END DO
491
492 CALL swtt(knu, iabs, zw1, zr1)
493
494 DO jl = 1, kdlon
495 pfup(jl, jk) = ((1.-pclear(jl))*zr1(jl)*zr4(jl)*pfup(jl,jk)+pclear(jl)* &
496 zfu(jl,jk))*rsun(knu)
497 END DO
498 END DO
499
500 END SUBROUTINE sw2s
501
502 end module sw2s_m

  ViewVC Help
Powered by ViewVC 1.1.21