source: palm/trunk/SOURCE/radiation_model.f90 @ 1586

Last change on this file since 1586 was 1586, checked in by maronga, 9 years ago

last commit documented

  • Property svn:keywords set to Id
File size: 63.6 KB
Line 
1 MODULE radiation_model_mod
2
3!--------------------------------------------------------------------------------!
4! This file is part of PALM.
5!
6! PALM is free software: you can redistribute it and/or modify it under the terms
7! of the GNU General Public License as published by the Free Software Foundation,
8! either version 3 of the License, or (at your option) any later version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
17! Copyright 1997-2015 Leibniz Universitaet Hannover
18!--------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: radiation_model.f90 1586 2015-04-30 07:11:33Z maronga $
27!
28! 1585 2015-04-30 07:05:52Z maronga
29! Added support for RRTMG
30!
31! 1571 2015-03-12 16:12:49Z maronga
32! Added missing KIND attribute. Removed upper-case variable names
33!
34! 1551 2015-03-03 14:18:16Z maronga
35! Added support for data output. Various variables have been renamed. Added
36! interface for different radiation schemes (currently: clear-sky, constant, and
37! RRTM (not yet implemented).
38!
39! 1496 2014-12-02 17:25:50Z maronga
40! Initial revision
41!
42!
43! Description:
44! ------------
45! Radiation models and interfaces
46! To do: move variable definitions used in init_radiation only to the subroutine
47! as they are no longer required after initialization.
48! Note that many variables have a leading dummy dimension (0:0) in order to
49! match the assume-size shape expected by the RRTMG model
50!
51! To do:
52! - Output of full column vertical profiles used in RRTMG
53! - Output of other rrtm arrays (such as volume mixing ratios)
54! - Adapt for use with topography
55! - Remove 3D dummy arrays (such as clear-sky output)
56!------------------------------------------------------------------------------!
57
58    USE arrays_3d,                                                             &
59        ONLY:  hyp, pt, q, ql, zw
60
61    USE cloud_parameters,                                                      &
62        ONLY:  cp, l_v, nc_const, rho_l, sigma_gc 
63
64    USE constants,                                                             &
65        ONLY:  pi
66
67    USE control_parameters,                                                    &
68        ONLY:  cloud_droplets, cloud_physics, g, initializing_actions,         &
69               large_scale_forcing, lsf_surf, phi, pt_surface,                 &
70               surface_pressure, time_since_reference_point
71
72    USE indices,                                                               &
73        ONLY:  nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb_s_inner, nzb, nzt
74
75    USE kinds
76
77    USE netcdf
78
79    USE netcdf_control,                                                        &
80        ONLY:  dots_label, dots_num, dots_unit
81
82#if defined ( __rrtmg )
83    USE parrrsw,                                                               &
84        ONLY:  naerec, nbndsw
85
86    USE parrrtm,                                                               &
87        ONLY:  nbndlw
88
89    USE rrtmg_lw_init,                                                         &
90        ONLY:  rrtmg_lw_ini
91
92    USE rrtmg_sw_init,                                                         &
93        ONLY:  rrtmg_sw_ini
94
95    USE rrtmg_lw_rad,                                                          &
96        ONLY:  rrtmg_lw
97
98    USE rrtmg_sw_rad,                                                          &
99        ONLY:  rrtmg_sw
100#endif
101
102
103
104    IMPLICIT NONE
105
106    CHARACTER(10) :: radiation_scheme = 'clear-sky' ! 'constant', 'clear-sky', or 'rrtmg'
107
108!
109!-- Predefined Land surface classes (albedo_type) after Briegleb (1992)
110    CHARACTER(37), DIMENSION(0:16), PARAMETER :: albedo_type_name = (/    &
111                                   'user defined',                         & !  0
112                                   'ocean',                                & !  1
113                                   'mixed farming, tall grassland',        & !  2
114                                   'tall/medium grassland',                & !  3
115                                   'evergreen shrubland',                  & !  4
116                                   'short grassland/meadow/shrubland',     & !  5
117                                   'evergreen needleleaf forest',          & !  6
118                                   'mixed deciduous evergreen forest',     & !  7
119                                   'deciduous forest',                     & !  8
120                                   'tropical evergreen broadleaved forest',& !  9
121                                   'medium/tall grassland/woodland',       & ! 10
122                                   'desert, sandy',                        & ! 11
123                                   'desert, rocky',                        & ! 12
124                                   'tundra',                               & ! 13
125                                   'landice',                              & ! 14
126                                   'sea ice',                              & ! 15
127                                   'snow'                                  & ! 16
128                                                         /)
129
130    INTEGER(iwp) :: albedo_type  = 5,    & !: Albedo surface type (default: short grassland)
131                    day,                 & !: current day of the year
132                    day_init     = 172,  & !: day of the year at model start (21/06)
133                    dots_rad     = 0       !: starting index for timeseries output
134
135
136
137
138
139
140    LOGICAL ::  constant_albedo = .FALSE., & !: flag parameter indicating whether the albedo may change depending on zenith
141                lw_radiation = .TRUE.,     & !: flag parameter indicing whether longwave radiation shall be calculated
142                radiation = .FALSE.,       & !: flag parameter indicating whether the radiation model is used
143                sun_up    = .TRUE.,        & !: flag parameter indicating whether the sun is up or down
144                sw_radiation = .TRUE.        !: flag parameter indicing whether shortwave radiation shall be calculated
145
146    REAL(wp), PARAMETER :: sigma_sb       = 5.67E-8_wp, & !: Stefan-Boltzmann constant
147                           solar_constant = 1368.0_wp     !: solar constant at top of atmosphere
148 
149    REAL(wp) :: albedo = 9999999.9_wp,        & !: NAMELIST alpha
150                albedo_lw_dif = 9999999.9_wp, & !: NAMELIST aldif
151                albedo_lw_dir = 9999999.9_wp, & !: NAMELIST aldir
152                albedo_sw_dif = 9999999.9_wp, & !: NAMELIST asdif
153                albedo_sw_dir = 9999999.9_wp, & !: NAMELIST asdir
154                dt_radiation = 0.0_wp,        & !: radiation model timestep
155                emissivity = 0.95_wp,         & !: NAMELIST surface emissivity
156                exn,                          & !: Exner function
157                lon = 0.0_wp,                 & !: longitude in radians
158                lat = 0.0_wp,                 & !: latitude in radians
159                decl_1,                       & !: declination coef. 1
160                decl_2,                       & !: declination coef. 2
161                decl_3,                       & !: declination coef. 3
162                time_utc,                     & !: current time in UTC
163                time_utc_init = 43200.0_wp,   & !: UTC time at model start (noon)
164                lambda = 0.0_wp,              & !: longitude in degrees
165                net_radiation = 0.0_wp,       & !: net radiation at surface
166                time_radiation = 0.0_wp,      & !: time since last call of radiation code
167                sky_trans                       !: sky transmissivity
168
169
170    REAL(wp), DIMENSION(0:0) ::  zenith        !: solar zenith angle
171
172    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
173                alpha,                       & !: surface broadband albedo (used for clear-sky scheme)
174                rad_net,                     & !: net radiation at the surface
175                rad_net_av                     !: average of rad_net
176
177!
178!-- Land surface albedos for solar zenith angle of 60° after Briegleb (1992)     
179!-- (shortwave, longwave, broadband):   sw,      lw,      bb,
180    REAL(wp), DIMENSION(0:2,1:15), PARAMETER :: albedo_pars = RESHAPE( (/& 
181                                   0.06_wp, 0.06_wp, 0.06_wp,            & !  1
182                                   0.09_wp, 0.28_wp, 0.19_wp,            & !  2
183                                   0.11_wp, 0.33_wp, 0.23_wp,            & !  3
184                                   0.11_wp, 0.33_wp, 0.23_wp,            & !  4
185                                   0.14_wp, 0.34_wp, 0.25_wp,            & !  5
186                                   0.06_wp, 0.22_wp, 0.14_wp,            & !  6
187                                   0.06_wp, 0.27_wp, 0.17_wp,            & !  7
188                                   0.06_wp, 0.31_wp, 0.19_wp,            & !  8
189                                   0.06_wp, 0.22_wp, 0.14_wp,            & !  9
190                                   0.06_wp, 0.28_wp, 0.18_wp,            & ! 10
191                                   0.35_wp, 0.51_wp, 0.43_wp,            & ! 11
192                                   0.24_wp, 0.40_wp, 0.32_wp,            & ! 12
193                                   0.10_wp, 0.27_wp, 0.19_wp,            & ! 13
194                                   0.90_wp, 0.65_wp, 0.77_wp,            & ! 14
195                                   0.95_wp, 0.70_wp, 0.82_wp             & ! 15
196                                 /), (/ 3, 15 /) )
197
198    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: &
199                        rad_sw_in,                     & !: incoming shortwave radiation (W/m2)
200                        rad_sw_in_av,                  & !: average of rad_sw_in
201                        rad_sw_out,                    & !: outgoing shortwave radiation (W/m2)
202                        rad_sw_out_av,                 & !: average of rad_sw_out
203                        rad_lw_in,                     & !: incoming longwave radiation (W/m2)
204                        rad_lw_in_av,                  & !: average of rad_lw_in
205                        rad_lw_out,                    & !: outgoing longwave radiation (W/m2)
206                        rad_lw_out_av                    !: average of rad_lw_out
207
208!
209!-- Variables and parameters used in RRTMG only
210#if defined ( __rrtmg )
211    CHARACTER(LEN=12) :: rrtm_input_file = "RAD_SND_DATA" !: name of the NetCDF input file (sounding data)
212
213
214!
215!-- Flag parameters for RRTMGS (should not be changed)
216    INTEGER(iwp), PARAMETER :: rrtm_inflglw  = 2, & !: flag for lw cloud optical properties (0,1,2)
217                               rrtm_iceflglw = 0, & !: flag for lw ice particle specifications (0,1,2,3)
218                               rrtm_liqflglw = 1, & !: flag for lw liquid droplet specifications
219                               rrtm_inflgsw  = 2, & !: flag for sw cloud optical properties (0,1,2)
220                               rrtm_iceflgsw = 0, & !: flag for sw ice particle specifications (0,1,2,3)
221                               rrtm_liqflgsw = 1    !: flag for sw liquid droplet specifications
222
223!
224!-- The following variables should be only changed with care, as this will
225!-- require further setting of some variables, which is currently not
226!-- implemented (aerosols, ice phase).
227    INTEGER(iwp) :: nzt_rad,           & !: upper vertical limit for radiation calculations
228                    rrtm_icld = 0,     & !: cloud flag (0: clear sky column, 1: cloudy column)
229                    rrtm_iaer = 0,     & !: aerosol option flag (0: no aerosol layers, for lw only: 6 (requires setting of rrtm_sw_ecaer), 10: one or more aerosol layers (not implemented)
230                    rrtm_idrv = 0        !: longwave upward flux calculation option (0,1)
231
232    LOGICAL :: snd_exists = .FALSE.      !: flag parameter to check whether a user-defined input files exists
233
234    REAL(wp), PARAMETER :: mol_weight_air_d_wv = 1.607793_wp !: molecular weight dry air / water vapor
235
236    REAL(wp), DIMENSION(:), ALLOCATABLE :: hyp_snd,     & !: hypostatic pressure from sounding data (hPa)
237                                           q_snd,       & !: specific humidity from sounding data (kg/kg) - dummy at the moment
238                                           rrtm_tsfc,   & !: dummy array for storing surface temperature
239                                           t_snd          !: actual temperature from sounding data (hPa)
240
241    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: aldif,         & !: longwave diffuse albedo solar angle of 60°
242                                             aldir,         & !: longwave direct albedo solar angle of 60°
243                                             asdif,         & !: shortwave diffuse albedo solar angle of 60°
244                                             asdir,         & !: shortwave direct albedo solar angle of 60°
245                                             rrtm_ccl4vmr,  & !: CCL4 volume mixing ratio (g/mol)
246                                             rrtm_cfc11vmr, & !: CFC11 volume mixing ratio (g/mol)
247                                             rrtm_cfc12vmr, & !: CFC12 volume mixing ratio (g/mol)
248                                             rrtm_cfc22vmr, & !: CFC22 volume mixing ratio (g/mol)
249                                             rrtm_ch4vmr,   & !: CH4 volume mixing ratio
250                                             rrtm_cicewp,   & !: in-cloud ice water path (g/m²)
251                                             rrtm_cldfr,    & !: cloud fraction (0,1)
252                                             rrtm_cliqwp,   & !: in-cloud liquid water path (g/m²)
253                                             rrtm_co2vmr,   & !: CO2 volume mixing ratio (g/mol)
254                                             rrtm_emis,     & !: surface emissivity (0-1)   
255                                             rrtm_h2ovmr,   & !: H2O volume mixing ratio
256                                             rrtm_n2ovmr,   & !: N2O volume mixing ratio
257                                             rrtm_o2vmr,    & !: O2 volume mixing ratio
258                                             rrtm_o3vmr,    & !: O3 volume mixing ratio
259                                             rrtm_play,     & !: pressure layers (hPa, zu-grid)
260                                             rrtm_plev,     & !: pressure layers (hPa, zw-grid)
261                                             rrtm_reice,    & !: cloud ice effective radius (microns)
262                                             rrtm_reliq,    & !: cloud water drop effective radius (microns)
263                                             rrtm_tlay,     & !: actual temperature (K, zu-grid)
264                                             rrtm_tlev,     & !: actual temperature (K, zw-grid)
265                                             rrtm_lwdflx,   & !: RRTM output of incoming longwave radiation flux (W/m2)
266                                             rrtm_lwuflx,   & !: RRTM output of outgoing longwave radiation flux (W/m2)
267                                             rrtm_lwhr,     & !: RRTM output of longwave radiation heating rate (K/d)
268                                             rrtm_lwuflxc,  & !: RRTM output of incoming clear sky longwave radiation flux (W/m2)
269                                             rrtm_lwdflxc,  & !: RRTM output of outgoing clear sky longwave radiation flux (W/m2)
270                                             rrtm_lwhrc,    & !: RRTM output of incoming longwave clear sky radiation heating rate (K/d)
271                                             rrtm_swdflx,   & !: RRTM output of incoming shortwave radiation flux (W/m2)
272                                             rrtm_swuflx,   & !: RRTM output of outgoing shortwave radiation flux (W/m2)
273                                             rrtm_swhr,     & !: RRTM output of shortwave radiation heating rate (K/d)
274                                             rrtm_swuflxc,  & !: RRTM output of incoming clear sky shortwave radiation flux (W/m2)
275                                             rrtm_swdflxc,  & !: RRTM output of outgoing clear sky shortwave radiation flux (W/m2)
276                                             rrtm_swhrc       !: RRTM output of incoming shortwave clear sky radiation heating rate (K/d)
277
278!
279!-- Definition of arrays that are currently not used for calling RRTMG (due to setting of flag parameters)
280    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  rad_lw_cs_in,   & !: incoming clear sky longwave radiation (W/m2) (not used)
281                                                rad_lw_cs_out,  & !: outgoing clear sky longwave radiation (W/m2) (not used)
282                                                rad_lw_cs_hr,   & !: longwave clear sky radiation heating rate (K/d) (not used)
283                                                rad_lw_hr,      & !: longwave radiation heating rate (K/d)
284                                                rad_sw_cs_in,   & !: incoming clear sky shortwave radiation (W/m2) (not used)
285                                                rad_sw_cs_out,  & !: outgoing clear sky shortwave radiation (W/m2) (not used)
286                                                rad_sw_cs_hr,   & !: shortwave clear sky radiation heating rate (K/d) (not used)
287                                                rad_sw_hr,      & !: shortwave radiation heating rate (K/d)
288                                                rrtm_aldif,     & !: surface albedo for longwave diffuse radiation
289                                                rrtm_aldir,     & !: surface albedo for longwave direct radiation
290                                                rrtm_asdif,     & !: surface albedo for shortwave diffuse radiation
291                                                rrtm_asdir,     & !: surface albedo for shortwave direct radiation
292                                                rrtm_lw_tauaer, & !: lw aerosol optical depth
293                                                rrtm_lw_taucld, & !: lw in-cloud optical depth
294                                                rrtm_sw_taucld, & !: sw in-cloud optical depth
295                                                rrtm_sw_ssacld, & !: sw in-cloud single scattering albedo
296                                                rrtm_sw_asmcld, & !: sw in-cloud asymmetry parameter
297                                                rrtm_sw_fsfcld, & !: sw in-cloud forward scattering fraction
298                                                rrtm_sw_tauaer, & !: sw aerosol optical depth
299                                                rrtm_sw_ssaaer, & !: sw aerosol single scattering albedo
300                                                rrtm_sw_asmaer, & !: sw aerosol asymmetry parameter
301                                                rrtm_sw_ecaer     !: sw aerosol optical detph at 0.55 microns (rrtm_iaer = 6 only)
302#endif
303
304    INTERFACE init_radiation
305       MODULE PROCEDURE init_radiation
306    END INTERFACE init_radiation
307
308    INTERFACE radiation_clearsky
309       MODULE PROCEDURE radiation_clearsky
310    END INTERFACE radiation_clearsky
311
312    INTERFACE radiation_rrtmg
313       MODULE PROCEDURE radiation_rrtmg
314    END INTERFACE radiation_rrtmg
315
316    INTERFACE radiation_tendency
317       MODULE PROCEDURE radiation_tendency
318       MODULE PROCEDURE radiation_tendency_ij
319    END INTERFACE radiation_tendency
320
321    SAVE
322
323    PRIVATE
324
325    PUBLIC albedo, albedo_type, albedo_type_name, albedo_lw_dif, albedo_lw_dir,&
326           albedo_sw_dif, albedo_sw_dir, constant_albedo, day_init, dots_rad,  &
327           dt_radiation, init_radiation, lambda, lw_radiation, net_radiation,  &
328           rad_net, rad_net_av, radiation, radiation_clearsky,                 &
329           radiation_rrtmg, radiation_scheme, radiation_tendency, rad_lw_in,   &
330           rad_lw_in_av, rad_lw_out, rad_lw_out_av, rad_sw_in, rad_sw_in_av,   &
331           rad_sw_out, rad_sw_out_av, sigma_sb, sw_radiation, time_radiation,  &
332           time_utc_init 
333
334#if defined ( __rrtmg )
335    PUBLIC rrtm_aldif, rrtm_aldir, rrtm_asdif, rrtm_asdir
336#endif
337
338 CONTAINS
339
340!------------------------------------------------------------------------------!
341! Description:
342! ------------
343!-- Initialization of the radiation model
344!------------------------------------------------------------------------------!
345    SUBROUTINE init_radiation
346   
347       IMPLICIT NONE
348
349!
350!--    Allocate array for storing the surface net radiation
351       IF ( .NOT. ALLOCATED ( rad_net ) )  THEN
352          ALLOCATE ( rad_net(nysg:nyng,nxlg:nxrg) )
353          rad_net = 0.0_wp
354       ENDIF
355
356!
357!--    Fix net radiation in case of radiation_scheme = 'constant'
358       IF ( radiation_scheme == 'constant' )  THEN
359          rad_net = net_radiation
360          radiation = .FALSE.
361!
362!--    Calculate orbital constants
363       ELSE
364          decl_1 = SIN(23.45_wp * pi / 180.0_wp)
365          decl_2 = 2.0_wp * pi / 365.0_wp
366          decl_3 = decl_2 * 81.0_wp
367          lat    = phi * pi / 180.0_wp
368          lon    = lambda * pi / 180.0_wp
369       ENDIF
370
371
372       IF ( radiation_scheme == 'clear-sky' )  THEN
373
374          ALLOCATE ( alpha(nysg:nyng,nxlg:nxrg) )
375
376          IF ( .NOT. ALLOCATED ( rad_sw_in ) )  THEN
377             ALLOCATE ( rad_sw_in(0:0,nysg:nyng,nxlg:nxrg) )
378          ENDIF
379          IF ( .NOT. ALLOCATED ( rad_sw_out ) )  THEN
380             ALLOCATE ( rad_sw_out(0:0,nysg:nyng,nxlg:nxrg) )
381          ENDIF
382
383          IF ( .NOT. ALLOCATED ( rad_sw_in_av ) )  THEN
384             ALLOCATE ( rad_sw_in_av(0:0,nysg:nyng,nxlg:nxrg) )
385          ENDIF
386          IF ( .NOT. ALLOCATED ( rad_sw_out_av ) )  THEN
387             ALLOCATE ( rad_sw_out_av(0:0,nysg:nyng,nxlg:nxrg) )
388          ENDIF
389
390          IF ( .NOT. ALLOCATED ( rad_lw_in ) )  THEN
391             ALLOCATE ( rad_lw_in(0:0,nysg:nyng,nxlg:nxrg) )
392          ENDIF
393          IF ( .NOT. ALLOCATED ( rad_lw_out ) )  THEN
394             ALLOCATE ( rad_lw_out(0:0,nysg:nyng,nxlg:nxrg) )
395          ENDIF
396
397          IF ( .NOT. ALLOCATED ( rad_lw_in_av ) )  THEN
398             ALLOCATE ( rad_lw_in_av(0:0,nysg:nyng,nxlg:nxrg) )
399          ENDIF
400          IF ( .NOT. ALLOCATED ( rad_lw_out_av ) )  THEN
401             ALLOCATE ( rad_lw_out_av(0:0,nysg:nyng,nxlg:nxrg) )
402          ENDIF
403
404          rad_sw_in  = 0.0_wp
405          rad_sw_out = 0.0_wp
406          rad_lw_in  = 0.0_wp
407          rad_lw_out = 0.0_wp
408
409!
410!--       Overwrite albedo if manually set in parameter file
411          IF ( albedo_type /= 0 .AND. albedo == 9999999.9_wp )  THEN
412             albedo = albedo_pars(2,albedo_type)
413          ENDIF
414   
415          alpha = albedo
416 
417!
418!--    Initialization actions for RRTMG
419       ELSEIF ( radiation_scheme == 'rrtmg' )  THEN
420#if defined ( __rrtmg )
421!
422!--       Allocate albedos
423          ALLOCATE ( rrtm_aldif(0:0,nysg:nyng,nxlg:nxrg) )
424          ALLOCATE ( rrtm_aldir(0:0,nysg:nyng,nxlg:nxrg) )
425          ALLOCATE ( rrtm_asdif(0:0,nysg:nyng,nxlg:nxrg) )
426          ALLOCATE ( rrtm_asdir(0:0,nysg:nyng,nxlg:nxrg) )
427          ALLOCATE ( aldif(nysg:nyng,nxlg:nxrg) )
428          ALLOCATE ( aldir(nysg:nyng,nxlg:nxrg) )
429          ALLOCATE ( asdif(nysg:nyng,nxlg:nxrg) )
430          ALLOCATE ( asdir(nysg:nyng,nxlg:nxrg) )
431
432          IF ( albedo_type /= 0 )  THEN
433             IF ( albedo_lw_dif == 9999999.9_wp )  THEN
434                albedo_lw_dif = albedo_pars(0,albedo_type)
435                albedo_lw_dir = albedo_lw_dif
436             ENDIF
437             IF ( albedo_sw_dif == 9999999.9_wp )  THEN
438                albedo_sw_dif = albedo_pars(1,albedo_type)
439                albedo_sw_dir = albedo_sw_dif
440             ENDIF
441          ENDIF
442
443          aldif(:,:) = albedo_lw_dif
444          aldir(:,:) = albedo_lw_dir
445          asdif(:,:) = albedo_sw_dif
446          asdir(:,:) = albedo_sw_dir
447!
448!--       Calculate initial values of current (cosine of) the zenith angle and
449!--       whether the sun is up
450          CALL calc_zenith     
451!
452!--       Calculate initial surface albedo
453          IF ( .NOT. constant_albedo )  THEN
454             CALL calc_albedo
455          ELSE
456             rrtm_aldif(0,:,:) = aldif(:,:)
457             rrtm_aldir(0,:,:) = aldir(:,:)
458             rrtm_asdif(0,:,:) = asdif(:,:) 
459             rrtm_asdir(0,:,:) = asdir(:,:)   
460          ENDIF
461
462!
463!--       Allocate surface emissivity
464          ALLOCATE ( rrtm_emis(0:0,1:nbndlw+1) )
465          rrtm_emis = emissivity
466
467!
468!--       Allocate 3d arrays of radiative fluxes and heating rates
469          ALLOCATE ( rad_sw_hr(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) )
470          ALLOCATE ( rad_sw_cs_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
471          ALLOCATE ( rad_sw_cs_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
472          ALLOCATE ( rad_sw_cs_hr(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) )
473
474          IF ( .NOT. ALLOCATED ( rad_sw_in ) )  THEN
475             ALLOCATE ( rad_sw_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
476             rad_sw_in = 0.0_wp
477
478          ENDIF
479
480          IF ( .NOT. ALLOCATED ( rad_sw_in_av ) )  THEN
481             ALLOCATE ( rad_sw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
482             rad_sw_out = 0.0_wp
483          ENDIF
484
485          IF ( .NOT. ALLOCATED ( rad_sw_out ) )  THEN
486             ALLOCATE ( rad_sw_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
487          ENDIF
488
489          IF ( .NOT. ALLOCATED ( rad_sw_out_av ) )  THEN
490             ALLOCATE ( rad_sw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
491          ENDIF
492
493          ALLOCATE ( rad_lw_hr(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) )
494          ALLOCATE ( rad_lw_cs_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
495          ALLOCATE ( rad_lw_cs_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
496          ALLOCATE ( rad_lw_cs_hr(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) )
497
498          IF ( .NOT. ALLOCATED ( rad_lw_in ) )  THEN
499             ALLOCATE ( rad_lw_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
500             rad_lw_in     = 0.0_wp
501          ENDIF
502
503          IF ( .NOT. ALLOCATED ( rad_lw_in_av ) )  THEN
504             ALLOCATE ( rad_lw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
505          ENDIF
506
507          IF ( .NOT. ALLOCATED ( rad_lw_out ) )  THEN
508             ALLOCATE ( rad_lw_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
509            rad_lw_out    = 0.0_wp
510          ENDIF
511
512          IF ( .NOT. ALLOCATED ( rad_lw_out_av ) )  THEN
513             ALLOCATE ( rad_lw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
514          ENDIF
515
516          rad_sw_hr     = 0.0_wp
517          rad_sw_cs_in  = 0.0_wp
518          rad_sw_cs_out = 0.0_wp
519          rad_sw_cs_hr  = 0.0_wp
520
521          rad_lw_hr     = 0.0_wp
522          rad_lw_cs_in  = 0.0_wp
523          rad_lw_cs_out = 0.0_wp
524          rad_lw_cs_hr  = 0.0_wp
525
526!
527!--       Allocate dummy array for storing surface temperature
528          ALLOCATE ( rrtm_tsfc(1) )
529
530!
531!--       Initialize RRTMG
532          IF ( lw_radiation )  CALL rrtmg_lw_ini ( cp )
533          IF ( sw_radiation )  CALL rrtmg_sw_ini ( cp )
534
535!
536!--       Set input files for RRTMG
537          INQUIRE(FILE="RAD_SND_DATA", EXIST=snd_exists) 
538          IF ( .NOT. snd_exists )  THEN
539             rrtm_input_file = "rrtmg_lw.nc"
540          ENDIF
541
542!
543!--       Read vertical layers for RRTMG from sounding data
544!--       The routine provides nzt_rad, hyp_snd(1:nzt_rad),
545!--       t_snd(nzt+2:nzt_rad), rrtm_play(1:nzt_rad), rrtm_plev(1_nzt_rad+1),
546!--       rrtm_tlay(nzt+2:nzt_rad), rrtm_tlev(nzt+2:nzt_rad+1)
547          CALL read_sounding_data
548
549!
550!--       Read trace gas profiles from file. This routine provides
551!--       the rrtm_ arrays (1:nzt_rad+1)
552          CALL read_trace_gas_data
553#endif
554       ENDIF
555
556!
557!--    Perform user actions if required
558       CALL user_init_radiation
559
560
561!
562!--    Add timeseries for radiation model
563       dots_rad = dots_num + 1
564       dots_label(dots_num+1) = "rad_net"
565       dots_label(dots_num+2) = "rad_lw_in"
566       dots_label(dots_num+3) = "rad_lw_out"
567       dots_label(dots_num+4) = "rad_sw_in"
568       dots_label(dots_num+5) = "rad_sw_out"
569       dots_unit(dots_num+1:dots_num+5) = "W/m2"
570       dots_num  = dots_num + 5
571
572!
573!--    Output of albedos is only required for RRTMG
574       IF ( radiation_scheme == 'rrtmg' )  THEN
575          dots_label(dots_num+1) = "rrtm_aldif"
576          dots_label(dots_num+2) = "rrtm_aldir"
577          dots_label(dots_num+3) = "rrtm_asdif"
578          dots_label(dots_num+4) = "rrtm_asdir"
579          dots_unit(dots_num+1:dots_num+4) = ""
580          dots_num  = dots_num + 4
581       ENDIF
582
583!
584!--    Calculate radiative fluxes at model start
585       IF (  TRIM( initializing_actions ) /= 'read_restart_data' )  THEN
586          IF ( radiation_scheme == 'clear-sky' )  THEN
587              CALL radiation_clearsky
588          ELSEIF ( radiation_scheme == 'rrtmg' )  THEN
589             CALL radiation_rrtmg
590          ENDIF
591       ENDIF
592
593       RETURN
594
595    END SUBROUTINE init_radiation
596
597
598!------------------------------------------------------------------------------!
599! Description:
600! ------------
601!-- A simple clear sky radiation model
602!------------------------------------------------------------------------------!
603    SUBROUTINE radiation_clearsky
604
605       USE indices,                                                            &
606           ONLY:  nbgp
607
608       IMPLICIT NONE
609
610       INTEGER(iwp) :: i, j, k
611
612!
613!--    Calculate current zenith angle
614       CALL calc_zenith
615
616!
617!--    Calculate sky transmissivity
618       sky_trans = 0.6_wp + 0.2_wp * zenith(0)
619
620!
621!--    Calculate value of the Exner function
622       exn = (surface_pressure / 1000.0_wp )**0.286_wp
623!
624!--    Calculate radiation fluxes and net radiation (rad_net) for each grid
625!--    point
626       DO i = nxl, nxr
627          DO j = nys, nyn
628             k = nzb_s_inner(j,i)
629             rad_sw_in(0,j,i)  = solar_constant * sky_trans * zenith(0)
630             rad_sw_out(0,j,i) = alpha(j,i) * rad_sw_in(0,j,i)
631             rad_lw_out(0,j,i) = sigma_sb * (pt(k,j,i) * exn)**4
632             rad_lw_in(0,j,i)  = 0.8_wp * sigma_sb * (pt(k+1,j,i) * exn)**4
633             rad_net(j,i)      = rad_sw_in(0,j,i) - rad_sw_out(0,j,i)          &
634                                 + rad_lw_in(0,j,i) - rad_lw_out(0,j,i)
635
636          ENDDO
637       ENDDO
638
639       CALL exchange_horiz_2d( rad_lw_in,  nbgp )
640       CALL exchange_horiz_2d( rad_lw_out, nbgp )
641       CALL exchange_horiz_2d( rad_sw_in,  nbgp )
642       CALL exchange_horiz_2d( rad_sw_out, nbgp )
643       CALL exchange_horiz_2d( rad_net,    nbgp )
644
645       RETURN
646
647    END SUBROUTINE radiation_clearsky
648
649
650!------------------------------------------------------------------------------!
651! Description:
652! ------------
653!-- Implementation of the RRTMG radiation_scheme
654!------------------------------------------------------------------------------!
655    SUBROUTINE radiation_rrtmg
656
657       USE indices,                                                            &
658           ONLY:  nbgp
659
660       USE particle_attributes,                                                &
661           ONLY:  grid_particles, number_of_particles, particles,              &
662                  particle_advection_start, prt_count
663
664       IMPLICIT NONE
665
666#if defined ( __rrtmg )
667
668       INTEGER(iwp) :: i, j, k, n          !:
669
670       REAL(wp)     ::  s_r2      !: weighted sum over all droplets with r^2
671       REAL(wp)     ::  s_r3      !: weighted sum over all droplets with r^3
672
673!
674!--    Calculate current (cosine of) zenith angle and whether the sun is up
675       CALL calc_zenith     
676!
677!--    Calculate surface albedo
678       IF ( .NOT. constant_albedo )  THEN
679          CALL calc_albedo
680       ENDIF
681
682!
683!--    Prepare input data for RRTMG
684
685!
686!--    In case of large scale forcing with surface data, calculate new pressure
687!--    profile. nzt_rad might be modified by these calls and all required arrays
688!--    will then be re-allocated
689       IF ( large_scale_forcing  .AND.  lsf_surf ) THEN
690          CALL read_sounding_data
691          CALL read_trace_gas_data
692       ENDIF
693!
694!--    Loop over all grid points
695       DO i = nxl, nxr
696          DO j = nys, nyn
697
698!
699!--          Prepare profiles of temperature and H2O volume mixing ratio
700             rrtm_tlev(0,nzb+1) = pt(nzb,j,i)
701
702             DO k = nzb+1, nzt+1
703                rrtm_tlay(0,k) = pt(k,j,i) * ( (hyp(k) ) / 100000.0_wp         &
704                                 )**0.286_wp + ( l_v / cp ) * ql(k,j,i)
705                rrtm_h2ovmr(0,k) = mol_weight_air_d_wv * (q(k,j,i) - ql(k,j,i))
706
707             ENDDO
708
709!
710!--          Avoid temperature/humidity jumps at the top of the LES domain by
711!--          linear interpolation from nzt+2 to nzt+7
712             DO k = nzt+2, nzt+7
713                rrtm_tlay(0,k) = rrtm_tlay(0,nzt+1)                            &
714                              + ( rrtm_tlay(0,nzt+8) - rrtm_tlay(0,nzt+1) )    &
715                              / ( rrtm_play(0,nzt+8) - rrtm_play(0,nzt+1) )    &
716                              * ( rrtm_play(0,k) - rrtm_play(0,nzt+1) )
717
718                rrtm_h2ovmr(0,k) = rrtm_h2ovmr(0,nzt+1)                        &
719                              + ( rrtm_h2ovmr(0,nzt+8) - rrtm_h2ovmr(0,nzt+1) )&
720                              / ( rrtm_play(0,nzt+8)   - rrtm_play(0,nzt+1)   )&
721                              * ( rrtm_play(0,k) - rrtm_play(0,nzt+1) )
722
723             ENDDO
724
725!--          Linear interpolate to zw grid
726             DO k = nzb+2, nzt+8
727                rrtm_tlev(0,k)   = rrtm_tlay(0,k-1) + (rrtm_tlay(0,k) -        &
728                                   rrtm_tlay(0,k-1))                           &
729                                   / ( rrtm_play(0,k) - rrtm_play(0,k-1) )     &
730                                   * ( rrtm_plev(0,k) - rrtm_play(0,k-1) )
731             ENDDO
732
733
734!
735!--          Calculate liquid water path and cloud fraction for each column.
736!--          Note that LWP is required in g/m² instead of kg/kg m.
737             rrtm_cldfr  = 0.0_wp
738             rrtm_reliq  = 0.0_wp
739             rrtm_cliqwp = 0.0_wp
740
741             DO k = nzb+1, nzt+1
742                rrtm_cliqwp(0,k) =  ql(k,j,i) * 1000.0_wp *                      &
743                                  (rrtm_plev(0,k) - rrtm_plev(0,k+1)) * 100.0_wp / g 
744
745                IF ( rrtm_cliqwp(0,k) .GT. 0 )  THEN
746                   rrtm_cldfr(0,k) = 1.0_wp
747                   rrtm_icld = 1
748
749!
750!--                Calculate cloud droplet effective radius
751                   IF ( cloud_physics )  THEN
752                      rrtm_reliq(0,k) = 1.0E6_wp * ( 3.0_wp * ql(k,j,i)          &
753                                      / ( 4.0_wp * pi * nc_const * rho_l )     &
754                                      )**0.33333333333333_wp                   &
755                                     * EXP( LOG( sigma_gc )**2 )
756
757                   ELSEIF ( cloud_droplets )  THEN
758                      number_of_particles = prt_count(k,j,i)
759
760                      IF (number_of_particles <= 0)  CYCLE
761                      particles => grid_particles(k,j,i)%particles(1:number_of_particles)
762                      s_r2 = 0.0_wp
763                      s_r3 = 0.0_wp
764
765                      DO  n = 1, number_of_particles
766                         IF ( particles(n)%particle_mask )  THEN
767                            s_r2 = s_r2 + particles(n)%radius**2 * &
768                                   particles(n)%weight_factor
769                            s_r3 = s_r3 + particles(n)%radius**3 * &
770                                   particles(n)%weight_factor
771                         ENDIF
772                      ENDDO
773
774                      IF ( s_r2 > 0.0_wp )  rrtm_reliq(0,k) = s_r3 / s_r2
775
776                   ENDIF
777
778!
779!--                Limit effective radius
780                   IF ( rrtm_reliq(0,k) .GT. 0.0_wp )  THEN
781                      rrtm_reliq(0,k) = MAX(rrtm_reliq(0,k),2.5_wp)
782                      rrtm_reliq(0,k) = MIN(rrtm_reliq(0,k),60.0_wp)
783                  ENDIF
784                ELSE
785                   rrtm_icld = 0
786                ENDIF
787             ENDDO
788
789!
790!--          Set surface temperature
791             rrtm_tsfc = pt(nzb,j,i) * (surface_pressure / 1000.0_wp )**0.286_wp
792
793             IF ( lw_radiation )  THEN
794               CALL rrtmg_lw( 1, nzt_rad      , rrtm_icld    , rrtm_idrv      ,&
795               rrtm_play       , rrtm_plev    , rrtm_tlay    , rrtm_tlev      ,&
796               rrtm_tsfc       , rrtm_h2ovmr  , rrtm_o3vmr   , rrtm_co2vmr    ,&
797               rrtm_ch4vmr     , rrtm_n2ovmr  , rrtm_o2vmr   , rrtm_cfc11vmr  ,&
798               rrtm_cfc12vmr   , rrtm_cfc22vmr, rrtm_ccl4vmr , rrtm_emis      ,&
799               rrtm_inflglw    , rrtm_iceflglw, rrtm_liqflglw, rrtm_cldfr     ,&
800               rrtm_lw_taucld  , rrtm_cicewp  , rrtm_cliqwp  , rrtm_reice     ,& 
801               rrtm_reliq      , rrtm_lw_tauaer,                               &
802               rrtm_lwuflx     , rrtm_lwdflx  , rrtm_lwhr  ,                   &
803               rrtm_lwuflxc    , rrtm_lwdflxc , rrtm_lwhrc )
804
805                DO k = nzb, nzt+1
806                   rad_lw_in(k,j,i)  = rrtm_lwdflx(0,k)
807                   rad_lw_out(k,j,i) = rrtm_lwuflx(0,k)
808                ENDDO
809
810
811             ENDIF
812
813             IF ( sw_radiation .AND. sun_up )  THEN
814                CALL rrtmg_sw( 1, nzt_rad      , rrtm_icld  , rrtm_iaer       ,&
815               rrtm_play       , rrtm_plev    , rrtm_tlay  , rrtm_tlev        ,&
816               rrtm_tsfc       , rrtm_h2ovmr  , rrtm_o3vmr , rrtm_co2vmr      ,&
817               rrtm_ch4vmr     , rrtm_n2ovmr  , rrtm_o2vmr , rrtm_asdir(:,j,i),&
818               rrtm_asdif(:,j,i), rrtm_aldir(:,j,i), rrtm_aldif(:,j,i), zenith,&
819               0.0_wp          , day          , solar_constant,   rrtm_inflgsw,&
820               rrtm_iceflgsw   , rrtm_liqflgsw, rrtm_cldfr , rrtm_sw_taucld   ,&
821               rrtm_sw_ssacld  , rrtm_sw_asmcld, rrtm_sw_fsfcld, rrtm_cicewp  ,&
822               rrtm_cliqwp     , rrtm_reice   , rrtm_reliq , rrtm_sw_tauaer   ,&
823               rrtm_sw_ssaaer     , rrtm_sw_asmaer  , rrtm_sw_ecaer ,          &
824               rrtm_swuflx     , rrtm_swdflx  , rrtm_swhr  ,                   &
825               rrtm_swuflxc    , rrtm_swdflxc , rrtm_swhrc )
826 
827                DO k = nzb, nzt+1
828                   rad_sw_in(k,j,i)  = rrtm_swdflx(0,k)
829                   rad_sw_out(k,j,i) = rrtm_swuflx(0,k)
830                ENDDO
831             ENDIF
832
833!
834!--          Calculate surface net radiation
835             rad_net(j,i) = rad_sw_in(nzb,j,i) - rad_sw_out(nzb,j,i)           &
836                            + rad_lw_in(nzb,j,i) - rad_lw_out(nzb,j,i)
837
838          ENDDO
839       ENDDO
840
841       CALL exchange_horiz( rad_lw_in,  nbgp )
842       CALL exchange_horiz( rad_lw_out, nbgp )
843       CALL exchange_horiz( rad_sw_in,  nbgp )
844       CALL exchange_horiz( rad_sw_out, nbgp ) 
845       CALL exchange_horiz_2d( rad_net, nbgp )
846#endif
847
848    END SUBROUTINE radiation_rrtmg
849
850
851!------------------------------------------------------------------------------!
852! Description:
853! ------------
854!-- Calculate the cosine of the zenith angle (variable is called zenith)
855!------------------------------------------------------------------------------!
856    SUBROUTINE calc_zenith
857
858       IMPLICIT NONE
859
860       REAL(wp) ::  declination,  & !: solar declination angle
861                    hour_angle      !: solar hour angle
862!
863!--    Calculate current day and time based on the initial values and simulation
864!--    time
865       day = day_init + INT(FLOOR( (time_utc_init + time_since_reference_point)    &
866                               / 86400.0_wp ), KIND=iwp)
867       time_utc = MOD((time_utc_init + time_since_reference_point), 86400.0_wp)
868
869
870!
871!--    Calculate solar declination and hour angle   
872       declination = ASIN( decl_1 * SIN(decl_2 * REAL(day, KIND=wp) - decl_3) )
873       hour_angle  = 2.0_wp * pi * (time_utc / 86400.0_wp) + lon - pi
874
875!
876!--    Calculate zenith angle
877       zenith(0) = SIN(lat) * SIN(declination) + COS(lat) * COS(declination)      &
878                                            * COS(hour_angle)
879       zenith(0) = MAX(0.0_wp,zenith(0))
880
881!
882!--    Check if the sun is up (otheriwse shortwave calculations can be skipped)
883       IF ( zenith(0) .GT. 0.0_wp )  THEN
884          sun_up = .TRUE.
885       ELSE
886          sun_up = .FALSE.
887       END IF
888
889    END SUBROUTINE calc_zenith
890
891#if defined ( __rrtmg )
892!------------------------------------------------------------------------------!
893! Description:
894! ------------
895!-- Calculates surface albedo components based on Briegleb (1992) and
896!-- Briegleb et al. (1986)
897!------------------------------------------------------------------------------!
898    SUBROUTINE calc_albedo
899
900        IMPLICIT NONE
901
902        IF ( sun_up )  THEN
903!
904!--        Ocean
905           IF ( albedo_type == 1 )  THEN
906              rrtm_aldir(0,:,:) = 0.026_wp / ( zenith(0)**1.7_wp + 0.065_wp )  &
907                                  + 0.15_wp * ( zenith(0) - 0.1_wp )           &
908                                            * ( zenith(0) - 0.5_wp )           &
909                                            * ( zenith(0) - 1.0_wp )
910              rrtm_asdir(0,:,:) = rrtm_aldir(0,:,:)
911!
912!--        Snow
913           ELSEIF ( albedo_type == 16 )  THEN
914              IF ( zenith(0) < 0.5_wp )  THEN
915                 rrtm_aldir(0,:,:) = 0.5_wp * (1.0_wp - aldif)                 &
916                                     * ( 3.0_wp / (1.0_wp + 4.0_wp             &
917                                     * zenith(0))) - 1.0_wp
918                 rrtm_asdir(0,:,:) = 0.5_wp * (1.0_wp - asdif)                 &
919                                     * ( 3.0_wp / (1.0_wp + 4.0_wp             &
920                                     * zenith(0))) - 1.0_wp
921
922                 rrtm_aldir(0,:,:) = MIN(0.98_wp, rrtm_aldir(0,:,:))
923                 rrtm_asdir(0,:,:) = MIN(0.98_wp, rrtm_asdir(0,:,:))
924              ELSE
925                 rrtm_aldir(0,:,:) = aldif
926                 rrtm_asdir(0,:,:) = asdif
927              ENDIF
928!
929!--        Sea ice
930           ELSEIF ( albedo_type == 15 )  THEN
931                 rrtm_aldir(0,:,:) = aldif
932                 rrtm_asdir(0,:,:) = asdif
933!
934!--        Land surfaces
935           ELSE
936              SELECT CASE ( albedo_type )
937
938!
939!--              Surface types with strong zenith dependence
940                 CASE ( 1, 2, 3, 4, 11, 12, 13 )
941                    rrtm_aldir(0,:,:) = aldif * 1.4_wp /                       &
942                                        (1.0_wp + 0.8_wp * zenith(0))
943                    rrtm_asdir(0,:,:) = asdif * 1.4_wp /                       &
944                                        (1.0_wp + 0.8_wp * zenith(0))
945!
946!--              Surface types with weak zenith dependence
947                 CASE ( 5, 6, 7, 8, 9, 10, 14 )
948                    rrtm_aldir(0,:,:) = aldif * 1.1_wp /                       &
949                                        (1.0_wp + 0.2_wp * zenith(0))
950                    rrtm_asdir(0,:,:) = asdif * 1.1_wp /                       &
951                                        (1.0_wp + 0.2_wp * zenith(0))
952
953                 CASE DEFAULT
954
955              END SELECT
956           ENDIF
957!
958!--        Diffusive albedo is taken from Table 2
959           rrtm_aldif(0,:,:) = aldif
960           rrtm_asdif(0,:,:) = asdif
961
962        ELSE
963
964           rrtm_aldir(0,:,:) = 0.0_wp
965           rrtm_asdir(0,:,:) = 0.0_wp
966           rrtm_aldif(0,:,:) = 0.0_wp
967           rrtm_asdif(0,:,:) = 0.0_wp
968        ENDIF
969    END SUBROUTINE calc_albedo
970
971!------------------------------------------------------------------------------!
972! Description:
973! ------------
974!-- Read sounding data (pressure and temperature) from RADIATION_DATA.
975!------------------------------------------------------------------------------!
976    SUBROUTINE read_sounding_data
977
978       USE netcdf_control
979
980       IMPLICIT NONE
981
982       INTEGER(iwp) :: id, id_dim_zrad, id_var, k, nz_snd, nz_snd_start, nz_snd_end
983
984       REAL(wp) :: t_surface
985
986       REAL(wp), DIMENSION(:), ALLOCATABLE ::  hyp_snd_tmp, t_snd_tmp
987
988!
989!--    In case of updates, deallocate arrays first (sufficient to check one
990!--    array as the others are automatically allocated). This is required
991!--    because nzt_rad might change during the update
992       IF ( ALLOCATED ( hyp_snd ) )  THEN
993          DEALLOCATE( hyp_snd )
994          DEALLOCATE( t_snd )
995          DEALLOCATE( q_snd  )
996          DEALLOCATE ( rrtm_play )
997          DEALLOCATE ( rrtm_plev )
998          DEALLOCATE ( rrtm_tlay )
999          DEALLOCATE ( rrtm_tlev )
1000          DEALLOCATE ( rrtm_h2ovmr )
1001          DEALLOCATE ( rrtm_cicewp )
1002          DEALLOCATE ( rrtm_cldfr )
1003          DEALLOCATE ( rrtm_cliqwp )
1004          DEALLOCATE ( rrtm_reice )
1005          DEALLOCATE ( rrtm_reliq )
1006          DEALLOCATE ( rrtm_lw_taucld )
1007          DEALLOCATE ( rrtm_lw_tauaer )
1008          DEALLOCATE ( rrtm_lwdflx  )
1009          DEALLOCATE ( rrtm_lwuflx  )
1010          DEALLOCATE ( rrtm_lwhr  )
1011          DEALLOCATE ( rrtm_lwuflxc )
1012          DEALLOCATE ( rrtm_lwdflxc )
1013          DEALLOCATE ( rrtm_lwhrc )
1014          DEALLOCATE ( rrtm_sw_taucld )
1015          DEALLOCATE ( rrtm_sw_ssacld )
1016          DEALLOCATE ( rrtm_sw_asmcld )
1017          DEALLOCATE ( rrtm_sw_fsfcld )
1018          DEALLOCATE ( rrtm_sw_tauaer )
1019          DEALLOCATE ( rrtm_sw_ssaaer )
1020          DEALLOCATE ( rrtm_sw_asmaer ) 
1021          DEALLOCATE ( rrtm_sw_ecaer )   
1022          DEALLOCATE ( rrtm_swdflx  )
1023          DEALLOCATE ( rrtm_swuflx  )
1024          DEALLOCATE ( rrtm_swhr  )
1025          DEALLOCATE ( rrtm_swuflxc )
1026          DEALLOCATE ( rrtm_swdflxc )
1027          DEALLOCATE ( rrtm_swhrc )
1028       ENDIF
1029
1030!
1031!--    Open file for reading
1032       nc_stat = NF90_OPEN( rrtm_input_file, NF90_NOWRITE, id )
1033       CALL handle_netcdf_error( 'netcdf', 549 )
1034
1035!
1036!--    Inquire dimension of z axis and save in nz_snd
1037       nc_stat = NF90_INQ_DIMID( id, "Pressure", id_dim_zrad )
1038       nc_stat = NF90_INQUIRE_DIMENSION( id, id_dim_zrad, len = nz_snd )
1039       CALL handle_netcdf_error( 'netcdf', 551 )
1040
1041!
1042! !--    Allocate temporary array for storing pressure data
1043       ALLOCATE( hyp_snd_tmp(nzb+1:nz_snd) )
1044       hyp_snd_tmp = 0.0_wp
1045
1046
1047!--    Read pressure from file
1048       nc_stat = NF90_INQ_VARID( id, "Pressure", id_var )
1049       nc_stat = NF90_GET_VAR( id, id_var, hyp_snd_tmp(:), start = (/1/),    &
1050                               count = (/nz_snd/) )
1051       CALL handle_netcdf_error( 'netcdf', 552 )
1052
1053!
1054!--    Allocate temporary array for storing temperature data
1055       ALLOCATE( t_snd_tmp(nzb+1:nz_snd) )
1056       t_snd_tmp = 0.0_wp
1057
1058!
1059!--    Read temperature from file
1060       nc_stat = NF90_INQ_VARID( id, "ReferenceTemperature", id_var )
1061       nc_stat = NF90_GET_VAR( id, id_var, t_snd_tmp(:), start = (/1/),      &
1062                               count = (/nz_snd/) )
1063       CALL handle_netcdf_error( 'netcdf', 553 )
1064
1065!
1066!--    Calculate start of sounding data
1067       nz_snd_start = nz_snd + 1
1068       nz_snd_end   = nz_snd_end
1069
1070!
1071!--    Start filling vertical dimension at 10hPa above the model domain (hyp is
1072!--    in Pa, hyp_snd in hPa).
1073       DO  k = 1, nz_snd
1074          IF ( hyp_snd_tmp(k) .LT. (hyp(nzt+1) - 1000.0_wp) * 0.01_wp )  THEN
1075             nz_snd_start = k
1076             EXIT
1077          END IF
1078       END DO
1079
1080       IF ( nz_snd_start .LE. nz_snd )  THEN
1081          nz_snd_end = nz_snd - 1
1082       END IF
1083
1084
1085!
1086!--    Calculate of total grid points for RRTMG calculations
1087       nzt_rad = nzt + nz_snd_end - nz_snd_start + 2
1088
1089!
1090!--    Save data above LES domain in hyp_snd, t_snd and q_snd
1091!--    Note: q_snd_tmp is not calculated at the moment (dry residual atmosphere)
1092       ALLOCATE( hyp_snd(nzb+1:nzt_rad) )
1093       ALLOCATE( t_snd(nzb+1:nzt_rad)   )
1094       ALLOCATE( q_snd(nzb+1:nzt_rad)   )
1095       hyp_snd = 0.0_wp
1096       t_snd = 0.0_wp
1097       q_snd = 0.0_wp
1098
1099       hyp_snd(nzt+2:nzt_rad) = hyp_snd_tmp(nz_snd_start:nz_snd_end)
1100       t_snd(nzt+2:nzt_rad)   = t_snd_tmp(nz_snd_start:nz_snd_end)
1101
1102       DEALLOCATE ( hyp_snd_tmp )
1103       DEALLOCATE ( t_snd_tmp )
1104
1105       nc_stat = NF90_CLOSE( id )
1106
1107!
1108!--    Calculate pressure levels on zu and zw grid. Sounding data is added at
1109!--    top of the LES domain. This routine does not consider horizontal or
1110!--    vertical variability of pressure and temperature
1111       ALLOCATE ( rrtm_play(0:0,nzb+1:nzt_rad+1)   )
1112       ALLOCATE ( rrtm_plev(0:0,nzb+1:nzt_rad+2)   )
1113
1114       t_surface = pt_surface * (surface_pressure / 1000.0_wp )**0.286_wp
1115       DO k = nzb+1, nzt+1
1116          rrtm_play(0,k) = hyp(k) * 0.01_wp
1117          rrtm_plev(0,k) = surface_pressure * ( (t_surface - g/cp * zw(k-1)) / &
1118                         t_surface )**(1.0_wp/0.286_wp)
1119       ENDDO
1120
1121       DO k = nzt+2, nzt_rad
1122          rrtm_play(0,k) = hyp_snd(k)
1123          rrtm_plev(0,k) = 0.5_wp * ( rrtm_play(0,k) + rrtm_play(0,k-1) )
1124       ENDDO
1125       rrtm_plev(0,nzt_rad+1) = MAX( 0.5 * hyp_snd(nzt_rad),                   &
1126                                   1.5 * hyp_snd(nzt_rad)                      &
1127                                 - 0.5 * hyp_snd(nzt_rad-1) )
1128       rrtm_plev(0,nzt_rad+2)  = MIN( 1.0E-4_wp,                               &
1129                                      0.25_wp * rrtm_plev(0,nzt_rad+1) )
1130
1131       rrtm_play(0,nzt_rad+1) = 0.5 * rrtm_plev(0,nzt_rad+1)
1132
1133!
1134!--    Calculate temperature/humidity levels at top of the LES domain.
1135!--    Currently, the temperature is taken from sounding data (might lead to a
1136!--    temperature jump at interface. To do: Humidity is currently not
1137!--    calculated above the LES domain.
1138       ALLOCATE ( rrtm_tlay(0:0,nzb+1:nzt_rad+1)   )
1139       ALLOCATE ( rrtm_tlev(0:0,nzb+1:nzt_rad+2)   )
1140       ALLOCATE ( rrtm_h2ovmr(0:0,nzb+1:nzt_rad+1) )
1141
1142       DO k = nzt+8, nzt_rad
1143          rrtm_tlay(0,k)   = t_snd(k)
1144          rrtm_h2ovmr(0,k) = q_snd(k)
1145       ENDDO
1146       rrtm_tlay(0,nzt_rad+1)   = 2.0_wp * rrtm_tlay(0,nzt_rad)                &
1147                                  - rrtm_tlay(0,nzt_rad-1)
1148       DO k = nzt+9, nzt_rad+1
1149          rrtm_tlev(0,k)   = rrtm_tlay(0,k-1) + (rrtm_tlay(0,k)                &
1150                             - rrtm_tlay(0,k-1))                               &
1151                             / ( rrtm_play(0,k) - rrtm_play(0,k-1) )           &
1152                             * ( rrtm_plev(0,k) - rrtm_play(0,k-1) )
1153       ENDDO
1154       rrtm_h2ovmr(0,nzt_rad+1) = rrtm_h2ovmr(0,nzt_rad)
1155
1156       rrtm_tlev(0,nzt_rad+2)   = 2.0_wp * rrtm_tlay(0,nzt_rad+1)              &
1157                                  - rrtm_tlev(0,nzt_rad)
1158!
1159!--    Allocate remaining RRTMG arrays
1160       ALLOCATE ( rrtm_cicewp(0:0,nzb+1:nzt_rad+1) )
1161       ALLOCATE ( rrtm_cldfr(0:0,nzb+1:nzt_rad+1) )
1162       ALLOCATE ( rrtm_cliqwp(0:0,nzb+1:nzt_rad+1) )
1163       ALLOCATE ( rrtm_reice(0:0,nzb+1:nzt_rad+1) )
1164       ALLOCATE ( rrtm_reliq(0:0,nzb+1:nzt_rad+1) )
1165       ALLOCATE ( rrtm_lw_taucld(1:nbndlw+1,0:0,nzb+1:nzt_rad+1) )
1166       ALLOCATE ( rrtm_lw_tauaer(0:0,nzb+1:nzt_rad+1,1:nbndlw+1) )
1167       ALLOCATE ( rrtm_sw_taucld(1:nbndsw+1,0:0,nzb+1:nzt_rad+1) )
1168       ALLOCATE ( rrtm_sw_ssacld(1:nbndsw+1,0:0,nzb+1:nzt_rad+1) )
1169       ALLOCATE ( rrtm_sw_asmcld(1:nbndsw+1,0:0,nzb+1:nzt_rad+1) )
1170       ALLOCATE ( rrtm_sw_fsfcld(1:nbndsw+1,0:0,nzb+1:nzt_rad+1) )
1171       ALLOCATE ( rrtm_sw_tauaer(0:0,nzb+1:nzt_rad+1,1:nbndsw+1) )
1172       ALLOCATE ( rrtm_sw_ssaaer(0:0,nzb+1:nzt_rad+1,1:nbndsw+1) )
1173       ALLOCATE ( rrtm_sw_asmaer(0:0,nzb+1:nzt_rad+1,1:nbndsw+1) ) 
1174       ALLOCATE ( rrtm_sw_ecaer(0:0,nzb+1:nzt_rad+1,1:naerec+1) )   
1175
1176!
1177!--    The ice phase is currently not considered in PALM
1178       rrtm_cicewp = 0.0_wp
1179       rrtm_reice  = 0.0_wp
1180
1181!
1182!--    Set other parameters (move to NAMELIST parameters in the future)
1183       rrtm_lw_tauaer = 0.0_wp
1184       rrtm_lw_taucld = 0.0_wp
1185       rrtm_sw_taucld = 0.0_wp
1186       rrtm_sw_ssacld = 0.0_wp
1187       rrtm_sw_asmcld = 0.0_wp
1188       rrtm_sw_fsfcld = 0.0_wp
1189       rrtm_sw_tauaer = 0.0_wp
1190       rrtm_sw_ssaaer = 0.0_wp
1191       rrtm_sw_asmaer = 0.0_wp
1192       rrtm_sw_ecaer  = 0.0_wp
1193
1194
1195       ALLOCATE ( rrtm_swdflx(0:0,nzb:nzt_rad+1)  )
1196       ALLOCATE ( rrtm_swuflx(0:0,nzb:nzt_rad+1)  )
1197       ALLOCATE ( rrtm_swhr(0:0,nzb+1:nzt_rad+1)  )
1198       ALLOCATE ( rrtm_swuflxc(0:0,nzb:nzt_rad+1) )
1199       ALLOCATE ( rrtm_swdflxc(0:0,nzb:nzt_rad+1) )
1200       ALLOCATE ( rrtm_swhrc(0:0,nzb+1:nzt_rad+1) )
1201
1202       rrtm_swdflx  = 0.0_wp
1203       rrtm_swuflx  = 0.0_wp
1204       rrtm_swhr    = 0.0_wp 
1205       rrtm_swuflxc = 0.0_wp
1206       rrtm_swdflxc = 0.0_wp
1207       rrtm_swhrc   = 0.0_wp
1208
1209       ALLOCATE ( rrtm_lwdflx(0:0,nzb:nzt_rad+1)  )
1210       ALLOCATE ( rrtm_lwuflx(0:0,nzb:nzt_rad+1)  )
1211       ALLOCATE ( rrtm_lwhr(0:0,nzb+1:nzt_rad+1)  )
1212       ALLOCATE ( rrtm_lwuflxc(0:0,nzb:nzt_rad+1) )
1213       ALLOCATE ( rrtm_lwdflxc(0:0,nzb:nzt_rad+1) )
1214       ALLOCATE ( rrtm_lwhrc(0:0,nzb+1:nzt_rad+1) )
1215
1216       rrtm_lwdflx  = 0.0_wp
1217       rrtm_lwuflx  = 0.0_wp
1218       rrtm_lwhr    = 0.0_wp 
1219       rrtm_lwuflxc = 0.0_wp
1220       rrtm_lwdflxc = 0.0_wp
1221       rrtm_lwhrc   = 0.0_wp
1222
1223
1224    END SUBROUTINE read_sounding_data
1225
1226
1227!------------------------------------------------------------------------------!
1228! Description:
1229! ------------
1230!-- Read trace gas data from file
1231!------------------------------------------------------------------------------!
1232    SUBROUTINE read_trace_gas_data
1233
1234       USE netcdf_control
1235       USE rrsw_ncpar
1236
1237       IMPLICIT NONE
1238
1239       INTEGER(iwp), PARAMETER :: num_trace_gases = 9 !: number of trace gases
1240
1241       CHARACTER(LEN=5), DIMENSION(num_trace_gases), PARAMETER ::              &
1242           trace_names = (/'O3   ', 'CO2  ', 'CH4  ', 'N2O  ', 'O2   ',        &
1243                           'CFC11', 'CFC12', 'CFC22', 'CCL4 '/)
1244
1245       INTEGER(iwp) :: id, k, m, n, nabs, np, id_abs, id_dim, id_var
1246
1247       REAL(wp) :: p_mls_l, p_mls_u, p_wgt_l, p_wgt_u, p_mls_m
1248
1249
1250       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  p_mls,         & !: pressure levels for the absorbers
1251                                                 rrtm_play_tmp, & !: temporary array for pressure zu-levels
1252                                                 rrtm_plev_tmp, & !: temporary array for pressure zw-levels
1253                                                 trace_path_tmp   !: temporary array for storing trace gas path data
1254
1255       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  trace_mls,      & !: array for storing the absorber amounts
1256                                                 trace_mls_path, & !: array for storing trace gas path data
1257                                                 trace_mls_tmp     !: temporary array for storing trace gas data
1258
1259
1260!
1261!--    In case of updates, deallocate arrays first (sufficient to check one
1262!--    array as the others are automatically allocated)
1263       IF ( ALLOCATED ( rrtm_o3vmr ) )  THEN
1264          DEALLOCATE ( rrtm_o3vmr  )
1265          DEALLOCATE ( rrtm_co2vmr )
1266          DEALLOCATE ( rrtm_ch4vmr )
1267          DEALLOCATE ( rrtm_n2ovmr )
1268          DEALLOCATE ( rrtm_o2vmr  )
1269          DEALLOCATE ( rrtm_cfc11vmr )
1270          DEALLOCATE ( rrtm_cfc12vmr )
1271          DEALLOCATE ( rrtm_cfc22vmr )
1272          DEALLOCATE ( rrtm_ccl4vmr  )
1273       ENDIF
1274
1275!
1276!--    Allocate trace gas profiles
1277       ALLOCATE ( rrtm_o3vmr(0:0,1:nzt_rad+1)  )
1278       ALLOCATE ( rrtm_co2vmr(0:0,1:nzt_rad+1) )
1279       ALLOCATE ( rrtm_ch4vmr(0:0,1:nzt_rad+1) )
1280       ALLOCATE ( rrtm_n2ovmr(0:0,1:nzt_rad+1) )
1281       ALLOCATE ( rrtm_o2vmr(0:0,1:nzt_rad+1)  )
1282       ALLOCATE ( rrtm_cfc11vmr(0:0,1:nzt_rad+1) )
1283       ALLOCATE ( rrtm_cfc12vmr(0:0,1:nzt_rad+1) )
1284       ALLOCATE ( rrtm_cfc22vmr(0:0,1:nzt_rad+1) )
1285       ALLOCATE ( rrtm_ccl4vmr(0:0,1:nzt_rad+1)  )
1286
1287!
1288!--    Open file for reading
1289       nc_stat = NF90_OPEN( rrtm_input_file, NF90_NOWRITE, id )
1290       CALL handle_netcdf_error( 'netcdf', 549 )
1291!
1292!--    Inquire dimension ids and dimensions
1293       nc_stat = NF90_INQ_DIMID( id, "Pressure", id_dim )
1294       CALL handle_netcdf_error( 'netcdf', 550 )
1295       nc_stat = NF90_INQUIRE_DIMENSION( id, id_dim, len = np) 
1296       CALL handle_netcdf_error( 'netcdf', 550 )
1297
1298       nc_stat = NF90_INQ_DIMID( id, "Absorber", id_dim )
1299       CALL handle_netcdf_error( 'netcdf', 550 )
1300       nc_stat = NF90_INQUIRE_DIMENSION( id, id_dim, len = nabs ) 
1301       CALL handle_netcdf_error( 'netcdf', 550 )
1302   
1303
1304!
1305!--    Allocate pressure, and trace gas arrays     
1306       ALLOCATE( p_mls(1:np) )
1307       ALLOCATE( trace_mls(1:num_trace_gases,1:np) ) 
1308       ALLOCATE( trace_mls_tmp(1:nabs,1:np) ) 
1309
1310
1311       nc_stat = NF90_INQ_VARID( id, "Pressure", id_var )
1312       CALL handle_netcdf_error( 'netcdf', 550 )
1313       nc_stat = NF90_GET_VAR( id, id_var, p_mls )
1314       CALL handle_netcdf_error( 'netcdf', 550 )
1315
1316       nc_stat = NF90_INQ_VARID( id, "AbsorberAmountMLS", id_var )
1317       CALL handle_netcdf_error( 'netcdf', 550 )
1318       nc_stat = NF90_GET_VAR( id, id_var, trace_mls_tmp )
1319       CALL handle_netcdf_error( 'netcdf', 550 )
1320
1321
1322!
1323!--    Write absorber amounts (mls) to trace_mls
1324       DO n = 1, num_trace_gases
1325          CALL getAbsorberIndex( TRIM( trace_names(n) ), id_abs )
1326
1327          trace_mls(n,1:np) = trace_mls_tmp(id_abs,1:np)
1328
1329!
1330!--       Replace missing values by zero
1331          WHERE ( trace_mls(n,:) > 2.0_wp ) 
1332             trace_mls(n,:) = 0.0_wp
1333          END WHERE
1334       END DO
1335
1336       DEALLOCATE ( trace_mls_tmp )
1337
1338       nc_stat = NF90_CLOSE( id )
1339       CALL handle_netcdf_error( 'netcdf', 551 )
1340
1341!
1342!--    Add extra pressure level for calculations of the trace gas paths
1343       ALLOCATE ( rrtm_play_tmp(1:nzt_rad+1) )
1344       ALLOCATE ( rrtm_plev_tmp(1:nzt_rad+2) )
1345
1346       rrtm_play_tmp(1:nzt_rad)   = rrtm_play(0,1:nzt_rad) 
1347       rrtm_plev_tmp(1:nzt_rad+1) = rrtm_plev(0,1:nzt_rad+1)
1348       rrtm_play_tmp(nzt_rad+1)   = rrtm_plev(0,nzt_rad+1) * 0.5_wp
1349       rrtm_plev_tmp(nzt_rad+2)   = MIN( 1.0E-4_wp, 0.25_wp                    &
1350                                         * rrtm_plev(0,nzt_rad+1) )
1351 
1352!
1353!--    Calculate trace gas path (zero at surface) with interpolation to the
1354!--    sounding levels
1355       ALLOCATE ( trace_mls_path(1:nzt_rad+2,1:num_trace_gases) )
1356
1357       trace_mls_path(nzb+1,:) = 0.0_wp
1358       
1359       DO k = nzb+2, nzt_rad+2
1360          DO m = 1, num_trace_gases
1361             trace_mls_path(k,m) = trace_mls_path(k-1,m)
1362
1363!
1364!--          When the pressure level is higher than the trace gas pressure
1365!--          level, assume that
1366             IF ( rrtm_plev_tmp(k-1) .GT. p_mls(1) )  THEN             
1367               
1368                trace_mls_path(k,m) = trace_mls_path(k,m) + trace_mls(m,1)     &
1369                                      * ( rrtm_plev_tmp(k-1)                   &
1370                                          - MAX( p_mls(1), rrtm_plev_tmp(k) )  &
1371                                        ) / g
1372             ENDIF
1373
1374!
1375!--          Integrate for each sounding level from the contributing p_mls
1376!--          levels
1377             DO n = 2, np
1378!
1379!--             Limit p_mls so that it is within the model level
1380                p_mls_u = MIN( rrtm_plev_tmp(k-1),                             &
1381                          MAX( rrtm_plev_tmp(k), p_mls(n) ) )
1382                p_mls_l = MIN( rrtm_plev_tmp(k-1),                             &
1383                          MAX( rrtm_plev_tmp(k), p_mls(n-1) ) )
1384
1385                IF ( p_mls_l .GT. p_mls_u )  THEN
1386
1387!
1388!--                Calculate weights for interpolation
1389                   p_mls_m = 0.5_wp * (p_mls_l + p_mls_u)
1390                   p_wgt_u = (p_mls(n-1) - p_mls_m) / (p_mls(n-1) - p_mls(n))
1391                   p_wgt_l = (p_mls_m - p_mls(n))   / (p_mls(n-1) - p_mls(n))
1392
1393!
1394!--                Add level to trace gas path
1395                   trace_mls_path(k,m) = trace_mls_path(k,m)                   &
1396                                         +  ( p_wgt_u * trace_mls(m,n)         &
1397                                            + p_wgt_l * trace_mls(m,n-1) )     &
1398                                         * (p_mls_l + p_mls_u) / g
1399                ENDIF
1400             ENDDO
1401
1402             IF ( rrtm_plev_tmp(k) .LT. p_mls(np) )  THEN
1403                trace_mls_path(k,m) = trace_mls_path(k,m) + trace_mls(m,np)    &
1404                                      * ( MIN( rrtm_plev_tmp(k-1), p_mls(np) ) &
1405                                          - rrtm_plev_tmp(k)                   &
1406                                        ) / g 
1407             ENDIF 
1408          ENDDO
1409       ENDDO
1410
1411
1412!
1413!--    Prepare trace gas path profiles
1414       ALLOCATE ( trace_path_tmp(1:nzt_rad+1) )
1415
1416       DO m = 1, num_trace_gases
1417
1418          trace_path_tmp(1:nzt_rad+1) = ( trace_mls_path(2:nzt_rad+2,m)        &
1419                                       - trace_mls_path(1:nzt_rad+1,m) ) * g   &
1420                                       / ( rrtm_plev_tmp(1:nzt_rad+1)          &
1421                                       - rrtm_plev_tmp(2:nzt_rad+2) )
1422
1423!
1424!--       Save trace gas paths to the respective arrays
1425          SELECT CASE ( TRIM( trace_names(m) ) )
1426
1427             CASE ( 'O3' )
1428
1429                rrtm_o3vmr(0,:) = trace_path_tmp(:)
1430
1431             CASE ( 'CO2' )
1432
1433                rrtm_co2vmr(0,:) = trace_path_tmp(:)
1434
1435             CASE ( 'CH4' )
1436
1437                rrtm_ch4vmr(0,:) = trace_path_tmp(:)
1438
1439             CASE ( 'N2O' )
1440
1441                rrtm_n2ovmr(0,:) = trace_path_tmp(:)
1442
1443             CASE ( 'O2' )
1444
1445                rrtm_o2vmr(0,:) = trace_path_tmp(:)
1446
1447             CASE ( 'CFC11' )
1448
1449                rrtm_cfc11vmr(0,:) = trace_path_tmp(:)
1450
1451             CASE ( 'CFC12' )
1452
1453                rrtm_cfc12vmr(0,:) = trace_path_tmp(:)
1454
1455             CASE ( 'CFC22' )
1456
1457                rrtm_cfc22vmr(0,:) = trace_path_tmp(:)
1458
1459             CASE ( 'CCL4' )
1460
1461                rrtm_ccl4vmr(0,:) = trace_path_tmp(:)
1462
1463             CASE DEFAULT
1464
1465          END SELECT
1466
1467       ENDDO
1468
1469       DEALLOCATE ( trace_path_tmp )
1470       DEALLOCATE ( trace_mls_path )
1471       DEALLOCATE ( rrtm_play_tmp )
1472       DEALLOCATE ( rrtm_plev_tmp )
1473       DEALLOCATE ( trace_mls )
1474       DEALLOCATE ( p_mls )
1475
1476    END SUBROUTINE read_trace_gas_data
1477
1478#endif
1479
1480
1481!------------------------------------------------------------------------------!
1482! Description:
1483! ------------
1484!-- Calculate temperature tendency due to radiative cooling/heating.
1485!-- Cache-optimized version.
1486!------------------------------------------------------------------------------!
1487    SUBROUTINE radiation_tendency_ij ( i, j, tend )
1488
1489       USE arrays_3d,                                                          &
1490           ONLY:  dzw
1491
1492       USE cloud_parameters,                                                   &
1493           ONLY:  pt_d_t, cp
1494
1495       USE control_parameters,                                                 &
1496           ONLY:  rho_surface
1497
1498       IMPLICIT NONE
1499
1500       INTEGER(iwp) :: i, j, k
1501
1502       REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: tend
1503
1504#if defined ( __rrtmg )
1505
1506       REAL(wp) :: rad_sw_net_l, rad_sw_net_u, rad_lw_net_l, rad_lw_net_u
1507
1508       rad_sw_net_l = 0.0_wp
1509       rad_sw_net_u = 0.0_wp
1510       rad_lw_net_l = 0.0_wp
1511       rad_lw_net_u = 0.0_wp
1512
1513!
1514!--    Calculate radiative flux divergence
1515       DO k = nzb+1, nzt+1
1516
1517          rad_sw_net_l = rad_sw_in(k-1,j,i) - rad_sw_out(k-1,j,i)
1518          rad_sw_net_u = rad_sw_in(k,j,i)   - rad_sw_out(k,j,i)
1519          rad_lw_net_l = rad_lw_in(k-1,j,i) - rad_lw_out(k-1,j,i)
1520          rad_lw_net_u = rad_lw_in(k,j,i)   - rad_lw_out(k,j,i)
1521
1522          tend(k,j,i) = tend(k,j,i) + ( rad_sw_net_u - rad_sw_net_l            &
1523                                      + rad_lw_net_u - rad_lw_net_l ) /        &
1524                                     ( dzw(k) * cp * rho_surface ) * pt_d_t(k) 
1525       ENDDO
1526
1527#endif
1528
1529    END SUBROUTINE radiation_tendency_ij
1530
1531
1532!------------------------------------------------------------------------------!
1533! Description:
1534! ------------
1535!-- Calculate temperature tendency due to radiative cooling/heating.
1536!-- Vector-optimized version
1537!------------------------------------------------------------------------------!
1538    SUBROUTINE radiation_tendency ( tend )
1539
1540       USE arrays_3d,                                                          &
1541           ONLY:  dzw
1542
1543       USE cloud_parameters,                                                   &
1544           ONLY:  pt_d_t, cp
1545
1546       USE indices,                                                            &
1547           ONLY:  nxl, nxr, nyn, nys
1548
1549       USE control_parameters,                                                 &
1550           ONLY:  rho_surface
1551
1552       IMPLICIT NONE
1553
1554       INTEGER(iwp) :: i, j, k
1555
1556       REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: tend
1557
1558#if defined ( __rrtmg )
1559
1560       REAL(wp) :: rad_sw_net_l, rad_sw_net_u, rad_lw_net_l, rad_lw_net_u
1561
1562       rad_sw_net_l = 0.0_wp
1563       rad_sw_net_u = 0.0_wp
1564       rad_lw_net_l = 0.0_wp
1565       rad_lw_net_u = 0.0_wp
1566
1567       DO  i = nxl, nxr
1568          DO  j = nys, nyn
1569
1570!
1571!--          Calculate radiative flux divergence
1572             DO k = nzb+1, nzt+1
1573
1574                rad_sw_net_l = rad_sw_in(k-1,j,i) - rad_sw_out(k-1,j,i)
1575                rad_sw_net_u = rad_sw_in(k  ,j,i) - rad_sw_out(k  ,j,i)
1576                rad_lw_net_l = rad_lw_in(k-1,j,i) - rad_lw_out(k-1,j,i)
1577                rad_lw_net_u = rad_lw_in(k  ,j,i) - rad_lw_out(k  ,j,i)
1578
1579                tend(k,j,i) = tend(k,j,i) + ( rad_sw_net_u - rad_sw_net_l      &
1580                                      + rad_lw_net_u - rad_lw_net_l ) /        &
1581                                      ( dzw(k) * cp * rho_surface ) * pt_d_t(k) 
1582             ENDDO
1583         ENDDO
1584       ENDDO
1585#endif
1586
1587    END SUBROUTINE radiation_tendency
1588
1589 END MODULE radiation_model_mod
Note: See TracBrowser for help on using the repository browser.