LMDZ
swclr.F90
Go to the documentation of this file.
1 SUBROUTINE swclr &
2  &( kidia , kfdia , klon , klev , kaer , knu &
3  &, paer , palbp , pdsig , prayl , psec &
4  &, pcgaz , ppizaz, pray1 , pray2 , prefz , prj &
5  &, prk , prmu0 , ptauaz, ptra1 , ptra2 , ptrclr &
6  &)
7 
8 !**** *SWCLR* - CLEAR-SKY COLUMN COMPUTATIONS
9 
10 ! PURPOSE.
11 ! --------
12 ! COMPUTES THE REFLECTIVITY AND TRANSMISSIVITY IN CASE OF
13 ! CLEAR-SKY COLUMN
14 
15 !** INTERFACE.
16 ! ----------
17 
18 ! *SWCLR* IS CALLED EITHER FROM *SW1S*
19 ! OR FROM *SWNI*
20 
21 ! IMPLICIT ARGUMENTS :
22 ! --------------------
23 
24 ! ==== INPUTS ===
25 ! ==== OUTPUTS ===
26 
27 ! METHOD.
28 ! -------
29 
30 
31 ! EXTERNALS.
32 ! ----------
33 
34 ! NONE
35 
36 ! REFERENCE.
37 ! ----------
38 
39 ! SEE RADIATION'S PART OF THE ECMWF RESEARCH DEPARTMENT
40 ! DOCUMENTATION, AND FOUQUART AND BONNEL (1980)
41 
42 ! AUTHOR.
43 ! -------
44 ! JEAN-JACQUES MORCRETTE *ECMWF*
45 
46 ! MODIFICATIONS.
47 ! --------------
48 ! ORIGINAL : 94-11-15
49 ! Modified : 96-03-19 JJM-PhD (loop 107 in absence of aerosols)
50 ! JJMorcrette 990128 : sunshine duration
51 ! JJMorcrette 990128 : sunshine duration
52 ! 99-05-25 JJMorcrette Revised aerosols
53 ! JJMorcrette 001218 : 6 spectral intervals
54 
55 ! ------------------------------------------------------------------
56 
57 
58 #include "tsmbkind.h"
59 
60 USE yoesw , ONLY : rtaua ,rpiza ,rcga
61 USE yoerad , ONLY : novlp ,nsw
62 USE yoerdi , ONLY : repclc
63 USE yoerdu , ONLY : repsct
64 
65 
66 IMPLICIT NONE
67 
68 
69 ! DUMMY INTEGER SCALARS
70 integer_m :: kaer
71 integer_m :: kfdia
72 integer_m :: kidia
73 integer_m :: klev
74 integer_m :: klon
75 integer_m :: knu
76 
77 
78 
79 ! ------------------------------------------------------------------
80 
81 !* 0.1 ARGUMENTS
82 ! ---------
83 
84 real_b :: paer(klon,6,klev), palbp(klon,nsw)&
85  &, pdsig(klon,klev)&
86  &, prayl(klon)&
87  &, psec(klon)
88 
89 real_b ::&
90  &pcgaz(klon,klev) &
91  &, ppizaz(klon,klev)&
92  &, pray1(klon,klev+1) , pray2(klon,klev+1)&
93  &, prefz(klon,2,klev+1), prj(klon,6,klev+1)&
94  &, prk(klon,6,klev+1) , prmu0(klon,klev+1)&
95  &, ptauaz(klon,klev)&
96  &, ptra1(klon,klev+1) , ptra2(klon,klev+1)&
97  &, ptrclr(klon)
98 
99 ! ------------------------------------------------------------------
100 
101 !* 0.2 LOCAL ARRAYS
102 ! ------------
103 
104 real_b :: zc0i(klon,klev+1)&
105  &, zcle0(klon,klev), zclear(klon) &
106  &, zr21(klon)&
107  &, zr23(klon) , zss0(klon) , zscat(klon)&
108  &, ztr(klon,2,klev+1)
109 
110 ! LOCAL INTEGER SCALARS
111 integer_m :: ikl, ja, jae, jaj, jk, jkl, jklp1, jkm1, jl, inu1
112 
113 ! LOCAL REAL SCALARS
114 real_b :: zbmu0, zbmu1, zcorae, zden, zden1, zfacoa,&
115  &zff, zgap, zgar, zmu1, zmue, zratio, zre11, &
116  &zto, ztray, zww
117 
118 
119 ! ------------------------------------------------------------------
120 
121 !* 1. OPTICAL PARAMETERS FOR AEROSOLS AND RAYLEIGH
122 ! --------------------------------------------
123 
124 
125 DO jk = 1 , klev+1
126  DO ja = 1 , 6
127  DO jl = kidia,kfdia
128  prj(jl,ja,jk) = _zero_
129  prk(jl,ja,jk) = _zero_
130  ENDDO
131  ENDDO
132 ENDDO
133 
134 ! ------ NB: 'PAER' AEROSOLS ARE ENTERED FROM TOP TO BOTTOM
135 
136 DO jk = 1 , klev
137  ikl=klev+1-jk
138  DO jl = kidia,kfdia
139  pcgaz(jl,jk) = _zero_
140  ppizaz(jl,jk) = _zero_
141  ptauaz(jl,jk) = _zero_
142  ENDDO
143  DO jae=1,6
144  DO jl = kidia,kfdia
145  ptauaz(jl,jk)=ptauaz(jl,jk)+paer(jl, jae, ikl)*rtaua(knu,jae)
146  ppizaz(jl,jk)=ppizaz(jl,jk)+paer(jl, jae, ikl)&
147  &* rtaua(knu,jae)*rpiza(knu,jae)
148  pcgaz(jl,jk) = pcgaz(jl,jk) +paer(jl, jae, ikl)&
149  &* rtaua(knu,jae)*rpiza(knu,jae)*rcga(knu,jae)
150  ENDDO
151  ENDDO
152 
153  DO jl = kidia,kfdia
154  IF (kaer /= 0) THEN
155  pcgaz(jl,jk)=pcgaz(jl,jk)/ppizaz(jl,jk)
156  ppizaz(jl,jk)=ppizaz(jl,jk)/ptauaz(jl,jk)
157  ztray = prayl(jl) * pdsig(jl,jk)
158  zratio = ztray / (ztray + ptauaz(jl,jk))
159  zgar = pcgaz(jl,jk)
160  zff = zgar * zgar
161  ptauaz(jl,jk)=ztray+ptauaz(jl,jk)*(_one_-ppizaz(jl,jk)*zff)
162  pcgaz(jl,jk) = zgar * (_one_ - zratio) / (_one_ + zgar)
163  ppizaz(jl,jk) =zratio+(_one_-zratio)*ppizaz(jl,jk)*(_one_-zff)&
164  &/ (_one_ - ppizaz(jl,jk) * zff)
165  ELSE
166  ztray = prayl(jl) * pdsig(jl,jk)
167  ptauaz(jl,jk) = ztray
168  pcgaz(jl,jk) = _zero_
169  ppizaz(jl,jk) = _one_-repsct
170  ENDIF
171  ENDDO
172 ENDDO
173 
174 ! ------------------------------------------------------------------
175 
176 !* 2. TOTAL EFFECTIVE CLOUDINESS ABOVE A GIVEN LEVEL
177 ! ----------------------------------------------
178 
179 
180 DO jl = kidia,kfdia
181  zr23(jl) = _zero_
182  zc0i(jl,klev+1) = _zero_
183  zclear(jl) = _one_
184  zscat(jl) = _zero_
185 ENDDO
186 
187 jk = 1
188 jkl = klev+1 - jk
189 jklp1 = jkl + 1
190 DO jl = kidia,kfdia
191  zfacoa = _one_ - ppizaz(jl,jkl)*pcgaz(jl,jkl)*pcgaz(jl,jkl)
192  zcorae = zfacoa * ptauaz(jl,jkl) * psec(jl)
193  zr21(jl) = exp(-zcorae )
194  zss0(jl) = _one_-zr21(jl)
195  zcle0(jl,jkl) = zss0(jl)
196 
197  IF (novlp == 1 .OR. novlp == 4) THEN
198 !* maximum-random
199  zclear(jl) = zclear(jl)&
200  &*(_one_-max(zss0(jl),zscat(jl)))&
201  &/(_one_-min(zscat(jl),_one_-repclc))
202  zc0i(jl,jkl) = _one_ - zclear(jl)
203  zscat(jl) = zss0(jl)
204  ELSEIF (novlp == 2) THEN
205 !* maximum
206  zscat(jl) = max( zss0(jl) , zscat(jl) )
207  zc0i(jl,jkl) = zscat(jl)
208  ELSEIF (novlp == 3) THEN
209 !* random
210  zclear(jl)=zclear(jl)*(_one_-zss0(jl))
211  zscat(jl) = _one_ - zclear(jl)
212  zc0i(jl,jkl) = zscat(jl)
213  ENDIF
214 ENDDO
215 
216 DO jk = 2 , klev
217  jkl = klev+1 - jk
218  jklp1 = jkl + 1
219  DO jl = kidia,kfdia
220  zfacoa = _one_ - ppizaz(jl,jkl)*pcgaz(jl,jkl)*pcgaz(jl,jkl)
221  zcorae = zfacoa * ptauaz(jl,jkl) * psec(jl)
222  zr21(jl) = exp(-zcorae )
223  zss0(jl) = _one_-zr21(jl)
224  zcle0(jl,jkl) = zss0(jl)
225 
226  IF (novlp == 1 .OR. novlp == 4) THEN
227 !* maximum-random
228  zclear(jl) = zclear(jl)&
229  &*(_one_-max(zss0(jl),zscat(jl)))&
230  &/(_one_-min(zscat(jl),_one_-repclc))
231  zc0i(jl,jkl) = _one_ - zclear(jl)
232  zscat(jl) = zss0(jl)
233  ELSEIF (novlp == 2) THEN
234 !* maximum
235  zscat(jl) = max( zss0(jl) , zscat(jl) )
236  zc0i(jl,jkl) = zscat(jl)
237  ELSEIF (novlp == 3) THEN
238 !* random
239  zclear(jl)=zclear(jl)*(_one_-zss0(jl))
240  zscat(jl) = _one_ - zclear(jl)
241  zc0i(jl,jkl) = zscat(jl)
242  ENDIF
243  ENDDO
244 ENDDO
245 
246 ! ------------------------------------------------------------------
247 
248 !* 3. REFLECTIVITY/TRANSMISSIVITY FOR PURE SCATTERING
249 ! -----------------------------------------------
250 
251 
252 DO jl = kidia,kfdia
253  pray1(jl,klev+1) = _zero_
254  pray2(jl,klev+1) = _zero_
255  prefz(jl,2,1) = palbp(jl,knu)
256  prefz(jl,1,1) = palbp(jl,knu)
257  ptra1(jl,klev+1) = _one_
258  ptra2(jl,klev+1) = _one_
259 ENDDO
260 
261 DO jk = 2 , klev+1
262  jkm1 = jk-1
263  DO jl = kidia,kfdia
264 
265 
266 ! ------------------------------------------------------------------
267 
268 !* 3.1 EQUIVALENT ZENITH ANGLE
269 ! -----------------------
270 
271 
272  zmue = (_one_-zc0i(jl,jk)) * psec(jl)+ zc0i(jl,jk) * 1.66_jprb
273  prmu0(jl,jk) = _one_/zmue
274 
275 
276 ! ------------------------------------------------------------------
277 
278 !* 3.2 REFLECT./TRANSMISSIVITY DUE TO RAYLEIGH AND AEROSOLS
279 ! ----------------------------------------------------
280 
281 
282  zgap = pcgaz(jl,jkm1)
283  zbmu0 = _half_ - 0.75_jprb * zgap / zmue
284  zww = ppizaz(jl,jkm1)
285  zto = ptauaz(jl,jkm1)
286  zden = _one_ + (_one_ - zww + zbmu0 * zww) * zto * zmue &
287  &+ (1-zww) * (_one_ - zww +_two_*zbmu0*zww)*zto*zto*zmue*zmue
288  pray1(jl,jkm1) = zbmu0 * zww * zto * zmue / zden
289  ptra1(jl,jkm1) = _one_ / zden
290 
291  zmu1 = _half_
292  zbmu1 = _half_ - 0.75_jprb * zgap * zmu1
293  zden1= _one_ + (_one_ - zww + zbmu1 * zww) * zto / zmu1 &
294  &+ (1-zww) * (_one_ - zww +_two_*zbmu1*zww)*zto*zto/zmu1/zmu1
295  pray2(jl,jkm1) = zbmu1 * zww * zto / zmu1 / zden1
296  ptra2(jl,jkm1) = _one_ / zden1
297 
298 
299 
300  prefz(jl,1,jk) = (pray1(jl,jkm1)&
301  &+ prefz(jl,1,jkm1) * ptra1(jl,jkm1)&
302  &* ptra2(jl,jkm1)&
303  &/ (_one_-pray2(jl,jkm1)*prefz(jl,1,jkm1)))
304 
305  ztr(jl,1,jkm1) = (ptra1(jl,jkm1)&
306  &/ (_one_-pray2(jl,jkm1)*prefz(jl,1,jkm1)))
307 
308  prefz(jl,2,jk) = (pray1(jl,jkm1)&
309  &+ prefz(jl,2,jkm1) * ptra1(jl,jkm1)&
310  &* ptra2(jl,jkm1) )
311 
312  ztr(jl,2,jkm1) = ptra1(jl,jkm1)
313 
314  ENDDO
315 ENDDO
316 DO jl = kidia,kfdia
317  zmue = (_one_-zc0i(jl,1))*psec(jl)+zc0i(jl,1)*1.66_jprb
318  prmu0(jl,1)=_one_/zmue
319  ptrclr(jl)=_one_-zc0i(jl,1)
320 ENDDO
321 
322 
323 ! ------------------------------------------------------------------
324 
325 !* 3.5 REFLECT./TRANSMISSIVITY BETWEEN SURFACE AND LEVEL
326 ! -------------------------------------------------
327 
328 IF (nsw <= 4) THEN
329  inu1=1
330 ELSE IF (nsw == 6) THEN
331  inu1=3
332 END IF
333 
334 IF (knu <= inu1) THEN
335  jaj = 2
336  DO jl = kidia,kfdia
337  prj(jl,jaj,klev+1) = _one_
338  prk(jl,jaj,klev+1) = prefz(jl, 1,klev+1)
339  ENDDO
340 
341  DO jk = 1 , klev
342  jkl = klev+1 - jk
343  jklp1 = jkl + 1
344  DO jl = kidia,kfdia
345  zre11= prj(jl,jaj,jklp1) * ztr(jl, 1,jkl)
346  prj(jl,jaj,jkl) = zre11
347  prk(jl,jaj,jkl) = zre11 * prefz(jl, 1,jkl)
348  ENDDO
349  ENDDO
350 
351 ELSE
352 
353  DO jaj = 1 , 2
354  DO jl = kidia,kfdia
355  prj(jl,jaj,klev+1) = _one_
356  prk(jl,jaj,klev+1) = prefz(jl,jaj,klev+1)
357  ENDDO
358 
359  DO jk = 1 , klev
360  jkl = klev+1 - jk
361  jklp1 = jkl + 1
362  DO jl = kidia,kfdia
363  zre11= prj(jl,jaj,jklp1) * ztr(jl,jaj,jkl)
364  prj(jl,jaj,jkl) = zre11
365  prk(jl,jaj,jkl) = zre11 * prefz(jl,jaj,jkl)
366  ENDDO
367  ENDDO
368  ENDDO
369 
370 ENDIF
371 
372 ! ------------------------------------------------------------------
373 
374 RETURN
375 END SUBROUTINE swclr
subroutine swclr(KIDIA, KFDIA, KLON, KLEV, KAER, KNU, PAER, PALBP, PDSIG, PRAYL, PSEC, PCGAZ, PPIZAZ, PRAY1, PRAY2, PREFZ, PRJ, PRK, PRMU0, PTAUAZ, PTRA1, PTRA2, PTRCLR,
Definition: swclr.F90:7
Definition: yoesw.F90:1
integer, save kidia
Definition: dimphy.F90:6
integer, save klon
Definition: dimphy.F90:3
integer(kind=jpim) novlp
Definition: yoerad.F90:24
real(kind=jprb) repsct
Definition: yoerdu.F90:23
integer, save klev
Definition: dimphy.F90:7
Definition: yoerdi.F90:1
integer, save kfdia
Definition: dimphy.F90:5
Definition: yoerad.F90:1
real(kind=jprb), dimension(6, 6) rtaua
Definition: yoesw.F90:115
real(kind=jprb), dimension(6, 6) rcga
Definition: yoesw.F90:117
real(kind=jprb), dimension(6, 6) rpiza
Definition: yoesw.F90:116
INTERFACE SUBROUTINE RRTM_ECRT_140GP && paer
real(kind=jprb) repclc
Definition: yoerdi.F90:21
Definition: yoerdu.F90:1