source: palm/trunk/SOURCE/radiation_model_mod.f90 @ 2158

Last change on this file since 2158 was 2158, checked in by suehring, 7 years ago

last commit documented

  • Property svn:keywords set to Id
File size: 142.0 KB
Line 
1!> @file radiation_model_mod.f90
2!------------------------------------------------------------------------------!
3! This file is part of PALM.
4!
5! PALM is free software: you can redistribute it and/or modify it under the
6! terms of the GNU General Public License as published by the Free Software
7! Foundation, either version 3 of the License, or (at your option) any later
8! 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-2017 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: radiation_model_mod.f90 2158 2017-02-22 15:11:15Z suehring $
27!
28! 2157 2017-02-22 15:10:35Z suehring
29! Bugfix in read_restart data
30!
31! 2011 2016-09-19 17:29:57Z kanani
32! Removed CALL of auxiliary SUBROUTINE get_usm_info,
33! flag urban_surface is now defined in module control_parameters.
34!
35! 2007 2016-08-24 15:47:17Z kanani
36! Added calculation of solar directional vector for new urban surface
37! model,
38! accounted for urban_surface model in radiation_check_parameters,
39! correction of comments for zenith angle.
40!
41! 2000 2016-08-20 18:09:15Z knoop
42! Forced header and separation lines into 80 columns
43!
44! 1976 2016-07-27 13:28:04Z maronga
45! Output of 2D/3D/masked data is now directly done within this module. The
46! radiation schemes have been simplified for better usability so that
47! rad_lw_in, rad_lw_out, rad_sw_in, and rad_sw_out are available independent of
48! the radiation code used.
49!
50! 1856 2016-04-13 12:56:17Z maronga
51! Bugfix: allocation of rad_lw_out for radiation_scheme = 'clear-sky'
52!
53! 1853 2016-04-11 09:00:35Z maronga
54! Added routine for radiation_scheme = constant.
55
56! 1849 2016-04-08 11:33:18Z hoffmann
57! Adapted for modularization of microphysics
58!
59! 1826 2016-04-07 12:01:39Z maronga
60! Further modularization.
61!
62! 1788 2016-03-10 11:01:04Z maronga
63! Added new albedo class for pavements / roads.
64!
65! 1783 2016-03-06 18:36:17Z raasch
66! palm-netcdf-module removed in order to avoid a circular module dependency,
67! netcdf-variables moved to netcdf-module, new routine netcdf_handle_error_rad
68! added
69!
70! 1757 2016-02-22 15:49:32Z maronga
71! Added parameter unscheduled_radiation_calls. Bugfix: interpolation of sounding
72! profiles for pressure and temperature above the LES domain.
73!
74! 1709 2015-11-04 14:47:01Z maronga
75! Bugfix: set initial value for rrtm_lwuflx_dt to zero, small formatting
76! corrections
77!
78! 1701 2015-11-02 07:43:04Z maronga
79! Bugfixes: wrong index for output of timeseries, setting of nz_snd_end
80!
81! 1691 2015-10-26 16:17:44Z maronga
82! Added option for spin-up runs without radiation (skip_time_do_radiation). Bugfix
83! in calculation of pressure profiles. Bugfix in calculation of trace gas profiles.
84! Added output of radiative heating rates.
85!
86! 1682 2015-10-07 23:56:08Z knoop
87! Code annotations made doxygen readable
88!
89! 1606 2015-06-29 10:43:37Z maronga
90! Added preprocessor directive __netcdf to allow for compiling without netCDF.
91! Note, however, that RRTMG cannot be used without netCDF.
92!
93! 1590 2015-05-08 13:56:27Z maronga
94! Bugfix: definition of character strings requires same length for all elements
95!
96! 1587 2015-05-04 14:19:01Z maronga
97! Added albedo class for snow
98!
99! 1585 2015-04-30 07:05:52Z maronga
100! Added support for RRTMG
101!
102! 1571 2015-03-12 16:12:49Z maronga
103! Added missing KIND attribute. Removed upper-case variable names
104!
105! 1551 2015-03-03 14:18:16Z maronga
106! Added support for data output. Various variables have been renamed. Added
107! interface for different radiation schemes (currently: clear-sky, constant, and
108! RRTM (not yet implemented).
109!
110! 1496 2014-12-02 17:25:50Z maronga
111! Initial revision
112!
113!
114! Description:
115! ------------
116!> Radiation models and interfaces
117!> @todo move variable definitions used in radiation_init only to the subroutine
118!>       as they are no longer required after initialization.
119!> @todo Output of full column vertical profiles used in RRTMG
120!> @todo Output of other rrtm arrays (such as volume mixing ratios)
121!> @todo Adapt for use with topography
122!>
123!> @note Many variables have a leading dummy dimension (0:0) in order to
124!>       match the assume-size shape expected by the RRTMG model.
125!------------------------------------------------------------------------------!
126 MODULE radiation_model_mod
127 
128    USE arrays_3d,                                                             &
129        ONLY:  dzw, hyp, pt, q, ql, zu, zw
130
131    USE cloud_parameters,                                                      &
132        ONLY:  cp, l_d_cp, rho_l
133
134    USE constants,                                                             &
135        ONLY:  pi
136
137    USE control_parameters,                                                    &
138        ONLY:  cloud_droplets, cloud_physics, g, initializing_actions,         &
139               large_scale_forcing, lsf_surf, phi, pt_surface, rho_surface,    &
140               surface_pressure, time_since_reference_point
141
142    USE indices,                                                               &
143        ONLY:  nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb_s_inner, nzb, nzt
144
145    USE kinds
146
147    USE microphysics_mod,                                                      &
148        ONLY:  nc_const, sigma_gc
149
150#if defined ( __netcdf )
151    USE NETCDF
152#endif
153
154#if defined ( __rrtmg )
155    USE parrrsw,                                                               &
156        ONLY:  naerec, nbndsw
157
158    USE parrrtm,                                                               &
159        ONLY:  nbndlw
160
161    USE rrtmg_lw_init,                                                         &
162        ONLY:  rrtmg_lw_ini
163
164    USE rrtmg_sw_init,                                                         &
165        ONLY:  rrtmg_sw_ini
166
167    USE rrtmg_lw_rad,                                                          &
168        ONLY:  rrtmg_lw
169
170    USE rrtmg_sw_rad,                                                          &
171        ONLY:  rrtmg_sw
172#endif
173
174
175
176    IMPLICIT NONE
177
178    CHARACTER(10) :: radiation_scheme = 'clear-sky' ! 'constant', 'clear-sky', or 'rrtmg'
179
180!
181!-- Predefined Land surface classes (albedo_type) after Briegleb (1992)
182    CHARACTER(37), DIMENSION(0:17), PARAMETER :: albedo_type_name = (/      &
183                                   'user defined                         ', & !  0
184                                   'ocean                                ', & !  1
185                                   'mixed farming, tall grassland        ', & !  2
186                                   'tall/medium grassland                ', & !  3
187                                   'evergreen shrubland                  ', & !  4
188                                   'short grassland/meadow/shrubland     ', & !  5
189                                   'evergreen needleleaf forest          ', & !  6
190                                   'mixed deciduous evergreen forest     ', & !  7
191                                   'deciduous forest                     ', & !  8
192                                   'tropical evergreen broadleaved forest', & !  9
193                                   'medium/tall grassland/woodland       ', & ! 10
194                                   'desert, sandy                        ', & ! 11
195                                   'desert, rocky                        ', & ! 12
196                                   'tundra                               ', & ! 13
197                                   'land ice                             ', & ! 14
198                                   'sea ice                              ', & ! 15
199                                   'snow                                 ', & ! 16
200                                   'pavement/roads                       '  & ! 17
201                                                         /)
202
203    INTEGER(iwp) :: albedo_type  = 5,    & !< Albedo surface type (default: short grassland)
204                    day,                 & !< current day of the year
205                    day_init     = 172,  & !< day of the year at model start (21/06)
206                    dots_rad     = 0       !< starting index for timeseries output
207
208    LOGICAL ::  unscheduled_radiation_calls = .TRUE., & !< flag parameter indicating whether additional calls of the radiation code are allowed
209                constant_albedo = .FALSE.,            & !< flag parameter indicating whether the albedo may change depending on zenith
210                force_radiation_call = .FALSE.,       & !< flag parameter for unscheduled radiation calls
211                lw_radiation = .TRUE.,                & !< flag parameter indicating whether longwave radiation shall be calculated
212                radiation = .FALSE.,                  & !< flag parameter indicating whether the radiation model is used
213                sun_up    = .TRUE.,                   & !< flag parameter indicating whether the sun is up or down
214                sw_radiation = .TRUE.,                 & !< flag parameter indicing whether shortwave radiation shall be calculated
215                sun_direction = .FALSE.                 !< flag parameter indicing whether solar direction shall be calculated
216
217
218    REAL(wp), PARAMETER :: d_seconds_hour  = 0.000277777777778_wp,  & !< inverse of seconds per hour (1/3600)
219                           d_hours_day    = 0.0416666666667_wp,     & !< inverse of hours per day (1/24)
220                           sigma_sb       = 5.67037321E-8_wp,       & !< Stefan-Boltzmann constant
221                           solar_constant = 1368.0_wp                 !< solar constant at top of atmosphere
222
223    REAL(wp) :: albedo = 9999999.9_wp,           & !< NAMELIST alpha
224                albedo_lw_dif = 9999999.9_wp,    & !< NAMELIST aldif
225                albedo_lw_dir = 9999999.9_wp,    & !< NAMELIST aldir
226                albedo_sw_dif = 9999999.9_wp,    & !< NAMELIST asdif
227                albedo_sw_dir = 9999999.9_wp,    & !< NAMELIST asdir
228                decl_1,                          & !< declination coef. 1
229                decl_2,                          & !< declination coef. 2
230                decl_3,                          & !< declination coef. 3
231                dt_radiation = 0.0_wp,           & !< radiation model timestep
232                emissivity = 0.98_wp,            & !< NAMELIST surface emissivity
233                lambda = 0.0_wp,                 & !< longitude in degrees
234                lon = 0.0_wp,                    & !< longitude in radians
235                lat = 0.0_wp,                    & !< latitude in radians
236                net_radiation = 0.0_wp,          & !< net radiation at surface
237                skip_time_do_radiation = 0.0_wp, & !< Radiation model is not called before this time
238                sky_trans,                       & !< sky transmissivity
239                time_radiation = 0.0_wp,         & !< time since last call of radiation code
240                time_utc,                        & !< current time in UTC
241                time_utc_init = 43200.0_wp         !< UTC time at model start (noon)
242
243    REAL(wp), DIMENSION(0:0) ::  zenith,         & !< cosine of solar zenith angle
244                                 sun_dir_lat,    & !< solar directional vector in latitudes
245                                 sun_dir_lon       !< solar directional vector in longitudes
246
247    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
248                alpha,                       & !< surface broadband albedo (used for clear-sky scheme)
249                rad_lw_out_change_0,         & !< change in LW out due to change in surface temperature
250                rad_net,                     & !< net radiation at the surface
251                rad_net_av                     !< average of rad_net
252
253!
254!-- Land surface albedos for solar zenith angle of 60° after Briegleb (1992)     
255!-- (shortwave, longwave, broadband):   sw,      lw,      bb,
256    REAL(wp), DIMENSION(0:2,1:17), PARAMETER :: albedo_pars = RESHAPE( (/& 
257                                   0.06_wp, 0.06_wp, 0.06_wp,            & !  1
258                                   0.09_wp, 0.28_wp, 0.19_wp,            & !  2
259                                   0.11_wp, 0.33_wp, 0.23_wp,            & !  3
260                                   0.11_wp, 0.33_wp, 0.23_wp,            & !  4
261                                   0.14_wp, 0.34_wp, 0.25_wp,            & !  5
262                                   0.06_wp, 0.22_wp, 0.14_wp,            & !  6
263                                   0.06_wp, 0.27_wp, 0.17_wp,            & !  7
264                                   0.06_wp, 0.31_wp, 0.19_wp,            & !  8
265                                   0.06_wp, 0.22_wp, 0.14_wp,            & !  9
266                                   0.06_wp, 0.28_wp, 0.18_wp,            & ! 10
267                                   0.35_wp, 0.51_wp, 0.43_wp,            & ! 11
268                                   0.24_wp, 0.40_wp, 0.32_wp,            & ! 12
269                                   0.10_wp, 0.27_wp, 0.19_wp,            & ! 13
270                                   0.90_wp, 0.65_wp, 0.77_wp,            & ! 14
271                                   0.90_wp, 0.65_wp, 0.77_wp,            & ! 15
272                                   0.95_wp, 0.70_wp, 0.82_wp,            & ! 16
273                                   0.08_wp, 0.08_wp, 0.08_wp             & ! 17
274                                 /), (/ 3, 17 /) )
275
276    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET :: &
277                        rad_lw_cs_hr,                  & !< longwave clear sky radiation heating rate (K/s)
278                        rad_lw_cs_hr_av,               & !< average of rad_lw_cs_hr
279                        rad_lw_hr,                     & !< longwave radiation heating rate (K/s)
280                        rad_lw_hr_av,                  & !< average of rad_sw_hr
281                        rad_lw_in,                     & !< incoming longwave radiation (W/m2)
282                        rad_lw_in_av,                  & !< average of rad_lw_in
283                        rad_lw_out,                    & !< outgoing longwave radiation (W/m2)
284                        rad_lw_out_av,                 & !< average of rad_lw_out
285                        rad_sw_cs_hr,                  & !< shortwave clear sky radiation heating rate (K/s)
286                        rad_sw_cs_hr_av,               & !< average of rad_sw_cs_hr
287                        rad_sw_hr,                     & !< shortwave radiation heating rate (K/s)
288                        rad_sw_hr_av,                  & !< average of rad_sw_hr
289                        rad_sw_in,                     & !< incoming shortwave radiation (W/m2)
290                        rad_sw_in_av,                  & !< average of rad_sw_in
291                        rad_sw_out,                    & !< outgoing shortwave radiation (W/m2)
292                        rad_sw_out_av                    !< average of rad_sw_out
293
294
295!
296!-- Variables and parameters used in RRTMG only
297#if defined ( __rrtmg )
298    CHARACTER(LEN=12) :: rrtm_input_file = "RAD_SND_DATA" !< name of the NetCDF input file (sounding data)
299
300
301!
302!-- Flag parameters for RRTMGS (should not be changed)
303    INTEGER(iwp), PARAMETER :: rrtm_idrv     = 1, & !< flag for longwave upward flux calculation option (0,1)
304                               rrtm_inflglw  = 2, & !< flag for lw cloud optical properties (0,1,2)
305                               rrtm_iceflglw = 0, & !< flag for lw ice particle specifications (0,1,2,3)
306                               rrtm_liqflglw = 1, & !< flag for lw liquid droplet specifications
307                               rrtm_inflgsw  = 2, & !< flag for sw cloud optical properties (0,1,2)
308                               rrtm_iceflgsw = 0, & !< flag for sw ice particle specifications (0,1,2,3)
309                               rrtm_liqflgsw = 1    !< flag for sw liquid droplet specifications
310
311!
312!-- The following variables should be only changed with care, as this will
313!-- require further setting of some variables, which is currently not
314!-- implemented (aerosols, ice phase).
315    INTEGER(iwp) :: nzt_rad,           & !< upper vertical limit for radiation calculations
316                    rrtm_icld = 0,     & !< cloud flag (0: clear sky column, 1: cloudy column)
317                    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)
318
319    INTEGER(iwp) :: nc_stat !< local variable for storin the result of netCDF calls for error message handling
320
321    LOGICAL :: snd_exists = .FALSE.      !< flag parameter to check whether a user-defined input files exists
322
323    REAL(wp), PARAMETER :: mol_mass_air_d_wv = 1.607793_wp !< molecular weight dry air / water vapor
324
325    REAL(wp), DIMENSION(:), ALLOCATABLE :: hyp_snd,     & !< hypostatic pressure from sounding data (hPa)
326                                           q_snd,       & !< specific humidity from sounding data (kg/kg) - dummy at the moment
327                                           rrtm_tsfc,   & !< dummy array for storing surface temperature
328                                           t_snd          !< actual temperature from sounding data (hPa)
329
330    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: aldif,          & !< longwave diffuse albedo solar angle of 60°
331                                             aldir,          & !< longwave direct albedo solar angle of 60°
332                                             asdif,          & !< shortwave diffuse albedo solar angle of 60°
333                                             asdir,          & !< shortwave direct albedo solar angle of 60°
334                                             rrtm_ccl4vmr,   & !< CCL4 volume mixing ratio (g/mol)
335                                             rrtm_cfc11vmr,  & !< CFC11 volume mixing ratio (g/mol)
336                                             rrtm_cfc12vmr,  & !< CFC12 volume mixing ratio (g/mol)
337                                             rrtm_cfc22vmr,  & !< CFC22 volume mixing ratio (g/mol)
338                                             rrtm_ch4vmr,    & !< CH4 volume mixing ratio
339                                             rrtm_cicewp,    & !< in-cloud ice water path (g/m²)
340                                             rrtm_cldfr,     & !< cloud fraction (0,1)
341                                             rrtm_cliqwp,    & !< in-cloud liquid water path (g/m²)
342                                             rrtm_co2vmr,    & !< CO2 volume mixing ratio (g/mol)
343                                             rrtm_emis,      & !< surface emissivity (0-1)   
344                                             rrtm_h2ovmr,    & !< H2O volume mixing ratio
345                                             rrtm_n2ovmr,    & !< N2O volume mixing ratio
346                                             rrtm_o2vmr,     & !< O2 volume mixing ratio
347                                             rrtm_o3vmr,     & !< O3 volume mixing ratio
348                                             rrtm_play,      & !< pressure layers (hPa, zu-grid)
349                                             rrtm_plev,      & !< pressure layers (hPa, zw-grid)
350                                             rrtm_reice,     & !< cloud ice effective radius (microns)
351                                             rrtm_reliq,     & !< cloud water drop effective radius (microns)
352                                             rrtm_tlay,      & !< actual temperature (K, zu-grid)
353                                             rrtm_tlev,      & !< actual temperature (K, zw-grid)
354                                             rrtm_lwdflx,    & !< RRTM output of incoming longwave radiation flux (W/m2)
355                                             rrtm_lwdflxc,   & !< RRTM output of outgoing clear sky longwave radiation flux (W/m2)
356                                             rrtm_lwuflx,    & !< RRTM output of outgoing longwave radiation flux (W/m2)
357                                             rrtm_lwuflxc,   & !< RRTM output of incoming clear sky longwave radiation flux (W/m2)
358                                             rrtm_lwuflx_dt, & !< RRTM output of incoming clear sky longwave radiation flux (W/m2)
359                                             rrtm_lwuflxc_dt,& !< RRTM output of outgoing clear sky longwave radiation flux (W/m2)
360                                             rrtm_lwhr,      & !< RRTM output of longwave radiation heating rate (K/d)
361                                             rrtm_lwhrc,     & !< RRTM output of incoming longwave clear sky radiation heating rate (K/d)
362                                             rrtm_swdflx,    & !< RRTM output of incoming shortwave radiation flux (W/m2)
363                                             rrtm_swdflxc,   & !< RRTM output of outgoing clear sky shortwave radiation flux (W/m2)
364                                             rrtm_swuflx,    & !< RRTM output of outgoing shortwave radiation flux (W/m2)
365                                             rrtm_swuflxc,   & !< RRTM output of incoming clear sky shortwave radiation flux (W/m2)
366                                             rrtm_swhr,      & !< RRTM output of shortwave radiation heating rate (K/d)
367                                             rrtm_swhrc        !< RRTM output of incoming shortwave clear sky radiation heating rate (K/d)
368
369!
370!-- Definition of arrays that are currently not used for calling RRTMG (due to setting of flag parameters)
371    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  rad_lw_cs_in,   & !< incoming clear sky longwave radiation (W/m2) (not used)
372                                                rad_lw_cs_out,  & !< outgoing clear sky longwave radiation (W/m2) (not used)
373                                                rad_sw_cs_in,   & !< incoming clear sky shortwave radiation (W/m2) (not used)
374                                                rad_sw_cs_out,  & !< outgoing clear sky shortwave radiation (W/m2) (not used)
375                                                rrtm_aldif,     & !< surface albedo for longwave diffuse radiation
376                                                rrtm_aldir,     & !< surface albedo for longwave direct radiation
377                                                rrtm_asdif,     & !< surface albedo for shortwave diffuse radiation
378                                                rrtm_asdir,     & !< surface albedo for shortwave direct radiation
379                                                rrtm_lw_tauaer, & !< lw aerosol optical depth
380                                                rrtm_lw_taucld, & !< lw in-cloud optical depth
381                                                rrtm_sw_taucld, & !< sw in-cloud optical depth
382                                                rrtm_sw_ssacld, & !< sw in-cloud single scattering albedo
383                                                rrtm_sw_asmcld, & !< sw in-cloud asymmetry parameter
384                                                rrtm_sw_fsfcld, & !< sw in-cloud forward scattering fraction
385                                                rrtm_sw_tauaer, & !< sw aerosol optical depth
386                                                rrtm_sw_ssaaer, & !< sw aerosol single scattering albedo
387                                                rrtm_sw_asmaer, & !< sw aerosol asymmetry parameter
388                                                rrtm_sw_ecaer     !< sw aerosol optical detph at 0.55 microns (rrtm_iaer = 6 only)
389
390#endif
391
392    INTERFACE radiation_check_data_output
393       MODULE PROCEDURE radiation_check_data_output
394    END INTERFACE radiation_check_data_output
395
396    INTERFACE radiation_check_data_output_pr
397       MODULE PROCEDURE radiation_check_data_output_pr
398    END INTERFACE radiation_check_data_output_pr
399 
400    INTERFACE radiation_check_parameters
401       MODULE PROCEDURE radiation_check_parameters
402    END INTERFACE radiation_check_parameters
403 
404    INTERFACE radiation_clearsky
405       MODULE PROCEDURE radiation_clearsky
406    END INTERFACE radiation_clearsky
407 
408    INTERFACE radiation_constant
409       MODULE PROCEDURE radiation_constant
410    END INTERFACE radiation_constant
411 
412    INTERFACE radiation_control
413       MODULE PROCEDURE radiation_control
414    END INTERFACE radiation_control
415
416    INTERFACE radiation_3d_data_averaging
417       MODULE PROCEDURE radiation_3d_data_averaging
418    END INTERFACE radiation_3d_data_averaging
419
420    INTERFACE radiation_data_output_2d
421       MODULE PROCEDURE radiation_data_output_2d
422    END INTERFACE radiation_data_output_2d
423
424    INTERFACE radiation_data_output_3d
425       MODULE PROCEDURE radiation_data_output_3d
426    END INTERFACE radiation_data_output_3d
427
428    INTERFACE radiation_data_output_mask
429       MODULE PROCEDURE radiation_data_output_mask
430    END INTERFACE radiation_data_output_mask
431
432    INTERFACE radiation_define_netcdf_grid
433       MODULE PROCEDURE radiation_define_netcdf_grid
434    END INTERFACE radiation_define_netcdf_grid
435
436    INTERFACE radiation_header
437       MODULE PROCEDURE radiation_header
438    END INTERFACE radiation_header 
439 
440    INTERFACE radiation_init
441       MODULE PROCEDURE radiation_init
442    END INTERFACE radiation_init
443
444    INTERFACE radiation_parin
445       MODULE PROCEDURE radiation_parin
446    END INTERFACE radiation_parin
447   
448    INTERFACE radiation_rrtmg
449       MODULE PROCEDURE radiation_rrtmg
450    END INTERFACE radiation_rrtmg
451
452    INTERFACE radiation_tendency
453       MODULE PROCEDURE radiation_tendency
454       MODULE PROCEDURE radiation_tendency_ij
455    END INTERFACE radiation_tendency
456
457    INTERFACE radiation_read_restart_data
458       MODULE PROCEDURE radiation_read_restart_data
459    END INTERFACE radiation_read_restart_data
460
461    INTERFACE radiation_last_actions
462       MODULE PROCEDURE radiation_last_actions
463    END INTERFACE radiation_last_actions
464
465    SAVE
466
467    PRIVATE
468
469!
470!-- Public functions / NEEDS SORTING
471    PUBLIC radiation_check_data_output, radiation_check_data_output_pr,        &
472           radiation_check_parameters, radiation_control,                      &
473           radiation_header, radiation_init, radiation_parin,                  &
474           radiation_3d_data_averaging, radiation_tendency,                    &
475           radiation_data_output_2d, radiation_data_output_3d,                 &
476           radiation_define_netcdf_grid, radiation_last_actions,               &
477           radiation_read_restart_data, radiation_data_output_mask
478   
479!
480!-- Public variables and constants / NEEDS SORTING
481    PUBLIC dots_rad, dt_radiation, force_radiation_call,                       &
482           rad_net, rad_net_av, radiation, radiation_scheme, rad_lw_in,        &
483           rad_lw_in_av, rad_lw_out, rad_lw_out_av, rad_lw_out_change_0,       &
484           rad_lw_cs_hr, rad_lw_cs_hr_av, rad_lw_hr, rad_lw_hr_av, rad_sw_in,  &
485           rad_sw_in_av, rad_sw_out, rad_sw_out_av, rad_sw_cs_hr,              &
486           rad_sw_cs_hr_av, rad_sw_hr, rad_sw_hr_av, sigma_sb,                 &
487           skip_time_do_radiation, time_radiation, unscheduled_radiation_calls,&
488           zenith, calc_zenith, sun_direction, sun_dir_lat, sun_dir_lon,       &
489           day_init, time_utc_init
490
491
492#if defined ( __rrtmg )
493    PUBLIC rrtm_aldif, rrtm_aldir, rrtm_asdif, rrtm_asdir
494#endif
495
496 CONTAINS
497
498
499!------------------------------------------------------------------------------!
500! Description:
501! ------------
502!> This subroutine controls the calls of the radiation schemes
503!------------------------------------------------------------------------------!
504    SUBROUTINE radiation_control
505 
506 
507       IMPLICIT NONE
508
509
510       SELECT CASE ( TRIM( radiation_scheme ) )
511
512          CASE ( 'constant' )
513             CALL radiation_constant
514         
515          CASE ( 'clear-sky' )
516             CALL radiation_clearsky
517       
518          CASE ( 'rrtmg' )
519             CALL radiation_rrtmg
520
521          CASE DEFAULT
522
523       END SELECT
524
525
526    END SUBROUTINE radiation_control
527
528!------------------------------------------------------------------------------!
529! Description:
530! ------------
531!> Check data output for radiation model
532!------------------------------------------------------------------------------!
533    SUBROUTINE radiation_check_data_output( var, unit, i, ilen, k )
534 
535 
536       USE control_parameters,                                                 &
537           ONLY: data_output, message_string
538
539       IMPLICIT NONE
540
541       CHARACTER (LEN=*) ::  unit     !<
542       CHARACTER (LEN=*) ::  var      !<
543
544       INTEGER(iwp) :: i
545       INTEGER(iwp) :: ilen
546       INTEGER(iwp) :: k
547
548       SELECT CASE ( TRIM( var ) )
549
550         CASE ( 'rad_lw_cs_hr', 'rad_lw_hr', 'rad_sw_cs_hr', 'rad_sw_hr' )
551             IF (  .NOT.  radiation  .OR.  radiation_scheme /= 'rrtmg' )  THEN
552                message_string = '"output of "' // TRIM( var ) // '" requi' // &
553                                 'res radiation = .TRUE. and ' //              &
554                                 'radiation_scheme = "rrtmg"'
555                CALL message( 'check_parameters', 'PA0406', 1, 2, 0, 6, 0 )
556             ENDIF
557             unit = 'W/m2'     
558
559          CASE ( 'rad_net*', 'rrtm_aldif*', 'rrtm_aldir*', 'rrtm_asdif*',      &
560                 'rrtm_asdir*' )
561             IF ( k == 0  .OR.  data_output(i)(ilen-2:ilen) /= '_xy' )  THEN
562                message_string = 'illegal value for data_output: "' //         &
563                                 TRIM( var ) // '" & only 2d-horizontal ' //   &
564                                 'cross sections are allowed for this value'
565                CALL message( 'check_parameters', 'PA0111', 1, 2, 0, 6, 0 )
566             ENDIF
567             IF (  .NOT.  radiation  .OR.  radiation_scheme /= "rrtmg" )  THEN
568                IF ( TRIM( var ) == 'rrtm_aldif*'  .OR.                        &
569                     TRIM( var ) == 'rrtm_aldir*'  .OR.                        &
570                     TRIM( var ) == 'rrtm_asdif*'  .OR.                        &
571                     TRIM( var ) == 'rrtm_asdir*'      )                       &
572                THEN
573                   message_string = 'output of "' // TRIM( var ) // '" require'&
574                                    // 's radiation = .TRUE. and radiation_sch'&
575                                    // 'eme = "rrtmg"'
576                   CALL message( 'check_parameters', 'PA0409', 1, 2, 0, 6, 0 )
577                ENDIF
578             ENDIF
579
580             IF ( TRIM( var ) == 'rad_net*'      ) unit = 'W/m2'   
581             IF ( TRIM( var ) == 'rrtm_aldif*'   ) unit = ''   
582             IF ( TRIM( var ) == 'rrtm_aldir*'   ) unit = '' 
583             IF ( TRIM( var ) == 'rrtm_asdif*'   ) unit = '' 
584             IF ( TRIM( var ) == 'rrtm_asdir*'   ) unit = '' 
585
586          CASE DEFAULT
587             unit = 'illegal'
588
589       END SELECT
590
591
592    END SUBROUTINE radiation_check_data_output
593
594!------------------------------------------------------------------------------!
595! Description:
596! ------------
597!> Check data output of profiles for radiation model
598!------------------------------------------------------------------------------! 
599    SUBROUTINE radiation_check_data_output_pr( variable, var_count, unit, dopr_unit )
600 
601       USE arrays_3d,                                                          &
602           ONLY: zu
603
604       USE control_parameters,                                                 &
605           ONLY: data_output_pr, message_string
606
607       USE indices
608
609       USE profil_parameter
610
611       USE statistics
612
613       IMPLICIT NONE
614   
615       CHARACTER (LEN=*) ::  unit      !<
616       CHARACTER (LEN=*) ::  variable  !<
617       CHARACTER (LEN=*) ::  dopr_unit !< local value of dopr_unit
618 
619       INTEGER(iwp) ::  user_pr_index !<
620       INTEGER(iwp) ::  var_count     !<
621
622       SELECT CASE ( TRIM( variable ) )
623       
624         CASE ( 'rad_net' )
625             IF ( (  .NOT.  radiation )  .OR.  radiation_scheme == 'constant' )&
626             THEN
627                message_string = 'data_output_pr = ' //                        &
628                                 TRIM( data_output_pr(var_count) ) // ' is' // &
629                                 'not available for radiation = .FALSE. or ' //&
630                                 'radiation_scheme = "constant"'
631                CALL message( 'check_parameters', 'PA0408', 1, 2, 0, 6, 0 )
632             ELSE
633                dopr_index(var_count) = 101
634                dopr_unit  = 'W/m2'
635                hom(:,2,101,:)  = SPREAD( zw, 2, statistic_regions+1 )
636                unit = dopr_unit
637             ENDIF
638
639          CASE ( 'rad_lw_in' )
640             IF ( (  .NOT.  radiation)  .OR.  radiation_scheme == 'constant' ) &
641             THEN
642                message_string = 'data_output_pr = ' //                        &
643                                 TRIM( data_output_pr(var_count) ) // ' is' // &
644                                 'not available for radiation = .FALSE. or ' //&
645                                 'radiation_scheme = "constant"'
646                CALL message( 'check_parameters', 'PA0408', 1, 2, 0, 6, 0 )
647             ELSE
648                dopr_index(var_count) = 102
649                dopr_unit  = 'W/m2'
650                hom(:,2,102,:)  = SPREAD( zw, 2, statistic_regions+1 )
651                unit = dopr_unit 
652             ENDIF
653
654          CASE ( 'rad_lw_out' )
655             IF ( (  .NOT. radiation )  .OR.  radiation_scheme == 'constant' ) &
656             THEN
657                message_string = 'data_output_pr = ' //                        &
658                                 TRIM( data_output_pr(var_count) ) // ' is' // &
659                                 'not available for radiation = .FALSE. or ' //&
660                                 'radiation_scheme = "constant"'
661                CALL message( 'check_parameters', 'PA0408', 1, 2, 0, 6, 0 )
662             ELSE
663                dopr_index(var_count) = 103
664                dopr_unit  = 'W/m2'
665                hom(:,2,103,:)  = SPREAD( zw, 2, statistic_regions+1 )
666                unit = dopr_unit   
667             ENDIF
668
669          CASE ( 'rad_sw_in' )
670             IF ( (  .NOT. radiation )  .OR.  radiation_scheme == 'constant' ) &
671             THEN
672                message_string = 'data_output_pr = ' //                        &
673                                 TRIM( data_output_pr(var_count) ) // ' is' // &
674                                 'not available for radiation = .FALSE. or ' //&
675                                 'radiation_scheme = "constant"'
676                CALL message( 'check_parameters', 'PA0408', 1, 2, 0, 6, 0 )
677             ELSE
678                dopr_index(var_count) = 104
679                dopr_unit  = 'W/m2'
680                hom(:,2,104,:)  = SPREAD( zw, 2, statistic_regions+1 )
681                unit = dopr_unit
682             ENDIF
683
684          CASE ( 'rad_sw_out')
685             IF ( (  .NOT.  radiation )  .OR.  radiation_scheme == 'constant' )&
686             THEN
687                message_string = 'data_output_pr = ' //                        &
688                                 TRIM( data_output_pr(var_count) ) // ' is' // &
689                                 'not available for radiation = .FALSE. or ' //&
690                                 'radiation_scheme = "constant"'
691                CALL message( 'check_parameters', 'PA0408', 1, 2, 0, 6, 0 )
692             ELSE
693                dopr_index(var_count) = 105
694                dopr_unit  = 'W/m2'
695                hom(:,2,105,:)  = SPREAD( zw, 2, statistic_regions+1 )
696                unit = dopr_unit
697             ENDIF
698
699          CASE ( 'rad_lw_cs_hr' )
700             IF ( (  .NOT.  radiation )  .OR.  radiation_scheme /= 'rrtmg' )   &
701             THEN
702                message_string = 'data_output_pr = ' //                        &
703                                 TRIM( data_output_pr(var_count) ) // ' is' // &
704                                 'not available for radiation = .FALSE. or ' //&
705                                 'radiation_scheme /= "rrtmg"'
706                CALL message( 'check_parameters', 'PA0413', 1, 2, 0, 6, 0 )
707             ELSE
708                dopr_index(var_count) = 106
709                dopr_unit  = 'K/h'
710                hom(:,2,106,:)  = SPREAD( zu, 2, statistic_regions+1 )
711                unit = dopr_unit
712             ENDIF
713
714          CASE ( 'rad_lw_hr' )
715             IF ( (  .NOT.  radiation )  .OR.  radiation_scheme /= 'rrtmg' )   &
716             THEN
717                message_string = 'data_output_pr = ' //                        &
718                                 TRIM( data_output_pr(var_count) ) // ' is' // &
719                                 'not available for radiation = .FALSE. or ' //&
720                                 'radiation_scheme /= "rrtmg"'
721                CALL message( 'check_parameters', 'PA0413', 1, 2, 0, 6, 0 )
722             ELSE
723                dopr_index(var_count) = 107
724                dopr_unit  = 'K/h'
725                hom(:,2,107,:)  = SPREAD( zu, 2, statistic_regions+1 )
726                unit = dopr_unit
727             ENDIF
728
729          CASE ( 'rad_sw_cs_hr' )
730             IF ( (  .NOT.  radiation )  .OR.  radiation_scheme /= 'rrtmg' )   &
731             THEN
732                message_string = 'data_output_pr = ' //                        &
733                                 TRIM( data_output_pr(var_count) ) // ' is' // &
734                                 'not available for radiation = .FALSE. or ' //&
735                                 'radiation_scheme /= "rrtmg"'
736                CALL message( 'check_parameters', 'PA0413', 1, 2, 0, 6, 0 )
737             ELSE
738                dopr_index(var_count) = 108
739                dopr_unit  = 'K/h'
740                hom(:,2,108,:)  = SPREAD( zu, 2, statistic_regions+1 )
741                unit = dopr_unit
742             ENDIF
743
744          CASE ( 'rad_sw_hr' )
745             IF ( (  .NOT.  radiation )  .OR.  radiation_scheme /= 'rrtmg' )   &
746             THEN
747                message_string = 'data_output_pr = ' //                        &
748                                 TRIM( data_output_pr(var_count) ) // ' is' // &
749                                 'not available for radiation = .FALSE. or ' //&
750                                 'radiation_scheme /= "rrtmg"'
751                CALL message( 'check_parameters', 'PA0413', 1, 2, 0, 6, 0 )
752             ELSE
753                dopr_index(var_count) = 109
754                dopr_unit  = 'K/h'
755                hom(:,2,109,:)  = SPREAD( zu, 2, statistic_regions+1 )
756                unit = dopr_unit
757             ENDIF
758
759
760          CASE DEFAULT
761             unit = 'illegal'
762
763       END SELECT
764
765
766    END SUBROUTINE radiation_check_data_output_pr
767 
768 
769!------------------------------------------------------------------------------!
770! Description:
771! ------------
772!> Check parameters routine for radiation model
773!------------------------------------------------------------------------------!
774    SUBROUTINE radiation_check_parameters
775
776       USE control_parameters,                                                 &
777           ONLY: message_string, topography, urban_surface
778                 
779   
780       IMPLICIT NONE
781       
782
783       IF ( radiation_scheme /= 'constant'   .AND.                             &
784            radiation_scheme /= 'clear-sky'  .AND.                             &
785            radiation_scheme /= 'rrtmg' )  THEN
786          message_string = 'unknown radiation_scheme = '//                     &
787                           TRIM( radiation_scheme )
788          CALL message( 'check_parameters', 'PA0405', 1, 2, 0, 6, 0 )
789       ELSEIF ( radiation_scheme == 'rrtmg' )  THEN
790#if ! defined ( __rrtmg )
791          message_string = 'radiation_scheme = "rrtmg" requires ' //           & 
792                           'compilation of PALM with pre-processor ' //        &
793                           'directive -D__rrtmg'
794          CALL message( 'check_parameters', 'PA0407', 1, 2, 0, 6, 0 )
795#endif
796#if defined ( __rrtmg ) && ! defined( __netcdf )
797          message_string = 'radiation_scheme = "rrtmg" requires ' //           & 
798                           'the use of NetCDF (preprocessor directive ' //     &
799                           '-D__netcdf'
800          CALL message( 'check_parameters', 'PA0412', 1, 2, 0, 6, 0 )
801#endif
802
803       ENDIF
804
805       IF ( albedo_type == 0  .AND.  albedo == 9999999.9_wp  .AND.             &
806            radiation_scheme == 'clear-sky')  THEN
807          message_string = 'radiation_scheme = "clear-sky" in combination' //  & 
808                           'with albedo_type = 0 requires setting of albedo'// &
809                           ' /= 9999999.9'
810          CALL message( 'check_parameters', 'PA0410', 1, 2, 0, 6, 0 )
811       ENDIF
812
813       IF ( albedo_type == 0  .AND.  radiation_scheme == 'rrtmg'  .AND.        &
814          (    albedo_lw_dif == 9999999.9_wp .OR. albedo_lw_dir == 9999999.9_wp&
815          .OR. albedo_sw_dif == 9999999.9_wp .OR. albedo_sw_dir == 9999999.9_wp& 
816          ) ) THEN
817          message_string = 'radiation_scheme = "rrtmg" in combination' //      & 
818                           'with albedo_type = 0 requires setting of ' //      &
819                           'albedo_lw_dif /= 9999999.9' //                     &
820                           'albedo_lw_dir /= 9999999.9' //                     &
821                           'albedo_sw_dif /= 9999999.9 and' //                 &
822                           'albedo_sw_dir /= 9999999.9'
823          CALL message( 'check_parameters', 'PA0411', 1, 2, 0, 6, 0 )
824       ENDIF
825
826!
827!--    The following paramter check is temporarily extended by the urban_surface
828!--    flag, until a better solution comes up to omit this check in case of
829!--    urban surface model is used.
830       IF ( topography /= 'flat'  .AND.  .NOT.  urban_surface )  THEN
831          message_string = 'radiation scheme cannot be used ' //               & 
832                           'in combination with  topography /= "flat"'
833          CALL message( 'check_parameters', 'PA0414', 1, 2, 0, 6, 0 )
834       ENDIF
835 
836    END SUBROUTINE radiation_check_parameters 
837 
838 
839!------------------------------------------------------------------------------!
840! Description:
841! ------------
842!> Initialization of the radiation model
843!------------------------------------------------------------------------------!
844    SUBROUTINE radiation_init
845   
846       IMPLICIT NONE
847
848!
849!--    Allocate array for storing the surface net radiation
850       IF ( .NOT. ALLOCATED ( rad_net ) )  THEN
851          ALLOCATE ( rad_net(nysg:nyng,nxlg:nxrg) )
852          rad_net = 0.0_wp
853       ENDIF
854
855!
856!--    Allocate array for storing the surface net radiation
857       IF ( .NOT. ALLOCATED ( rad_lw_out_change_0 ) )  THEN
858          ALLOCATE ( rad_lw_out_change_0(nysg:nyng,nxlg:nxrg) )
859          rad_lw_out_change_0 = 0.0_wp
860       ENDIF
861
862!
863!--    Fix net radiation in case of radiation_scheme = 'constant'
864       IF ( radiation_scheme == 'constant' )  THEN
865          rad_net = net_radiation
866!          radiation = .FALSE.
867!
868!--    Calculate orbital constants
869       ELSE
870          decl_1 = SIN(23.45_wp * pi / 180.0_wp)
871          decl_2 = 2.0_wp * pi / 365.0_wp
872          decl_3 = decl_2 * 81.0_wp
873          lat    = phi * pi / 180.0_wp
874          lon    = lambda * pi / 180.0_wp
875       ENDIF
876
877       IF ( radiation_scheme == 'clear-sky'  .OR.                              &
878            radiation_scheme == 'constant')  THEN
879
880          ALLOCATE ( alpha(nysg:nyng,nxlg:nxrg) )
881
882          IF ( .NOT. ALLOCATED ( rad_sw_in ) )  THEN
883             ALLOCATE ( rad_sw_in(0:0,nysg:nyng,nxlg:nxrg) )
884          ENDIF
885          IF ( .NOT. ALLOCATED ( rad_sw_out ) )  THEN
886             ALLOCATE ( rad_sw_out(0:0,nysg:nyng,nxlg:nxrg) )
887          ENDIF
888
889          IF ( .NOT. ALLOCATED ( rad_sw_in_av ) )  THEN
890             ALLOCATE ( rad_sw_in_av(0:0,nysg:nyng,nxlg:nxrg) )
891          ENDIF
892          IF ( .NOT. ALLOCATED ( rad_sw_out_av ) )  THEN
893             ALLOCATE ( rad_sw_out_av(0:0,nysg:nyng,nxlg:nxrg) )
894          ENDIF
895
896          IF ( .NOT. ALLOCATED ( rad_lw_in ) )  THEN
897             ALLOCATE ( rad_lw_in(0:0,nysg:nyng,nxlg:nxrg) )
898          ENDIF
899          IF ( .NOT. ALLOCATED ( rad_lw_out ) )  THEN
900             ALLOCATE ( rad_lw_out(0:0,nysg:nyng,nxlg:nxrg) )
901          ENDIF
902
903          IF ( .NOT. ALLOCATED ( rad_lw_in_av ) )  THEN
904             ALLOCATE ( rad_lw_in_av(0:0,nysg:nyng,nxlg:nxrg) )
905          ENDIF
906          IF ( .NOT. ALLOCATED ( rad_lw_out_av ) )  THEN
907             ALLOCATE ( rad_lw_out_av(0:0,nysg:nyng,nxlg:nxrg) )
908          ENDIF
909
910          rad_sw_in  = 0.0_wp
911          rad_sw_out = 0.0_wp
912          rad_lw_in  = 0.0_wp
913          rad_lw_out = 0.0_wp
914
915!
916!--       Overwrite albedo if manually set in parameter file
917          IF ( albedo_type /= 0 .AND. albedo == 9999999.9_wp )  THEN
918             albedo = albedo_pars(2,albedo_type)
919          ENDIF
920   
921          alpha = albedo
922 
923!
924!--    Initialization actions for RRTMG
925       ELSEIF ( radiation_scheme == 'rrtmg' )  THEN
926#if defined ( __rrtmg )
927!
928!--       Allocate albedos
929          ALLOCATE ( rrtm_aldif(0:0,nysg:nyng,nxlg:nxrg) )
930          ALLOCATE ( rrtm_aldir(0:0,nysg:nyng,nxlg:nxrg) )
931          ALLOCATE ( rrtm_asdif(0:0,nysg:nyng,nxlg:nxrg) )
932          ALLOCATE ( rrtm_asdir(0:0,nysg:nyng,nxlg:nxrg) )
933          ALLOCATE ( aldif(nysg:nyng,nxlg:nxrg) )
934          ALLOCATE ( aldir(nysg:nyng,nxlg:nxrg) )
935          ALLOCATE ( asdif(nysg:nyng,nxlg:nxrg) )
936          ALLOCATE ( asdir(nysg:nyng,nxlg:nxrg) )
937
938          IF ( albedo_type /= 0 )  THEN
939             IF ( albedo_lw_dif == 9999999.9_wp )  THEN
940                albedo_lw_dif = albedo_pars(0,albedo_type)
941                albedo_lw_dir = albedo_lw_dif
942             ENDIF
943             IF ( albedo_sw_dif == 9999999.9_wp )  THEN
944                albedo_sw_dif = albedo_pars(1,albedo_type)
945                albedo_sw_dir = albedo_sw_dif
946             ENDIF
947          ENDIF
948
949          aldif(:,:) = albedo_lw_dif
950          aldir(:,:) = albedo_lw_dir
951          asdif(:,:) = albedo_sw_dif
952          asdir(:,:) = albedo_sw_dir
953!
954!--       Calculate initial values of current (cosine of) the zenith angle and
955!--       whether the sun is up
956          CALL calc_zenith     
957!
958!--       Calculate initial surface albedo
959          IF ( .NOT. constant_albedo )  THEN
960             CALL calc_albedo
961          ELSE
962             rrtm_aldif(0,:,:) = aldif(:,:)
963             rrtm_aldir(0,:,:) = aldir(:,:)
964             rrtm_asdif(0,:,:) = asdif(:,:) 
965             rrtm_asdir(0,:,:) = asdir(:,:)   
966          ENDIF
967
968!
969!--       Allocate surface emissivity
970          ALLOCATE ( rrtm_emis(0:0,1:nbndlw+1) )
971          rrtm_emis = emissivity
972
973!
974!--       Allocate 3d arrays of radiative fluxes and heating rates
975          IF ( .NOT. ALLOCATED ( rad_sw_in ) )  THEN
976             ALLOCATE ( rad_sw_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
977             rad_sw_in = 0.0_wp
978          ENDIF
979
980          IF ( .NOT. ALLOCATED ( rad_sw_in_av ) )  THEN
981             ALLOCATE ( rad_sw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
982          ENDIF
983
984          IF ( .NOT. ALLOCATED ( rad_sw_out ) )  THEN
985             ALLOCATE ( rad_sw_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
986             rad_sw_out = 0.0_wp
987          ENDIF
988
989          IF ( .NOT. ALLOCATED ( rad_sw_out_av ) )  THEN
990             ALLOCATE ( rad_sw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
991          ENDIF
992
993          IF ( .NOT. ALLOCATED ( rad_sw_hr ) )  THEN
994             ALLOCATE ( rad_sw_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
995             rad_sw_hr = 0.0_wp
996          ENDIF
997
998          IF ( .NOT. ALLOCATED ( rad_sw_hr_av ) )  THEN
999             ALLOCATE ( rad_sw_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1000             rad_sw_hr_av = 0.0_wp
1001          ENDIF
1002
1003          IF ( .NOT. ALLOCATED ( rad_sw_cs_hr ) )  THEN
1004             ALLOCATE ( rad_sw_cs_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1005             rad_sw_cs_hr = 0.0_wp
1006          ENDIF
1007
1008          IF ( .NOT. ALLOCATED ( rad_sw_cs_hr_av ) )  THEN
1009             ALLOCATE ( rad_sw_cs_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1010             rad_sw_cs_hr_av = 0.0_wp
1011          ENDIF
1012
1013          IF ( .NOT. ALLOCATED ( rad_lw_in ) )  THEN
1014             ALLOCATE ( rad_lw_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1015             rad_lw_in     = 0.0_wp
1016          ENDIF
1017
1018          IF ( .NOT. ALLOCATED ( rad_lw_in_av ) )  THEN
1019             ALLOCATE ( rad_lw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1020          ENDIF
1021
1022          IF ( .NOT. ALLOCATED ( rad_lw_out ) )  THEN
1023             ALLOCATE ( rad_lw_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1024            rad_lw_out    = 0.0_wp
1025          ENDIF
1026
1027          IF ( .NOT. ALLOCATED ( rad_lw_out_av ) )  THEN
1028             ALLOCATE ( rad_lw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1029          ENDIF
1030
1031          IF ( .NOT. ALLOCATED ( rad_lw_hr ) )  THEN
1032             ALLOCATE ( rad_lw_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1033             rad_lw_hr = 0.0_wp
1034          ENDIF
1035
1036          IF ( .NOT. ALLOCATED ( rad_lw_hr_av ) )  THEN
1037             ALLOCATE ( rad_lw_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1038             rad_lw_hr_av = 0.0_wp
1039          ENDIF
1040
1041          IF ( .NOT. ALLOCATED ( rad_lw_cs_hr ) )  THEN
1042             ALLOCATE ( rad_lw_cs_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1043             rad_lw_cs_hr = 0.0_wp
1044          ENDIF
1045
1046          IF ( .NOT. ALLOCATED ( rad_lw_cs_hr_av ) )  THEN
1047             ALLOCATE ( rad_lw_cs_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1048             rad_lw_cs_hr_av = 0.0_wp
1049          ENDIF
1050
1051          ALLOCATE ( rad_sw_cs_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1052          ALLOCATE ( rad_sw_cs_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1053          rad_sw_cs_in  = 0.0_wp
1054          rad_sw_cs_out = 0.0_wp
1055
1056          ALLOCATE ( rad_lw_cs_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1057          ALLOCATE ( rad_lw_cs_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
1058          rad_lw_cs_in  = 0.0_wp
1059          rad_lw_cs_out = 0.0_wp
1060
1061!
1062!--       Allocate dummy array for storing surface temperature
1063          ALLOCATE ( rrtm_tsfc(1) )
1064
1065!
1066!--       Initialize RRTMG
1067          IF ( lw_radiation )  CALL rrtmg_lw_ini ( cp )
1068          IF ( sw_radiation )  CALL rrtmg_sw_ini ( cp )
1069
1070!
1071!--       Set input files for RRTMG
1072          INQUIRE(FILE="RAD_SND_DATA", EXIST=snd_exists) 
1073          IF ( .NOT. snd_exists )  THEN
1074             rrtm_input_file = "rrtmg_lw.nc"
1075          ENDIF
1076
1077!
1078!--       Read vertical layers for RRTMG from sounding data
1079!--       The routine provides nzt_rad, hyp_snd(1:nzt_rad),
1080!--       t_snd(nzt+2:nzt_rad), rrtm_play(1:nzt_rad), rrtm_plev(1_nzt_rad+1),
1081!--       rrtm_tlay(nzt+2:nzt_rad), rrtm_tlev(nzt+2:nzt_rad+1)
1082          CALL read_sounding_data
1083
1084!
1085!--       Read trace gas profiles from file. This routine provides
1086!--       the rrtm_ arrays (1:nzt_rad+1)
1087          CALL read_trace_gas_data
1088#endif
1089       ENDIF
1090
1091!
1092!--    Perform user actions if required
1093       CALL user_init_radiation
1094
1095!
1096!--    Calculate radiative fluxes at model start
1097       IF (  TRIM( initializing_actions ) /= 'read_restart_data' )  THEN
1098
1099          SELECT CASE ( radiation_scheme )
1100             CASE ( 'rrtmg' )
1101                CALL radiation_rrtmg
1102             CASE ( 'clear-sky' )
1103                CALL radiation_clearsky
1104             CASE ( 'constant' )
1105                CALL radiation_constant
1106             CASE DEFAULT
1107          END SELECT
1108
1109       ENDIF
1110
1111       RETURN
1112
1113    END SUBROUTINE radiation_init
1114
1115
1116!------------------------------------------------------------------------------!
1117! Description:
1118! ------------
1119!> A simple clear sky radiation model
1120!------------------------------------------------------------------------------!
1121    SUBROUTINE radiation_clearsky
1122
1123
1124       IMPLICIT NONE
1125
1126       INTEGER(iwp) :: i, j, k   !< loop indices
1127       REAL(wp)     :: exn,   &  !< Exner functions at surface
1128                       exn1,  &  !< Exner functions at first grid level
1129                       pt1       !< potential temperature at first grid level
1130
1131!
1132!--    Calculate current zenith angle
1133       CALL calc_zenith
1134
1135!
1136!--    Calculate sky transmissivity
1137       sky_trans = 0.6_wp + 0.2_wp * zenith(0)
1138
1139!
1140!--    Calculate value of the Exner function
1141       exn = (surface_pressure / 1000.0_wp )**0.286_wp
1142!
1143!--    Calculate radiation fluxes and net radiation (rad_net) for each grid
1144!--    point
1145       DO i = nxlg, nxrg
1146          DO j = nysg, nyng
1147             k = nzb_s_inner(j,i)
1148
1149             exn1 = (hyp(k+1) / 100000.0_wp )**0.286_wp
1150
1151             rad_sw_in(0,j,i)  = solar_constant * sky_trans * zenith(0)
1152             rad_sw_out(0,j,i) = alpha(j,i) * rad_sw_in(0,j,i)
1153             rad_lw_out(0,j,i) = emissivity * sigma_sb * (pt(k,j,i) * exn)**4
1154
1155             IF ( cloud_physics )  THEN
1156                pt1 = pt(k+1,j,i) + l_d_cp / exn1 * ql(k+1,j,i)
1157                rad_lw_in(0,j,i)  = 0.8_wp * sigma_sb * (pt1 * exn1)**4
1158             ELSE
1159                rad_lw_in(0,j,i)  = 0.8_wp * sigma_sb * (pt(k+1,j,i) * exn1)**4
1160             ENDIF
1161
1162             rad_net(j,i) = rad_sw_in(0,j,i) - rad_sw_out(0,j,i)               &
1163                            + rad_lw_in(0,j,i) - rad_lw_out(0,j,i)
1164
1165
1166             rad_lw_out_change_0(j,i) = 3.0_wp * sigma_sb * emissivity         &
1167                                        * (pt(k,j,i) * exn) ** 3
1168
1169          ENDDO
1170       ENDDO
1171
1172    END SUBROUTINE radiation_clearsky
1173
1174
1175!------------------------------------------------------------------------------!
1176! Description:
1177! ------------
1178!> This scheme keeps the prescribed net radiation constant during the run
1179!------------------------------------------------------------------------------!
1180    SUBROUTINE radiation_constant
1181
1182
1183       IMPLICIT NONE
1184
1185       INTEGER(iwp) :: i, j, k   !< loop indices
1186       REAL(wp)     :: exn,   &  !< Exner functions at surface
1187                       exn1,  &  !< Exner functions at first grid level
1188                       pt1       !< potential temperature at first grid level
1189
1190!
1191!--    Calculate value of the Exner function
1192       exn = (surface_pressure / 1000.0_wp )**0.286_wp
1193!
1194!--    Prescribe net radiation and estimate the remaining radiative fluxes
1195       DO i = nxlg, nxrg
1196          DO j = nysg, nyng
1197             k = nzb_s_inner(j,i)
1198
1199             rad_net(j,i)      = net_radiation
1200
1201             exn1 = (hyp(k+1) / 100000.0_wp )**0.286_wp
1202
1203             IF ( cloud_physics )  THEN
1204                pt1 = pt(k+1,j,i) + l_d_cp / exn1 * ql(k+1,j,i)
1205                rad_lw_in(0,j,i)  = 0.8_wp * sigma_sb * (pt1 * exn1)**4
1206             ELSE
1207                rad_lw_in(0,j,i)  = 0.8_wp * sigma_sb * (pt(k+1,j,i) * exn1)**4
1208             ENDIF
1209
1210             rad_lw_out(0,j,i) = emissivity * sigma_sb * (pt(k,j,i) * exn)**4
1211
1212             rad_sw_in(0,j,i) = ( rad_net(j,i) - rad_lw_in(0,j,i)              &
1213                                  + rad_lw_out(0,j,i) )                        &
1214                                  / ( 1.0_wp - alpha(j,i) )
1215
1216          ENDDO
1217       ENDDO
1218
1219    END SUBROUTINE radiation_constant
1220
1221!------------------------------------------------------------------------------!
1222! Description:
1223! ------------
1224!> Header output for radiation model
1225!------------------------------------------------------------------------------!
1226    SUBROUTINE radiation_header ( io )
1227
1228
1229       IMPLICIT NONE
1230 
1231       INTEGER(iwp), INTENT(IN) ::  io            !< Unit of the output file
1232   
1233
1234       
1235!
1236!--    Write radiation model header
1237       WRITE( io, 3 )
1238
1239       IF ( radiation_scheme == "constant" )  THEN
1240          WRITE( io, 4 ) net_radiation
1241       ELSEIF ( radiation_scheme == "clear-sky" )  THEN
1242          WRITE( io, 5 )
1243       ELSEIF ( radiation_scheme == "rrtmg" )  THEN
1244          WRITE( io, 6 )
1245          IF ( .NOT. lw_radiation )  WRITE( io, 10 )
1246          IF ( .NOT. sw_radiation )  WRITE( io, 11 )
1247       ENDIF
1248
1249       IF ( albedo_type == 0 )  THEN
1250          WRITE( io, 7 ) albedo
1251       ELSE
1252          WRITE( io, 8 ) TRIM( albedo_type_name(albedo_type) )
1253       ENDIF
1254       IF ( constant_albedo )  THEN
1255          WRITE( io, 9 )
1256       ENDIF
1257       
1258       IF ( radiation .AND. radiation_scheme /= 'constant' )  THEN
1259          WRITE ( io, 1 )  lambda
1260          WRITE ( io, 2 )  day_init, time_utc_init
1261       ENDIF
1262
1263       WRITE( io, 12 ) dt_radiation
1264 
1265
1266 1 FORMAT ('    Geograph. longitude            :   lambda = ',F4.1,' degr')
1267 2 FORMAT ('    Day of the year at model start :   day_init = ',I3   &
1268            /'    UTC time at model start        :   time_utc_init = ',F7.1' s')
1269 3 FORMAT (//' Radiation model information:'/                                  &
1270              ' ----------------------------'/)
1271 4 FORMAT ('    --> Using constant net radiation: net_radiation = ', F6.2,        &
1272           // 'W/m**2')
1273 5 FORMAT ('    --> Simple radiation scheme for clear sky is used (no clouds,',   &
1274                   ' default)')
1275 6 FORMAT ('    --> RRTMG scheme is used')
1276 7 FORMAT (/'    User-specific surface albedo: albedo =', F6.3)
1277 8 FORMAT (/'    Albedo is set for land surface type: ', A)
1278 9 FORMAT (/'    --> Albedo is fixed during the run')
127910 FORMAT (/'    --> Longwave radiation is disabled')
128011 FORMAT (/'    --> Shortwave radiation is disabled.')
128112 FORMAT  ('    Timestep: dt_radiation = ', F6.2, '  s')
1282
1283
1284    END SUBROUTINE radiation_header
1285   
1286
1287!------------------------------------------------------------------------------!
1288! Description:
1289! ------------
1290!> Parin for &radiation_par for radiation model
1291!------------------------------------------------------------------------------!
1292    SUBROUTINE radiation_parin
1293
1294
1295       IMPLICIT NONE
1296
1297       CHARACTER (LEN=80) ::  line  !< dummy string that contains the current line of the parameter file
1298       
1299       NAMELIST /radiation_par/   albedo, albedo_type, albedo_lw_dir,          &
1300                                  albedo_lw_dif, albedo_sw_dir, albedo_sw_dif, &
1301                                  constant_albedo, day_init, dt_radiation,     &
1302                                  lambda, lw_radiation, net_radiation,         &
1303                                  radiation_scheme, skip_time_do_radiation,    &
1304                                  sw_radiation, time_utc_init,                 &
1305                                  unscheduled_radiation_calls
1306       
1307       line = ' '
1308       
1309!
1310!--    Try to find radiation model package
1311       REWIND ( 11 )
1312       line = ' '
1313       DO   WHILE ( INDEX( line, '&radiation_par' ) == 0 )
1314          READ ( 11, '(A)', END=10 )  line
1315       ENDDO
1316       BACKSPACE ( 11 )
1317
1318!
1319!--    Read user-defined namelist
1320       READ ( 11, radiation_par )
1321
1322!
1323!--    Set flag that indicates that the radiation model is switched on
1324       radiation = .TRUE.
1325
1326 10    CONTINUE
1327       
1328
1329    END SUBROUTINE radiation_parin
1330
1331
1332!------------------------------------------------------------------------------!
1333! Description:
1334! ------------
1335!> Implementation of the RRTMG radiation_scheme
1336!------------------------------------------------------------------------------!
1337    SUBROUTINE radiation_rrtmg
1338
1339       USE indices,                                                            &
1340           ONLY:  nbgp
1341
1342       USE particle_attributes,                                                &
1343           ONLY:  grid_particles, number_of_particles, particles,              &
1344                  particle_advection_start, prt_count
1345
1346       IMPLICIT NONE
1347
1348#if defined ( __rrtmg )
1349
1350       INTEGER(iwp) :: i, j, k, n !< loop indices
1351
1352       REAL(wp)     ::  s_r2, &   !< weighted sum over all droplets with r^2
1353                        s_r3      !< weighted sum over all droplets with r^3
1354
1355!
1356!--    Calculate current (cosine of) zenith angle and whether the sun is up
1357       CALL calc_zenith     
1358!
1359!--    Calculate surface albedo
1360       IF ( .NOT. constant_albedo )  THEN
1361          CALL calc_albedo
1362       ENDIF
1363
1364!
1365!--    Prepare input data for RRTMG
1366
1367!
1368!--    In case of large scale forcing with surface data, calculate new pressure
1369!--    profile. nzt_rad might be modified by these calls and all required arrays
1370!--    will then be re-allocated
1371       IF ( large_scale_forcing  .AND.  lsf_surf )  THEN
1372          CALL read_sounding_data
1373          CALL read_trace_gas_data
1374       ENDIF
1375!
1376!--    Loop over all grid points
1377       DO i = nxl, nxr
1378          DO j = nys, nyn
1379
1380!
1381!--          Prepare profiles of temperature and H2O volume mixing ratio
1382             rrtm_tlev(0,nzb+1) = pt(nzb,j,i) * ( surface_pressure             &
1383                                                  / 1000.0_wp )**0.286_wp
1384
1385             DO k = nzb+1, nzt+1
1386                rrtm_tlay(0,k) = pt(k,j,i) * ( (hyp(k) ) / 100000.0_wp         &
1387                                 )**0.286_wp + l_d_cp * ql(k,j,i)
1388                rrtm_h2ovmr(0,k) = mol_mass_air_d_wv * (q(k,j,i) - ql(k,j,i))
1389
1390             ENDDO
1391
1392!
1393!--          Avoid temperature/humidity jumps at the top of the LES domain by
1394!--          linear interpolation from nzt+2 to nzt+7
1395             DO k = nzt+2, nzt+7
1396                rrtm_tlay(0,k) = rrtm_tlay(0,nzt+1)                            &
1397                              + ( rrtm_tlay(0,nzt+8) - rrtm_tlay(0,nzt+1) )    &
1398                              / ( rrtm_play(0,nzt+8) - rrtm_play(0,nzt+1) )    &
1399                              * ( rrtm_play(0,k) - rrtm_play(0,nzt+1) )
1400
1401                rrtm_h2ovmr(0,k) = rrtm_h2ovmr(0,nzt+1)                        &
1402                              + ( rrtm_h2ovmr(0,nzt+8) - rrtm_h2ovmr(0,nzt+1) )&
1403                              / ( rrtm_play(0,nzt+8)   - rrtm_play(0,nzt+1)   )&
1404                              * ( rrtm_play(0,k) - rrtm_play(0,nzt+1) )
1405
1406             ENDDO
1407
1408!--          Linear interpolate to zw grid
1409             DO k = nzb+2, nzt+8
1410                rrtm_tlev(0,k)   = rrtm_tlay(0,k-1) + (rrtm_tlay(0,k) -        &
1411                                   rrtm_tlay(0,k-1))                           &
1412                                   / ( rrtm_play(0,k) - rrtm_play(0,k-1) )     &
1413                                   * ( rrtm_plev(0,k) - rrtm_play(0,k-1) )
1414             ENDDO
1415
1416
1417!
1418!--          Calculate liquid water path and cloud fraction for each column.
1419!--          Note that LWP is required in g/m² instead of kg/kg m.
1420             rrtm_cldfr  = 0.0_wp
1421             rrtm_reliq  = 0.0_wp
1422             rrtm_cliqwp = 0.0_wp
1423             rrtm_icld   = 0
1424
1425             DO k = nzb+1, nzt+1
1426                rrtm_cliqwp(0,k) =  ql(k,j,i) * 1000.0_wp *                    &
1427                                    (rrtm_plev(0,k) - rrtm_plev(0,k+1))        &
1428                                    * 100.0_wp / g 
1429
1430                IF ( rrtm_cliqwp(0,k) > 0.0_wp )  THEN
1431                   rrtm_cldfr(0,k) = 1.0_wp
1432                   IF ( rrtm_icld == 0 )  rrtm_icld = 1
1433
1434!
1435!--                Calculate cloud droplet effective radius
1436                   IF ( cloud_physics )  THEN
1437                      rrtm_reliq(0,k) = 1.0E6_wp * ( 3.0_wp * ql(k,j,i)        &
1438                                        * rho_surface                          &
1439                                        / ( 4.0_wp * pi * nc_const * rho_l )   &
1440                                        )**0.33333333333333_wp                 &
1441                                        * EXP( LOG( sigma_gc )**2 )
1442
1443                   ELSEIF ( cloud_droplets )  THEN
1444                      number_of_particles = prt_count(k,j,i)
1445
1446                      IF (number_of_particles <= 0)  CYCLE
1447                      particles => grid_particles(k,j,i)%particles(1:number_of_particles)
1448                      s_r2 = 0.0_wp
1449                      s_r3 = 0.0_wp
1450
1451                      DO  n = 1, number_of_particles
1452                         IF ( particles(n)%particle_mask )  THEN
1453                            s_r2 = s_r2 + particles(n)%radius**2 * &
1454                                   particles(n)%weight_factor
1455                            s_r3 = s_r3 + particles(n)%radius**3 * &
1456                                   particles(n)%weight_factor
1457                         ENDIF
1458                      ENDDO
1459
1460                      IF ( s_r2 > 0.0_wp )  rrtm_reliq(0,k) = s_r3 / s_r2
1461
1462                   ENDIF
1463
1464!
1465!--                Limit effective radius
1466                   IF ( rrtm_reliq(0,k) > 0.0_wp )  THEN
1467                      rrtm_reliq(0,k) = MAX(rrtm_reliq(0,k),2.5_wp)
1468                      rrtm_reliq(0,k) = MIN(rrtm_reliq(0,k),60.0_wp)
1469                  ENDIF
1470                ENDIF
1471             ENDDO
1472
1473!
1474!--          Set surface temperature
1475             rrtm_tsfc = pt(nzb,j,i) * (surface_pressure / 1000.0_wp )**0.286_wp
1476
1477             IF ( lw_radiation )  THEN
1478               CALL rrtmg_lw( 1, nzt_rad      , rrtm_icld    , rrtm_idrv      ,&
1479               rrtm_play       , rrtm_plev    , rrtm_tlay    , rrtm_tlev      ,&
1480               rrtm_tsfc       , rrtm_h2ovmr  , rrtm_o3vmr   , rrtm_co2vmr    ,&
1481               rrtm_ch4vmr     , rrtm_n2ovmr  , rrtm_o2vmr   , rrtm_cfc11vmr  ,&
1482               rrtm_cfc12vmr   , rrtm_cfc22vmr, rrtm_ccl4vmr , rrtm_emis      ,&
1483               rrtm_inflglw    , rrtm_iceflglw, rrtm_liqflglw, rrtm_cldfr     ,&
1484               rrtm_lw_taucld  , rrtm_cicewp  , rrtm_cliqwp  , rrtm_reice     ,& 
1485               rrtm_reliq      , rrtm_lw_tauaer,                               &
1486               rrtm_lwuflx     , rrtm_lwdflx  , rrtm_lwhr  ,                   &
1487               rrtm_lwuflxc    , rrtm_lwdflxc , rrtm_lwhrc ,                   &
1488               rrtm_lwuflx_dt  ,  rrtm_lwuflxc_dt )
1489
1490!
1491!--             Save fluxes
1492                DO k = nzb, nzt+1
1493                   rad_lw_in(k,j,i)  = rrtm_lwdflx(0,k)
1494                   rad_lw_out(k,j,i) = rrtm_lwuflx(0,k)
1495                ENDDO
1496
1497!
1498!--             Save heating rates (convert from K/d to K/h)
1499                DO k = nzb+1, nzt+1
1500                   rad_lw_hr(k,j,i)     = rrtm_lwhr(0,k)  * d_hours_day
1501                   rad_lw_cs_hr(k,j,i)  = rrtm_lwhrc(0,k) * d_hours_day
1502                ENDDO
1503
1504!
1505!--             Save change in LW heating rate
1506                rad_lw_out_change_0(j,i) = rrtm_lwuflx_dt(0,nzb)
1507
1508             ENDIF
1509
1510             IF ( sw_radiation .AND. sun_up )  THEN
1511                CALL rrtmg_sw( 1, nzt_rad      , rrtm_icld  , rrtm_iaer       ,&
1512               rrtm_play       , rrtm_plev    , rrtm_tlay  , rrtm_tlev        ,&
1513               rrtm_tsfc       , rrtm_h2ovmr  , rrtm_o3vmr , rrtm_co2vmr      ,&
1514               rrtm_ch4vmr     , rrtm_n2ovmr  , rrtm_o2vmr , rrtm_asdir(:,j,i),&
1515               rrtm_asdif(:,j,i), rrtm_aldir(:,j,i), rrtm_aldif(:,j,i), zenith,&
1516               0.0_wp          , day          , solar_constant,   rrtm_inflgsw,&
1517               rrtm_iceflgsw   , rrtm_liqflgsw, rrtm_cldfr , rrtm_sw_taucld   ,&
1518               rrtm_sw_ssacld  , rrtm_sw_asmcld, rrtm_sw_fsfcld, rrtm_cicewp  ,&
1519               rrtm_cliqwp     , rrtm_reice   , rrtm_reliq , rrtm_sw_tauaer   ,&
1520               rrtm_sw_ssaaer     , rrtm_sw_asmaer  , rrtm_sw_ecaer ,          &
1521               rrtm_swuflx     , rrtm_swdflx  , rrtm_swhr  ,                   &
1522               rrtm_swuflxc    , rrtm_swdflxc , rrtm_swhrc )
1523 
1524!
1525!--             Save fluxes
1526                DO k = nzb, nzt+1
1527                   rad_sw_in(k,j,i)  = rrtm_swdflx(0,k)
1528                   rad_sw_out(k,j,i) = rrtm_swuflx(0,k)
1529                ENDDO
1530
1531!
1532!--             Save heating rates (convert from K/d to K/s)
1533                DO k = nzb+1, nzt+1
1534                   rad_sw_hr(k,j,i)     = rrtm_swhr(0,k)  * d_hours_day
1535                   rad_sw_cs_hr(k,j,i)  = rrtm_swhrc(0,k) * d_hours_day
1536                ENDDO
1537
1538             ENDIF
1539
1540!
1541!--          Calculate surface net radiation
1542             rad_net(j,i) = rad_sw_in(nzb,j,i) - rad_sw_out(nzb,j,i)           &
1543                            + rad_lw_in(nzb,j,i) - rad_lw_out(nzb,j,i)
1544
1545          ENDDO
1546       ENDDO
1547
1548       CALL exchange_horiz( rad_lw_in,  nbgp )
1549       CALL exchange_horiz( rad_lw_out, nbgp )
1550       CALL exchange_horiz( rad_lw_hr,    nbgp )
1551       CALL exchange_horiz( rad_lw_cs_hr, nbgp )
1552
1553       CALL exchange_horiz( rad_sw_in,  nbgp )
1554       CALL exchange_horiz( rad_sw_out, nbgp ) 
1555       CALL exchange_horiz( rad_sw_hr,    nbgp )
1556       CALL exchange_horiz( rad_sw_cs_hr, nbgp )
1557
1558       CALL exchange_horiz_2d( rad_net, nbgp )
1559       CALL exchange_horiz_2d( rad_lw_out_change_0, nbgp )
1560#endif
1561
1562    END SUBROUTINE radiation_rrtmg
1563
1564
1565!------------------------------------------------------------------------------!
1566! Description:
1567! ------------
1568!> Calculate the cosine of the zenith angle (variable is called zenith)
1569!------------------------------------------------------------------------------!
1570    SUBROUTINE calc_zenith
1571
1572       IMPLICIT NONE
1573
1574       REAL(wp) ::  declination,  & !< solar declination angle
1575                    hour_angle      !< solar hour angle
1576!
1577!--    Calculate current day and time based on the initial values and simulation
1578!--    time
1579       day = day_init + INT(FLOOR( (time_utc_init + time_since_reference_point)    &
1580                               / 86400.0_wp ), KIND=iwp)
1581       time_utc = MOD((time_utc_init + time_since_reference_point), 86400.0_wp)
1582
1583
1584!
1585!--    Calculate solar declination and hour angle   
1586       declination = ASIN( decl_1 * SIN(decl_2 * REAL(day, KIND=wp) - decl_3) )
1587       hour_angle  = 2.0_wp * pi * (time_utc / 86400.0_wp) + lon - pi
1588
1589!
1590!--    Calculate cosine of solar zenith angle
1591       zenith(0) = SIN(lat) * SIN(declination) + COS(lat) * COS(declination)      &
1592                                            * COS(hour_angle)
1593       zenith(0) = MAX(0.0_wp,zenith(0))
1594
1595!
1596!--    Calculate solar directional vector
1597       IF ( sun_direction )  THEN
1598!--       Direction in longitudes equals to sin(solar_azimuth) * sin(zenith)
1599          sun_dir_lon(0) = -SIN(hour_angle) * COS(declination)
1600!--       Direction in latitues equals to cos(solar_azimuth) * sin(zenith)
1601          sun_dir_lat(0) = SIN(declination) * COS(lat) - COS(hour_angle) &
1602                              * COS(declination) * SIN(lat)
1603       ENDIF
1604
1605!
1606!--    Check if the sun is up (otheriwse shortwave calculations can be skipped)
1607       IF ( zenith(0) > 0.0_wp )  THEN
1608          sun_up = .TRUE.
1609       ELSE
1610          sun_up = .FALSE.
1611       END IF
1612
1613    END SUBROUTINE calc_zenith
1614
1615#if defined ( __rrtmg ) && defined ( __netcdf )
1616!------------------------------------------------------------------------------!
1617! Description:
1618! ------------
1619!> Calculates surface albedo components based on Briegleb (1992) and
1620!> Briegleb et al. (1986)
1621!------------------------------------------------------------------------------!
1622    SUBROUTINE calc_albedo
1623
1624        IMPLICIT NONE
1625
1626        IF ( sun_up )  THEN
1627!
1628!--        Ocean
1629           IF ( albedo_type == 1 )  THEN
1630              rrtm_aldir(0,:,:) = 0.026_wp / ( zenith(0)**1.7_wp + 0.065_wp )  &
1631                                  + 0.15_wp * ( zenith(0) - 0.1_wp )           &
1632                                            * ( zenith(0) - 0.5_wp )           &
1633                                            * ( zenith(0) - 1.0_wp )
1634              rrtm_asdir(0,:,:) = rrtm_aldir(0,:,:)
1635!
1636!--        Snow
1637           ELSEIF ( albedo_type == 16 )  THEN
1638              IF ( zenith(0) < 0.5_wp )  THEN
1639                 rrtm_aldir(0,:,:) = 0.5_wp * (1.0_wp - aldif)                 &
1640                                     * ( 3.0_wp / (1.0_wp + 4.0_wp             &
1641                                     * zenith(0))) - 1.0_wp
1642                 rrtm_asdir(0,:,:) = 0.5_wp * (1.0_wp - asdif)                 &
1643                                     * ( 3.0_wp / (1.0_wp + 4.0_wp             &
1644                                     * zenith(0))) - 1.0_wp
1645
1646                 rrtm_aldir(0,:,:) = MIN(0.98_wp, rrtm_aldir(0,:,:))
1647                 rrtm_asdir(0,:,:) = MIN(0.98_wp, rrtm_asdir(0,:,:))
1648              ELSE
1649                 rrtm_aldir(0,:,:) = aldif
1650                 rrtm_asdir(0,:,:) = asdif
1651              ENDIF
1652!
1653!--        Sea ice
1654           ELSEIF ( albedo_type == 15 )  THEN
1655                 rrtm_aldir(0,:,:) = aldif
1656                 rrtm_asdir(0,:,:) = asdif
1657
1658!
1659!--        Asphalt
1660           ELSEIF ( albedo_type == 17 )  THEN
1661                 rrtm_aldir(0,:,:) = aldif
1662                 rrtm_asdir(0,:,:) = asdif
1663!
1664!--        Land surfaces
1665           ELSE
1666              SELECT CASE ( albedo_type )
1667
1668!
1669!--              Surface types with strong zenith dependence
1670                 CASE ( 1, 2, 3, 4, 11, 12, 13 )
1671                    rrtm_aldir(0,:,:) = aldif * 1.4_wp /                       &
1672                                        (1.0_wp + 0.8_wp * zenith(0))
1673                    rrtm_asdir(0,:,:) = asdif * 1.4_wp /                       &
1674                                        (1.0_wp + 0.8_wp * zenith(0))
1675!
1676!--              Surface types with weak zenith dependence
1677                 CASE ( 5, 6, 7, 8, 9, 10, 14 )
1678                    rrtm_aldir(0,:,:) = aldif * 1.1_wp /                       &
1679                                        (1.0_wp + 0.2_wp * zenith(0))
1680                    rrtm_asdir(0,:,:) = asdif * 1.1_wp /                       &
1681                                        (1.0_wp + 0.2_wp * zenith(0))
1682
1683                 CASE DEFAULT
1684
1685              END SELECT
1686           ENDIF
1687!
1688!--        Diffusive albedo is taken from Table 2
1689           rrtm_aldif(0,:,:) = aldif
1690           rrtm_asdif(0,:,:) = asdif
1691
1692        ELSE
1693
1694           rrtm_aldir(0,:,:) = 0.0_wp
1695           rrtm_asdir(0,:,:) = 0.0_wp
1696           rrtm_aldif(0,:,:) = 0.0_wp
1697           rrtm_asdif(0,:,:) = 0.0_wp
1698        ENDIF
1699    END SUBROUTINE calc_albedo
1700
1701!------------------------------------------------------------------------------!
1702! Description:
1703! ------------
1704!> Read sounding data (pressure and temperature) from RADIATION_DATA.
1705!------------------------------------------------------------------------------!
1706    SUBROUTINE read_sounding_data
1707
1708       IMPLICIT NONE
1709
1710       INTEGER(iwp) :: id,           & !< NetCDF id of input file
1711                       id_dim_zrad,  & !< pressure level id in the NetCDF file
1712                       id_var,       & !< NetCDF variable id
1713                       k,            & !< loop index
1714                       nz_snd,       & !< number of vertical levels in the sounding data
1715                       nz_snd_start, & !< start vertical index for sounding data to be used
1716                       nz_snd_end      !< end vertical index for souding data to be used
1717
1718       REAL(wp) :: t_surface           !< actual surface temperature
1719
1720       REAL(wp), DIMENSION(:), ALLOCATABLE ::  hyp_snd_tmp, & !< temporary hydrostatic pressure profile (sounding)
1721                                               t_snd_tmp      !< temporary temperature profile (sounding)
1722
1723!
1724!--    In case of updates, deallocate arrays first (sufficient to check one
1725!--    array as the others are automatically allocated). This is required
1726!--    because nzt_rad might change during the update
1727       IF ( ALLOCATED ( hyp_snd ) )  THEN
1728          DEALLOCATE( hyp_snd )
1729          DEALLOCATE( t_snd )
1730          DEALLOCATE( q_snd  )
1731          DEALLOCATE ( rrtm_play )
1732          DEALLOCATE ( rrtm_plev )
1733          DEALLOCATE ( rrtm_tlay )
1734          DEALLOCATE ( rrtm_tlev )
1735
1736          DEALLOCATE ( rrtm_h2ovmr )
1737          DEALLOCATE ( rrtm_cicewp )
1738          DEALLOCATE ( rrtm_cldfr )
1739          DEALLOCATE ( rrtm_cliqwp )
1740          DEALLOCATE ( rrtm_reice )
1741          DEALLOCATE ( rrtm_reliq )
1742          DEALLOCATE ( rrtm_lw_taucld )
1743          DEALLOCATE ( rrtm_lw_tauaer )
1744
1745          DEALLOCATE ( rrtm_lwdflx  )
1746          DEALLOCATE ( rrtm_lwdflxc )
1747          DEALLOCATE ( rrtm_lwuflx  )
1748          DEALLOCATE ( rrtm_lwuflxc )
1749          DEALLOCATE ( rrtm_lwuflx_dt )
1750          DEALLOCATE ( rrtm_lwuflxc_dt )
1751          DEALLOCATE ( rrtm_lwhr  )
1752          DEALLOCATE ( rrtm_lwhrc )
1753
1754          DEALLOCATE ( rrtm_sw_taucld )
1755          DEALLOCATE ( rrtm_sw_ssacld )
1756          DEALLOCATE ( rrtm_sw_asmcld )
1757          DEALLOCATE ( rrtm_sw_fsfcld )
1758          DEALLOCATE ( rrtm_sw_tauaer )
1759          DEALLOCATE ( rrtm_sw_ssaaer )
1760          DEALLOCATE ( rrtm_sw_asmaer ) 
1761          DEALLOCATE ( rrtm_sw_ecaer )   
1762 
1763          DEALLOCATE ( rrtm_swdflx  )
1764          DEALLOCATE ( rrtm_swdflxc )
1765          DEALLOCATE ( rrtm_swuflx  )
1766          DEALLOCATE ( rrtm_swuflxc )
1767          DEALLOCATE ( rrtm_swhr  )
1768          DEALLOCATE ( rrtm_swhrc )
1769
1770       ENDIF
1771
1772!
1773!--    Open file for reading
1774       nc_stat = NF90_OPEN( rrtm_input_file, NF90_NOWRITE, id )
1775       CALL netcdf_handle_error_rad( 'read_sounding_data', 549 )
1776
1777!
1778!--    Inquire dimension of z axis and save in nz_snd
1779       nc_stat = NF90_INQ_DIMID( id, "Pressure", id_dim_zrad )
1780       nc_stat = NF90_INQUIRE_DIMENSION( id, id_dim_zrad, len = nz_snd )
1781       CALL netcdf_handle_error_rad( 'read_sounding_data', 551 )
1782
1783!
1784! !--    Allocate temporary array for storing pressure data
1785       ALLOCATE( hyp_snd_tmp(1:nz_snd) )
1786       hyp_snd_tmp = 0.0_wp
1787
1788
1789!--    Read pressure from file
1790       nc_stat = NF90_INQ_VARID( id, "Pressure", id_var )
1791       nc_stat = NF90_GET_VAR( id, id_var, hyp_snd_tmp(:), start = (/1/),      &
1792                               count = (/nz_snd/) )
1793       CALL netcdf_handle_error_rad( 'read_sounding_data', 552 )
1794
1795!
1796!--    Allocate temporary array for storing temperature data
1797       ALLOCATE( t_snd_tmp(1:nz_snd) )
1798       t_snd_tmp = 0.0_wp
1799
1800!
1801!--    Read temperature from file
1802       nc_stat = NF90_INQ_VARID( id, "ReferenceTemperature", id_var )
1803       nc_stat = NF90_GET_VAR( id, id_var, t_snd_tmp(:), start = (/1/),        &
1804                               count = (/nz_snd/) )
1805       CALL netcdf_handle_error_rad( 'read_sounding_data', 553 )
1806
1807!
1808!--    Calculate start of sounding data
1809       nz_snd_start = nz_snd + 1
1810       nz_snd_end   = nz_snd + 1
1811
1812!
1813!--    Start filling vertical dimension at 10hPa above the model domain (hyp is
1814!--    in Pa, hyp_snd in hPa).
1815       DO  k = 1, nz_snd
1816          IF ( hyp_snd_tmp(k) < ( hyp(nzt+1) - 1000.0_wp) * 0.01_wp )  THEN
1817             nz_snd_start = k
1818             EXIT
1819          END IF
1820       END DO
1821
1822       IF ( nz_snd_start <= nz_snd )  THEN
1823          nz_snd_end = nz_snd
1824       END IF
1825
1826
1827!
1828!--    Calculate of total grid points for RRTMG calculations
1829       nzt_rad = nzt + nz_snd_end - nz_snd_start + 1
1830
1831!
1832!--    Save data above LES domain in hyp_snd, t_snd and q_snd
1833!--    Note: q_snd_tmp is not calculated at the moment (dry residual atmosphere)
1834       ALLOCATE( hyp_snd(nzb+1:nzt_rad) )
1835       ALLOCATE( t_snd(nzb+1:nzt_rad)   )
1836       ALLOCATE( q_snd(nzb+1:nzt_rad)   )
1837       hyp_snd = 0.0_wp
1838       t_snd = 0.0_wp
1839       q_snd = 0.0_wp
1840
1841       hyp_snd(nzt+2:nzt_rad) = hyp_snd_tmp(nz_snd_start+1:nz_snd_end)
1842       t_snd(nzt+2:nzt_rad)   = t_snd_tmp(nz_snd_start+1:nz_snd_end)
1843
1844       nc_stat = NF90_CLOSE( id )
1845
1846!
1847!--    Calculate pressure levels on zu and zw grid. Sounding data is added at
1848!--    top of the LES domain. This routine does not consider horizontal or
1849!--    vertical variability of pressure and temperature
1850       ALLOCATE ( rrtm_play(0:0,nzb+1:nzt_rad+1)   )
1851       ALLOCATE ( rrtm_plev(0:0,nzb+1:nzt_rad+2)   )
1852
1853       t_surface = pt_surface * ( surface_pressure / 1000.0_wp )**0.286_wp
1854       DO k = nzb+1, nzt+1
1855          rrtm_play(0,k) = hyp(k) * 0.01_wp
1856          rrtm_plev(0,k) = surface_pressure * ( (t_surface - g/cp * zw(k-1)) / &
1857                         t_surface )**(1.0_wp/0.286_wp)
1858       ENDDO
1859
1860       DO k = nzt+2, nzt_rad
1861          rrtm_play(0,k) = hyp_snd(k)
1862          rrtm_plev(0,k) = 0.5_wp * ( rrtm_play(0,k) + rrtm_play(0,k-1) )
1863       ENDDO
1864       rrtm_plev(0,nzt_rad+1) = MAX( 0.5 * hyp_snd(nzt_rad),                   &
1865                                   1.5 * hyp_snd(nzt_rad)                      &
1866                                 - 0.5 * hyp_snd(nzt_rad-1) )
1867       rrtm_plev(0,nzt_rad+2)  = MIN( 1.0E-4_wp,                               &
1868                                      0.25_wp * rrtm_plev(0,nzt_rad+1) )
1869
1870       rrtm_play(0,nzt_rad+1) = 0.5 * rrtm_plev(0,nzt_rad+1)
1871
1872!
1873!--    Calculate temperature/humidity levels at top of the LES domain.
1874!--    Currently, the temperature is taken from sounding data (might lead to a
1875!--    temperature jump at interface. To do: Humidity is currently not
1876!--    calculated above the LES domain.
1877       ALLOCATE ( rrtm_tlay(0:0,nzb+1:nzt_rad+1)   )
1878       ALLOCATE ( rrtm_tlev(0:0,nzb+1:nzt_rad+2)   )
1879       ALLOCATE ( rrtm_h2ovmr(0:0,nzb+1:nzt_rad+1) )
1880
1881       DO k = nzt+8, nzt_rad
1882          rrtm_tlay(0,k)   = t_snd(k)
1883          rrtm_h2ovmr(0,k) = q_snd(k)
1884       ENDDO
1885       rrtm_tlay(0,nzt_rad+1) = 2.0_wp * rrtm_tlay(0,nzt_rad)                 &
1886                                - rrtm_tlay(0,nzt_rad-1)
1887       DO k = nzt+9, nzt_rad+1
1888          rrtm_tlev(0,k)   = rrtm_tlay(0,k-1) + (rrtm_tlay(0,k)                &
1889                             - rrtm_tlay(0,k-1))                               &
1890                             / ( rrtm_play(0,k) - rrtm_play(0,k-1) )           &
1891                             * ( rrtm_plev(0,k) - rrtm_play(0,k-1) )
1892       ENDDO
1893       rrtm_h2ovmr(0,nzt_rad+1) = rrtm_h2ovmr(0,nzt_rad)
1894
1895       rrtm_tlev(0,nzt_rad+2)   = 2.0_wp * rrtm_tlay(0,nzt_rad+1)              &
1896                                  - rrtm_tlev(0,nzt_rad)
1897!
1898!--    Allocate remaining RRTMG arrays
1899       ALLOCATE ( rrtm_cicewp(0:0,nzb+1:nzt_rad+1) )
1900       ALLOCATE ( rrtm_cldfr(0:0,nzb+1:nzt_rad+1) )
1901       ALLOCATE ( rrtm_cliqwp(0:0,nzb+1:nzt_rad+1) )
1902       ALLOCATE ( rrtm_reice(0:0,nzb+1:nzt_rad+1) )
1903       ALLOCATE ( rrtm_reliq(0:0,nzb+1:nzt_rad+1) )
1904       ALLOCATE ( rrtm_lw_taucld(1:nbndlw+1,0:0,nzb+1:nzt_rad+1) )
1905       ALLOCATE ( rrtm_lw_tauaer(0:0,nzb+1:nzt_rad+1,1:nbndlw+1) )
1906       ALLOCATE ( rrtm_sw_taucld(1:nbndsw+1,0:0,nzb+1:nzt_rad+1) )
1907       ALLOCATE ( rrtm_sw_ssacld(1:nbndsw+1,0:0,nzb+1:nzt_rad+1) )
1908       ALLOCATE ( rrtm_sw_asmcld(1:nbndsw+1,0:0,nzb+1:nzt_rad+1) )
1909       ALLOCATE ( rrtm_sw_fsfcld(1:nbndsw+1,0:0,nzb+1:nzt_rad+1) )
1910       ALLOCATE ( rrtm_sw_tauaer(0:0,nzb+1:nzt_rad+1,1:nbndsw+1) )
1911       ALLOCATE ( rrtm_sw_ssaaer(0:0,nzb+1:nzt_rad+1,1:nbndsw+1) )
1912       ALLOCATE ( rrtm_sw_asmaer(0:0,nzb+1:nzt_rad+1,1:nbndsw+1) ) 
1913       ALLOCATE ( rrtm_sw_ecaer(0:0,nzb+1:nzt_rad+1,1:naerec+1) )   
1914
1915!
1916!--    The ice phase is currently not considered in PALM
1917       rrtm_cicewp = 0.0_wp
1918       rrtm_reice  = 0.0_wp
1919
1920!
1921!--    Set other parameters (move to NAMELIST parameters in the future)
1922       rrtm_lw_tauaer = 0.0_wp
1923       rrtm_lw_taucld = 0.0_wp
1924       rrtm_sw_taucld = 0.0_wp
1925       rrtm_sw_ssacld = 0.0_wp
1926       rrtm_sw_asmcld = 0.0_wp
1927       rrtm_sw_fsfcld = 0.0_wp
1928       rrtm_sw_tauaer = 0.0_wp
1929       rrtm_sw_ssaaer = 0.0_wp
1930       rrtm_sw_asmaer = 0.0_wp
1931       rrtm_sw_ecaer  = 0.0_wp
1932
1933
1934       ALLOCATE ( rrtm_swdflx(0:0,nzb:nzt_rad+1)  )
1935       ALLOCATE ( rrtm_swuflx(0:0,nzb:nzt_rad+1)  )
1936       ALLOCATE ( rrtm_swhr(0:0,nzb+1:nzt_rad+1)  )
1937       ALLOCATE ( rrtm_swuflxc(0:0,nzb:nzt_rad+1) )
1938       ALLOCATE ( rrtm_swdflxc(0:0,nzb:nzt_rad+1) )
1939       ALLOCATE ( rrtm_swhrc(0:0,nzb+1:nzt_rad+1) )
1940
1941       rrtm_swdflx  = 0.0_wp
1942       rrtm_swuflx  = 0.0_wp
1943       rrtm_swhr    = 0.0_wp 
1944       rrtm_swuflxc = 0.0_wp
1945       rrtm_swdflxc = 0.0_wp
1946       rrtm_swhrc   = 0.0_wp
1947
1948       ALLOCATE ( rrtm_lwdflx(0:0,nzb:nzt_rad+1)  )
1949       ALLOCATE ( rrtm_lwuflx(0:0,nzb:nzt_rad+1)  )
1950       ALLOCATE ( rrtm_lwhr(0:0,nzb+1:nzt_rad+1)  )
1951       ALLOCATE ( rrtm_lwuflxc(0:0,nzb:nzt_rad+1) )
1952       ALLOCATE ( rrtm_lwdflxc(0:0,nzb:nzt_rad+1) )
1953       ALLOCATE ( rrtm_lwhrc(0:0,nzb+1:nzt_rad+1) )
1954
1955       rrtm_lwdflx  = 0.0_wp
1956       rrtm_lwuflx  = 0.0_wp
1957       rrtm_lwhr    = 0.0_wp 
1958       rrtm_lwuflxc = 0.0_wp
1959       rrtm_lwdflxc = 0.0_wp
1960       rrtm_lwhrc   = 0.0_wp
1961
1962       ALLOCATE ( rrtm_lwuflx_dt(0:0,nzb:nzt_rad+1) )
1963       ALLOCATE ( rrtm_lwuflxc_dt(0:0,nzb:nzt_rad+1) )
1964
1965       rrtm_lwuflx_dt = 0.0_wp
1966       rrtm_lwuflxc_dt = 0.0_wp
1967
1968    END SUBROUTINE read_sounding_data
1969
1970
1971!------------------------------------------------------------------------------!
1972! Description:
1973! ------------
1974!> Read trace gas data from file
1975!------------------------------------------------------------------------------!
1976    SUBROUTINE read_trace_gas_data
1977
1978       USE rrsw_ncpar
1979
1980       IMPLICIT NONE
1981
1982       INTEGER(iwp), PARAMETER :: num_trace_gases = 9 !< number of trace gases (absorbers)
1983
1984       CHARACTER(LEN=5), DIMENSION(num_trace_gases), PARAMETER ::              & !< trace gas names
1985           trace_names = (/'O3   ', 'CO2  ', 'CH4  ', 'N2O  ', 'O2   ',        &
1986                           'CFC11', 'CFC12', 'CFC22', 'CCL4 '/)
1987
1988       INTEGER(iwp) :: id,     & !< NetCDF id
1989                       k,      & !< loop index
1990                       m,      & !< loop index
1991                       n,      & !< loop index
1992                       nabs,   & !< number of absorbers
1993                       np,     & !< number of pressure levels
1994                       id_abs, & !< NetCDF id of the respective absorber
1995                       id_dim, & !< NetCDF id of asborber's dimension
1996                       id_var    !< NetCDf id ot the absorber
1997
1998       REAL(wp) :: p_mls_l, p_mls_u, p_wgt_l, p_wgt_u, p_mls_m
1999
2000
2001       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  p_mls,         & !< pressure levels for the absorbers
2002                                                 rrtm_play_tmp, & !< temporary array for pressure zu-levels
2003                                                 rrtm_plev_tmp, & !< temporary array for pressure zw-levels
2004                                                 trace_path_tmp   !< temporary array for storing trace gas path data
2005
2006       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  trace_mls,      & !< array for storing the absorber amounts
2007                                                 trace_mls_path, & !< array for storing trace gas path data
2008                                                 trace_mls_tmp     !< temporary array for storing trace gas data
2009
2010
2011!
2012!--    In case of updates, deallocate arrays first (sufficient to check one
2013!--    array as the others are automatically allocated)
2014       IF ( ALLOCATED ( rrtm_o3vmr ) )  THEN
2015          DEALLOCATE ( rrtm_o3vmr  )
2016          DEALLOCATE ( rrtm_co2vmr )
2017          DEALLOCATE ( rrtm_ch4vmr )
2018          DEALLOCATE ( rrtm_n2ovmr )
2019          DEALLOCATE ( rrtm_o2vmr  )
2020          DEALLOCATE ( rrtm_cfc11vmr )
2021          DEALLOCATE ( rrtm_cfc12vmr )
2022          DEALLOCATE ( rrtm_cfc22vmr )
2023          DEALLOCATE ( rrtm_ccl4vmr  )
2024       ENDIF
2025
2026!
2027!--    Allocate trace gas profiles
2028       ALLOCATE ( rrtm_o3vmr(0:0,1:nzt_rad+1)  )
2029       ALLOCATE ( rrtm_co2vmr(0:0,1:nzt_rad+1) )
2030       ALLOCATE ( rrtm_ch4vmr(0:0,1:nzt_rad+1) )
2031       ALLOCATE ( rrtm_n2ovmr(0:0,1:nzt_rad+1) )
2032       ALLOCATE ( rrtm_o2vmr(0:0,1:nzt_rad+1)  )
2033       ALLOCATE ( rrtm_cfc11vmr(0:0,1:nzt_rad+1) )
2034       ALLOCATE ( rrtm_cfc12vmr(0:0,1:nzt_rad+1) )
2035       ALLOCATE ( rrtm_cfc22vmr(0:0,1:nzt_rad+1) )
2036       ALLOCATE ( rrtm_ccl4vmr(0:0,1:nzt_rad+1)  )
2037
2038!
2039!--    Open file for reading
2040       nc_stat = NF90_OPEN( rrtm_input_file, NF90_NOWRITE, id )
2041       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 549 )
2042!
2043!--    Inquire dimension ids and dimensions
2044       nc_stat = NF90_INQ_DIMID( id, "Pressure", id_dim )
2045       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 550 )
2046       nc_stat = NF90_INQUIRE_DIMENSION( id, id_dim, len = np) 
2047       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 550 )
2048
2049       nc_stat = NF90_INQ_DIMID( id, "Absorber", id_dim )
2050       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 550 )
2051       nc_stat = NF90_INQUIRE_DIMENSION( id, id_dim, len = nabs ) 
2052       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 550 )
2053   
2054
2055!
2056!--    Allocate pressure, and trace gas arrays     
2057       ALLOCATE( p_mls(1:np) )
2058       ALLOCATE( trace_mls(1:num_trace_gases,1:np) ) 
2059       ALLOCATE( trace_mls_tmp(1:nabs,1:np) ) 
2060
2061
2062       nc_stat = NF90_INQ_VARID( id, "Pressure", id_var )
2063       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 550 )
2064       nc_stat = NF90_GET_VAR( id, id_var, p_mls )
2065       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 550 )
2066
2067       nc_stat = NF90_INQ_VARID( id, "AbsorberAmountMLS", id_var )
2068       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 550 )
2069       nc_stat = NF90_GET_VAR( id, id_var, trace_mls_tmp )
2070       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 550 )
2071
2072
2073!
2074!--    Write absorber amounts (mls) to trace_mls
2075       DO n = 1, num_trace_gases
2076          CALL getAbsorberIndex( TRIM( trace_names(n) ), id_abs )
2077
2078          trace_mls(n,1:np) = trace_mls_tmp(id_abs,1:np)
2079
2080!
2081!--       Replace missing values by zero
2082          WHERE ( trace_mls(n,:) > 2.0_wp ) 
2083             trace_mls(n,:) = 0.0_wp
2084          END WHERE
2085       END DO
2086
2087       DEALLOCATE ( trace_mls_tmp )
2088
2089       nc_stat = NF90_CLOSE( id )
2090       CALL netcdf_handle_error_rad( 'read_trace_gas_data', 551 )
2091
2092!
2093!--    Add extra pressure level for calculations of the trace gas paths
2094       ALLOCATE ( rrtm_play_tmp(1:nzt_rad+1) )
2095       ALLOCATE ( rrtm_plev_tmp(1:nzt_rad+2) )
2096
2097       rrtm_play_tmp(1:nzt_rad)   = rrtm_play(0,1:nzt_rad) 
2098       rrtm_plev_tmp(1:nzt_rad+1) = rrtm_plev(0,1:nzt_rad+1)
2099       rrtm_play_tmp(nzt_rad+1)   = rrtm_plev(0,nzt_rad+1) * 0.5_wp
2100       rrtm_plev_tmp(nzt_rad+2)   = MIN( 1.0E-4_wp, 0.25_wp                    &
2101                                         * rrtm_plev(0,nzt_rad+1) )
2102 
2103!
2104!--    Calculate trace gas path (zero at surface) with interpolation to the
2105!--    sounding levels
2106       ALLOCATE ( trace_mls_path(1:nzt_rad+2,1:num_trace_gases) )
2107
2108       trace_mls_path(nzb+1,:) = 0.0_wp
2109       
2110       DO k = nzb+2, nzt_rad+2
2111          DO m = 1, num_trace_gases
2112             trace_mls_path(k,m) = trace_mls_path(k-1,m)
2113
2114!
2115!--          When the pressure level is higher than the trace gas pressure
2116!--          level, assume that
2117             IF ( rrtm_plev_tmp(k-1) > p_mls(1) )  THEN             
2118               
2119                trace_mls_path(k,m) = trace_mls_path(k,m) + trace_mls(m,1)     &
2120                                      * ( rrtm_plev_tmp(k-1)                   &
2121                                          - MAX( p_mls(1), rrtm_plev_tmp(k) )  &
2122                                        ) / g
2123             ENDIF
2124
2125!
2126!--          Integrate for each sounding level from the contributing p_mls
2127!--          levels
2128             DO n = 2, np
2129!
2130!--             Limit p_mls so that it is within the model level
2131                p_mls_u = MIN( rrtm_plev_tmp(k-1),                             &
2132                          MAX( rrtm_plev_tmp(k), p_mls(n) ) )
2133                p_mls_l = MIN( rrtm_plev_tmp(k-1),                             &
2134                          MAX( rrtm_plev_tmp(k), p_mls(n-1) ) )
2135
2136                IF ( p_mls_l > p_mls_u )  THEN
2137
2138!
2139!--                Calculate weights for interpolation
2140                   p_mls_m = 0.5_wp * (p_mls_l + p_mls_u)
2141                   p_wgt_u = (p_mls(n-1) - p_mls_m) / (p_mls(n-1) - p_mls(n))
2142                   p_wgt_l = (p_mls_m - p_mls(n))   / (p_mls(n-1) - p_mls(n))
2143
2144!
2145!--                Add level to trace gas path
2146                   trace_mls_path(k,m) = trace_mls_path(k,m)                   &
2147                                         +  ( p_wgt_u * trace_mls(m,n)         &
2148                                            + p_wgt_l * trace_mls(m,n-1) )     &
2149                                         * (p_mls_l - p_mls_u) / g
2150                ENDIF
2151             ENDDO
2152
2153             IF ( rrtm_plev_tmp(k) < p_mls(np) )  THEN
2154                trace_mls_path(k,m) = trace_mls_path(k,m) + trace_mls(m,np)    &
2155                                      * ( MIN( rrtm_plev_tmp(k-1), p_mls(np) ) &
2156                                          - rrtm_plev_tmp(k)                   &
2157                                        ) / g 
2158             ENDIF 
2159          ENDDO
2160       ENDDO
2161
2162
2163!
2164!--    Prepare trace gas path profiles
2165       ALLOCATE ( trace_path_tmp(1:nzt_rad+1) )
2166
2167       DO m = 1, num_trace_gases
2168
2169          trace_path_tmp(1:nzt_rad+1) = ( trace_mls_path(2:nzt_rad+2,m)        &
2170                                       - trace_mls_path(1:nzt_rad+1,m) ) * g   &
2171                                       / ( rrtm_plev_tmp(1:nzt_rad+1)          &
2172                                       - rrtm_plev_tmp(2:nzt_rad+2) )
2173
2174!
2175!--       Save trace gas paths to the respective arrays
2176          SELECT CASE ( TRIM( trace_names(m) ) )
2177
2178             CASE ( 'O3' )
2179
2180                rrtm_o3vmr(0,:) = trace_path_tmp(:)
2181
2182             CASE ( 'CO2' )
2183
2184                rrtm_co2vmr(0,:) = trace_path_tmp(:)
2185
2186             CASE ( 'CH4' )
2187
2188                rrtm_ch4vmr(0,:) = trace_path_tmp(:)
2189
2190             CASE ( 'N2O' )
2191
2192                rrtm_n2ovmr(0,:) = trace_path_tmp(:)
2193
2194             CASE ( 'O2' )
2195
2196                rrtm_o2vmr(0,:) = trace_path_tmp(:)
2197
2198             CASE ( 'CFC11' )
2199
2200                rrtm_cfc11vmr(0,:) = trace_path_tmp(:)
2201
2202             CASE ( 'CFC12' )
2203
2204                rrtm_cfc12vmr(0,:) = trace_path_tmp(:)
2205
2206             CASE ( 'CFC22' )
2207
2208                rrtm_cfc22vmr(0,:) = trace_path_tmp(:)
2209
2210             CASE ( 'CCL4' )
2211
2212                rrtm_ccl4vmr(0,:) = trace_path_tmp(:)
2213
2214             CASE DEFAULT
2215
2216          END SELECT
2217
2218       ENDDO
2219
2220       DEALLOCATE ( trace_path_tmp )
2221       DEALLOCATE ( trace_mls_path )
2222       DEALLOCATE ( rrtm_play_tmp )
2223       DEALLOCATE ( rrtm_plev_tmp )
2224       DEALLOCATE ( trace_mls )
2225       DEALLOCATE ( p_mls )
2226
2227    END SUBROUTINE read_trace_gas_data
2228
2229
2230    SUBROUTINE netcdf_handle_error_rad( routine_name, errno )
2231
2232       USE control_parameters,                                                 &
2233           ONLY:  message_string
2234
2235       USE NETCDF
2236
2237       USE pegrid
2238
2239       IMPLICIT NONE
2240
2241       CHARACTER(LEN=6) ::  message_identifier
2242       CHARACTER(LEN=*) ::  routine_name
2243
2244       INTEGER(iwp) ::  errno
2245
2246       IF ( nc_stat /= NF90_NOERR )  THEN
2247
2248          WRITE( message_identifier, '(''NC'',I4.4)' )  errno
2249          message_string = TRIM( NF90_STRERROR( nc_stat ) )
2250
2251          CALL message( routine_name, message_identifier, 2, 2, 0, 6, 1 )
2252
2253       ENDIF
2254
2255    END SUBROUTINE netcdf_handle_error_rad
2256#endif
2257
2258
2259!------------------------------------------------------------------------------!
2260! Description:
2261! ------------
2262!> Calculate temperature tendency due to radiative cooling/heating.
2263!> Cache-optimized version.
2264!------------------------------------------------------------------------------!
2265 SUBROUTINE radiation_tendency_ij ( i, j, tend )
2266
2267    USE cloud_parameters,                                                      &
2268        ONLY:  pt_d_t
2269
2270    IMPLICIT NONE
2271
2272    INTEGER(iwp) :: i, j, k !< loop indices
2273
2274    REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: tend !< pt tendency term
2275
2276    IF ( radiation_scheme == 'rrtmg' )  THEN
2277#if defined  ( __rrtmg )
2278!
2279!--    Calculate tendency based on heating rate
2280       DO k = nzb+1, nzt+1
2281          tend(k,j,i) = tend(k,j,i) + (rad_lw_hr(k,j,i) + rad_sw_hr(k,j,i))    &
2282                                         * pt_d_t(k) * d_seconds_hour
2283       ENDDO
2284#endif
2285    ENDIF
2286
2287    END SUBROUTINE radiation_tendency_ij
2288
2289
2290!------------------------------------------------------------------------------!
2291! Description:
2292! ------------
2293!> Calculate temperature tendency due to radiative cooling/heating.
2294!> Vector-optimized version
2295!------------------------------------------------------------------------------!
2296 SUBROUTINE radiation_tendency ( tend )
2297
2298    USE cloud_parameters,                                                      &
2299        ONLY:  pt_d_t
2300
2301    USE indices,                                                               &
2302        ONLY:  nxl, nxr, nyn, nys
2303
2304    IMPLICIT NONE
2305
2306    INTEGER(iwp) :: i, j, k !< loop indices
2307
2308    REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: tend !< pt tendency term
2309
2310    IF ( radiation_scheme == 'rrtmg' )  THEN
2311#if defined  ( __rrtmg )
2312!
2313!--    Calculate tendency based on heating rate
2314       DO  i = nxl, nxr
2315          DO  j = nys, nyn
2316             DO k = nzb+1, nzt+1
2317                tend(k,j,i) = tend(k,j,i) + ( rad_lw_hr(k,j,i)                 &
2318                                          +  rad_sw_hr(k,j,i) ) * pt_d_t(k)    &
2319                                          * d_seconds_hour
2320             ENDDO
2321          ENDDO
2322       ENDDO
2323#endif
2324    ENDIF
2325
2326
2327 END SUBROUTINE radiation_tendency
2328
2329!------------------------------------------------------------------------------!
2330!
2331! Description:
2332! ------------
2333!> Subroutine for averaging 3D data
2334!------------------------------------------------------------------------------!
2335SUBROUTINE radiation_3d_data_averaging( mode, variable )
2336 
2337
2338    USE control_parameters
2339
2340    USE indices
2341
2342    USE kinds
2343
2344    IMPLICIT NONE
2345
2346    CHARACTER (LEN=*) ::  mode    !<
2347    CHARACTER (LEN=*) :: variable !<
2348
2349    INTEGER(iwp) ::  i !<
2350    INTEGER(iwp) ::  j !<
2351    INTEGER(iwp) ::  k !<
2352
2353    IF ( mode == 'allocate' )  THEN
2354
2355       SELECT CASE ( TRIM( variable ) )
2356
2357             CASE ( 'rad_net*' )
2358                IF ( .NOT. ALLOCATED( rad_net_av ) )  THEN
2359                   ALLOCATE( rad_net_av(nysg:nyng,nxlg:nxrg) )
2360                ENDIF
2361                rad_net_av = 0.0_wp
2362
2363             CASE ( 'rad_lw_in' )
2364                IF ( .NOT. ALLOCATED( rad_lw_in_av ) )  THEN
2365                   ALLOCATE( rad_lw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
2366                ENDIF
2367                rad_lw_in_av = 0.0_wp
2368
2369             CASE ( 'rad_lw_out' )
2370                IF ( .NOT. ALLOCATED( rad_lw_out_av ) )  THEN
2371                   ALLOCATE( rad_lw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
2372                ENDIF
2373                rad_lw_out_av = 0.0_wp
2374
2375             CASE ( 'rad_lw_cs_hr' )
2376                IF ( .NOT. ALLOCATED( rad_lw_cs_hr_av ) )  THEN
2377                   ALLOCATE( rad_lw_cs_hr_av(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) )
2378                ENDIF
2379                rad_lw_cs_hr_av = 0.0_wp
2380
2381             CASE ( 'rad_lw_hr' )
2382                IF ( .NOT. ALLOCATED( rad_lw_hr_av ) )  THEN
2383                   ALLOCATE( rad_lw_hr_av(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) )
2384                ENDIF
2385                rad_lw_hr_av = 0.0_wp
2386
2387             CASE ( 'rad_sw_in' )
2388                IF ( .NOT. ALLOCATED( rad_sw_in_av ) )  THEN
2389                   ALLOCATE( rad_sw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
2390                ENDIF
2391                rad_sw_in_av = 0.0_wp
2392
2393             CASE ( 'rad_sw_out' )
2394                IF ( .NOT. ALLOCATED( rad_sw_out_av ) )  THEN
2395                   ALLOCATE( rad_sw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
2396                ENDIF
2397                rad_sw_out_av = 0.0_wp
2398
2399             CASE ( 'rad_sw_cs_hr' )
2400                IF ( .NOT. ALLOCATED( rad_sw_cs_hr_av ) )  THEN
2401                   ALLOCATE( rad_sw_cs_hr_av(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) )
2402                ENDIF
2403                rad_sw_cs_hr_av = 0.0_wp
2404
2405             CASE ( 'rad_sw_hr' )
2406                IF ( .NOT. ALLOCATED( rad_sw_hr_av ) )  THEN
2407                   ALLOCATE( rad_sw_hr_av(nzb+1:nzt+1,nysg:nyng,nxlg:nxrg) )
2408                ENDIF
2409                rad_sw_hr_av = 0.0_wp
2410
2411          CASE DEFAULT
2412             CONTINUE
2413
2414       END SELECT
2415
2416    ELSEIF ( mode == 'sum' )  THEN
2417
2418       SELECT CASE ( TRIM( variable ) )
2419
2420          CASE ( 'rad_net*' )
2421             DO  i = nxlg, nxrg
2422                DO  j = nysg, nyng
2423                   rad_net_av(j,i) = rad_net_av(j,i) + rad_net(j,i)
2424                ENDDO
2425             ENDDO
2426
2427          CASE ( 'rad_lw_in' )
2428             DO  i = nxlg, nxrg
2429                DO  j = nysg, nyng
2430                   DO  k = nzb, nzt+1
2431                      rad_lw_in_av(k,j,i) = rad_lw_in_av(k,j,i) + rad_lw_in(k,j,i)
2432                   ENDDO
2433                ENDDO
2434             ENDDO
2435
2436          CASE ( 'rad_lw_out' )
2437             DO  i = nxlg, nxrg
2438                DO  j = nysg, nyng
2439                   DO  k = nzb, nzt+1
2440                      rad_lw_out_av(k,j,i) = rad_lw_out_av(k,j,i) + rad_lw_out(k,j,i)
2441                   ENDDO
2442                ENDDO
2443             ENDDO
2444
2445          CASE ( 'rad_lw_cs_hr' )
2446             DO  i = nxlg, nxrg
2447                DO  j = nysg, nyng
2448                   DO  k = nzb, nzt+1
2449                      rad_lw_cs_hr_av(k,j,i) = rad_lw_cs_hr_av(k,j,i) + rad_lw_cs_hr(k,j,i)
2450                   ENDDO
2451                ENDDO
2452             ENDDO
2453
2454          CASE ( 'rad_lw_hr' )
2455             DO  i = nxlg, nxrg
2456                DO  j = nysg, nyng
2457                   DO  k = nzb, nzt+1
2458                      rad_lw_hr_av(k,j,i) = rad_lw_hr_av(k,j,i) + rad_lw_hr(k,j,i)
2459                   ENDDO
2460                ENDDO
2461             ENDDO
2462
2463          CASE ( 'rad_sw_in' )
2464             DO  i = nxlg, nxrg
2465                DO  j = nysg, nyng
2466                   DO  k = nzb, nzt+1
2467                      rad_sw_in_av(k,j,i) = rad_sw_in_av(k,j,i) + rad_sw_in(k,j,i)
2468                   ENDDO
2469                ENDDO
2470             ENDDO
2471
2472          CASE ( 'rad_sw_out' )
2473             DO  i = nxlg, nxrg
2474                DO  j = nysg, nyng
2475                   DO  k = nzb, nzt+1
2476                      rad_sw_out_av(k,j,i) = rad_sw_out_av(k,j,i) + rad_sw_out(k,j,i)
2477                   ENDDO
2478                ENDDO
2479             ENDDO
2480
2481          CASE ( 'rad_sw_cs_hr' )
2482             DO  i = nxlg, nxrg
2483                DO  j = nysg, nyng
2484                   DO  k = nzb, nzt+1
2485                      rad_sw_cs_hr_av(k,j,i) = rad_sw_cs_hr_av(k,j,i) + rad_sw_cs_hr(k,j,i)
2486                   ENDDO
2487                ENDDO
2488             ENDDO
2489
2490          CASE ( 'rad_sw_hr' )
2491             DO  i = nxlg, nxrg
2492                DO  j = nysg, nyng
2493                   DO  k = nzb, nzt+1
2494                      rad_sw_hr_av(k,j,i) = rad_sw_hr_av(k,j,i) + rad_sw_hr(k,j,i)
2495                   ENDDO
2496                ENDDO
2497             ENDDO
2498
2499          CASE DEFAULT
2500             CONTINUE
2501
2502       END SELECT
2503
2504    ELSEIF ( mode == 'average' )  THEN
2505
2506       SELECT CASE ( TRIM( variable ) )
2507
2508         CASE ( 'rad_net*' )
2509             DO  i = nxlg, nxrg
2510                DO  j = nysg, nyng
2511                   rad_net_av(j,i) = rad_net_av(j,i) / REAL( average_count_3d, KIND=wp )
2512                ENDDO
2513             ENDDO
2514
2515          CASE ( 'rad_lw_in' )
2516             DO  i = nxlg, nxrg
2517                DO  j = nysg, nyng
2518                   DO  k = nzb, nzt+1
2519                      rad_lw_in_av(k,j,i) = rad_lw_in_av(k,j,i) / REAL( average_count_3d, KIND=wp )
2520                   ENDDO
2521                ENDDO
2522             ENDDO
2523
2524          CASE ( 'rad_lw_out' )
2525             DO  i = nxlg, nxrg
2526                DO  j = nysg, nyng
2527                   DO  k = nzb, nzt+1
2528                      rad_lw_out_av(k,j,i) = rad_lw_out_av(k,j,i) / REAL( average_count_3d, KIND=wp )
2529                   ENDDO
2530                ENDDO
2531             ENDDO
2532
2533          CASE ( 'rad_lw_cs_hr' )
2534             DO  i = nxlg, nxrg
2535                DO  j = nysg, nyng
2536                   DO  k = nzb, nzt+1
2537                      rad_lw_cs_hr_av(k,j,i) = rad_lw_cs_hr_av(k,j,i) / REAL( average_count_3d, KIND=wp )
2538                   ENDDO
2539                ENDDO
2540             ENDDO
2541
2542          CASE ( 'rad_lw_hr' )
2543             DO  i = nxlg, nxrg
2544                DO  j = nysg, nyng
2545                   DO  k = nzb, nzt+1
2546                      rad_lw_hr_av(k,j,i) = rad_lw_hr_av(k,j,i) / REAL( average_count_3d, KIND=wp )
2547                   ENDDO
2548                ENDDO
2549             ENDDO
2550
2551          CASE ( 'rad_sw_in' )
2552             DO  i = nxlg, nxrg
2553                DO  j = nysg, nyng
2554                   DO  k = nzb, nzt+1
2555                      rad_sw_in_av(k,j,i) = rad_sw_in_av(k,j,i) / REAL( average_count_3d, KIND=wp )
2556                   ENDDO
2557                ENDDO
2558             ENDDO
2559
2560          CASE ( 'rad_sw_out' )
2561             DO  i = nxlg, nxrg
2562                DO  j = nysg, nyng
2563                   DO  k = nzb, nzt+1
2564                      rad_sw_out_av(k,j,i) = rad_sw_out_av(k,j,i) / REAL( average_count_3d, KIND=wp )
2565                   ENDDO
2566                ENDDO
2567             ENDDO
2568
2569          CASE ( 'rad_sw_cs_hr' )
2570             DO  i = nxlg, nxrg
2571                DO  j = nysg, nyng
2572                   DO  k = nzb, nzt+1
2573                      rad_sw_cs_hr_av(k,j,i) = rad_sw_cs_hr_av(k,j,i) / REAL( average_count_3d, KIND=wp )
2574                   ENDDO
2575                ENDDO
2576             ENDDO
2577
2578          CASE ( 'rad_sw_hr' )
2579             DO  i = nxlg, nxrg
2580                DO  j = nysg, nyng
2581                   DO  k = nzb, nzt+1
2582                      rad_sw_hr_av(k,j,i) = rad_sw_hr_av(k,j,i) / REAL( average_count_3d, KIND=wp )
2583                   ENDDO
2584                ENDDO
2585             ENDDO
2586
2587       END SELECT
2588
2589    ENDIF
2590
2591END SUBROUTINE radiation_3d_data_averaging
2592
2593
2594!------------------------------------------------------------------------------!
2595!
2596! Description:
2597! ------------
2598!> Subroutine defining appropriate grid for netcdf variables.
2599!> It is called out from subroutine netcdf.
2600!------------------------------------------------------------------------------!
2601SUBROUTINE radiation_define_netcdf_grid( var, found, grid_x, grid_y, grid_z )
2602   
2603    IMPLICIT NONE
2604
2605    CHARACTER (LEN=*), INTENT(IN)  ::  var         !<
2606    LOGICAL, INTENT(OUT)           ::  found       !<
2607    CHARACTER (LEN=*), INTENT(OUT) ::  grid_x      !<
2608    CHARACTER (LEN=*), INTENT(OUT) ::  grid_y      !<
2609    CHARACTER (LEN=*), INTENT(OUT) ::  grid_z      !<
2610
2611    found  = .TRUE.
2612
2613
2614!
2615!-- Check for the grid
2616    SELECT CASE ( TRIM( var ) )
2617
2618       CASE ( 'rad_lw_cs_hr', 'rad_lw_hr', 'rad_sw_cs_hr', 'rad_sw_hr',        &
2619              'rad_lw_cs_hr_xy', 'rad_lw_hr_xy', 'rad_sw_cs_hr_xy',            &
2620              'rad_sw_hr_xy', 'rad_lw_cs_hr_xz', 'rad_lw_hr_xz',               &
2621              'rad_sw_cs_hr_xz', 'rad_sw_hr_xz', 'rad_lw_cs_hr_yz',            &
2622              'rad_lw_hr_yz', 'rad_sw_cs_hr_yz', 'rad_sw_hr_yz' )
2623          grid_x = 'x'
2624          grid_y = 'y'
2625          grid_z = 'zu'
2626
2627       CASE ( 'rad_lw_in', 'rad_lw_out', 'rad_sw_in', 'rad_sw_out',            &
2628              'rad_lw_in_xy', 'rad_lw_out_xy', 'rad_sw_in_xy','rad_sw_out_xy', &
2629              'rad_lw_in_xz', 'rad_lw_out_xz', 'rad_sw_in_xz','rad_sw_out_xz', &
2630              'rad_lw_in_yz', 'rad_lw_out_yz', 'rad_sw_in_yz','rad_sw_out_yz' )
2631          grid_x = 'x'
2632          grid_y = 'y'
2633          grid_z = 'zw'
2634
2635
2636       CASE DEFAULT
2637          found  = .FALSE.
2638          grid_x = 'none'
2639          grid_y = 'none'
2640          grid_z = 'none'
2641
2642        END SELECT
2643
2644    END SUBROUTINE radiation_define_netcdf_grid
2645
2646!------------------------------------------------------------------------------!
2647!
2648! Description:
2649! ------------
2650!> Subroutine defining 3D output variables
2651!------------------------------------------------------------------------------!
2652 SUBROUTINE radiation_data_output_2d( av, variable, found, grid, mode,         &
2653                                      local_pf, two_d )
2654 
2655    USE indices
2656
2657    USE kinds
2658
2659
2660    IMPLICIT NONE
2661
2662    CHARACTER (LEN=*) ::  grid     !<
2663    CHARACTER (LEN=*) ::  mode     !<
2664    CHARACTER (LEN=*) ::  variable !<
2665
2666    INTEGER(iwp) ::  av !<
2667    INTEGER(iwp) ::  i  !<
2668    INTEGER(iwp) ::  j  !<
2669    INTEGER(iwp) ::  k  !<
2670
2671    LOGICAL      ::  found !<
2672    LOGICAL      ::  two_d !< flag parameter that indicates 2D variables (horizontal cross sections)
2673
2674    REAL(wp), DIMENSION(nxlg:nxrg,nysg:nyng,nzb:nzt+1) ::  local_pf !<
2675
2676    found = .TRUE.
2677
2678    SELECT CASE ( TRIM( variable ) )
2679
2680       CASE ( 'rad_net*_xy' )        ! 2d-array
2681          IF ( av == 0 ) THEN
2682             DO  i = nxlg, nxrg
2683                DO  j = nysg, nyng
2684                   local_pf(i,j,nzb+1) = rad_net(j,i)
2685                ENDDO
2686             ENDDO
2687          ELSE
2688             DO  i = nxlg, nxrg
2689                DO  j = nysg, nyng 
2690                   local_pf(i,j,nzb+1) = rad_net_av(j,i)
2691                ENDDO
2692             ENDDO
2693          ENDIF
2694          two_d = .TRUE.
2695          grid = 'zu1'
2696
2697 
2698       CASE ( 'rad_lw_in_xy', 'rad_lw_in_xz', 'rad_lw_in_yz' )
2699          IF ( av == 0 ) THEN
2700             DO  i = nxlg, nxrg
2701                DO  j = nysg, nyng
2702                   DO  k = nzb, nzt+1
2703                      local_pf(i,j,k) = rad_lw_in(k,j,i)
2704                   ENDDO
2705                ENDDO
2706             ENDDO
2707          ELSE
2708             DO  i = nxlg, nxrg
2709                DO  j = nysg, nyng 
2710                   DO  k = nzb, nzt+1
2711                      local_pf(i,j,k) = rad_lw_in_av(k,j,i)
2712                   ENDDO
2713                ENDDO
2714             ENDDO
2715          ENDIF
2716          IF ( mode == 'xy' )  grid = 'zu'
2717
2718       CASE ( 'rad_lw_out_xy', 'rad_lw_out_xz', 'rad_lw_out_yz' )
2719          IF ( av == 0 ) THEN
2720             DO  i = nxlg, nxrg
2721                DO  j = nysg, nyng
2722                   DO  k = nzb, nzt+1
2723                      local_pf(i,j,k) = rad_lw_out(k,j,i)
2724                   ENDDO
2725                ENDDO
2726             ENDDO
2727          ELSE
2728             DO  i = nxlg, nxrg
2729                DO  j = nysg, nyng 
2730                   DO  k = nzb, nzt+1
2731                      local_pf(i,j,k) = rad_lw_out_av(k,j,i)
2732                   ENDDO
2733                ENDDO
2734             ENDDO
2735          ENDIF   
2736          IF ( mode == 'xy' )  grid = 'zu'
2737
2738       CASE ( 'rad_lw_cs_hr_xy', 'rad_lw_cs_hr_xz', 'rad_lw_cs_hr_yz' )
2739          IF ( av == 0 ) THEN
2740             DO  i = nxlg, nxrg
2741                DO  j = nysg, nyng
2742                   DO  k = nzb, nzt+1
2743                      local_pf(i,j,k) = rad_lw_cs_hr(k,j,i)
2744                   ENDDO
2745                ENDDO
2746             ENDDO
2747          ELSE
2748             DO  i = nxlg, nxrg
2749                DO  j = nysg, nyng 
2750                   DO  k = nzb, nzt+1
2751                      local_pf(i,j,k) = rad_lw_cs_hr_av(k,j,i)
2752                   ENDDO
2753                ENDDO
2754             ENDDO
2755          ENDIF
2756          IF ( mode == 'xy' )  grid = 'zw'
2757
2758       CASE ( 'rad_lw_hr_xy', 'rad_lw_hr_xz', 'rad_lw_hr_yz' )
2759          IF ( av == 0 ) THEN
2760             DO  i = nxlg, nxrg
2761                DO  j = nysg, nyng
2762                   DO  k = nzb, nzt+1
2763                      local_pf(i,j,k) = rad_lw_hr(k,j,i)
2764                   ENDDO
2765                ENDDO
2766             ENDDO
2767          ELSE
2768             DO  i = nxlg, nxrg
2769                DO  j = nysg, nyng 
2770                   DO  k = nzb, nzt+1
2771                      local_pf(i,j,k) = rad_lw_hr_av(k,j,i)
2772                   ENDDO
2773                ENDDO
2774             ENDDO
2775          ENDIF
2776          IF ( mode == 'xy' )  grid = 'zw'
2777
2778       CASE ( 'rad_sw_in_xy', 'rad_sw_in_xz', 'rad_sw_in_yz' )
2779          IF ( av == 0 ) THEN
2780             DO  i = nxlg, nxrg
2781                DO  j = nysg, nyng
2782                   DO  k = nzb, nzt+1
2783                      local_pf(i,j,k) = rad_sw_in(k,j,i)
2784                   ENDDO
2785                ENDDO
2786             ENDDO
2787          ELSE
2788             DO  i = nxlg, nxrg
2789                DO  j = nysg, nyng 
2790                   DO  k = nzb, nzt+1
2791                      local_pf(i,j,k) = rad_sw_in_av(k,j,i)
2792                   ENDDO
2793                ENDDO
2794             ENDDO
2795          ENDIF
2796          IF ( mode == 'xy' )  grid = 'zu'
2797
2798       CASE ( 'rad_sw_out_xy', 'rad_sw_out_xz', 'rad_sw_out_yz' )
2799          IF ( av == 0 ) THEN
2800             DO  i = nxlg, nxrg
2801                DO  j = nysg, nyng
2802                   DO  k = nzb, nzt+1
2803                      local_pf(i,j,k) = rad_sw_out(k,j,i)
2804                   ENDDO
2805                ENDDO
2806             ENDDO
2807          ELSE
2808             DO  i = nxlg, nxrg
2809                DO  j = nysg, nyng 
2810                   DO  k = nzb, nzt+1
2811                      local_pf(i,j,k) = rad_sw_out_av(k,j,i)
2812                   ENDDO
2813                ENDDO
2814             ENDDO
2815          ENDIF
2816          IF ( mode == 'xy' )  grid = 'zu'
2817
2818       CASE ( 'rad_sw_cs_hr_xy', 'rad_sw_cs_hr_xz', 'rad_sw_cs_hr_yz' )
2819          IF ( av == 0 ) THEN
2820             DO  i = nxlg, nxrg
2821                DO  j = nysg, nyng
2822                   DO  k = nzb, nzt+1
2823                      local_pf(i,j,k) = rad_sw_cs_hr(k,j,i)
2824                   ENDDO
2825                ENDDO
2826             ENDDO
2827          ELSE
2828             DO  i = nxlg, nxrg
2829                DO  j = nysg, nyng 
2830                   DO  k = nzb, nzt+1
2831                      local_pf(i,j,k) = rad_sw_cs_hr_av(k,j,i)
2832                   ENDDO
2833                ENDDO
2834             ENDDO
2835          ENDIF
2836          IF ( mode == 'xy' )  grid = 'zw'
2837
2838       CASE ( 'rad_sw_hr_xy', 'rad_sw_hr_xz', 'rad_sw_hr_yz' )
2839          IF ( av == 0 ) THEN
2840             DO  i = nxlg, nxrg
2841                DO  j = nysg, nyng
2842                   DO  k = nzb, nzt+1
2843                      local_pf(i,j,k) = rad_sw_hr(k,j,i)
2844                   ENDDO
2845                ENDDO
2846             ENDDO
2847          ELSE
2848             DO  i = nxlg, nxrg
2849                DO  j = nysg, nyng 
2850                   DO  k = nzb, nzt+1
2851                      local_pf(i,j,k) = rad_sw_hr_av(k,j,i)
2852                   ENDDO
2853                ENDDO
2854             ENDDO
2855          ENDIF
2856          IF ( mode == 'xy' )  grid = 'zw'
2857
2858       CASE DEFAULT
2859          found = .FALSE.
2860          grid  = 'none'
2861
2862    END SELECT
2863 
2864 END SUBROUTINE radiation_data_output_2d
2865
2866
2867!------------------------------------------------------------------------------!
2868!
2869! Description:
2870! ------------
2871!> Subroutine defining 3D output variables
2872!------------------------------------------------------------------------------!
2873 SUBROUTINE radiation_data_output_3d( av, variable, found, local_pf )
2874 
2875
2876    USE indices
2877
2878    USE kinds
2879
2880
2881    IMPLICIT NONE
2882
2883    CHARACTER (LEN=*) ::  variable !<
2884
2885    INTEGER(iwp) ::  av    !<
2886    INTEGER(iwp) ::  i     !<
2887    INTEGER(iwp) ::  j     !<
2888    INTEGER(iwp) ::  k     !<
2889
2890    LOGICAL      ::  found !<
2891
2892    REAL(sp), DIMENSION(nxlg:nxrg,nysg:nyng,nzb:nzt+1) ::  local_pf !<
2893
2894
2895    found = .TRUE.
2896
2897
2898    SELECT CASE ( TRIM( variable ) )
2899
2900      CASE ( 'rad_sw_in' )
2901         IF ( av == 0 )  THEN
2902            DO  i = nxlg, nxrg
2903               DO  j = nysg, nyng
2904                  DO  k = nzb, nzt+1
2905                     local_pf(i,j,k) = rad_sw_in(k,j,i)
2906                  ENDDO
2907               ENDDO
2908            ENDDO
2909         ELSE
2910            DO  i = nxlg, nxrg
2911               DO  j = nysg, nyng
2912                  DO  k = nzb, nzt+1
2913                     local_pf(i,j,k) = rad_sw_in_av(k,j,i)
2914                  ENDDO
2915               ENDDO
2916            ENDDO
2917         ENDIF
2918
2919      CASE ( 'rad_sw_out' )
2920         IF ( av == 0 )  THEN
2921            DO  i = nxlg, nxrg
2922               DO  j = nysg, nyng
2923                  DO  k = nzb, nzt+1
2924                     local_pf(i,j,k) = rad_sw_out(k,j,i)
2925                  ENDDO
2926               ENDDO
2927            ENDDO
2928         ELSE
2929            DO  i = nxlg, nxrg
2930               DO  j = nysg, nyng
2931                  DO  k = nzb, nzt+1
2932                     local_pf(i,j,k) = rad_sw_out_av(k,j,i)
2933                  ENDDO
2934               ENDDO
2935            ENDDO
2936         ENDIF
2937
2938      CASE ( 'rad_sw_cs_hr' )
2939         IF ( av == 0 )  THEN
2940            DO  i = nxlg, nxrg
2941               DO  j = nysg, nyng
2942                  DO  k = nzb, nzt+1
2943                     local_pf(i,j,k) = rad_sw_cs_hr(k,j,i)
2944                  ENDDO
2945               ENDDO
2946            ENDDO
2947         ELSE
2948            DO  i = nxlg, nxrg
2949               DO  j = nysg, nyng
2950                  DO  k = nzb, nzt+1
2951                     local_pf(i,j,k) = rad_sw_cs_hr_av(k,j,i)
2952                  ENDDO
2953               ENDDO
2954            ENDDO
2955         ENDIF
2956
2957      CASE ( 'rad_sw_hr' )
2958         IF ( av == 0 )  THEN
2959            DO  i = nxlg, nxrg
2960               DO  j = nysg, nyng
2961                  DO  k = nzb, nzt+1
2962                     local_pf(i,j,k) = rad_sw_hr(k,j,i)
2963                  ENDDO
2964               ENDDO
2965            ENDDO
2966         ELSE
2967            DO  i = nxlg, nxrg
2968               DO  j = nysg, nyng
2969                  DO  k = nzb, nzt+1
2970                     local_pf(i,j,k) = rad_sw_hr_av(k,j,i)
2971                  ENDDO
2972               ENDDO
2973            ENDDO
2974         ENDIF
2975
2976      CASE ( 'rad_lw_in' )
2977         IF ( av == 0 )  THEN
2978            DO  i = nxlg, nxrg
2979               DO  j = nysg, nyng
2980                  DO  k = nzb, nzt+1
2981                     local_pf(i,j,k) = rad_lw_in(k,j,i)
2982                  ENDDO
2983               ENDDO
2984            ENDDO
2985         ELSE
2986            DO  i = nxlg, nxrg
2987               DO  j = nysg, nyng
2988                  DO  k = nzb, nzt+1
2989                     local_pf(i,j,k) = rad_lw_in_av(k,j,i)
2990                  ENDDO
2991               ENDDO
2992            ENDDO
2993         ENDIF
2994
2995      CASE ( 'rad_lw_out' )
2996         IF ( av == 0 )  THEN
2997            DO  i = nxlg, nxrg
2998               DO  j = nysg, nyng
2999                  DO  k = nzb, nzt+1
3000                     local_pf(i,j,k) = rad_lw_out(k,j,i)
3001                  ENDDO
3002               ENDDO
3003            ENDDO
3004         ELSE
3005            DO  i = nxlg, nxrg
3006               DO  j = nysg, nyng
3007                  DO  k = nzb, nzt+1
3008                     local_pf(i,j,k) = rad_lw_out_av(k,j,i)
3009                  ENDDO
3010               ENDDO
3011            ENDDO
3012         ENDIF
3013
3014      CASE ( 'rad_lw_cs_hr' )
3015         IF ( av == 0 )  THEN
3016            DO  i = nxlg, nxrg
3017               DO  j = nysg, nyng
3018                  DO  k = nzb, nzt+1
3019                     local_pf(i,j,k) = rad_lw_cs_hr(k,j,i)
3020                  ENDDO
3021               ENDDO
3022            ENDDO
3023         ELSE
3024            DO  i = nxlg, nxrg
3025               DO  j = nysg, nyng
3026                  DO  k = nzb, nzt+1
3027                     local_pf(i,j,k) = rad_lw_cs_hr_av(k,j,i)
3028                  ENDDO
3029               ENDDO
3030            ENDDO
3031         ENDIF
3032
3033      CASE ( 'rad_lw_hr' )
3034         IF ( av == 0 )  THEN
3035            DO  i = nxlg, nxrg
3036               DO  j = nysg, nyng
3037                  DO  k = nzb, nzt+1
3038                     local_pf(i,j,k) = rad_lw_hr(k,j,i)
3039                  ENDDO
3040               ENDDO
3041            ENDDO
3042         ELSE
3043            DO  i = nxlg, nxrg
3044               DO  j = nysg, nyng
3045                  DO  k = nzb, nzt+1
3046                     local_pf(i,j,k) = rad_lw_hr_av(k,j,i)
3047                  ENDDO
3048               ENDDO
3049            ENDDO
3050         ENDIF
3051
3052       CASE DEFAULT
3053          found = .FALSE.
3054
3055    END SELECT
3056
3057
3058 END SUBROUTINE radiation_data_output_3d
3059
3060!------------------------------------------------------------------------------!
3061!
3062! Description:
3063! ------------
3064!> Subroutine defining masked data output
3065!------------------------------------------------------------------------------!
3066 SUBROUTINE radiation_data_output_mask( av, variable, found, local_pf )
3067 
3068    USE control_parameters
3069       
3070    USE indices
3071   
3072    USE kinds
3073   
3074
3075    IMPLICIT NONE
3076
3077    CHARACTER (LEN=*) ::  variable   !<
3078
3079    INTEGER(iwp) ::  av   !<
3080    INTEGER(iwp) ::  i    !<
3081    INTEGER(iwp) ::  j    !<
3082    INTEGER(iwp) ::  k    !<
3083
3084    LOGICAL ::  found     !<
3085
3086    REAL(wp),                                                                  &
3087       DIMENSION(mask_size_l(mid,1),mask_size_l(mid,2),mask_size_l(mid,3)) ::  &
3088          local_pf   !<
3089
3090
3091    found = .TRUE.
3092
3093    SELECT CASE ( TRIM( variable ) )
3094
3095
3096       CASE ( 'rad_lw_in' )
3097          IF ( av == 0 )  THEN
3098             DO  i = 1, mask_size_l(mid,1)
3099                DO  j = 1, mask_size_l(mid,2)
3100                   DO  k = 1, mask_size_l(mid,3)
3101                       local_pf(i,j,k) = rad_lw_in(mask_k(mid,k),              &
3102                                            mask_j(mid,j),mask_i(mid,i))
3103                    ENDDO
3104                 ENDDO
3105              ENDDO
3106          ELSE
3107             DO  i = 1, mask_size_l(mid,1)
3108                DO  j = 1, mask_size_l(mid,2)
3109                   DO  k = 1, mask_size_l(mid,3)
3110                       local_pf(i,j,k) = rad_lw_in_av(mask_k(mid,k),           &
3111                                               mask_j(mid,j),mask_i(mid,i))
3112                   ENDDO
3113                ENDDO
3114             ENDDO
3115          ENDIF
3116
3117       CASE ( 'rad_lw_out' )
3118          IF ( av == 0 )  THEN
3119             DO  i = 1, mask_size_l(mid,1)
3120                DO  j = 1, mask_size_l(mid,2)
3121                   DO  k = 1, mask_size_l(mid,3)
3122                       local_pf(i,j,k) = rad_lw_out(mask_k(mid,k),             &
3123                                            mask_j(mid,j),mask_i(mid,i))
3124                    ENDDO
3125                 ENDDO
3126              ENDDO
3127          ELSE
3128             DO  i = 1, mask_size_l(mid,1)
3129                DO  j = 1, mask_size_l(mid,2)
3130                   DO  k = 1, mask_size_l(mid,3)
3131                       local_pf(i,j,k) = rad_lw_out_av(mask_k(mid,k),          &
3132                                               mask_j(mid,j),mask_i(mid,i))
3133                   ENDDO
3134                ENDDO
3135             ENDDO
3136          ENDIF
3137
3138       CASE ( 'rad_lw_cs_hr' )
3139          IF ( av == 0 )  THEN
3140             DO  i = 1, mask_size_l(mid,1)
3141                DO  j = 1, mask_size_l(mid,2)
3142                   DO  k = 1, mask_size_l(mid,3)
3143                       local_pf(i,j,k) = rad_lw_cs_hr(mask_k(mid,k),           &
3144                                            mask_j(mid,j),mask_i(mid,i))
3145                    ENDDO
3146                 ENDDO
3147              ENDDO
3148          ELSE
3149             DO  i = 1, mask_size_l(mid,1)
3150                DO  j = 1, mask_size_l(mid,2)
3151                   DO  k = 1, mask_size_l(mid,3)
3152                       local_pf(i,j,k) = rad_lw_cs_hr_av(mask_k(mid,k),        &
3153                                               mask_j(mid,j),mask_i(mid,i))
3154                   ENDDO
3155                ENDDO
3156             ENDDO
3157          ENDIF
3158
3159       CASE ( 'rad_lw_hr' )
3160          IF ( av == 0 )  THEN
3161             DO  i = 1, mask_size_l(mid,1)
3162                DO  j = 1, mask_size_l(mid,2)
3163                   DO  k = 1, mask_size_l(mid,3)
3164                       local_pf(i,j,k) = rad_lw_hr(mask_k(mid,k),              &
3165                                            mask_j(mid,j),mask_i(mid,i))
3166                    ENDDO
3167                 ENDDO
3168              ENDDO
3169          ELSE
3170             DO  i = 1, mask_size_l(mid,1)
3171                DO  j = 1, mask_size_l(mid,2)
3172                   DO  k = 1, mask_size_l(mid,3)
3173                       local_pf(i,j,k) = rad_lw_hr_av(mask_k(mid,k),           &
3174                                               mask_j(mid,j),mask_i(mid,i))
3175                   ENDDO
3176                ENDDO
3177             ENDDO
3178          ENDIF
3179
3180       CASE ( 'rad_sw_in' )
3181          IF ( av == 0 )  THEN
3182             DO  i = 1, mask_size_l(mid,1)
3183                DO  j = 1, mask_size_l(mid,2)
3184                   DO  k = 1, mask_size_l(mid,3)
3185                       local_pf(i,j,k) = rad_sw_in(mask_k(mid,k),              &
3186                                            mask_j(mid,j),mask_i(mid,i))
3187                    ENDDO
3188                 ENDDO
3189              ENDDO
3190          ELSE
3191             DO  i = 1, mask_size_l(mid,1)
3192                DO  j = 1, mask_size_l(mid,2)
3193                   DO  k = 1, mask_size_l(mid,3)
3194                       local_pf(i,j,k) = rad_sw_in_av(mask_k(mid,k),           &
3195                                               mask_j(mid,j),mask_i(mid,i))
3196                   ENDDO
3197                ENDDO
3198             ENDDO
3199          ENDIF
3200
3201       CASE ( 'rad_sw_out' )
3202          IF ( av == 0 )  THEN
3203             DO  i = 1, mask_size_l(mid,1)
3204                DO  j = 1, mask_size_l(mid,2)
3205                   DO  k = 1, mask_size_l(mid,3)
3206                       local_pf(i,j,k) = rad_sw_out(mask_k(mid,k),             &
3207                                            mask_j(mid,j),mask_i(mid,i))
3208                    ENDDO
3209                 ENDDO
3210              ENDDO
3211          ELSE
3212             DO  i = 1, mask_size_l(mid,1)
3213                DO  j = 1, mask_size_l(mid,2)
3214                   DO  k = 1, mask_size_l(mid,3)
3215                       local_pf(i,j,k) = rad_sw_out_av(mask_k(mid,k),          &
3216                                               mask_j(mid,j),mask_i(mid,i))
3217                   ENDDO
3218                ENDDO
3219             ENDDO
3220          ENDIF
3221
3222       CASE ( 'rad_sw_cs_hr' )
3223          IF ( av == 0 )  THEN
3224             DO  i = 1, mask_size_l(mid,1)
3225                DO  j = 1, mask_size_l(mid,2)
3226                   DO  k = 1, mask_size_l(mid,3)
3227                       local_pf(i,j,k) = rad_sw_cs_hr(mask_k(mid,k),           &
3228                                            mask_j(mid,j),mask_i(mid,i))
3229                    ENDDO
3230                 ENDDO
3231              ENDDO
3232          ELSE
3233             DO  i = 1, mask_size_l(mid,1)
3234                DO  j = 1, mask_size_l(mid,2)
3235                   DO  k = 1, mask_size_l(mid,3)
3236                       local_pf(i,j,k) = rad_sw_cs_hr_av(mask_k(mid,k),        &
3237                                               mask_j(mid,j),mask_i(mid,i))
3238                   ENDDO
3239                ENDDO
3240             ENDDO
3241          ENDIF
3242
3243       CASE ( 'rad_sw_hr' )
3244          IF ( av == 0 )  THEN
3245             DO  i = 1, mask_size_l(mid,1)
3246                DO  j = 1, mask_size_l(mid,2)
3247                   DO  k = 1, mask_size_l(mid,3)
3248                       local_pf(i,j,k) = rad_sw_hr(mask_k(mid,k),              &
3249                                            mask_j(mid,j),mask_i(mid,i))
3250                    ENDDO
3251                 ENDDO
3252              ENDDO
3253          ELSE
3254             DO  i = 1, mask_size_l(mid,1)
3255                DO  j = 1, mask_size_l(mid,2)
3256                   DO  k = 1, mask_size_l(mid,3)
3257                       local_pf(i,j,k) = rad_sw_hr_av(mask_k(mid,k),           &
3258                                               mask_j(mid,j),mask_i(mid,i))
3259                   ENDDO
3260                ENDDO
3261             ENDDO
3262          ENDIF
3263
3264       CASE DEFAULT
3265          found = .FALSE.
3266
3267    END SELECT
3268
3269
3270 END SUBROUTINE radiation_data_output_mask
3271
3272
3273!------------------------------------------------------------------------------!
3274!
3275! Description:
3276! ------------
3277!> Subroutine defines masked output variables
3278!------------------------------------------------------------------------------!
3279 SUBROUTINE radiation_last_actions
3280 
3281
3282    USE control_parameters
3283       
3284    USE kinds
3285
3286    IMPLICIT NONE
3287
3288    IF ( write_binary(1:4) == 'true' )  THEN
3289       IF ( ALLOCATED( rad_net ) )  THEN
3290          WRITE ( 14 )  'rad_net             ';  WRITE ( 14 )  rad_net 
3291       ENDIF
3292       IF ( ALLOCATED( rad_net_av ) )  THEN
3293          WRITE ( 14 )  'rad_net_av          ';  WRITE ( 14 )  rad_net_av 
3294       ENDIF 
3295       IF ( ALLOCATED( rad_lw_in ) )  THEN
3296          WRITE ( 14 )  'rad_lw_in           ';  WRITE ( 14 )  rad_lw_in 
3297       ENDIF
3298       IF ( ALLOCATED( rad_lw_in_av ) )  THEN
3299          WRITE ( 14 )  'rad_lw_in_av        ';  WRITE ( 14 )  rad_lw_in_av 
3300       ENDIF
3301       IF ( ALLOCATED( rad_lw_out ) )  THEN
3302          WRITE ( 14 )  'rad_lw_out          ';  WRITE ( 14 )  rad_lw_out 
3303       ENDIF
3304       IF ( ALLOCATED( rad_lw_out_av ) )  THEN
3305          WRITE ( 14 )  'rad_lw_out_av       ';  WRITE ( 14 )  rad_lw_out_av 
3306       ENDIF
3307       IF ( ALLOCATED( rad_lw_out_change_0 ) )  THEN
3308          WRITE ( 14 )  'rad_lw_out_change_0 '
3309          WRITE ( 14 )  rad_lw_out_change_0
3310       ENDIF
3311       IF ( ALLOCATED( rad_lw_cs_hr ) )  THEN
3312          WRITE ( 14 )  'rad_lw_cs_hr        ';  WRITE ( 14 )  rad_lw_cs_hr
3313       ENDIF
3314       IF ( ALLOCATED( rad_lw_cs_hr_av ) )  THEN
3315          WRITE ( 14 )  'rad_lw_cs_hr_av     ';  WRITE ( 14 )  rad_lw_cs_hr_av
3316       ENDIF
3317       IF ( ALLOCATED( rad_lw_hr ) )  THEN
3318          WRITE ( 14 )  'rad_lw_hr           ';  WRITE ( 14 )  rad_lw_hr
3319       ENDIF
3320       IF ( ALLOCATED( rad_lw_hr_av ) )  THEN
3321          WRITE ( 14 )  'rad_lw_hr_av        ';  WRITE ( 14 )  rad_lw_hr_av
3322       ENDIF
3323       IF ( ALLOCATED( rad_sw_in ) )  THEN
3324          WRITE ( 14 )  'rad_sw_in           ';  WRITE ( 14 )  rad_sw_in 
3325       ENDIF
3326       IF ( ALLOCATED( rad_sw_in_av ) )  THEN
3327          WRITE ( 14 )  'rad_sw_in_av        ';  WRITE ( 14 )  rad_sw_in_av 
3328       ENDIF
3329       IF ( ALLOCATED( rad_sw_out ) )  THEN
3330          WRITE ( 14 )  'rad_sw_out          ';  WRITE ( 14 )  rad_sw_out 
3331       ENDIF
3332       IF ( ALLOCATED( rad_sw_out_av ) )  THEN
3333          WRITE ( 14 )  'rad_sw_out_av       ';  WRITE ( 14 )  rad_sw_out_av 
3334       ENDIF
3335       IF ( ALLOCATED( rad_sw_cs_hr ) )  THEN
3336          WRITE ( 14 )  'rad_sw_cs_hr        ';  WRITE ( 14 )  rad_sw_cs_hr
3337       ENDIF
3338       IF ( ALLOCATED( rad_sw_cs_hr_av ) )  THEN
3339          WRITE ( 14 )  'rad_sw_cs_hr_av     ';  WRITE ( 14 )  rad_sw_cs_hr_av
3340       ENDIF
3341       IF ( ALLOCATED( rad_sw_hr ) )  THEN
3342          WRITE ( 14 )  'rad_sw_hr           ';  WRITE ( 14 )  rad_sw_hr
3343       ENDIF
3344       IF ( ALLOCATED( rad_sw_hr_av ) )  THEN
3345          WRITE ( 14 )  'rad_sw_hr_av        ';  WRITE ( 14 )  rad_sw_hr_av
3346       ENDIF
3347
3348       WRITE ( 14 )  '*** end rad ***     '
3349
3350    ENDIF
3351
3352 END SUBROUTINE radiation_last_actions
3353
3354
3355SUBROUTINE radiation_read_restart_data( i, nxlfa, nxl_on_file, nxrfa, nxr_on_file,   &
3356                                     nynfa, nyn_on_file, nysfa, nys_on_file,   &
3357                                     offset_xa, offset_ya, overlap_count,      &
3358                                     tmp_2d, tmp_3d )
3359 
3360
3361    USE control_parameters
3362       
3363    USE indices
3364   
3365    USE kinds
3366   
3367    USE pegrid
3368
3369    IMPLICIT NONE
3370
3371    CHARACTER (LEN=20) :: field_char   !<
3372
3373    INTEGER(iwp) ::  i               !<
3374    INTEGER(iwp) ::  k               !<
3375    INTEGER(iwp) ::  nxlc            !<
3376    INTEGER(iwp) ::  nxlf            !<
3377    INTEGER(iwp) ::  nxl_on_file     !<
3378    INTEGER(iwp) ::  nxrc            !<
3379    INTEGER(iwp) ::  nxrf            !<
3380    INTEGER(iwp) ::  nxr_on_file     !<
3381    INTEGER(iwp) ::  nync            !<
3382    INTEGER(iwp) ::  nynf            !<
3383    INTEGER(iwp) ::  nyn_on_file     !<
3384    INTEGER(iwp) ::  nysc            !<
3385    INTEGER(iwp) ::  nysf            !<
3386    INTEGER(iwp) ::  nys_on_file     !<
3387    INTEGER(iwp) ::  overlap_count   !<
3388
3389    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  nxlfa       !<
3390    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  nxrfa       !<
3391    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  nynfa       !<
3392    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  nysfa       !<
3393    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  offset_xa   !<
3394    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  offset_ya   !<
3395
3396    REAL(wp),                                                                  &
3397       DIMENSION(nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) ::&
3398          tmp_2d   !<
3399
3400    REAL(wp),                                                                  &
3401       DIMENSION(nzb:nzt+1,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) ::&
3402          tmp_3d   !<
3403
3404    REAL(wp),                                                                  &
3405       DIMENSION(0:0,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) ::&
3406          tmp_3d2   !<
3407
3408
3409
3410   IF ( initializing_actions == 'read_restart_data' )  THEN
3411      READ ( 13 )  field_char
3412
3413      DO  WHILE ( TRIM( field_char ) /= '*** end rad ***' )
3414
3415         DO  k = 1, overlap_count
3416
3417            nxlf = nxlfa(i,k)
3418            nxlc = nxlfa(i,k) + offset_xa(i,k)
3419            nxrf = nxrfa(i,k)
3420            nxrc = nxrfa(i,k) + offset_xa(i,k)
3421            nysf = nysfa(i,k)
3422            nysc = nysfa(i,k) + offset_ya(i,k)
3423            nynf = nynfa(i,k)
3424            nync = nynfa(i,k) + offset_ya(i,k)
3425
3426
3427            SELECT CASE ( TRIM( field_char ) )
3428
3429                CASE ( 'rad_net' )
3430                   IF ( .NOT. ALLOCATED( rad_net ) )  THEN
3431                      ALLOCATE( rad_net(nysg:nyng,nxlg:nxrg) )
3432                   ENDIF 
3433                   IF ( k == 1 )  READ ( 13 )  tmp_2d
3434                   rad_net(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  = &
3435                                          tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3436
3437                CASE ( 'rad_net_av' )
3438                   IF ( .NOT. ALLOCATED( rad_net_av ) )  THEN
3439                      ALLOCATE( rad_net_av(nysg:nyng,nxlg:nxrg) )
3440                   ENDIF 
3441                   IF ( k == 1 )  READ ( 13 )  tmp_2d
3442                   rad_net_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  = &
3443                                          tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3444                CASE ( 'rad_lw_in' )
3445                   IF ( .NOT. ALLOCATED( rad_lw_in ) )  THEN
3446                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3447                           radiation_scheme == 'constant')  THEN
3448                         ALLOCATE( rad_lw_in(0:0,nysg:nyng,nxlg:nxrg) )
3449                      ELSE
3450                         ALLOCATE( rad_lw_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3451                      ENDIF
3452                   ENDIF 
3453                   IF ( k == 1 )  THEN
3454                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3455                           radiation_scheme == 'constant')  THEN
3456                         READ ( 13 )  tmp_2d
3457                         rad_lw_in(0:0,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3458                             tmp_3d2(0:0,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3459                      ELSE
3460                         READ ( 13 )  tmp_3d
3461                         rad_lw_in(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3462                             tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3463                      ENDIF
3464                   ENDIF
3465
3466                CASE ( 'rad_lw_in_av' )
3467                   IF ( .NOT. ALLOCATED( rad_lw_in_av ) )  THEN
3468                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3469                           radiation_scheme == 'constant')  THEN
3470                         ALLOCATE( rad_lw_in_av(0:0,nysg:nyng,nxlg:nxrg) )
3471                      ELSE
3472                         ALLOCATE( rad_lw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3473                      ENDIF
3474                   ENDIF 
3475                   IF ( k == 1 )  THEN
3476                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3477                           radiation_scheme == 'constant')  THEN
3478                         READ ( 13 )  tmp_2d
3479                         rad_lw_in_av(0:0,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3480                             tmp_3d2(0:0,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3481                      ELSE
3482                         READ ( 13 )  tmp_3d
3483                         rad_lw_in_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3484                             tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3485                      ENDIF
3486                   ENDIF
3487
3488                CASE ( 'rad_lw_out' )
3489                   IF ( .NOT. ALLOCATED( rad_lw_out ) )  THEN
3490                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3491                           radiation_scheme == 'constant')  THEN
3492                         ALLOCATE( rad_lw_out(0:0,nysg:nyng,nxlg:nxrg) )
3493                      ELSE
3494                         ALLOCATE( rad_lw_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3495                      ENDIF
3496                   ENDIF 
3497                   IF ( k == 1 )  THEN
3498                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3499                           radiation_scheme == 'constant')  THEN
3500                         READ ( 13 )  tmp_2d
3501                         rad_lw_out(0:0,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3502                             tmp_3d2(0:0,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3503                      ELSE
3504                         READ ( 13 )  tmp_3d
3505                         rad_lw_out(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3506                             tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3507                      ENDIF
3508                   ENDIF
3509
3510                CASE ( 'rad_lw_out_av' )
3511                   IF ( .NOT. ALLOCATED( rad_lw_out_av ) )  THEN
3512                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3513                           radiation_scheme == 'constant')  THEN
3514                         ALLOCATE( rad_lw_out_av(0:0,nysg:nyng,nxlg:nxrg) )
3515                      ELSE
3516                         ALLOCATE( rad_lw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3517                      ENDIF
3518                   ENDIF 
3519                   IF ( k == 1 )  THEN
3520                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3521                           radiation_scheme == 'constant')  THEN
3522                         READ ( 13 )  tmp_2d
3523                         rad_lw_out_av(0:0,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3524                             tmp_3d2(0:0,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3525                      ELSE
3526                         READ ( 13 )  tmp_3d
3527                         rad_lw_out_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3528                             tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3529                      ENDIF
3530                   ENDIF
3531
3532                CASE ( 'rad_lw_out_change_0' )
3533                   IF ( .NOT. ALLOCATED( rad_lw_out_change_0 ) )  THEN
3534                      ALLOCATE( rad_lw_out_change_0(nysg:nyng,nxlg:nxrg) )
3535                   ENDIF
3536                   IF ( k == 1 )  READ ( 13 )  tmp_2d
3537                   rad_lw_out_change_0(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)&
3538                              = tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3539
3540                CASE ( 'rad_lw_cs_hr' )
3541                   IF ( .NOT. ALLOCATED( rad_lw_cs_hr ) )  THEN
3542                      ALLOCATE( rad_lw_cs_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3543                   ENDIF
3544                   IF ( k == 1 )  READ ( 13 )  tmp_3d
3545                   rad_lw_cs_hr(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &
3546                           tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3547
3548                CASE ( 'rad_lw_cs_hr_av' )
3549                   IF ( .NOT. ALLOCATED( rad_lw_cs_hr_av ) )  THEN
3550                      ALLOCATE( rad_lw_cs_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3551                   ENDIF
3552                   IF ( k == 1 )  READ ( 13 )  tmp_3d
3553                   rad_lw_cs_hr_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &
3554                           tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3555
3556                CASE ( 'rad_lw_hr' )
3557                   IF ( .NOT. ALLOCATED( rad_lw_hr ) )  THEN
3558                      ALLOCATE( rad_lw_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3559                   ENDIF
3560                   IF ( k == 1 )  READ ( 13 )  tmp_3d
3561                   rad_lw_hr(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &
3562                           tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3563
3564                CASE ( 'rad_lw_hr_av' )
3565                   IF ( .NOT. ALLOCATED( rad_lw_hr_av ) )  THEN
3566                      ALLOCATE( rad_lw_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3567                   ENDIF
3568                   IF ( k == 1 )  READ ( 13 )  tmp_3d
3569                   rad_lw_hr_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &
3570                           tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3571
3572                CASE ( 'rad_sw_in' )
3573                   IF ( .NOT. ALLOCATED( rad_sw_in ) )  THEN
3574                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3575                           radiation_scheme == 'constant')  THEN
3576                         ALLOCATE( rad_sw_in(0:0,nysg:nyng,nxlg:nxrg) )
3577                      ELSE
3578                         ALLOCATE( rad_sw_in(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3579                      ENDIF
3580                   ENDIF 
3581                   IF ( k == 1 )  THEN
3582                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3583                           radiation_scheme == 'constant')  THEN
3584                         READ ( 13 )  tmp_2d
3585                         rad_sw_in(0:0,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3586                             tmp_3d2(0:0,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3587                      ELSE
3588                         READ ( 13 )  tmp_3d
3589                         rad_sw_in(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3590                             tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3591                      ENDIF
3592                   ENDIF
3593
3594                CASE ( 'rad_sw_in_av' )
3595                   IF ( .NOT. ALLOCATED( rad_sw_in_av ) )  THEN
3596                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3597                           radiation_scheme == 'constant')  THEN
3598                         ALLOCATE( rad_sw_in_av(0:0,nysg:nyng,nxlg:nxrg) )
3599                      ELSE
3600                         ALLOCATE( rad_sw_in_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3601                      ENDIF
3602                   ENDIF 
3603                   IF ( k == 1 )  THEN
3604                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3605                           radiation_scheme == 'constant')  THEN
3606                         READ ( 13 )  tmp_2d
3607                         rad_sw_in_av(0:0,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3608                             tmp_3d2(0:0,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3609                      ELSE
3610                         READ ( 13 )  tmp_3d
3611                         rad_sw_in_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3612                             tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3613                      ENDIF
3614                   ENDIF
3615
3616                CASE ( 'rad_sw_out' )
3617                   IF ( .NOT. ALLOCATED( rad_sw_out ) )  THEN
3618                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3619                           radiation_scheme == 'constant')  THEN
3620                         ALLOCATE( rad_sw_out(0:0,nysg:nyng,nxlg:nxrg) )
3621                      ELSE
3622                         ALLOCATE( rad_sw_out(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3623                      ENDIF
3624                   ENDIF 
3625                   IF ( k == 1 )  THEN
3626                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3627                           radiation_scheme == 'constant')  THEN
3628                         READ ( 13 )  tmp_2d
3629                         rad_sw_out(0:0,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3630                             tmp_3d2(0:0,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3631                      ELSE
3632                         READ ( 13 )  tmp_3d
3633                         rad_sw_out(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3634                             tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3635                      ENDIF
3636                   ENDIF
3637
3638                CASE ( 'rad_sw_out_av' )
3639                   IF ( .NOT. ALLOCATED( rad_sw_out_av ) )  THEN
3640                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3641                           radiation_scheme == 'constant')  THEN
3642                         ALLOCATE( rad_sw_out_av(0:0,nysg:nyng,nxlg:nxrg) )
3643                      ELSE
3644                         ALLOCATE( rad_sw_out_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3645                      ENDIF
3646                   ENDIF 
3647                   IF ( k == 1 )  THEN
3648                      IF ( radiation_scheme == 'clear-sky'  .OR.               &
3649                           radiation_scheme == 'constant')  THEN
3650                         READ ( 13 )  tmp_2d
3651                         rad_sw_out_av(0:0,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3652                             tmp_3d2(0:0,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3653                      ELSE
3654                         READ ( 13 )  tmp_3d
3655                         rad_sw_out_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =&
3656                             tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3657                      ENDIF
3658                   ENDIF
3659
3660                CASE ( 'rad_sw_cs_hr' )
3661                   IF ( .NOT. ALLOCATED( rad_sw_cs_hr ) )  THEN
3662                      ALLOCATE( rad_sw_cs_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3663                   ENDIF
3664                   IF ( k == 1 )  READ ( 13 )  tmp_3d
3665                   rad_sw_cs_hr(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &
3666                           tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3667
3668                CASE ( 'rad_sw_cs_hr_av' )
3669                   IF ( .NOT. ALLOCATED( rad_sw_cs_hr_av ) )  THEN
3670                      ALLOCATE( rad_sw_cs_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3671                   ENDIF
3672                   IF ( k == 1 )  READ ( 13 )  tmp_3d
3673                   rad_sw_cs_hr_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &
3674                           tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3675
3676                CASE ( 'rad_sw_hr' )
3677                   IF ( .NOT. ALLOCATED( rad_sw_hr ) )  THEN
3678                      ALLOCATE( rad_sw_hr(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3679                   ENDIF
3680                   IF ( k == 1 )  READ ( 13 )  tmp_3d
3681                   rad_sw_hr(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &
3682                           tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3683
3684                CASE ( 'rad_sw_hr_av' )
3685                   IF ( .NOT. ALLOCATED( rad_sw_hr_av ) )  THEN
3686                      ALLOCATE( rad_sw_hr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
3687                   ENDIF
3688                   IF ( k == 1 )  READ ( 13 )  tmp_3d
3689                   rad_lw_hr_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) = &
3690                           tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3691
3692               CASE DEFAULT
3693                  WRITE( message_string, * ) 'unknown variable named "',       &
3694                                        TRIM( field_char ), '" found in',      &
3695                                        '&data from prior run on PE ', myid
3696                  CALL message( 'radiation_read_restart_data', 'PA0441', 1, 2, 0, 6, &
3697                                 0 )
3698
3699            END SELECT
3700
3701         ENDDO
3702
3703         READ ( 13 )  field_char
3704
3705      ENDDO
3706   ENDIF
3707
3708 END SUBROUTINE radiation_read_restart_data
3709
3710
3711 END MODULE radiation_model_mod
Note: See TracBrowser for help on using the repository browser.