LMDZ
swu.F90
Go to the documentation of this file.
1 !OPTIONS XOPT(HSFUN)
2 SUBROUTINE swu &
3  &( kidia, kfdia , klon , klev &
4  &, psct , pcardi, pcldsw, ppmb , ppsol, prmu0, ptave, pwv &
5  &, paki , pcld , pclear, pdsig, pfact, prmu , psec , pud &
6  &)
7 
8 !**** *SWU* - SHORTWAVE RADIATION, ABSORBER AMOUNTS
9 
10 ! PURPOSE.
11 ! --------
12 ! COMPUTES THE ABSORBER AMOUNTS USED IN SHORTWAVE RADIATION
13 ! CALCULATIONS
14 
15 !** INTERFACE.
16 ! ----------
17 ! *SWU* IS CALLED BY *SW*
18 
19 
20 ! IMPLICIT ARGUMENTS :
21 ! --------------------
22 
23 ! ==== INPUTS ===
24 ! ==== OUTPUTS ===
25 
26 ! METHOD.
27 ! -------
28 
29 ! 1. COMPUTES ABSORBER AMOUNTS WITH TEMPERATURE AND PRESSURE
30 ! SCALING.
31 
32 ! EXTERNALS.
33 ! ----------
34 
35 ! *SWTT*
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 
51 ! ------------------------------------------------------------------
52 
53 
54 #include "tsmbkind.h"
55 
56 USE yoecld , ONLY : repsec
57 USE yoerad , ONLY : novlp ,nsw
58 USE yoerdu , ONLY : repscq
59 USE yoesw , ONLY : rpdh1 ,rpdu1 ,rpnh ,rpnu ,&
61 USE yoeovlp , ONLY : ra1ovlp
62 
63 
64 IMPLICIT NONE
65 
66 
67 ! DUMMY INTEGER SCALARS
68 integer_m :: kfdia
69 integer_m :: kidia
70 integer_m :: kkind
71 integer_m :: klev
72 integer_m :: klon
73 
74 ! DUMMY REAL SCALARS
75 real_b :: pcardi
76 real_b :: psct
77 
78 
79 
80 ! ------------------------------------------------------------------
81 
82 !* 0.1 ARGUMENTS
83 ! ---------
84 
85 real_b :: pcldsw(klon,klev), ppmb(klon,klev+1), ppsol(klon)&
86  &, prmu0(klon) , ptave(klon,klev) , pwv(klon,klev)
87 
88 real_b :: paki(klon,2,nsw)&
89  &, pcld(klon,klev) , pclear(klon)&
90  &, pdsig(klon,klev) , pfact(klon) , prmu(klon)&
91  &, psec(klon) , pud(klon,5,klev+1)
92 
93 integer_m :: inuir
94 
95 ! ------------------------------------------------------------------
96 
97 !* 0.2 LOCAL ARRAYS
98 ! ------------
99 
100 integer_m :: iind(2)
101 real_b :: zc1j(klon,klev+1),zclear(klon),zcloud(klon)&
102  &, zn175(klon), zn190(klon), zo175(klon)&
103  &, zo190(klon), zsign(klon)&
104  &, zr(klon,2) , zsigo(klon), zud(klon,2)
105 
106 ! LOCAL INTEGER SCALARS
107 integer_m :: ja, jk, jkl, jklp1, jkp1, jl, jnu
108 
109 ! LOCAL REAL SCALARS
110 real_b :: zdsco2, zdsh2o, zfppw, zrth, zrtu, zwh2o, zalpha1
111 
112 
113 ! ------------------------------------------------------------------
114 
115 !* 1. COMPUTES AMOUNTS OF ABSORBERS
116 ! -----------------------------
117 
118 
119 iind(1)=1
120 iind(2)=2
121 
122 
123 !* 1.1 INITIALIZES QUANTITIES
124 ! ----------------------
125 
126 
127 DO jl = kidia,kfdia
128  pud(jl,1,klev+1)=_zero_
129  pud(jl,2,klev+1)=_zero_
130  pud(jl,3,klev+1)=_zero_
131  pud(jl,4,klev+1)=_zero_
132  pud(jl,5,klev+1)=_zero_
133  pfact(jl)= prmu0(jl) * psct
134 !- already accounted for in RADINT
135 ! PRMU(JL)=SQRT(1224.* PRMU0(JL) * PRMU0(JL) + 1.) / 35.
136  prmu(jl)=prmu0(jl)
137 ! Martin control
138 ! PRINT*,'PRMU(',JL,')=',PRMU(JL)
139 ! Martin modif to avoid cos(sza)=0 for LMDZ:
140  IF (prmu(jl) .LE. 1e-3) prmu(jl) = 1e-3
141  psec(jl)=_one_/prmu(jl)
142  zc1j(jl,klev+1)=_zero_
143 ENDDO
144 
145 !* 1.3 AMOUNTS OF ABSORBERS
146 ! --------------------
147 
148 
149 DO jl= kidia,kfdia
150  zud(jl,1) = _zero_
151  zud(jl,2) = _zero_
152  zo175(jl) = ppsol(jl)** rpdu1
153  zo190(jl) = ppsol(jl)** rpdh1
154  zsigo(jl) = ppsol(jl)
155  zclear(jl)=_one_
156  zcloud(jl)=_zero_
157 ENDDO
158 
159 DO jk = 1 , klev
160  jkp1 = jk + 1
161  jkl = klev+1 - jk
162  jklp1 = jkl+1
163  DO jl = kidia,kfdia
164  zrth=(rth2o/ptave(jl,jk))**rtdh2o
165  zrtu=(rtumg/ptave(jl,jk))**rtdumg
166  zwh2o = max(pwv(jl,jkl) , repscq )
167  zsign(jl) = 100._jprb * ppmb(jl,jkp1)
168  pdsig(jl,jk) = (zsigo(jl) - zsign(jl))/ppsol(jl)
169  zn175(jl) = zsign(jl) ** rpdu1
170  zn190(jl) = zsign(jl) ** rpdh1
171  zdsco2 = zo175(jl) - zn175(jl)
172  zdsh2o = zo190(jl) - zn190(jl)
173  pud(jl,1,jk) = rpnh * zdsh2o * zwh2o * zrth
174  pud(jl,2,jk) = rpnu * zdsco2 * pcardi * zrtu
175  zfppw=1.6078_jprb*zwh2o/(_one_+0.608_jprb*zwh2o)
176  pud(jl,4,jk)=pud(jl,1,jk)*zfppw
177  pud(jl,5,jk)=pud(jl,1,jk)*(_one_-zfppw)
178  zud(jl,1) = zud(jl,1) + pud(jl,1,jk)
179  zud(jl,2) = zud(jl,2) + pud(jl,2,jk)
180  zsigo(jl) = zsign(jl)
181  zo175(jl) = zn175(jl)
182  zo190(jl) = zn190(jl)
183 
184  IF (novlp == 1) THEN
185  zclear(jl)=zclear(jl)&
186  &*(_one_-max(pcldsw(jl,jkl),zcloud(jl)))&
187  &/(_one_-min(zcloud(jl),_one_-repsec))
188  zc1j(jl,jkl)= _one_ - zclear(jl)
189  zcloud(jl) = pcldsw(jl,jkl)
190  ELSEIF (novlp == 2) THEN
191  zcloud(jl) = max(pcldsw(jl,jkl),zcloud(jl))
192  zc1j(jl,jkl) = zcloud(jl)
193  ELSEIF (novlp == 3) THEN
194  zclear(jl) = zclear(jl)*(_one_-pcldsw(jl,jkl))
195  zcloud(jl) = _one_ - zclear(jl)
196  zc1j(jl,jkl) = zcloud(jl)
197  ELSEIF (novlp == 4) THEN
198 !** Hogan & Illingworth (2001)
199  zalpha1=ra1ovlp(klev+1-jk)
200  zclear(jl)=zclear(jl)*( &
201  & zalpha1*(_one_-max(pcldsw(jl,jkl),zcloud(jl))) &
202  & /(_one_-min(zcloud(jl),_one_-repsec)) &
203  & +(_one_-zalpha1)*(_one_-pcldsw(jl,jkl)) )
204  zc1j(jl,jkl) = _one_ - zclear(jl)
205  zcloud(jl) = pcldsw(jl,jkl)
206  ENDIF
207  ENDDO
208 ENDDO
209 DO jl=kidia,kfdia
210  pclear(jl)=_one_-zc1j(jl,1)
211 ENDDO
212 DO jk=1,klev
213  DO jl=kidia,kfdia
214  IF (pclear(jl) < _one_) THEN
215  pcld(jl,jk)=pcldsw(jl,jk)/(_one_-pclear(jl))
216  ELSE
217  pcld(jl,jk)=_zero_
218  ENDIF
219  ENDDO
220 ENDDO
221 
222 
223 !* 1.4 COMPUTES CLEAR-SKY GREY ABSORPTION COEFFICIENTS
224 ! -----------------------------------------------
225 
226 
227 DO ja = 1,2
228  DO jl = kidia,kfdia
229  zud(jl,ja) = zud(jl,ja) * psec(jl)
230  ENDDO
231 ENDDO
232 
233 IF (nsw.LE.4) THEN
234  inuir=2
235 ELSE IF (nsw.EQ.6) THEN
236  inuir=4
237 END IF
238 
239 
240 DO jnu= inuir,nsw
241 
242  kkind=2
243  CALL swtt1 ( kidia,kfdia,klon, jnu, kkind, iind &
244  &, zud &
245  &, zr )
246 
247  DO ja = 1,2
248  DO jl = kidia,kfdia
249  paki(jl,ja,jnu) = -log( zr(jl,ja) ) / zud(jl,ja)
250  ENDDO
251  ENDDO
252 ENDDO
253 
254 
255 ! ------------------------------------------------------------------
256 
257 RETURN
258 END SUBROUTINE swu
Definition: yoesw.F90:1
real(kind=jprb) rth2o
Definition: yoesw.F90:26
integer, save kidia
Definition: dimphy.F90:6
real(kind=jprb) rpnu
Definition: yoesw.F90:21
integer, save klon
Definition: dimphy.F90:3
integer(kind=jpim) novlp
Definition: yoerad.F90:24
real(kind=jprb) rtdumg
Definition: yoesw.F90:25
integer, save klev
Definition: dimphy.F90:7
real(kind=jprb) rpdh1
Definition: yoesw.F90:18
real(kind=jprb) repsec
Definition: yoecld.F90:37
real(kind=jprb) rtumg
Definition: yoesw.F90:27
integer, save kfdia
Definition: dimphy.F90:5
Definition: yoerad.F90:1
real(kind=jprb) rtdh2o
Definition: yoesw.F90:24
real(kind=jprb), dimension(:), allocatable ra1ovlp
Definition: yoeovlp.F90:13
real(kind=jprb) repscq
Definition: yoerdu.F90:22
Definition: yoecld.F90:1
subroutine swtt1(KIDIA, KFDIA, KLON, KNU, KABS, KIND, PU, PTR)
Definition: swtt1.F90:2
real(kind=jprb) rpnh
Definition: yoesw.F90:20
subroutine swu(KIDIA, KFDIA, KLON, KLEV, PSCT, PCARDI, PCLDSW, PPMB, PPSOL, PRMU0, PTAVE, PWV, PAKI, PCLD, PCLEAR, PDSIG, PFACT, PRMU, PSEC, PUD)
Definition: swu.F90:7
real(kind=jprb) rpdu1
Definition: yoesw.F90:19
Definition: yoerdu.F90:1