LMDZ
rrtm_ecrt_140gp.F90
Go to the documentation of this file.
1 !****************** SUBROUTINE RRTM_ECRT_140GP **************************
2 
3 SUBROUTINE rrtm_ecrt_140gp &
4  &( iplon, klon , klev, kcld &
5  &, paer , paph , pap &
6  &, pts , pth , pt &
7  &, zemis, zemiw &
8  &, pq , pcco2, pozn, pcldf, ptaucld, ptclear &
9  &, cldfrac,taucld,coldry,wkl,wx &
10  &, tauaerl,pavel,tavel,pz,tz,tbound,nlayers,semiss,ireflect)
11 
12 ! Reformatted for F90 by JJMorcrette, ECMWF, 980714
13 
14 ! Read in atmospheric profile from ECMWF radiation code, and prepare it
15 ! for use in RRTM. Set other RRTM input parameters. Values are passed
16 ! back through existing RRTM arrays and commons.
17 
18 !- Modifications
19 
20 ! 2000-05-15 Deborah Salmond Speed-up
21 
22 
23 #include "tsmbkind.h"
24 
25 USE parrrtm , ONLY : jpband ,jpg ,jpxsec ,jpgpt ,jplay ,&
26  &jpinpx
27 USE yoerad , ONLY : novlp
28 USE yoerdi , ONLY : rcardi ,rch4 ,rn2o ,rcfc11 ,rcfc12
29 USE yoesw , ONLY : raer
30 
31 !------------------------------Arguments--------------------------------
32 
33 
34 IMPLICIT NONE
35 
36 
37 ! DUMMY INTEGER SCALARS
38 integer_m :: iplon
39 integer_m :: kcld
40 
41 ! DUMMY REAL SCALARS
42 real_b :: ptclear
43 
44 integer_m :: kidia ! First atmosphere index
45 integer_m :: kfdia ! Last atmosphere index
46 integer_m :: klon ! Number of atmospheres (longitudes)
47 integer_m :: klev ! Number of atmospheric layers
48 real_b :: paer(klon,6,klev) ! Aerosol optical thickness
49 real_b :: pap(klon,klev) ! Layer pressures (Pa)
50 real_b :: paph(klon,klev+1) ! Interface pressures (Pa)
51 real_b :: pts(klon) ! Surface temperature (K)
52 real_b :: pth(klon,klev+1) ! Interface temperatures (K)
53 real_b :: pt(klon,klev) ! Layer temperature (K)
54 real_b :: zemis(klon) ! Non-window surface emissivity
55 real_b :: zemiw(klon) ! Window surface emissivity
56 real_b :: pq(klon,klev) ! H2O specific humidity (mmr)
57 real_b :: pozn(klon,klev) ! O3 mass mixing ratio
58 real_b :: pcco2 ! CO2 mass mixing ratio
59 ! real rch4 ! CH4 mass mixing ratio
60 ! real rn2o ! N2O mass mixing ratio
61 ! real rcfc11 ! CFC11 mass mixing ratio
62 ! real rcfc12 ! CFC12 mass mixing ratio
63 real_b :: pcldf(klon,klev) ! Cloud fraction
64 real_b :: ptaucld(klon,klev,jpband) ! Cloud optical depth
65 real_b :: cldfrac(jplay) ! Cloud fraction
66 real_b :: taucld(jplay,jpband) ! Spectral optical thickness
67 real_b :: coldry(jplay)
68 real_b :: wkl(jpinpx,jplay)
69 real_b :: wx(jpxsec,jplay) ! Amount of trace gases
70 
71 !- from AER
72 real_b :: tauaerl(jplay,jpband)
73 
74 !- from PROFILE
75 real_b :: pavel(jplay)
76 real_b :: tavel(jplay)
77 real_b :: pz(0:jplay)
78 real_b :: tz(0:jplay)
79 real_b :: tbound
80 integer_m :: nlayers
81 
82 !- from SURFACE
83 real_b :: semiss(jpband)
84 integer_m :: ireflect
85 
86 real_b :: ztauaer(5)
87 real_b :: zc1j(0:klev) ! total cloud from top and level k
88 integer_m :: ixindx(jpinpx) ! Indices of trace gases accounted for
89 
90 real_b :: amd ! Effective molecular weight of dry air (g/mol)
91 real_b :: amw ! Molecular weight of water vapor (g/mol)
92 real_b :: amco2 ! Molecular weight of carbon dioxide (g/mol)
93 real_b :: amo ! Molecular weight of ozone (g/mol)
94 real_b :: amch4 ! Molecular weight of methane (g/mol)
95 real_b :: amn2o ! Molecular weight of nitrous oxide (g/mol)
96 real_b :: amc11 ! Molecular weight of CFC11 (g/mol) - CFCL3
97 real_b :: amc12 ! Molecular weight of CFC12 (g/mol) - CF2CL2
98 real_b :: avgdro ! Avogadro's number (molecules/mole)
99 real_b :: gravit ! Gravitational acceleration (cm/sec2)
100 
101 ! Atomic weights for conversion from mass to volume mixing ratios; these
102 ! are the same values used in ECRT to assure accurate conversion to vmr
103 data amd / 28.970_jprb /
104 data amw / 18.0154_jprb /
105 data amco2 / 44.011_jprb /
106 data amo / 47.9982_jprb /
107 data amch4 / 16.043_jprb /
108 data amn2o / 44.013_jprb /
109 data amc11 / 137.3686_jprb /
110 data amc12 / 120.9140_jprb /
111 data avgdro/ 6.02214e23_jprb /
112 data gravit/ 9.80665e02_jprb /
113 
114 ! LOCAL INTEGER SCALARS
115 integer_m :: iatm, imol, ix, ixmax, j1, j2, jae, jb, jk, jl, l, jis
116 integer_m :: nmol, nxmol
117 
118 ! LOCAL REAL SCALARS
119 real_b :: amm, zcldly, zclear, zcloud, zepsec
120 
121 ! ***
122 
123 ! *** mji
124 ! Initialize all molecular amounts and aerosol optical depths to zero here,
125 ! then pass ECRT amounts into RRTM arrays below.
126 
127 ! DATA ZWKL /MAXPRDW*0.0/
128 ! DATA ZWX /MAXPROD*0.0/
129 ! DATA KREFLECT /0/
130 
131 ! Activate cross section molecules:
132 ! NXMOL - number of cross-sections input by user
133 ! IXINDX(I) - index of cross-section molecule corresponding to Ith
134 ! cross-section specified by user
135 ! = 0 -- not allowed in RRTM
136 ! = 1 -- CCL4
137 ! = 2 -- CFC11
138 ! = 3 -- CFC12
139 ! = 4 -- CFC22
140 ! DATA KXMOL /2/
141 ! DATA KXINDX /0,2,3,0,31*0/
142 
143 ! IREFLECT=KREFLECT
144 ! NXMOL=KXMOL
145 
146 !print *,'Just entering RRTM_ECRT_140GP KLEV=',KLEV,' IPLON=',IPLON
147 
148 ireflect=0
149 nxmol=2
150 
151 DO j1=1,35
152  ixindx(j1)=0
153  DO j2=1,klev
154  wkl(j1,j2)=_zero_
155  ENDDO
156 ENDDO
157 ixindx(2)=2
158 ixindx(3)=3
159 DO j1=1,jpxsec
160  DO j2=1,klev
161  wx(j1,j2)=_zero_
162  ENDDO
163 ENDDO
164 
165 ! Set parameters needed for RRTM execution:
166 iatm = 0
167 ! IXSECT = 1
168 ! NUMANGS = 0
169 ! IOUT = -1
170 ixmax = 4
171 
172 ! Bands 6,7,8 are considered the 'window' and allowed to have a
173 ! different surface emissivity (as in ECMWF). Eli wrote this part....
174 semiss(1) = zemis(iplon)
175 semiss(2) = zemis(iplon)
176 semiss(3) = zemis(iplon)
177 semiss(4) = zemis(iplon)
178 semiss(5) = zemis(iplon)
179 semiss(6) = zemiw(iplon)
180 semiss(7) = zemiw(iplon)
181 semiss(8) = zemiw(iplon)
182 semiss(9) = zemis(iplon)
183 semiss(10) = zemis(iplon)
184 semiss(11) = zemis(iplon)
185 semiss(12) = zemis(iplon)
186 semiss(13) = zemis(iplon)
187 semiss(14) = zemis(iplon)
188 semiss(15) = zemis(iplon)
189 semiss(16) = zemis(iplon)
190 
191 !print *,'after SEMISS'
192 
193 ! Set surface temperature.
194 
195 tbound = pts(iplon)
196 !print *,'after TBOUND=',TBOUND
197 
198 ! Install ECRT arrays into RRTM arrays for pressure, temperature,
199 ! and molecular amounts. Pressures are converted from Pascals
200 ! (ECRT) to mb (RRTM). H2O, CO2, O3 and trace gas amounts are
201 ! converted from mass mixing ratio to volume mixing ratio. CO2
202 ! converted with same dry air and CO2 molecular weights used in
203 ! ECRT to assure correct conversion back to the proper CO2 vmr.
204 ! The dry air column COLDRY (in molec/cm2) is calculated from
205 ! the level pressures PZ (in mb) based on the hydrostatic equation
206 ! and includes a correction to account for H2O in the layer. The
207 ! molecular weight of moist air (amm) is calculated for each layer.
208 ! Note: RRTM levels count from bottom to top, while the ECRT input
209 ! variables count from the top down and must be reversed here.
210 
211 nlayers = klev
212 nmol = 6
213 pz(0) = paph(iplon,klev+1)/100._jprb
214 tz(0) = pth(iplon,klev+1)
215 DO l = 1, klev
216  pavel(l) = pap(iplon,klev-l+1)/100._jprb
217  tavel(l) = pt(iplon,klev-l+1)
218  pz(l) = paph(iplon,klev-l+1)/100._jprb
219  tz(l) = pth(iplon,klev-l+1)
220  wkl(1,l) = pq(iplon,klev-l+1)*amd/amw
221  wkl(2,l) = pcco2*amd/amco2
222  wkl(3,l) = pozn(iplon,klev-l+1)*amd/amo
223  wkl(4,l) = rn2o*amd/amn2o
224  wkl(6,l) = rch4*amd/amch4
225  amm = (1-wkl(1,l))*amd + wkl(1,l)*amw
226  coldry(l) = (pz(l-1)-pz(l))*1.e3_jprb*avgdro/(gravit*amm*(1+wkl(1,l)))
227 ENDDO
228 
229 !print *,'after WKL'
230 !print 9001,((RAER(JIS,JAE),JAE=1,6),JIS=1,5)
231 9001 format(1x,6e12.5)
232 
233 
234 !- Fill RRTM aerosol arrays with operational ECMWF aerosols,
235 ! do the mixing and distribute over the 16 spectral intervals
236 
237 DO l=1,klev
238  jk=klev-l+1
239 ! print 9002,JK,(PAER(IPLON,JK,JAE),JAE=1,6)
240 9002 format(1x,i3,6e12.5)
241 
242 
243 ! DO JAE=1,5
244  jae=1
245  ztauaer(jae) =&
246  &(raer(jae,1)*paer(iplon,1,jk)+raer(jae,2)*paer(iplon,2,jk)&
247  &+raer(jae,3)*paer(iplon,3,jk)+raer(jae,4)*paer(iplon,4,jk)&
248  &+raer(jae,5)*paer(iplon,5,jk)+raer(jae,6)*paer(iplon,6,jk))
249 ! &/(PAPH(IPLON,JK+1)-PAPH(IPLON,JK))
250  tauaerl(l, 1)=ztauaer(1)
251  tauaerl(l, 2)=ztauaer(1)
252  jae=2
253  ztauaer(jae) =&
254  &(raer(jae,1)*paer(iplon,1,jk)+raer(jae,2)*paer(iplon,2,jk)&
255  &+raer(jae,3)*paer(iplon,3,jk)+raer(jae,4)*paer(iplon,4,jk)&
256  &+raer(jae,5)*paer(iplon,5,jk)+raer(jae,6)*paer(iplon,6,jk))
257 ! &/(PAPH(IPLON,JK+1)-PAPH(IPLON,JK))
258  tauaerl(l, 3)=ztauaer(2)
259  tauaerl(l, 4)=ztauaer(2)
260  tauaerl(l, 5)=ztauaer(2)
261  jae=3
262  ztauaer(jae) =&
263  &(raer(jae,1)*paer(iplon,1,jk)+raer(jae,2)*paer(iplon,2,jk)&
264  &+raer(jae,3)*paer(iplon,3,jk)+raer(jae,4)*paer(iplon,4,jk)&
265  &+raer(jae,5)*paer(iplon,5,jk)+raer(jae,6)*paer(iplon,6,jk))
266 ! &/(PAPH(IPLON,JK+1)-PAPH(IPLON,JK))
267  tauaerl(l, 6)=ztauaer(3)
268  tauaerl(l, 8)=ztauaer(3)
269  tauaerl(l, 9)=ztauaer(3)
270  jae=4
271  ztauaer(jae) =&
272  &(raer(jae,1)*paer(iplon,1,jk)+raer(jae,2)*paer(iplon,2,jk)&
273  &+raer(jae,3)*paer(iplon,3,jk)+raer(jae,4)*paer(iplon,4,jk)&
274  &+raer(jae,5)*paer(iplon,5,jk)+raer(jae,6)*paer(iplon,6,jk))
275 ! &/(PAPH(IPLON,JK+1)-PAPH(IPLON,JK))
276  tauaerl(l, 7)=ztauaer(4)
277  jae=5
278  ztauaer(jae) =&
279  &(raer(jae,1)*paer(iplon,1,jk)+raer(jae,2)*paer(iplon,2,jk)&
280  &+raer(jae,3)*paer(iplon,3,jk)+raer(jae,4)*paer(iplon,4,jk)&
281  &+raer(jae,5)*paer(iplon,5,jk)+raer(jae,6)*paer(iplon,6,jk))
282 ! &/(PAPH(IPLON,JK+1)-PAPH(IPLON,JK))
283 ! END DO
284  tauaerl(l,10)=ztauaer(5)
285  tauaerl(l,11)=ztauaer(5)
286  tauaerl(l,12)=ztauaer(5)
287  tauaerl(l,13)=ztauaer(5)
288  tauaerl(l,14)=ztauaer(5)
289  tauaerl(l,15)=ztauaer(5)
290  tauaerl(l,16)=ztauaer(5)
291 ! print 9003,L,(ZTAUAER(JAE),JAE=1,5)
292 9003 format(1x,'rrtm_ecrt ZTAUAER:',i3,5e13.6)
293 ENDDO
294 
295 DO l = 1, klev
296 !- Set cross section molecule amounts from ECRT; convert to vmr
297  wx(2,l) = rcfc11*amd/amc11
298  wx(3,l) = rcfc12*amd/amc12
299 !-- DS_000515
300 END DO
301 
302 !- Here, all molecules in WKL and WX are in volume mixing ratio; convert to
303 ! molec/cm2 based on COLDRY for use in RRTM
304 DO imol = 1, nmol
305  DO l = 1, klev
306 !-- DS_000515
307  wkl(imol,l) = coldry(l) * wkl(imol,l)
308  END DO
309 ENDDO
310 
311 DO ix = 1,jpxsec
312  IF (ixindx(ix) /= 0) THEN
313 !-- DS_000515
314  DO l=1 , klev
315  wx(ixindx(ix),l) = coldry(l) * wx(ix,l) * 1.e-20_jprb
316  END DO
317  ENDIF
318 ENDDO
319 
320 
321 !- Approximate treatment for various cloud overlaps
322 zclear=_one_
323 zcloud=_zero_
324 zc1j(0)=_zero_
325 zepsec=1.e-03_jprb
326 jl=iplon
327 
328 IF (novlp == 1) THEN
329 
330  DO jk=1,klev
331  IF (pcldf(jl,jk) > zepsec) THEN
332  zcldly=pcldf(jl,jk)
333  zclear=zclear &
334  &*(_one_-max( zcldly , zcloud ))&
335  &/(_one_-min( zcloud , _one_-zepsec ))
336  zcloud = zcldly
337  zc1j(jk)= _one_ - zclear
338  ELSE
339  zcldly=_zero_
340  zclear=zclear &
341  &*(_one_-max( zcldly , zcloud ))&
342  &/(_one_-min( zcloud , _one_-zepsec ))
343  zcloud = zcldly
344  zc1j(jk)= _one_ - zclear
345  ENDIF
346  ENDDO
347 
348 ELSEIF (novlp == 2) THEN
349 
350  DO jk=1,klev
351  IF (pcldf(jl,jk) > zepsec) THEN
352  zcldly=pcldf(jl,jk)
353  zcloud = max( zcldly , zcloud )
354  zc1j(jk) = zcloud
355  ELSE
356  zcldly=_zero_
357  zcloud = max( zcldly , zcloud )
358  zc1j(jk) = zcloud
359  ENDIF
360  ENDDO
361 
362 ELSEIF (novlp == 3) THEN
363 
364  DO jk=1,klev
365  IF (pcldf(jl,jk) > zepsec) THEN
366  zcldly=pcldf(jl,jk)
367  zclear = zclear * (_one_-zcldly)
368  zcloud = _one_ - zclear
369  zc1j(jk) = zcloud
370  ELSE
371  zcldly=_zero_
372  zclear = zclear * (_one_-zcldly)
373  zcloud = _one_ - zclear
374  zc1j(jk) = zcloud
375  ENDIF
376  ENDDO
377 
378 ENDIF
379 ptclear=_one_-zc1j(klev)
380 
381 ! Transfer cloud fraction and cloud optical depth to RRTM arrays;
382 ! invert array index for pcldf to go from bottom to top for RRTM
383 
384 !- clear-sky column
385 IF (ptclear > _one_-zepsec) THEN
386  kcld=0
387  DO l = 1, klev
388  cldfrac(l) = _zero_
389  ENDDO
390  DO jb=1,jpband
391  DO l=1,klev
392  taucld(l,jb) = _zero_
393  ENDDO
394  ENDDO
395 
396 ELSE
397 
398 !- cloudy column
399 ! The diffusivity factor (Savijarvi, 1997) on the cloud optical
400 ! thickness TAUCLD has already been applied in RADLSW
401 
402  kcld=1
403  DO l=1,klev
404  cldfrac(l) = pcldf(iplon,l)
405  ENDDO
406  DO jb=1,jpband
407  DO l=1,klev
408  taucld(l,jb) = ptaucld(iplon,l,jb)
409  ENDDO
410  ENDDO
411 
412 ENDIF
413 
414 ! ------------------------------------------------------------------
415 
416 RETURN
417 END SUBROUTINE rrtm_ecrt_140gp
INTERFACE SUBROUTINE RRTM_ECRT_140GP pcco2
INTERFACE SUBROUTINE RRTM_ECRT_140GP pth
Definition: yoesw.F90:1
real(kind=jprb), dimension(6, 6) raer
Definition: yoesw.F90:118
c c $Id c c calculs statistiques distribution nuage ftion du regime dynamique c c Ce calcul doit etre fait a partir de valeurs mensuelles CALL nbregdyn DO kmaxm1 DO l
Definition: calcul_REGDYN.h:13
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(kind=jpim) novlp
Definition: yoerad.F90:24
integer, save klev
Definition: dimphy.F90:7
integer(kind=jpim), parameter jpinpx
Definition: parrrtm.F90:20
integer(kind=jpim), parameter jpgpt
Definition: parrrtm.F90:21
integer(kind=jpim), parameter jpband
Definition: parrrtm.F90:18
Definition: yoerdi.F90:1
INTERFACE SUBROUTINE RRTM_ECRT_140GP pozn
integer, save kfdia
Definition: dimphy.F90:5
subroutine rrtm_ecrt_140gp(K_IPLON, klon, klev, kcld, paer, paph, pap, pts, pth, pt, P_ZEMIS, P_ZEMIW, pq, pcco2, pozn, pcldf, ptaucld, ptclear, P_CLDFRAC, P_TAUCLD, PTAU_LW, P_COLDRY, P_WKL, P_WX, P_TAUAERL, PAVEL, P_TAVEL, PZ, P_TZ, P_TBOUND, K_NLAYERS, P_SEMISS, K_IREFLECT)
Definition: yoerad.F90:1
INTERFACE SUBROUTINE RRTM_ECRT_140GP ptclear
real(kind=jprb) rch4
Definition: yoerdi.F90:16
!$Header!c c INCLUDE fxyprim h c c c Fonctions in line c c REAL fyprim REAL rj c c il faut la calculer avant d appeler ces fonctions c c c Fonctions a changer selon x(x) et y(y) choisis.c-----------------------------------------------------------------c c.....ici
real(kind=jprb) rn2o
Definition: yoerdi.F90:17
INTERFACE SUBROUTINE RRTM_ECRT_140GP pcldf
INTERFACE SUBROUTINE RRTM_ECRT_140GP paph
integer(kind=jpim), parameter jplay
Definition: parrrtm.F90:15
INTERFACE SUBROUTINE RRTM_ECRT_140GP kcld
INTERFACE SUBROUTINE RRTM_ECRT_140GP pt
INTERFACE SUBROUTINE RRTM_ECRT_140GP ptaucld
integer(kind=jpim), parameter jpg
Definition: parrrtm.F90:17
INTERFACE SUBROUTINE RRTM_ECRT_140GP pap
INTERFACE SUBROUTINE RRTM_ECRT_140GP && paer
INTERFACE SUBROUTINE RRTM_ECRT_140GP && pts
INTERFACE SUBROUTINE RRTM_ECRT_140GP && pq
real(kind=jprb) rcardi
Definition: yoerdi.F90:15
integer(kind=jpim), parameter jpxsec
Definition: parrrtm.F90:19