LMDZ
lwb.F90
Go to the documentation of this file.
1 SUBROUTINE lwb &
2  &( kidia, kfdia, klon , klev , kmode &
3  &, pdt0 , ptave, ptl &
4  &, pb , pbint, pbsur , pbtop , pdbsl &
5  &, pga , pgb , pgasur, pgbsur, pgatop, pgbtop &
6  &)
7 
8 !**** *LWB* - COMPUTES BLACK-BODY FUNCTIONS FOR LONGWAVE CALCULATIONS
9 
10 ! PURPOSE.
11 ! --------
12 ! COMPUTES PLANCK FUNCTIONS
13 
14 !** INTERFACE.
15 ! ----------
16 
17 ! EXPLICIT ARGUMENTS :
18 ! --------------------
19 ! ==== INPUTS ===
20 ! PDT0 : (KLON) ; SURFACE TEMPERATURE DISCONTINUITY
21 ! PTAVE : (KLON,KLEV) ; TEMPERATURE
22 ! PTL : (KLON,KLEV+1) ; HALF LEVEL TEMPERATURE
23 ! ==== OUTPUTS ===
24 ! PB : (KLON,NSIL,KLEV+1); SPECTRAL HALF LEVEL PLANCK FUNCTION
25 ! PBINT : (KLON,KLEV+1) ; HALF LEVEL PLANCK FUNCTION
26 ! PBSUR : (KLON,NSIL) ; SURFACE SPECTRAL PLANCK FUNCTION
27 ! PBTOP : (KLON,NSIL) ; TOP SPECTRAL PLANCK FUNCTION
28 ! PDBSL : (KLON,NSIL,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 ! MODIFIED : 99-06-14 D.SALMOND Optimisation
62 
63 !-----------------------------------------------------------------------
64 
65 #include "tsmbkind.h"
66 
67 USE yoelw , ONLY : mxixt ,nsil ,nipd ,pdga ,&
68  &pdgb ,tintp ,tstand ,tstp ,xp
69 
70 
71 IMPLICIT NONE
72 
73 
74 ! DUMMY INTEGER SCALARS
75 integer_m :: kfdia
76 integer_m :: kidia
77 integer_m :: klev
78 integer_m :: klon
79 integer_m :: kmode
80 
81 
82 
83 !-----------------------------------------------------------------------
84 
85 !* 0.1 ARGUMENTS
86 ! ---------
87 
88 real_b :: pdt0(klon),ptave(klon,klev),ptl(klon,klev+1)
89 
90 real_b :: pb(klon,nsil,klev+1) , pbint(klon,klev+1)&
91  &, pbsur(klon,nsil) , pbtop(klon,nsil) &
92  &, pdbsl(klon,nsil,klev*2)&
93  &, pga(klon,nipd,2,klev) , pgb(klon,nipd,2,klev)&
94  &, pgasur(klon,nipd,2) , pgbsur(klon,nipd,2)&
95  &, pgatop(klon,nipd,2) , pgbtop(klon,nipd,2)
96 
97 !-------------------------------------------------------------------------
98 
99 !* 0.2 LOCAL ARRAYS
100 ! ------------
101 integer_m :: indb(klon) , inds(klon)
102 real_b :: zblay(klon,klev), zblev(klon,klev+1)&
103  &, zres(klon) , zres2(klon)&
104  &, zti(klon) , zti2(klon)
105 
106 ! LOCAL INTEGER SCALARS
107 integer_m :: ilev2, indsu, indt, indto, indtp, inue, inus,&
108  &ixtox, ixtx, jf, jg, jk, jk1, jk2, jl, jnu
109 
110 ! LOCAL REAL SCALARS
111 real_b :: zdst1, zdsto1, zdstox, zdstx
112 
113 
114 ! ------------------------------------------------------------------
115 
116 
117 !* 1.0 PLANCK FUNCTIONS AND GRADIENTS
118 ! ------------------------------
119 
120 ilev2=2*klev
121 inus=1
122 inue=nsil
123 IF (kmode == 2) THEN
124  inus=3
125  inue=4
126 ENDIF
127 
128 DO jk = 1 , klev+1
129  DO jl = kidia,kfdia
130  pbint(jl,jk) = _zero_
131  ENDDO
132 ENDDO
133 
134 DO jnu=1,nsil
135  DO jl=kidia,kfdia
136  pbsur(jl,jnu)=_zero_
137  pbtop(jl,jnu)=_zero_
138  ENDDO
139  DO jk=1,klev
140  DO jl=kidia,kfdia
141  pb(jl,jnu,jk)=_zero_
142  ENDDO
143  ENDDO
144  DO jk=1,ilev2
145  DO jl=kidia,kfdia
146  pdbsl(jl,jnu,jk)=_zero_
147  ENDDO
148  ENDDO
149 ENDDO
150 
151 DO jnu=inus,inue
152 
153 
154 !* 1.1 LEVELS FROM SURFACE TO KLEV
155 ! ----------------------------
156 
157  DO jk = 1 , klev
158  DO jl = kidia,kfdia
159  zti(jl)=(ptl(jl,jk)-tstand)/tstand
160  zres(jl) = xp(1,jnu)+zti(jl)*(xp(2,jnu)+zti(jl)*(xp(3,jnu)&
161  &+zti(jl)*(xp(4,jnu)+zti(jl)*(xp(5,jnu)+zti(jl)*(xp(6,jnu)&
162  &)))))
163  pbint(jl,jk)=pbint(jl,jk)+zres(jl)
164  pb(jl,jnu,jk)= zres(jl)
165  zblev(jl,jk) = zres(jl)
166 
167  zti2(jl)=(ptave(jl,jk)-tstand)/tstand
168  zres2(jl)=xp(1,jnu)+zti2(jl)*(xp(2,jnu)+zti2(jl)*(xp(3,jnu)&
169  &+zti2(jl)*(xp(4,jnu)+zti2(jl)*(xp(5,jnu)+zti2(jl)*(xp(6,&
170  &jnu)&
171  &)))))
172  zblay(jl,jk) = zres2(jl)
173  ENDDO
174  ENDDO
175 
176 
177 !* 1.2 TOP OF THE ATMOSPHERE AND SURFACE
178 ! ---------------------------------
179 
180  DO jl = kidia,kfdia
181  zti(jl)=(ptl(jl,klev+1)-tstand)/tstand
182  zti2(jl) = (ptl(jl,1) + pdt0(jl) - tstand) / tstand
183  zres(jl) = xp(1,jnu)+zti(jl)*(xp(2,jnu)+zti(jl)*(xp(3,jnu)&
184  &+zti(jl)*(xp(4,jnu)+zti(jl)*(xp(5,jnu)+zti(jl)*(xp(6,jnu)&
185  &)))))
186  zres2(jl) = xp(1,jnu)+zti2(jl)*(xp(2,jnu)+zti2(jl)*(xp(3,jnu)&
187  &+zti2(jl)*(xp(4,jnu)+zti2(jl)*(xp(5,jnu)+zti2(jl)*(xp(6,jnu)&
188  &)))))
189  pbint(jl,klev+1) = pbint(jl,klev+1)+zres(jl)
190  pb(jl,jnu,klev+1)= zres(jl)
191  zblev(jl,klev+1) = zres(jl)
192  pbtop(jl,jnu) = zres(jl)
193  pbsur(jl,jnu) = zres2(jl)
194  ENDDO
195 
196 
197 !* 1.3 GRADIENTS IN SUB-LAYERS
198 ! -----------------------
199 
200  DO jk = 1 , klev
201  jk2 = 2 * jk
202  jk1 = jk2 - 1
203  DO jl = kidia,kfdia
204  pdbsl(jl,jnu,jk1) = zblay(jl,jk ) - zblev(jl,jk)
205  pdbsl(jl,jnu,jk2) = zblev(jl,jk+1) - zblay(jl,jk)
206  ENDDO
207  ENDDO
208 
209 ENDDO
210 
211 !* 2.0 CHOOSE THE RELEVANT SETS OF PADE APPROXIMANTS
212 ! ---------------------------------------------
213 
214 DO jl=kidia,kfdia
215  zdsto1 = (ptl(jl,klev+1)-tintp(1)) / tstp
216  ixtox = max( 1, min( int(mxixt), int( zdsto1 + _one_ ) ) )
217  zdstox = (ptl(jl,klev+1)-tintp(ixtox))/tstp
218  IF (zdstox < _half_) THEN
219  indto=ixtox
220  ELSE
221  indto=ixtox+1
222  ENDIF
223  indb(jl)=indto
224  zdst1 = (ptl(jl,1)-tintp(1)) / tstp
225  ixtx = max( 1, min( int(mxixt), int( zdst1 + _one_ ) ) )
226  zdstx = (ptl(jl,1)-tintp(ixtx))/tstp
227  IF (zdstx < _half_) THEN
228  indt=ixtx
229  ELSE
230  indt=ixtx+1
231  ENDIF
232  inds(jl)=indt
233 ENDDO
234 
235 DO jf=1,2
236  DO jg=1,nipd
237  DO jl=kidia,kfdia
238  indsu=inds(jl)
239  pgasur(jl,jg,jf)=pdga(indsu,2*jg-1,jf)
240  pgbsur(jl,jg,jf)=pdgb(indsu,2*jg-1,jf)
241  indtp=indb(jl)
242  pgatop(jl,jg,jf)=pdga(indtp,2*jg-1,jf)
243  pgbtop(jl,jg,jf)=pdgb(indtp,2*jg-1,jf)
244  ENDDO
245  ENDDO
246 ENDDO
247 
248 
249 DO jk=1,klev
250  DO jl=kidia,kfdia
251  zdst1 = (ptave(jl,jk)-tintp(1)) / tstp
252  ixtx = max( 1, min( int(mxixt), int( zdst1 + _one_ ) ) )
253  zdstx = (ptave(jl,jk)-tintp(ixtx))/tstp
254  IF (zdstx < _half_) THEN
255  indt=ixtx
256  ELSE
257  indt=ixtx+1
258  ENDIF
259  indb(jl)=indt
260  ENDDO
261 
262  DO jf=1,2
263  DO jl=kidia,kfdia
264  indt=indb(jl)
265  DO jg=1,nipd
266  pga(jl,jg,jf,jk)=pdga(indt,2*jg,jf)
267  pgb(jl,jg,jf,jk)=pdgb(indt,2*jg,jf)
268  ENDDO
269  ENDDO
270  ENDDO
271 
272 
273 ENDDO
274 
275 ! ------------------------------------------------------------------
276 
277 RETURN
278 END SUBROUTINE lwb
real(kind=jprb) tstand
Definition: yoelw.F90:36
real(kind=jprb), dimension(11, 16, 3) pdga
Definition: yoelw.F90:24
integer(kind=jpim) nipd
Definition: yoelw.F90:15
Definition: yoelw.F90:1
integer(kind=jpim) nsil
Definition: yoelw.F90:14
integer, save kidia
Definition: dimphy.F90:6
integer, save klon
Definition: dimphy.F90:3
integer, save klev
Definition: dimphy.F90:7
real(kind=jprb), dimension(6, 6) xp
Definition: yoelw.F90:39
integer, save kfdia
Definition: dimphy.F90:5
subroutine lwb(KIDIA, KFDIA, KLON, KLEV, KMODE, PDT0, PTAVE, PTL, PB, PBINT, PBSUR, PBTOP, PDBSL, PGA, PGB, PGASUR, PGBSUR, PGATOP, PGBTOP)
Definition: lwb.F90:7
real(kind=jprb), dimension(11, 16, 3) pdgb
Definition: yoelw.F90:25
real(kind=jprb) tstp
Definition: yoelw.F90:37
integer(kind=jpim) mxixt
Definition: yoelw.F90:13
real(kind=jprb), dimension(11) tintp
Definition: yoelw.F90:34