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 ! M.Hamrud 01-Oct-2003 CY28 Cleaning
63 
64 !-----------------------------------------------------------------------
65 
66 USE parkind1 ,ONLY : jpim ,jprb
67 USE yomhook ,ONLY : lhook, dr_hook
68 
69 USE yoelw , ONLY : mxixt ,nsil ,nipd ,pdga ,&
70  & pdgb ,tintp ,tstand ,tstp ,xp
71 
72 IMPLICIT NONE
73 
74 INTEGER(KIND=JPIM),INTENT(IN) :: KLON
75 INTEGER(KIND=JPIM),INTENT(IN) :: KLEV
76 INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA
77 INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA
78 INTEGER(KIND=JPIM),INTENT(IN) :: KMODE
79 REAL(KIND=JPRB) ,INTENT(IN) :: PDT0(klon)
80 REAL(KIND=JPRB) ,INTENT(IN) :: PTAVE(klon,klev)
81 REAL(KIND=JPRB) ,INTENT(IN) :: PTL(klon,klev+1)
82 REAL(KIND=JPRB) ,INTENT(OUT) :: PB(klon,nsil,klev+1)
83 REAL(KIND=JPRB) ,INTENT(OUT) :: PBINT(klon,klev+1)
84 REAL(KIND=JPRB) ,INTENT(OUT) :: PBSUR(klon,nsil)
85 REAL(KIND=JPRB) ,INTENT(OUT) :: PBTOP(klon,nsil)
86 REAL(KIND=JPRB) ,INTENT(OUT) :: PDBSL(klon,nsil,klev*2)
87 REAL(KIND=JPRB) ,INTENT(OUT) :: PGA(klon,nipd,2,klev)
88 REAL(KIND=JPRB) ,INTENT(OUT) :: PGB(klon,nipd,2,klev)
89 REAL(KIND=JPRB) ,INTENT(OUT) :: PGASUR(klon,nipd,2)
90 REAL(KIND=JPRB) ,INTENT(OUT) :: PGBSUR(klon,nipd,2)
91 REAL(KIND=JPRB) ,INTENT(OUT) :: PGATOP(klon,nipd,2)
92 REAL(KIND=JPRB) ,INTENT(OUT) :: PGBTOP(klon,nipd,2)
93 !-----------------------------------------------------------------------
94 
95 !* 0.1 ARGUMENTS
96 ! ---------
97 
98 !-------------------------------------------------------------------------
99 
100 ! ------------
101 INTEGER(KIND=JPIM) :: INDB(klon) , INDS(klon)
102 REAL(KIND=JPRB) :: ZBLAY(klon,klev), ZBLEV(klon,klev+1)&
103  & , ZRES(KLON) , ZRES2(KLON)&
104  & , ZTI(KLON) , ZTI2(KLON)
105 
106 INTEGER(KIND=JPIM) :: ILEV2, INDSU, INDT, INDTO, INDTP, INUE, INUS,&
107  & IXTOX, IXTX, JF, JG, JK, JK1, JK2, JL, JNU
108 
109 REAL(KIND=JPRB) :: ZDST1, ZDSTO1, ZDSTOX, ZDSTX
110 REAL(KIND=JPRB) :: ZHOOK_HANDLE
111 
112 ! ------------------------------------------------------------------
113 
114 !* 1.0 PLANCK FUNCTIONS AND GRADIENTS
115 ! ------------------------------
116 
117 print *,'dans LWB'
118 IF (lhook) CALL dr_hook('LWB',0,zhook_handle)
119 ilev2=2*klev
120 inus=1
121 inue=nsil
122 IF (kmode == 2) THEN
123  inus=3
124  inue=4
125 ENDIF
126 
127 DO jk = 1 , klev+1
128  DO jl = kidia,kfdia
129  pbint(jl,jk) = 0.0_jprb
130  ENDDO
131 ENDDO
132 
133 DO jnu=1,nsil
134  DO jl=kidia,kfdia
135  pbsur(jl,jnu)=0.0_jprb
136  pbtop(jl,jnu)=0.0_jprb
137  ENDDO
138  DO jk=1,klev
139  DO jl=kidia,kfdia
140  pb(jl,jnu,jk)=0.0_jprb
141  ENDDO
142  ENDDO
143  DO jk=1,ilev2
144  DO jl=kidia,kfdia
145  pdbsl(jl,jnu,jk)=0.0_jprb
146  ENDDO
147  ENDDO
148 ENDDO
149 
150 DO jnu=inus,inue
151 
152 !* 1.1 LEVELS FROM SURFACE TO KLEV
153 ! ----------------------------
154 
155  DO jk = 1 , klev
156  DO jl = kidia,kfdia
157  zti(jl)=(ptl(jl,jk)-tstand)/tstand
158  zres(jl) = xp(1,jnu)+zti(jl)*(xp(2,jnu)+zti(jl)*(xp(3,jnu)&
159  & +zti(jl)*(xp(4,jnu)+zti(jl)*(xp(5,jnu)+zti(jl)*(xp(6,jnu)&
160  & )))))
161  pbint(jl,jk)=pbint(jl,jk)+zres(jl)
162  pb(jl,jnu,jk)= zres(jl)
163  zblev(jl,jk) = zres(jl)
164 
165  zti2(jl)=(ptave(jl,jk)-tstand)/tstand
166  zres2(jl)=xp(1,jnu)+zti2(jl)*(xp(2,jnu)+zti2(jl)*(xp(3,jnu)&
167  & +zti2(jl)*(xp(4,jnu)+zti2(jl)*(xp(5,jnu)+zti2(jl)*(xp(6,&
168  & jnu)&
169  & )))))
170  zblay(jl,jk) = zres2(jl)
171  ENDDO
172  ENDDO
173 
174 !* 1.2 TOP OF THE ATMOSPHERE AND SURFACE
175 ! ---------------------------------
176 
177  DO jl = kidia,kfdia
178  zti(jl)=(ptl(jl,klev+1)-tstand)/tstand
179  zti2(jl) = (ptl(jl,1) + pdt0(jl) - tstand) / tstand
180  zres(jl) = xp(1,jnu)+zti(jl)*(xp(2,jnu)+zti(jl)*(xp(3,jnu)&
181  & +zti(jl)*(xp(4,jnu)+zti(jl)*(xp(5,jnu)+zti(jl)*(xp(6,jnu)&
182  & )))))
183  zres2(jl) = xp(1,jnu)+zti2(jl)*(xp(2,jnu)+zti2(jl)*(xp(3,jnu)&
184  & +zti2(jl)*(xp(4,jnu)+zti2(jl)*(xp(5,jnu)+zti2(jl)*(xp(6,jnu)&
185  & )))))
186  pbint(jl,klev+1) = pbint(jl,klev+1)+zres(jl)
187  pb(jl,jnu,klev+1)= zres(jl)
188  zblev(jl,klev+1) = zres(jl)
189  pbtop(jl,jnu) = zres(jl)
190  pbsur(jl,jnu) = zres2(jl)
191  ENDDO
192 
193 !* 1.3 GRADIENTS IN SUB-LAYERS
194 ! -----------------------
195 
196  DO jk = 1 , klev
197  jk2 = 2 * jk
198  jk1 = jk2 - 1
199  DO jl = kidia,kfdia
200  pdbsl(jl,jnu,jk1) = zblay(jl,jk ) - zblev(jl,jk)
201  pdbsl(jl,jnu,jk2) = zblev(jl,jk+1) - zblay(jl,jk)
202  ENDDO
203  ENDDO
204 
205 ENDDO
206 
207 !* 2.0 CHOOSE THE RELEVANT SETS OF PADE APPROXIMANTS
208 ! ---------------------------------------------
209 
210 DO jl=kidia,kfdia
211  zdsto1 = (ptl(jl,klev+1)-tintp(1)) / tstp
212  ixtox = max( 1, min( mxixt, int( zdsto1 + 1.0_jprb ) ) )
213  zdstox = (ptl(jl,klev+1)-tintp(ixtox))/tstp
214  IF (zdstox < 0.5_jprb) THEN
215  indto=ixtox
216  ELSE
217  indto=ixtox+1
218  ENDIF
219  indb(jl)=indto
220  zdst1 = (ptl(jl,1)-tintp(1)) / tstp
221  ixtx = max( 1, min( mxixt, int( zdst1 + 1.0_jprb ) ) )
222  zdstx = (ptl(jl,1)-tintp(ixtx))/tstp
223  IF (zdstx < 0.5_jprb) THEN
224  indt=ixtx
225  ELSE
226  indt=ixtx+1
227  ENDIF
228  inds(jl)=indt
229 ENDDO
230 
231 DO jf=1,2
232  DO jg=1,nipd
233  DO jl=kidia,kfdia
234  indsu=inds(jl)
235  pgasur(jl,jg,jf)=pdga(indsu,2*jg-1,jf)
236  pgbsur(jl,jg,jf)=pdgb(indsu,2*jg-1,jf)
237  indtp=indb(jl)
238  pgatop(jl,jg,jf)=pdga(indtp,2*jg-1,jf)
239  pgbtop(jl,jg,jf)=pdgb(indtp,2*jg-1,jf)
240  ENDDO
241  ENDDO
242 ENDDO
243 
244 DO jk=1,klev
245  DO jl=kidia,kfdia
246  zdst1 = (ptave(jl,jk)-tintp(1)) / tstp
247  ixtx = max( 1, min( mxixt, int( zdst1 + 1.0_jprb ) ) )
248  zdstx = (ptave(jl,jk)-tintp(ixtx))/tstp
249  IF (zdstx < 0.5_jprb) THEN
250  indt=ixtx
251  ELSE
252  indt=ixtx+1
253  ENDIF
254  indb(jl)=indt
255  ENDDO
256 
257  DO jf=1,2
258  DO jl=kidia,kfdia
259  indt=indb(jl)
260  DO jg=1,nipd
261  pga(jl,jg,jf,jk)=pdga(indt,2*jg,jf)
262  pgb(jl,jg,jf,jk)=pdgb(indt,2*jg,jf)
263  ENDDO
264  ENDDO
265  ENDDO
266 
267 ENDDO
268 
269 ! ------------------------------------------------------------------
270 
271 IF (lhook) CALL dr_hook('LWB',1,zhook_handle)
272 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
integer, parameter jprb
Definition: parkind1.F90:31
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
logical lhook
Definition: yomhook.F90:12
real(kind=jprb), dimension(11, 16, 3) pdgb
Definition: yoelw.F90:25
real(kind=jprb) tstp
Definition: yoelw.F90:37
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
Definition: yomhook.F90:17
integer(kind=jpim) mxixt
Definition: yoelw.F90:13
real(kind=jprb), dimension(11) tintp
Definition: yoelw.F90:34
integer, parameter jpim
Definition: parkind1.F90:13