LMDZ
olwb.F90
Go to the documentation of this file.
1 SUBROUTINE olwb &
2  & ( kidia, kfdia, klon , klev &
3  & , pdt0 , pt , pth &
4  & , pb , pbint, pbsuin, pbsur , pbtop , pdbsl &
5  & , pga , pgb , pgasur, pgbsur, pgatop, pgbtop )
6 !
7 !**** *LWB* - COMPUTES BLACK-BODY FUNCTIONS FOR LONGWAVE CALCULATIONS
8 !
9 ! PURPOSE.
10 ! --------
11 ! COMPUTES PLANCK FUNCTIONS
12 !
13 !** INTERFACE.
14 ! ----------
15 !
16 ! EXPLICIT ARGUMENTS :
17 ! --------------------
18 ! ==== INPUTS ===
19 ! PDT0 : (KLON) ; SURFACE TEMPERATURE DISCONTINUITY
20 ! PT : (KLON,KLEV) ; TEMPERATURE
21 ! PTH : (KLON,KLEV+1) ; HALF LEVEL TEMPERATURE
22 ! ==== OUTPUTS ===
23 ! PB : (KLON,NISP,KLEV+1) ; SPECTRAL HALF LEVEL PLANCK FUNCTION
24 ! PBINT : (KLON,KLEV+1) ; HALF LEVEL PLANCK FUNCTION
25 ! PBSUIN : (KLON) ; SURFACE PLANCK FUNCTION
26 ! PBSUR : (KLON,NISP) ; SURFACE SPECTRAL PLANCK FUNCTION
27 ! PBTOP : (KLON,NISP) ; TOP SPECTRAL PLANCK FUNCTION
28 ! PDBSL : (KLON,NISP,KLEV*2); SUB-LAYER PLANCK FUNCTION GRADIENT
29 ! PGA : (KLON,8,2,KLEV); dB/dT-weighted LAYER PADE APPROXIMANTS
30 ! PGB : (KLON,8,2,KLEV); dB/dT-weighted LAYER PADE APPROXIMANTS
31 ! PGASUR, PGBSUR (KLON,8,2) ; SURFACE PADE APPROXIMANTS
32 ! PGATOP, PGBTOP (KLON,8,2) ; T.O.A. PADE APPROXIMANTS
33 !
34 ! IMPLICIT ARGUMENTS : NONE
35 ! --------------------
36 !
37 ! METHOD.
38 ! -------
39 !
40 ! 1. COMPUTES THE PLANCK FUNCTION ON ALL LEVELS AND HALF LEVELS
41 ! FROM A POLYNOMIAL DEVELOPMENT OF PLANCK FUNCTION
42 !
43 ! EXTERNALS.
44 ! ----------
45 !
46 ! NONE
47 !
48 ! REFERENCE.
49 ! ----------
50 !
51 ! SEE RADIATION'S PART OF THE MODEL'S DOCUMENTATION AND
52 ! ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE IFS "
53 !
54 ! AUTHOR.
55 ! -------
56 ! JEAN-JACQUES MORCRETTE *ECMWF*
57 !
58 ! MODIFICATIONS.
59 ! --------------
60 ! ORIGINAL : 89-07-14
61 !
62 !-----------------------------------------------------------------------
63 
64 #include "tsmbkind.h"
65 
66 USE yoeolw , ONLY : mxixt ,nisp ,nipd , ga ,&
67  & gb ,tintp ,tstand ,tstp ,xp
68 
69 IMPLICIT NONE
70 
71 
72 ! DUMMY INTEGER SCALARS
73 integer_m :: kfdia
74 integer_m :: kidia
75 integer_m :: klev
76 integer_m :: klon
77 
78 !-----------------------------------------------------------------------
79 !
80 !* 0.1 ARGUMENTS
81 ! ---------
82 !
83 real_b :: pdt0(klon), pt(klon,klev), pth(klon,klev+1)
84 !
85 real_b :: pb(klon,nisp,klev+1), pbint(klon,klev+1) &
86  & , pbsuin(klon) , pbsur(klon,nisp) &
87  & , pbtop(klon,nisp) , pdbsl(klon,nisp,klev*2) &
88  & , pga(klon,8,2,klev) , pgb(klon,8,2,klev) &
89  & , pgasur(klon,8,2) , pgbsur(klon,8,2) &
90  & , pgatop(klon,8,2) , pgbtop(klon,8,2)
91 !
92 !-------------------------------------------------------------------------
93 !
94 !* 0.2 LOCAL ARRAYS
95 ! ------------
96 integer_m :: indb(klon),inds(klon)
97 
98 real_b :: zblay(klon,klev),zblev(klon,klev+1) &
99  & , zres(klon),zres2(klon),zti(klon),zti2(klon)
100 
101 real_b :: zdst1, zdsto1, zdstx, zdstox
102 
103 integer_m :: ilev2, indsu, indt, indtp, indto, inus, inue, ixtox, ixtx &
104  & , jf, jg, jnu, jk, jk1, jk2, jl, ikl
105 !
106 ! ------------------------------------------------------------------
107 !
108 !
109 !* 1.0 PLANCK FUNCTIONS AND GRADIENTS
110 ! ------------------------------
111 !
112 ilev2=2*klev
113 inus=1
114 inue=nisp
115 
116 DO jk = 1 , klev+1
117  DO jl = kidia,kfdia
118  pbint(jl,jk) = 0.
119  END DO
120 END DO
121 DO jnu=1,nisp
122  DO jl=kidia,kfdia
123  pbsur(jl,jnu)=0.
124  pbtop(jl,jnu)=0.
125  END DO
126  DO jk=1,klev
127  DO jl=kidia,kfdia
128  pb(jl,jnu,jk)=0.
129  END DO
130  END DO
131  DO jk=1,ilev2
132  DO jl=kidia,kfdia
133  pdbsl(jl,jnu,jk)=0.
134  END DO
135  END DO
136 END DO
137 DO jl = kidia,kfdia
138  pbsuin(jl) = 0.
139 END DO
140 !
141 DO jnu=inus,inue
142 !
143 !
144 !* 1.1 LEVELS FROM SURFACE TO KLEV
145 ! ----------------------------
146 ! TEMPERATURE ENTERED FROM TOP TO BOTTOM
147 !
148  DO jk = 1 , klev
149  ikl=klev+1-jk
150  DO jl = kidia,kfdia
151  zti(jl)=(pth(jl,ikl+1)-tstand)/tstand
152  zres(jl) = xp(1,jnu)+zti(jl)*(xp(2,jnu)+zti(jl)*(xp(3,jnu) &
153  & +zti(jl)*(xp(4,jnu)+zti(jl)*(xp(5,jnu)+zti(jl)*(xp(6,jnu) &
154  & )))))
155  pbint(jl,jk)=pbint(jl,jk)+zres(jl)
156  pb(jl,jnu,jk)= zres(jl)
157  zblev(jl,jk) = zres(jl)
158 
159  zti2(jl)=(pt(jl,ikl)-tstand)/tstand
160  zres2(jl)=xp(1,jnu)+zti2(jl)*(xp(2,jnu)+zti2(jl)*(xp(3,jnu) &
161  & +zti2(jl)*(xp(4,jnu)+zti2(jl)*(xp(5,jnu)+zti2(jl)*(xp(6,jnu) &
162  & )))))
163  zblay(jl,jk) = zres2(jl)
164  END DO
165  END DO
166 !
167 !
168 !* 1.2 TOP OF THE ATMOSPHERE AND SURFACE
169 ! ---------------------------------
170 ! TEMPERATURE ENTERED FROM TOP TO BOTTOM
171 !
172  DO jl = kidia,kfdia
173  zti(jl)=(pth(jl,1)-tstand)/tstand
174  zti2(jl) = (pth(jl,klev+1) + pdt0(jl) - tstand) / tstand
175  zres(jl) = xp(1,jnu)+zti(jl)*(xp(2,jnu)+zti(jl)*(xp(3,jnu) &
176  & +zti(jl)*(xp(4,jnu)+zti(jl)*(xp(5,jnu)+zti(jl)*(xp(6,jnu) &
177  & )))))
178  zres2(jl) = xp(1,jnu)+zti2(jl)*(xp(2,jnu)+zti2(jl)*(xp(3,jnu) &
179  & +zti2(jl)*(xp(4,jnu)+zti2(jl)*(xp(5,jnu)+zti2(jl)*(xp(6,jnu) &
180  & )))))
181  pbint(jl,klev+1) = pbint(jl,klev+1)+zres(jl)
182  pb(jl,jnu,klev+1)= zres(jl)
183  zblev(jl,klev+1) = zres(jl)
184  pbtop(jl,jnu) = zres(jl)
185  pbsur(jl,jnu) = zres2(jl)
186  pbsuin(jl) = pbsuin(jl) + zres2(jl)
187  END DO
188 !
189 !
190 !* 1.3 GRADIENTS IN SUB-LAYERS
191 ! -----------------------
192 !
193  DO jk = 1 , klev
194  jk2 = 2 * jk
195  jk1 = jk2 - 1
196  DO jl = kidia,kfdia
197  pdbsl(jl,jnu,jk1) = zblay(jl,jk ) - zblev(jl,jk)
198  pdbsl(jl,jnu,jk2) = zblev(jl,jk+1) - zblay(jl,jk)
199  END DO
200  END DO
201 !
202 END DO
203 !
204 !* 2.0 CHOOSE THE RELEVANT SETS OF PADE APPROXIMANTS
205 ! ---------------------------------------------
206 !
207 DO jl=kidia,kfdia
208  zdsto1 = (pth(jl,1)-tintp(1)) / tstp
209  ixtox = max( 1, min( int(mxixt), int( zdsto1 + 1. ) ) )
210  zdstox = (pth(jl,1)-tintp(ixtox))/tstp
211  IF (zdstox.LT.0.5) THEN
212  indto=ixtox
213  ELSE
214  indto=ixtox+1
215  END IF
216  indb(jl)=indto
217 
218  zdst1 = (pth(jl,klev+1)-tintp(1)) / tstp
219  ixtx = max( 1, min( int(mxixt), int( zdst1 + 1. ) ) )
220  zdstx = (pth(jl,klev+1)-tintp(ixtx))/tstp
221  IF (zdstx.LT.0.5) THEN
222  indt=ixtx
223  ELSE
224  indt=ixtx+1
225  END IF
226  inds(jl)=indt
227 END DO
228 !
229 DO jf=1,2
230  DO jg=1, 8
231  DO jl=kidia,kfdia
232  indsu=inds(jl)
233  pgasur(jl,jg,jf)=ga(indsu,2*jg-1,jf)
234  pgbsur(jl,jg,jf)=gb(indsu,2*jg-1,jf)
235  indtp=indb(jl)
236  pgatop(jl,jg,jf)=ga(indtp,2*jg-1,jf)
237  pgbtop(jl,jg,jf)=gb(indtp,2*jg-1,jf)
238  END DO
239  END DO
240 END DO
241 !
242 DO jk=1,klev
243  ikl=klev+1-jk
244  DO jl=kidia,kfdia
245  zdst1 = (pt(jl,ikl)-tintp(1)) / tstp
246  ixtx = max( 1, min( int(mxixt), int( zdst1 + 1. ) ) )
247  zdstx = (pt(jl,ikl)-tintp(ixtx))/tstp
248  IF (zdstx.LT.0.5) THEN
249  indt=ixtx
250  ELSE
251  indt=ixtx+1
252  END IF
253  indb(jl)=indt
254  END DO
255 !
256  DO jf=1,2
257  DO jg=1, 8
258  DO jl=kidia,kfdia
259  indt=indb(jl)
260  pga(jl,jg,jf,jk)=ga(indt,2*jg,jf)
261  pgb(jl,jg,jf,jk)=gb(indt,2*jg,jf)
262  END DO
263  END DO
264  END DO
265 END DO
266 !
267 ! ------------------------------------------------------------------
268 !
269 RETURN
270 END SUBROUTINE olwb
INTERFACE SUBROUTINE RRTM_ECRT_140GP pth
integer, save kidia
Definition: dimphy.F90:6
integer, save klon
Definition: dimphy.F90:3
integer, save klev
Definition: dimphy.F90:7
integer, save kfdia
Definition: dimphy.F90:5
subroutine olwb(KIDIA, KFDIA, KLON, KLEV, PDT0, PT, PTH, PB, PBINT, PBSUIN, PBSUR, PBTOP, PDBSL, PGA, PGB, PGASUR, PGBSUR, PGATOP, PGBTOP)
Definition: olwb.F90:6
INTERFACE SUBROUTINE RRTM_ECRT_140GP pt
Definition: yoeolw.F90:1