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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 217 - (show annotations)
Thu Mar 30 14:25:18 2017 UTC (7 years, 2 months ago) by guez
File size: 14920 byte(s)
run_off_lic downgraded from variable of module interface_surf to local
variable of fonte_neige.

Code could not work with ok_aie set to true, so removed this
possibility. tauae, piz_ae, cg_ae, topswai, solswai were then
0. cldtaupi was the same as cldtaupd.

In sw and procedures called by sw, flag_aer did not need to be double
precision, changed it to logical.

Downgraded re and fl from arguments of newmicro to local
variables. Added output of re and fl (following LMDZ).

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

  ViewVC Help
Powered by ViewVC 1.1.21