Directory: | ./ |
---|---|
File: | rad/rrtm_rrtm_140gp.f90 |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 25 | 25 | 100.0% |
Branches: | 12 | 14 | 85.7% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | !*************************************************************************** | ||
2 | ! * | ||
3 | ! RRTM : RAPID RADIATIVE TRANSFER MODEL * | ||
4 | ! * | ||
5 | ! ATMOSPHERIC AND ENVIRONMENTAL RESEARCH, INC. * | ||
6 | ! 840 MEMORIAL DRIVE * | ||
7 | ! CAMBRIDGE, MA 02139 * | ||
8 | ! * | ||
9 | ! ELI J. MLAWER * | ||
10 | ! STEVEN J. TAUBMAN~ * | ||
11 | ! SHEPARD A. CLOUGH * | ||
12 | ! * | ||
13 | ! ~currently at GFDL * | ||
14 | ! * | ||
15 | ! email: mlawer@aer.com * | ||
16 | ! * | ||
17 | ! The authors wish to acknowledge the contributions of the * | ||
18 | ! following people: Patrick D. Brown, Michael J. Iacono, * | ||
19 | ! Ronald E. Farren, Luke Chen, Robert Bergstrom. * | ||
20 | ! * | ||
21 | !*************************************************************************** | ||
22 | ! Reformatted for F90 by JJMorcrette, ECMWF, 980714 * | ||
23 | ! * | ||
24 | !*************************************************************************** | ||
25 | ! *** mji *** | ||
26 | ! *** This version of RRTM has been altered to interface with either | ||
27 | ! the ECMWF numerical weather prediction model or the ECMWF column | ||
28 | ! radiation model (ECRT) package. | ||
29 | |||
30 | ! Revised, April, 1997; Michael J. Iacono, AER, Inc. | ||
31 | ! - initial implementation of RRTM in ECRT code | ||
32 | ! Revised, June, 1999; Michael J. Iacono and Eli J. Mlawer, AER, Inc. | ||
33 | ! - to implement generalized maximum/random cloud overlap | ||
34 | |||
35 | 120 | SUBROUTINE RRTM_RRTM_140GP & | |
36 | & ( KIDIA , KFDIA , KLON , KLEV,& | ||
37 | 120 | & PAER , PAPH , PAP,& | |
38 | & PTS , PTH , PT,& | ||
39 | & P_ZEMIS , P_ZEMIW,& | ||
40 | & PQ , PCCO2 , POZN,& | ||
41 | & PCLDF , PTAUCLD,& | ||
42 | & PTAU_LW,& | ||
43 | 120 | & PEMIT , PFLUX , PFLUC, PTCLEAR & | |
44 | & ) | ||
45 | |||
46 | ! *** This program is the driver for RRTM, the AER rapid model. | ||
47 | ! For each atmosphere the user wishes to analyze, this routine | ||
48 | ! a) calls ECRTATM to read in the atmospheric profile | ||
49 | ! b) calls SETCOEF to calculate various quantities needed for | ||
50 | ! the radiative transfer algorithm | ||
51 | ! c) calls RTRN to do the radiative transfer calculation for | ||
52 | ! clear or cloudy sky | ||
53 | ! d) writes out the upward, downward, and net flux for each | ||
54 | ! level and the heating rate for each layer | ||
55 | |||
56 | USE PARKIND1 ,ONLY : JPIM ,JPRB | ||
57 | USE YOMHOOK ,ONLY : LHOOK, DR_HOOK | ||
58 | USE YOERAD ,ONLY : NLW | ||
59 | USE PARRRTM , ONLY : JPBAND ,JPXSEC ,JPGPT ,JPLAY ,& | ||
60 | & JPINPX | ||
61 | !------------------------------Arguments-------------------------------- | ||
62 | |||
63 | ! Input arguments | ||
64 | |||
65 | IMPLICIT NONE | ||
66 | INTEGER(KIND=JPIM),INTENT(IN) :: KLON! Number of atmospheres (longitudes) | ||
67 | INTEGER(KIND=JPIM),INTENT(IN) :: KLEV! Number of atmospheric layers | ||
68 | INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA ! First atmosphere index | ||
69 | INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA ! Last atmosphere index | ||
70 | REAL(KIND=JPRB) ,INTENT(IN) :: PAER(KLON,6,KLEV) ! Aerosol optical thickness | ||
71 | REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,KLEV+1) ! Interface pressures (Pa) | ||
72 | REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV) ! Layer pressures (Pa) | ||
73 | REAL(KIND=JPRB) ,INTENT(IN) :: PTS(KLON) ! Surface temperature (I_K) | ||
74 | REAL(KIND=JPRB) ,INTENT(IN) :: PTH(KLON,KLEV+1) ! Interface temperatures (I_K) | ||
75 | REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) ! Layer temperature (I_K) | ||
76 | REAL(KIND=JPRB) ,INTENT(IN) :: P_ZEMIS(KLON) ! Non-window surface emissivity | ||
77 | REAL(KIND=JPRB) ,INTENT(IN) :: P_ZEMIW(KLON) ! Window surface emissivity | ||
78 | REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON,KLEV) ! H2O specific humidity (mmr) | ||
79 | REAL(KIND=JPRB) ,INTENT(IN) :: PCCO2 ! CO2 mass mixing ratio | ||
80 | REAL(KIND=JPRB) ,INTENT(IN) :: POZN(KLON,KLEV) ! O3 mass mixing ratio | ||
81 | REAL(KIND=JPRB) ,INTENT(IN) :: PCLDF(KLON,KLEV) ! Cloud fraction | ||
82 | REAL(KIND=JPRB) ,INTENT(IN) :: PTAUCLD(KLON,KLEV,JPBAND) ! Cloud optical depth | ||
83 | !--C.Kleinschmitt | ||
84 | REAL(KIND=JPRB) ,INTENT(IN) :: PTAU_LW(KLON,KLEV,NLW) ! LW Optical depth of aerosols | ||
85 | !--end | ||
86 | REAL(KIND=JPRB) ,INTENT(OUT) :: PEMIT(KLON) ! Surface LW emissivity | ||
87 | REAL(KIND=JPRB) ,INTENT(OUT) :: PFLUX(KLON,2,KLEV+1) ! LW total sky flux (1=up, 2=down) | ||
88 | REAL(KIND=JPRB) ,INTENT(OUT) :: PFLUC(KLON,2,KLEV+1) ! LW clear sky flux (1=up, 2=down) | ||
89 | REAL(KIND=JPRB) ,INTENT(OUT) :: PTCLEAR(KLON) ! clear-sky fraction of column | ||
90 | INTEGER(KIND=JPIM) :: ICLDLYR(JPLAY) ! Cloud indicator | ||
91 | REAL(KIND=JPRB) :: Z_CLDFRAC(JPLAY) ! Cloud fraction | ||
92 | REAL(KIND=JPRB) :: Z_TAUCLD(JPLAY,JPBAND) ! Spectral optical thickness | ||
93 | |||
94 | REAL(KIND=JPRB) :: Z_ABSS1 (JPGPT*JPLAY) | ||
95 | REAL(KIND=JPRB) :: Z_ATR1 (JPGPT,JPLAY) | ||
96 | EQUIVALENCE (Z_ABSS1(1),Z_ATR1(1,1)) | ||
97 | |||
98 | REAL(KIND=JPRB) :: Z_OD (JPGPT,JPLAY) | ||
99 | |||
100 | REAL(KIND=JPRB) :: Z_TAUSF1(JPGPT*JPLAY) | ||
101 | REAL(KIND=JPRB) :: Z_TF1 (JPGPT,JPLAY) | ||
102 | EQUIVALENCE (Z_TAUSF1(1),Z_TF1(1,1)) | ||
103 | |||
104 | REAL(KIND=JPRB) :: Z_COLDRY(JPLAY) | ||
105 | REAL(KIND=JPRB) :: Z_WKL(JPINPX,JPLAY) | ||
106 | |||
107 | REAL(KIND=JPRB) :: Z_WX(JPXSEC,JPLAY) ! Amount of trace gases | ||
108 | |||
109 | REAL(KIND=JPRB) :: Z_CLFNET (0:JPLAY) | ||
110 | REAL(KIND=JPRB) :: Z_CLHTR (0:JPLAY) | ||
111 | REAL(KIND=JPRB) :: Z_FNET (0:JPLAY) | ||
112 | REAL(KIND=JPRB) :: Z_HTR (0:JPLAY) | ||
113 | REAL(KIND=JPRB) :: Z_TOTDFLUC(0:JPLAY) | ||
114 | REAL(KIND=JPRB) :: Z_TOTDFLUX(0:JPLAY) | ||
115 | REAL(KIND=JPRB) :: Z_TOTUFLUC(0:JPLAY) | ||
116 | REAL(KIND=JPRB) :: Z_TOTUFLUX(0:JPLAY) | ||
117 | |||
118 | INTEGER(KIND=JPIM) :: i, icld, iplon, I_K | ||
119 | INTEGER(KIND=JPIM) :: ISTART | ||
120 | INTEGER(KIND=JPIM) :: IEND | ||
121 | |||
122 | REAL(KIND=JPRB) :: Z_FLUXFAC, Z_HEATFAC, Z_PI, ZEPSEC, ZTCLEAR | ||
123 | |||
124 | !- from AER | ||
125 | REAL(KIND=JPRB) :: Z_TAUAERL(JPLAY,JPBAND) | ||
126 | |||
127 | !- from INTFAC | ||
128 | REAL(KIND=JPRB) :: Z_FAC00(JPLAY) | ||
129 | REAL(KIND=JPRB) :: Z_FAC01(JPLAY) | ||
130 | REAL(KIND=JPRB) :: Z_FAC10(JPLAY) | ||
131 | REAL(KIND=JPRB) :: Z_FAC11(JPLAY) | ||
132 | REAL(KIND=JPRB) :: Z_FORFAC(JPLAY) | ||
133 | |||
134 | !- from INTIND | ||
135 | INTEGER(KIND=JPIM) :: JP(JPLAY) | ||
136 | INTEGER(KIND=JPIM) :: JT(JPLAY) | ||
137 | INTEGER(KIND=JPIM) :: JT1(JPLAY) | ||
138 | |||
139 | !- from PRECISE | ||
140 | REAL(KIND=JPRB) :: Z_ONEMINUS | ||
141 | |||
142 | !- from PROFDATA | ||
143 | REAL(KIND=JPRB) :: Z_COLH2O(JPLAY) | ||
144 | REAL(KIND=JPRB) :: Z_COLCO2(JPLAY) | ||
145 | REAL(KIND=JPRB) :: Z_COLO3 (JPLAY) | ||
146 | REAL(KIND=JPRB) :: Z_COLN2O(JPLAY) | ||
147 | REAL(KIND=JPRB) :: Z_COLCH4(JPLAY) | ||
148 | REAL(KIND=JPRB) :: Z_COLO2 (JPLAY) | ||
149 | REAL(KIND=JPRB) :: Z_CO2MULT(JPLAY) | ||
150 | INTEGER(KIND=JPIM) :: I_LAYTROP | ||
151 | INTEGER(KIND=JPIM) :: I_LAYSWTCH | ||
152 | INTEGER(KIND=JPIM) :: I_LAYLOW | ||
153 | |||
154 | !- from PROFILE | ||
155 | REAL(KIND=JPRB) :: Z_PAVEL(JPLAY) | ||
156 | REAL(KIND=JPRB) :: Z_TAVEL(JPLAY) | ||
157 | REAL(KIND=JPRB) :: Z_PZ(0:JPLAY) | ||
158 | REAL(KIND=JPRB) :: Z_TZ(0:JPLAY) | ||
159 | REAL(KIND=JPRB) :: Z_TBOUND | ||
160 | INTEGER(KIND=JPIM) :: I_NLAYERS | ||
161 | |||
162 | !- from SELF | ||
163 | REAL(KIND=JPRB) :: Z_SELFFAC(JPLAY) | ||
164 | REAL(KIND=JPRB) :: Z_SELFFRAC(JPLAY) | ||
165 | INTEGER(KIND=JPIM) :: INDSELF(JPLAY) | ||
166 | |||
167 | !- from SP | ||
168 | REAL(KIND=JPRB) :: Z_PFRAC(JPGPT,JPLAY) | ||
169 | |||
170 | !- from SURFACE | ||
171 | REAL(KIND=JPRB) :: Z_SEMISS(JPBAND) | ||
172 | REAL(KIND=JPRB) :: Z_SEMISLW | ||
173 | INTEGER(KIND=JPIM) :: IREFLECT | ||
174 | REAL(KIND=JPRB) :: ZHOOK_HANDLE | ||
175 | |||
176 | INTERFACE | ||
177 | SUBROUTINE RRTM_ECRT_140GP & | ||
178 | & ( K_IPLON, klon , klev, kcld,& | ||
179 | & paer , paph , pap,& | ||
180 | & pts , pth , pt,& | ||
181 | & P_ZEMIS, P_ZEMIW,& | ||
182 | & pq , pcco2, pozn, pcldf, ptaucld, ptclear,& | ||
183 | & P_CLDFRAC,P_TAUCLD,& | ||
184 | & PTAU_LW,& | ||
185 | & P_COLDRY,P_WKL,P_WX,& | ||
186 | & P_TAUAERL,PAVEL,P_TAVEL,PZ,P_TZ,P_TBOUND,K_NLAYERS,P_SEMISS,K_IREFLECT ) | ||
187 | USE PARKIND1 ,ONLY : JPIM ,JPRB | ||
188 | USE PARRRTM , ONLY : JPBAND ,JPXSEC ,JPLAY ,& | ||
189 | & JPINPX | ||
190 | USE YOERAD , ONLY : NLW ,NOVLP | ||
191 | USE YOERDI , ONLY : RCH4 ,RN2O ,RCFC11 ,RCFC12 | ||
192 | USE YOESW , ONLY : RAER | ||
193 | INTEGER(KIND=JPIM),INTENT(IN) :: KLON | ||
194 | INTEGER(KIND=JPIM),INTENT(IN) :: KLEV | ||
195 | INTEGER(KIND=JPIM),INTENT(IN) :: K_IPLON | ||
196 | INTEGER(KIND=JPIM),INTENT(OUT) :: KCLD | ||
197 | REAL(KIND=JPRB) ,INTENT(IN) :: PAER(KLON,6,KLEV) | ||
198 | REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,KLEV+1) | ||
199 | REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV) | ||
200 | REAL(KIND=JPRB) ,INTENT(IN) :: PTS(KLON) | ||
201 | REAL(KIND=JPRB) ,INTENT(IN) :: PTH(KLON,KLEV+1) | ||
202 | REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) | ||
203 | REAL(KIND=JPRB) ,INTENT(IN) :: P_ZEMIS(KLON) | ||
204 | REAL(KIND=JPRB) ,INTENT(IN) :: P_ZEMIW(KLON) | ||
205 | REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON,KLEV) | ||
206 | REAL(KIND=JPRB) ,INTENT(IN) :: PCCO2 | ||
207 | REAL(KIND=JPRB) ,INTENT(IN) :: POZN(KLON,KLEV) | ||
208 | REAL(KIND=JPRB) ,INTENT(IN) :: PCLDF(KLON,KLEV) | ||
209 | REAL(KIND=JPRB) ,INTENT(IN) :: PTAUCLD(KLON,KLEV,JPBAND) | ||
210 | !--C.Kleinschmitt | ||
211 | REAL(KIND=JPRB) ,INTENT(IN) :: PTAU_LW(KLON,KLEV,NLW) ! LW Optical depth of aerosols | ||
212 | !--end | ||
213 | REAL(KIND=JPRB) ,INTENT(OUT) :: PTCLEAR | ||
214 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_CLDFRAC(JPLAY) | ||
215 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TAUCLD(JPLAY,JPBAND) | ||
216 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLDRY(JPLAY) | ||
217 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_WKL(JPINPX,JPLAY) | ||
218 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_WX(JPXSEC,JPLAY) | ||
219 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TAUAERL(JPLAY,JPBAND) | ||
220 | REAL(KIND=JPRB) ,INTENT(OUT) :: PAVEL(JPLAY) | ||
221 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TAVEL(JPLAY) | ||
222 | REAL(KIND=JPRB) ,INTENT(OUT) :: PZ(0:JPLAY) | ||
223 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TZ(0:JPLAY) | ||
224 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TBOUND | ||
225 | INTEGER(KIND=JPIM),INTENT(OUT) :: K_NLAYERS | ||
226 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_SEMISS(JPBAND) | ||
227 | INTEGER(KIND=JPIM),INTENT(OUT) :: K_IREFLECT | ||
228 | END SUBROUTINE RRTM_ECRT_140GP | ||
229 | END INTERFACE | ||
230 | INTERFACE | ||
231 | SUBROUTINE RRTM_GASABS1A_140GP (KLEV,P_ATR1,P_OD,P_TF1,P_COLDRY,P_WX,& | ||
232 | & P_TAUAERL,P_FAC00,P_FAC01,P_FAC10,P_FAC11,P_FORFAC,K_JP,K_JT,K_JT1,P_ONEMINUS,& | ||
233 | & P_COLH2O,P_COLCO2,P_COLO3,P_COLN2O,P_COLCH4,P_COLO2,P_CO2MULT,& | ||
234 | & K_LAYTROP,K_LAYSWTCH,K_LAYLOW,P_SELFFAC,P_SELFFRAC,K_INDSELF,PFRAC) | ||
235 | USE PARKIND1 ,ONLY : JPIM ,JPRB | ||
236 | USE PARRRTM , ONLY : JPLAY ,JPBAND ,JPGPT ,JPXSEC | ||
237 | INTEGER(KIND=JPIM),INTENT(IN) :: KLEV | ||
238 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_ATR1(JPGPT,JPLAY) | ||
239 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_OD(JPGPT,JPLAY) | ||
240 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TF1(JPGPT,JPLAY) | ||
241 | REAL(KIND=JPRB) ,INTENT(IN) :: P_COLDRY(JPLAY) | ||
242 | REAL(KIND=JPRB) ,INTENT(IN) :: P_WX(JPXSEC,JPLAY) | ||
243 | REAL(KIND=JPRB) ,INTENT(IN) :: P_TAUAERL(JPLAY,JPBAND) | ||
244 | REAL(KIND=JPRB) ,INTENT(IN) :: P_FAC00(JPLAY) | ||
245 | REAL(KIND=JPRB) ,INTENT(IN) :: P_FAC01(JPLAY) | ||
246 | REAL(KIND=JPRB) ,INTENT(IN) :: P_FAC10(JPLAY) | ||
247 | REAL(KIND=JPRB) ,INTENT(IN) :: P_FAC11(JPLAY) | ||
248 | REAL(KIND=JPRB) ,INTENT(IN) :: P_FORFAC(JPLAY) | ||
249 | INTEGER(KIND=JPIM),INTENT(IN) :: K_JP(JPLAY) | ||
250 | INTEGER(KIND=JPIM),INTENT(IN) :: K_JT(JPLAY) | ||
251 | INTEGER(KIND=JPIM),INTENT(IN) :: K_JT1(JPLAY) | ||
252 | REAL(KIND=JPRB) ,INTENT(IN) :: P_ONEMINUS | ||
253 | REAL(KIND=JPRB) ,INTENT(IN) :: P_COLH2O(JPLAY) | ||
254 | REAL(KIND=JPRB) ,INTENT(IN) :: P_COLCO2(JPLAY) | ||
255 | REAL(KIND=JPRB) ,INTENT(IN) :: P_COLO3(JPLAY) | ||
256 | REAL(KIND=JPRB) ,INTENT(IN) :: P_COLN2O(JPLAY) | ||
257 | REAL(KIND=JPRB) ,INTENT(IN) :: P_COLCH4(JPLAY) | ||
258 | REAL(KIND=JPRB) :: P_COLO2(JPLAY) | ||
259 | REAL(KIND=JPRB) ,INTENT(IN) :: P_CO2MULT(JPLAY) | ||
260 | INTEGER(KIND=JPIM),INTENT(IN) :: K_LAYTROP | ||
261 | INTEGER(KIND=JPIM),INTENT(IN) :: K_LAYSWTCH | ||
262 | INTEGER(KIND=JPIM),INTENT(IN) :: K_LAYLOW | ||
263 | REAL(KIND=JPRB) ,INTENT(IN) :: P_SELFFAC(JPLAY) | ||
264 | REAL(KIND=JPRB) ,INTENT(IN) :: P_SELFFRAC(JPLAY) | ||
265 | INTEGER(KIND=JPIM),INTENT(IN) :: K_INDSELF(JPLAY) | ||
266 | REAL(KIND=JPRB) ,INTENT(OUT) :: PFRAC(JPGPT,JPLAY) | ||
267 | END SUBROUTINE RRTM_GASABS1A_140GP | ||
268 | END INTERFACE | ||
269 | INTERFACE | ||
270 | SUBROUTINE RRTM_RTRN1A_140GP (KLEV,K_ISTART,K_IEND,K_ICLDLYR,P_CLDFRAC,P_TAUCLD,P_ABSS1,& | ||
271 | & P_OD,P_TAUSF1,P_CLFNET,P_CLHTR,P_FNET,P_HTR,P_TOTDFLUC,P_TOTDFLUX,P_TOTUFLUC,P_TOTUFLUX,& | ||
272 | & P_TAVEL,PZ,P_TZ,P_TBOUND,PFRAC,P_SEMISS,P_SEMISLW,K_IREFLECT) | ||
273 | USE PARKIND1 ,ONLY : JPIM ,JPRB | ||
274 | USE PARRRTM , ONLY : JPBAND ,JPGPT ,JPLAY | ||
275 | INTEGER(KIND=JPIM),INTENT(IN) :: KLEV | ||
276 | INTEGER(KIND=JPIM),INTENT(IN) :: K_ISTART | ||
277 | INTEGER(KIND=JPIM),INTENT(IN) :: K_IEND | ||
278 | INTEGER(KIND=JPIM),INTENT(IN) :: K_ICLDLYR(JPLAY) | ||
279 | REAL(KIND=JPRB) ,INTENT(IN) :: P_CLDFRAC(JPLAY) | ||
280 | REAL(KIND=JPRB) ,INTENT(IN) :: P_TAUCLD(JPLAY,JPBAND) | ||
281 | REAL(KIND=JPRB) ,INTENT(IN) :: P_ABSS1(JPGPT*JPLAY) | ||
282 | REAL(KIND=JPRB) ,INTENT(IN) :: P_OD(JPGPT,JPLAY) | ||
283 | REAL(KIND=JPRB) ,INTENT(IN) :: P_TAUSF1(JPGPT*JPLAY) | ||
284 | REAL(KIND=JPRB) :: P_CLFNET(0:JPLAY) | ||
285 | REAL(KIND=JPRB) :: P_CLHTR(0:JPLAY) | ||
286 | REAL(KIND=JPRB) :: P_FNET(0:JPLAY) | ||
287 | REAL(KIND=JPRB) :: P_HTR(0:JPLAY) | ||
288 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TOTDFLUC(0:JPLAY) | ||
289 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TOTDFLUX(0:JPLAY) | ||
290 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TOTUFLUC(0:JPLAY) | ||
291 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_TOTUFLUX(0:JPLAY) | ||
292 | REAL(KIND=JPRB) ,INTENT(IN) :: P_TAVEL(JPLAY) | ||
293 | REAL(KIND=JPRB) :: PZ(0:JPLAY) | ||
294 | REAL(KIND=JPRB) ,INTENT(IN) :: P_TZ(0:JPLAY) | ||
295 | REAL(KIND=JPRB) ,INTENT(IN) :: P_TBOUND | ||
296 | REAL(KIND=JPRB) ,INTENT(IN) :: PFRAC(JPGPT,JPLAY) | ||
297 | REAL(KIND=JPRB) ,INTENT(IN) :: P_SEMISS(JPBAND) | ||
298 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_SEMISLW | ||
299 | INTEGER(KIND=JPIM) :: K_IREFLECT | ||
300 | END SUBROUTINE RRTM_RTRN1A_140GP | ||
301 | END INTERFACE | ||
302 | INTERFACE | ||
303 | SUBROUTINE RRTM_SETCOEF_140GP (KLEV,P_COLDRY,P_WKL,& | ||
304 | & P_FAC00,P_FAC01,P_FAC10,P_FAC11,P_FORFAC,K_JP,K_JT,K_JT1,& | ||
305 | & P_COLH2O,P_COLCO2,P_COLO3,P_COLN2O,P_COLCH4,P_COLO2,P_CO2MULT,& | ||
306 | & K_LAYTROP,K_LAYSWTCH,K_LAYLOW,PAVEL,P_TAVEL,P_SELFFAC,P_SELFFRAC,K_INDSELF) | ||
307 | USE PARKIND1 ,ONLY : JPIM ,JPRB | ||
308 | USE PARRRTM , ONLY : JPLAY ,JPINPX | ||
309 | INTEGER(KIND=JPIM),INTENT(IN) :: KLEV | ||
310 | REAL(KIND=JPRB) ,INTENT(IN) :: P_COLDRY(JPLAY) | ||
311 | REAL(KIND=JPRB) ,INTENT(IN) :: P_WKL(JPINPX,JPLAY) | ||
312 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_FAC00(JPLAY) | ||
313 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_FAC01(JPLAY) | ||
314 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_FAC10(JPLAY) | ||
315 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_FAC11(JPLAY) | ||
316 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_FORFAC(JPLAY) | ||
317 | INTEGER(KIND=JPIM),INTENT(OUT) :: K_JP(JPLAY) | ||
318 | INTEGER(KIND=JPIM),INTENT(OUT) :: K_JT(JPLAY) | ||
319 | INTEGER(KIND=JPIM),INTENT(OUT) :: K_JT1(JPLAY) | ||
320 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLH2O(JPLAY) | ||
321 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLCO2(JPLAY) | ||
322 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLO3(JPLAY) | ||
323 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLN2O(JPLAY) | ||
324 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLCH4(JPLAY) | ||
325 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_COLO2(JPLAY) | ||
326 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_CO2MULT(JPLAY) | ||
327 | INTEGER(KIND=JPIM),INTENT(OUT) :: K_LAYTROP | ||
328 | INTEGER(KIND=JPIM),INTENT(OUT) :: K_LAYSWTCH | ||
329 | INTEGER(KIND=JPIM),INTENT(OUT) :: K_LAYLOW | ||
330 | REAL(KIND=JPRB) ,INTENT(IN) :: PAVEL(JPLAY) | ||
331 | REAL(KIND=JPRB) ,INTENT(IN) :: P_TAVEL(JPLAY) | ||
332 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_SELFFAC(JPLAY) | ||
333 | REAL(KIND=JPRB) ,INTENT(OUT) :: P_SELFFRAC(JPLAY) | ||
334 | INTEGER(KIND=JPIM),INTENT(OUT) :: K_INDSELF(JPLAY) | ||
335 | END SUBROUTINE RRTM_SETCOEF_140GP | ||
336 | END INTERFACE | ||
337 | |||
338 | ! HEATFAC is the factor by which one must multiply delta-flux/ | ||
339 | ! delta-pressure, with flux in w/m-2 and pressure in mbar, to get | ||
340 | ! the heating rate in units of degrees/day. It is equal to | ||
341 | ! (g)x(#sec/day)x(1e-5)/(specific heat of air at const. p) | ||
342 | ! = (9.8066)(86400)(1e-5)/(1.004) | ||
343 | |||
344 |
1/2✓ Branch 0 taken 120 times.
✗ Branch 1 not taken.
|
120 | IF (LHOOK) CALL DR_HOOK('RRTM_RRTM_140GP',0,ZHOOK_HANDLE) |
345 | ZEPSEC = 1.E-06_JPRB | ||
346 | 120 | Z_ONEMINUS = 1.0_JPRB - ZEPSEC | |
347 | Z_PI = 2.0_JPRB*ASIN(1.0_JPRB) | ||
348 | Z_FLUXFAC = Z_PI * 2.D4 | ||
349 | Z_HEATFAC = 8.4391_JPRB | ||
350 | |||
351 | ! *** mji *** | ||
352 | ! For use with ECRT, this loop is over atmospheres (or longitudes) | ||
353 |
2/2✓ Branch 0 taken 119280 times.
✓ Branch 1 taken 120 times.
|
119400 | DO iplon = kidia,kfdia |
354 | |||
355 | ! *** mji *** | ||
356 | !- Prepare atmospheric profile from ECRT for use in RRTM, and define | ||
357 | ! other RRTM input parameters. Arrays are passed back through the | ||
358 | ! existing RRTM commons and arrays. | ||
359 | ZTCLEAR=1.0_JPRB | ||
360 | |||
361 | CALL RRTM_ECRT_140GP & | ||
362 | & ( iplon, klon , klev, icld,& | ||
363 | & paer , paph , pap,& | ||
364 | & pts , pth , pt,& | ||
365 | & P_ZEMIS, P_ZEMIW,& | ||
366 | & pq , pcco2, pozn, pcldf, ptaucld, ztclear,& | ||
367 | & Z_CLDFRAC,Z_TAUCLD,& | ||
368 | & PTAU_LW,& | ||
369 | & Z_COLDRY,Z_WKL,Z_WX,& | ||
370 | 119280 | & Z_TAUAERL,Z_PAVEL,Z_TAVEL,Z_PZ,Z_TZ,Z_TBOUND,I_NLAYERS,Z_SEMISS,IREFLECT) | |
371 | |||
372 | 119280 | PTCLEAR(iplon)=ztclear | |
373 | |||
374 | 119280 | ISTART = 1 | |
375 | 119280 | IEND = 16 | |
376 | |||
377 | ! Calculate information needed by the radiative transfer routine | ||
378 | ! that is specific to this atmosphere, especially some of the | ||
379 | ! coefficients and indices needed to compute the optical depths | ||
380 | ! by interpolating data from stored reference atmospheres. | ||
381 | |||
382 | CALL RRTM_SETCOEF_140GP (KLEV,Z_COLDRY,Z_WKL,& | ||
383 | & Z_FAC00,Z_FAC01,Z_FAC10,Z_FAC11,Z_FORFAC,JP,JT,JT1,& | ||
384 | & Z_COLH2O,Z_COLCO2,Z_COLO3,Z_COLN2O,Z_COLCH4,Z_COLO2,Z_CO2MULT,& | ||
385 | 119280 | & I_LAYTROP,I_LAYSWTCH,I_LAYLOW,Z_PAVEL,Z_TAVEL,Z_SELFFAC,Z_SELFFRAC,INDSELF) | |
386 | |||
387 | CALL RRTM_GASABS1A_140GP (KLEV,Z_ATR1,Z_OD,Z_TF1,Z_COLDRY,Z_WX,& | ||
388 | & Z_TAUAERL,Z_FAC00,Z_FAC01,Z_FAC10,Z_FAC11,Z_FORFAC,JP,JT,JT1,Z_ONEMINUS,& | ||
389 | & Z_COLH2O,Z_COLCO2,Z_COLO3,Z_COLN2O,Z_COLCH4,Z_COLO2,Z_CO2MULT,& | ||
390 | 119280 | & I_LAYTROP,I_LAYSWTCH,I_LAYLOW,Z_SELFFAC,Z_SELFFRAC,INDSELF,Z_PFRAC) | |
391 | |||
392 | !- Call the radiative transfer routine. | ||
393 | |||
394 | ! *** mji *** | ||
395 | ! Check for cloud in column. Use ECRT threshold set as flag icld in | ||
396 | ! routine ECRTATM. If icld=1 then column is cloudy, otherwise it is | ||
397 | ! clear. Also, set up flag array, icldlyr, for use in radiative | ||
398 | ! transfer. Set icldlyr to one for each layer with non-zero cloud | ||
399 | ! fraction. | ||
400 | |||
401 |
2/2✓ Branch 0 taken 4651920 times.
✓ Branch 1 taken 119280 times.
|
4771200 | DO I_K = 1, KLEV |
402 |
4/4✓ Branch 0 taken 4539600 times.
✓ Branch 1 taken 112320 times.
✓ Branch 2 taken 1092037 times.
✓ Branch 3 taken 3447563 times.
|
4771200 | IF (ICLD == 1.AND.Z_CLDFRAC(I_K) > ZEPSEC) THEN |
403 | 1092037 | ICLDLYR(I_K) = 1 | |
404 | ELSE | ||
405 | 3559883 | ICLDLYR(I_K) = 0 | |
406 | ENDIF | ||
407 | ENDDO | ||
408 | |||
409 | ! Clear and cloudy parts of column are treated together in RTRN. | ||
410 | ! Clear radiative transfer is done for clear layers and cloudy radiative | ||
411 | ! transfer is done for cloudy layers as identified by icldlyr. | ||
412 | |||
413 | CALL RRTM_RTRN1A_140GP (KLEV,ISTART,IEND,ICLDLYR,Z_CLDFRAC,Z_TAUCLD,Z_ABSS1,& | ||
414 | & Z_OD,Z_TAUSF1,Z_CLFNET,Z_CLHTR,Z_FNET,Z_HTR,Z_TOTDFLUC,Z_TOTDFLUX,Z_TOTUFLUC,Z_TOTUFLUX,& | ||
415 | 119280 | & Z_TAVEL,Z_PZ,Z_TZ,Z_TBOUND,Z_PFRAC,Z_SEMISS,Z_SEMISLW,IREFLECT) | |
416 | |||
417 | ! *** Pass clear sky and total sky up and down flux profiles to ECRT | ||
418 | ! output arrays (zflux, zfluc). Array indexing from bottom to top | ||
419 | ! is preserved for ECRT. | ||
420 | ! Invert down flux arrays for consistency with ECRT sign conventions. | ||
421 | |||
422 | 119280 | pemit(iplon) = Z_SEMISLW | |
423 |
2/2✓ Branch 3 taken 4771200 times.
✓ Branch 4 taken 119280 times.
|
5129160 | DO i = 0, KLEV |
424 | 4771200 | PFLUC(iplon,1,i+1) = Z_TOTUFLUC(i)*Z_FLUXFAC | |
425 | 4771200 | PFLUC(iplon,2,i+1) = -Z_TOTDFLUC(i)*Z_FLUXFAC | |
426 | 4771200 | PFLUX(iplon,1,i+1) = Z_TOTUFLUX(i)*Z_FLUXFAC | |
427 | 4890480 | PFLUX(iplon,2,i+1) = -Z_TOTDFLUX(i)*Z_FLUXFAC | |
428 | ENDDO | ||
429 | ENDDO | ||
430 | |||
431 |
1/2✓ Branch 0 taken 120 times.
✗ Branch 1 not taken.
|
120 | IF (LHOOK) CALL DR_HOOK('RRTM_RRTM_140GP',1,ZHOOK_HANDLE) |
432 | 120 | END SUBROUTINE RRTM_RRTM_140GP | |
433 |