1 | MODULE RADIATION_SETUP |
---|
2 | |
---|
3 | ! RADIATION_SETUP - Setting up modular radiation scheme |
---|
4 | ! |
---|
5 | ! (C) Copyright 2015- ECMWF. |
---|
6 | ! |
---|
7 | ! This software is licensed under the terms of the Apache Licence Version 2.0 |
---|
8 | ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. |
---|
9 | ! |
---|
10 | ! In applying this licence, ECMWF does not waive the privileges and immunities |
---|
11 | ! granted to it by virtue of its status as an intergovernmental organisation |
---|
12 | ! nor does it submit to any jurisdiction. |
---|
13 | ! |
---|
14 | ! PURPOSE |
---|
15 | ! ------- |
---|
16 | ! The modular radiation scheme is contained in a separate |
---|
17 | ! library. SETUP_RADIATION_SCHEME in this module sets up a small |
---|
18 | ! derived type that contains the configuration object for the |
---|
19 | ! radiation scheme, plus a small number of additional variables |
---|
20 | ! needed for its implemenation in the IFS. |
---|
21 | ! |
---|
22 | ! INTERFACE |
---|
23 | ! --------- |
---|
24 | ! SETUP_RADIATION_SCHEME is called from SUECRAD. The radiation |
---|
25 | ! scheme is actually run using the RADIATION_SCHEME routine (not in |
---|
26 | ! this module). |
---|
27 | ! |
---|
28 | ! AUTHOR |
---|
29 | ! ------ |
---|
30 | ! Robin Hogan, ECMWF |
---|
31 | ! Original: 2015-09-16 |
---|
32 | ! |
---|
33 | ! MODIFICATIONS |
---|
34 | ! ------------- |
---|
35 | ! 2017-03-03 R. Hogan Put global variables in TRADIATION derived type |
---|
36 | ! 2017-11-17 S. Remy Add Nitrates and SOA if NAERMACC=0 |
---|
37 | ! 2017-11-28 R. Hogan Delta scaling applied to particles only |
---|
38 | ! 2018-01-11 R. Hogan Capability to scale solar spectrum in each band |
---|
39 | ! 2018-04-20 A. Bozzo Added capability to read in aerosol optical properties |
---|
40 | ! at selected wavelengths |
---|
41 | ! 2019-01-21 R. Hogan Explicit albedo and emissivity spectral definitions |
---|
42 | ! leading to smarter weighting in ecRad |
---|
43 | ! |
---|
44 | |
---|
45 | !----------------------------------------------------------------------- |
---|
46 | |
---|
47 | USE PARKIND1, ONLY : JPRB,JPIM |
---|
48 | USE radiation_config, ONLY : config_type, & |
---|
49 | & ISolverMcICA, ISolverSpartacus, & |
---|
50 | & ISolverTripleclouds, ISolverCloudless, & |
---|
51 | & ILiquidModelSlingo, ILiquidModelSOCRATES, & |
---|
52 | & IIceModelFu, IIceModelBaran, & |
---|
53 | & IOverlapExponential, IOverlapMaximumRandom, & |
---|
54 | & IOverlapExponentialRandom |
---|
55 | USE YOERAD, ONLY : TERAD |
---|
56 | |
---|
57 | IMPLICIT NONE |
---|
58 | |
---|
59 | SAVE |
---|
60 | |
---|
61 | ! Background aerosol is specified in an ugly way: using the old Tegen |
---|
62 | ! fields that are in terms of optical depth, and converted to mass |
---|
63 | ! mixing ratio via the relevant mass-extinction coefficient. The |
---|
64 | ! following are the indices to the aerosol types used to describe |
---|
65 | ! tropospheric and stratospheric background aerosol. |
---|
66 | INTEGER(KIND=JPIM), PARAMETER :: ITYPE_TROP_BG_AER = 8 ! hydrophobic organic |
---|
67 | INTEGER(KIND=JPIM), PARAMETER :: ITYPE_STRAT_BG_AER=12 ! non-absorbing sulphate |
---|
68 | |
---|
69 | ! This derived type contains configuration information for the |
---|
70 | ! radiation scheme plus a few additional variables and parameters |
---|
71 | ! needed for the IFS interface to it |
---|
72 | TYPE :: TRADIATION |
---|
73 | |
---|
74 | ! Configuration for wider aspects of the radiation scheme |
---|
75 | TYPE(TERAD) :: YRERAD |
---|
76 | |
---|
77 | ! Configuration information for the ecRad radiation scheme |
---|
78 | type(config_type) :: rad_config |
---|
79 | |
---|
80 | ! Ultraviolet weightings |
---|
81 | INTEGER(KIND=JPIM) :: NWEIGHT_UV |
---|
82 | INTEGER(KIND=JPIM) :: IBAND_UV(100) |
---|
83 | REAL(KIND=JPRB) :: WEIGHT_UV(100) |
---|
84 | ! Photosynthetically active radiation weightings |
---|
85 | INTEGER(KIND=JPIM) :: NWEIGHT_PAR |
---|
86 | INTEGER(KIND=JPIM) :: IBAND_PAR(100) |
---|
87 | REAL(KIND=JPRB) :: WEIGHT_PAR(100) |
---|
88 | ! Mass-extinction coefficient (m2 kg-1) of tropospheric and |
---|
89 | ! stratospheric background aerosol at 550 nm |
---|
90 | REAL(KIND=JPRB) :: TROP_BG_AER_MASS_EXT |
---|
91 | REAL(KIND=JPRB) :: STRAT_BG_AER_MASS_EXT |
---|
92 | |
---|
93 | END TYPE TRADIATION |
---|
94 | |
---|
95 | ! Dummy type |
---|
96 | TYPE :: TCOMPO |
---|
97 | LOGICAL :: LAERNITRATE = .false. |
---|
98 | LOGICAL :: LAERSOA = .false. |
---|
99 | END TYPE TCOMPO |
---|
100 | |
---|
101 | CONTAINS |
---|
102 | |
---|
103 | ! This routine copies information between the IFS radiation |
---|
104 | ! configuration (stored mostly in YDERAD) and the radiation |
---|
105 | ! configuration of the modular radiation scheme (stored in |
---|
106 | ! PRADIATION%rad_config). The optional input logical LDOUTPUT |
---|
107 | ! controls whether to print lots of information during the setup |
---|
108 | ! stage (default is no). |
---|
109 | SUBROUTINE SETUP_RADIATION_SCHEME(PRADIATION,LDOUTPUT,FILE_NAME) |
---|
110 | |
---|
111 | USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK |
---|
112 | USE YOMLUN, ONLY : NULOUT, NULERR |
---|
113 | !USE YOESRTWN, ONLY : NMPSRTM |
---|
114 | USE YOERAD, ONLY : TERAD |
---|
115 | USE YOEPHY, ONLY : TEPHY |
---|
116 | !USE YOMCOMPO, ONLY : TCOMPO |
---|
117 | |
---|
118 | USE RADIATION_INTERFACE, ONLY : SETUP_RADIATION |
---|
119 | USE RADIATION_AEROSOL_OPTICS, ONLY : DRY_AEROSOL_MASS_EXTINCTION |
---|
120 | |
---|
121 | ! Radiation configuration information |
---|
122 | TYPE(TCOMPO) :: YDCOMPO |
---|
123 | TYPE(TRADIATION) ,INTENT(INOUT), TARGET :: PRADIATION |
---|
124 | CHARACTER(LEN=512),INTENT(IN), OPTIONAL :: FILE_NAME |
---|
125 | |
---|
126 | ! Whether or not to print out information on the radiation scheme |
---|
127 | ! configuration |
---|
128 | LOGICAL, INTENT(IN), OPTIONAL :: LDOUTPUT |
---|
129 | |
---|
130 | ! Verbosity of configuration information 0=none, 1=warning, |
---|
131 | ! 2=info, 3=progress, 4=detailed, 5=debug |
---|
132 | INTEGER(KIND=JPIM) :: IVERBOSESETUP |
---|
133 | !INTEGER(KIND=JPIM) :: ISTAT |
---|
134 | |
---|
135 | ! Data directory name |
---|
136 | CHARACTER(LEN=256) :: CL_DATA_DIR |
---|
137 | |
---|
138 | ! Arrays to avoid temporaries |
---|
139 | REAL(KIND=JPRB) :: ZWAVBOUND(15) |
---|
140 | INTEGER(KIND=JPIM) :: IBAND(16) |
---|
141 | |
---|
142 | ! Do we use the nearest ecRad band to the albedo/emissivity |
---|
143 | ! intervals, or a more intelligent weighting? |
---|
144 | LOGICAL :: LL_DO_NEAREST_SW_ALBEDO, LL_DO_NEAREST_LW_EMISS |
---|
145 | |
---|
146 | REAL(KIND=JPHOOK) :: ZHOOK_HANDLE |
---|
147 | |
---|
148 | !#include "posname.intfb.h" |
---|
149 | #include "abor1.intfb.h" |
---|
150 | |
---|
151 | IF (LHOOK) CALL DR_HOOK('RADIATION_SETUP:SETUP_RADIATION_SCHEME',0,ZHOOK_HANDLE) |
---|
152 | |
---|
153 | ! *** GENERAL SETUP *** |
---|
154 | ASSOCIATE(YDERAD=>PRADIATION%YRERAD) |
---|
155 | ASSOCIATE(RAD_CONFIG=>PRADIATION%RAD_CONFIG,& |
---|
156 | & LAERNITRATE=>YDCOMPO%LAERNITRATE, & |
---|
157 | & LAERSOA=>YDCOMPO%LAERSOA, & |
---|
158 | & YSPECTPLANCK=>YDERAD%YSPECTPLANCK) |
---|
159 | |
---|
160 | ! Configure verbosity of setup of radiation scheme |
---|
161 | IVERBOSESETUP = 4 ! Provide plenty of information |
---|
162 | IF (PRESENT(LDOUTPUT)) THEN |
---|
163 | IF (.NOT. LDOUTPUT) THEN |
---|
164 | IVERBOSESETUP = 1 ! Warnings and errors only |
---|
165 | ENDIF |
---|
166 | ENDIF |
---|
167 | RAD_CONFIG%IVERBOSESETUP = IVERBOSESETUP |
---|
168 | |
---|
169 | IF (IVERBOSESETUP > 1) THEN |
---|
170 | WRITE(NULOUT,'(a)') '-------------------------------------------------------------------------------' |
---|
171 | WRITE(NULOUT,'(a)') 'RADIATION_SETUP: ecRad 1.5' |
---|
172 | ENDIF |
---|
173 | |
---|
174 | ! Normal operation of the radiation scheme displays only errors |
---|
175 | ! and warnings |
---|
176 | RAD_CONFIG%IVERBOSE = 1 |
---|
177 | |
---|
178 | ! Read data directory name from the DATA environment variable |
---|
179 | CALL GETENV("DATA", CL_DATA_DIR) |
---|
180 | IF (CL_DATA_DIR /= " ") THEN |
---|
181 | RAD_CONFIG%DIRECTORY_NAME = TRIM(CL_DATA_DIR) // "/ifsdata" |
---|
182 | ELSE |
---|
183 | ! If DATA not present, use the current directory |
---|
184 | RAD_CONFIG%DIRECTORY_NAME = "." |
---|
185 | ENDIF |
---|
186 | |
---|
187 | ! Do we do Hogan and Bozzo (2015) approximate longwave updates? |
---|
188 | RAD_CONFIG%DO_LW_DERIVATIVES = YDERAD%LAPPROXLWUPDATE |
---|
189 | |
---|
190 | ! If we are to perform Hogan and Bozzo (2015) approximate |
---|
191 | ! shortwave updates then we need the downwelling direct and |
---|
192 | ! diffuse shortwave fluxes at the surface in each albedo spectral |
---|
193 | ! interval |
---|
194 | RAD_CONFIG%DO_CANOPY_FLUXES_SW = YDERAD%LAPPROXSWUPDATE |
---|
195 | |
---|
196 | ! If we are to perform approximate longwave updates and we are |
---|
197 | ! using the new 6-interval longwave emissivity scheme then we need |
---|
198 | ! ecRad to compute the downwelling surface longwave fluxes in each |
---|
199 | ! emissivity spectral interval |
---|
200 | IF (YDERAD%NLWOUT > 1) THEN |
---|
201 | RAD_CONFIG%DO_CANOPY_FLUXES_LW = .TRUE. |
---|
202 | ENDIF |
---|
203 | |
---|
204 | ! Surface spectral fluxes are needed for UV and PAR calculations |
---|
205 | RAD_CONFIG%DO_SURFACE_SW_SPECTRAL_FLUX = .TRUE. |
---|
206 | |
---|
207 | |
---|
208 | ! *** SETUP GAS OPTICS *** |
---|
209 | |
---|
210 | ! Assume IFS has already set-up RRTM, so the setup_radiation |
---|
211 | ! routine below does not have to |
---|
212 | !RAD_CONFIG%DO_SETUP_IFSRRTM = .FALSE. |
---|
213 | |
---|
214 | |
---|
215 | ! *** SETUP CLOUD OPTICS *** |
---|
216 | |
---|
217 | ! Setup liquid optics |
---|
218 | IF (YDERAD%NLIQOPT == 2) THEN |
---|
219 | RAD_CONFIG%I_LIQ_MODEL = ILIQUIDMODELSLINGO |
---|
220 | ELSEIF (YDERAD%NLIQOPT == 4) THEN |
---|
221 | RAD_CONFIG%I_LIQ_MODEL = ILIQUIDMODELSOCRATES |
---|
222 | ELSE |
---|
223 | WRITE(NULERR,'(a,i0)') '*** Error: Unavailable liquid optics model in modular radiation scheme: NLIQOPT=', & |
---|
224 | & YDERAD%NLIQOPT |
---|
225 | CALL ABOR1('RADIATION_SETUP: error interpreting NLIQOPT') |
---|
226 | ENDIF |
---|
227 | |
---|
228 | ! Setup ice optics |
---|
229 | IF (YDERAD%NICEOPT == 3) THEN |
---|
230 | RAD_CONFIG%I_ICE_MODEL = IICEMODELFU |
---|
231 | IF (YDERAD%LFU_LW_ICE_OPTICS_BUG) THEN |
---|
232 | RAD_CONFIG%DO_FU_LW_ICE_OPTICS_BUG = .TRUE. |
---|
233 | ENDIF |
---|
234 | ELSEIF (YDERAD%NICEOPT == 4) THEN |
---|
235 | RAD_CONFIG%I_ICE_MODEL = IICEMODELBARAN |
---|
236 | ELSE |
---|
237 | WRITE(NULERR,'(a,i0)') '*** Error: Unavailable ice optics model in modular radiation scheme: NICEOPT=', & |
---|
238 | & YDERAD%NICEOPT |
---|
239 | !! CALL ABOR1('RADIATION_SETUP: error interpreting NICEOPT') !db fix |
---|
240 | ENDIF |
---|
241 | |
---|
242 | ! For consistency with earlier versions of the IFS radiation |
---|
243 | ! scheme, until 45R1 we performed shortwave delta-Eddington |
---|
244 | ! scaling after the merge of the cloud, aerosol and gas optical |
---|
245 | ! properties. Setting this to "false" does the scaling on the |
---|
246 | ! cloud and aerosol properties separately before merging with |
---|
247 | ! gases, which is more physically appropriate. The impact is very |
---|
248 | ! small (see item 6 of table 2 of Technical Memo 787). |
---|
249 | RAD_CONFIG%DO_SW_DELTA_SCALING_WITH_GASES = .FALSE. |
---|
250 | |
---|
251 | |
---|
252 | ! *** SETUP AEROSOLS *** |
---|
253 | |
---|
254 | RAD_CONFIG%USE_AEROSOLS = .TRUE. |
---|
255 | |
---|
256 | ! If monochromatic aerosol properties are available they will be |
---|
257 | ! read in automatically so the following is not needed |
---|
258 | !IF (YDEAERATM%LAERRAD) RAD_CONFIG%AEROSOL_OPTICS%READ_MONOCHROMATIC_OPTICS=.TRUE. |
---|
259 | |
---|
260 | IF (YDERAD%NAERMACC == 1) THEN |
---|
261 | ! Using MACC climatology or prognostic aerosol variables - in |
---|
262 | ! this case the aerosol optics file will be chosen automatically |
---|
263 | |
---|
264 | ! 12 IFS aerosol classes: 1-3 Sea salt, 4-6 Boucher desert dust, |
---|
265 | ! 7 hydrophilic organics, 8 hydrophobic organics, 9&10 |
---|
266 | ! hydrophobic black carbon, 11 ammonium sulphate, 12 inactive |
---|
267 | ! SO2 |
---|
268 | RAD_CONFIG%N_AEROSOL_TYPES = 12 |
---|
269 | |
---|
270 | ! Indices to the aerosol optical properties in |
---|
271 | ! aerosol_ifs_rrtm_*.nc, for each class, where negative numbers |
---|
272 | ! index hydrophilic aerosol types and positive numbers index |
---|
273 | ! hydrophobic aerosol types |
---|
274 | RAD_CONFIG%I_AEROSOL_TYPE_MAP = 0 ! There can be up to 256 types |
---|
275 | RAD_CONFIG%I_AEROSOL_TYPE_MAP(1:12) = (/& |
---|
276 | & -1,&! Sea salt, size bin 1 (OPAC) |
---|
277 | & -2,&! Sea salt, size bin 2 (OPAC) |
---|
278 | & -3,&! Sea salt, size bin 3 (OPAC) |
---|
279 | & 7,&! Desert dust, size bin 1 (Woodward 2001) |
---|
280 | & 8,&! Desert dust, size bin 2 (Woodward 2001) |
---|
281 | & 9,&! Desert dust, size bin 3 (Woodward 2001) |
---|
282 | & -4,&! Hydrophilic organic matter (Hess, OPAC) |
---|
283 | & 10,&! Hydrophobic organic matter (Hess, OPAC) |
---|
284 | & 11,&! Black carbon (Hess, OPAC) |
---|
285 | & 11,&! Black carbon (Hess, OPAC) |
---|
286 | & -5,&! Ammonium sulphate (GACP) |
---|
287 | & 14 /) ! Stratospheric sulphate (GACP) [ climatology only ] |
---|
288 | |
---|
289 | ! Background aerosol mass-extinction coefficients are obtained |
---|
290 | ! after the configuration files have been read - see later in |
---|
291 | ! this routine. |
---|
292 | |
---|
293 | ! The default aerosol optics file is the following - please |
---|
294 | ! update here, not in radiation/module/radiation_config.F90 |
---|
295 | RAD_CONFIG%AEROSOL_OPTICS_OVERRIDE_FILE_NAME = 'aerosol_ifs_rrtm_46R1_with_NI_AM.nc' |
---|
296 | |
---|
297 | ELSE |
---|
298 | ! Using Tegen climatology |
---|
299 | RAD_CONFIG%N_AEROSOL_TYPES = 6 |
---|
300 | RAD_CONFIG%I_AEROSOL_TYPE_MAP = 0 ! There can be up to 256 types |
---|
301 | RAD_CONFIG%I_AEROSOL_TYPE_MAP(1:6) = (/& |
---|
302 | & 1,&! Continental background |
---|
303 | & 2,&! Maritime |
---|
304 | & 3,&! Desert |
---|
305 | & 4,&! Urban |
---|
306 | & 5,&! Volcanic active |
---|
307 | & 6 /) ! Stratospheric background |
---|
308 | |
---|
309 | ! Manually set the aerosol optics file name (the directory will |
---|
310 | ! be added automatically) |
---|
311 | RAD_CONFIG%AEROSOL_OPTICS_OVERRIDE_FILE_NAME = 'aerosol_ifs_rrtm_tegen.nc' |
---|
312 | ENDIF |
---|
313 | |
---|
314 | ! *** SETUP SOLVER *** |
---|
315 | |
---|
316 | ! 3D effects are off by default |
---|
317 | RAD_CONFIG%DO_3D_EFFECTS = .FALSE. |
---|
318 | |
---|
319 | ! Select longwave solver |
---|
320 | SELECT CASE (YDERAD%NLWSOLVER) |
---|
321 | CASE(0) |
---|
322 | RAD_CONFIG%I_SOLVER_LW = ISOLVERMCICA |
---|
323 | CASE(1) |
---|
324 | RAD_CONFIG%I_SOLVER_LW = ISOLVERSPARTACUS |
---|
325 | CASE(2) |
---|
326 | RAD_CONFIG%I_SOLVER_LW = ISOLVERSPARTACUS |
---|
327 | RAD_CONFIG%DO_3D_EFFECTS = .TRUE. |
---|
328 | CASE(3) |
---|
329 | RAD_CONFIG%I_SOLVER_LW = ISOLVERTRIPLECLOUDS |
---|
330 | CASE(4) |
---|
331 | RAD_CONFIG%I_SOLVER_LW = ISOLVERCLOUDLESS |
---|
332 | CASE DEFAULT |
---|
333 | WRITE(NULERR,'(a,i0)') '*** Error: Unknown value for NLWSOLVER: ', YDERAD%NLWSOLVER |
---|
334 | CALL ABOR1('RADIATION_SETUP: error interpreting NLWSOLVER') |
---|
335 | END SELECT |
---|
336 | |
---|
337 | ! Select shortwave solver |
---|
338 | SELECT CASE (YDERAD%NSWSOLVER) |
---|
339 | CASE(0) |
---|
340 | RAD_CONFIG%I_SOLVER_SW = ISOLVERMCICA |
---|
341 | CASE(1) |
---|
342 | RAD_CONFIG%I_SOLVER_SW = ISOLVERSPARTACUS |
---|
343 | RAD_CONFIG%DO_3D_EFFECTS = .FALSE. |
---|
344 | IF (YDERAD%NLWSOLVER == 2) THEN |
---|
345 | CALL ABOR1('RADIATION_SETUP: cannot represent 3D effects in LW but not SW') |
---|
346 | ENDIF |
---|
347 | CASE(2) |
---|
348 | RAD_CONFIG%I_SOLVER_SW = ISOLVERSPARTACUS |
---|
349 | RAD_CONFIG%DO_3D_EFFECTS = .TRUE. |
---|
350 | IF (YDERAD%NLWSOLVER == 1) THEN |
---|
351 | CALL ABOR1('RADIATION_SETUP: cannot represent 3D effects in SW but not LW') |
---|
352 | ENDIF |
---|
353 | CASE(3) |
---|
354 | RAD_CONFIG%I_SOLVER_SW = ISOLVERTRIPLECLOUDS |
---|
355 | CASE(4) |
---|
356 | RAD_CONFIG%I_SOLVER_SW = ISOLVERCLOUDLESS |
---|
357 | CASE DEFAULT |
---|
358 | WRITE(NULERR,'(a,i0)') '*** Error: Unknown value for NSWSOLVER: ', YDERAD%NSWSOLVER |
---|
359 | CALL ABOR1('RADIATION_SETUP: error interpreting NSWSOLVER') |
---|
360 | END SELECT |
---|
361 | |
---|
362 | ! For stability the cloud effective size can't be too small in |
---|
363 | ! SPARTACUS |
---|
364 | RAD_CONFIG%MIN_CLOUD_EFFECTIVE_SIZE = 500.0_JPRB |
---|
365 | |
---|
366 | ! SPARTACUS solver requires delta scaling to be done separately |
---|
367 | ! for clouds & aerosols |
---|
368 | IF (RAD_CONFIG%I_SOLVER_SW == ISOLVERSPARTACUS) THEN |
---|
369 | RAD_CONFIG%DO_SW_DELTA_SCALING_WITH_GASES = .FALSE. |
---|
370 | ENDIF |
---|
371 | |
---|
372 | ! Do we represent longwave scattering? |
---|
373 | RAD_CONFIG%DO_LW_CLOUD_SCATTERING = .FALSE. |
---|
374 | RAD_CONFIG%DO_LW_AEROSOL_SCATTERING = .FALSE. |
---|
375 | SELECT CASE (YDERAD%NLWSCATTERING) |
---|
376 | CASE(1) |
---|
377 | RAD_CONFIG%DO_LW_CLOUD_SCATTERING = .TRUE. |
---|
378 | CASE(2) |
---|
379 | RAD_CONFIG%DO_LW_CLOUD_SCATTERING = .TRUE. |
---|
380 | IF (YDERAD%NAERMACC > 0) THEN |
---|
381 | ! Tegen climatology omits data required to do longwave |
---|
382 | ! scattering by aerosols, so only turn this on with a more |
---|
383 | ! recent scattering database |
---|
384 | RAD_CONFIG%DO_LW_AEROSOL_SCATTERING = .TRUE. |
---|
385 | ENDIF |
---|
386 | END SELECT |
---|
387 | |
---|
388 | SELECT CASE (YDERAD%NCLOUDOVERLAP) |
---|
389 | CASE (1) |
---|
390 | RAD_CONFIG%I_OVERLAP_SCHEME = IOVERLAPMAXIMUMRANDOM |
---|
391 | CASE (2) |
---|
392 | ! Use Exponential-Exponential cloud overlap to match original IFS |
---|
393 | ! implementation of Raisanen cloud generator |
---|
394 | RAD_CONFIG%I_OVERLAP_SCHEME = IOVERLAPEXPONENTIAL |
---|
395 | CASE (3) |
---|
396 | RAD_CONFIG%I_OVERLAP_SCHEME = IOVERLAPEXPONENTIALRANDOM |
---|
397 | CASE DEFAULT |
---|
398 | WRITE(NULERR,'(a,i0)') '*** Error: Unknown value for NCLOUDOVERLAP: ', YDERAD%NCLOUDOVERLAP |
---|
399 | CALL ABOR1('RADIATION_SETUP: error interpreting NCLOUDOVERLAP') |
---|
400 | END SELECT |
---|
401 | |
---|
402 | ! Change cloud overlap to exponential-random if Tripleclouds or |
---|
403 | ! SPARTACUS selected as both the shortwave and longwave solvers |
---|
404 | IF (RAD_CONFIG%I_OVERLAP_SCHEME /= IOVERLAPEXPONENTIALRANDOM & |
---|
405 | & .AND. ( RAD_CONFIG%I_SOLVER_SW == ISOLVERTRIPLECLOUDS & |
---|
406 | & .OR. RAD_CONFIG%I_SOLVER_LW == ISOLVERTRIPLECLOUDS & |
---|
407 | & .OR. RAD_CONFIG%I_SOLVER_SW == ISOLVERSPARTACUS & |
---|
408 | & .OR. RAD_CONFIG%I_SOLVER_LW == ISOLVERSPARTACUS)) THEN |
---|
409 | IF (RAD_CONFIG%I_SOLVER_SW == RAD_CONFIG%I_SOLVER_LW) THEN |
---|
410 | WRITE(NULOUT,'(a)') 'Warning: Tripleclouds/SPARTACUS solver selected so changing cloud overlap to Exp-Ran' |
---|
411 | RAD_CONFIG%I_OVERLAP_SCHEME = IOVERLAPEXPONENTIALRANDOM |
---|
412 | ELSE |
---|
413 | ! If the solvers are not the same and exponential-random has |
---|
414 | ! not been selected then abort |
---|
415 | WRITE(NULERR,'(a)') '*** Error: Tripleclouds and SPARTACUS solvers can only simulate exponential-random overlap' |
---|
416 | CALL ABOR1('RADIATION_SETUP: Cloud overlap incompatible with solver') |
---|
417 | ENDIF |
---|
418 | |
---|
419 | ! For additional stability in SPARTACUS solver it helps if the |
---|
420 | ! cloud fraction threshold is higher than the default of 1.0e-6 |
---|
421 | ! used for McICA; this is done for Tripleclouds too so that it |
---|
422 | ! is a good control for SPARTACUS. |
---|
423 | RAD_CONFIG%CLOUD_FRACTION_THRESHOLD = 2.5E-5_JPRB |
---|
424 | ENDIF |
---|
425 | |
---|
426 | |
---|
427 | ! Number of longwave surface emissivity intervals to use: |
---|
428 | ! Traditional approach: one value of emissivty for parts of the |
---|
429 | ! spectrum on either side of the infrared atmospheric window |
---|
430 | ! (PEMIR), and one value for the window itself (PEMIW) |
---|
431 | YDERAD%NLWEMISS = 2 |
---|
432 | ! ...and the longwave approximate update scheme uses a single |
---|
433 | ! broadband emissivity |
---|
434 | YDERAD%NLWOUT = 1 |
---|
435 | ! Create a spectral Planck look-up table, used by RADHEATN. Note |
---|
436 | ! that this routine makes use of the length of its third argument. |
---|
437 | ! The wavelength bounds (metres) allow for the first emissivity to |
---|
438 | ! represent values outside the infrared atmospheric window, and the |
---|
439 | ! second emissivity to represent values within it. |
---|
440 | CALL YDERAD%YSPECTPLANCK%INIT(2, [ 8.0E-6_JPRB, 13.0E-6_JPRB ], & |
---|
441 | & [ 1,2,1 ]) |
---|
442 | |
---|
443 | ! Populate the mapping between the 14 RRTM shortwave bands and the |
---|
444 | ! 6 albedo inputs. |
---|
445 | YDERAD%NSW = 6 |
---|
446 | ZWAVBOUND(1:5) = [ 0.25e-6_jprb, 0.44e-6_jprb, 0.69e-6_jprb, & |
---|
447 | & 1.19e-6_jprb, 2.38e-6_jprb ] |
---|
448 | IBAND(1:6) = [ 1,2,3,4,5,6 ] |
---|
449 | ! If NALBEDOSCHEME==2 then we are using the 6-component MODIS |
---|
450 | ! albedo climatology, and a weighted average is used to compute |
---|
451 | ! the albedos in each ecRad spectral band. If NALBEDOSCHEME==3 |
---|
452 | ! then we use the diffuse part of the 4 components but still with |
---|
453 | ! a weighted average. Otherwise the older behaviour is followed: |
---|
454 | ! the nearest albedo interval to each band is selected, resulting |
---|
455 | ! in a discrete mapping that matches the one in YOESRTWN:NMPSRTM. |
---|
456 | ! Note that this tends to bias albedo high because there is a lot |
---|
457 | ! of energy around the interface between the UV-Vis and Near-IR |
---|
458 | ! channels, so this should be close to the 0.7 microns intended by |
---|
459 | ! the MODIS dataset, not shifted to the nearest RRTM band boundary |
---|
460 | ! at 0.625 microns. |
---|
461 | LL_DO_NEAREST_SW_ALBEDO = .FALSE. |
---|
462 | CALL RAD_CONFIG%DEFINE_SW_ALBEDO_INTERVALS(YDERAD%NSW, ZWAVBOUND, IBAND, & |
---|
463 | & DO_NEAREST=LL_DO_NEAREST_SW_ALBEDO) |
---|
464 | |
---|
465 | ! Likewise between the 16 RRTM longwave bands and the NLWEMISS |
---|
466 | ! emissivity inputs - these are defined in suecrad.F90. |
---|
467 | LL_DO_NEAREST_LW_EMISS = .TRUE. |
---|
468 | CALL RAD_CONFIG%DEFINE_LW_EMISS_INTERVALS(UBOUND(YSPECTPLANCK%INTERVAL_MAP,1), & |
---|
469 | & YSPECTPLANCK%WAVLEN_BOUND, YSPECTPLANCK%INTERVAL_MAP, & |
---|
470 | & DO_NEAREST=LL_DO_NEAREST_LW_EMISS) |
---|
471 | |
---|
472 | ! Do we scale the incoming solar radiation in each band? |
---|
473 | IF (YDERAD%NSOLARSPECTRUM == 1) THEN |
---|
474 | IF (RAD_CONFIG%N_BANDS_SW /= 14) THEN |
---|
475 | WRITE(NULERR,'(a)') '*** Error: Shortwave must have 14 bands to apply spectral scaling' |
---|
476 | CALL ABOR1('RADIATION_SETUP: Shortwave must have 14 bands to apply spectral scaling') |
---|
477 | ELSE |
---|
478 | RAD_CONFIG%USE_SPECTRAL_SOLAR_SCALING = .TRUE. |
---|
479 | ENDIF |
---|
480 | ENDIF |
---|
481 | |
---|
482 | ! *** IMPLEMENT SETTINGS *** |
---|
483 | |
---|
484 | ! For advanced configuration, the configuration data for the |
---|
485 | ! "radiation" project can specified directly in the namelist. |
---|
486 | ! However, the variable naming convention is not consistent with |
---|
487 | ! the rest of the IFS. For basic configuration there are specific |
---|
488 | ! variables in the NAERAD namelist available in the YDERAD |
---|
489 | ! structure. |
---|
490 | !CALL POSNAME(NULNAM, 'RADIATION', ISTAT) |
---|
491 | !SELECT CASE (ISTAT) |
---|
492 | ! CASE(0) |
---|
493 | ! CALL RAD_CONFIG%READ(UNIT=NULNAM) |
---|
494 | ! CASE(1) |
---|
495 | ! WRITE(NULOUT,'(a)') 'Namelist RADIATION not found, using settings from NAERAD only' |
---|
496 | ! CASE DEFAULT |
---|
497 | ! CALL ABOR1('RADIATION_SETUP: error reading RADIATION section of namelist file') |
---|
498 | !END SELECT |
---|
499 | IF (PRESENT(FILE_NAME)) THEN |
---|
500 | CALL RAD_CONFIG%READ(FILE_NAME=FILE_NAME) |
---|
501 | ENDIF |
---|
502 | |
---|
503 | ! Print configuration |
---|
504 | IF (IVERBOSESETUP > 1) THEN |
---|
505 | WRITE(NULOUT,'(a)') 'Radiation scheme settings:' |
---|
506 | CALL RAD_CONFIG%PRINT(IVERBOSE=IVERBOSESETUP) |
---|
507 | ENDIF |
---|
508 | |
---|
509 | ! Use configuration data to set-up radiation scheme, including |
---|
510 | ! reading scattering datafiles |
---|
511 | CALL SETUP_RADIATION(RAD_CONFIG) |
---|
512 | |
---|
513 | ! Get spectral weightings for UV and PAR |
---|
514 | CALL RAD_CONFIG%GET_SW_WEIGHTS(0.2E-6_JPRB, 0.4415E-6_JPRB,& |
---|
515 | & PRADIATION%NWEIGHT_UV, PRADIATION%IBAND_UV, PRADIATION%WEIGHT_UV,& |
---|
516 | & 'ultraviolet') |
---|
517 | CALL RAD_CONFIG%GET_SW_WEIGHTS(0.4E-6_JPRB, 0.7E-6_JPRB,& |
---|
518 | & PRADIATION%NWEIGHT_PAR, PRADIATION%IBAND_PAR, PRADIATION%WEIGHT_PAR,& |
---|
519 | & 'photosynthetically active radiation, PAR') |
---|
520 | |
---|
521 | IF (YDERAD%NAERMACC > 0) THEN |
---|
522 | ! With the MACC aerosol climatology we need to add in the |
---|
523 | ! background aerosol afterwards using the Tegen arrays. In this |
---|
524 | ! case we first configure the background aerosol mass-extinction |
---|
525 | ! coefficient at 550 nm, which corresponds to the 10th RRTMG |
---|
526 | ! shortwave band. |
---|
527 | PRADIATION%TROP_BG_AER_MASS_EXT = DRY_AEROSOL_MASS_EXTINCTION(RAD_CONFIG,& |
---|
528 | & ITYPE_TROP_BG_AER, 550.0E-9_JPRB) |
---|
529 | PRADIATION%STRAT_BG_AER_MASS_EXT = DRY_AEROSOL_MASS_EXTINCTION(RAD_CONFIG,& |
---|
530 | & ITYPE_STRAT_BG_AER, 550.0E-9_JPRB) |
---|
531 | |
---|
532 | WRITE(NULOUT,'(a,i0)') 'Tropospheric background uses aerosol type ',& |
---|
533 | & ITYPE_TROP_BG_AER |
---|
534 | WRITE(NULOUT,'(a,i0)') 'Stratospheric background uses aerosol type ',& |
---|
535 | & ITYPE_STRAT_BG_AER |
---|
536 | ELSE |
---|
537 | PRADIATION%TROP_BG_AER_MASS_EXT = 0.0_JPRB |
---|
538 | PRADIATION%STRAT_BG_AER_MASS_EXT = 0.0_JPRB |
---|
539 | ENDIF |
---|
540 | |
---|
541 | IF (IVERBOSESETUP > 1) THEN |
---|
542 | WRITE(NULOUT,'(a)') '-------------------------------------------------------------------------------' |
---|
543 | ENDIF |
---|
544 | |
---|
545 | END ASSOCIATE |
---|
546 | END ASSOCIATE |
---|
547 | |
---|
548 | IF (LHOOK) CALL DR_HOOK('RADIATION_SETUP:SETUP_RADIATION_SCHEME',1,ZHOOK_HANDLE) |
---|
549 | |
---|
550 | END SUBROUTINE SETUP_RADIATION_SCHEME |
---|
551 | |
---|
552 | |
---|
553 | END MODULE RADIATION_SETUP |
---|