source: palm/trunk/SOURCE/urban_surface_mod.f90 @ 3597

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

revised calculation of near surface air potential temperature

  • Property svn:keywords set to Id
File size: 551.8 KB
Line 
1!> @file urban_surface_mod.f90
2!------------------------------------------------------------------------------!
3! This file is part of the PALM model system.
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 2015-2018 Czech Technical University in Prague
18! Copyright 2015-2018 Institute of Computer Science of the
19!                     Czech Academy of Sciences, Prague
20! Copyright 1997-2018 Leibniz Universitaet Hannover
21!------------------------------------------------------------------------------!
22!
23! Current revisions:
24! ------------------
25!
26!
27! Former revisions:
28! -----------------
29! $Id: urban_surface_mod.f90 3597 2018-12-04 08:40:18Z maronga $
30! Fixed calculation method of near surface air potential temperature at 10 cm
31! and moved to surface_layer_fluxes. Removed unnecessary _eb strings.
32!
33! 3524 2018-11-14 13:36:44Z raasch
34! bugfix concerning allocation of t_surf_wall_v
35!
36! 3502 2018-11-07 14:45:23Z suehring
37! Disable initialization of building roofs with ground-floor-level properties,
38! since this causes strong oscillations of surface temperature during the
39! spinup.
40!
41! 3469 2018-10-30 20:05:07Z kanani
42! Add missing PUBLIC variables for new indoor model
43!
44! 3449 2018-10-29 19:36:56Z suehring
45! Bugfix: Fix average arrays allocations in usm_average_3d_data (J.Resler)
46! Bugfix: Fix reading wall temperatures (J.Resler)
47! Bugfix: Fix treating of outputs for wall temperature and sky view factors (J.Resler)
48!
49!
50! 3435 2018-10-26 18:25:44Z gronemeier
51! Bugfix: allocate gamma_w_green_sat until nzt_wall+1
52!
53! 3418 2018-10-24 16:07:39Z kanani
54! (rvtils, srissman)
55! -Updated building databse, two green roof types (ind_green_type_roof)
56! -Latent heat flux for green walls and roofs, new output of latent heatflux
57!  and soil water content of green roof substrate
58! -t_surf changed to t_surf_wall
59! -Added namelist parameter usm_wall_mod for lower wall tendency
60!  of first two wall layers during spinup
61! -Window calculations deactivated during spinup
62!
63! 3382 2018-10-19 13:10:32Z knoop
64! Bugix: made array declaration Fortran Standard conform
65!
66! 3378 2018-10-19 12:34:59Z kanani
67! merge from radiation branch (r3362) into trunk
68! (moh.hefny):
69! - check the requested output variables if they are correct
70! - added unscheduled_radiation_calls switch to control force_radiation_call
71! - minor formate changes
72!
73! 3371 2018-10-18 13:40:12Z knoop
74! Set flag indicating that albedo at urban surfaces is already initialized
75!
76! 3347 2018-10-15 14:21:08Z suehring
77! Enable USM initialization with default building parameters in case no static
78! input file exist.
79!
80! 3343 2018-10-15 10:38:52Z suehring
81! Add output variables usm_rad_pc_inlw, usm_rad_pc_insw*
82!
83! 3274 2018-09-24 15:42:55Z knoop
84! Modularization of all bulk cloud physics code components
85!
86! 3248 2018-09-14 09:42:06Z sward
87! Minor formating changes
88!
89! 3246 2018-09-13 15:14:50Z sward
90! Added error handling for input namelist via parin_fail_message
91!
92! 3241 2018-09-12 15:02:00Z raasch
93! unused variables removed
94!
95! 3223 2018-08-30 13:48:17Z suehring
96! Bugfix for commit 3222
97!
98! 3222 2018-08-30 13:35:35Z suehring
99! Introduction of surface array for type and its name
100!
101! 3203 2018-08-23 10:48:36Z suehring
102! Revise bulk parameter for emissivity at ground-floor level
103!
104! 3196 2018-08-13 12:26:14Z maronga
105! Added maximum aerodynamic resistance of 300 for horiztonal surfaces.
106!
107! 3176 2018-07-26 17:12:48Z suehring
108! Bugfix, update virtual potential surface temparture, else heat fluxes on
109! roofs might become unphysical
110!
111! 3152 2018-07-19 13:26:52Z suehring
112! Initialize q_surface, which might be used in surface_layer_fluxes
113!
114! 3151 2018-07-19 08:45:38Z raasch
115! remaining preprocessor define strings __check removed
116!
117! 3136 2018-07-16 14:48:21Z suehring
118! Limit also roughness length for heat and moisture where necessary
119!
120! 3123 2018-07-12 16:21:53Z suehring
121! Correct working precision for INTEGER number
122!
123! 3115 2018-07-10 12:49:26Z suehring
124! Additional building type to represent bridges
125!
126! 3091 2018-06-28 16:20:35Z suehring
127! - Limit aerodynamic resistance at vertical walls.
128! - Add check for local roughness length not exceeding surface-layer height and
129!   limit roughness length where necessary.
130!
131! 3065 2018-06-12 07:03:02Z Giersch
132! Unused array dxdir was removed, dz was replaced by dzu to consider vertical
133! grid stretching
134!
135! 3049 2018-05-29 13:52:36Z Giersch
136! Error messages revised
137!
138! 3045 2018-05-28 07:55:41Z Giersch
139! Error message added
140!
141! 3029 2018-05-23 12:19:17Z raasch
142! bugfix: close unit 151 instead of 90
143!
144! 3014 2018-05-09 08:42:38Z maronga
145! Added pc_transpiration_rate
146!
147! 2977 2018-04-17 10:27:57Z kanani
148! Implement changes from branch radiation (r2948-2971) with minor modifications.
149! (moh.hefny):
150! Extended exn for all model domain height to avoid the need to get nzut.
151!
152! 2963 2018-04-12 14:47:44Z suehring
153! Introduce index for vegetation/wall, pavement/green-wall and water/window
154! surfaces, for clearer access of surface fraction, albedo, emissivity, etc. .
155!
156! 2943 2018-04-03 16:17:10Z suehring
157! Calculate exner function at all height levels and remove some un-used
158! variables.
159!
160! 2932 2018-03-26 09:39:22Z maronga
161! renamed urban_surface_par to urban_surface_parameters
162!
163! 2921 2018-03-22 15:05:23Z Giersch
164! The activation of spinup has been moved to parin
165!
166! 2920 2018-03-22 11:22:01Z kanani
167! Remove unused pcbl, npcbl from ONLY list
168! moh.hefny:
169! Fixed bugs introduced by new structures and by moving radiation interaction
170! into radiation_model_mod.f90.
171! Bugfix: usm data output 3D didn't respect directions
172!
173! 2906 2018-03-19 08:56:40Z Giersch
174! Local variable ids has to be initialized with a value of -1 in
175! usm_average_3d_data
176!
177! 2894 2018-03-15 09:17:58Z Giersch
178! Calculations of the index range of the subdomain on file which overlaps with
179! the current subdomain are already done in read_restart_data_mod,
180! usm_read/write_restart_data have been renamed to usm_r/wrd_local, variable
181! named found has been introduced for checking if restart data was found,
182! reading of restart strings has been moved completely to
183! read_restart_data_mod, usm_rrd_local is already inside the overlap loop
184! programmed in read_restart_data_mod, SAVE attribute added where necessary,
185! deallocation and allocation of some arrays have been changed to take care of
186! different restart files that can be opened (index i), the marker *** end usm
187! *** is not necessary anymore, strings and their respective lengths are
188! written out and read now in case of restart runs to get rid of prescribed
189! character lengths
190!
191! 2805 2018-02-14 17:00:09Z suehring
192! Initialization of resistances.
193!
194! 2797 2018-02-08 13:24:35Z suehring
195! Comment concerning output of ground-heat flux added.
196!
197! 2766 2018-01-22 17:17:47Z kanani
198! Removed redundant commas, added some blanks
199!
200! 2765 2018-01-22 11:34:58Z maronga
201! Major bugfix in calculation of f_shf. Adjustment of roughness lengths in
202! building_pars
203!
204! 2750 2018-01-15 16:26:51Z knoop
205! Move flag plant canopy to modules
206!
207! 2737 2018-01-11 14:58:11Z kanani
208! Removed unused variables t_surf_whole...
209!
210! 2735 2018-01-11 12:01:27Z suehring
211! resistances are saved in surface attributes
212!
213! 2723 2018-01-05 09:27:03Z maronga
214! Bugfix for spinups (end_time was increased twice in case of LSM + USM runs)
215!
216! 2720 2018-01-02 16:27:15Z kanani
217! Correction of comment
218!
219! 2718 2018-01-02 08:49:38Z maronga
220! Corrected "Former revisions" section
221!
222! 2705 2017-12-18 11:26:23Z maronga
223! Changes from last commit documented
224!
225! 2703 2017-12-15 20:12:38Z maronga
226! Workaround for calculation of r_a
227!
228! 2696 2017-12-14 17:12:51Z kanani
229! - Change in file header (GPL part)
230! - Bugfix in calculation of pt_surface and related fluxes. (BM)
231! - Do not write surface temperatures onto pt array as this might cause
232!   problems with nesting. (MS)
233! - Revised calculation of pt1 (now done in surface_layer_fluxes).
234!   Bugfix, f_shf_window and f_shf_green were not set at vertical surface
235!   elements. (MS)
236! - merged with branch ebsolver
237!   green building surfaces do not evaporate yet
238!   properties of green wall layers and window layers are taken from wall layers
239!   this input data is missing. (RvT)
240! - Merged with branch radiation (developed by Mohamed Salim)
241! - Revised initialization. (MS)
242! - Rename emiss_surf into emissivity, roughness_wall into z0, albedo_surf into
243!   albedo. (MS)
244! - Move first call of usm_radiatin from usm_init to init_3d_model
245! - fixed problem with near surface temperature
246! - added near surface temperature pt_10cm_h(m), pt_10cm_v(l)%t(m)
247! - does not work with temp profile including stability, ol
248!   pt_10cm = pt1 now
249! - merged with 2357 bugfix, error message for nopointer version
250! - added indoor model coupling with wall heat flux
251! - added green substrate/ dry vegetation layer for buildings
252! - merged with 2232 new surface-type structure
253! - added transmissivity of window tiles
254! - added MOSAIK tile approach for 3 different surfaces (RvT)
255!
256! 2583 2017-10-26 13:58:38Z knoop
257! Bugfix: reverted MPI_Win_allocate_cptr introduction in last commit
258!
259! 2582 2017-10-26 13:19:46Z hellstea
260! Workaround for gnufortran compiler added in usm_calc_svf. CALL MPI_Win_allocate is
261! replaced by CALL MPI_Win_allocate_cptr if defined ( __gnufortran ).
262!
263! 2544 2017-10-13 18:09:32Z maronga
264! Date and time quantities are now read from date_and_time_mod. Solar constant is
265! read from radiation_model_mod
266!
267! 2516 2017-10-04 11:03:04Z suehring
268! Remove tabs
269!
270! 2514 2017-10-04 09:52:37Z suehring
271! upper bounds of 3d output changed from nx+1,ny+1 to nx,ny
272! no output of ghost layer data
273!
274! 2350 2017-08-15 11:48:26Z kanani
275! Bugfix and error message for nopointer version.
276! Additional "! defined(__nopointer)" as workaround to enable compilation of
277! nopointer version.
278!
279! 2318 2017-07-20 17:27:44Z suehring
280! Get topography top index via Function call
281!
282! 2317 2017-07-20 17:27:19Z suehring
283! Bugfix: adjust output of shf. Added support for spinups
284!
285! 2287 2017-06-15 16:46:30Z suehring
286! Bugfix in determination topography-top index
287!
288! 2269 2017-06-09 11:57:32Z suehring
289! Enable restart runs with different number of PEs
290! Bugfixes nopointer branch
291!
292! 2258 2017-06-08 07:55:13Z suehring
293! Bugfix, add pre-preprocessor directives to enable non-parrallel mode
294!
295! 2233 2017-05-30 18:08:54Z suehring
296!
297! 2232 2017-05-30 17:47:52Z suehring
298! Adjustments according to new surface-type structure. Remove usm_wall_heat_flux;
299! insteat, heat fluxes are directly applied in diffusion_s.
300!
301! 2213 2017-04-24 15:10:35Z kanani
302! Removal of output quantities usm_lad and usm_canopy_hr
303!
304! 2209 2017-04-19 09:34:46Z kanani
305! cpp switch __mpi3 removed,
306! minor formatting,
307! small bugfix for division by zero (Krc)
308!
309! 2113 2017-01-12 13:40:46Z kanani
310! cpp switch __mpi3 added for MPI-3 standard code (Ketelsen)
311!
312! 2071 2016-11-17 11:22:14Z maronga
313! Small bugfix (Resler)
314!
315! 2031 2016-10-21 15:11:58Z knoop
316! renamed variable rho to rho_ocean
317!
318! 2024 2016-10-12 16:42:37Z kanani
319! Bugfixes in deallocation of array plantt and reading of csf/csfsurf,
320! optimization of MPI-RMA operations,
321! declaration of pcbl as integer,
322! renamed usm_radnet -> usm_rad_net, usm_canopy_khf -> usm_canopy_hr,
323! splitted arrays svf -> svf & csf, svfsurf -> svfsurf & csfsurf,
324! use of new control parameter varnamelength,
325! added output variables usm_rad_ressw, usm_rad_reslw,
326! minor formatting changes,
327! minor optimizations.
328!
329! 2011 2016-09-19 17:29:57Z kanani
330! Major reformatting according to PALM coding standard (comments, blanks,
331! alphabetical ordering, etc.),
332! removed debug_prints,
333! removed auxiliary SUBROUTINE get_usm_info, instead, USM flag urban_surface is
334! defined in MODULE control_parameters (modules.f90) to avoid circular
335! dependencies,
336! renamed canopy_heat_flux to pc_heating_rate, as meaning of quantity changed.
337!
338! 2007 2016-08-24 15:47:17Z kanani
339! Initial revision
340!
341!
342! Description:
343! ------------
344! 2016/6/9 - Initial version of the USM (Urban Surface Model)
345!            authors: Jaroslav Resler, Pavel Krc
346!                     (Czech Technical University in Prague and Institute of
347!                      Computer Science of the Czech Academy of Sciences, Prague)
348!            with contributions: Michal Belda, Nina Benesova, Ondrej Vlcek
349!            partly inspired by PALM LSM (B. Maronga)
350!            parameterizations of Ra checked with TUF3D (E. S. Krayenhoff)
351!> Module for Urban Surface Model (USM)
352!> The module includes:
353!>    1. radiation model with direct/diffuse radiation, shading, reflections
354!>       and integration with plant canopy
355!>    2. wall and wall surface model
356!>    3. surface layer energy balance
357!>    4. anthropogenic heat (only from transportation so far)
358!>    5. necessary auxiliary subroutines (reading inputs, writing outputs,
359!>       restart simulations, ...)
360!> It also make use of standard radiation and integrates it into
361!> urban surface model.
362!>
363!> Further work:
364!> -------------
365!> 1. Remove global arrays surfouts, surfoutl and only keep track of radiosity
366!>    from surfaces that are visible from local surfaces (i.e. there is a SVF
367!>    where target is local). To do that, radiosity will be exchanged after each
368!>    reflection step using MPI_Alltoall instead of current MPI_Allgather.
369!>
370!> 2. Temporarily large values of surface heat flux can be observed, up to
371!>    1.2 Km/s, which seem to be not realistic.
372!>
373!> @todo Output of _av variables in case of restarts
374!> @todo Revise flux conversion in energy-balance solver
375!> @todo Bugfixing in nopointer branch
376!> @todo Check optimizations for RMA operations
377!> @todo Alternatives for MPI_WIN_ALLOCATE? (causes problems with openmpi)
378!> @todo Check for load imbalances in CPU measures, e.g. for exchange_horiz_prog
379!>       factor 3 between min and max time
380!> @todo Move setting of flag indoor_model to indoor_model_mod once available
381!> @todo Check divisions in wtend (etc.) calculations for possible division
382!>       by zero, e.g. in case fraq(0,m) + fraq(1,m) = 0?!
383!> @todo Use unit 90 for OPEN/CLOSE of input files (FK)
384!> @todo Move plant canopy stuff into plant canopy code
385!------------------------------------------------------------------------------!
386 MODULE urban_surface_mod
387
388    USE arrays_3d,                                                             &
389#if ! defined( __nopointer )
390        ONLY:  hyp, zu, pt, p, u, v, w, tend, exner, hyrho, prr, q, ql, vpt
391#else
392        ONLY:  hyp,     pt,    u, v, w, tend, exner, hyrho, prr, q, ql, vpt
393#endif
394    USE calc_mean_profile_mod,                                                 &
395        ONLY:  calc_mean_profile
396
397    USE basic_constants_and_equations_mod,                                     &
398        ONLY:  c_p, g, kappa, pi, r_d, rho_l, l_v
399
400    USE control_parameters,                                                    &
401        ONLY:  coupling_start_time, topography, dt_3d, humidity,               &
402               intermediate_timestep_count, initializing_actions,              &
403               intermediate_timestep_count_max, simulated_time, end_time,      &
404               timestep_scheme, tsc, coupling_char, io_blocks, io_group,       &
405               message_string, time_since_reference_point, surface_pressure,   &
406               pt_surface, large_scale_forcing, lsf_surf, spinup,              &
407               spinup_pt_mean, spinup_time, time_do3d, dt_do3d,                &
408               average_count_3d, varnamelength, urban_surface,                 &
409               plant_canopy, dz
410
411    USE bulk_cloud_model_mod,                                                  &
412        ONLY: bulk_cloud_model, precipitation
413               
414    USE cpulog,                                                                &
415        ONLY:  cpu_log, log_point, log_point_s
416
417    USE date_and_time_mod,                                                     &
418        ONLY:  time_utc_init
419
420    USE grid_variables,                                                        &
421        ONLY:  dx, dy, ddx, ddy, ddx2, ddy2
422
423    USE indices,                                                               &
424        ONLY:  nx, ny, nnx, nny, nnz, nxl, nxlg, nxr, nxrg, nyn, nyng, nys,    &
425               nysg, nzb, nzt, nbgp, wall_flags_0
426
427    USE, INTRINSIC :: iso_c_binding 
428
429    USE kinds
430             
431    USE pegrid
432   
433    USE plant_canopy_model_mod,                                                &
434        ONLY:  pc_heating_rate, pc_transpiration_rate, pc_latent_rate
435   
436    USE radiation_model_mod,                                                   &
437        ONLY:  albedo_type, radiation_interaction, calc_zenith, zenith,        &
438               radiation, rad_sw_in, rad_lw_in, rad_sw_out, rad_lw_out,        &
439               sigma_sb, sun_direction, sun_dir_lat, sun_dir_lon,              &
440               force_radiation_call, surfinsw, surfinlw, surfinswdir,          &
441               surfinswdif, surfoutsw, surfoutlw, surfins,nsvfl, svf, svfsurf, &
442               surfinl, surfinlwdif, rad_sw_in_dir, rad_sw_in_diff,            &
443               rad_lw_in_diff, surfouts, surfoutl, surfoutsl, surfoutll, surf, &
444               surfl, nsurfl, pcbinsw, pcbinlw, pcbinswdir,                    &
445               pcbinswdif, iup_u, inorth_u, isouth_u, ieast_u, iwest_u, iup_l, &
446               inorth_l, isouth_l, ieast_l, iwest_l, id,                       &
447               iz, iy, ix,  nsurf, idsvf, ndsvf,                               &
448               idcsf, ndcsf, kdcsf, pct,                                       &
449               startland, endland, startwall, endwall, skyvf, skyvft, nzub,    &
450               nzut, npcbl, pcbl, unscheduled_radiation_calls
451
452    USE statistics,                                                            &
453        ONLY:  hom, statistic_regions
454
455    USE surface_mod,                                                           &
456        ONLY:  get_topography_top_index_ji, get_topography_top_index,          &
457               ind_pav_green, ind_veg_wall, ind_wat_win, surf_usm_h,           &
458               surf_usm_v, surface_restore_elements
459
460
461    IMPLICIT NONE
462
463    !
464!-- USM model constants
465
466    REAL(wp), PARAMETER ::                     &
467              b_ch               = 6.04_wp,    & ! Clapp & Hornberger exponent
468              lambda_h_green_dry       = 0.19_wp,    & ! heat conductivity for dry soil   
469              lambda_h_green_sm        = 3.44_wp,    & ! heat conductivity of the soil matrix
470              lambda_h_water     = 0.57_wp,    & ! heat conductivity of water
471              psi_sat            = -0.388_wp,  & ! soil matrix potential at saturation
472              rho_c_soil         = 2.19E6_wp,  & ! volumetric heat capacity of soil
473              rho_c_water        = 4.20E6_wp !,  & ! volumetric heat capacity of water
474!               m_max_depth        = 0.0002_wp     ! Maximum capacity of the water reservoir (m)
475
476!
477!-- Soil parameters I           alpha_vg,      l_vg_green,    n_vg, gamma_w_green_sat
478    REAL(wp), DIMENSION(0:3,1:7), PARAMETER :: soil_pars = RESHAPE( (/     &
479                                 3.83_wp,  1.250_wp, 1.38_wp,  6.94E-6_wp, & ! 1
480                                 3.14_wp, -2.342_wp, 1.28_wp,  1.16E-6_wp, & ! 2
481                                 0.83_wp, -0.588_wp, 1.25_wp,  0.26E-6_wp, & ! 3
482                                 3.67_wp, -1.977_wp, 1.10_wp,  2.87E-6_wp, & ! 4
483                                 2.65_wp,  2.500_wp, 1.10_wp,  1.74E-6_wp, & ! 5
484                                 1.30_wp,  0.400_wp, 1.20_wp,  0.93E-6_wp, & ! 6
485                                 0.00_wp,  0.00_wp,  0.00_wp,  0.57E-6_wp  & ! 7
486                                 /), (/ 4, 7 /) )
487
488!
489!-- Soil parameters II              swc_sat,     fc,   wilt,    swc_res 
490    REAL(wp), DIMENSION(0:3,1:7), PARAMETER :: m_soil_pars = RESHAPE( (/ &
491                                 0.403_wp, 0.244_wp, 0.059_wp, 0.025_wp, & ! 1
492                                 0.439_wp, 0.347_wp, 0.151_wp, 0.010_wp, & ! 2
493                                 0.430_wp, 0.383_wp, 0.133_wp, 0.010_wp, & ! 3
494                                 0.520_wp, 0.448_wp, 0.279_wp, 0.010_wp, & ! 4
495                                 0.614_wp, 0.541_wp, 0.335_wp, 0.010_wp, & ! 5
496                                 0.766_wp, 0.663_wp, 0.267_wp, 0.010_wp, & ! 6
497                                 0.472_wp, 0.323_wp, 0.171_wp, 0.000_wp  & ! 7
498                                 /), (/ 4, 7 /) )
499                               
500    !   value 9999999.9_wp -> generic available or user-defined value must be set
501!   otherwise -> no generic variable and user setting is optional
502    REAL(wp) :: alpha_vangenuchten = 9999999.9_wp,      & !< NAMELIST alpha_vg
503                field_capacity = 9999999.9_wp,          & !< NAMELIST fc
504                hydraulic_conductivity = 9999999.9_wp,  & !< NAMELIST gamma_w_green_sat
505                lambda_h_green_sat = 0.0_wp,            & !< heat conductivity for saturated soil
506                l_vangenuchten = 9999999.9_wp,          & !< NAMELIST l_vg
507                n_vangenuchten = 9999999.9_wp,          & !< NAMELIST n_vg
508                residual_moisture = 9999999.9_wp,       & !< NAMELIST m_res
509                saturation_moisture = 9999999.9_wp,     & !< NAMELIST m_sat
510                wilting_point = 9999999.9_wp!,           & !< NAMELIST m_wilt
511   
512
513!-- configuration parameters (they can be setup in PALM config)
514    LOGICAL ::  usm_material_model = .TRUE.        !< flag parameter indicating wheather the  model of heat in materials is used
515    LOGICAL ::  usm_anthropogenic_heat = .FALSE.   !< flag parameter indicating wheather the anthropogenic heat sources (e.g.transportation) are used
516    LOGICAL ::  force_radiation_call_l = .FALSE.   !< flag parameter for unscheduled radiation model calls
517    LOGICAL ::  indoor_model = .FALSE.             !< whether to use the indoor model
518    LOGICAL ::  read_wall_temp_3d = .FALSE.
519    LOGICAL ::  usm_wall_mod = .FALSE.             !< reduces conductivity of the first 2 wall layers by factor 0.1
520
521
522    INTEGER(iwp) ::  building_type = 1               !< default building type (preleminary setting)
523    INTEGER(iwp) ::  land_category = 2               !< default category for land surface
524    INTEGER(iwp) ::  wall_category = 2               !< default category for wall surface over pedestrian zone
525    INTEGER(iwp) ::  pedestrian_category = 2         !< default category for wall surface in pedestrian zone
526    INTEGER(iwp) ::  roof_category = 2               !< default category for root surface
527    REAL(wp)     ::  roughness_concrete = 0.001_wp   !< roughness length of average concrete surface
528!
529!-- Indices of input attributes for (above) ground floor level
530    INTEGER(iwp) ::  ind_alb_wall_agfl     = 65  !< index in input list for albedo_type of wall above ground floor level
531    INTEGER(iwp) ::  ind_alb_wall_gfl      = 32  !< index in input list for albedo_type of wall ground floor level
532    INTEGER(iwp) ::  ind_alb_wall_r        = 96  !< index in input list for albedo_type of wall roof
533    INTEGER(iwp) ::  ind_alb_green_agfl    = 83  !< index in input list for albedo_type of green above ground floor level
534    INTEGER(iwp) ::  ind_alb_green_gfl     = 50  !< index in input list for albedo_type of green ground floor level
535    INTEGER(iwp) ::  ind_alb_green_r       = 115 !< index in input list for albedo_type of green roof
536    INTEGER(iwp) ::  ind_alb_win_agfl      = 79  !< index in input list for albedo_type of window fraction above ground floor level
537    INTEGER(iwp) ::  ind_alb_win_gfl       = 46  !< index in input list for albedo_type of window fraction ground floor level
538    INTEGER(iwp) ::  ind_alb_win_r         = 110 !< index in input list for albedo_type of window fraction roof
539    INTEGER(iwp) ::  ind_emis_wall_agfl    = 64  !< index in input list for wall emissivity, above ground floor level
540    INTEGER(iwp) ::  ind_emis_wall_gfl     = 31  !< index in input list for wall emissivity, ground floor level
541    INTEGER(iwp) ::  ind_emis_wall_r       = 95  !< index in input list for wall emissivity, roof
542    INTEGER(iwp) ::  ind_emis_green_agfl   = 82  !< index in input list for green emissivity, above ground floor level
543    INTEGER(iwp) ::  ind_emis_green_gfl    = 49  !< index in input list for green emissivity, ground floor level
544    INTEGER(iwp) ::  ind_emis_green_r      = 114 !< index in input list for green emissivity, roof
545    INTEGER(iwp) ::  ind_emis_win_agfl     = 77  !< index in input list for window emissivity, above ground floor level
546    INTEGER(iwp) ::  ind_emis_win_gfl      = 44  !< index in input list for window emissivity, ground floor level
547    INTEGER(iwp) ::  ind_emis_win_r        = 108 !< index in input list for window emissivity, roof
548    INTEGER(iwp) ::  ind_green_frac_w_agfl = 80  !< index in input list for green fraction on wall, above ground floor level
549    INTEGER(iwp) ::  ind_green_frac_w_gfl  = 47  !< index in input list for green fraction on wall, ground floor level
550    INTEGER(iwp) ::  ind_green_frac_r_agfl = 112 !< index in input list for green fraction on roof, above ground floor level
551    INTEGER(iwp) ::  ind_green_frac_r_gfl  = 111 !< index in input list for green fraction on roof, ground floor level
552    INTEGER(iwp) ::  ind_hc1_agfl          = 58  !< index in input list for heat capacity at first wall layer, above ground floor level
553    INTEGER(iwp) ::  ind_hc1_gfl           = 25  !< index in input list for heat capacity at first wall layer, ground floor level
554    INTEGER(iwp) ::  ind_hc1_wall_r        = 89  !< index in input list for heat capacity at first wall layer, roof
555    INTEGER(iwp) ::  ind_hc1_win_agfl      = 71  !< index in input list for heat capacity at first window layer, above ground floor level
556    INTEGER(iwp) ::  ind_hc1_win_gfl       = 38  !< index in input list for heat capacity at first window layer, ground floor level
557    INTEGER(iwp) ::  ind_hc1_win_r         = 102 !< index in input list for heat capacity at first window layer, roof
558    INTEGER(iwp) ::  ind_hc2_agfl          = 59  !< index in input list for heat capacity at second wall layer, above ground floor level
559    INTEGER(iwp) ::  ind_hc2_gfl           = 26  !< index in input list for heat capacity at second wall layer, ground floor level
560    INTEGER(iwp) ::  ind_hc2_wall_r        = 90  !< index in input list for heat capacity at second wall layer, roof
561    INTEGER(iwp) ::  ind_hc2_win_agfl      = 72  !< index in input list for heat capacity at second window layer, above ground floor level
562    INTEGER(iwp) ::  ind_hc2_win_gfl       = 39  !< index in input list for heat capacity at second window layer, ground floor level
563    INTEGER(iwp) ::  ind_hc2_win_r         = 103 !< index in input list for heat capacity at second window layer, roof
564    INTEGER(iwp) ::  ind_hc3_agfl          = 60  !< index in input list for heat capacity at third wall layer, above ground floor level
565    INTEGER(iwp) ::  ind_hc3_gfl           = 27  !< index in input list for heat capacity at third wall layer, ground floor level
566    INTEGER(iwp) ::  ind_hc3_wall_r        = 91  !< index in input list for heat capacity at third wall layer, roof
567    INTEGER(iwp) ::  ind_hc3_win_agfl      = 73  !< index in input list for heat capacity at third window layer, above ground floor level
568    INTEGER(iwp) ::  ind_hc3_win_gfl       = 40  !< index in input list for heat capacity at third window layer, ground floor level
569    INTEGER(iwp) ::  ind_hc3_win_r         = 104 !< index in input list for heat capacity at third window layer, roof
570    INTEGER(iwp) ::  ind_gflh              = 17  !< index in input list for ground floor level height
571    INTEGER(iwp) ::  ind_lai_r_agfl        = 113 !< index in input list for LAI on roof, above ground floor level
572    INTEGER(iwp) ::  ind_lai_r_gfl         = 113  !< index in input list for LAI on roof, ground floor level
573    INTEGER(iwp) ::  ind_lai_w_agfl        = 81  !< index in input list for LAI on wall, above ground floor level
574    INTEGER(iwp) ::  ind_lai_w_gfl         = 48  !< index in input list for LAI on wall, ground floor level
575    INTEGER(iwp) ::  ind_tc1_agfl          = 61  !< index in input list for thermal conductivity at first wall layer, above ground floor level
576    INTEGER(iwp) ::  ind_tc1_gfl           = 28  !< index in input list for thermal conductivity at first wall layer, ground floor level
577    INTEGER(iwp) ::  ind_tc1_wall_r        = 92  !< index in input list for thermal conductivity at first wall layer, roof
578    INTEGER(iwp) ::  ind_tc1_win_agfl      = 74  !< index in input list for thermal conductivity at first window layer, above ground floor level
579    INTEGER(iwp) ::  ind_tc1_win_gfl       = 41  !< index in input list for thermal conductivity at first window layer, ground floor level
580    INTEGER(iwp) ::  ind_tc1_win_r         = 105 !< index in input list for thermal conductivity at first window layer, roof
581    INTEGER(iwp) ::  ind_tc2_agfl          = 62  !< index in input list for thermal conductivity at second wall layer, above ground floor level
582    INTEGER(iwp) ::  ind_tc2_gfl           = 29  !< index in input list for thermal conductivity at second wall layer, ground floor level
583    INTEGER(iwp) ::  ind_tc2_wall_r        = 93  !< index in input list for thermal conductivity at second wall layer, roof
584    INTEGER(iwp) ::  ind_tc2_win_agfl      = 75  !< index in input list for thermal conductivity at second window layer, above ground floor level
585    INTEGER(iwp) ::  ind_tc2_win_gfl       = 42  !< index in input list for thermal conductivity at second window layer, ground floor level
586    INTEGER(iwp) ::  ind_tc2_win_r         = 106 !< index in input list for thermal conductivity at second window layer, ground floor level
587    INTEGER(iwp) ::  ind_tc3_agfl          = 63  !< index in input list for thermal conductivity at third wall layer, above ground floor level
588    INTEGER(iwp) ::  ind_tc3_gfl           = 30  !< index in input list for thermal conductivity at third wall layer, ground floor level
589    INTEGER(iwp) ::  ind_tc3_wall_r        = 94  !< index in input list for thermal conductivity at third wall layer, roof
590    INTEGER(iwp) ::  ind_tc3_win_agfl      = 76  !< index in input list for thermal conductivity at third window layer, above ground floor level
591    INTEGER(iwp) ::  ind_tc3_win_gfl       = 43  !< index in input list for thermal conductivity at third window layer, ground floor level
592    INTEGER(iwp) ::  ind_tc3_win_r         = 107 !< index in input list for thermal conductivity at third window layer, roof
593    INTEGER(iwp) ::  ind_thick_1_agfl      = 54  !< index for wall layer thickness - 1st layer above ground floor level
594    INTEGER(iwp) ::  ind_thick_1_gfl       = 21  !< index for wall layer thickness - 1st layer ground floor level
595    INTEGER(iwp) ::  ind_thick_1_wall_r    = 85  !< index for wall layer thickness - 1st layer roof
596    INTEGER(iwp) ::  ind_thick_1_win_agfl  = 67  !< index for window layer thickness - 1st layer above ground floor level
597    INTEGER(iwp) ::  ind_thick_1_win_gfl   = 34  !< index for window layer thickness - 1st layer ground floor level
598    INTEGER(iwp) ::  ind_thick_1_win_r     = 98  !< index for window layer thickness - 1st layer roof
599    INTEGER(iwp) ::  ind_thick_2_agfl      = 55  !< index for wall layer thickness - 2nd layer above ground floor level
600    INTEGER(iwp) ::  ind_thick_2_gfl       = 22  !< index for wall layer thickness - 2nd layer ground floor level
601    INTEGER(iwp) ::  ind_thick_2_wall_r    = 86  !< index for wall layer thickness - 2nd layer roof
602    INTEGER(iwp) ::  ind_thick_2_win_agfl  = 68  !< index for window layer thickness - 2nd layer above ground floor level
603    INTEGER(iwp) ::  ind_thick_2_win_gfl   = 35  !< index for window layer thickness - 2nd layer ground floor level
604    INTEGER(iwp) ::  ind_thick_2_win_r     = 99  !< index for window layer thickness - 2nd layer roof
605    INTEGER(iwp) ::  ind_thick_3_agfl      = 56  !< index for wall layer thickness - 3rd layer above ground floor level
606    INTEGER(iwp) ::  ind_thick_3_gfl       = 23  !< index for wall layer thickness - 3rd layer ground floor level
607    INTEGER(iwp) ::  ind_thick_3_wall_r    = 87  !< index for wall layer thickness - 3rd layer roof
608    INTEGER(iwp) ::  ind_thick_3_win_agfl  = 69  !< index for window layer thickness - 3rd layer above ground floor level
609    INTEGER(iwp) ::  ind_thick_3_win_gfl   = 36  !< index for window layer thickness - 3rd layer ground floor level 
610    INTEGER(iwp) ::  ind_thick_3_win_r     = 100 !< index for window layer thickness - 3rd layer roof
611    INTEGER(iwp) ::  ind_thick_4_agfl      = 57  !< index for wall layer thickness - 4th layer above ground floor level
612    INTEGER(iwp) ::  ind_thick_4_gfl       = 24  !< index for wall layer thickness - 4th layer ground floor level
613    INTEGER(iwp) ::  ind_thick_4_wall_r    = 88  !< index for wall layer thickness - 4st layer roof
614    INTEGER(iwp) ::  ind_thick_4_win_agfl  = 70  !< index for window layer thickness - 4th layer above ground floor level
615    INTEGER(iwp) ::  ind_thick_4_win_gfl   = 37  !< index for window layer thickness - 4th layer ground floor level
616    INTEGER(iwp) ::  ind_thick_4_win_r     = 101 !< index for window layer thickness - 4th layer roof
617    INTEGER(iwp) ::  ind_trans_agfl        = 78  !< index in input list for window transmissivity, above ground floor level
618    INTEGER(iwp) ::  ind_trans_gfl         = 45  !< index in input list for window transmissivity, ground floor level
619    INTEGER(iwp) ::  ind_trans_r           = 109 !< index in input list for window transmissivity, roof
620    INTEGER(iwp) ::  ind_wall_frac_agfl    = 53  !< index in input list for wall fraction, above ground floor level
621    INTEGER(iwp) ::  ind_wall_frac_gfl     = 20  !< index in input list for wall fraction, ground floor level
622    INTEGER(iwp) ::  ind_wall_frac_r       = 84  !< index in input list for wall fraction, roof
623    INTEGER(iwp) ::  ind_win_frac_agfl     = 66  !< index in input list for window fraction, above ground floor level
624    INTEGER(iwp) ::  ind_win_frac_gfl      = 33  !< index in input list for window fraction, ground floor level
625    INTEGER(iwp) ::  ind_win_frac_r        = 97  !< index in input list for window fraction, roof
626    INTEGER(iwp) ::  ind_z0_agfl           = 51  !< index in input list for z0, above ground floor level
627    INTEGER(iwp) ::  ind_z0_gfl            = 18  !< index in input list for z0, ground floor level
628    INTEGER(iwp) ::  ind_z0qh_agfl         = 52  !< index in input list for z0h / z0q, above ground floor level
629    INTEGER(iwp) ::  ind_z0qh_gfl          = 19  !< index in input list for z0h / z0q, ground floor level
630    INTEGER(iwp) ::  ind_green_type_roof   = 116 !< index in input list for type of green roof
631
632
633    REAL(wp)  ::  roof_height_limit = 4.0_wp          !< height for distinguish between land surfaces and roofs
634    REAL(wp)  ::  ground_floor_level = 4.0_wp        !< default ground floor level
635
636
637    CHARACTER(37), DIMENSION(0:7), PARAMETER :: building_type_name = (/     &
638                                   'user-defined                         ', & !  0
639                                   'residential - 1950                   ', & !  1
640                                   'residential 1951 - 2000              ', & !  2
641                                   'residential 2001 -                   ', & !  3
642                                   'office - 1950                        ', & !  4
643                                   'office 1951 - 2000                   ', & !  5
644                                   'office 2001 -                        ', & !  6
645                                   'bridges                              '  & !  7
646                                                                     /)
647!
648!-- building parameters, 6 different types
649!-- Parameter for urban surface model
650!-- 0 - heat capacity wall surface, 1 - heat capacity of window surface, 2 - heat capacity of green surface
651!-- 3 - thermal conductivity of wall surface, 4 - thermal conductivity of window surface,
652!-- 5 - thermal conductivty of green surface, 6 - wall fraction ground plate,
653!-- 7 - 1st wall layer thickness ground plate, 8 - 2nd wall layer thickness ground plate
654!-- 9 - 3rd wall layer thickness ground plate, 10 - 4th wall layer thickness ground plate,
655!-- 11 - heat capacity 1st/2nd wall layer ground plate, 12 - heat capacity 3rd wall layer ground plate
656!-- 13 - heat capacity 4th wall layer ground plate, 14 - thermal conductivity 1st/2nd wall layer ground plate,
657!-- 15 - thermal conductivity 3rd wall layer ground plate, 16 - thermal conductivity 4th wall layer ground plate
658!-- 17 - ground floor level height, 18 - z0 roughness ground floor level, 19 - z0h/z0g roughness heaat/humidity,
659!-- 20 - wall fraction ground floor level, 21 - 1st wall layer thickness ground floor level,
660!-- 22 - 2nd wall layer thickness ground floor level, 23 - 3rd wall layer thickness ground floor level,
661!-- 24 - 4th wall layer thickness ground floor level, 25 - heat capacity 1st/2nd wall layer ground floor level,
662!-- 26 - heat capacity 3rd wall layer ground floor level, 27 - heat capacity 4th wall layer ground floor level,
663!-- 28 - thermal conductivity 1st/2nd wall layer ground floor level,
664!-- 29 - thermal conductivity 3rd wall layer ground floor level, 30 - thermal conductivity 4th wall layer ground floor level
665!-- 31 - wall emissivity ground floor level, 32 - wall albedo ground floor level, 33 - window fraction ground floor level,
666!-- 34 - 1st window layer thickness ground floor level, 35 - 2nd window layer thickness ground floor level,
667!-- 36 - 3rd window layer thickness ground floor level, 37 - 4th window layer thickness ground floor level,
668!-- 38 - heat capacity 1st/2nd window layer ground floor level, 39 - heat capacity 3rd window layer ground floor level,
669!-- 40 - heat capacity 4th window layer ground floor level,
670!-- 41 - thermal conductivity 1st/2nd window layer ground floor level,
671!-- 42 - thermal conductivity 3rd window layer ground floor level,
672!-- 43 - thermal conductivity 4th window layer ground floor level, 44 - window emissivity ground floor level,
673!-- 45 - window transmissivity ground floor level, 46 - window albedo ground floor level,
674!-- 47 - green fraction ground floor level, 48 - LAI on wall ground floor level, 49 - green emissivity ground floor level,
675!-- 50 - green albedo ground floor level, 51 - z0 roughness above ground floor level,
676!-- 52 - z0h/z0g roughness heat/humidity above ground floor level, 53 - wall fraction above ground floor level
677!-- 54 - 1st wall layer thickness above ground floor level, 55 - 2nd wall layer thickness above ground floor level
678!-- 56 - 3rd wall layer thickness above ground floor level, 57 - 4th wall layer thickness above ground floor level
679!-- 58 - heat capacity 1st/2nd wall layer above ground floor level,
680!-- 59 - heat capacity 3rd wall layer above ground floor level,
681!-- 60 - heat capacity 4th wall layer above ground floor level,
682!-- 61 - thermal conductivity 1st/2nd wall layer above ground floor level,
683!-- 62 - thermal conductivity 3rd wall layer above ground floor level,
684!-- 63 - thermal conductivity 4th wall layer above ground floor level,
685!-- 64 - wall emissivity above ground floor level, 65 - wall albedo above ground floor level,
686!-- 66 - window fraction above ground floor level, 67 - 1st window layer thickness above ground floor level,
687!-- 68 - 2nd thickness window layer above ground floor level, 69 - 3rd window layer thickness above ground floor level,
688!-- 70 - 4th window layer thickness above ground floor level,
689!-- 71 - heat capacity 1st/2nd window layer above ground floor level,
690!-- 72 - heat capacity 3rd window layer above ground floor level,
691!-- 73 - heat capacity 4th window layer above ground floor level,
692!-- 74 - conductivity 1st/2nd window layer above ground floor level,
693!-- 75 - thermal conductivity 3rd window layer above ground floor level,
694!-- 76 - thermal conductivity 4th window layer above ground floor level, 77 - window emissivity above ground floor level,
695!-- 78 - window transmissivity above ground floor level, 79 - window albedo above ground floor level,
696!-- 80 - green fraction above ground floor level, 81 - LAI on wall above ground floor level,
697!-- 82 - green emissivity above ground floor level, 83 - green albedo above ground floor level,
698!-- 84 - wall fraction roof, 85 - 1st wall layer thickness roof, 86 - 2nd wall layer thickness roof,
699!-- 87 - 3rd wall layer thickness roof, 88 - 4th wall layer thickness roof,
700!-- 89 - heat capacity 1st/2nd wall layer roof, 90 - heat capacity 3rd wall layer roof,
701!-- 91 - heat capacity 4th wall layer roof, 92 - thermal conductivity 1st/2nd wall layer roof,
702!-- 93 - thermal conductivity 3rd wall layer roof, 94 - thermal conductivity 4th wall layer roof,
703!-- 95 - wall emissivity roof, 96 - wall albedo roof, 97 - window fraction roof,
704!-- 98 - window 1st layer thickness roof, 99 - window 2nd layer thickness roof, 100 - window 3rd layer thickness roof,
705!-- 101 - window 4th layer thickness, 102 - heat capacity 1st/2nd window layer roof,
706!-- 103 - heat capacity 3rd window layer roof, 104 - heat capacity 4th window layer roof,
707!-- 105 - thermal conductivity 1st/2nd window layer roof, 106 - thermal conductivity 3rd window layer roof,
708!-- 107 - thermal conductivity 4th window layer roof, 108 - window emissivity roof, 109 - window transmissivity roof,
709!-- 110 - window albedo roof, 111 - green fraction roof ground floor level,
710!-- 112 - green fraction roof above ground floor level, 113 - LAI roof, 114 - green emissivity roof,
711!-- 115 - green albedo roof, 116 - green type roof,
712!-- Parameter for indoor model
713!-- 117 - indoor target summer temperature, 118 - indoor target winter temperature,
714!-- 119 - shading factor, 120 - g-value windows, 121 - u-value windows, 122 - basical airflow without occupancy of the room,
715!-- 123 - additional airflow depend of occupancy of the room, 124 - heat recovery efficiency,
716!-- 125 - dynamic parameter specific effective surface, 126 - dynamic parameter innner heatstorage,
717!-- 127 - ratio internal surface/floor area, 128 - maximal heating capacity, 129 - maximal cooling capacity,
718!-- 130 - additional internal heat gains dependent on occupancy of the room,
719!-- 131 - basic internal heat gains without occupancy of the room, 132 - storey height, 133 - ceiling construction height
720
721
722    REAL(wp), DIMENSION(0:133,1:7), PARAMETER :: building_pars = RESHAPE( (/   &
723        10.0_wp, 10.0_wp, 20000.0_wp, 23.0_wp, 23.0_wp, 10.0_wp,               & !parameter 0-5
724        1.0_wp, 0.005_wp, 0.01_wp, 0.39_wp, 0.63_wp, 2200000.0_wp,             & !parameter 6-11
725        1400000.0_wp, 1300000.0_wp, 0.35_wp, 0.8_wp, 2.1_wp, 4.0_wp,           & !parameter 12-17
726        0.01_wp, 0.001_wp, 0.75_wp,                                            & !parameter 18-20
727        0.005_wp, 0.01_wp, 0.39_wp, 0.63_wp, 2200000.0_wp,                     & !parameter 21-25
728        1400000.0_wp, 1300000.0_wp, 0.35_wp,                                   & !parameter 26-28                     
729        0.8_wp, 2.1_wp, 0.93_wp,                                               & !parameter 29-31       
730        27.0_wp, 0.25_wp, 0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,              & !parameter 32-37
731        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 38-40
732        0.57_wp, 0.57_wp, 0.57_wp, 0.91_wp,                                    & !parameter 41-44
733        0.75_wp, 27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp,                             & !parameter 45-49
734        5.0_wp, 0.001_wp, 0.0001_wp, 0.7_wp, 0.005_wp,                        & !parameter 50-54
735        0.01_wp, 0.39_wp, 0.63_wp, 2200000.0_wp,                               & !parameter 55-58
736        1400000.0_wp, 1300000.0_wp, 0.35_wp, 0.8_wp,                           & !parameter 59-62
737        2.1_wp, 0.93_wp, 27.0_wp, 0.3_wp,                                      & !parameter 63-66
738        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,                                & !parameter 67-70
739        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 71-73
740        0.57_wp, 0.57_wp, 0.57_wp, 0.91_wp, 0.75_wp,                           & !parameter 74-78
741        27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp, 5.0_wp, 1.0_wp,                      & !parameter 79-84
742        0.005_wp, 0.01_wp, 0.31_wp, 0.63_wp, 2200000.0_wp, 1400000.0_wp,       & !parameter 85-90
743        1300000.0_wp, 0.35_wp, 0.8_wp, 2.1_wp, 0.93_wp, 27.0_wp, 0.0_wp,       & !parameter 91-97
744        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp, 1736000.0_wp,                  & !parameter 98-102
745        1736000.0_wp, 1736000.0_wp, 0.57_wp, 0.57_wp, 0.57_wp,                 & !parameter 103-107
746        0.91_wp, 0.75_wp, 27.0_wp, 0.0_wp, 0.0_wp, 1.5_wp,                     & !parameter 108-113
747        0.86_wp, 5.0_wp, 0.0_wp,                                              & !parameter 114-116
748        299.15_wp, 293.15_wp, 0.8_wp, 0.76_wp, 5.0_wp,                         & !parameter 117-121
749        0.1_wp, 0.5_wp, 0.0_wp, 3.5_wp, 370000.0_wp, 4.5_wp,                   & !parameter 122-127
750        100000.0_wp, 0.0_wp, 3.0_wp, 10.0_wp, 3.0_wp, 0.2_wp,                  & !parameter 128-133- end of type 1
751        10.0_wp, 10.0_wp, 20000.0_wp, 23.0_wp, 23.0_wp, 10.0_wp,               & !parameter 0-5
752        1.0_wp, 0.005_wp, 0.01_wp, 0.31_wp, 0.42_wp, 2000000.0_wp,             & !parameter 6-11
753        103000.0_wp, 900000.0_wp, 0.35_wp, 0.38_wp, 0.04_wp, 4.0_wp,           & !parameter 12-17
754        0.01_wp, 0.001_wp, 0.78_wp,                                            & !parameter 18-20
755        0.005_wp, 0.01_wp, 0.31_wp, 0.43_wp, 2000000.0_wp,                     & !parameter 21-25
756        103000.0_wp, 900000.0_wp, 0.35_wp,                                     & !parameter 26-28                     
757        0.38_wp, 0.04_wp, 0.92_wp,                                             & !parameter 29-31       
758        27.0_wp, 0.22_wp, 0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,              & !parameter 32-37
759        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 38-40
760        0.11_wp, 0.11_wp, 0.11_wp, 0.11_wp,                                    & !parameter 41-44
761        0.7_wp, 27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp,                              & !parameter 45-49
762        5.0_wp, 0.001_wp, 0.0001_wp, 0.73_wp, 0.005_wp,                       & !parameter 50-54
763        0.01_wp, 0.31_wp, 0.43_wp, 2000000.0_wp,                               & !parameter 55-58
764        103000.0_wp, 900000.0_wp, 0.35_wp, 0.38_wp,                            & !parameter 59-62
765        0.04_wp, 0.92_wp, 27.0_wp, 0.27_wp,                                    & !parameter 63-66
766        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,                                & !parameter 67-70
767        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 71-73
768        0.11_wp, 0.11_wp, 0.11_wp, 0.87_wp, 0.7_wp,                            & !parameter 74-78
769        27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp, 5.0_wp, 1.0_wp,                      & !parameter 79-84
770        0.005_wp, 0.01_wp, 0.5_wp, 0.79_wp, 2000000.0_wp, 103000.0_wp,         & !parameter 85-90
771        900000.0_wp, 0.35_wp, 0.38_wp, 0.04_wp, 0.93_wp, 27.0_wp, 0.0_wp,      & !parameter 91-97
772        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp, 1736000.0_wp,                  & !parameter 98-102
773        1736000.0_wp, 1736000.0_wp, 0.11_wp, 0.11_wp, 0.11_wp,                 & !parameter 103-107
774        0.87_wp, 0.7_wp, 27.0_wp, 0.0_wp, 0.0_wp, 1.5_wp,                      & !parameter 108-113
775        0.86_wp, 5.0_wp, 0.0_wp,                                              & !parameter 114-116
776        299.15_wp, 293.15_wp, 0.8_wp, 0.6_wp, 3.0_wp,                          & !parameter 117-121
777        0.1_wp, 0.5_wp, 0.0_wp, 2.5_wp, 165000.0_wp, 4.5_wp,                   & !parameter 122-127
778        100000.0_wp, 0.0_wp, 4.0_wp, 8.0_wp, 3.0_wp, 0.2_wp,                   & !parameter 128-133- end of type 2
779        10.0_wp, 10.0_wp, 20000.0_wp, 23.0_wp, 23.0_wp, 10.0_wp,               & !parameter 0-5
780        1.0_wp, 0.005_wp, 0.01_wp, 0.41_wp, 0.7_wp, 2000000.0_wp,              & !parameter 6-11
781        103000.0_wp, 900000.0_wp, 0.35_wp, 0.14_wp, 0.035_wp, 4.0_wp,          & !parameter 12-17
782        0.01_wp, 0.001_wp, 0.75_wp,                                            & !parameter 18-20
783        0.005_wp, 0.01_wp, 0.41_wp, 0.7_wp, 2000000.0_wp,                      & !parameter 21-25
784        103000.0_wp, 900000.0_wp, 0.35_wp,                                     & !parameter 26-28                     
785        0.14_wp, 0.035_wp, 0.92_wp,                                            & !parameter 29-31       
786        27.0_wp, 0.25_wp, 0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,              & !parameter 32-37
787        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 38-40
788        0.037_wp, 0.037_wp, 0.037_wp, 0.8_wp,                                     & !parameter 41-44
789        0.6_wp, 27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp,                              & !parameter 45-49
790        5.0_wp, 0.001_wp, 0.0001_wp, 0.7_wp, 0.005_wp,                        & !parameter 50-54
791        0.01_wp, 0.41_wp, 0.7_wp, 2000000.0_wp,                                & !parameter 55-58
792        103000.0_wp, 900000.0_wp, 0.35_wp, 0.14_wp,                            & !parameter 59-62
793        0.035_wp, 0.92_wp, 27.0_wp, 0.3_wp,                                    & !parameter 63-66
794        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,                                & !parameter 67-70
795        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 71-73
796        0.037_wp, 0.037_wp, 0.037_wp, 0.8_wp, 0.6_wp,                             & !parameter 74-78
797        27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp, 5.0_wp, 1.0_wp,                      & !parameter 79-84
798        0.005_wp, 0.01_wp, 0.41_wp, 0.7_wp, 2000000.0_wp, 103000.0_wp,         & !parameter 85-90
799        900000.0_wp, 0.35_wp, 0.14_wp, 0.035_wp, 0.93_wp, 27.0_wp, 0.0_wp,     & !parameter 91-97
800        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp, 1736000.0_wp,                  & !parameter 98-102
801        1736000.0_wp, 1736000.0_wp, 0.037_wp, 0.037_wp, 0.037_wp,                 & !parameter 103-107
802        0.8_wp, 0.6_wp, 27.0_wp, 0.0_wp, 0.0_wp, 1.5_wp,                       & !parameter 108-113
803        0.86_wp, 5.0_wp, 0.0_wp,                                              & !parameter 114-116
804        299.15_wp, 293.15_wp, 0.8_wp, 0.5_wp, 0.6_wp,                          & !parameter 117-121
805        0.1_wp, 0.5_wp, 0.8_wp, 2.5_wp, 80000.0_wp, 4.5_wp,                    & !parameter 122-127
806        100000.0_wp, 0.0_wp, 3.0_wp, 8.0_wp, 3.0_wp, 0.2_wp,                   & !parameter 128-133- end of type 3
807        10.0_wp, 10.0_wp, 20000.0_wp, 23.0_wp, 23.0_wp, 10.0_wp,               & !parameter 0-5
808        1.0_wp, 0.005_wp, 0.01_wp, 0.39_wp, 0.63_wp, 2200000.0_wp,             & !parameter 6-11
809        1400000.0_wp, 1300000.0_wp, 0.35_wp, 0.8_wp, 2.1_wp, 4.0_wp,           & !parameter 12-17
810        0.01_wp, 0.001_wp, 0.55_wp,                                            & !parameter 18-20
811        0.005_wp, 0.01_wp, 0.39_wp, 0.63_wp, 2200000.0_wp,                     & !parameter 21-25
812        1400000.0_wp, 1300000.0_wp, 0.35_wp,                                   & !parameter 26-28                     
813        0.8_wp, 2.1_wp, 0.93_wp,                                               & !parameter 29-31       
814        27.0_wp, 0.45_wp, 0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,              & !parameter 32-37
815        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 38-40
816        0.57_wp, 0.57_wp, 0.57_wp, 0.91_wp,                                    & !parameter 41-44
817        0.75_wp, 27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp,                             & !parameter 45-49
818        5.0_wp, 0.001_wp, 0.0001_wp, 0.5_wp, 0.005_wp,                        & !parameter 50-54
819        0.01_wp, 0.39_wp, 0.63_wp, 2200000.0_wp,                               & !parameter 55-58
820        1400000.0_wp, 1300000.0_wp, 0.35_wp, 0.8_wp,                           & !parameter 59-62
821        2.1_wp, 0.93_wp, 27.0_wp, 0.5_wp,                                      & !parameter 63-66
822        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,                                & !parameter 67-70
823        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 71-73
824        0.57_wp, 0.57_wp, 0.57_wp, 0.91_wp, 0.75_wp,                           & !parameter 74-78
825        27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp, 5.0_wp, 1.0_wp,                      & !parameter 79-84
826        0.005_wp, 0.01_wp, 0.39_wp, 0.63_wp, 2200000.0_wp, 1400000.0_wp,       & !parameter 85-90
827        1300000.0_wp, 0.35_wp, 0.8_wp, 2.1_wp, 0.93_wp, 27.0_wp, 0.0_wp,       & !parameter 91-97
828        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp, 1736000.0_wp,                  & !parameter 98-102
829        1736000.0_wp, 1736000.0_wp, 0.57_wp, 0.57_wp, 0.57_wp,                 & !parameter 103-107
830        0.91_wp, 0.75_wp, 27.0_wp, 0.0_wp, 0.0_wp, 1.5_wp,                     & !parameter 108-113
831        0.86_wp, 5.0_wp, 0.0_wp,                                              & !parameter 114-116
832        299.15_wp, 293.15_wp, 0.8_wp, 0.76_wp, 5.0_wp,                         & !parameter 117-121
833        0.1_wp, 1.5_wp, 0.0_wp, 3.5_wp, 370000.0_wp, 4.5_wp,                   & !parameter 122-127
834        100000.0_wp, 0.0_wp, 3.0_wp, 10.0_wp, 3.0_wp, 0.2_wp,                  & !parameter 128-133- end of type 4
835        10.0_wp, 10.0_wp, 20000.0_wp, 23.0_wp, 23.0_wp, 10.0_wp,               & !parameter 0-5
836        1.0_wp, 0.005_wp, 0.01_wp, 0.31_wp, 0.43_wp, 2000000.0_wp,             & !parameter 6-11
837        103000.0_wp, 900000.0_wp, 0.35_wp, 0.38_wp, 0.04_wp, 4.0_wp,           & !parameter 12-17
838        0.01_wp, 0.001_wp, 0.55_wp,                                            & !parameter 18-20
839        0.005_wp, 0.01_wp, 0.31_wp, 0.43_wp, 2000000.0_wp,                     & !parameter 21-25
840        103000.0_wp, 900000.0_wp, 0.35_wp,                                     & !parameter 26-28                     
841        0.38_wp, 0.04_wp, 0.92_wp,                                             & !parameter 29-31       
842        27.0_wp, 0.45_wp, 0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,              & !parameter 32-37
843        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 38-40
844        0.11_wp, 0.11_wp, 0.11_wp, 0.87_wp,                                    & !parameter 41-44
845        0.7_wp, 27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp,                              & !parameter 45-49
846        5.0_wp, 0.001_wp, 0.0001_wp, 0.5_wp, 0.005_wp,                        & !parameter 50-54
847        0.01_wp, 0.31_wp, 0.43_wp, 2000000.0_wp,                               & !parameter 55-58
848        103000.0_wp, 900000.0_wp, 0.35_wp, 0.38_wp,                            & !parameter 59-62
849        0.04_wp, 0.92_wp, 27.0_wp, 0.5_wp,                                     & !parameter 63-66
850        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,                                & !parameter 67-70
851        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 71-73
852        0.11_wp, 0.11_wp, 0.11_wp, 0.87_wp, 0.7_wp,                            & !parameter 74-78
853        27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp, 5.0_wp, 1.0_wp,                      & !parameter 79-84
854        0.005_wp, 0.01_wp, 0.31_wp, 0.43_wp, 2000000.0_wp, 103000.0_wp,        & !parameter 85-90
855        900000.0_wp, 0.35_wp, 0.38_wp, 0.04_wp, 0.91_wp, 27.0_wp, 0.0_wp,      & !parameter 91-97
856        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp, 1736000.0_wp,                  & !parameter 98-102
857        1736000.0_wp, 1736000.0_wp, 0.11_wp, 0.11_wp, 0.11_wp,                 & !parameter 103-107
858        0.87_wp, 0.7_wp, 27.0_wp, 0.0_wp, 0.0_wp, 1.5_wp,                      & !parameter 108-113
859        0.86_wp, 5.0_wp, 0.0_wp,                                              & !parameter 114-116
860        299.15_wp, 293.15_wp, 0.8_wp, 0.6_wp, 3.0_wp,                          & !parameter 117-121
861        0.1_wp, 1.5_wp, 0.65_wp, 2.5_wp, 165000.0_wp, 4.5_wp,                  & !parameter 122-127
862        100000.0_wp, 0.0_wp, 7.0_wp, 20.0_wp, 3.0_wp, 0.2_wp,                  & !parameter 128-133- end of type 5
863        10.0_wp, 10.0_wp, 20000.0_wp, 23.0_wp, 23.0_wp, 10.0_wp,               & !parameter 0-5
864        1.0_wp, 0.005_wp, 0.01_wp, 0.41_wp, 0.7_wp, 2000000.0_wp,              & !parameter 6-11
865        103000.0_wp, 900000.0_wp, 0.35_wp, 0.14_wp, 0.035_wp, 4.0_wp,          & !parameter 12-17
866        0.01_wp, 0.001_wp, 0.475_wp,                                           & !parameter 18-20
867        0.005_wp, 0.01_wp, 0.41_wp, 0.7_wp, 2000000.0_wp,                      & !parameter 21-25
868        103000.0_wp, 900000.0_wp, 0.35_wp,                                     & !parameter 26-28                     
869        0.14_wp, 0.035_wp, 0.92_wp,                                            & !parameter 29-31       
870        27.0_wp, 0.525_wp, 0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,             & !parameter 32-37
871        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 38-40
872        0.037_wp, 0.037_wp, 0.037_wp, 0.8_wp,                                     & !parameter 41-44
873        0.6_wp, 27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp,                              & !parameter 45-49
874        5.0_wp, 0.001_wp, 0.0001_wp, 0.425_wp, 0.005_wp,                      & !parameter 50-54
875        0.01_wp, 0.41_wp, 0.7_wp, 2000000.0_wp,                                & !parameter 55-58
876        103000.0_wp, 900000.0_wp, 0.35_wp, 0.14_wp,                            & !parameter 59-62
877        0.035_wp, 0.92_wp, 27.0_wp, 0.575_wp,                                  & !parameter 63-66
878        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,                                & !parameter 67-70
879        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 71-73
880        0.037_wp, 0.037_wp, 0.037_wp, 0.8_wp, 0.6_wp,                             & !parameter 74-78
881        27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp, 5.0_wp, 1.0_wp,                      & !parameter 79-84
882        0.005_wp, 0.01_wp, 0.41_wp, 0.7_wp, 2000000.0_wp, 103000.0_wp,         & !parameter 85-90
883        900000.0_wp, 0.35_wp, 0.14_wp, 0.035_wp, 0.91_wp, 27.0_wp, 0.0_wp,     & !parameter 91-97
884        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp, 1736000.0_wp,                  & !parameter 98-102
885        1736000.0_wp, 1736000.0_wp, 0.037_wp, 0.037_wp, 0.037_wp,                 & !parameter 103-107
886        0.8_wp, 0.6_wp, 27.0_wp, 0.0_wp, 0.0_wp, 1.5_wp,                       & !parameter 108-113
887        0.86_wp, 5.0_wp, 0.0_wp,                                              & !parameter 114-116
888        299.15_wp, 293.15_wp, 0.8_wp, 0.5_wp, 0.6_wp,                          & !parameter 117-121
889        0.1_wp, 1.5_wp, 0.9_wp, 2.5_wp, 80000.0_wp, 4.5_wp,                    & !parameter 122-127
890        100000.0_wp, 0.0_wp, 5.0_wp, 15.0_wp, 3.0_wp, 0.2_wp,                  & !parameter 128-133- end of type 6   
891        10.0_wp, 10.0_wp, 20000.0_wp, 23.0_wp, 23.0_wp, 10.0_wp,               & !parameter 0-5
892        1.0_wp, 0.29_wp, 0.295_wp, 0.695_wp, 0.985_wp, 1950400.0_wp,           & !parameter 6-11
893        1848000.0_wp, 1848000.0_wp, 0.7_wp, 1.0_wp, 1.0_wp, 4.0_wp,            & !parameter 12-17
894        0.01_wp, 0.001_wp, 1.0_wp,                                             & !parameter 18-20
895        0.29_wp, 0.295_wp, 0.695_wp, 0.985_wp, 1950400.0_wp,                   & !parameter 21-25
896        1848000.0_wp, 1848000.0_wp, 0.7_wp,                                    & !parameter 26-28                     
897        1.0_wp, 1.0_wp, 0.9_wp,                                                & !parameter 29-31       
898        27.0_wp, 0.0_wp, 0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,               & !parameter 32-37
899        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 38-40
900        0.57_wp, 0.57_wp, 0.57_wp, 0.8_wp,                                     & !parameter 41-44
901        0.6_wp, 27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp,                              & !parameter 45-49
902        5.0_wp, 0.001_wp, 0.0001_wp, 1.0_wp, 0.29_wp,                         & !parameter 50-54
903        0.295_wp, 0.695_wp, 0.985_wp, 1950400.0_wp,                            & !parameter 55-58
904        1848000.0_wp, 1848000.0_wp, 0.7_wp, 1.0_wp,                            & !parameter 59-62
905        1.0_wp, 0.9_wp, 27.0_wp, 0.0_wp,                                       & !parameter 63-66
906        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp,                                & !parameter 67-70
907        1736000.0_wp, 1736000.0_wp, 1736000.0_wp,                              & !parameter 71-73
908        0.57_wp, 0.57_wp, 0.57_wp, 0.8_wp, 0.6_wp,                             & !parameter 74-78
909        27.0_wp, 0.0_wp, 1.5_wp, 0.86_wp, 5.0_wp, 1.0_wp,                      & !parameter 79-84
910        0.29_wp, 0.295_wp, 0.695_wp, 0.985_wp, 1950400.0_wp, 1848000.0_wp,     & !parameter 85-90
911        1848000.0_wp, 0.7_wp, 1.0_wp, 1.0_wp, 0.9_wp, 27.0_wp, 0.0_wp,         & !parameter 91-97
912        0.003_wp, 0.006_wp, 0.012_wp, 0.018_wp, 1736000.0_wp,                  & !parameter 98-102
913        1736000.0_wp, 1736000.0_wp, 0.57_wp, 0.57_wp, 0.57_wp,                 & !parameter 103-107
914        0.8_wp, 0.6_wp, 27.0_wp, 0.0_wp, 0.0_wp, 1.5_wp,                       & !parameter 108-113
915        0.86_wp, 5.0_wp, 0.0_wp,                                              & !parameter 114-116
916        299.15_wp, 293.15_wp, 0.8_wp, 100.0_wp, 100.0_wp,                      & !parameter 117-121
917        20.0_wp, 20.0_wp, 0.0_wp, 1.0_wp, 1.0_wp, 4.5_wp,                      & !parameter 122-127
918        100000.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 3.0_wp, 0.2_wp                    & !parameter 128-133- end of type 7 (bridge)
919                                                                       /),     &
920                                                               (/134, 7/) )
921
922!
923!-- Type for surface temperatures at vertical walls. Is not necessary for horizontal walls.
924    TYPE t_surf_vertical
925       REAL(wp), DIMENSION(:), ALLOCATABLE         :: t
926    END TYPE t_surf_vertical
927!
928!-- Type for wall temperatures at vertical walls. Is not necessary for horizontal walls.
929    TYPE t_wall_vertical
930       REAL(wp), DIMENSION(:,:), ALLOCATABLE       :: t
931    END TYPE t_wall_vertical
932
933    TYPE surf_type_usm
934       REAL(wp), DIMENSION(:),   ALLOCATABLE ::  var_usm_1d !< 1D prognostic variable
935       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  var_usm_2d !< 2D prognostic variable
936    END TYPE surf_type_usm
937   
938#if defined( __nopointer )
939    TYPE(surf_type_usm), TARGET   ::  m_liq_usm_h,        & !< liquid water reservoir (m), horizontal surface elements
940                                      m_liq_usm_h_p         !< progn. liquid water reservoir (m), horizontal surface elements
941
942    TYPE(surf_type_usm), DIMENSION(0:3), TARGET   ::  &
943                                      m_liq_usm_v,        & !< liquid water reservoir (m), vertical surface elements
944                                      m_liq_usm_v_p         !< progn. liquid water reservoir (m), vertical surface elements
945#else
946    TYPE(surf_type_usm), POINTER  ::  m_liq_usm_h,        & !< liquid water reservoir (m), horizontal surface elements
947                                      m_liq_usm_h_p         !< progn. liquid water reservoir (m), horizontal surface elements
948
949    TYPE(surf_type_usm), TARGET   ::  m_liq_usm_h_1,      & !<
950                                      m_liq_usm_h_2         !<
951
952    TYPE(surf_type_usm), DIMENSION(:), POINTER  ::    &
953                                      m_liq_usm_v,        & !< liquid water reservoir (m), vertical surface elements
954                                      m_liq_usm_v_p         !< progn. liquid water reservoir (m), vertical surface elements
955
956    TYPE(surf_type_usm), DIMENSION(0:3), TARGET   ::  &
957                                      m_liq_usm_v_1,      & !<
958                                      m_liq_usm_v_2         !<
959#endif
960
961    TYPE(surf_type_usm), TARGET ::  tm_liq_usm_h_m      !< liquid water reservoir tendency (m), horizontal surface elements
962    TYPE(surf_type_usm), DIMENSION(0:3), TARGET ::  tm_liq_usm_v_m      !< liquid water reservoir tendency (m), vertical surface elements
963
964
965!-- arrays for time averages
966!-- Attention: the variable rad_net_av is also used in the 3d field variable in radiation_model_mod.f90. It may be better to rename it
967    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinsw_av      !< average of sw radiation falling to local surface including radiation from reflections
968    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinlw_av      !< average of lw radiation falling to local surface including radiation from reflections
969    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinswdir_av   !< average of direct sw radiation falling to local surface
970    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinswdif_av   !< average of diffuse sw radiation from sky and model boundary falling to local surface
971    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinlwdif_av   !< average of diffuse lw radiation from sky and model boundary falling to local surface
972    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinswref_av   !< average of sw radiation falling to surface from reflections
973    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinlwref_av   !< average of lw radiation falling to surface from reflections
974    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfoutsw_av     !< average of total sw radiation outgoing from nonvirtual surfaces surfaces after all reflection
975    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfoutlw_av     !< average of total lw radiation outgoing from nonvirtual surfaces surfaces after all reflection
976    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfins_av       !< average of array of residua of sw radiation absorbed in surface after last reflection
977    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinl_av       !< average of array of residua of lw radiation absorbed in surface after last reflection
978    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  pcbinlw_av       !< Average of pcbinlw
979    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  pcbinsw_av       !< Average of pcbinsw
980    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  pcbinswdir_av    !< Average of pcbinswdir
981    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  pcbinswdif_av    !< Average of pcbinswdif
982    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  pcbinswref_av    !< Average of pcbinswref
983    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfhf_av        !< average of total radiation flux incoming to minus outgoing from local surface 
984    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  wghf_eb_av       !< average of wghf_eb
985    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  wshf_eb_av       !< average of wshf_eb
986    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  t_wall_av        !< Average of t_wall
987    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  wghf_eb_green_av !< average of wghf_eb_green
988    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  t_green_av       !< Average of t_green
989    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  wghf_eb_window_av !< average of wghf_eb_window
990    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  t_window_av      !< Average of t_window
991    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  qsws_eb_av       !< average of qsws_eb
992    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  qsws_veg_av   !< average of qsws_veg
993    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  qsws_liq_av   !< average of qsws_liq
994    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  swc_av        !< Average of swc
995   
996
997!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
998!-- anthropogenic heat sources
999!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1000    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE        ::  aheat             !< daily average of anthropogenic heat (W/m2)
1001    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  aheatprof         !< diurnal profiles of anthropogenic heat for particular layers
1002    INTEGER(iwp)                                   ::  naheatlayers = 1  !< number of layers of anthropogenic heat
1003
1004!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1005!-- wall surface model
1006!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1007!-- wall surface model constants
1008    INTEGER(iwp), PARAMETER                        :: nzb_wall = 0       !< inner side of the wall model (to be switched)
1009    INTEGER(iwp), PARAMETER                        :: nzt_wall = 3       !< outer side of the wall model (to be switched)
1010    INTEGER(iwp), PARAMETER                        :: nzw = 4            !< number of wall layers (fixed for now)
1011
1012    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default = (/0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp /)
1013                                                                         !< normalized soil, wall and roof layer depths (m/m)
1014!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default = (/0.33_wp, 0.66_wp, 1.0_wp /)
1015    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_window = (/0.25_wp, 0.5_wp, 0.75_wp, 1.0_wp /)
1016!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_window = (/0.33_wp, 0.66_wp, 1.0_wp /)
1017!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_window = (/0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp /)
1018                                                                         !< normalized window layer depths (m/m)
1019!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_green = (/0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp /)
1020                                                                         !< normalized green layer depths (m/m)
1021    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_green = (/0.25_wp, 0.5_wp, 0.75_wp, 1.0_wp /)
1022!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_green = (/0.33_wp, 0.66_wp, 1.0_wp /)
1023
1024
1025    REAL(wp)                                       :: wall_inner_temperature = 295.0_wp    !< temperature of the inner wall surface (~22 degrees C) (K)
1026    REAL(wp)                                       :: roof_inner_temperature = 295.0_wp    !< temperature of the inner roof surface (~22 degrees C) (K)
1027    REAL(wp)                                       :: soil_inner_temperature = 288.0_wp    !< temperature of the deep soil (~15 degrees C) (K)
1028    REAL(wp)                                       :: window_inner_temperature = 295.0_wp  !< temperature of the inner window surface (~22 degrees C) (K)
1029
1030    REAL(wp)                                       ::   m_total = 0.0_wp !< weighted total water content of the soil (m3/m3)
1031    INTEGER(iwp)                                   ::   soil_type
1032   
1033!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1034!-- surface and material model variables for walls, ground, roofs
1035!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1036    REAL(wp), DIMENSION(:), ALLOCATABLE            :: zwn                !< normalized wall layer depths (m)
1037    REAL(wp), DIMENSION(:), ALLOCATABLE            :: zwn_window         !< normalized window layer depths (m)
1038    REAL(wp), DIMENSION(:), ALLOCATABLE            :: zwn_green          !< normalized green layer depths (m)
1039
1040#if defined( __nopointer )
1041    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_wall_h           !< wall surface temperature (K) at horizontal walls
1042    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_wall_h_p         !< progn. wall surface temperature (K) at horizontal walls
1043    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_h    !< window surface temperature (K) at horizontal walls
1044    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_h_p  !< progn. window surface temperature (K) at horizontal walls
1045    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_h     !< green surface temperature (K) at horizontal walls
1046    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_h_p   !< progn. green surface temperature (K) at horizontal walls
1047    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_wall_v
1048    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_wall_v_p
1049    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_window_v
1050    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_window_v_p
1051    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_green_v
1052    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_green_v_p
1053#else
1054    REAL(wp), DIMENSION(:), POINTER                :: t_surf_wall_h
1055    REAL(wp), DIMENSION(:), POINTER                :: t_surf_wall_h_p 
1056    REAL(wp), DIMENSION(:), POINTER                :: t_surf_window_h
1057    REAL(wp), DIMENSION(:), POINTER                :: t_surf_window_h_p 
1058    REAL(wp), DIMENSION(:), POINTER                :: t_surf_green_h
1059    REAL(wp), DIMENSION(:), POINTER                :: t_surf_green_h_p 
1060
1061    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_wall_h_1
1062    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_wall_h_2
1063    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_h_1
1064    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_h_2
1065    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_h_1
1066    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_h_2
1067
1068    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_wall_v
1069    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_wall_v_p
1070    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_window_v
1071    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_window_v_p
1072    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_green_v
1073    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_green_v_p
1074
1075    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_wall_v_1
1076    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_wall_v_2
1077    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_window_v_1
1078    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_window_v_2
1079    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_green_v_1
1080    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_green_v_2
1081   
1082#endif
1083    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_wall_av          !< average of wall surface temperature (K)
1084    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_av   !< average of window surface temperature (K)
1085    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_av    !< average of green wall surface temperature (K)
1086
1087!-- Temporal tendencies for time stepping           
1088    REAL(wp), DIMENSION(:), ALLOCATABLE            :: tt_surface_wall_m       !< surface temperature tendency of wall (K)
1089    REAL(wp), DIMENSION(:), ALLOCATABLE            :: tt_surface_window_m !< surface temperature tendency of window (K)
1090    REAL(wp), DIMENSION(:), ALLOCATABLE            :: tt_surface_green_m !< surface temperature tendency of green wall (K)
1091
1092!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1093!-- Energy balance variables
1094!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1095!-- parameters of the land, roof and wall surfaces
1096
1097#if defined( __nopointer )
1098    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_wall_h             !< Wall temperature (K)
1099    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_wall_h_av          !< Average of t_wall
1100    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_wall_h_p           !< Prog. wall temperature (K)
1101    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_window_h           !< Window temperature (K)
1102    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_window_h_av        !< Average of t_window
1103    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_window_h_p         !< Prog. window temperature (K)
1104    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_green_h            !< Green temperature (K)
1105    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_green_h_av         !< Average of t_green
1106    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_green_h_p          !< Prog. green temperature (K)
1107    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: swc_h              !< soil water content green building layer
1108    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: swc_h_av              !< avg of soil water content green building layer
1109    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: swc_h_p              !< Prog. soil water content green building layer
1110    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: swc_sat_h          !< soil water content green building layer at saturation
1111    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: swc_res_h          !< soil water content green building layer residual
1112    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: rootfr_h           !< root fraction green green building layer
1113    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: wilt_h             !< wilting point green building layer
1114    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: fc_h               !< field capacity green building layer
1115
1116
1117    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_wall_v             !< Wall temperature (K)
1118    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_wall_v_av          !< Average of t_wall
1119    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_wall_v_p           !< Prog. wall temperature (K)
1120    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_window_v           !< Window temperature (K)
1121    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_window_v_av        !< Average of t_window
1122    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_window_v_p         !< Prog. window temperature (K)
1123    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_green_v            !< Green temperature (K)
1124    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_green_v_av         !< Average of t_green
1125    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_green_v_p          !< Prog. green temperature (K)
1126    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: swc_v             !< Wall swc
1127    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: swc_v_av          !< Average of swc
1128    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: swc_v_p           !< Prog. swc
1129   
1130#else
1131    REAL(wp), DIMENSION(:,:), POINTER                :: t_wall_h, t_wall_h_p
1132    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_wall_h_av, t_wall_h_1, t_wall_h_2
1133    REAL(wp), DIMENSION(:,:), POINTER                :: t_window_h, t_window_h_p
1134    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_window_h_av, t_window_h_1, t_window_h_2
1135    REAL(wp), DIMENSION(:,:), POINTER                :: t_green_h, t_green_h_p
1136    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_green_h_av, t_green_h_1, t_green_h_2
1137    REAL(wp), DIMENSION(:,:), POINTER                :: swc_h, rootfr_h, wilt_h, fc_h, swc_sat_h, swc_h_p, swc_res_h
1138    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: swc_h_1, rootfr_h_1, &
1139                                                        wilt_h_1, fc_h_1, swc_sat_h_1, swc_h_2, swc_res_h_1
1140   
1141
1142    TYPE(t_wall_vertical), DIMENSION(:), POINTER   :: t_wall_v, t_wall_v_p
1143    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_wall_v_av, t_wall_v_1, t_wall_v_2
1144    TYPE(t_wall_vertical), DIMENSION(:), POINTER   :: t_window_v, t_window_v_p
1145    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_window_v_av, t_window_v_1, t_window_v_2
1146    TYPE(t_wall_vertical), DIMENSION(:), POINTER   :: t_green_v, t_green_v_p
1147    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_green_v_av, t_green_v_1, t_green_v_2
1148    TYPE(t_wall_vertical), DIMENSION(:), POINTER   :: swc_v, swc_v_p
1149    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: swc_v_av, swc_v_1, swc_v_2
1150#endif
1151
1152!-- Wall temporal tendencies for time stepping
1153    REAL(wp), DIMENSION(:,:), ALLOCATABLE          :: tt_wall_m          !< t_wall prognostic array
1154    REAL(wp), DIMENSION(:,:), ALLOCATABLE          :: tt_window_m        !< t_window prognostic array
1155    REAL(wp), DIMENSION(:,:), ALLOCATABLE          :: tt_green_m         !< t_green prognostic array
1156
1157!-- Surface and material parameters classes (surface_type)
1158!-- albedo, emissivity, lambda_surf, roughness, thickness, volumetric heat capacity, thermal conductivity
1159    INTEGER(iwp)                                   :: n_surface_types      !< number of the wall type categories
1160    INTEGER(iwp), PARAMETER                        :: n_surface_params = 9 !< number of parameters for each type of the wall
1161    INTEGER(iwp), PARAMETER                        :: ialbedo  = 1         !< albedo of the surface
1162    INTEGER(iwp), PARAMETER                        :: iemiss   = 2         !< emissivity of the surface
1163    INTEGER(iwp), PARAMETER                        :: ilambdas = 3         !< heat conductivity lambda S between surface and material ( W m-2 K-1 )
1164    INTEGER(iwp), PARAMETER                        :: irough   = 4         !< roughness length z0 for movements
1165    INTEGER(iwp), PARAMETER                        :: iroughh  = 5         !< roughness length z0h for scalars (heat, humidity,...)
1166    INTEGER(iwp), PARAMETER                        :: icsurf   = 6         !< Surface skin layer heat capacity (J m-2 K-1 )
1167    INTEGER(iwp), PARAMETER                        :: ithick   = 7         !< thickness of the surface (wall, roof, land)  ( m )
1168    INTEGER(iwp), PARAMETER                        :: irhoC    = 8         !< volumetric heat capacity rho*C of the material ( J m-3 K-1 )
1169    INTEGER(iwp), PARAMETER                        :: ilambdah = 9         !< thermal conductivity lambda H of the wall (W m-1 K-1 )
1170    CHARACTER(12), DIMENSION(:), ALLOCATABLE       :: surface_type_names   !< names of wall types (used only for reports)
1171    INTEGER(iwp), DIMENSION(:), ALLOCATABLE        :: surface_type_codes   !< codes of wall types
1172    REAL(wp), DIMENSION(:,:), ALLOCATABLE          :: surface_params       !< parameters of wall types
1173
1174   
1175!-- interfaces of subroutines accessed from outside of this module
1176    INTERFACE usm_boundary_condition
1177       MODULE PROCEDURE usm_boundary_condition
1178    END INTERFACE usm_boundary_condition
1179
1180    INTERFACE usm_check_data_output
1181       MODULE PROCEDURE usm_check_data_output
1182    END INTERFACE usm_check_data_output
1183   
1184    INTERFACE usm_check_parameters
1185       MODULE PROCEDURE usm_check_parameters
1186    END INTERFACE usm_check_parameters
1187   
1188    INTERFACE usm_data_output_3d
1189       MODULE PROCEDURE usm_data_output_3d
1190    END INTERFACE usm_data_output_3d
1191   
1192    INTERFACE usm_define_netcdf_grid
1193       MODULE PROCEDURE usm_define_netcdf_grid
1194    END INTERFACE usm_define_netcdf_grid
1195
1196    INTERFACE usm_init_urban_surface
1197       MODULE PROCEDURE usm_init_urban_surface
1198    END INTERFACE usm_init_urban_surface
1199
1200    INTERFACE usm_material_heat_model
1201       MODULE PROCEDURE usm_material_heat_model
1202    END INTERFACE usm_material_heat_model
1203   
1204    INTERFACE usm_green_heat_model
1205       MODULE PROCEDURE usm_green_heat_model
1206    END INTERFACE usm_green_heat_model
1207   
1208    INTERFACE usm_parin
1209       MODULE PROCEDURE usm_parin
1210    END INTERFACE usm_parin
1211
1212    INTERFACE usm_rrd_local 
1213       MODULE PROCEDURE usm_rrd_local
1214    END INTERFACE usm_rrd_local
1215
1216    INTERFACE usm_surface_energy_balance
1217       MODULE PROCEDURE usm_surface_energy_balance
1218    END INTERFACE usm_surface_energy_balance
1219   
1220    INTERFACE usm_swap_timelevel
1221       MODULE PROCEDURE usm_swap_timelevel
1222    END INTERFACE usm_swap_timelevel
1223       
1224    INTERFACE usm_wrd_local
1225       MODULE PROCEDURE usm_wrd_local
1226    END INTERFACE usm_wrd_local
1227
1228    INTERFACE usm_allocate_surface
1229       MODULE PROCEDURE usm_allocate_surface
1230    END INTERFACE usm_allocate_surface
1231
1232    INTERFACE usm_average_3d_data
1233       MODULE PROCEDURE usm_average_3d_data
1234    END INTERFACE usm_average_3d_data
1235
1236   
1237    SAVE
1238
1239    PRIVATE 
1240   
1241!-- Public functions
1242    PUBLIC usm_boundary_condition, usm_check_parameters, usm_init_urban_surface,&
1243           usm_rrd_local,                                                      & 
1244           usm_surface_energy_balance, usm_material_heat_model,                &
1245           usm_swap_timelevel, usm_check_data_output, usm_average_3d_data,     &
1246           usm_data_output_3d, usm_define_netcdf_grid, usm_parin,              &
1247           usm_wrd_local, usm_allocate_surface
1248
1249!-- Public parameters, constants and initial values
1250    PUBLIC usm_anthropogenic_heat, usm_material_model, usm_wall_mod,           &
1251           usm_green_heat_model, building_pars,  &
1252           nzt_wall, t_wall_h, t_wall_v,         &
1253           t_window_h, t_window_v, building_type
1254
1255
1256
1257 CONTAINS
1258
1259!------------------------------------------------------------------------------!
1260! Description:
1261! ------------
1262!> This subroutine creates the necessary indices of the urban surfaces
1263!> and plant canopy and it allocates the needed arrays for USM
1264!------------------------------------------------------------------------------!
1265    SUBROUTINE usm_allocate_surface
1266   
1267        IMPLICIT NONE
1268       
1269        INTEGER(iwp) ::  l
1270
1271!
1272!--     Allocate radiation arrays which are part of the new data type.
1273!--     For horizontal surfaces.
1274        ALLOCATE( surf_usm_h%surfhf(1:surf_usm_h%ns)    )
1275        ALLOCATE( surf_usm_h%rad_net_l(1:surf_usm_h%ns) )
1276!
1277!--     For vertical surfaces
1278        DO  l = 0, 3
1279           ALLOCATE( surf_usm_v(l)%surfhf(1:surf_usm_v(l)%ns)    )
1280           ALLOCATE( surf_usm_v(l)%rad_net_l(1:surf_usm_v(l)%ns) )
1281        ENDDO
1282
1283!--     Wall surface model
1284!--     allocate arrays for wall surface model and define pointers
1285       
1286!--     allocate array of wall types and wall parameters
1287        ALLOCATE ( surf_usm_h%surface_types(1:surf_usm_h%ns)      )
1288        ALLOCATE ( surf_usm_h%building_type(1:surf_usm_h%ns)      )
1289        ALLOCATE ( surf_usm_h%building_type_name(1:surf_usm_h%ns) )
1290        surf_usm_h%building_type      = 0
1291        surf_usm_h%building_type_name = 'none'
1292        DO  l = 0, 3
1293           ALLOCATE( surf_usm_v(l)%surface_types(1:surf_usm_v(l)%ns) )
1294           ALLOCATE ( surf_usm_v(l)%building_type(1:surf_usm_v(l)%ns)      )
1295           ALLOCATE ( surf_usm_v(l)%building_type_name(1:surf_usm_v(l)%ns) )
1296           surf_usm_v(l)%building_type      = 0
1297           surf_usm_v(l)%building_type_name = 'none'
1298        ENDDO
1299!
1300!--     Allocate albedo_type and albedo. Each surface element
1301!--     has 3 values, 0: wall fraction, 1: green fraction, 2: window fraction.
1302        ALLOCATE( surf_usm_h%albedo_type(0:2,1:surf_usm_h%ns) )
1303        ALLOCATE( surf_usm_h%albedo(0:2,1:surf_usm_h%ns)      )
1304        surf_usm_h%albedo_type = albedo_type
1305        DO  l = 0, 3
1306           ALLOCATE( surf_usm_v(l)%albedo_type(0:2,1:surf_usm_v(l)%ns) )
1307           ALLOCATE( surf_usm_v(l)%albedo(0:2,1:surf_usm_v(l)%ns)      )
1308           surf_usm_v(l)%albedo_type = albedo_type
1309        ENDDO       
1310
1311
1312!
1313!--     Allocate indoor target temperature for summer and winter
1314        ALLOCATE( surf_usm_h%target_temp_summer(1:surf_usm_h%ns) )
1315        ALLOCATE( surf_usm_h%target_temp_winter(1:surf_usm_h%ns) )
1316        DO  l = 0, 3
1317           ALLOCATE( surf_usm_v(l)%target_temp_summer(1:surf_usm_v(l)%ns) )
1318           ALLOCATE( surf_usm_v(l)%target_temp_winter(1:surf_usm_v(l)%ns) )
1319        ENDDO   
1320!
1321!--     Allocate flag indicating ground floor level surface elements
1322        ALLOCATE ( surf_usm_h%ground_level(1:surf_usm_h%ns) ) 
1323        DO  l = 0, 3
1324           ALLOCATE( surf_usm_v(l)%ground_level(1:surf_usm_v(l)%ns) )
1325        ENDDO   
1326!
1327!--      Allocate arrays for relative surface fraction.
1328!--      0 - wall fraction, 1 - green fraction, 2 - window fraction
1329         ALLOCATE( surf_usm_h%frac(0:2,1:surf_usm_h%ns) )
1330         surf_usm_h%frac = 0.0_wp
1331         DO  l = 0, 3
1332            ALLOCATE( surf_usm_v(l)%frac(0:2,1:surf_usm_v(l)%ns) )
1333            surf_usm_v(l)%frac = 0.0_wp
1334         ENDDO
1335       
1336!--     wall and roof surface parameters. First for horizontal surfaces
1337        ALLOCATE ( surf_usm_h%isroof_surf(1:surf_usm_h%ns)        )
1338        ALLOCATE ( surf_usm_h%lambda_surf(1:surf_usm_h%ns)        )
1339        ALLOCATE ( surf_usm_h%lambda_surf_window(1:surf_usm_h%ns) )
1340        ALLOCATE ( surf_usm_h%lambda_surf_green(1:surf_usm_h%ns)  )
1341        ALLOCATE ( surf_usm_h%c_surface(1:surf_usm_h%ns)          )
1342        ALLOCATE ( surf_usm_h%c_surface_window(1:surf_usm_h%ns)   )
1343        ALLOCATE ( surf_usm_h%c_surface_green(1:surf_usm_h%ns)    )
1344        ALLOCATE ( surf_usm_h%transmissivity(1:surf_usm_h%ns)     )
1345        ALLOCATE ( surf_usm_h%lai(1:surf_usm_h%ns)                )
1346        ALLOCATE ( surf_usm_h%emissivity(0:2,1:surf_usm_h%ns)     )
1347        ALLOCATE ( surf_usm_h%r_a(1:surf_usm_h%ns)                )
1348        ALLOCATE ( surf_usm_h%r_a_green(1:surf_usm_h%ns)          )
1349        ALLOCATE ( surf_usm_h%r_a_window(1:surf_usm_h%ns)         )
1350        ALLOCATE ( surf_usm_h%green_type_roof(1:surf_usm_h%ns)    )
1351        ALLOCATE ( surf_usm_h%r_s(1:surf_usm_h%ns)                )
1352       
1353!
1354!--     For vertical surfaces.
1355        DO  l = 0, 3
1356           ALLOCATE ( surf_usm_v(l)%lambda_surf(1:surf_usm_v(l)%ns)     )
1357           ALLOCATE ( surf_usm_v(l)%c_surface(1:surf_usm_v(l)%ns)       )
1358           ALLOCATE ( surf_usm_v(l)%lambda_surf_window(1:surf_usm_v(l)%ns) )
1359           ALLOCATE ( surf_usm_v(l)%c_surface_window(1:surf_usm_v(l)%ns)   )
1360           ALLOCATE ( surf_usm_v(l)%lambda_surf_green(1:surf_usm_v(l)%ns)  )
1361           ALLOCATE ( surf_usm_v(l)%c_surface_green(1:surf_usm_v(l)%ns)    )
1362           ALLOCATE ( surf_usm_v(l)%transmissivity(1:surf_usm_v(l)%ns)  )
1363           ALLOCATE ( surf_usm_v(l)%lai(1:surf_usm_v(l)%ns)             )
1364           ALLOCATE ( surf_usm_v(l)%emissivity(0:2,1:surf_usm_v(l)%ns)  )
1365           ALLOCATE ( surf_usm_v(l)%r_a(1:surf_usm_v(l)%ns)             )
1366           ALLOCATE ( surf_usm_v(l)%r_a_green(1:surf_usm_v(l)%ns)       )
1367           ALLOCATE ( surf_usm_v(l)%r_a_window(1:surf_usm_v(l)%ns)      )           
1368           ALLOCATE ( surf_usm_v(l)%r_s(1:surf_usm_v(l)%ns)                )
1369        ENDDO
1370
1371!       
1372!--     allocate wall and roof material parameters. First for horizontal surfaces
1373        ALLOCATE ( surf_usm_h%thickness_wall(1:surf_usm_h%ns)               )
1374        ALLOCATE ( surf_usm_h%thickness_window(1:surf_usm_h%ns)                  )
1375        ALLOCATE ( surf_usm_h%thickness_green(1:surf_usm_h%ns)                   )
1376        ALLOCATE ( surf_usm_h%lambda_h(nzb_wall:nzt_wall,1:surf_usm_h%ns)   )
1377        ALLOCATE ( surf_usm_h%rho_c_wall(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1378        ALLOCATE ( surf_usm_h%lambda_h_window(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1379        ALLOCATE ( surf_usm_h%rho_c_window(nzb_wall:nzt_wall,1:surf_usm_h%ns)    )
1380        ALLOCATE ( surf_usm_h%lambda_h_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
1381        ALLOCATE ( surf_usm_h%rho_c_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)     )
1382
1383        ALLOCATE ( surf_usm_h%rho_c_total_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)     )
1384        ALLOCATE ( surf_usm_h%n_vg_green(1:surf_usm_h%ns)     )
1385        ALLOCATE ( surf_usm_h%alpha_vg_green(1:surf_usm_h%ns)     )
1386        ALLOCATE ( surf_usm_h%l_vg_green(1:surf_usm_h%ns)     )
1387        ALLOCATE ( surf_usm_h%gamma_w_green_sat(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)     )
1388        ALLOCATE ( surf_usm_h%lambda_w_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)     )
1389        ALLOCATE ( surf_usm_h%gamma_w_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)     )
1390        ALLOCATE ( surf_usm_h%tswc_h_m(nzb_wall:nzt_wall,1:surf_usm_h%ns)     )
1391
1392!
1393!--     For vertical surfaces.
1394        DO  l = 0, 3
1395           ALLOCATE ( surf_usm_v(l)%thickness_wall(1:surf_usm_v(l)%ns)               )
1396           ALLOCATE ( surf_usm_v(l)%thickness_window(1:surf_usm_v(l)%ns)                  )
1397           ALLOCATE ( surf_usm_v(l)%thickness_green(1:surf_usm_v(l)%ns)                   )
1398           ALLOCATE ( surf_usm_v(l)%lambda_h(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)   )
1399           ALLOCATE ( surf_usm_v(l)%rho_c_wall(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1400           ALLOCATE ( surf_usm_v(l)%lambda_h_window(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1401           ALLOCATE ( surf_usm_v(l)%rho_c_window(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)    )
1402           ALLOCATE ( surf_usm_v(l)%lambda_h_green(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1403           ALLOCATE ( surf_usm_v(l)%rho_c_green(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)     )
1404        ENDDO
1405
1406!
1407!--     allocate green wall and roof vegetation and soil parameters. First horizontal surfaces
1408        ALLOCATE ( surf_usm_h%g_d(1:surf_usm_h%ns)              )
1409        ALLOCATE ( surf_usm_h%c_liq(1:surf_usm_h%ns)            )
1410        ALLOCATE ( surf_usm_h%qsws_liq(1:surf_usm_h%ns)         )
1411        ALLOCATE ( surf_usm_h%qsws_veg(1:surf_usm_h%ns)         )
1412        ALLOCATE ( surf_usm_h%r_canopy(1:surf_usm_h%ns)         )
1413        ALLOCATE ( surf_usm_h%r_canopy_min(1:surf_usm_h%ns)     )
1414        ALLOCATE ( surf_usm_h%qsws_eb(1:surf_usm_h%ns)          )
1415        ALLOCATE ( surf_usm_h%pt_10cm(1:surf_usm_h%ns)          ) 
1416        ALLOCATE ( surf_usm_h%pt_2m(1:surf_usm_h%ns)            ) 
1417
1418!
1419!--     For vertical surfaces.
1420        DO  l = 0, 3
1421          ALLOCATE ( surf_usm_v(l)%g_d(1:surf_usm_v(l)%ns)              )
1422          ALLOCATE ( surf_usm_v(l)%c_liq(1:surf_usm_v(l)%ns)            )
1423          ALLOCATE ( surf_usm_v(l)%qsws_liq(1:surf_usm_v(l)%ns)         )
1424          ALLOCATE ( surf_usm_v(l)%qsws_veg(1:surf_usm_v(l)%ns)         )
1425          ALLOCATE ( surf_usm_v(l)%qsws_eb(1:surf_usm_v(l)%ns)          )
1426          ALLOCATE ( surf_usm_v(l)%r_canopy(1:surf_usm_v(l)%ns)         )
1427          ALLOCATE ( surf_usm_v(l)%r_canopy_min(1:surf_usm_v(l)%ns)     )
1428          ALLOCATE ( surf_usm_v(l)%pt_10cm(1:surf_usm_v(l)%ns)     )
1429        ENDDO
1430       
1431!--     allocate wall and roof layers sizes. For horizontal surfaces.
1432        ALLOCATE ( zwn(nzb_wall:nzt_wall) )
1433        ALLOCATE ( surf_usm_h%dz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)     )
1434        ALLOCATE ( zwn_window(nzb_wall:nzt_wall) )
1435        ALLOCATE ( surf_usm_h%dz_window(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)     )
1436        ALLOCATE ( zwn_green(nzb_wall:nzt_wall) )
1437        ALLOCATE ( surf_usm_h%dz_green(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)      )
1438        ALLOCATE ( surf_usm_h%ddz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)    )
1439        ALLOCATE ( surf_usm_h%dz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
1440        ALLOCATE ( surf_usm_h%ddz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1441        ALLOCATE ( surf_usm_h%zw(nzb_wall:nzt_wall,1:surf_usm_h%ns)            )
1442        ALLOCATE ( surf_usm_h%ddz_window(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)    )
1443        ALLOCATE ( surf_usm_h%dz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
1444        ALLOCATE ( surf_usm_h%ddz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1445        ALLOCATE ( surf_usm_h%zw_window(nzb_wall:nzt_wall,1:surf_usm_h%ns)       )
1446        ALLOCATE ( surf_usm_h%ddz_green(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)     )
1447        ALLOCATE ( surf_usm_h%dz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)   )
1448        ALLOCATE ( surf_usm_h%ddz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
1449        ALLOCATE ( surf_usm_h%zw_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)        )
1450!
1451!--     For vertical surfaces.
1452        DO  l = 0, 3
1453           ALLOCATE ( surf_usm_v(l)%dz_wall(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)     )
1454           ALLOCATE ( surf_usm_v(l)%dz_window(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)     )
1455           ALLOCATE ( surf_usm_v(l)%dz_green(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)      )
1456           ALLOCATE ( surf_usm_v(l)%ddz_wall(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)    )
1457           ALLOCATE ( surf_usm_v(l)%dz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1458           ALLOCATE ( surf_usm_v(l)%ddz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1459           ALLOCATE ( surf_usm_v(l)%zw(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)            )
1460           ALLOCATE ( surf_usm_v(l)%ddz_window(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)    )
1461           ALLOCATE ( surf_usm_v(l)%dz_window_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1462           ALLOCATE ( surf_usm_v(l)%ddz_window_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1463           ALLOCATE ( surf_usm_v(l)%zw_window(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)       )
1464           ALLOCATE ( surf_usm_v(l)%ddz_green(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)     )
1465           ALLOCATE ( surf_usm_v(l)%dz_green_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)   )
1466           ALLOCATE ( surf_usm_v(l)%ddz_green_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1467           ALLOCATE ( surf_usm_v(l)%zw_green(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)        )
1468        ENDDO
1469
1470!--     allocate wall and roof temperature arrays, for horizontal walls
1471#if defined( __nopointer )
1472        IF ( .NOT. ALLOCATED( t_surf_wall_h ) )                                     &
1473           ALLOCATE ( t_surf_wall_h(1:surf_usm_h%ns) )
1474        IF ( .NOT. ALLOCATED( t_surf_wall_h_p ) )                                   &
1475           ALLOCATE ( t_surf_wall_h_p(1:surf_usm_h%ns) )
1476        IF ( .NOT. ALLOCATED( t_wall_h ) )                                     &           
1477           ALLOCATE ( t_wall_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1478        IF ( .NOT. ALLOCATED( t_wall_h_p ) )                                   &           
1479           ALLOCATE ( t_wall_h_p(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1480        IF ( .NOT. ALLOCATED( t_surf_window_h ) )                              &
1481           ALLOCATE ( t_surf_window_h(1:surf_usm_h%ns) )
1482        IF ( .NOT. ALLOCATED( t_surf_window_h_p ) )                            &
1483           ALLOCATE ( t_surf_window_h_p(1:surf_usm_h%ns) )
1484        IF ( .NOT. ALLOCATED( t_window_h ) )                                   &           
1485           ALLOCATE ( t_window_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1486        IF ( .NOT. ALLOCATED( t_window_h_p ) )                                 &           
1487           ALLOCATE ( t_window_h_p(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1488        IF ( .NOT. ALLOCATED( t_surf_green_h ) )                               &
1489           ALLOCATE ( t_surf_green_h(1:surf_usm_h%ns) )
1490        IF ( .NOT. ALLOCATED( t_surf_green_h_p ) )                             &
1491           ALLOCATE ( t_surf_green_h_p(1:surf_usm_h%ns) )           
1492        IF ( .NOT. ALLOCATED( t_green_h ) )                                    &           
1493           ALLOCATE ( t_green_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1494        IF ( .NOT. ALLOCATED( t_green_h_p ) )                                  &           
1495           ALLOCATE ( t_green_h_p(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1496        IF ( .NOT. ALLOCATED( swc_h ) )                                    &           
1497           ALLOCATE ( swc_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1498        IF ( .NOT. ALLOCATED( swc_sat_h ) )                                    &           
1499           ALLOCATE ( swc_sat_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1500        IF ( .NOT. ALLOCATED( swc_res_h ) )                                    &           
1501           ALLOCATE ( swc_res_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1502        IF ( .NOT. ALLOCATED( rootfr_h ) )                                    &           
1503           ALLOCATE ( rootfr_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1504        IF ( .NOT. ALLOCATED( wilt_h ) )                                    &           
1505           ALLOCATE ( wilt_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1506        IF ( .NOT. ALLOCATED( fc_h ) )                                    &           
1507           ALLOCATE ( fc_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1508
1509       IF ( .NOT. ALLOCATED( m_liq_usm_h%var_usm_1d ) )                            &
1510          ALLOCATE ( m_liq_usm_h%var_usm_1d(1:surf_usm_h%ns) )
1511
1512!--    Horizontal surfaces
1513       ALLOCATE ( m_liq_usm_h_p%var_usm_1d(1:surf_usm_h%ns)                      )
1514!
1515!--    Vertical surfaces
1516       DO  l = 0, 3
1517          ALLOCATE ( m_liq_usm_v_p(l)%var_usm_1d(1:surf_usm_v(l)%ns)                      )
1518       ENDDO
1519         
1520#else
1521!
1522!--     Allocate if required. Note, in case of restarts, some of these arrays
1523!--     might be already allocated.
1524        IF ( .NOT. ALLOCATED( t_surf_wall_h_1 ) )                                   &
1525           ALLOCATE ( t_surf_wall_h_1(1:surf_usm_h%ns) )
1526        IF ( .NOT. ALLOCATED( t_surf_wall_h_2 ) )                                   &
1527           ALLOCATE ( t_surf_wall_h_2(1:surf_usm_h%ns) )
1528        IF ( .NOT. ALLOCATED( t_wall_h_1 ) )                                   &           
1529           ALLOCATE ( t_wall_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1530        IF ( .NOT. ALLOCATED( t_wall_h_2 ) )                                   &           
1531           ALLOCATE ( t_wall_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )         
1532        IF ( .NOT. ALLOCATED( t_surf_window_h_1 ) )                            &
1533           ALLOCATE ( t_surf_window_h_1(1:surf_usm_h%ns) )
1534        IF ( .NOT. ALLOCATED( t_surf_window_h_2 ) )                            &
1535           ALLOCATE ( t_surf_window_h_2(1:surf_usm_h%ns) )
1536        IF ( .NOT. ALLOCATED( t_window_h_1 ) )                                 &           
1537           ALLOCATE ( t_window_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1538        IF ( .NOT. ALLOCATED( t_window_h_2 ) )                                 &           
1539           ALLOCATE ( t_window_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )         
1540        IF ( .NOT. ALLOCATED( t_surf_green_h_1 ) )                             &
1541           ALLOCATE ( t_surf_green_h_1(1:surf_usm_h%ns) )
1542        IF ( .NOT. ALLOCATED( t_surf_green_h_2 ) )                             &
1543           ALLOCATE ( t_surf_green_h_2(1:surf_usm_h%ns) )
1544        IF ( .NOT. ALLOCATED( t_green_h_1 ) )                                  &           
1545           ALLOCATE ( t_green_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1546        IF ( .NOT. ALLOCATED( t_green_h_2 ) )                                  &           
1547           ALLOCATE ( t_green_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )         
1548        IF ( .NOT. ALLOCATED( swc_h_1 ) )                                  &           
1549           ALLOCATE ( swc_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1550        IF ( .NOT. ALLOCATED( swc_sat_h_1 ) )                                  &           
1551           ALLOCATE ( swc_sat_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1552        IF ( .NOT. ALLOCATED( swc_res_h_1 ) )                                  &           
1553           ALLOCATE ( swc_res_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1554        IF ( .NOT. ALLOCATED( swc_h_2 ) )                                  &           
1555           ALLOCATE ( swc_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1556        IF ( .NOT. ALLOCATED( rootfr_h_1 ) )                                  &           
1557           ALLOCATE ( rootfr_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1558        IF ( .NOT. ALLOCATED( wilt_h_1 ) )                                  &           
1559           ALLOCATE ( wilt_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1560        IF ( .NOT. ALLOCATED( fc_h_1 ) )                                  &           
1561           ALLOCATE ( fc_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1562
1563        IF ( .NOT. ALLOCATED( m_liq_usm_h_1%var_usm_1d ) )                         &
1564           ALLOCATE ( m_liq_usm_h_1%var_usm_1d(1:surf_usm_h%ns) )
1565        IF ( .NOT. ALLOCATED( m_liq_usm_h_2%var_usm_1d ) )                         &
1566           ALLOCATE ( m_liq_usm_h_2%var_usm_1d(1:surf_usm_h%ns) )
1567           
1568!           
1569!--     initial assignment of the pointers
1570        t_wall_h    => t_wall_h_1;    t_wall_h_p    => t_wall_h_2
1571        t_window_h    => t_window_h_1;    t_window_h_p    => t_window_h_2
1572        t_green_h    => t_green_h_1;    t_green_h_p    => t_green_h_2
1573        t_surf_wall_h => t_surf_wall_h_1; t_surf_wall_h_p => t_surf_wall_h_2           
1574        t_surf_window_h => t_surf_window_h_1; t_surf_window_h_p => t_surf_window_h_2 
1575        t_surf_green_h => t_surf_green_h_1; t_surf_green_h_p => t_surf_green_h_2           
1576        m_liq_usm_h     => m_liq_usm_h_1;     m_liq_usm_h_p     => m_liq_usm_h_2
1577        swc_h       => swc_h_1; swc_h_p     => swc_h_2
1578        swc_sat_h    => swc_sat_h_1
1579        swc_res_h    => swc_res_h_1
1580        rootfr_h       => rootfr_h_1
1581        wilt_h       => wilt_h_1
1582        fc_h       => fc_h_1
1583 
1584#endif
1585
1586!--     allocate wall and roof temperature arrays, for vertical walls if required
1587#if defined( __nopointer )
1588        DO  l = 0, 3
1589           IF ( .NOT. ALLOCATED( t_surf_wall_v(l)%t ) )                             &
1590              ALLOCATE ( t_surf_wall_v(l)%t(1:surf_usm_v(l)%ns) )
1591           IF ( .NOT. ALLOCATED( t_surf_wall_v_p(l)%t ) )                           &
1592              ALLOCATE ( t_surf_wall_v_p(l)%t(1:surf_usm_v(l)%ns) )
1593           IF ( .NOT. ALLOCATED( t_wall_v(l)%t ) )                             &
1594              ALLOCATE ( t_wall_v(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1595           IF ( .NOT. ALLOCATED( t_wall_v_p(l)%t ) )                           &                 
1596              ALLOCATE ( t_wall_v_p(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1597           IF ( .NOT. ALLOCATED( t_surf_window_v(l)%t ) )                      &
1598              ALLOCATE ( t_surf_window_v(l)%t(1:surf_usm_v(l)%ns) )
1599           IF ( .NOT. ALLOCATED( t_surf_window_v_p(l)%t ) )                    &
1600              ALLOCATE ( t_surf_window_v_p(l)%t(1:surf_usm_v(l)%ns) )
1601           IF ( .NOT. ALLOCATED( t_window_v(l)%t ) )                           &
1602              ALLOCATE ( t_window_v(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1603           IF ( .NOT. ALLOCATED( t_window_v_p(l)%t ) )                         &                 
1604              ALLOCATE ( t_window_v_p(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1605           IF ( .NOT. ALLOCATED( t_green_v(l)%t ) )                            &
1606              ALLOCATE ( t_green_v(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1607           IF ( .NOT. ALLOCATED( t_green_v_p(l)%t ) )                          &                 
1608              ALLOCATE ( t_green_v_p(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1609           IF ( .NOT. ALLOCATED( t_surf_green_v(l)%t ) )                       &
1610              ALLOCATE ( t_surf_green_v(l)%t(1:surf_usm_v(l)%ns) )
1611           IF ( .NOT. ALLOCATED( t_surf_green_v_p(l)%t ) )                     &
1612              ALLOCATE ( t_surf_green_v_p(l)%t(1:surf_usm_v(l)%ns) )
1613           IF ( .NOT. ALLOCATED( m_liq_usm_v(l)%var_usm_1d ) )                 &
1614             ALLOCATE ( m_liq_usm_v(l)%var_usm_1d(1:surf_usm_v(l)%ns) )
1615           IF ( .NOT. ALLOCATED( swc_v(l)%t ) )                             &
1616              ALLOCATE ( swc_v(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1617           IF ( .NOT. ALLOCATED( swc_v_p(l)%t ) )                           &                 
1618              ALLOCATE ( swc_v_p(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1619        ENDDO
1620#else
1621!
1622!--     Allocate if required. Note, in case of restarts, some of these arrays
1623!--     might be already allocated.
1624        DO  l = 0, 3
1625           IF ( .NOT. ALLOCATED( t_surf_wall_v_1(l)%t ) )                           &
1626              ALLOCATE ( t_surf_wall_v_1(l)%t(1:surf_usm_v(l)%ns) )
1627           IF ( .NOT. ALLOCATED( t_surf_wall_v_2(l)%t ) )                           &
1628              ALLOCATE ( t_surf_wall_v_2(l)%t(1:surf_usm_v(l)%ns) )
1629           IF ( .NOT. ALLOCATED( t_wall_v_1(l)%t ) )                           &           
1630              ALLOCATE ( t_wall_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1631           IF ( .NOT. ALLOCATED( t_wall_v_2(l)%t ) )                           &           
1632              ALLOCATE ( t_wall_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1633           IF ( .NOT. ALLOCATED( t_surf_window_v_1(l)%t ) )                    &
1634              ALLOCATE ( t_surf_window_v_1(l)%t(1:surf_usm_v(l)%ns) )
1635           IF ( .NOT. ALLOCATED( t_surf_window_v_2(l)%t ) )                    &
1636              ALLOCATE ( t_surf_window_v_2(l)%t(1:surf_usm_v(l)%ns) )
1637           IF ( .NOT. ALLOCATED( t_window_v_1(l)%t ) )                         &           
1638              ALLOCATE ( t_window_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1639           IF ( .NOT. ALLOCATED( t_window_v_2(l)%t ) )                         &           
1640              ALLOCATE ( t_window_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1641           IF ( .NOT. ALLOCATED( t_surf_green_v_1(l)%t ) )                     &
1642              ALLOCATE ( t_surf_green_v_1(l)%t(1:surf_usm_v(l)%ns) )
1643           IF ( .NOT. ALLOCATED( t_surf_green_v_2(l)%t ) )                     &
1644              ALLOCATE ( t_surf_green_v_2(l)%t(1:surf_usm_v(l)%ns) )
1645           IF ( .NOT. ALLOCATED( t_green_v_1(l)%t ) )                          &           
1646              ALLOCATE ( t_green_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1647           IF ( .NOT. ALLOCATED( t_green_v_2(l)%t ) )                          &           
1648              ALLOCATE ( t_green_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1649           IF ( .NOT. ALLOCATED( m_liq_usm_v_1(l)%var_usm_1d ) )              &
1650              ALLOCATE ( m_liq_usm_v_1(l)%var_usm_1d(1:surf_usm_v(l)%ns) )
1651           IF ( .NOT. ALLOCATED( m_liq_usm_v_2(l)%var_usm_1d ) )              &
1652              ALLOCATE ( m_liq_usm_v_2(l)%var_usm_1d(1:surf_usm_v(l)%ns) )
1653           IF ( .NOT. ALLOCATED( swc_v_1(l)%t ) )                           &           
1654              ALLOCATE ( swc_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1655           IF ( .NOT. ALLOCATED( swc_v_2(l)%t ) )                           &           
1656              ALLOCATE ( swc_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1657        ENDDO
1658!
1659!--     initial assignment of the pointers
1660        t_wall_v    => t_wall_v_1;    t_wall_v_p    => t_wall_v_2
1661        t_surf_wall_v => t_surf_wall_v_1; t_surf_wall_v_p => t_surf_wall_v_2
1662        t_window_v    => t_window_v_1;    t_window_v_p    => t_window_v_2
1663        t_green_v    => t_green_v_1;    t_green_v_p    => t_green_v_2
1664        t_surf_window_v => t_surf_window_v_1; t_surf_window_v_p => t_surf_window_v_2
1665        t_surf_green_v => t_surf_green_v_1; t_surf_green_v_p => t_surf_green_v_2
1666        m_liq_usm_v     => m_liq_usm_v_1;     m_liq_usm_v_p     => m_liq_usm_v_2
1667        swc_v    => swc_v_1;    swc_v_p    => swc_v_2
1668
1669#endif
1670!
1671!--     Allocate intermediate timestep arrays. For horizontal surfaces.
1672        ALLOCATE ( surf_usm_h%tt_surface_wall_m(1:surf_usm_h%ns)                  )
1673        ALLOCATE ( surf_usm_h%tt_wall_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1674        ALLOCATE ( surf_usm_h%tt_surface_window_m(1:surf_usm_h%ns)             )
1675        ALLOCATE ( surf_usm_h%tt_window_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1676        ALLOCATE ( surf_usm_h%tt_green_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)  )
1677        ALLOCATE ( surf_usm_h%tt_surface_green_m(1:surf_usm_h%ns)              )
1678
1679!
1680!--    Allocate intermediate timestep arrays
1681!--    Horizontal surfaces
1682       ALLOCATE ( tm_liq_usm_h_m%var_usm_1d(1:surf_usm_h%ns)                   )
1683!
1684!--    Horizontal surfaces
1685       DO  l = 0, 3
1686          ALLOCATE ( tm_liq_usm_v_m(l)%var_usm_1d(1:surf_usm_v(l)%ns)          )
1687       ENDDO 
1688       
1689!
1690!--     Set inital values for prognostic quantities
1691        IF ( ALLOCATED( surf_usm_h%tt_surface_wall_m ) )  surf_usm_h%tt_surface_wall_m = 0.0_wp
1692        IF ( ALLOCATED( surf_usm_h%tt_wall_m    ) )  surf_usm_h%tt_wall_m    = 0.0_wp
1693        IF ( ALLOCATED( surf_usm_h%tt_surface_window_m ) )  surf_usm_h%tt_surface_window_m = 0.0_wp
1694        IF ( ALLOCATED( surf_usm_h%tt_window_m    )      )  surf_usm_h%tt_window_m         = 0.0_wp
1695        IF ( ALLOCATED( surf_usm_h%tt_green_m    )       )  surf_usm_h%tt_green_m          = 0.0_wp
1696        IF ( ALLOCATED( surf_usm_h%tt_surface_green_m )  )  surf_usm_h%tt_surface_green_m  = 0.0_wp
1697!
1698!--     Now, for vertical surfaces
1699        DO  l = 0, 3
1700           ALLOCATE ( surf_usm_v(l)%tt_surface_wall_m(1:surf_usm_v(l)%ns)                  )
1701           ALLOCATE ( surf_usm_v(l)%tt_wall_m(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1702           IF ( ALLOCATED( surf_usm_v(l)%tt_surface_wall_m ) )  surf_usm_v(l)%tt_surface_wall_m = 0.0_wp
1703           IF ( ALLOCATED( surf_usm_v(l)%tt_wall_m    ) )  surf_usm_v(l)%tt_wall_m    = 0.0_wp
1704           ALLOCATE ( surf_usm_v(l)%tt_surface_window_m(1:surf_usm_v(l)%ns)             )
1705           ALLOCATE ( surf_usm_v(l)%tt_window_m(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1706           IF ( ALLOCATED( surf_usm_v(l)%tt_surface_window_m ) )  surf_usm_v(l)%tt_surface_window_m = 0.0_wp
1707           IF ( ALLOCATED( surf_usm_v(l)%tt_window_m  ) )  surf_usm_v(l)%tt_window_m    = 0.0_wp
1708           ALLOCATE ( surf_usm_v(l)%tt_surface_green_m(1:surf_usm_v(l)%ns)              )
1709           IF ( ALLOCATED( surf_usm_v(l)%tt_surface_green_m ) )  surf_usm_v(l)%tt_surface_green_m = 0.0_wp
1710           ALLOCATE ( surf_usm_v(l)%tt_green_m(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)  )
1711           IF ( ALLOCATED( surf_usm_v(l)%tt_green_m   ) )  surf_usm_v(l)%tt_green_m    = 0.0_wp
1712        ENDDO
1713
1714!--     allocate wall heat flux output array and set initial values. For horizontal surfaces
1715!         ALLOCATE ( surf_usm_h%wshf(1:surf_usm_h%ns)    )  !can be removed
1716        ALLOCATE ( surf_usm_h%wshf_eb(1:surf_usm_h%ns) )
1717        ALLOCATE ( surf_usm_h%wghf_eb(1:surf_usm_h%ns) )
1718        ALLOCATE ( surf_usm_h%wghf_eb_window(1:surf_usm_h%ns) )
1719        ALLOCATE ( surf_usm_h%wghf_eb_green(1:surf_usm_h%ns) )
1720        ALLOCATE ( surf_usm_h%iwghf_eb(1:surf_usm_h%ns) )
1721        ALLOCATE ( surf_usm_h%iwghf_eb_window(1:surf_usm_h%ns) )
1722        IF ( ALLOCATED( surf_usm_h%wshf    ) )  surf_usm_h%wshf    = 0.0_wp
1723        IF ( ALLOCATED( surf_usm_h%wshf_eb ) )  surf_usm_h%wshf_eb = 0.0_wp
1724        IF ( ALLOCATED( surf_usm_h%wghf_eb ) )  surf_usm_h%wghf_eb = 0.0_wp
1725        IF ( ALLOCATED( surf_usm_h%wghf_eb_window ) )  surf_usm_h%wghf_eb_window = 0.0_wp
1726        IF ( ALLOCATED( surf_usm_h%wghf_eb_green ) )  surf_usm_h%wghf_eb_green = 0.0_wp
1727        IF ( ALLOCATED( surf_usm_h%iwghf_eb ) )  surf_usm_h%iwghf_eb = 0.0_wp
1728        IF ( ALLOCATED( surf_usm_h%iwghf_eb_window ) )  surf_usm_h%iwghf_eb_window = 0.0_wp
1729!
1730!--     Now, for vertical surfaces
1731        DO  l = 0, 3
1732!            ALLOCATE ( surf_usm_v(l)%wshf(1:surf_usm_v(l)%ns)    )    ! can be removed
1733           ALLOCATE ( surf_usm_v(l)%wshf_eb(1:surf_usm_v(l)%ns) )
1734           ALLOCATE ( surf_usm_v(l)%wghf_eb(1:surf_usm_v(l)%ns) )
1735           ALLOCATE ( surf_usm_v(l)%wghf_eb_window(1:surf_usm_v(l)%ns) )
1736           ALLOCATE ( surf_usm_v(l)%wghf_eb_green(1:surf_usm_v(l)%ns) )
1737           ALLOCATE ( surf_usm_v(l)%iwghf_eb(1:surf_usm_v(l)%ns) )
1738           ALLOCATE ( surf_usm_v(l)%iwghf_eb_window(1:surf_usm_v(l)%ns) )
1739           IF ( ALLOCATED( surf_usm_v(l)%wshf    ) )  surf_usm_v(l)%wshf    = 0.0_wp
1740           IF ( ALLOCATED( surf_usm_v(l)%wshf_eb ) )  surf_usm_v(l)%wshf_eb = 0.0_wp
1741           IF ( ALLOCATED( surf_usm_v(l)%wghf_eb ) )  surf_usm_v(l)%wghf_eb = 0.0_wp
1742           IF ( ALLOCATED( surf_usm_v(l)%wghf_eb_window ) )  surf_usm_v(l)%wghf_eb_window = 0.0_wp
1743           IF ( ALLOCATED( surf_usm_v(l)%wghf_eb_green ) )  surf_usm_v(l)%wghf_eb_green = 0.0_wp
1744           IF ( ALLOCATED( surf_usm_v(l)%iwghf_eb ) )  surf_usm_v(l)%iwghf_eb = 0.0_wp
1745           IF ( ALLOCATED( surf_usm_v(l)%iwghf_eb_window ) )  surf_usm_v(l)%iwghf_eb_window = 0.0_wp
1746        ENDDO
1747       
1748    END SUBROUTINE usm_allocate_surface
1749
1750
1751!------------------------------------------------------------------------------!
1752! Description:
1753! ------------
1754!> Sum up and time-average urban surface output quantities as well as allocate
1755!> the array necessary for storing the average.
1756!------------------------------------------------------------------------------!
1757    SUBROUTINE usm_average_3d_data( mode, variable )
1758
1759        IMPLICIT NONE
1760
1761        CHARACTER(LEN=*), INTENT(IN) ::  mode
1762        CHARACTER(LEN=*), INTENT(IN) :: variable
1763 
1764        INTEGER(iwp)                                       :: i, j, k, l, m, ids, idsint, iwl, istat
1765        CHARACTER(LEN=varnamelength)                       :: var
1766        INTEGER(iwp), PARAMETER                            :: nd = 5
1767        CHARACTER(LEN=6), DIMENSION(0:nd-1), PARAMETER     :: dirname = (/ '_roof ', '_south', '_north', '_west ', '_east ' /)
1768        INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER         :: dirint = (/ iup_u, isouth_u, inorth_u, iwest_u, ieast_u /)
1769
1770!--     find the real name of the variable
1771        ids = -1
1772        l = -1
1773        var = TRIM(variable)
1774        DO i = 0, nd-1
1775            k = len(TRIM(var))
1776            j = len(TRIM(dirname(i)))
1777            IF ( TRIM(var(k-j+1:k)) == TRIM(dirname(i)) )  THEN
1778                ids = i
1779                idsint = dirint(ids)
1780                var = var(:k-j)
1781                EXIT
1782            ENDIF
1783        ENDDO
1784        l = idsint - 2  ! horisontal direction index - terible hack !
1785        IF ( l < 0 .OR. l > 3 ) THEN
1786           l = -1
1787        END IF
1788        IF ( ids == -1 )  THEN
1789            var = TRIM(variable)
1790        ENDIF
1791        IF ( var(1:11) == 'usm_t_wall_'  .AND.  len(TRIM(var)) >= 12 )  THEN
1792!--          wall layers
1793            READ(var(12:12), '(I1)', iostat=istat ) iwl
1794            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1795                var = var(1:10)
1796            ELSE
1797!--             wrong wall layer index
1798                RETURN
1799            ENDIF
1800        ENDIF
1801        IF ( var(1:13) == 'usm_t_window_'  .AND.  len(TRIM(var)) >= 14 )  THEN
1802!--          wall layers
1803            READ(var(14:14), '(I1)', iostat=istat ) iwl
1804            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1805                var = var(1:12)
1806            ELSE
1807!--             wrong window layer index
1808                RETURN
1809            ENDIF
1810        ENDIF
1811        IF ( var(1:12) == 'usm_t_green_'  .AND.  len(TRIM(var)) >= 13 )  THEN
1812!--          wall layers
1813            READ(var(13:13), '(I1)', iostat=istat ) iwl
1814            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1815                var = var(1:11)
1816            ELSE
1817!--             wrong green layer index
1818                RETURN
1819            ENDIF
1820        ENDIF
1821        IF ( var(1:8) == 'usm_swc_'  .AND.  len(TRIM(var)) >= 9 )  THEN
1822!--          swc layers
1823            READ(var(9:9), '(I1)', iostat=istat ) iwl
1824            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1825                var = var(1:7)
1826            ELSE
1827!--             wrong swc layer index
1828                RETURN
1829            ENDIF
1830        ENDIF
1831
1832        IF ( mode == 'allocate' )  THEN
1833           
1834           SELECT CASE ( TRIM( var ) )
1835               
1836                CASE ( 'usm_rad_net' )
1837!--                 array of complete radiation balance
1838                    IF ( l == -1 ) THEN
1839                        IF ( .NOT.  ALLOCATED(surf_usm_h%rad_net_av) )  THEN
1840                            ALLOCATE( surf_usm_h%rad_net_av(1:surf_usm_h%ns) )
1841                            surf_usm_h%rad_net_av = 0.0_wp
1842                        ENDIF
1843                    ELSE
1844                        IF ( .NOT.  ALLOCATED(surf_usm_v(l)%rad_net_av) )  THEN
1845                            ALLOCATE( surf_usm_v(l)%rad_net_av(1:surf_usm_v(l)%ns) )
1846                            surf_usm_v(l)%rad_net_av = 0.0_wp
1847                        ENDIF
1848                    ENDIF
1849                   
1850                CASE ( 'usm_rad_insw' )
1851!--                 array of sw radiation falling to surface after i-th reflection
1852                    IF ( .NOT.  ALLOCATED(surfinsw_av) )  THEN
1853                        ALLOCATE( surfinsw_av(nsurfl) )
1854                        surfinsw_av = 0.0_wp
1855                    ENDIF
1856
1857                CASE ( 'usm_rad_inlw' )
1858!--                 array of lw radiation falling to surface after i-th reflection
1859                    IF ( .NOT.  ALLOCATED(surfinlw_av) )  THEN
1860                        ALLOCATE( surfinlw_av(nsurfl) )
1861                        surfinlw_av = 0.0_wp
1862                    ENDIF
1863
1864                CASE ( 'usm_rad_inswdir' )
1865!--                 array of direct sw radiation falling to surface from sun
1866                    IF ( .NOT.  ALLOCATED(surfinswdir_av) )  THEN
1867                        ALLOCATE( surfinswdir_av(nsurfl) )
1868                        surfinswdir_av = 0.0_wp
1869                    ENDIF
1870
1871                CASE ( 'usm_rad_inswdif' )
1872!--                 array of difusion sw radiation falling to surface from sky and borders of the domain
1873                    IF ( .NOT.  ALLOCATED(surfinswdif_av) )  THEN
1874                        ALLOCATE( surfinswdif_av(nsurfl) )
1875                        surfinswdif_av = 0.0_wp
1876                    ENDIF
1877
1878                CASE ( 'usm_rad_inswref' )
1879!--                 array of sw radiation falling to surface from reflections
1880                    IF ( .NOT.  ALLOCATED(surfinswref_av) )  THEN
1881                        ALLOCATE( surfinswref_av(nsurfl) )
1882                        surfinswref_av = 0.0_wp
1883                    ENDIF
1884
1885                CASE ( 'usm_rad_inlwdif' )
1886!--                 array of sw radiation falling to surface after i-th reflection
1887                   IF ( .NOT.  ALLOCATED(surfinlwdif_av) )  THEN
1888                        ALLOCATE( surfinlwdif_av(nsurfl) )
1889                        surfinlwdif_av = 0.0_wp
1890                    ENDIF
1891
1892                CASE ( 'usm_rad_inlwref' )
1893!--                 array of lw radiation falling to surface from reflections
1894                    IF ( .NOT.  ALLOCATED(surfinlwref_av) )  THEN
1895                        ALLOCATE( surfinlwref_av(nsurfl) )
1896                        surfinlwref_av = 0.0_wp
1897                    ENDIF
1898
1899                CASE ( 'usm_rad_outsw' )
1900!--                 array of sw radiation emitted from surface after i-th reflection
1901                    IF ( .NOT.  ALLOCATED(surfoutsw_av) )  THEN
1902                        ALLOCATE( surfoutsw_av(nsurfl) )
1903                        surfoutsw_av = 0.0_wp
1904                    ENDIF
1905
1906                CASE ( 'usm_rad_outlw' )
1907!--                 array of lw radiation emitted from surface after i-th reflection
1908                    IF ( .NOT.  ALLOCATED(surfoutlw_av) )  THEN
1909                        ALLOCATE( surfoutlw_av(nsurfl) )
1910                        surfoutlw_av = 0.0_wp
1911                    ENDIF
1912                CASE ( 'usm_rad_ressw' )
1913!--                 array of residua of sw radiation absorbed in surface after last reflection
1914                    IF ( .NOT.  ALLOCATED(surfins_av) )  THEN
1915                        ALLOCATE( surfins_av(nsurfl) )
1916                        surfins_av = 0.0_wp
1917                    ENDIF
1918                                   
1919                CASE ( 'usm_rad_reslw' )
1920!--                 array of residua of lw radiation absorbed in surface after last reflection
1921                    IF ( .NOT.  ALLOCATED(surfinl_av) )  THEN
1922                        ALLOCATE( surfinl_av(nsurfl) )
1923                        surfinl_av = 0.0_wp
1924                    ENDIF
1925                                   
1926                CASE ( 'usm_rad_pc_inlw' )
1927!--                 array of of lw radiation absorbed in plant canopy
1928                    IF ( .NOT.  ALLOCATED(pcbinlw_av) )  THEN
1929                        ALLOCATE( pcbinlw_av(1:npcbl) )
1930                        pcbinlw_av = 0.0_wp
1931                    ENDIF
1932                                   
1933                CASE ( 'usm_rad_pc_insw' )
1934!--                 array of of sw radiation absorbed in plant canopy
1935                    IF ( .NOT.  ALLOCATED(pcbinsw_av) )  THEN
1936                        ALLOCATE( pcbinsw_av(1:npcbl) )
1937                        pcbinsw_av = 0.0_wp
1938                    ENDIF
1939                                   
1940                CASE ( 'usm_rad_pc_inswdir' )
1941!--                 array of of direct sw radiation absorbed in plant canopy
1942                    IF ( .NOT.  ALLOCATED(pcbinswdir_av) )  THEN
1943                        ALLOCATE( pcbinswdir_av(1:npcbl) )
1944                        pcbinswdir_av = 0.0_wp
1945                    ENDIF
1946                                   
1947                CASE ( 'usm_rad_pc_inswdif' )
1948!--                 array of of diffuse sw radiation absorbed in plant canopy
1949                    IF ( .NOT.  ALLOCATED(pcbinswdif_av) )  THEN
1950                        ALLOCATE( pcbinswdif_av(1:npcbl) )
1951                        pcbinswdif_av = 0.0_wp
1952                    ENDIF
1953                                   
1954                CASE ( 'usm_rad_pc_inswref' )
1955!--                 array of of reflected sw radiation absorbed in plant canopy
1956                    IF ( .NOT.  ALLOCATED(pcbinswref_av) )  THEN
1957                        ALLOCATE( pcbinswref_av(1:npcbl) )
1958                        pcbinswref_av = 0.0_wp
1959                    ENDIF
1960                                   
1961                CASE ( 'usm_rad_hf' )
1962!--                 array of heat flux from radiation for surfaces after i-th reflection
1963                    IF ( l == -1 ) THEN
1964                        IF ( .NOT.  ALLOCATED(surf_usm_h%surfhf_av) )  THEN
1965                           ALLOCATE( surf_usm_h%surfhf_av(1:surf_usm_h%ns) )
1966                           surf_usm_h%surfhf_av = 0.0_wp
1967                        ENDIF
1968                    ELSE
1969                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%surfhf_av) )  THEN
1970                           ALLOCATE( surf_usm_v(l)%surfhf_av(1:surf_usm_v(l)%ns) )
1971                           surf_usm_v(l)%surfhf_av = 0.0_wp
1972                       ENDIF
1973                    ENDIF
1974
1975                CASE ( 'usm_wshf' )
1976!--                 array of sensible heat flux from surfaces
1977!--                 land surfaces
1978                    IF ( l == -1 ) THEN
1979                       IF ( .NOT.  ALLOCATED(surf_usm_h%wshf_eb_av) )  THEN
1980                          ALLOCATE( surf_usm_h%wshf_eb_av(1:surf_usm_h%ns) )
1981                          surf_usm_h%wshf_eb_av = 0.0_wp
1982                       ENDIF
1983                    ELSE
1984                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%wshf_eb_av) )  THEN
1985                           ALLOCATE( surf_usm_v(l)%wshf_eb_av(1:surf_usm_v(l)%ns) )
1986                           surf_usm_v(l)%wshf_eb_av = 0.0_wp
1987                       ENDIF
1988                    ENDIF
1989                   
1990                CASE ( 'usm_qsws' )
1991!--                 array of latent heat flux from surfaces
1992!--                 land surfaces
1993                    IF ( l == -1 .AND. .NOT.  ALLOCATED(surf_usm_h%qsws_eb_av) )  THEN
1994                        ALLOCATE( surf_usm_h%qsws_eb_av(1:surf_usm_h%ns) )
1995                        surf_usm_h%qsws_eb_av = 0.0_wp
1996                    ELSE
1997                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%qsws_eb_av) )  THEN
1998                           ALLOCATE( surf_usm_v(l)%qsws_eb_av(1:surf_usm_v(l)%ns) )
1999                           surf_usm_v(l)%qsws_eb_av = 0.0_wp
2000                       ENDIF
2001                    ENDIF
2002                   
2003                CASE ( 'usm_qsws_veg' )
2004!--                 array of latent heat flux from vegetation surfaces
2005!--                 land surfaces
2006                    IF ( l == -1 .AND. .NOT.  ALLOCATED(surf_usm_h%qsws_veg_av) )  THEN
2007                        ALLOCATE( surf_usm_h%qsws_veg_av(1:surf_usm_h%ns) )
2008                        surf_usm_h%qsws_veg_av = 0.0_wp
2009                    ELSE
2010                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%qsws_veg_av) )  THEN
2011                           ALLOCATE( surf_usm_v(l)%qsws_veg_av(1:surf_usm_v(l)%ns) )
2012                           surf_usm_v(l)%qsws_veg_av = 0.0_wp
2013                       ENDIF
2014                    ENDIF
2015                   
2016                CASE ( 'usm_qsws_liq' )
2017!--                 array of latent heat flux from surfaces with liquid
2018!--                 land surfaces
2019                    IF ( l == -1 .AND. .NOT.  ALLOCATED(surf_usm_h%qsws_liq_av) )  THEN
2020                        ALLOCATE( surf_usm_h%qsws_liq_av(1:surf_usm_h%ns) )
2021                        surf_usm_h%qsws_liq_av = 0.0_wp
2022                    ELSE
2023                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%qsws_liq_av) )  THEN
2024                           ALLOCATE( surf_usm_v(l)%qsws_liq_av(1:surf_usm_v(l)%ns) )
2025                           surf_usm_v(l)%qsws_liq_av = 0.0_wp
2026                       ENDIF
2027                    ENDIF
2028!
2029!--             Please note, the following output quantities belongs to the
2030!--             individual tile fractions - ground heat flux at wall-, window-,
2031!--             and green fraction. Aggregated ground-heat flux is treated
2032!--             accordingly in average_3d_data, sum_up_3d_data, etc..
2033                CASE ( 'usm_wghf' )
2034!--                 array of heat flux from ground (wall, roof, land)
2035                    IF ( l == -1 ) THEN
2036                       IF ( .NOT.  ALLOCATED(surf_usm_h%wghf_eb_av) )  THEN
2037                           ALLOCATE( surf_usm_h%wghf_eb_av(1:surf_usm_h%ns) )
2038                           surf_usm_h%wghf_eb_av = 0.0_wp
2039                       ENDIF
2040                    ELSE
2041                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%wghf_eb_av) )  THEN
2042                           ALLOCATE( surf_usm_v(l)%wghf_eb_av(1:surf_usm_v(l)%ns) )
2043                           surf_usm_v(l)%wghf_eb_av = 0.0_wp
2044                       ENDIF
2045                    ENDIF
2046
2047                CASE ( 'usm_wghf_window' )
2048!--                 array of heat flux from window ground (wall, roof, land)
2049                    IF ( l == -1 ) THEN
2050                       IF ( .NOT.  ALLOCATED(surf_usm_h%wghf_eb_window_av) )  THEN
2051                           ALLOCATE( surf_usm_h%wghf_eb_window_av(1:surf_usm_h%ns) )
2052                           surf_usm_h%wghf_eb_window_av = 0.0_wp
2053                       ENDIF
2054                    ELSE
2055                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%wghf_eb_window_av) )  THEN
2056                           ALLOCATE( surf_usm_v(l)%wghf_eb_window_av(1:surf_usm_v(l)%ns) )
2057                           surf_usm_v(l)%wghf_eb_window_av = 0.0_wp
2058                       ENDIF
2059                    ENDIF
2060
2061                CASE ( 'usm_wghf_green' )
2062!--                 array of heat flux from green ground (wall, roof, land)
2063                    IF ( l == -1 ) THEN
2064                       IF ( .NOT.  ALLOCATED(surf_usm_h%wghf_eb_green_av) )  THEN
2065                           ALLOCATE( surf_usm_h%wghf_eb_green_av(1:surf_usm_h%ns) )
2066                           surf_usm_h%wghf_eb_green_av = 0.0_wp
2067                       ENDIF
2068                    ELSE
2069                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%wghf_eb_green_av) )  THEN
2070                           ALLOCATE( surf_usm_v(l)%wghf_eb_green_av(1:surf_usm_v(l)%ns) )
2071                           surf_usm_v(l)%wghf_eb_green_av = 0.0_wp
2072                       ENDIF
2073                    ENDIF
2074
2075                CASE ( 'usm_iwghf' )
2076!--                 array of heat flux from indoor ground (wall, roof, land)
2077                    IF ( l == -1 ) THEN
2078                       IF ( .NOT.  ALLOCATED(surf_usm_h%iwghf_eb_av) )  THEN
2079                           ALLOCATE( surf_usm_h%iwghf_eb_av(1:surf_usm_h%ns) )
2080                           surf_usm_h%iwghf_eb_av = 0.0_wp
2081                       ENDIF
2082                    ELSE
2083                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%iwghf_eb_av) )  THEN
2084                           ALLOCATE( surf_usm_v(l)%iwghf_eb_av(1:surf_usm_v(l)%ns) )
2085                           surf_usm_v(l)%iwghf_eb_av = 0.0_wp
2086                       ENDIF
2087                    ENDIF
2088
2089                CASE ( 'usm_iwghf_window' )
2090!--                 array of heat flux from indoor window ground (wall, roof, land)
2091                    IF ( l == -1 ) THEN
2092                       IF ( .NOT.  ALLOCATED(surf_usm_h%iwghf_eb_window_av) )  THEN
2093                           ALLOCATE( surf_usm_h%iwghf_eb_window_av(1:surf_usm_h%ns) )
2094                           surf_usm_h%iwghf_eb_window_av = 0.0_wp
2095                       ENDIF
2096                    ELSE
2097                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%iwghf_eb_window_av) )  THEN
2098                           ALLOCATE( surf_usm_v(l)%iwghf_eb_window_av(1:surf_usm_v(l)%ns) )
2099                           surf_usm_v(l)%iwghf_eb_window_av = 0.0_wp
2100                       ENDIF
2101                    ENDIF
2102
2103                CASE ( 'usm_t_surf_wall' )
2104!--                 surface temperature for surfaces
2105                    IF ( l == -1 ) THEN
2106                       IF ( .NOT.  ALLOCATED(surf_usm_h%t_surf_wall_av) )  THEN
2107                           ALLOCATE( surf_usm_h%t_surf_wall_av(1:surf_usm_h%ns) )
2108                           surf_usm_h%t_surf_wall_av = 0.0_wp
2109                       ENDIF
2110                    ELSE
2111                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_surf_wall_av) )  THEN
2112                           ALLOCATE( surf_usm_v(l)%t_surf_wall_av(1:surf_usm_v(l)%ns) )
2113                           surf_usm_v(l)%t_surf_wall_av = 0.0_wp
2114                       ENDIF
2115                    ENDIF
2116
2117                CASE ( 'usm_t_surf_window' )
2118!--                 surface temperature for window surfaces
2119                    IF ( l == -1 ) THEN
2120                       IF ( .NOT.  ALLOCATED(surf_usm_h%t_surf_window_av) )  THEN
2121                           ALLOCATE( surf_usm_h%t_surf_window_av(1:surf_usm_h%ns) )
2122                           surf_usm_h%t_surf_window_av = 0.0_wp
2123                       ENDIF
2124                    ELSE
2125                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_surf_window_av) )  THEN
2126                           ALLOCATE( surf_usm_v(l)%t_surf_window_av(1:surf_usm_v(l)%ns) )
2127                           surf_usm_v(l)%t_surf_window_av = 0.0_wp
2128                       ENDIF
2129                    ENDIF
2130                   
2131                CASE ( 'usm_t_surf_green' )
2132!--                 surface temperature for green surfaces
2133                    IF ( l == -1 ) THEN
2134                       IF ( .NOT.  ALLOCATED(surf_usm_h%t_surf_green_av) )  THEN
2135                           ALLOCATE( surf_usm_h%t_surf_green_av(1:surf_usm_h%ns) )
2136                           surf_usm_h%t_surf_green_av = 0.0_wp
2137                       ENDIF
2138                    ELSE
2139                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_surf_green_av) )  THEN
2140                           ALLOCATE( surf_usm_v(l)%t_surf_green_av(1:surf_usm_v(l)%ns) )
2141                           surf_usm_v(l)%t_surf_green_av = 0.0_wp
2142                       ENDIF
2143                    ENDIF
2144               
2145                CASE ( 'usm_theta_10cm' )
2146!--                 near surface (10cm) temperature for whole surfaces
2147                    IF ( l == -1 ) THEN
2148                       IF ( .NOT.  ALLOCATED(surf_usm_h%pt_10cm_av) )  THEN
2149                           ALLOCATE( surf_usm_h%pt_10cm_av(1:surf_usm_h%ns) )
2150                           surf_usm_h%pt_10cm_av = 0.0_wp
2151                       ENDIF
2152                    ELSE
2153                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%pt_10cm_av) )  THEN
2154                           ALLOCATE( surf_usm_v(l)%pt_10cm_av(1:surf_usm_v(l)%ns) )
2155                           surf_usm_v(l)%pt_10cm_av = 0.0_wp
2156                       ENDIF
2157                    ENDIF
2158                 
2159                CASE ( 'usm_t_wall' )
2160!--                 wall temperature for iwl layer of walls and land
2161                    IF ( l == -1 ) THEN
2162                       IF ( .NOT.  ALLOCATED(surf_usm_h%t_wall_av) )  THEN
2163                           ALLOCATE( surf_usm_h%t_wall_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
2164                           surf_usm_h%t_wall_av = 0.0_wp
2165                       ENDIF
2166                    ELSE
2167                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_wall_av) )  THEN
2168                           ALLOCATE( surf_usm_v(l)%t_wall_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
2169                           surf_usm_v(l)%t_wall_av = 0.0_wp
2170                       ENDIF
2171                    ENDIF
2172
2173                CASE ( 'usm_t_window' )
2174!--                 window temperature for iwl layer of walls and land
2175                    IF ( l == -1 ) THEN
2176                       IF ( .NOT.  ALLOCATED(surf_usm_h%t_window_av) )  THEN
2177                           ALLOCATE( surf_usm_h%t_window_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
2178                           surf_usm_h%t_window_av = 0.0_wp
2179                       ENDIF
2180                    ELSE
2181                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_window_av) )  THEN
2182                           ALLOCATE( surf_usm_v(l)%t_window_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
2183                           surf_usm_v(l)%t_window_av = 0.0_wp
2184                       ENDIF
2185                    ENDIF
2186
2187                CASE ( 'usm_t_green' )
2188!--                 green temperature for iwl layer of walls and land
2189                    IF ( l == -1 ) THEN
2190                       IF ( .NOT.  ALLOCATED(surf_usm_h%t_green_av) )  THEN
2191                           ALLOCATE( surf_usm_h%t_green_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
2192                           surf_usm_h%t_green_av = 0.0_wp
2193                       ENDIF
2194                    ELSE
2195                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_green_av) )  THEN
2196                           ALLOCATE( surf_usm_v(l)%t_green_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
2197                           surf_usm_v(l)%t_green_av = 0.0_wp
2198                       ENDIF
2199                    ENDIF
2200                CASE ( 'usm_swc' )
2201!--                 soil water content for iwl layer of walls and land
2202                    IF ( l == -1 .AND. .NOT.  ALLOCATED(surf_usm_h%swc_av) )  THEN
2203                        ALLOCATE( surf_usm_h%swc_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
2204                        surf_usm_h%swc_av = 0.0_wp
2205                    ELSE
2206                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%swc_av) )  THEN
2207                           ALLOCATE( surf_usm_v(l)%swc_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
2208                           surf_usm_v(l)%swc_av = 0.0_wp
2209                       ENDIF
2210                    ENDIF
2211
2212               CASE DEFAULT
2213                   CONTINUE
2214
2215           END SELECT
2216
2217        ELSEIF ( mode == 'sum' )  THEN
2218           
2219           SELECT CASE ( TRIM( var ) )
2220               
2221                CASE ( 'usm_rad_net' )
2222!--                 array of complete radiation balance
2223                    IF ( l == -1 ) THEN
2224                       DO  m = 1, surf_usm_h%ns
2225                          surf_usm_h%rad_net_av(m) =                              &
2226                                             surf_usm_h%rad_net_av(m) +           &
2227                                             surf_usm_h%rad_net_l(m)
2228                       ENDDO
2229                    ELSE
2230                       DO  m = 1, surf_usm_v(l)%ns
2231                          surf_usm_v(l)%rad_net_av(m) =                        &
2232                                          surf_usm_v(l)%rad_net_av(m) +        &
2233                                          surf_usm_v(l)%rad_net_l(m)
2234                       ENDDO
2235                    ENDIF
2236
2237                CASE ( 'usm_rad_insw' )
2238!--                 array of sw radiation falling to surface after i-th reflection
2239                    DO l = 1, nsurfl
2240                        IF ( surfl(id,l) == idsint )  THEN
2241                            surfinsw_av(l) = surfinsw_av(l) + surfinsw(l)
2242                        ENDIF
2243                    ENDDO
2244                             
2245                CASE ( 'usm_rad_inlw' )
2246!--                 array of lw radiation falling to surface after i-th reflection
2247                    DO l = 1, nsurfl
2248                        IF ( surfl(id,l) == idsint )  THEN
2249                            surfinlw_av(l) = surfinlw_av(l) + surfinlw(l)
2250                        ENDIF
2251                    ENDDO
2252                   
2253                CASE ( 'usm_rad_inswdir' )
2254!--                 array of direct sw radiation falling to surface from sun
2255                    DO l = 1, nsurfl
2256                        IF ( surfl(id,l) == idsint )  THEN
2257                            surfinswdir_av(l) = surfinswdir_av(l) + surfinswdir(l)
2258                        ENDIF
2259                    ENDDO
2260                   
2261                CASE ( 'usm_rad_inswdif' )
2262!--                 array of difusion sw radiation falling to surface from sky and borders of the domain
2263                    DO l = 1, nsurfl
2264                        IF ( surfl(id,l) == idsint )  THEN
2265                            surfinswdif_av(l) = surfinswdif_av(l) + surfinswdif(l)
2266                        ENDIF
2267                    ENDDO
2268                   
2269                CASE ( 'usm_rad_inswref' )
2270!--                 array of sw radiation falling to surface from reflections
2271                    DO l = 1, nsurfl
2272                        IF ( surfl(id,l) == idsint )  THEN
2273                            surfinswref_av(l) = surfinswref_av(l) + surfinsw(l) - &
2274                                                surfinswdir(l) - surfinswdif(l)
2275                        ENDIF
2276                    ENDDO
2277
2278                   
2279                CASE ( 'usm_rad_inlwdif' )
2280!--                 array of sw radiation falling to surface after i-th reflection
2281                    DO l = 1, nsurfl
2282                        IF ( surfl(id,l) == idsint )  THEN
2283                            surfinlwdif_av(l) = surfinlwdif_av(l) + surfinlwdif(l)
2284                        ENDIF
2285                    ENDDO
2286!                     
2287                CASE ( 'usm_rad_inlwref' )
2288!--                 array of lw radiation falling to surface from reflections
2289                    DO l = 1, nsurfl
2290                        IF ( surfl(id,l) == idsint )  THEN
2291                            surfinlwref_av(l) = surfinlwref_av(l) + &
2292                                                surfinlw(l) - surfinlwdif(l)
2293                        ENDIF
2294                    ENDDO
2295                   
2296                CASE ( 'usm_rad_outsw' )
2297!--                 array of sw radiation emitted from surface after i-th reflection
2298                    DO l = 1, nsurfl
2299                        IF ( surfl(id,l) == idsint )  THEN
2300                            surfoutsw_av(l) = surfoutsw_av(l) + surfoutsw(l)
2301                        ENDIF
2302                    ENDDO
2303                   
2304                CASE ( 'usm_rad_outlw' )
2305!--                 array of lw radiation emitted from surface after i-th reflection
2306                    DO l = 1, nsurfl
2307                        IF ( surfl(id,l) == idsint )  THEN
2308                            surfoutlw_av(l) = surfoutlw_av(l) + surfoutlw(l)
2309                        ENDIF
2310                    ENDDO
2311                   
2312                CASE ( 'usm_rad_ressw' )
2313!--                 array of residua of sw radiation absorbed in surface after last reflection
2314                    DO l = 1, nsurfl
2315                        IF ( surfl(id,l) == idsint )  THEN
2316                            surfins_av(l) = surfins_av(l) + surfins(l)
2317                        ENDIF
2318                    ENDDO
2319                                   
2320                CASE ( 'usm_rad_reslw' )
2321!--                 array of residua of lw radiation absorbed in surface after last reflection
2322                    DO l = 1, nsurfl
2323                        IF ( surfl(id,l) == idsint )  THEN
2324                            surfinl_av(l) = surfinl_av(l) + surfinl(l)
2325                        ENDIF
2326                    ENDDO
2327                   
2328                CASE ( 'usm_rad_pc_inlw' )
2329                    pcbinlw_av(:) = pcbinlw_av(:) + pcbinlw(:)
2330                   
2331                CASE ( 'usm_rad_pc_insw' )
2332                    pcbinsw_av(:) = pcbinsw_av(:) + pcbinsw(:)
2333                   
2334                CASE ( 'usm_rad_pc_inswdir' )
2335                    pcbinswdir_av(:) = pcbinswdir_av(:) + pcbinswdir(:)
2336                   
2337                CASE ( 'usm_rad_pc_inswdif' )
2338                    pcbinswdif_av(:) = pcbinswdif_av(:) + pcbinswdif(:)
2339                   
2340                CASE ( 'usm_rad_pc_inswref' )
2341                    pcbinswref_av(:) = pcbinswref_av(:) + pcbinsw(:)     &
2342                                                        - pcbinswdir(:)  &
2343                                                        - pcbinswdif(:)
2344                   
2345                CASE ( 'usm_rad_hf' )
2346!--                 array of heat flux from radiation for surfaces after i-th reflection
2347                    IF ( l == -1 ) THEN
2348                       DO  m = 1, surf_usm_h%ns
2349                          surf_usm_h%surfhf_av(m) =                               &
2350                                             surf_usm_h%surfhf_av(m) +            &
2351                                             surf_usm_h%surfhf(m)
2352                       ENDDO
2353                    ELSE
2354                       DO  m = 1, surf_usm_v(l)%ns
2355                          surf_usm_v(l)%surfhf_av(m) =                         &
2356                                          surf_usm_v(l)%surfhf_av(m) +         &
2357                                          surf_usm_v(l)%surfhf(m)
2358                       ENDDO
2359                    ENDIF
2360                   
2361                CASE ( 'usm_wshf' )
2362!--                 array of sensible heat flux from surfaces (land, roof, wall)
2363                    IF ( l == -1 ) THEN
2364                       DO  m = 1, surf_usm_h%ns
2365                          surf_usm_h%wshf_eb_av(m) =                              &
2366                                             surf_usm_h%wshf_eb_av(m) +           &
2367                                             surf_usm_h%wshf_eb(m)
2368                       ENDDO
2369                    ELSE
2370                       DO  m = 1, surf_usm_v(l)%ns
2371                          surf_usm_v(l)%wshf_eb_av(m) =                        &
2372                                          surf_usm_v(l)%wshf_eb_av(m) +        &
2373                                          surf_usm_v(l)%wshf_eb(m)
2374                       ENDDO
2375                    ENDIF
2376                   
2377                CASE ( 'usm_qsws' )
2378!--                 array of latent heat flux from surfaces (land, roof, wall)
2379                    IF ( l == -1 ) THEN
2380                    DO  m = 1, surf_usm_h%ns
2381                       surf_usm_h%qsws_eb_av(m) =                              &
2382                                          surf_usm_h%qsws_eb_av(m) +           &
2383                                          surf_usm_h%qsws_eb(m)
2384                    ENDDO
2385                    ELSE
2386                       DO  m = 1, surf_usm_v(l)%ns
2387                          surf_usm_v(l)%qsws_eb_av(m) =                        &
2388                                          surf_usm_v(l)%qsws_eb_av(m) +        &
2389                                          surf_usm_v(l)%qsws_eb(m)
2390                       ENDDO
2391                    ENDIF
2392                   
2393                CASE ( 'usm_qsws_veg' )
2394!--                 array of latent heat flux from vegetation surfaces (land, roof, wall)
2395                    IF ( l == -1 ) THEN
2396                    DO  m = 1, surf_usm_h%ns
2397                       surf_usm_h%qsws_veg_av(m) =                              &
2398                                          surf_usm_h%qsws_veg_av(m) +           &
2399                                          surf_usm_h%qsws_veg(m)
2400                    ENDDO
2401                    ELSE
2402                       DO  m = 1, surf_usm_v(l)%ns
2403                          surf_usm_v(l)%qsws_veg_av(m) =                        &
2404                                          surf_usm_v(l)%qsws_veg_av(m) +        &
2405                                          surf_usm_v(l)%qsws_veg(m)
2406                       ENDDO
2407                    ENDIF
2408                   
2409                CASE ( 'usm_qsws_liq' )
2410!--                 array of latent heat flux from surfaces with liquid (land, roof, wall)
2411                    IF ( l == -1 ) THEN
2412                    DO  m = 1, surf_usm_h%ns
2413                       surf_usm_h%qsws_liq_av(m) =                              &
2414                                          surf_usm_h%qsws_liq_av(m) +           &
2415                                          surf_usm_h%qsws_liq(m)
2416                    ENDDO
2417                    ELSE
2418                       DO  m = 1, surf_usm_v(l)%ns
2419                          surf_usm_v(l)%qsws_liq_av(m) =                        &
2420                                          surf_usm_v(l)%qsws_liq_av(m) +        &
2421                                          surf_usm_v(l)%qsws_liq(m)
2422                       ENDDO
2423                    ENDIF
2424                   
2425                CASE ( 'usm_wghf' )
2426!--                 array of heat flux from ground (wall, roof, land)
2427                    IF ( l == -1 ) THEN
2428                       DO  m = 1, surf_usm_h%ns
2429                          surf_usm_h%wghf_eb_av(m) =                              &
2430                                             surf_usm_h%wghf_eb_av(m) +           &
2431                                             surf_usm_h%wghf_eb(m)
2432                       ENDDO
2433                    ELSE
2434                       DO  m = 1, surf_usm_v(l)%ns
2435                          surf_usm_v(l)%wghf_eb_av(m) =                        &
2436                                          surf_usm_v(l)%wghf_eb_av(m) +        &
2437                                          surf_usm_v(l)%wghf_eb(m)
2438                       ENDDO
2439                    ENDIF
2440                   
2441                CASE ( 'usm_wghf_window' )
2442!--                 array of heat flux from window ground (wall, roof, land)
2443                    IF ( l == -1 ) THEN
2444                       DO  m = 1, surf_usm_h%ns
2445                          surf_usm_h%wghf_eb_window_av(m) =                              &
2446                                             surf_usm_h%wghf_eb_window_av(m) +           &
2447                                             surf_usm_h%wghf_eb_window(m)
2448                       ENDDO
2449                    ELSE
2450                       DO  m = 1, surf_usm_v(l)%ns
2451                          surf_usm_v(l)%wghf_eb_window_av(m) =                        &
2452                                          surf_usm_v(l)%wghf_eb_window_av(m) +        &
2453                                          surf_usm_v(l)%wghf_eb_window(m)
2454                       ENDDO
2455                    ENDIF
2456
2457                CASE ( 'usm_wghf_green' )
2458!--                 array of heat flux from green ground (wall, roof, land)
2459                    IF ( l == -1 ) THEN
2460                       DO  m = 1, surf_usm_h%ns
2461                          surf_usm_h%wghf_eb_green_av(m) =                              &
2462                                             surf_usm_h%wghf_eb_green_av(m) +           &
2463                                             surf_usm_h%wghf_eb_green(m)
2464                       ENDDO
2465                    ELSE
2466                       DO  m = 1, surf_usm_v(l)%ns
2467                          surf_usm_v(l)%wghf_eb_green_av(m) =                        &
2468                                          surf_usm_v(l)%wghf_eb_green_av(m) +        &
2469                                          surf_usm_v(l)%wghf_eb_green(m)
2470                       ENDDO
2471                    ENDIF
2472                   
2473                CASE ( 'usm_iwghf' )
2474!--                 array of heat flux from indoor ground (wall, roof, land)
2475                    IF ( l == -1 ) THEN
2476                       DO  m = 1, surf_usm_h%ns
2477                          surf_usm_h%iwghf_eb_av(m) =                              &
2478                                             surf_usm_h%iwghf_eb_av(m) +           &
2479                                             surf_usm_h%iwghf_eb(m)
2480                       ENDDO
2481                    ELSE
2482                       DO  m = 1, surf_usm_v(l)%ns
2483                          surf_usm_v(l)%iwghf_eb_av(m) =                        &
2484                                          surf_usm_v(l)%iwghf_eb_av(m) +        &
2485                                          surf_usm_v(l)%iwghf_eb(m)
2486                       ENDDO
2487                    ENDIF
2488                   
2489                CASE ( 'usm_iwghf_window' )
2490!--                 array of heat flux from indoor window ground (wall, roof, land)
2491                    IF ( l == -1 ) THEN
2492                       DO  m = 1, surf_usm_h%ns
2493                          surf_usm_h%iwghf_eb_window_av(m) =                              &
2494                                             surf_usm_h%iwghf_eb_window_av(m) +           &
2495                                             surf_usm_h%iwghf_eb_window(m)
2496                       ENDDO
2497                    ELSE
2498                       DO  m = 1, surf_usm_v(l)%ns
2499                          surf_usm_v(l)%iwghf_eb_window_av(m) =                        &
2500                                          surf_usm_v(l)%iwghf_eb_window_av(m) +        &
2501                                          surf_usm_v(l)%iwghf_eb_window(m)
2502                       ENDDO
2503                    ENDIF
2504                   
2505                CASE ( 'usm_t_surf_wall' )
2506!--                 surface temperature for surfaces
2507                    IF ( l == -1 ) THEN
2508                       DO  m = 1, surf_usm_h%ns
2509                       surf_usm_h%t_surf_wall_av(m) =                               & 
2510                                          surf_usm_h%t_surf_wall_av(m) +            &
2511                                          t_surf_wall_h(m)
2512                       ENDDO
2513                    ELSE
2514                       DO  m = 1, surf_usm_v(l)%ns
2515                          surf_usm_v(l)%t_surf_wall_av(m) =                         &
2516                                          surf_usm_v(l)%t_surf_wall_av(m) +         &
2517                                          t_surf_wall_v(l)%t(m)
2518                       ENDDO
2519                    ENDIF
2520                   
2521                CASE ( 'usm_t_surf_window' )
2522!--                 surface temperature for window surfaces
2523                    IF ( l == -1 ) THEN
2524                       DO  m = 1, surf_usm_h%ns
2525                          surf_usm_h%t_surf_window_av(m) =                               &
2526                                             surf_usm_h%t_surf_window_av(m) +            &
2527                                             t_surf_window_h(m)
2528                       ENDDO
2529                    ELSE
2530                       DO  m = 1, surf_usm_v(l)%ns
2531                          surf_usm_v(l)%t_surf_window_av(m) =                         &
2532                                          surf_usm_v(l)%t_surf_window_av(m) +         &
2533                                          t_surf_window_v(l)%t(m)
2534                       ENDDO
2535                    ENDIF
2536                   
2537                CASE ( 'usm_t_surf_green' )
2538!--                 surface temperature for green surfaces
2539                    IF ( l == -1 ) THEN
2540                       DO  m = 1, surf_usm_h%ns
2541                          surf_usm_h%t_surf_green_av(m) =                               &
2542                                             surf_usm_h%t_surf_green_av(m) +            &
2543                                             t_surf_green_h(m)
2544                       ENDDO
2545                    ELSE
2546                       DO  m = 1, surf_usm_v(l)%ns
2547                          surf_usm_v(l)%t_surf_green_av(m) =                         &
2548                                          surf_usm_v(l)%t_surf_green_av(m) +         &
2549                                          t_surf_green_v(l)%t(m)
2550                       ENDDO
2551                    ENDIF
2552               
2553                CASE ( 'usm_theta_10cm' )
2554!--                 near surface temperature for whole surfaces
2555                    IF ( l == -1 ) THEN
2556                       DO  m = 1, surf_usm_h%ns
2557                          surf_usm_h%pt_10cm_av(m) =                               &
2558                                             surf_usm_h%pt_10cm_av(m) +            &
2559                                             surf_usm_h%pt_10cm(m)
2560                       ENDDO
2561                    ELSE
2562                       DO  m = 1, surf_usm_v(l)%ns
2563                          surf_usm_v(l)%pt_10cm_av(m) =                         &
2564                                          surf_usm_v(l)%pt_10cm_av(m) +         &
2565                                          surf_usm_v(l)%pt_10cm(m)
2566                       ENDDO
2567                    ENDIF
2568                   
2569                CASE ( 'usm_t_wall' )
2570!--                 wall temperature for  iwl layer of walls and land
2571                    IF ( l == -1 ) THEN
2572                       DO  m = 1, surf_usm_h%ns
2573                          surf_usm_h%t_wall_av(iwl,m) =                           &
2574                                             surf_usm_h%t_wall_av(iwl,m) +        &
2575                                             t_wall_h(iwl,m)
2576                       ENDDO
2577                    ELSE
2578                       DO  m = 1, surf_usm_v(l)%ns
2579                          surf_usm_v(l)%t_wall_av(iwl,m) =                     &
2580                                          surf_usm_v(l)%t_wall_av(iwl,m) +     &
2581                                          t_wall_v(l)%t(iwl,m)
2582                       ENDDO
2583                    ENDIF
2584                   
2585                CASE ( 'usm_t_window' )
2586!--                 window temperature for  iwl layer of walls and land
2587                    IF ( l == -1 ) THEN
2588                       DO  m = 1, surf_usm_h%ns
2589                          surf_usm_h%t_window_av(iwl,m) =                           &
2590                                             surf_usm_h%t_window_av(iwl,m) +        &
2591                                             t_window_h(iwl,m)
2592                       ENDDO
2593                    ELSE
2594                       DO  m = 1, surf_usm_v(l)%ns
2595                          surf_usm_v(l)%t_window_av(iwl,m) =                     &
2596                                          surf_usm_v(l)%t_window_av(iwl,m) +     &
2597                                          t_window_v(l)%t(iwl,m)
2598                       ENDDO
2599                    ENDIF
2600
2601                CASE ( 'usm_t_green' )
2602!--                 green temperature for  iwl layer of walls and land
2603                    IF ( l == -1 ) THEN
2604                       DO  m = 1, surf_usm_h%ns
2605                          surf_usm_h%t_green_av(iwl,m) =                           &
2606                                             surf_usm_h%t_green_av(iwl,m) +        &
2607                                             t_green_h(iwl,m)
2608                       ENDDO
2609                    ELSE
2610                       DO  m = 1, surf_usm_v(l)%ns
2611                          surf_usm_v(l)%t_green_av(iwl,m) =                     &
2612                                          surf_usm_v(l)%t_green_av(iwl,m) +     &
2613                                          t_green_v(l)%t(iwl,m)
2614                       ENDDO
2615                    ENDIF
2616
2617                CASE ( 'usm_swc' )
2618!--                 soil water content for  iwl layer of walls and land
2619                    IF ( l == -1 ) THEN
2620                    DO  m = 1, surf_usm_h%ns
2621                       surf_usm_h%swc_av(iwl,m) =                           &
2622                                          surf_usm_h%swc_av(iwl,m) +        &
2623                                          swc_h(iwl,m)
2624                    ENDDO
2625                    ELSE
2626                       DO  m = 1, surf_usm_v(l)%ns
2627                          surf_usm_v(l)%swc_av(iwl,m) =                     &
2628                                          surf_usm_v(l)%swc_av(iwl,m) +     &
2629                                          swc_v(l)%t(iwl,m)
2630                       ENDDO
2631                    ENDIF
2632
2633                CASE DEFAULT
2634                    CONTINUE
2635
2636           END SELECT
2637
2638        ELSEIF ( mode == 'average' )  THEN
2639           
2640           SELECT CASE ( TRIM( var ) )
2641               
2642                CASE ( 'usm_rad_net' )
2643!--                 array of complete radiation balance
2644                    IF ( l == -1 ) THEN
2645                       DO  m = 1, surf_usm_h%ns
2646                          surf_usm_h%rad_net_av(m) =                              &
2647                                             surf_usm_h%rad_net_av(m) /           &
2648                                             REAL( average_count_3d, kind=wp )
2649                       ENDDO
2650                    ELSE
2651                       DO  m = 1, surf_usm_v(l)%ns
2652                          surf_usm_v(l)%rad_net_av(m) =                        &
2653                                          surf_usm_v(l)%rad_net_av(m) /        &
2654                                          REAL( average_count_3d, kind=wp )
2655                       ENDDO
2656                    ENDIF
2657                   
2658                CASE ( 'usm_rad_insw' )
2659!--                 array of sw radiation falling to surface after i-th reflection
2660                    DO l = 1, nsurfl
2661                        IF ( surfl(id,l) == idsint )  THEN
2662                            surfinsw_av(l) = surfinsw_av(l) / REAL( average_count_3d, kind=wp )
2663                        ENDIF
2664                    ENDDO
2665                             
2666                CASE ( 'usm_rad_inlw' )
2667!--                 array of lw radiation falling to surface after i-th reflection
2668                    DO l = 1, nsurfl
2669                        IF ( surfl(id,l) == idsint )  THEN
2670                            surfinlw_av(l) = surfinlw_av(l) / REAL( average_count_3d, kind=wp )
2671                        ENDIF
2672                    ENDDO
2673                   
2674                CASE ( 'usm_rad_inswdir' )
2675!--                 array of direct sw radiation falling to surface from sun
2676                    DO l = 1, nsurfl
2677                        IF ( surfl(id,l) == idsint )  THEN
2678                            surfinswdir_av(l) = surfinswdir_av(l) / REAL( average_count_3d, kind=wp )
2679                        ENDIF
2680                    ENDDO
2681                   
2682                CASE ( 'usm_rad_inswdif' )
2683!--                 array of difusion sw radiation falling to surface from sky and borders of the domain
2684                    DO l = 1, nsurfl
2685                        IF ( surfl(id,l) == idsint )  THEN
2686                            surfinswdif_av(l) = surfinswdif_av(l) / REAL( average_count_3d, kind=wp )
2687                        ENDIF
2688                    ENDDO
2689                   
2690                CASE ( 'usm_rad_inswref' )
2691!--                 array of sw radiation falling to surface from reflections
2692                    DO l = 1, nsurfl
2693                        IF ( surfl(id,l) == idsint )  THEN
2694                            surfinswref_av(l) = surfinswref_av(l) / REAL( average_count_3d, kind=wp )
2695                        ENDIF
2696                    ENDDO
2697                   
2698                CASE ( 'usm_rad_inlwdif' )
2699!--                 array of sw radiation falling to surface after i-th reflection
2700                    DO l = 1, nsurfl
2701                        IF ( surfl(id,l) == idsint )  THEN
2702                            surfinlwdif_av(l) = surfinlwdif_av(l) / REAL( average_count_3d, kind=wp )
2703                        ENDIF
2704                    ENDDO
2705                   
2706                CASE ( 'usm_rad_inlwref' )
2707!--                 array of lw radiation falling to surface from reflections
2708                    DO l = 1, nsurfl
2709                        IF ( surfl(id,l) == idsint )  THEN
2710                            surfinlwref_av(l) = surfinlwref_av(l) / REAL( average_count_3d, kind=wp )
2711                        ENDIF
2712                    ENDDO
2713                   
2714                CASE ( 'usm_rad_outsw' )
2715!--                 array of sw radiation emitted from surface after i-th reflection
2716                    DO l = 1, nsurfl
2717                        IF ( surfl(id,l) == idsint )  THEN
2718                            surfoutsw_av(l) = surfoutsw_av(l) / REAL( average_count_3d, kind=wp )
2719                        ENDIF
2720                    ENDDO
2721                   
2722                CASE ( 'usm_rad_outlw' )
2723!--                 array of lw radiation emitted from surface after i-th reflection
2724                    DO l = 1, nsurfl
2725                        IF ( surfl(id,l) == idsint )  THEN
2726                            surfoutlw_av(l) = surfoutlw_av(l) / REAL( average_count_3d, kind=wp )
2727                        ENDIF
2728                    ENDDO
2729                   
2730                CASE ( 'usm_rad_ressw' )
2731!--                 array of residua of sw radiation absorbed in surface after last reflection
2732                    DO l = 1, nsurfl
2733                        IF ( surfl(id,l) == idsint )  THEN
2734                            surfins_av(l) = surfins_av(l) / REAL( average_count_3d, kind=wp )
2735                        ENDIF
2736                    ENDDO
2737                                   
2738                CASE ( 'usm_rad_reslw' )
2739!--                 array of residua of lw radiation absorbed in surface after last reflection
2740                    DO l = 1, nsurfl
2741                        IF ( surfl(id,l) == idsint )  THEN
2742                            surfinl_av(l) = surfinl_av(l) / REAL( average_count_3d, kind=wp )
2743                        ENDIF
2744                    ENDDO
2745                   
2746                CASE ( 'usm_rad_pc_inlw' )
2747                    pcbinlw_av(:) = pcbinlw_av(:) / REAL( average_count_3d, kind=wp )
2748                   
2749                CASE ( 'usm_rad_pc_insw' )
2750                    pcbinsw_av(:) = pcbinsw_av(:) / REAL( average_count_3d, kind=wp )
2751                   
2752                CASE ( 'usm_rad_pc_inswdir' )
2753                    pcbinswdir_av(:) = pcbinswdir_av(:) / REAL( average_count_3d, kind=wp )
2754                   
2755                CASE ( 'usm_rad_pc_inswdif' )
2756                    pcbinswdif_av(:) = pcbinswdif_av(:) / REAL( average_count_3d, kind=wp )
2757                   
2758                CASE ( 'usm_rad_pc_inswref' )
2759                    pcbinswref_av(:) = pcbinswref_av(:) / REAL( average_count_3d, kind=wp )
2760                   
2761                CASE ( 'usm_rad_hf' )
2762!--                 array of heat flux from radiation for surfaces after i-th reflection
2763                    IF ( l == -1 ) THEN
2764                       DO  m = 1, surf_usm_h%ns
2765                          surf_usm_h%surfhf_av(m) =                               &
2766                                             surf_usm_h%surfhf_av(m) /            &
2767                                             REAL( average_count_3d, kind=wp )
2768                       ENDDO
2769                    ELSE
2770                       DO  m = 1, surf_usm_v(l)%ns
2771                          surf_usm_v(l)%surfhf_av(m) =                         &
2772                                          surf_usm_v(l)%surfhf_av(m) /         &
2773                                          REAL( average_count_3d, kind=wp )
2774                       ENDDO
2775                    ENDIF
2776                   
2777                CASE ( 'usm_wshf' )
2778!--                 array of sensible heat flux from surfaces (land, roof, wall)
2779                    IF ( l == -1 ) THEN
2780                       DO  m = 1, surf_usm_h%ns
2781                          surf_usm_h%wshf_eb_av(m) =                              &
2782                                             surf_usm_h%wshf_eb_av(m) /           &
2783                                             REAL( average_count_3d, kind=wp )
2784                       ENDDO
2785                    ELSE
2786                       DO  m = 1, surf_usm_v(l)%ns
2787                          surf_usm_v(l)%wshf_eb_av(m) =                        &
2788                                          surf_usm_v(l)%wshf_eb_av(m) /        &
2789                                          REAL( average_count_3d, kind=wp )
2790                       ENDDO
2791                    ENDIF
2792                   
2793                CASE ( 'usm_qsws' )
2794!--                 array of latent heat flux from surfaces (land, roof, wall)
2795                    IF ( l == -1 ) THEN
2796                    DO  m = 1, surf_usm_h%ns
2797                       surf_usm_h%qsws_eb_av(m) =                              &
2798                                          surf_usm_h%qsws_eb_av(m) /           &
2799                                          REAL( average_count_3d, kind=wp )
2800                    ENDDO
2801                    ELSE
2802                       DO  m = 1, surf_usm_v(l)%ns
2803                          surf_usm_v(l)%qsws_eb_av(m) =                        &
2804                                          surf_usm_v(l)%qsws_eb_av(m) /        &
2805                                          REAL( average_count_3d, kind=wp )
2806                       ENDDO
2807                    ENDIF
2808
2809                CASE ( 'usm_qsws_veg' )
2810!--                 array of latent heat flux from vegetation surfaces (land, roof, wall)
2811                    IF ( l == -1 ) THEN
2812                    DO  m = 1, surf_usm_h%ns
2813                       surf_usm_h%qsws_veg_av(m) =                              &
2814                                          surf_usm_h%qsws_veg_av(m) /           &
2815                                          REAL( average_count_3d, kind=wp )
2816                    ENDDO
2817                    ELSE
2818                       DO  m = 1, surf_usm_v(l)%ns
2819                          surf_usm_v(l)%qsws_veg_av(m) =                        &
2820                                          surf_usm_v(l)%qsws_veg_av(m) /        &
2821                                          REAL( average_count_3d, kind=wp )
2822                       ENDDO
2823                    ENDIF
2824                   
2825                CASE ( 'usm_qsws_liq' )
2826!--                 array of latent heat flux from surfaces with liquid (land, roof, wall)
2827                    IF ( l == -1 ) THEN
2828                    DO  m = 1, surf_usm_h%ns
2829                       surf_usm_h%qsws_liq_av(m) =                              &
2830                                          surf_usm_h%qsws_liq_av(m) /           &
2831                                          REAL( average_count_3d, kind=wp )
2832                    ENDDO
2833                    ELSE
2834                       DO  m = 1, surf_usm_v(l)%ns
2835                          surf_usm_v(l)%qsws_liq_av(m) =                        &
2836                                          surf_usm_v(l)%qsws_liq_av(m) /        &
2837                                          REAL( average_count_3d, kind=wp )
2838                       ENDDO
2839                    ENDIF
2840                   
2841                CASE ( 'usm_wghf' )
2842!--                 array of heat flux from ground (wall, roof, land)
2843                    IF ( l == -1 ) THEN
2844                       DO  m = 1, surf_usm_h%ns
2845                          surf_usm_h%wghf_eb_av(m) =                              &
2846                                             surf_usm_h%wghf_eb_av(m) /           &
2847                                             REAL( average_count_3d, kind=wp )
2848                       ENDDO
2849                    ELSE
2850                       DO  m = 1, surf_usm_v(l)%ns
2851                          surf_usm_v(l)%wghf_eb_av(m) =                        &
2852                                          surf_usm_v(l)%wghf_eb_av(m) /        &
2853                                          REAL( average_count_3d, kind=wp )
2854                       ENDDO
2855                    ENDIF
2856                   
2857                CASE ( 'usm_wghf_window' )
2858!--                 array of heat flux from window ground (wall, roof, land)
2859                    IF ( l == -1 ) THEN
2860                       DO  m = 1, surf_usm_h%ns
2861                          surf_usm_h%wghf_eb_window_av(m) =                              &
2862                                             surf_usm_h%wghf_eb_window_av(m) /           &
2863                                             REAL( average_count_3d, kind=wp )
2864                       ENDDO
2865                    ELSE
2866                       DO  m = 1, surf_usm_v(l)%ns
2867                          surf_usm_v(l)%wghf_eb_window_av(m) =                        &
2868                                          surf_usm_v(l)%wghf_eb_window_av(m) /        &
2869                                          REAL( average_count_3d, kind=wp )
2870                       ENDDO
2871                    ENDIF
2872
2873                CASE ( 'usm_wghf_green' )
2874!--                 array of heat flux from green ground (wall, roof, land)
2875                    IF ( l == -1 ) THEN
2876                       DO  m = 1, surf_usm_h%ns
2877                          surf_usm_h%wghf_eb_green_av(m) =                              &
2878                                             surf_usm_h%wghf_eb_green_av(m) /           &
2879                                             REAL( average_count_3d, kind=wp )
2880                       ENDDO
2881                    ELSE
2882                       DO  m = 1, surf_usm_v(l)%ns
2883                          surf_usm_v(l)%wghf_eb_green_av(m) =                        &
2884                                          surf_usm_v(l)%wghf_eb_green_av(m) /        &
2885                                          REAL( average_count_3d, kind=wp )
2886                       ENDDO
2887                    ENDIF
2888
2889                CASE ( 'usm_iwghf' )
2890!--                 array of heat flux from indoor ground (wall, roof, land)
2891                    IF ( l == -1 ) THEN
2892                       DO  m = 1, surf_usm_h%ns
2893                          surf_usm_h%iwghf_eb_av(m) =                              &
2894                                             surf_usm_h%iwghf_eb_av(m) /           &
2895                                             REAL( average_count_3d, kind=wp )
2896                       ENDDO
2897                    ELSE
2898                       DO  m = 1, surf_usm_v(l)%ns
2899                          surf_usm_v(l)%iwghf_eb_av(m) =                        &
2900                                          surf_usm_v(l)%iwghf_eb_av(m) /        &
2901                                          REAL( average_count_3d, kind=wp )
2902                       ENDDO
2903                    ENDIF
2904                   
2905                CASE ( 'usm_iwghf_window' )
2906!--                 array of heat flux from indoor window ground (wall, roof, land)
2907                    IF ( l == -1 ) THEN
2908                       DO  m = 1, surf_usm_h%ns
2909                          surf_usm_h%iwghf_eb_window_av(m) =                              &
2910                                             surf_usm_h%iwghf_eb_window_av(m) /           &
2911                                             REAL( average_count_3d, kind=wp )
2912                       ENDDO
2913                    ELSE
2914                       DO  m = 1, surf_usm_v(l)%ns
2915                          surf_usm_v(l)%iwghf_eb_window_av(m) =                        &
2916                                          surf_usm_v(l)%iwghf_eb_window_av(m) /        &
2917                                          REAL( average_count_3d, kind=wp )
2918                       ENDDO
2919                    ENDIF
2920                   
2921                CASE ( 'usm_t_surf_wall' )
2922!--                 surface temperature for surfaces
2923                    IF ( l == -1 ) THEN
2924                       DO  m = 1, surf_usm_h%ns
2925                       surf_usm_h%t_surf_wall_av(m) =                               & 
2926                                          surf_usm_h%t_surf_wall_av(m) /            &
2927                                             REAL( average_count_3d, kind=wp )
2928                       ENDDO
2929                    ELSE
2930                       DO  m = 1, surf_usm_v(l)%ns
2931                          surf_usm_v(l)%t_surf_wall_av(m) =                         &
2932                                          surf_usm_v(l)%t_surf_wall_av(m) /         &
2933                                          REAL( average_count_3d, kind=wp )
2934                       ENDDO
2935                    ENDIF
2936                   
2937                CASE ( 'usm_t_surf_window' )
2938!--                 surface temperature for window surfaces
2939                    IF ( l == -1 ) THEN
2940                       DO  m = 1, surf_usm_h%ns
2941                          surf_usm_h%t_surf_window_av(m) =                               &
2942                                             surf_usm_h%t_surf_window_av(m) /            &
2943                                             REAL( average_count_3d, kind=wp )
2944                       ENDDO
2945                    ELSE
2946                       DO  m = 1, surf_usm_v(l)%ns
2947                          surf_usm_v(l)%t_surf_window_av(m) =                         &
2948                                          surf_usm_v(l)%t_surf_window_av(m) /         &
2949                                          REAL( average_count_3d, kind=wp )
2950                       ENDDO
2951                    ENDIF
2952                   
2953                CASE ( 'usm_t_surf_green' )
2954!--                 surface temperature for green surfaces
2955                    IF ( l == -1 ) THEN
2956                       DO  m = 1, surf_usm_h%ns
2957                          surf_usm_h%t_surf_green_av(m) =                               &
2958                                             surf_usm_h%t_surf_green_av(m) /            &
2959                                             REAL( average_count_3d, kind=wp )
2960                       ENDDO
2961                    ELSE
2962                       DO  m = 1, surf_usm_v(l)%ns
2963                          surf_usm_v(l)%t_surf_green_av(m) =                         &
2964                                          surf_usm_v(l)%t_surf_green_av(m) /         &
2965                                          REAL( average_count_3d, kind=wp )
2966                       ENDDO
2967                    ENDIF
2968                   
2969                CASE ( 'usm_theta_10cm' )
2970!--                 near surface temperature for whole surfaces
2971                    IF ( l == -1 ) THEN
2972                       DO  m = 1, surf_usm_h%ns
2973                          surf_usm_h%pt_10cm_av(m) =                               &
2974                                             surf_usm_h%pt_10cm_av(m) /            &
2975                                             REAL( average_count_3d, kind=wp )
2976                       ENDDO
2977                    ELSE
2978                       DO  m = 1, surf_usm_v(l)%ns
2979                          surf_usm_v(l)%pt_10cm_av(m) =                         &
2980                                          surf_usm_v(l)%pt_10cm_av(m) /         &
2981                                          REAL( average_count_3d, kind=wp )
2982                       ENDDO
2983                    ENDIF
2984
2985                   
2986                CASE ( 'usm_t_wall' )
2987!--                 wall temperature for  iwl layer of walls and land
2988                    IF ( l == -1 ) THEN
2989                       DO  m = 1, surf_usm_h%ns
2990                          surf_usm_h%t_wall_av(iwl,m) =                           &
2991                                             surf_usm_h%t_wall_av(iwl,m) /        &
2992                                             REAL( average_count_3d, kind=wp )
2993                       ENDDO
2994                    ELSE
2995                       DO  m = 1, surf_usm_v(l)%ns
2996                          surf_usm_v(l)%t_wall_av(iwl,m) =                     &
2997                                          surf_usm_v(l)%t_wall_av(iwl,m) /     &
2998                                          REAL( average_count_3d, kind=wp )
2999                       ENDDO
3000                    ENDIF
3001
3002                CASE ( 'usm_t_window' )
3003!--                 window temperature for  iwl layer of walls and land
3004                    IF ( l == -1 ) THEN
3005                       DO  m = 1, surf_usm_h%ns
3006                          surf_usm_h%t_window_av(iwl,m) =                           &
3007                                             surf_usm_h%t_window_av(iwl,m) /        &
3008                                             REAL( average_count_3d, kind=wp )
3009                       ENDDO
3010                    ELSE
3011                       DO  m = 1, surf_usm_v(l)%ns
3012                          surf_usm_v(l)%t_window_av(iwl,m) =                     &
3013                                          surf_usm_v(l)%t_window_av(iwl,m) /     &
3014                                          REAL( average_count_3d, kind=wp )
3015                       ENDDO
3016                    ENDIF
3017
3018                CASE ( 'usm_t_green' )
3019!--                 green temperature for  iwl layer of walls and land
3020                    IF ( l == -1 ) THEN
3021                       DO  m = 1, surf_usm_h%ns
3022                          surf_usm_h%t_green_av(iwl,m) =                           &
3023                                             surf_usm_h%t_green_av(iwl,m) /        &
3024                                             REAL( average_count_3d, kind=wp )
3025                       ENDDO
3026                    ELSE
3027                       DO  m = 1, surf_usm_v(l)%ns
3028                          surf_usm_v(l)%t_green_av(iwl,m) =                     &
3029                                          surf_usm_v(l)%t_green_av(iwl,m) /     &
3030                                          REAL( average_count_3d, kind=wp )
3031                       ENDDO
3032                    ENDIF
3033                   
3034                CASE ( 'usm_swc' )
3035!--                 soil water content for  iwl layer of walls and land
3036                    IF ( l == -1 ) THEN
3037                    DO  m = 1, surf_usm_h%ns
3038                       surf_usm_h%swc_av(iwl,m) =                           &
3039                                          surf_usm_h%swc_av(iwl,m) /        &
3040                                          REAL( average_count_3d, kind=wp )
3041                    ENDDO
3042                    ELSE
3043                       DO  m = 1, surf_usm_v(l)%ns
3044                          surf_usm_v(l)%swc_av(iwl,m) =                     &
3045                                          surf_usm_v(l)%swc_av(iwl,m) /     &
3046                                          REAL( average_count_3d, kind=wp )
3047                       ENDDO
3048                    ENDIF
3049
3050
3051           END SELECT
3052
3053        ENDIF
3054
3055    END SUBROUTINE usm_average_3d_data
3056
3057
3058
3059!------------------------------------------------------------------------------!
3060! Description:
3061! ------------
3062!> Set internal Neumann boundary condition at outer soil grid points
3063!> for temperature and humidity.
3064!------------------------------------------------------------------------------!
3065 SUBROUTINE usm_boundary_condition
3066 
3067    IMPLICIT NONE
3068
3069    INTEGER(iwp) :: i      !< grid index x-direction
3070    INTEGER(iwp) :: ioff   !< offset index x-direction indicating location of soil grid point
3071    INTEGER(iwp) :: j      !< grid index y-direction
3072    INTEGER(iwp) :: joff   !< offset index x-direction indicating location of soil grid point
3073    INTEGER(iwp) :: k      !< grid index z-direction
3074    INTEGER(iwp) :: koff   !< offset index x-direction indicating location of soil grid point
3075    INTEGER(iwp) :: l      !< running index surface-orientation
3076    INTEGER(iwp) :: m      !< running index surface elements
3077
3078    koff = surf_usm_h%koff
3079    DO  m = 1, surf_usm_h%ns
3080       i = surf_usm_h%i(m)
3081       j = surf_usm_h%j(m)
3082       k = surf_usm_h%k(m)
3083       pt(k+koff,j,i) = pt(k,j,i)
3084    ENDDO
3085
3086    DO  l = 0, 3
3087       ioff = surf_usm_v(l)%ioff
3088       joff = surf_usm_v(l)%joff
3089       DO  m = 1, surf_usm_v(l)%ns
3090          i = surf_usm_v(l)%i(m)
3091          j = surf_usm_v(l)%j(m)
3092          k = surf_usm_v(l)%k(m)
3093          pt(k,j+joff,i+ioff) = pt(k,j,i)
3094       ENDDO
3095    ENDDO
3096
3097 END SUBROUTINE usm_boundary_condition
3098
3099
3100!------------------------------------------------------------------------------!
3101!
3102! Description:
3103! ------------
3104!> Subroutine checks variables and assigns units.
3105!> It is called out from subroutine check_parameters.
3106!------------------------------------------------------------------------------!
3107    SUBROUTINE usm_check_data_output( variable, unit )
3108
3109        IMPLICIT NONE
3110
3111        CHARACTER(LEN=*),INTENT(IN)    ::  variable   !<
3112        CHARACTER(LEN=*),INTENT(OUT)   ::  unit       !<
3113
3114        INTEGER(iwp)                                  :: i,j,l        !< index
3115        CHARACTER(LEN=2)                              :: ls
3116        CHARACTER(LEN=varnamelength)                  :: var          !< TRIM(variable)
3117        INTEGER(iwp), PARAMETER                       :: nl1 = 31     !< number of directional usm variables
3118        CHARACTER(LEN=varnamelength), DIMENSION(nl1)  :: varlist1 = & !< list of directional usm variables
3119                  (/'usm_rad_net                   ', &
3120                    'usm_rad_insw                  ', &
3121                    'usm_rad_inlw                  ', &
3122                    'usm_rad_inswdir               ', &
3123                    'usm_rad_inswdif               ', &
3124                    'usm_rad_inswref               ', &
3125                    'usm_rad_inlwdif               ', &
3126                    'usm_wshf                      ', &
3127                    'usm_rad_inlwref               ', &
3128                    'usm_rad_outsw                 ', &
3129                    'usm_rad_outlw                 ', &
3130                    'usm_rad_hf                    ', &
3131                    'usm_rad_ressw                 ', &
3132                    'usm_rad_reslw                 ', &
3133                    'usm_wghf                      ', &
3134                    'usm_wghf_window               ', &
3135                    'usm_wghf_green                ', &
3136                    'usm_iwghf                     ', &
3137                    'usm_iwghf_window              ', &
3138                    'usm_surfz                     ', &
3139                    'usm_surfwintrans              ', &
3140                    'usm_surfcat                   ', &
3141                    'usm_surfalb                   ', &
3142                    'usm_surfemis                  ', &
3143                    'usm_t_surf_wall               ', &
3144                    'usm_t_surf_window             ', &
3145                    'usm_t_surf_green              ', &
3146                    'usm_t_green                   ', &
3147                    'usm_theta_10cm                ', &
3148                    'usm_skyvf                     ', &
3149                    'usm_skyvft                    '/)
3150
3151        INTEGER(iwp), PARAMETER                       :: nl2 = 7      !< number of other variables
3152        CHARACTER(LEN=varnamelength), DIMENSION(nl2)  :: varlist2 = & !< list of other usm variables
3153                  (/'usm_svf                       ', &
3154                    'usm_dif                       ', &
3155                    'usm_rad_pc_inlw               ', &
3156                    'usm_rad_pc_insw               ', &
3157                    'usm_rad_pc_inswdir            ', &
3158                    'usm_rad_pc_inswdif            ', &
3159                    'usm_rad_pc_inswref            '/)
3160
3161        INTEGER(iwp), PARAMETER                       :: nl3 = 3      !< number of directional layer usm variables
3162        CHARACTER(LEN=varnamelength), DIMENSION(nl3)  :: varlist3 = & !< list of directional layer usm variables
3163                  (/'usm_t_wall                    ', &
3164                    'usm_t_window                  ', &
3165                    'usm_t_green                   '/)
3166
3167        INTEGER(iwp), PARAMETER                       :: nd = 5     !< number of directions
3168        CHARACTER(LEN=6), DIMENSION(nd), PARAMETER  :: dirname = &  !< direction names
3169                  (/'_roof ','_south','_north','_west ','_east '/)
3170        LOGICAL                                       :: lfound     !< flag if the variable is found
3171
3172
3173        lfound = .FALSE.
3174
3175        var = TRIM(variable)
3176
3177!--     check if variable exists
3178!       directional variables
3179        DO i = 1, nl1
3180           DO j = 1, nd
3181              IF ( TRIM(var) == TRIM(varlist1(i))//TRIM(dirname(j)) ) THEN
3182                 lfound = .TRUE.
3183                 EXIT
3184              ENDIF
3185              IF ( lfound ) EXIT
3186           ENDDO
3187        ENDDO
3188        IF ( lfound ) GOTO 10
3189!       directional layer variables
3190        DO i = 1, nl3
3191           DO j = 1, nd
3192              DO l = nzb_wall, nzt_wall
3193                 WRITE(ls,'(A1,I1)') '_',l
3194                 IF ( TRIM(var) == TRIM(varlist3(i))//TRIM(ls)//TRIM(dirname(j)) ) THEN
3195                    lfound = .TRUE.
3196                    EXIT
3197                 ENDIF
3198              ENDDO
3199              IF ( lfound ) EXIT
3200           ENDDO
3201        ENDDO
3202        IF ( lfound ) GOTO 10
3203!       other variables
3204        DO i = 1, nl2
3205           IF ( TRIM(var) == TRIM(varlist2(i)) ) THEN
3206              lfound = .TRUE.
3207              EXIT
3208           ENDIF
3209        ENDDO
3210        IF ( .NOT.  lfound ) THEN
3211           unit = 'illegal'
3212           RETURN
3213        ENDIF
321410      CONTINUE
3215
3216        IF ( var(1:12) == 'usm_rad_net_'  .OR.  var(1:13) == 'usm_rad_insw_'  .OR.        &
3217             var(1:13) == 'usm_rad_inlw_'  .OR.  var(1:16) == 'usm_rad_inswdir_'  .OR.    &
3218             var(1:16) == 'usm_rad_inswdif_'  .OR.  var(1:16) == 'usm_rad_inswref_'  .OR. &
3219             var(1:16) == 'usm_rad_inlwdif_'  .OR.  var(1:16) == 'usm_rad_inlwref_'  .OR. &
3220             var(1:14) == 'usm_rad_outsw_'  .OR.  var(1:14) == 'usm_rad_outlw_'  .OR.     &
3221             var(1:14) == 'usm_rad_ressw_'  .OR.  var(1:14) == 'usm_rad_reslw_'  .OR.     &
3222             var(1:11) == 'usm_rad_hf_'  .OR.                                             &
3223             var(1:9)  == 'usm_wshf_'  .OR.  var(1:9) == 'usm_wghf_' .OR.                 &
3224             var(1:16) == 'usm_wghf_window_' .OR. var(1:15) == 'usm_wghf_green_' .OR.     &
3225             var(1:10) == 'usm_iwghf_' .OR. var(1:17) == 'usm_iwghf_window_'    .OR.      &
3226             var(1:17) == 'usm_surfwintrans_' .OR.                                        &
3227             var(1:9)  == 'usm_qsws_'  .OR.  var(1:13)  == 'usm_qsws_veg_'  .OR.          &
3228             var(1:13) == 'usm_qsws_liq_' ) THEN
3229            unit = 'W/m2'
3230        ELSE IF ( var(1:15) == 'usm_t_surf_wall'   .OR.  var(1:10) == 'usm_t_wall' .OR.   &
3231                  var(1:12) == 'usm_t_window' .OR. var(1:17) == 'usm_t_surf_window' .OR.  &
3232                  var(1:16) == 'usm_t_surf_green'  .OR.                                   &
3233                  var(1:11) == 'usm_t_green' .OR.  var(1:7) == 'usm_swc' .OR.             &
3234                  var(1:14) == 'usm_theta_10cm' )  THEN
3235            unit = 'K'
3236        ELSE IF ( var == 'usm_rad_pc_inlw'  .OR.  var == 'usm_rad_pc_insw'  .OR.          &
3237                  var == 'usm_rad_pc_inswdir'  .OR.  var == 'usm_rad_pc_inswdif'  .OR.    &
3238                  var == 'usm_rad_pc_inswref' )  THEN
3239            unit = 'W'
3240        ELSE IF ( var(1:9) == 'usm_surfz'  .OR.  var(1:7) == 'usm_svf'  .OR.              & 
3241                  var(1:7) == 'usm_dif'  .OR.  var(1:11) == 'usm_surfcat'  .OR.           &
3242                  var(1:11) == 'usm_surfalb'  .OR.  var(1:12) == 'usm_surfemis'  .OR.     &
3243                  var(1:9) == 'usm_skyvf' .OR. var(1:9) == 'usm_skyvft' )  THEN
3244            unit = '1'
3245        ELSE
3246            unit = 'illegal'
3247        ENDIF
3248
3249    END SUBROUTINE usm_check_data_output
3250
3251
3252!------------------------------------------------------------------------------!
3253! Description:
3254! ------------
3255!> Check parameters routine for urban surface model
3256!------------------------------------------------------------------------------!
3257    SUBROUTINE usm_check_parameters
3258   
3259       USE control_parameters,                                                 &
3260           ONLY:  bc_pt_b, bc_q_b, constant_flux_layer, large_scale_forcing,   &
3261                  lsf_surf, topography
3262
3263!
3264!--    Dirichlet boundary conditions are required as the surface fluxes are
3265!--    calculated from the temperature/humidity gradients in the urban surface
3266!--    model
3267       IF ( bc_pt_b == 'neumann'   .OR.   bc_q_b == 'neumann' )  THEN
3268          message_string = 'urban surface model requires setting of '//        &
3269                           'bc_pt_b = "dirichlet" and '//                      &
3270                           'bc_q_b  = "dirichlet"'
3271          CALL message( 'usm_check_parameters', 'PA0590', 1, 2, 0, 6, 0 )
3272       ENDIF
3273
3274       IF ( .NOT.  constant_flux_layer )  THEN
3275          message_string = 'urban surface model requires '//                   &
3276                           'constant_flux_layer = .T.'
3277          CALL message( 'usm_check_parameters', 'PA0084', 1, 2, 0, 6, 0 )
3278       ENDIF
3279
3280       IF (  .NOT.  radiation )  THEN
3281          message_string = 'urban surface model requires '//                   &
3282                           'the radiation model to be switched on'
3283          CALL message( 'usm_check_parameters', 'PA0084', 1, 2, 0, 6, 0 )
3284       ENDIF
3285!       
3286!--    Surface forcing has to be disabled for LSF in case of enabled
3287!--    urban surface module
3288       IF ( large_scale_forcing )  THEN
3289          lsf_surf = .FALSE.
3290       ENDIF
3291!
3292!--    Topography
3293       IF ( topography == 'flat' )  THEN
3294          message_string = 'topography /= "flat" is required '//               &
3295                           'when using the urban surface model'
3296          CALL message( 'check_parameters', 'PA0592', 1, 2, 0, 6, 0 )
3297       ENDIF
3298!
3299!--    naheatlayers
3300       IF ( naheatlayers > nzt )  THEN
3301          message_string = 'number of anthropogenic heat layers '//            &
3302                           '"naheatlayers" can not be larger than'//           &
3303                           ' number of domain layers "nzt"'
3304          CALL message( 'check_parameters', 'PA0593', 1, 2, 0, 6, 0 )
3305       ENDIF
3306
3307    END SUBROUTINE usm_check_parameters
3308
3309
3310!------------------------------------------------------------------------------!
3311!
3312! Description:
3313! ------------
3314!> Output of the 3D-arrays in netCDF and/or AVS format
3315!> for variables of urban_surface model.
3316!> It resorts the urban surface module output quantities from surf style
3317!> indexing into temporary 3D array with indices (i,j,k).
3318!> It is called from subroutine data_output_3d.
3319!------------------------------------------------------------------------------!
3320    SUBROUTINE usm_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
3321       
3322        IMPLICIT NONE
3323
3324        INTEGER(iwp), INTENT(IN)       ::  av        !<
3325        CHARACTER (len=*), INTENT(IN)  ::  variable  !<
3326        INTEGER(iwp), INTENT(IN)       ::  nzb_do    !< lower limit of the data output (usually 0)
3327        INTEGER(iwp), INTENT(IN)       ::  nzt_do    !< vertical upper limit of the data output (usually nz_do3d)
3328        LOGICAL, INTENT(OUT)           ::  found     !<
3329        REAL(sp), DIMENSION(nxl:nxr,nys:nyn,nzb_do:nzt_do) ::  local_pf   !< sp - it has to correspond to module data_output_3d
3330        REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr)     ::  temp_pf    !< temp array for urban surface output procedure
3331       
3332        CHARACTER (len=varnamelength)                          :: var, surfid
3333        INTEGER(iwp), PARAMETER                                :: nd = 5
3334        CHARACTER(len=6), DIMENSION(0:nd-1), PARAMETER         :: dirname = (/ '_roof ', '_south', '_north', '_west ', '_east ' /)
3335        INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER             :: dirint =  (/    iup_u, isouth_u, inorth_u,  iwest_u,  ieast_u /)
3336        INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER             :: diridx =  (/       -1,        1,        0,        3,        2 /)
3337                                                                     !< index for surf_*_v: 0:3 = (North, South, East, West)
3338        INTEGER(iwp), DIMENSION(0:nd-1)                        :: dirstart
3339        INTEGER(iwp), DIMENSION(0:nd-1)                        :: dirend
3340        INTEGER(iwp)                                           :: ids,idsint,idsidx,isurf,isvf,isurfs,isurflt,ipcgb
3341        INTEGER(iwp)                                           :: is,js,ks,i,j,k,iwl,istat, l, m
3342
3343        dirstart = (/ startland, startwall, startwall, startwall, startwall /)
3344        dirend = (/ endland, endwall, endwall, endwall, endwall /)
3345
3346        found = .TRUE.
3347        temp_pf = -1._wp
3348       
3349        ids = -1
3350        var = TRIM(variable)
3351        DO i = 0, nd-1
3352            k = len(TRIM(var))
3353            j = len(TRIM(dirname(i)))
3354            IF ( TRIM(var(k-j+1:k)) == TRIM(dirname(i)) )  THEN
3355                ids = i
3356                idsint = dirint(ids)
3357                idsidx = diridx(ids)
3358                var = var(:k-j)
3359                EXIT
3360            ENDIF
3361        ENDDO
3362        IF ( ids == -1 )  THEN
3363            var = TRIM(variable)
3364        ENDIF
3365        IF ( var(1:11) == 'usm_t_wall_'  .AND.  len(TRIM(var)) >= 12 )  THEN
3366!--         wall layers
3367            READ(var(12:12), '(I1)', iostat=istat ) iwl
3368            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
3369                var = var(1:10)
3370            ENDIF
3371        ENDIF
3372        IF ( var(1:13) == 'usm_t_window_'  .AND.  len(TRIM(var)) >= 14 )  THEN
3373!--         window layers
3374            READ(var(14:14), '(I1)', iostat=istat ) iwl
3375            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
3376                var = var(1:12)
3377            ENDIF
3378        ENDIF
3379        IF ( var(1:12) == 'usm_t_green_'  .AND.  len(TRIM(var)) >= 13 )  THEN
3380!--         green layers
3381            READ(var(13:13), '(I1)', iostat=istat ) iwl
3382            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
3383                var = var(1:11)
3384            ENDIF
3385        ENDIF
3386        IF ( var(1:8) == 'usm_swc_'  .AND.  len(TRIM(var)) >= 9 )  THEN
3387!--         green layers soil water content
3388            READ(var(9:9), '(I1)', iostat=istat ) iwl
3389            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
3390                var = var(1:7)
3391            ENDIF
3392        ENDIF
3393        IF ( (var(1:8) == 'usm_svf_'  .OR.  var(1:8) == 'usm_dif_')  .AND.  len(TRIM(var)) >= 13 )  THEN
3394!--         svf values to particular surface
3395            surfid = var(9:)
3396            i = index(surfid,'_')
3397            j = index(surfid(i+1:),'_')
3398            READ(surfid(1:i-1),*, iostat=istat ) is
3399            IF ( istat == 0 )  THEN
3400                READ(surfid(i+1:i+j-1),*, iostat=istat ) js
3401            ENDIF
3402            IF ( istat == 0 )  THEN
3403                READ(surfid(i+j+1:),*, iostat=istat ) ks
3404            ENDIF
3405            IF ( istat == 0 )  THEN
3406                var = var(1:7)
3407            ENDIF
3408        ENDIF
3409       
3410        SELECT CASE ( TRIM(var) )
3411
3412          CASE ( 'usm_surfz' )
3413!--           array of surface height (z)
3414              IF ( idsint == iup_u )  THEN
3415                 DO  m = 1, surf_usm_h%ns
3416                    i = surf_usm_h%i(m)
3417                    j = surf_usm_h%j(m)
3418                    k = surf_usm_h%k(m)
3419                    temp_pf(0,j,i) = MAX( temp_pf(0,j,i), REAL( k, kind=wp) )
3420                 ENDDO
3421              ELSE
3422                 l = idsidx
3423                 DO  m = 1, surf_usm_v(l)%ns
3424                    i = surf_usm_v(l)%i(m)
3425                    j = surf_usm_v(l)%j(m)
3426                    k = surf_usm_v(l)%k(m)
3427                    temp_pf(0,j,i) = MAX( temp_pf(0,j,i), REAL( k, kind=wp) + 1.0_wp )
3428                 ENDDO
3429              ENDIF
3430
3431          CASE ( 'usm_surfcat' )
3432!--           surface category
3433              IF ( idsint == iup_u )  THEN
3434                 DO  m = 1, surf_usm_h%ns
3435                    i =