LMDZ
olwu.F90
Go to the documentation of this file.
1 SUBROUTINE olwu ( KIDIA, KFDIA, KLON, KLEV &
2  & , paer, pcco2, pdp, paph, pqof, pt, pview, pwv &
3  & , pabcu )
4 !
5 !**** *LWU* - LONGWAVE EFFECTIVE ABSORBER AMOUNTS
6 !
7 ! PURPOSE.
8 ! --------
9 ! COMPUTES ABSORBER AMOUNTS INCLUDING PRESSURE AND
10 ! TEMPERATURE EFFECTS
11 !
12 !** INTERFACE.
13 ! ----------
14 !
15 ! EXPLICIT ARGUMENTS :
16 ! --------------------
17 ! ==== INPUTS ===
18 ! PAER : (KLON,6,KLEV) ; OPTICAL THICKNESS OF THE AEROSOLS
19 ! PCCO2 : ; CONCENTRATION IN CO2 (PA/PA)
20 ! PAPH : (KLON,KLEV+1) ; HALF LEVEL PRESSURE
21 ! PQOF : (KLON,KLEV) ; CONCENTRATION IN OZONE (PA/PA)
22 ! PT : (KLON,KLEV) ; TEMPERATURE
23 ! PWV : (KLON,KLEV) ; SPECIFIC HUMIDITY PA/PA
24 ! PVIEW : (KLON) ; COSECANT OF VIEWING ANGLE
25 ! ==== OUTPUTS ===
26 ! PABCU :(KLON,NUA,3*KLEV+1); EFFECTIVE ABSORBER AMOUNTS
27 !
28 ! IMPLICIT ARGUMENTS : NONE
29 ! --------------------
30 !
31 ! METHOD.
32 ! -------
33 !
34 ! 1. COMPUTES THE PRESSURE AND TEMPERATURE WEIGHTED AMOUNTS OF
35 ! ABSORBERS.
36 !
37 ! EXTERNALS.
38 ! ----------
39 !
40 ! NONE
41 !
42 ! REFERENCE.
43 ! ----------
44 !
45 ! SEE RADIATION'S PART OF THE MODEL'S DOCUMENTATION AND
46 ! ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE IFS
47 !
48 ! AUTHOR.
49 ! -------
50 ! JEAN-JACQUES MORCRETTE *ECMWF*
51 !
52 ! MODIFICATIONS.
53 ! --------------
54 ! ORIGINAL : 89-07-14
55 !-----------------------------------------------------------------------
56 
57 #include "tsmbkind.h"
58 
59 USE yomcst , ONLY : rg
60 USE yoesw , ONLY : raer
61 USE yoeolw , ONLY : nisp ,nua ,ng1 ,ng1p1 ,&
62  &at ,bt ,rt1 ,tref ,oct ,&
63  &rvgco2 ,rvgh2o ,rvgo3
64 USE yoerdi , ONLY : rch4 ,rn2o ,rcfc11 ,rcfc12
65 USE yoerdu , ONLY : r10e ,repsco ,repscq
66 USE yoedbug , ONLY : ldebug
67 
68 
69 IMPLICIT NONE
70 
71 ! DUMMY INTEGER SCALARS
72 integer_m :: kfdia
73 integer_m :: kidia
74 integer_m :: klev
75 integer_m :: klon
76 
77 ! DUMMY REAL SCALARS
78 real_b :: pcco2
79 
80 CHARACTER*3 CVAR
81 
82 
83 !-----------------------------------------------------------------------
84 !
85 !* 0.1 ARGUMENTS
86 ! ---------
87 !
88 real_b :: paer(klon,6,klev) , pdp(klon,klev) &
89  & , paph(klon,klev+1), pqof(klon,klev) &
90  & , pt(klon,klev), pview(klon), pwv(klon,klev)
91 !
92 real_b :: pabcu(klon,nua,3*klev+1)
93 !
94 !-----------------------------------------------------------------------
95 !
96 !* 0.2 LOCAL ARRAYS
97 ! ------------
98 real_b :: zably(klon,7, 3*klev), zduc(klon, 3*klev) &
99  & , zdpm(klon, 3*klev), zupm(klon, 3*klev)
100 real_b :: zphio(klon),zpsc2(klon),zpsc3(klon),zpsh1(klon) &
101  & , zpsh2(klon),zpsh3(klon),zpsh4(klon),zpsh5(klon) &
102  & , zpsh6(klon),zpsio(klon),ztcon(klon) &
103  & , zphm6(klon),zpsm6(klon),zphn6(klon),zpsn6(klon)
104 real_b :: zssig(klon,3*klev+1), ztavi(klon) &
105  & , zuaer(klon,6), zxoz(klon), zxwv(klon)
106 !
107 
108 ! LOCAL INTEGER SCALARS
109 integer_m :: iae1, iae2, iae3, ic, iccc, icp1, ig1, ij, ijpn,&
110  &ikip1, ikj, ikjp, ikjpn, ikjr, ikl, ipk, ja, jae, &
111  &jk, jki, jkk, jl, jae1, jae2, jae3, jc, jcp1, jj, jjpn, &
112  & jkj, jkjr, jkjp, jkip1, jkp1, jkjpn
113 
114 ! LOCAL REAL SCALARS
115 real_b :: zalup, zcac8, zcah1, zcah2, zcah3, zcah4,&
116  &zcah5, zcah6, zcbc8, zcbh1, zcbh2, zcbh3, &
117  &zcbh4, zcbh5, zcbh6, zdiff, zdpmg, zdpmp0, &
118  &zfppw, ztx, ztx2, zu6, zup, zupmco2, zupmg, &
119  &zupmh2o, zupmo3, zzably
120 
121 !
122 !-----------------------------------------------------------------------
123 !
124 !* 1. INITIALIZATION
125 ! --------------
126 !
127 !-----------------------------------------------------------------------
128 !
129 !
130 !* 2. PRESSURE OVER GAUSS SUB-LEVELS
131 ! ------------------------------
132 !
133 DO jl = kidia,kfdia
134  zssig(jl, 1 ) = paph(jl,klev+1)
135 END DO
136 !
137 DO jk = 1 , klev
138  jkj=(jk-1)*ng1p1+1
139  jkjr = jkj
140  jkjp = jkj + ng1p1
141  ikl=klev+1-jk
142  DO jl = kidia,kfdia
143  zssig(jl,jkjp)=paph(jl,ikl)
144  END DO
145  DO ig1=1,ng1
146  jkj=jkj+1
147  DO jl = kidia,kfdia
148  zssig(jl,jkj)= (zssig(jl,jkjr)+zssig(jl,jkjp))*0.5_jprb &
149  & + rt1(ig1) * (zssig(jl,jkjp) - zssig(jl,jkjr)) * 0.5_jprb
150  END DO
151  END DO
152 END DO
153 !
154 !-----------------------------------------------------------------------
155 !
156 !
157 !* 4. PRESSURE THICKNESS AND MEAN PRESSURE OF SUB-LAYERS
158 ! --------------------------------------------------
159 !
160 DO jki=1,3*klev
161  jkip1=jki+1
162  DO jl = kidia,kfdia
163  zupm(jl,jki)=(zssig(jl,jki)+zssig(jl,jkip1))*0.5_jprb
164  zdpm(jl,jki)=(zssig(jl,jki)-zssig(jl,jkip1))/(10._jprb*rg)
165  END DO
166 END DO
167 !
168 DO jk = 1 , klev
169  jkp1=jk+1
170  ikl = klev+1 - jk
171  DO jl = kidia,kfdia
172  zxwv(jl) = max(pwv(jl,ikl) , repscq )
173  zxoz(jl) = max(pqof(jl,ikl) / pdp(jl,ikl) , repsco )
174  END DO
175  jkj=(jk-1)*ng1p1+1
176  jkjpn=jkj+ng1
177  DO jkk=jkj,jkjpn
178  DO jl = kidia,kfdia
179  zdpmg = zdpm(jl,jkk)
180  zdpmp0 = zdpmg / 101325._jprb
181  zupmg = zupm(jl,jkk) * zdpmp0
182  zupmco2 = ( zupm(jl,jkk) + rvgco2 ) * zdpmp0
183  zupmh2o = ( zupm(jl,jkk) + rvgh2o ) * zdpmp0
184  zupmo3 = ( zupm(jl,jkk) + rvgo3 ) * zdpmp0
185  zduc(jl,jkk) = zdpmg
186  zably(jl,6,jkk) = zxoz(jl) * zdpmg
187  zably(jl,7,jkk) = zxoz(jl) * zupmo3
188  zu6 = zxwv(jl) * zupmg
189  zfppw = 1.6078_jprb * zxwv(jl) / (1._jprb+0.608_jprb*zxwv(jl))
190  zably(jl,1,jkk) = zxwv(jl) * zupmh2o
191  zably(jl,5,jkk) = zu6 * zfppw
192  zably(jl,4,jkk) = zu6 * (1._jprb-zfppw)
193  zably(jl,3,jkk) = pcco2 * zupmco2
194  zably(jl,2,jkk) = pcco2 * zdpmg
195  END DO
196  END DO
197 END DO
198 !
199 !-----------------------------------------------------------------------
200 !
201 !
202 !* 5. CUMULATIVE ABSORBER AMOUNTS FROM TOP OF ATMOSPHERE
203 ! --------------------------------------------------
204 !
205 DO ja = 1, nua
206  DO jl = kidia,kfdia
207  pabcu(jl,ja,3*klev+1) = 0.
208  END DO
209 END DO
210 !
211 
212 DO jk = 1 , klev
213  jj=(jk-1)*ng1p1+1
214  jjpn=jj+ng1
215  ikl=klev+1-jk
216 !
217 !
218 !* 5.1 CUMULATIVE AEROSOL AMOUNTS FROM TOP OF ATMOSPHERE
219 ! --------------------------------------------------
220 ! -- NB: 'PAER' AEROSOLS ARE ENTERED FROM TOP TO BOTTOM
221 !
222  jae1=3*klev+1-jj
223  jae2=3*klev+1-(jj+1)
224  jae3=3*klev+1-jjpn
225  DO jae=1,5
226  DO jl = kidia,kfdia
227  zuaer(jl,jae) = (raer(jae,1)*paer(jl, 1, jk ) &
228  & +raer(jae,2)*paer(jl, 2, jk)+raer(jae,3)*paer(jl, 3, jk) &
229  & +raer(jae,4)*paer(jl, 4, jk)+raer(jae,5)*paer(jl, 5, jk)) &
230  & /(zduc(jl,jae1)+zduc(jl,jae2)+zduc(jl,jae3))
231  END DO
232  END DO
233 !
234 !
235 !* 5.2 INTRODUCES TEMPERATURE EFFECTS ON ABSORBER AMOUNTS
236 ! --------------------------------------------------
237 ! -- NB: 'PT' TEMPERATURES ARE ENTERED FROM TOP TO BOTTOM
238 !
239  DO jl = kidia,kfdia
240 
241  ztavi(jl)=pt(jl,jk)
242  ztcon(jl)=exp(6.08_jprb*(296._jprb/ztavi(jl)-1._jprb))
243  ztx=ztavi(jl)-tref
244  ztx2=ztx*ztx
245  zzably = zably(jl,3,jae1)+zably(jl,3,jae2)+zably(jl,3,jae3)
246  zup=min( max( 0.5_jprb*r10e*log( zzably ) + 5._jprb, 0._jprb), 6.0_jprb)
247  zcah1=at(1,1)+zup*(at(1,2)+zup*(at(1,3)))
248  zcbh1=bt(1,1)+zup*(bt(1,2)+zup*(bt(1,3)))
249  zpsh1(jl)=exp( zcah1 * ztx + zcbh1 * ztx2 )
250  zcah2=at(2,1)+zup*(at(2,2)+zup*(at(2,3)))
251  zcbh2=bt(2,1)+zup*(bt(2,2)+zup*(bt(2,3)))
252  zpsh2(jl)=exp( zcah2 * ztx + zcbh2 * ztx2 )
253  zcah3=at(3,1)+zup*(at(3,2)+zup*(at(3,3)))
254  zcbh3=bt(3,1)+zup*(bt(3,2)+zup*(bt(3,3)))
255  zpsh3(jl)=exp( zcah3 * ztx + zcbh3 * ztx2 )
256  zcah4=at(4,1)+zup*(at(4,2)+zup*(at(4,3)))
257  zcbh4=bt(4,1)+zup*(bt(4,2)+zup*(bt(4,3)))
258  zpsh4(jl)=exp( zcah4 * ztx + zcbh4 * ztx2 )
259  zcah5=at(5,1)+zup*(at(5,2)+zup*(at(5,3)))
260  zcbh5=bt(5,1)+zup*(bt(5,2)+zup*(bt(5,3)))
261  zpsh5(jl)=exp( zcah5 * ztx + zcbh5 * ztx2 )
262  zcah6=at(6,1)+zup*(at(6,2)+zup*(at(6,3)))
263  zcbh6=bt(6,1)+zup*(bt(6,2)+zup*(bt(6,3)))
264  zpsh6(jl)=exp( zcah6 * ztx + zcbh6 * ztx2 )
265  zphm6(jl)=exp(-5.81e-4_jprb * ztx - 1.13e-6 * ztx2 )
266  zpsm6(jl)=exp(-5.57e-4_jprb * ztx - 3.30e-6 * ztx2 )
267  zphn6(jl)=exp(-3.46e-5_jprb * ztx + 2.05e-7 * ztx2 )
268  zpsn6(jl)=exp( 3.70e-3_jprb * ztx - 2.30e-6 * ztx2 )
269  END DO
270 
271 !
272  DO jl = kidia,kfdia
273 
274  ztavi(jl)=pt(jl,jk)
275  ztx=ztavi(jl)-tref
276  ztx2=ztx*ztx
277  zzably = zably(jl,5,jae1)+zably(jl,5,jae2)+zably(jl,5,jae3)
278  zalup = r10e * log( zzably )
279  zup = max( 0.0_jprb , 5.0_jprb + 0.5_jprb * zalup )
280  zpsc2(jl) = (ztavi(jl)/tref) ** zup
281  zcac8=at(8,1)+zup*(at(8,2)+zup*(at(8,3)))
282  zcbc8=bt(8,1)+zup*(bt(8,2)+zup*(bt(8,3)))
283  zpsc3(jl)=exp( zcac8 * ztx + zcbc8 * ztx2 )
284  zphio(jl) = exp( oct(1) * ztx + oct(2) * ztx2)
285  zpsio(jl) = exp( 2.* (oct(3)*ztx+oct(4)*ztx2))
286  END DO
287 
288 
289  iccc=2
290 
291  DO jkk=jj,jjpn
292  jc=3*klev+1-jkk
293  jcp1=jc+1
294 
295  iccc=iccc+1
296 
297  DO jl = kidia,kfdia
298  zdiff = pview(jl)
299  pabcu(jl,10,jc)=pabcu(jl,10,jcp1)+ zably(jl,4,jc) *zdiff
300  pabcu(jl,11,jc)=pabcu(jl,11,jcp1)+ zably(jl,5,jc)*ztcon(jl)*zdiff
301 !
302  pabcu(jl,12,jc)=pabcu(jl,12,jcp1)+ zably(jl,6,jc)*zphio(jl)*zdiff
303  pabcu(jl,13,jc)=pabcu(jl,13,jcp1)+ zably(jl,7,jc)*zpsio(jl)*zdiff
304 !
305  pabcu(jl, 7,jc)=pabcu(jl, 7,jcp1)+ zably(jl,3,jc)*zpsc2(jl)*zdiff
306  pabcu(jl, 8,jc)=pabcu(jl, 8,jcp1)+ zably(jl,3,jc)*zpsc3(jl)*zdiff
307  pabcu(jl, 9,jc)=pabcu(jl, 9,jcp1)+ zably(jl,3,jc)*zpsc3(jl)*zdiff
308 !
309  pabcu(jl, 1,jc)=pabcu(jl, 1,jcp1)+ zably(jl,1,jc)*zpsh1(jl)*zdiff
310  pabcu(jl, 2,jc)=pabcu(jl, 2,jcp1)+ zably(jl,1,jc)*zpsh2(jl)*zdiff
311  pabcu(jl, 3,jc)=pabcu(jl, 3,jcp1)+ zably(jl,1,jc)*zpsh5(jl)*zdiff
312  pabcu(jl, 4,jc)=pabcu(jl, 4,jcp1)+ zably(jl,1,jc)*zpsh3(jl)*zdiff
313  pabcu(jl, 5,jc)=pabcu(jl, 5,jcp1)+ zably(jl,1,jc)*zpsh4(jl)*zdiff
314  pabcu(jl, 6,jc)=pabcu(jl, 6,jcp1)+ zably(jl,1,jc)*zpsh6(jl)*zdiff
315 !
316  pabcu(jl,14,jc)=pabcu(jl,14,jcp1)+ zuaer(jl,1) *zduc(jl,jc)*zdiff
317  pabcu(jl,15,jc)=pabcu(jl,15,jcp1)+ zuaer(jl,2) *zduc(jl,jc)*zdiff
318  pabcu(jl,16,jc)=pabcu(jl,16,jcp1)+ zuaer(jl,3) *zduc(jl,jc)*zdiff
319  pabcu(jl,17,jc)=pabcu(jl,17,jcp1)+ zuaer(jl,4) *zduc(jl,jc)*zdiff
320  pabcu(jl,18,jc)=pabcu(jl,18,jcp1)+ zuaer(jl,5) *zduc(jl,jc)*zdiff
321 !
322  pabcu(jl,19,jc)=pabcu(jl,19,jcp1) &
323  & +zably(jl,2,jc)*rch4/pcco2*zphm6(jl)*zdiff
324  pabcu(jl,20,jc)=pabcu(jl,20,jcp1) &
325  & +zably(jl,3,jc)*rch4/pcco2*zpsm6(jl)*zdiff
326  pabcu(jl,21,jc)=pabcu(jl,21,jcp1) &
327  & +zably(jl,2,jc)*rn2o/pcco2*zphn6(jl)*zdiff
328  pabcu(jl,22,jc)=pabcu(jl,22,jcp1) &
329  & +zably(jl,3,jc)*rn2o/pcco2*zpsn6(jl)*zdiff
330 !
331  pabcu(jl,23,jc)=pabcu(jl,23,jcp1) &
332  & +zably(jl,2,jc)*rcfc11/pcco2 *zdiff
333  pabcu(jl,24,jc)=pabcu(jl,24,jcp1) &
334  & +zably(jl,2,jc)*rcfc12/pcco2 *zdiff
335 
336  END DO
337  END DO
338 !
339 END DO
340 
341 !
342 RETURN
343 END SUBROUTINE olwu
INTERFACE SUBROUTINE RRTM_ECRT_140GP pcco2
Definition: yoesw.F90:1
subroutine olwu(KIDIA, KFDIA, KLON, KLEV, PAER, PCCO2, PDP, PAPH, PQOF, PT, PVIEW, PWV, PABCU)
Definition: olwu.F90:4
real(kind=jprb), dimension(6, 6) raer
Definition: yoesw.F90:118
real(kind=jprb) rcfc12
Definition: yoerdi.F90:20
integer, save kidia
Definition: dimphy.F90:6
integer, save klon
Definition: dimphy.F90:3
real(kind=jprb) rcfc11
Definition: yoerdi.F90:19
integer, save klev
Definition: dimphy.F90:7
real(kind=jprb) rg
Definition: yomcst.F90:29
Definition: yoerdi.F90:1
!$Id klon klev DO klon!IM klev DO klon klon nbp_lat DO nbp_lon ij
integer, save kfdia
Definition: dimphy.F90:5
logical ldebug
Definition: yoedbug.F90:14
real(kind=jprb) rch4
Definition: yoerdi.F90:16
real(kind=jprb) rn2o
Definition: yoerdi.F90:17
real(kind=jprb) r10e
Definition: yoerdu.F90:18
real(kind=jprb) repscq
Definition: yoerdu.F90:22
INTERFACE SUBROUTINE RRTM_ECRT_140GP paph
INTERFACE SUBROUTINE RRTM_ECRT_140GP pt
Definition: yoeolw.F90:1
INTERFACE SUBROUTINE RRTM_ECRT_140GP && paer
Definition: yomcst.F90:1
Definition: yoerdu.F90:1
real(kind=jprb) repsco
Definition: yoerdu.F90:21