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

Last change on this file since 2583 was 2575, checked in by maronga, 6 years ago

bugfix in radiation model and improvements in land surface scheme

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