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

Last change on this file since 3196 was 3196, checked in by maronga, 7 years ago

set maximum value for aerodynamic resistance over horiztonal surfaces

  • Property svn:keywords set to Id
File size: 432.5 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 3196 2018-08-13 12:26:14Z maronga $
30! Added maximum aerodynamic resistance of 300 for horiztonal surfaces.
31!
32! 3176 2018-07-26 17:12:48Z suehring
33! Bugfix, update virtual potential surface temparture, else heat fluxes on
34! roofs might become unphysical
35!
36! 3152 2018-07-19 13:26:52Z suehring
37! Initialize q_surface, which might be used in surface_layer_fluxes
38!
39! 3151 2018-07-19 08:45:38Z raasch
40! remaining preprocessor define strings __check removed
41!
42! 3136 2018-07-16 14:48:21Z suehring
43! Limit also roughness length for heat and moisture where necessary
44!
45! 3123 2018-07-12 16:21:53Z suehring
46! Correct working precision for INTEGER number
47!
48! 3115 2018-07-10 12:49:26Z suehring
49! Additional building type to represent bridges
50!
51! 3091 2018-06-28 16:20:35Z suehring
52! - Limit aerodynamic resistance at vertical walls.
53! - Add check for local roughness length not exceeding surface-layer height and
54!   limit roughness length where necessary.
55!
56! 3065 2018-06-12 07:03:02Z Giersch
57! Unused array dxdir was removed, dz was replaced by dzu to consider vertical
58! grid stretching
59!
60! 3049 2018-05-29 13:52:36Z Giersch
61! Error messages revised
62!
63! 3045 2018-05-28 07:55:41Z Giersch
64! Error message added
65!
66! 3029 2018-05-23 12:19:17Z raasch
67! bugfix: close unit 151 instead of 90
68!
69! 3014 2018-05-09 08:42:38Z maronga
70! Added pc_transpiration_rate
71!
72! 2977 2018-04-17 10:27:57Z kanani
73! Implement changes from branch radiation (r2948-2971) with minor modifications.
74! (moh.hefny):
75! Extended exn for all model domain height to avoid the need to get nzut.
76!
77! 2963 2018-04-12 14:47:44Z suehring
78! Introduce index for vegetation/wall, pavement/green-wall and water/window
79! surfaces, for clearer access of surface fraction, albedo, emissivity, etc. .
80!
81! 2943 2018-04-03 16:17:10Z suehring
82! Calculate exner function at all height levels and remove some un-used
83! variables.
84!
85! 2932 2018-03-26 09:39:22Z maronga
86! renamed urban_surface_par to urban_surface_parameters
87!
88! 2921 2018-03-22 15:05:23Z Giersch
89! The activation of spinup has been moved to parin
90!
91! 2920 2018-03-22 11:22:01Z kanani
92! Remove unused pcbl, npcbl from ONLY list
93! moh.hefny:
94! Fixed bugs introduced by new structures and by moving radiation interaction
95! into radiation_model_mod.f90.
96! Bugfix: usm data output 3D didn't respect directions
97!
98! 2906 2018-03-19 08:56:40Z Giersch
99! Local variable ids has to be initialized with a value of -1 in
100! usm_average_3d_data
101!
102! 2894 2018-03-15 09:17:58Z Giersch
103! Calculations of the index range of the subdomain on file which overlaps with
104! the current subdomain are already done in read_restart_data_mod,
105! usm_read/write_restart_data have been renamed to usm_r/wrd_local, variable
106! named found has been introduced for checking if restart data was found,
107! reading of restart strings has been moved completely to
108! read_restart_data_mod, usm_rrd_local is already inside the overlap loop
109! programmed in read_restart_data_mod, SAVE attribute added where necessary,
110! deallocation and allocation of some arrays have been changed to take care of
111! different restart files that can be opened (index i), the marker *** end usm
112! *** is not necessary anymore, strings and their respective lengths are
113! written out and read now in case of restart runs to get rid of prescribed
114! character lengths
115!
116! 2805 2018-02-14 17:00:09Z suehring
117! Initialization of resistances.
118!
119! 2797 2018-02-08 13:24:35Z suehring
120! Comment concerning output of ground-heat flux added.
121!
122! 2766 2018-01-22 17:17:47Z kanani
123! Removed redundant commas, added some blanks
124!
125! 2765 2018-01-22 11:34:58Z maronga
126! Major bugfix in calculation of f_shf. Adjustment of roughness lengths in
127! building_pars
128!
129! 2750 2018-01-15 16:26:51Z knoop
130! Move flag plant canopy to modules
131!
132! 2737 2018-01-11 14:58:11Z kanani
133! Removed unused variables t_surf_whole...
134!
135! 2735 2018-01-11 12:01:27Z suehring
136! resistances are saved in surface attributes
137!
138! 2723 2018-01-05 09:27:03Z maronga
139! Bugfix for spinups (end_time was increased twice in case of LSM + USM runs)
140!
141! 2720 2018-01-02 16:27:15Z kanani
142! Correction of comment
143!
144! 2718 2018-01-02 08:49:38Z maronga
145! Corrected "Former revisions" section
146!
147! 2705 2017-12-18 11:26:23Z maronga
148! Changes from last commit documented
149!
150! 2703 2017-12-15 20:12:38Z maronga
151! Workaround for calculation of r_a
152!
153! 2696 2017-12-14 17:12:51Z kanani
154! - Change in file header (GPL part)
155! - Bugfix in calculation of pt_surface and related fluxes. (BM)
156! - Do not write surface temperatures onto pt array as this might cause
157!   problems with nesting. (MS)
158! - Revised calculation of pt1 (now done in surface_layer_fluxes).
159!   Bugfix, f_shf_window and f_shf_green were not set at vertical surface
160!   elements. (MS)
161! - merged with branch ebsolver
162!   green building surfaces do not evaporate yet
163!   properties of green wall layers and window layers are taken from wall layers
164!   this input data is missing. (RvT)
165! - Merged with branch radiation (developed by Mohamed Salim)
166! - Revised initialization. (MS)
167! - Rename emiss_surf into emissivity, roughness_wall into z0, albedo_surf into
168!   albedo. (MS)
169! - Move first call of usm_radiatin from usm_init to init_3d_model
170! - fixed problem with near surface temperature
171! - added near surface temperature t_surf_10cm_h(m), t_surf_10cm_v(l)%t(m)
172! - does not work with temp profile including stability, ol
173!   t_surf_10cm = pt1 now
174! - merged with 2357 bugfix, error message for nopointer version
175! - added indoor model coupling with wall heat flux
176! - added green substrate/ dry vegetation layer for buildings
177! - merged with 2232 new surface-type structure
178! - added transmissivity of window tiles
179! - added MOSAIK tile approach for 3 different surfaces (RvT)
180!
181! 2583 2017-10-26 13:58:38Z knoop
182! Bugfix: reverted MPI_Win_allocate_cptr introduction in last commit
183!
184! 2582 2017-10-26 13:19:46Z hellstea
185! Workaround for gnufortran compiler added in usm_calc_svf. CALL MPI_Win_allocate is
186! replaced by CALL MPI_Win_allocate_cptr if defined ( __gnufortran ).
187!
188! 2544 2017-10-13 18:09:32Z maronga
189! Date and time quantities are now read from date_and_time_mod. Solar constant is
190! read from radiation_model_mod
191!
192! 2516 2017-10-04 11:03:04Z suehring
193! Remove tabs
194!
195! 2514 2017-10-04 09:52:37Z suehring
196! upper bounds of 3d output changed from nx+1,ny+1 to nx,ny
197! no output of ghost layer data
198!
199! 2350 2017-08-15 11:48:26Z kanani
200! Bugfix and error message for nopointer version.
201! Additional "! defined(__nopointer)" as workaround to enable compilation of
202! nopointer version.
203!
204! 2318 2017-07-20 17:27:44Z suehring
205! Get topography top index via Function call
206!
207! 2317 2017-07-20 17:27:19Z suehring
208! Bugfix: adjust output of shf. Added support for spinups
209!
210! 2287 2017-06-15 16:46:30Z suehring
211! Bugfix in determination topography-top index
212!
213! 2269 2017-06-09 11:57:32Z suehring
214! Enable restart runs with different number of PEs
215! Bugfixes nopointer branch
216!
217! 2258 2017-06-08 07:55:13Z suehring
218! Bugfix, add pre-preprocessor directives to enable non-parrallel mode
219!
220! 2233 2017-05-30 18:08:54Z suehring
221!
222! 2232 2017-05-30 17:47:52Z suehring
223! Adjustments according to new surface-type structure. Remove usm_wall_heat_flux;
224! insteat, heat fluxes are directly applied in diffusion_s.
225!
226! 2213 2017-04-24 15:10:35Z kanani
227! Removal of output quantities usm_lad and usm_canopy_hr
228!
229! 2209 2017-04-19 09:34:46Z kanani
230! cpp switch __mpi3 removed,
231! minor formatting,
232! small bugfix for division by zero (Krc)
233!
234! 2113 2017-01-12 13:40:46Z kanani
235! cpp switch __mpi3 added for MPI-3 standard code (Ketelsen)
236!
237! 2071 2016-11-17 11:22:14Z maronga
238! Small bugfix (Resler)
239!
240! 2031 2016-10-21 15:11:58Z knoop
241! renamed variable rho to rho_ocean
242!
243! 2024 2016-10-12 16:42:37Z kanani
244! Bugfixes in deallocation of array plantt and reading of csf/csfsurf,
245! optimization of MPI-RMA operations,
246! declaration of pcbl as integer,
247! renamed usm_radnet -> usm_rad_net, usm_canopy_khf -> usm_canopy_hr,
248! splitted arrays svf -> svf & csf, svfsurf -> svfsurf & csfsurf,
249! use of new control parameter varnamelength,
250! added output variables usm_rad_ressw, usm_rad_reslw,
251! minor formatting changes,
252! minor optimizations.
253!
254! 2011 2016-09-19 17:29:57Z kanani
255! Major reformatting according to PALM coding standard (comments, blanks,
256! alphabetical ordering, etc.),
257! removed debug_prints,
258! removed auxiliary SUBROUTINE get_usm_info, instead, USM flag urban_surface is
259! defined in MODULE control_parameters (modules.f90) to avoid circular
260! dependencies,
261! renamed canopy_heat_flux to pc_heating_rate, as meaning of quantity changed.
262!
263! 2007 2016-08-24 15:47:17Z kanani
264! Initial revision
265!
266!
267! Description:
268! ------------
269! 2016/6/9 - Initial version of the USM (Urban Surface Model)
270!            authors: Jaroslav Resler, Pavel Krc
271!                     (Czech Technical University in Prague and Institute of
272!                      Computer Science of the Czech Academy of Sciences, Prague)
273!            with contributions: Michal Belda, Nina Benesova, Ondrej Vlcek
274!            partly inspired by PALM LSM (B. Maronga)
275!            parameterizations of Ra checked with TUF3D (E. S. Krayenhoff)
276!> Module for Urban Surface Model (USM)
277!> The module includes:
278!>    1. radiation model with direct/diffuse radiation, shading, reflections
279!>       and integration with plant canopy
280!>    2. wall and wall surface model
281!>    3. surface layer energy balance
282!>    4. anthropogenic heat (only from transportation so far)
283!>    5. necessary auxiliary subroutines (reading inputs, writing outputs,
284!>       restart simulations, ...)
285!> It also make use of standard radiation and integrates it into
286!> urban surface model.
287!>
288!> Further work:
289!> -------------
290!> 1. Remove global arrays surfouts, surfoutl and only keep track of radiosity
291!>    from surfaces that are visible from local surfaces (i.e. there is a SVF
292!>    where target is local). To do that, radiosity will be exchanged after each
293!>    reflection step using MPI_Alltoall instead of current MPI_Allgather.
294!>
295!> 2. Temporarily large values of surface heat flux can be observed, up to
296!>    1.2 Km/s, which seem to be not realistic.
297!>
298!> @todo Output of _av variables in case of restarts
299!> @todo Revise flux conversion in energy-balance solver
300!> @todo Bugfixing in nopointer branch
301!> @todo Check optimizations for RMA operations
302!> @todo Alternatives for MPI_WIN_ALLOCATE? (causes problems with openmpi)
303!> @todo Check for load imbalances in CPU measures, e.g. for exchange_horiz_prog
304!>       factor 3 between min and max time
305!> @todo Move setting of flag indoor_model to indoor_model_mod once available
306!> @todo Check divisions in wtend (etc.) calculations for possible division
307!>       by zero, e.g. in case fraq(0,m) + fraq(1,m) = 0?!
308!> @todo Use unit 90 for OPEN/CLOSE of input files (FK)
309!> @todo Move plant canopy stuff into plant canopy code
310!------------------------------------------------------------------------------!
311 MODULE urban_surface_mod
312
313#if ! defined( __nopointer )
314    USE arrays_3d,                                                             &
315        ONLY:  dzu, hyp, zu, pt, pt_1, pt_2, p, u, v, w, hyp, tend
316#endif
317
318    USE cloud_parameters,                                                      &
319        ONLY:  cp, r_d
320
321    USE constants,                                                             &
322        ONLY:  pi
323   
324    USE control_parameters,                                                    &
325        ONLY:  coupling_start_time, topography, dt_3d, humidity,               &
326               intermediate_timestep_count, initializing_actions,              &
327               intermediate_timestep_count_max, simulated_time, end_time,      &
328               timestep_scheme, tsc, coupling_char, io_blocks, io_group,       &
329               message_string, time_since_reference_point, surface_pressure,   &
330               g, pt_surface, large_scale_forcing, lsf_surf, spinup,           &
331               spinup_pt_mean, spinup_time, time_do3d, dt_do3d,                &
332               average_count_3d, varnamelength, urban_surface, kappa,          &
333               plant_canopy
334
335    USE cpulog,                                                                &
336        ONLY:  cpu_log, log_point, log_point_s
337
338    USE date_and_time_mod,                                                     &
339        ONLY:  time_utc_init
340
341    USE grid_variables,                                                        &
342        ONLY:  dx, dy, ddx, ddy, ddx2, ddy2
343
344    USE indices,                                                               &
345        ONLY:  nx, ny, nnx, nny, nnz, nxl, nxlg, nxr, nxrg, nyn, nyng, nys,    &
346               nysg, nzb, nzt, nbgp, wall_flags_0
347
348    USE, INTRINSIC :: iso_c_binding 
349
350    USE kinds
351             
352    USE pegrid
353   
354    USE plant_canopy_model_mod,                                                &
355        ONLY:  pc_heating_rate, pc_transpiration_rate
356   
357    USE radiation_model_mod,                                                   &
358        ONLY:  albedo_type, radiation_interaction, calc_zenith, zenith,        &
359               radiation, rad_sw_in, rad_lw_in, rad_sw_out, rad_lw_out,        &
360               sigma_sb, solar_constant, sun_direction, sun_dir_lat,           &
361               sun_dir_lon,                                                    &
362               force_radiation_call, surfinsw, surfinlw, surfinswdir,          &
363               surfinswdif, surfoutsw, surfoutlw, surfins,nsvfl, svf, svfsurf, &
364               surfinl, surfinlwdif, rad_sw_in_dir, rad_sw_in_diff,            &
365               rad_lw_in_diff, surfouts, surfoutl, surfoutsl, surfoutll, surf, &
366               surfl, nsurfl, nsurfs, surfstart, pcbinsw, pcbinlw,             &
367               iup_u, inorth_u, isouth_u, ieast_u, iwest_u, iup_l,             &
368               inorth_l, isouth_l, ieast_l, iwest_l, id,                       &
369               iz, iy, ix, idir, jdir, kdir,  nsurf_type, nsurf, idsvf, ndsvf, &
370               iup_a, idown_a, inorth_a, isouth_a, ieast_a, iwest_a,           &
371               idcsf, ndcsf, kdcsf, pct,                                       &
372               startland, endland, startwall, endwall, skyvf, skyvft
373
374    USE statistics,                                                            &
375        ONLY:  hom, statistic_regions
376
377    USE surface_mod,                                                           &
378        ONLY:  get_topography_top_index_ji, get_topography_top_index,          &
379               ind_pav_green, ind_veg_wall, ind_wat_win, surf_usm_h,           &
380               surf_usm_v, surface_restore_elements
381
382
383    IMPLICIT NONE
384
385
386!-- configuration parameters (they can be setup in PALM config)
387    LOGICAL ::  usm_material_model = .TRUE.        !< flag parameter indicating wheather the  model of heat in materials is used
388    LOGICAL ::  usm_anthropogenic_heat = .FALSE.   !< flag parameter indicating wheather the anthropogenic heat sources (e.g.transportation) are used
389    LOGICAL ::  force_radiation_call_l = .FALSE.   !< flag parameter for unscheduled radiation model calls
390    LOGICAL ::  indoor_model = .FALSE.             !< whether to use the indoor model
391    LOGICAL ::  read_wall_temp_3d = .FALSE.
392
393
394    INTEGER(iwp) ::  building_type = 1               !< default building type (preleminary setting)
395    INTEGER(iwp) ::  land_category = 2               !< default category for land surface
396    INTEGER(iwp) ::  wall_category = 2               !< default category for wall surface over pedestrian zone
397    INTEGER(iwp) ::  pedestrian_category = 2         !< default category for wall surface in pedestrian zone
398    INTEGER(iwp) ::  roof_category = 2               !< default category for root surface
399    REAL(wp)     ::  roughness_concrete = 0.001_wp   !< roughness length of average concrete surface
400!
401!-- Indices of input attributes for (above) ground floor level
402    INTEGER(iwp) ::  ind_alb_wall          = 38 !< index in input list for albedo_type of wall fraction
403    INTEGER(iwp) ::  ind_alb_green         = 39 !< index in input list for albedo_type of green fraction
404    INTEGER(iwp) ::  ind_alb_win           = 40 !< index in input list for albedo_type of window fraction
405    INTEGER(iwp) ::  ind_emis_wall_agfl    = 14 !< index in input list for wall emissivity, above ground floor level
406    INTEGER(iwp) ::  ind_emis_wall_gfl     = 32 !< index in input list for wall emissivity, ground floor level
407    INTEGER(iwp) ::  ind_emis_green_agfl   = 15 !< index in input list for green emissivity, above ground floor level
408    INTEGER(iwp) ::  ind_emis_green_gfl    = 33 !< index in input list for green emissivity, ground floor level
409    INTEGER(iwp) ::  ind_emis_win_agfl     = 16 !< index in input list for window emissivity, above ground floor level
410    INTEGER(iwp) ::  ind_emis_win_gfl      = 34 !< index in input list for window emissivity, ground floor level
411    INTEGER(iwp) ::  ind_green_frac_w_agfl = 2  !< index in input list for green fraction on wall, above ground floor level
412    INTEGER(iwp) ::  ind_green_frac_w_gfl  = 23 !< index in input list for green fraction on wall, ground floor level
413    INTEGER(iwp) ::  ind_green_frac_r_agfl = 3  !< index in input list for green fraction on roof, above ground floor level
414    INTEGER(iwp) ::  ind_green_frac_r_gfl  = 24 !< index in input list for green fraction on roof, ground floor level
415    INTEGER(iwp) ::  ind_hc1_agfl          =  6 !< index in input list for heat capacity at first wall layer, above ground floor level
416    INTEGER(iwp) ::  ind_hc1_gfl           = 26 !< index in input list for heat capacity at first wall layer, ground floor level
417    INTEGER(iwp) ::  ind_hc2_agfl          = 7  !< index in input list for heat capacity at second wall layer, above ground floor level
418    INTEGER(iwp) ::  ind_hc2_gfl           = 27 !< index in input list for heat capacity at second wall layer, ground floor level
419    INTEGER(iwp) ::  ind_hc3_agfl          = 8  !< index in input list for heat capacity at third wall layer, above ground floor level
420    INTEGER(iwp) ::  ind_hc3_gfl           = 28 !< index in input list for heat capacity at third wall layer, ground floor level
421    INTEGER(iwp) ::  ind_gflh              = 20 !< index in input list for ground floor level height
422    INTEGER(iwp) ::  ind_lai_r_agfl        = 4  !< index in input list for LAI on roof, above ground floor level
423    INTEGER(iwp) ::  ind_lai_r_gfl         = 4  !< index in input list for LAI on roof, ground floor level
424    INTEGER(iwp) ::  ind_lai_w_agfl        = 5  !< index in input list for LAI on wall, above ground floor level
425    INTEGER(iwp) ::  ind_lai_w_gfl         = 25 !< index in input list for LAI on wall, ground floor level
426    INTEGER(iwp) ::  ind_tc1_agfl          = 9  !< index in input list for thermal conductivity at first wall layer, above ground floor level
427    INTEGER(iwp) ::  ind_tc1_gfl           = 29 !< index in input list for thermal conductivity at first wall layer, ground floor level
428    INTEGER(iwp) ::  ind_tc2_agfl          = 10 !< index in input list for thermal conductivity at second wall layer, above ground floor level
429    INTEGER(iwp) ::  ind_tc2_gfl           = 30 !< index in input list for thermal conductivity at second wall layer, ground floor level
430    INTEGER(iwp) ::  ind_tc3_agfl          = 11 !< index in input list for thermal conductivity at third wall layer, above ground floor level
431    INTEGER(iwp) ::  ind_tc3_gfl           = 31 !< index in input list for thermal conductivity at third wall layer, ground floor level
432    INTEGER(iwp) ::  ind_thick_1           = 41 !< index for wall layer thickness - 1st layer
433    INTEGER(iwp) ::  ind_thick_2           = 42 !< index for wall layer thickness - 2nd layer
434    INTEGER(iwp) ::  ind_thick_3           = 43 !< index for wall layer thickness - 3rd layer
435    INTEGER(iwp) ::  ind_thick_4           = 44 !< index for wall layer thickness - 4th layer
436    INTEGER(iwp) ::  ind_trans_agfl        = 17 !< index in input list for window transmissivity, above ground floor level
437    INTEGER(iwp) ::  ind_trans_gfl         = 35 !< index in input list for window transmissivity, ground floor level
438    INTEGER(iwp) ::  ind_wall_frac_agfl    = 0  !< index in input list for wall fraction, above ground floor level
439    INTEGER(iwp) ::  ind_wall_frac_gfl     = 21 !< index in input list for wall fraction, ground floor level
440    INTEGER(iwp) ::  ind_win_frac_agfl     = 1  !< index in input list for window fraction, above ground floor level
441    INTEGER(iwp) ::  ind_win_frac_gfl      = 22 !< index in input list for window fraction, ground floor level
442    INTEGER(iwp) ::  ind_z0_agfl           = 18 !< index in input list for z0, above ground floor level
443    INTEGER(iwp) ::  ind_z0_gfl            = 36 !< index in input list for z0, ground floor level
444    INTEGER(iwp) ::  ind_z0qh_agfl         = 19 !< index in input list for z0h / z0q, above ground floor level
445    INTEGER(iwp) ::  ind_z0qh_gfl          = 37 !< index in input list for z0h / z0q, ground floor level
446
447
448    REAL(wp)  ::  roof_height_limit = 4._wp          !< height for distinguish between land surfaces and roofs
449    REAL(wp)  ::  ground_floor_level = 4.0_wp        !< default ground floor level
450
451
452    CHARACTER(37), DIMENSION(0:7), PARAMETER :: building_type_name = (/     &
453                                   'user-defined                         ', & !  0
454                                   'residential - 1950                   ', & !  1
455                                   'residential 1951 - 2000              ', & !  2
456                                   'residential 2001 -                   ', & !  3
457                                   'office - 1950                        ', & !  4
458                                   'office 1951 - 2000                   ', & !  5
459                                   'office 2001 -                        ', & !  6
460                                   'bridges                              '  & !  7
461                                                                     /)
462!
463!-- building parameters, 4 different types
464!-- 0 - wall fraction, 1- window fraction, 2 - green fraction on wall, 3- green fraction
465!-- at roof, 4 - lai of green fraction at roof,  5 - lai of green fraction at wall,
466!-- 6 - heat capacity of wall layer 1, 7 - heat capacity of wall layer 2,
467!-- 8 - heat capacity of wall layer 3, 9 - thermal conductivity of wall layer 1,
468!-- 10 - thermal conductivity of wall layer 2, 11 - thermal conductivity of wall layer 3, 
469!-- 12 - indoor target summer temperature ( K ), 13 - indoor target winter temperature (K),
470!-- 14 - emissivity of wall fraction, 15 - emissivity of green fraction, 16 - emissivity of window fraction,
471!-- 17 - transmissivity of window fraction, 18 - z0, 19 - z0h/z0q, 20 - ground floor height,
472!-- 21 - ground floor wall fraction, 22 - ground floor window fraction, 23 ground floor green fraction,
473!-- 24 - ground floor green fraction on roof, 25 - ground floor lai of green fraction,
474!-- 26 - ground floor heat capacity of wall layer 1, 27 - ground floor heat capacity of wall layer 1,
475!-- 28 - ground floor heat capacity of wall layer 3, 29 - ground floor thermal conductivity of wall layer 1,
476!-- 30 - ground floor thermal conductivity of wall layer 2, 31 - ground floor thermal conductivity of wall layer 3,
477!-- 32 - ground floor emissivity of wall fraction, 33 - ground floor emissivity of green fraction,
478!-- 34 - ground floor emissivity of window fraction, 35 - ground floor transmissivity of window fraction,
479!-- 36 - ground floor z0, 37 - ground floor z0h/z0q, 38 - albedo type wall fraction
480!-- 39 - albedo type green fraction, 40 - albedo type window fraction
481!-- 41 - wall layer thickness - 1st layer, 42 - wall layer thickness - 2nd layer,
482!-- 43 - wall layer thickness - 3rd layer, 44 - wall layer thickness - 4th layer,
483!-- 45 - heat capacity of the wall surface, 46 - heat conductivity
484!-- Please note, only preleminary dummy values so far!
485    REAL(wp), DIMENSION(0:46,1:7), PARAMETER :: building_pars = RESHAPE( (/    &
486        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, 1.0_wp,                        & !parameter 0-5
487        1000000.0_wp, 1000000.0_wp, 1000000.0_wp, 0.3_wp, 0.3_wp, 0.3_wp,      & !parameter 6-11
488        296.15_wp, 293.15_wp, 0.9_wp, 0.9_wp, 0.01_wp, 0.99_wp,                & !parameter 12-17
489        0.001_wp, 0.0001_wp, 4.0_wp,                                           & !parameter 18-20
490        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 3.0_wp,                                & !parameter 21-25
491        1000000.0_wp, 1000000.0_wp, 1000000.0_wp,                              & !parameter 26-28                     
492        0.3_wp, 0.3_wp, 0.3_wp,                                                & !parameter 29-31       
493        0.4_wp, 0.4_wp, 0.4_wp, 0.4_wp, 0.01_wp, 0.001_wp,                     & !parameter 32-37
494        24.0_wp, 24.0_wp, 24.0_wp,                                             & !parameter 38-40
495        0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp,                                & !parameter 41-44
496        20000.0_wp, 10.0_wp,                                                   & !parameter 45-46 - end of type 1
497        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, 1.0_wp,                        & !parameter 0-5
498        1000000.0_wp, 1000000.0_wp, 1000000.0_wp, 0.3_wp, 0.3_wp, 0.3_wp,      & !parameter 6-11
499        296.15_wp, 293.15_wp, 0.9_wp, 0.9_wp, 0.01_wp, 0.99_wp,                & !parameter 12-17
500        0.001_wp, 0.0001_wp, 4.0_wp,                                           & !parameter 18-20
501        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 3.0_wp,                                & !parameter 21-25
502        1000000.0_wp, 1000000.0_wp, 1000000.0_wp,                              & !parameter 26-28                     
503        0.3_wp, 0.3_wp, 0.3_wp,                                                & !parameter 29-31       
504        0.4_wp, 0.4_wp, 0.4_wp, 0.4_wp, 0.01_wp, 0.001_wp,                     & !parameter 32-37
505        24.0_wp, 24.0_wp, 24.0_wp,                                             & !parameter 38-40
506        0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp,                                & !parameter 41-44
507        20000.0_wp, 10.0_wp,                                                   & !parameter 45-46 - end of type 2
508        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, 1.0_wp,                        & !parameter 0-5
509        1000000.0_wp, 1000000.0_wp, 1000000.0_wp, 0.3_wp, 0.3_wp, 0.3_wp,      & !parameter 6-11
510        296.15_wp, 293.15_wp, 0.9_wp, 0.9_wp, 0.01_wp, 0.99_wp,                & !parameter 12-17
511        0.001_wp, 0.0001_wp, 4.0_wp,                                           & !parameter 18-20
512        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 3.0_wp,                                & !parameter 21-25
513        1000000.0_wp, 1000000.0_wp, 1000000.0_wp,                              & !parameter 26-28                     
514        0.3_wp, 0.3_wp, 0.3_wp,                                                & !parameter 29-31       
515        0.4_wp, 0.4_wp, 0.4_wp, 0.4_wp, 0.01_wp, 0.001_wp,                     & !parameter 32-37
516        24.0_wp, 24.0_wp, 24.0_wp,                                             & !parameter 38-40
517        0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp,                                & !parameter 41-44
518        20000.0_wp, 10.0_wp,                                                   & !parameter 45-46 - end of type 3
519        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, 1.0_wp,                        & !parameter 0-5
520        1000000.0_wp, 1000000.0_wp, 1000000.0_wp, 0.3_wp, 0.3_wp, 0.3_wp,      & !parameter 6-11
521        296.15_wp, 293.15_wp, 0.9_wp, 0.9_wp, 0.01_wp, 0.99_wp,                & !parameter 12-17
522        0.01_wp, 0.001_wp, 4.0_wp,                                             & !parameter 18-20
523        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 3.0_wp,                                & !parameter 21-25
524        1000000.0_wp, 1000000.0_wp, 1000000.0_wp,                              & !parameter 26-28                     
525        0.3_wp, 0.3_wp, 0.3_wp,                                                & !parameter 29-31       
526        0.4_wp, 0.4_wp, 0.4_wp, 0.4_wp, 0.01_wp, 0.001_wp,                     & !parameter 32-37
527        24.0_wp, 24.0_wp, 24.0_wp,                                             & !parameter 38-40
528        0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp,                                & !parameter 41-44
529        20000.0_wp, 10.0_wp,                                                   & !parameter 45-46 - end of type 4
530        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, 1.0_wp,                        & !parameter 0-5
531        1000000.0_wp, 1000000.0_wp, 1000000.0_wp, 0.3_wp, 0.3_wp, 0.3_wp,      & !parameter 6-11
532        296.15_wp, 293.15_wp, 0.9_wp, 0.9_wp, 0.01_wp, 0.99_wp,                & !parameter 12-17
533        0.001_wp, 0.0001_wp, 4.0_wp,                                           & !parameter 18-20
534        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 3.0_wp,                                & !parameter 21-25
535        1000000.0_wp, 1000000.0_wp, 1000000.0_wp,                              & !parameter 26-28                     
536        0.3_wp, 0.3_wp, 0.3_wp,                                                & !parameter 29-31       
537        0.4_wp, 0.4_wp, 0.4_wp, 0.4_wp, 0.01_wp, 0.001_wp,                     & !parameter 32-37
538        24.0_wp, 24.0_wp, 24.0_wp,                                             & !parameter 38-40
539        0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp,                                & !parameter 41-44
540        20000.0_wp, 10.0_wp,                                                   & !parameter 45-46 - end of type 5
541        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, 1.0_wp,                        & !parameter 0-5
542        1000000.0_wp, 1000000.0_wp, 1000000.0_wp, 0.3_wp, 0.3_wp, 0.3_wp,      & !parameter 6-11
543        296.15_wp, 293.15_wp, 0.9_wp, 0.9_wp, 0.01_wp, 0.99_wp,                & !parameter 12-17
544        0.001_wp, 0.0001_wp, 4.0_wp,                                           & !parameter 18-20
545        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 3.0_wp,                                & !parameter 21-25
546        1000000.0_wp, 1000000.0_wp, 1000000.0_wp,                              & !parameter 26-28                     
547        0.3_wp, 0.3_wp, 0.3_wp,                                                & !parameter 29-31       
548        0.4_wp, 0.4_wp, 0.4_wp, 0.4_wp, 0.01_wp, 0.001_wp,                     & !parameter 32-37
549        24.0_wp, 24.0_wp, 24.0_wp,                                             & !parameter 38-40
550        0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp,                                & !parameter 41-44
551        20000.0_wp, 10.0_wp,                                                   & !parameter 45-46 - end of type 6
552        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, 1.0_wp,                        & !parameter 0-5
553        1000000.0_wp, 1000000.0_wp, 1000000.0_wp, 0.3_wp, 0.3_wp, 0.3_wp,      & !parameter 6-11
554        296.15_wp, 293.15_wp, 0.9_wp, 0.9_wp, 0.01_wp, 0.99_wp,                & !parameter 12-17
555        0.001_wp, 0.0001_wp, 0.0_wp,                                           & !parameter 18-20
556        1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 3.0_wp,                                & !parameter 21-25
557        1000000.0_wp, 1000000.0_wp, 1000000.0_wp,                              & !parameter 26-28                     
558        0.3_wp, 0.3_wp, 0.3_wp,                                                & !parameter 29-31       
559        0.4_wp, 0.4_wp, 0.4_wp, 0.4_wp, 0.01_wp, 0.001_wp,                     & !parameter 32-37
560        24.0_wp, 24.0_wp, 24.0_wp,                                             & !parameter 38-40
561        0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp,                                & !parameter 41-44
562        20000.0_wp, 10.0_wp                                                    & !parameter 45-46 - end of type 7 (bridges)
563                                                                          /),  &
564                                                               (/47, 7/) )
565
566!
567!-- Type for surface temperatures at vertical walls. Is not necessary for horizontal walls.
568    TYPE t_surf_vertical
569       REAL(wp), DIMENSION(:), ALLOCATABLE         :: t
570    END TYPE t_surf_vertical
571!
572!-- Type for wall temperatures at vertical walls. Is not necessary for horizontal walls.
573    TYPE t_wall_vertical
574       REAL(wp), DIMENSION(:,:), ALLOCATABLE       :: t
575    END TYPE t_wall_vertical
576
577
578!-- arrays for time averages
579!-- 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
580    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  rad_net_av       !< average of rad_net_l
581    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinsw_av      !< average of sw radiation falling to local surface including radiation from reflections
582    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinlw_av      !< average of lw radiation falling to local surface including radiation from reflections
583    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinswdir_av   !< average of direct sw radiation falling to local surface
584    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinswdif_av   !< average of diffuse sw radiation from sky and model boundary falling to local surface
585    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinlwdif_av   !< average of diffuse lw radiation from sky and model boundary falling to local surface
586    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinswref_av   !< average of sw radiation falling to surface from reflections
587    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinlwref_av   !< average of lw radiation falling to surface from reflections
588    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfoutsw_av     !< average of total sw radiation outgoing from nonvirtual surfaces surfaces after all reflection
589    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfoutlw_av     !< average of total lw radiation outgoing from nonvirtual surfaces surfaces after all reflection
590    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfins_av       !< average of array of residua of sw radiation absorbed in surface after last reflection
591    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfinl_av       !< average of array of residua of lw radiation absorbed in surface after last reflection
592    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  surfhf_av        !< average of total radiation flux incoming to minus outgoing from local surface 
593    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  wghf_eb_av       !< average of wghf_eb
594    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  wshf_eb_av       !< average of wshf_eb
595    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  t_wall_av        !< Average of t_wall
596    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  wghf_eb_green_av !< average of wghf_eb_green
597    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  t_green_av       !< Average of t_green
598    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  wghf_eb_window_av !< average of wghf_eb_window
599    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  t_window_av      !< Average of t_window   
600   
601
602!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
603!-- anthropogenic heat sources
604!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
605    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE        ::  aheat             !< daily average of anthropogenic heat (W/m2)
606    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  aheatprof         !< diurnal profiles of anthropogenic heat for particular layers
607    INTEGER(iwp)                                   ::  naheatlayers = 1  !< number of layers of anthropogenic heat
608
609!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
610!-- wall surface model
611!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
612!-- wall surface model constants
613    INTEGER(iwp), PARAMETER                        :: nzb_wall = 0       !< inner side of the wall model (to be switched)
614    INTEGER(iwp), PARAMETER                        :: nzt_wall = 3       !< outer side of the wall model (to be switched)
615    INTEGER(iwp), PARAMETER                        :: nzw = 4            !< number of wall layers (fixed for now)
616
617    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default = (/0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp /)
618                                                                         !< normalized soil, wall and roof layer depths (m/m)
619!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default = (/0.33_wp, 0.66_wp, 1.0_wp /)
620    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_window = (/0.25_wp, 0.5_wp, 0.75_wp, 1.0_wp /)
621!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_window = (/0.33_wp, 0.66_wp, 1.0_wp /)
622!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_window = (/0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp /)
623                                                                         !< normalized window layer depths (m/m)
624!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_green = (/0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp /)
625                                                                         !< normalized green layer depths (m/m)
626    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_green = (/0.25_wp, 0.5_wp, 0.75_wp, 1.0_wp /)
627!    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         :: zwn_default_green = (/0.33_wp, 0.66_wp, 1.0_wp /)
628
629
630    REAL(wp)                                       :: wall_inner_temperature = 295.0_wp    !< temperature of the inner wall surface (~22 degrees C) (K)
631    REAL(wp)                                       :: roof_inner_temperature = 295.0_wp    !< temperature of the inner roof surface (~22 degrees C) (K)
632    REAL(wp)                                       :: soil_inner_temperature = 288.0_wp    !< temperature of the deep soil (~15 degrees C) (K)
633    REAL(wp)                                       :: window_inner_temperature = 295.0_wp  !< temperature of the inner window surface (~22 degrees C) (K)
634
635!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
636!-- surface and material model variables for walls, ground, roofs
637!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
638    REAL(wp), DIMENSION(:), ALLOCATABLE            :: zwn                !< normalized wall layer depths (m)
639    REAL(wp), DIMENSION(:), ALLOCATABLE            :: zwn_window         !< normalized window layer depths (m)
640    REAL(wp), DIMENSION(:), ALLOCATABLE            :: zwn_green          !< normalized green layer depths (m)
641
642#if defined( __nopointer )
643    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_h           !< wall surface temperature (K) at horizontal walls
644    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_h_p         !< progn. wall surface temperature (K) at horizontal walls
645    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_h    !< window surface temperature (K) at horizontal walls
646    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_h_p  !< progn. window surface temperature (K) at horizontal walls
647    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_h     !< green surface temperature (K) at horizontal walls
648    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_h_p   !< progn. green surface temperature (K) at horizontal walls
649    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_10cm_h      !< near surface temperature (10cm) (K) at horizontal walls
650    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_10cm_h_p    !< progn. near surface temperature (10cm) (K) at horizontal walls
651    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_v
652    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_v_p
653    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_window_v
654    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_window_v_p
655    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_green_v
656    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_green_v_p
657    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_10cm_v
658    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_10cm_v_p
659#else
660    REAL(wp), DIMENSION(:), POINTER                :: t_surf_h
661    REAL(wp), DIMENSION(:), POINTER                :: t_surf_h_p 
662    REAL(wp), DIMENSION(:), POINTER                :: t_surf_window_h
663    REAL(wp), DIMENSION(:), POINTER                :: t_surf_window_h_p 
664    REAL(wp), DIMENSION(:), POINTER                :: t_surf_green_h
665    REAL(wp), DIMENSION(:), POINTER                :: t_surf_green_h_p 
666    REAL(wp), DIMENSION(:), POINTER                :: t_surf_10cm_h
667    REAL(wp), DIMENSION(:), POINTER                :: t_surf_10cm_h_p
668
669    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_h_1
670    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_h_2
671    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_h_1
672    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_h_2
673    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_h_1
674    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_h_2
675    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_10cm_h_1
676    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_10cm_h_2
677
678    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_v
679    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_v_p
680    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_window_v
681    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_window_v_p
682    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_green_v
683    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_green_v_p
684    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_10cm_v
685    TYPE(t_surf_vertical), DIMENSION(:), POINTER ::  t_surf_10cm_v_p
686
687    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_v_1
688    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_v_2
689    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_window_v_1
690    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_window_v_2
691    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_green_v_1
692    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_green_v_2
693    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_10cm_v_1
694    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  :: t_surf_10cm_v_2
695   
696#endif
697    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_av          !< average of wall surface temperature (K)
698    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_window_av   !< average of window surface temperature (K)
699    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_green_av    !< average of green wall surface temperature (K)
700    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    :: t_surf_10cm_av    !< average of whole wall surface temperature (K)
701
702!-- Temporal tendencies for time stepping           
703    REAL(wp), DIMENSION(:), ALLOCATABLE            :: tt_surface_m       !< surface temperature tendency of wall (K)
704    REAL(wp), DIMENSION(:), ALLOCATABLE            :: tt_surface_window_m !< surface temperature tendency of window (K)
705    REAL(wp), DIMENSION(:), ALLOCATABLE            :: tt_surface_green_m !< surface temperature tendency of green wall (K)
706
707!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
708!-- Energy balance variables
709!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
710!-- parameters of the land, roof and wall surfaces
711
712#if defined( __nopointer )
713    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_wall_h             !< Wall temperature (K)
714    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_wall_h_av          !< Average of t_wall
715    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_wall_h_p           !< Prog. wall temperature (K)
716    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_window_h           !< Window temperature (K)
717    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_window_h_av        !< Average of t_window
718    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_window_h_p         !< Prog. window temperature (K)
719    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_green_h            !< Green temperature (K)
720    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_green_h_av         !< Average of t_green
721    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_green_h_p          !< Prog. green temperature (K)
722
723    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_wall_v             !< Wall temperature (K)
724    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_wall_v_av          !< Average of t_wall
725    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_wall_v_p           !< Prog. wall temperature (K)
726    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_window_v           !< Window temperature (K)
727    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_window_v_av        !< Average of t_window
728    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_window_v_p         !< Prog. window temperature (K)
729    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_green_v            !< Green temperature (K)
730    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_green_v_av         !< Average of t_green
731    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_green_v_p          !< Prog. green temperature (K)
732#else
733    REAL(wp), DIMENSION(:,:), POINTER                :: t_wall_h, t_wall_h_p
734    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_wall_h_av, t_wall_h_1, t_wall_h_2
735    REAL(wp), DIMENSION(:,:), POINTER                :: t_window_h, t_window_h_p
736    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_window_h_av, t_window_h_1, t_window_h_2
737    REAL(wp), DIMENSION(:,:), POINTER                :: t_green_h, t_green_h_p
738    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    :: t_green_h_av, t_green_h_1, t_green_h_2
739
740    TYPE(t_wall_vertical), DIMENSION(:), POINTER   :: t_wall_v, t_wall_v_p
741    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_wall_v_av, t_wall_v_1, t_wall_v_2
742    TYPE(t_wall_vertical), DIMENSION(:), POINTER   :: t_window_v, t_window_v_p
743    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_window_v_av, t_window_v_1, t_window_v_2
744    TYPE(t_wall_vertical), DIMENSION(:), POINTER   :: t_green_v, t_green_v_p
745    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  :: t_green_v_av, t_green_v_1, t_green_v_2
746#endif
747
748!-- Wall temporal tendencies for time stepping
749    REAL(wp), DIMENSION(:,:), ALLOCATABLE          :: tt_wall_m          !< t_wall prognostic array
750    REAL(wp), DIMENSION(:,:), ALLOCATABLE          :: tt_window_m        !< t_window prognostic array
751    REAL(wp), DIMENSION(:,:), ALLOCATABLE          :: tt_green_m         !< t_green prognostic array
752
753!-- Surface and material parameters classes (surface_type)
754!-- albedo, emissivity, lambda_surf, roughness, thickness, volumetric heat capacity, thermal conductivity
755    INTEGER(iwp)                                   :: n_surface_types      !< number of the wall type categories
756    INTEGER(iwp), PARAMETER                        :: n_surface_params = 9 !< number of parameters for each type of the wall
757    INTEGER(iwp), PARAMETER                        :: ialbedo  = 1         !< albedo of the surface
758    INTEGER(iwp), PARAMETER                        :: iemiss   = 2         !< emissivity of the surface
759    INTEGER(iwp), PARAMETER                        :: ilambdas = 3         !< heat conductivity lambda S between surface and material ( W m-2 K-1 )
760    INTEGER(iwp), PARAMETER                        :: irough   = 4         !< roughness length z0 for movements
761    INTEGER(iwp), PARAMETER                        :: iroughh  = 5         !< roughness length z0h for scalars (heat, humidity,...)
762    INTEGER(iwp), PARAMETER                        :: icsurf   = 6         !< Surface skin layer heat capacity (J m-2 K-1 )
763    INTEGER(iwp), PARAMETER                        :: ithick   = 7         !< thickness of the surface (wall, roof, land)  ( m )
764    INTEGER(iwp), PARAMETER                        :: irhoC    = 8         !< volumetric heat capacity rho*C of the material ( J m-3 K-1 )
765    INTEGER(iwp), PARAMETER                        :: ilambdah = 9         !< thermal conductivity lambda H of the wall (W m-1 K-1 )
766    CHARACTER(12), DIMENSION(:), ALLOCATABLE       :: surface_type_names   !< names of wall types (used only for reports)
767    INTEGER(iwp), DIMENSION(:), ALLOCATABLE        :: surface_type_codes   !< codes of wall types
768    REAL(wp), DIMENSION(:,:), ALLOCATABLE          :: surface_params       !< parameters of wall types
769
770   
771!-- interfaces of subroutines accessed from outside of this module
772    INTERFACE usm_boundary_condition
773       MODULE PROCEDURE usm_boundary_condition
774    END INTERFACE usm_boundary_condition
775
776    INTERFACE usm_check_data_output
777       MODULE PROCEDURE usm_check_data_output
778    END INTERFACE usm_check_data_output
779   
780    INTERFACE usm_check_parameters
781       MODULE PROCEDURE usm_check_parameters
782    END INTERFACE usm_check_parameters
783   
784    INTERFACE usm_data_output_3d
785       MODULE PROCEDURE usm_data_output_3d
786    END INTERFACE usm_data_output_3d
787   
788    INTERFACE usm_define_netcdf_grid
789       MODULE PROCEDURE usm_define_netcdf_grid
790    END INTERFACE usm_define_netcdf_grid
791
792    INTERFACE usm_init_urban_surface
793       MODULE PROCEDURE usm_init_urban_surface
794    END INTERFACE usm_init_urban_surface
795
796    INTERFACE usm_material_heat_model
797       MODULE PROCEDURE usm_material_heat_model
798    END INTERFACE usm_material_heat_model
799   
800    INTERFACE usm_green_heat_model
801       MODULE PROCEDURE usm_green_heat_model
802    END INTERFACE usm_green_heat_model
803   
804    INTERFACE usm_parin
805       MODULE PROCEDURE usm_parin
806    END INTERFACE usm_parin
807   
808    INTERFACE usm_temperature_near_surface
809       MODULE PROCEDURE usm_temperature_near_surface
810    END INTERFACE usm_temperature_near_surface
811
812    INTERFACE usm_rrd_local 
813       MODULE PROCEDURE usm_rrd_local
814    END INTERFACE usm_rrd_local
815
816    INTERFACE usm_surface_energy_balance
817       MODULE PROCEDURE usm_surface_energy_balance
818    END INTERFACE usm_surface_energy_balance
819   
820    INTERFACE usm_swap_timelevel
821       MODULE PROCEDURE usm_swap_timelevel
822    END INTERFACE usm_swap_timelevel
823       
824    INTERFACE usm_wrd_local
825       MODULE PROCEDURE usm_wrd_local
826    END INTERFACE usm_wrd_local
827
828    INTERFACE usm_allocate_surface
829       MODULE PROCEDURE usm_allocate_surface
830    END INTERFACE usm_allocate_surface
831
832    INTERFACE usm_average_3d_data
833       MODULE PROCEDURE usm_average_3d_data
834    END INTERFACE usm_average_3d_data
835
836   
837    SAVE
838
839    PRIVATE 
840   
841!-- Public functions
842    PUBLIC usm_boundary_condition, usm_check_parameters, usm_init_urban_surface,&
843           usm_rrd_local,                                                      & 
844           usm_surface_energy_balance, usm_material_heat_model,                &
845           usm_swap_timelevel, usm_check_data_output, usm_average_3d_data,     &
846           usm_data_output_3d, usm_define_netcdf_grid, usm_parin,              &
847           usm_wrd_local, usm_allocate_surface
848
849!-- Public parameters, constants and initial values
850    PUBLIC usm_anthropogenic_heat, usm_material_model,                          &
851           usm_green_heat_model, usm_temperature_near_surface
852
853
854
855 CONTAINS
856
857!------------------------------------------------------------------------------!
858! Description:
859! ------------
860!> This subroutine creates the necessary indices of the urban surfaces
861!> and plant canopy and it allocates the needed arrays for USM
862!------------------------------------------------------------------------------!
863    SUBROUTINE usm_allocate_surface
864   
865        IMPLICIT NONE
866       
867        INTEGER(iwp) ::  l
868
869!
870!--     Allocate radiation arrays which are part of the new data type.
871!--     For horizontal surfaces.
872        ALLOCATE( surf_usm_h%surfhf(1:surf_usm_h%ns)    )
873        ALLOCATE( surf_usm_h%rad_net_l(1:surf_usm_h%ns) )
874!
875!--     For vertical surfaces
876        DO  l = 0, 3
877           ALLOCATE( surf_usm_v(l)%surfhf(1:surf_usm_v(l)%ns)    )
878           ALLOCATE( surf_usm_v(l)%rad_net_l(1:surf_usm_v(l)%ns) )
879        ENDDO
880
881!--     Wall surface model
882!--     allocate arrays for wall surface model and define pointers
883       
884!--     allocate array of wall types and wall parameters
885        ALLOCATE ( surf_usm_h%surface_types(1:surf_usm_h%ns) )
886        DO  l = 0, 3
887           ALLOCATE( surf_usm_v(l)%surface_types(1:surf_usm_v(l)%ns) )
888        ENDDO
889!
890!--     Allocate albedo_type and albedo. Each surface element
891!--     has 3 values, 0: wall fraction, 1: green fraction, 2: window fraction.
892        ALLOCATE( surf_usm_h%albedo_type(0:2,1:surf_usm_h%ns) )
893        ALLOCATE( surf_usm_h%albedo(0:2,1:surf_usm_h%ns)      )
894        surf_usm_h%albedo_type = albedo_type
895        DO  l = 0, 3
896           ALLOCATE( surf_usm_v(l)%albedo_type(0:2,1:surf_usm_v(l)%ns) )
897           ALLOCATE( surf_usm_v(l)%albedo(0:2,1:surf_usm_v(l)%ns)      )
898           surf_usm_v(l)%albedo_type = albedo_type
899        ENDDO       
900
901
902!
903!--     Allocate indoor target temperature for summer and winter
904        ALLOCATE( surf_usm_h%target_temp_summer(1:surf_usm_h%ns) )
905        ALLOCATE( surf_usm_h%target_temp_winter(1:surf_usm_h%ns) )
906        DO  l = 0, 3
907           ALLOCATE( surf_usm_v(l)%target_temp_summer(1:surf_usm_v(l)%ns) )
908           ALLOCATE( surf_usm_v(l)%target_temp_winter(1:surf_usm_v(l)%ns) )
909        ENDDO   
910!
911!--     Allocate flag indicating ground floor level surface elements
912        ALLOCATE ( surf_usm_h%ground_level(1:surf_usm_h%ns) ) 
913        DO  l = 0, 3
914           ALLOCATE( surf_usm_v(l)%ground_level(1:surf_usm_v(l)%ns) )
915        ENDDO   
916!
917!--      Allocate arrays for relative surface fraction.
918!--      0 - wall fraction, 1 - green fraction, 2 - window fraction
919         ALLOCATE( surf_usm_h%frac(0:2,1:surf_usm_h%ns) )
920         surf_usm_h%frac = 0.0_wp
921         DO  l = 0, 3
922            ALLOCATE( surf_usm_v(l)%frac(0:2,1:surf_usm_v(l)%ns) )
923            surf_usm_v(l)%frac = 0.0_wp
924         ENDDO
925       
926!--     wall and roof surface parameters. First for horizontal surfaces
927        ALLOCATE ( surf_usm_h%isroof_surf(1:surf_usm_h%ns)     )
928        ALLOCATE ( surf_usm_h%lambda_surf(1:surf_usm_h%ns)     )
929        ALLOCATE ( surf_usm_h%lambda_surf_window(1:surf_usm_h%ns) )
930        ALLOCATE ( surf_usm_h%lambda_surf_green(1:surf_usm_h%ns)  )
931        ALLOCATE ( surf_usm_h%c_surface(1:surf_usm_h%ns)       )
932        ALLOCATE ( surf_usm_h%c_surface_window(1:surf_usm_h%ns)   )
933        ALLOCATE ( surf_usm_h%c_surface_green(1:surf_usm_h%ns)    )
934        ALLOCATE ( surf_usm_h%transmissivity(1:surf_usm_h%ns)  )
935        ALLOCATE ( surf_usm_h%lai(1:surf_usm_h%ns)             )
936        ALLOCATE ( surf_usm_h%emissivity(0:2,1:surf_usm_h%ns)  )
937        ALLOCATE ( surf_usm_h%r_a(1:surf_usm_h%ns)             )
938        ALLOCATE ( surf_usm_h%r_a_green(1:surf_usm_h%ns)       )
939        ALLOCATE ( surf_usm_h%r_a_window(1:surf_usm_h%ns)      )
940
941!
942!--     For vertical surfaces.
943        DO  l = 0, 3
944           ALLOCATE ( surf_usm_v(l)%lambda_surf(1:surf_usm_v(l)%ns)     )
945           ALLOCATE ( surf_usm_v(l)%c_surface(1:surf_usm_v(l)%ns)       )
946           ALLOCATE ( surf_usm_v(l)%lambda_surf_window(1:surf_usm_v(l)%ns) )
947           ALLOCATE ( surf_usm_v(l)%c_surface_window(1:surf_usm_v(l)%ns)   )
948           ALLOCATE ( surf_usm_v(l)%lambda_surf_green(1:surf_usm_v(l)%ns)  )
949           ALLOCATE ( surf_usm_v(l)%c_surface_green(1:surf_usm_v(l)%ns)    )
950           ALLOCATE ( surf_usm_v(l)%transmissivity(1:surf_usm_v(l)%ns)  )
951           ALLOCATE ( surf_usm_v(l)%lai(1:surf_usm_v(l)%ns)             )
952           ALLOCATE ( surf_usm_v(l)%emissivity(0:2,1:surf_usm_v(l)%ns)  )
953           ALLOCATE ( surf_usm_v(l)%r_a(1:surf_usm_v(l)%ns)             )
954           ALLOCATE ( surf_usm_v(l)%r_a_green(1:surf_usm_v(l)%ns)       )
955           ALLOCATE ( surf_usm_v(l)%r_a_window(1:surf_usm_v(l)%ns)      )
956        ENDDO
957
958!       
959!--     allocate wall and roof material parameters. First for horizontal surfaces
960        ALLOCATE ( surf_usm_h%thickness_wall(1:surf_usm_h%ns)               )
961        ALLOCATE ( surf_usm_h%thickness_window(1:surf_usm_h%ns)                  )
962        ALLOCATE ( surf_usm_h%thickness_green(1:surf_usm_h%ns)                   )
963        ALLOCATE ( surf_usm_h%lambda_h(nzb_wall:nzt_wall,1:surf_usm_h%ns)   )
964        ALLOCATE ( surf_usm_h%rho_c_wall(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
965        ALLOCATE ( surf_usm_h%lambda_h_window(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
966        ALLOCATE ( surf_usm_h%rho_c_window(nzb_wall:nzt_wall,1:surf_usm_h%ns)    )
967        ALLOCATE ( surf_usm_h%lambda_h_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
968        ALLOCATE ( surf_usm_h%rho_c_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)     )
969
970!
971!--     For vertical surfaces.
972        DO  l = 0, 3
973           ALLOCATE ( surf_usm_v(l)%thickness_wall(1:surf_usm_v(l)%ns)               )
974           ALLOCATE ( surf_usm_v(l)%thickness_window(1:surf_usm_v(l)%ns)                  )
975           ALLOCATE ( surf_usm_v(l)%thickness_green(1:surf_usm_v(l)%ns)                   )
976           ALLOCATE ( surf_usm_v(l)%lambda_h(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)   )
977           ALLOCATE ( surf_usm_v(l)%rho_c_wall(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
978           ALLOCATE ( surf_usm_v(l)%lambda_h_window(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
979           ALLOCATE ( surf_usm_v(l)%rho_c_window(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)    )
980           ALLOCATE ( surf_usm_v(l)%lambda_h_green(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
981           ALLOCATE ( surf_usm_v(l)%rho_c_green(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)     )
982        ENDDO
983
984!--     allocate wall and roof layers sizes. For horizontal surfaces.
985        ALLOCATE ( zwn(nzb_wall:nzt_wall) )
986        ALLOCATE ( surf_usm_h%dz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)     )
987        ALLOCATE ( zwn_window(nzb_wall:nzt_wall) )
988        ALLOCATE ( surf_usm_h%dz_window(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)     )
989        ALLOCATE ( zwn_green(nzb_wall:nzt_wall) )
990        ALLOCATE ( surf_usm_h%dz_green(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)      )
991        ALLOCATE ( surf_usm_h%ddz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)    )
992        ALLOCATE ( surf_usm_h%dz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
993        ALLOCATE ( surf_usm_h%ddz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
994        ALLOCATE ( surf_usm_h%zw(nzb_wall:nzt_wall,1:surf_usm_h%ns)            )
995        ALLOCATE ( surf_usm_h%ddz_window(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)    )
996        ALLOCATE ( surf_usm_h%dz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
997        ALLOCATE ( surf_usm_h%ddz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
998        ALLOCATE ( surf_usm_h%zw_window(nzb_wall:nzt_wall,1:surf_usm_h%ns)       )
999        ALLOCATE ( surf_usm_h%ddz_green(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)     )
1000        ALLOCATE ( surf_usm_h%dz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)   )
1001        ALLOCATE ( surf_usm_h%ddz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
1002        ALLOCATE ( surf_usm_h%zw_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)        )
1003!
1004!--     For vertical surfaces.
1005        DO  l = 0, 3
1006           ALLOCATE ( surf_usm_v(l)%dz_wall(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)     )
1007           ALLOCATE ( surf_usm_v(l)%dz_window(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)     )
1008           ALLOCATE ( surf_usm_v(l)%dz_green(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)      )
1009           ALLOCATE ( surf_usm_v(l)%ddz_wall(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)    )
1010           ALLOCATE ( surf_usm_v(l)%dz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1011           ALLOCATE ( surf_usm_v(l)%ddz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1012           ALLOCATE ( surf_usm_v(l)%zw(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)            )
1013           ALLOCATE ( surf_usm_v(l)%ddz_window(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)    )
1014           ALLOCATE ( surf_usm_v(l)%dz_window_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1015           ALLOCATE ( surf_usm_v(l)%ddz_window_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1016           ALLOCATE ( surf_usm_v(l)%zw_window(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)       )
1017           ALLOCATE ( surf_usm_v(l)%ddz_green(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)     )
1018           ALLOCATE ( surf_usm_v(l)%dz_green_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)   )
1019           ALLOCATE ( surf_usm_v(l)%ddz_green_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1020           ALLOCATE ( surf_usm_v(l)%zw_green(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)        )
1021        ENDDO
1022
1023!--     allocate wall and roof temperature arrays, for horizontal walls
1024#if defined( __nopointer )
1025        IF ( .NOT. ALLOCATED( t_surf_h ) )                                     &
1026           ALLOCATE ( t_surf_h(1:surf_usm_h%ns) )
1027        IF ( .NOT. ALLOCATED( t_surf_h_p ) )                                   &
1028           ALLOCATE ( t_surf_h_p(1:surf_usm_h%ns) )
1029        IF ( .NOT. ALLOCATED( t_wall_h ) )                                     &           
1030           ALLOCATE ( t_wall_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1031        IF ( .NOT. ALLOCATED( t_wall_h_p ) )                                   &           
1032           ALLOCATE ( t_wall_h_p(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1033        IF ( .NOT. ALLOCATED( t_surf_window_h ) )                              &
1034           ALLOCATE ( t_surf_window_h(1:surf_usm_h%ns) )
1035        IF ( .NOT. ALLOCATED( t_surf_window_h_p ) )                            &
1036           ALLOCATE ( t_surf_window_h_p(1:surf_usm_h%ns) )
1037        IF ( .NOT. ALLOCATED( t_window_h ) )                                   &           
1038           ALLOCATE ( t_window_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1039        IF ( .NOT. ALLOCATED( t_window_h_p ) )                                 &           
1040           ALLOCATE ( t_window_h_p(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1041        IF ( .NOT. ALLOCATED( t_surf_green_h ) )                               &
1042           ALLOCATE ( t_surf_green_h(1:surf_usm_h%ns) )
1043        IF ( .NOT. ALLOCATED( t_surf_green_h_p ) )                             &
1044           ALLOCATE ( t_surf_green_h_p(1:surf_usm_h%ns) )           
1045        IF ( .NOT. ALLOCATED( t_green_h ) )                                    &           
1046           ALLOCATE ( t_green_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1047        IF ( .NOT. ALLOCATED( t_green_h_p ) )                                  &           
1048           ALLOCATE ( t_green_h_p(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1049        IF ( .NOT. ALLOCATED( t_surf_10cm_h ) )                                &
1050           ALLOCATE ( t_surf_10cm_h(1:surf_usm_h%ns) )
1051        IF ( .NOT. ALLOCATED( t_surf_10cm_h_p ) )                              &
1052           ALLOCATE ( t_surf_10cm_h_p(1:surf_usm_h%ns) )
1053#else
1054!
1055!--     Allocate if required. Note, in case of restarts, some of these arrays
1056!--     might be already allocated.
1057        IF ( .NOT. ALLOCATED( t_surf_h_1 ) )                                   &
1058           ALLOCATE ( t_surf_h_1(1:surf_usm_h%ns) )
1059        IF ( .NOT. ALLOCATED( t_surf_h_2 ) )                                   &
1060           ALLOCATE ( t_surf_h_2(1:surf_usm_h%ns) )
1061        IF ( .NOT. ALLOCATED( t_wall_h_1 ) )                                   &           
1062           ALLOCATE ( t_wall_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1063        IF ( .NOT. ALLOCATED( t_wall_h_2 ) )                                   &           
1064           ALLOCATE ( t_wall_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )         
1065        IF ( .NOT. ALLOCATED( t_surf_window_h_1 ) )                            &
1066           ALLOCATE ( t_surf_window_h_1(1:surf_usm_h%ns) )
1067        IF ( .NOT. ALLOCATED( t_surf_window_h_2 ) )                            &
1068           ALLOCATE ( t_surf_window_h_2(1:surf_usm_h%ns) )
1069        IF ( .NOT. ALLOCATED( t_window_h_1 ) )                                 &           
1070           ALLOCATE ( t_window_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1071        IF ( .NOT. ALLOCATED( t_window_h_2 ) )                                 &           
1072           ALLOCATE ( t_window_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )         
1073        IF ( .NOT. ALLOCATED( t_surf_green_h_1 ) )                             &
1074           ALLOCATE ( t_surf_green_h_1(1:surf_usm_h%ns) )
1075        IF ( .NOT. ALLOCATED( t_surf_green_h_2 ) )                             &
1076           ALLOCATE ( t_surf_green_h_2(1:surf_usm_h%ns) )
1077        IF ( .NOT. ALLOCATED( t_green_h_1 ) )                                  &           
1078           ALLOCATE ( t_green_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) ) 
1079        IF ( .NOT. ALLOCATED( t_green_h_2 ) )                                  &           
1080           ALLOCATE ( t_green_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )         
1081        IF ( .NOT. ALLOCATED( t_surf_10cm_h_1 ) )                              &
1082           ALLOCATE ( t_surf_10cm_h_1(1:surf_usm_h%ns) )
1083        IF ( .NOT. ALLOCATED( t_surf_10cm_h_2 ) )                              &
1084           ALLOCATE ( t_surf_10cm_h_2(1:surf_usm_h%ns) )
1085!           
1086!--     initial assignment of the pointers
1087        t_wall_h    => t_wall_h_1;    t_wall_h_p    => t_wall_h_2
1088        t_window_h    => t_window_h_1;    t_window_h_p    => t_window_h_2
1089        t_green_h    => t_green_h_1;    t_green_h_p    => t_green_h_2
1090        t_surf_h => t_surf_h_1; t_surf_h_p => t_surf_h_2           
1091        t_surf_window_h => t_surf_window_h_1; t_surf_window_h_p => t_surf_window_h_2 
1092        t_surf_green_h => t_surf_green_h_1; t_surf_green_h_p => t_surf_green_h_2           
1093        t_surf_10cm_h => t_surf_10cm_h_1; t_surf_10cm_h_p => t_surf_10cm_h_2 
1094 
1095#endif
1096
1097!--     allocate wall and roof temperature arrays, for vertical walls if required
1098#if defined( __nopointer )
1099        DO  l = 0, 3
1100           IF ( .NOT. ALLOCATED( t_surf_v(l)%t ) )                             &
1101              ALLOCATE ( t_surf_v(l)%t(1:surf_usm_v(l)%ns) )
1102           IF ( .NOT. ALLOCATED( t_surf_v_p(l)%t ) )                           &
1103              ALLOCATE ( t_surf_v_p(l)%t(1:surf_usm_v(l)%ns) )
1104           IF ( .NOT. ALLOCATED( t_wall_v(l)%t ) )                             &
1105              ALLOCATE ( t_wall_v(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1106           IF ( .NOT. ALLOCATED( t_wall_v_p(l)%t ) )                           &                 
1107              ALLOCATE ( t_wall_v_p(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1108           IF ( .NOT. ALLOCATED( t_surf_window_v(l)%t ) )                      &
1109              ALLOCATE ( t_surf_window_v(l)%t(1:surf_usm_v(l)%ns) )
1110           IF ( .NOT. ALLOCATED( t_surf_window_v_p(l)%t ) )                    &
1111              ALLOCATE ( t_surf_window_v_p(l)%t(1:surf_usm_v(l)%ns) )
1112           IF ( .NOT. ALLOCATED( t_window_v(l)%t ) )                           &
1113              ALLOCATE ( t_window_v(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1114           IF ( .NOT. ALLOCATED( t_window_v_p(l)%t ) )                         &                 
1115              ALLOCATE ( t_window_v_p(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1116           IF ( .NOT. ALLOCATED( t_green_v(l)%t ) )                            &
1117              ALLOCATE ( t_green_v(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1118           IF ( .NOT. ALLOCATED( t_green_v_p(l)%t ) )                          &                 
1119              ALLOCATE ( t_green_v_p(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1120           IF ( .NOT. ALLOCATED( t_surf_green_v(l)%t ) )                       &
1121              ALLOCATE ( t_surf_green_v(l)%t(1:surf_usm_v(l)%ns) )
1122           IF ( .NOT. ALLOCATED( t_surf_green_v_p(l)%t ) )                     &
1123              ALLOCATE ( t_surf_green_v_p(l)%t(1:surf_usm_v(l)%ns) )
1124           IF ( .NOT. ALLOCATED( t_surf_10cm_v(l)%t ) )                        &
1125              ALLOCATE ( t_surf_10cm_v(l)%t(1:surf_usm_v(l)%ns) )
1126           IF ( .NOT. ALLOCATED( t_surf_10cm_v_p(l)%t ) )                        &
1127              ALLOCATE ( t_surf_10cm_v_p(l)%t(1:surf_usm_v(l)%ns) )
1128        ENDDO
1129#else
1130!
1131!--     Allocate if required. Note, in case of restarts, some of these arrays
1132!--     might be already allocated.
1133        DO  l = 0, 3
1134           IF ( .NOT. ALLOCATED( t_surf_v_1(l)%t ) )                           &
1135              ALLOCATE ( t_surf_v_1(l)%t(1:surf_usm_v(l)%ns) )
1136           IF ( .NOT. ALLOCATED( t_surf_v_2(l)%t ) )                           &
1137              ALLOCATE ( t_surf_v_2(l)%t(1:surf_usm_v(l)%ns) )
1138           IF ( .NOT. ALLOCATED( t_wall_v_1(l)%t ) )                           &           
1139              ALLOCATE ( t_wall_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1140           IF ( .NOT. ALLOCATED( t_wall_v_2(l)%t ) )                           &           
1141              ALLOCATE ( t_wall_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1142           IF ( .NOT. ALLOCATED( t_surf_window_v_1(l)%t ) )                    &
1143              ALLOCATE ( t_surf_window_v_1(l)%t(1:surf_usm_v(l)%ns) )
1144           IF ( .NOT. ALLOCATED( t_surf_window_v_2(l)%t ) )                    &
1145              ALLOCATE ( t_surf_window_v_2(l)%t(1:surf_usm_v(l)%ns) )
1146           IF ( .NOT. ALLOCATED( t_window_v_1(l)%t ) )                         &           
1147              ALLOCATE ( t_window_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1148           IF ( .NOT. ALLOCATED( t_window_v_2(l)%t ) )                         &           
1149              ALLOCATE ( t_window_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1150           IF ( .NOT. ALLOCATED( t_surf_green_v_1(l)%t ) )                     &
1151              ALLOCATE ( t_surf_green_v_1(l)%t(1:surf_usm_v(l)%ns) )
1152           IF ( .NOT. ALLOCATED( t_surf_green_v_2(l)%t ) )                     &
1153              ALLOCATE ( t_surf_green_v_2(l)%t(1:surf_usm_v(l)%ns) )
1154           IF ( .NOT. ALLOCATED( t_green_v_1(l)%t ) )                          &           
1155              ALLOCATE ( t_green_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1156           IF ( .NOT. ALLOCATED( t_green_v_2(l)%t ) )                          &           
1157              ALLOCATE ( t_green_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) ) 
1158           IF ( .NOT. ALLOCATED( t_surf_10cm_v_1(l)%t ) )                     &
1159              ALLOCATE ( t_surf_10cm_v_1(l)%t(1:surf_usm_v(l)%ns) )
1160           IF ( .NOT. ALLOCATED( t_surf_10cm_v_2(l)%t ) )                     &
1161              ALLOCATE ( t_surf_10cm_v_2(l)%t(1:surf_usm_v(l)%ns) )
1162        ENDDO
1163!
1164!--     initial assignment of the pointers
1165        t_wall_v    => t_wall_v_1;    t_wall_v_p    => t_wall_v_2
1166        t_surf_v => t_surf_v_1; t_surf_v_p => t_surf_v_2
1167        t_window_v    => t_window_v_1;    t_window_v_p    => t_window_v_2
1168        t_green_v    => t_green_v_1;    t_green_v_p    => t_green_v_2
1169        t_surf_window_v => t_surf_window_v_1; t_surf_window_v_p => t_surf_window_v_2
1170        t_surf_green_v => t_surf_green_v_1; t_surf_green_v_p => t_surf_green_v_2
1171        t_surf_10cm_v => t_surf_10cm_v_1; t_surf_10cm_v_p => t_surf_10cm_v_2
1172
1173#endif
1174!
1175!--     Allocate intermediate timestep arrays. For horizontal surfaces.
1176        ALLOCATE ( surf_usm_h%tt_surface_m(1:surf_usm_h%ns)                  )
1177        ALLOCATE ( surf_usm_h%tt_wall_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1178        ALLOCATE ( surf_usm_h%tt_surface_window_m(1:surf_usm_h%ns)             )
1179        ALLOCATE ( surf_usm_h%tt_window_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1180        ALLOCATE ( surf_usm_h%tt_green_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)  )
1181        ALLOCATE ( surf_usm_h%tt_surface_green_m(1:surf_usm_h%ns)              )
1182
1183!
1184!--     Set inital values for prognostic quantities
1185        IF ( ALLOCATED( surf_usm_h%tt_surface_m ) )  surf_usm_h%tt_surface_m = 0.0_wp
1186        IF ( ALLOCATED( surf_usm_h%tt_wall_m    ) )  surf_usm_h%tt_wall_m    = 0.0_wp
1187        IF ( ALLOCATED( surf_usm_h%tt_surface_window_m ) )  surf_usm_h%tt_surface_window_m = 0.0_wp
1188        IF ( ALLOCATED( surf_usm_h%tt_window_m    )      )  surf_usm_h%tt_window_m         = 0.0_wp
1189        IF ( ALLOCATED( surf_usm_h%tt_green_m    )       )  surf_usm_h%tt_green_m          = 0.0_wp
1190        IF ( ALLOCATED( surf_usm_h%tt_surface_green_m )  )  surf_usm_h%tt_surface_green_m  = 0.0_wp
1191!
1192!--     Now, for vertical surfaces
1193        DO  l = 0, 3
1194           ALLOCATE ( surf_usm_v(l)%tt_surface_m(1:surf_usm_v(l)%ns)                  )
1195           ALLOCATE ( surf_usm_v(l)%tt_wall_m(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1196           IF ( ALLOCATED( surf_usm_v(l)%tt_surface_m ) )  surf_usm_v(l)%tt_surface_m = 0.0_wp
1197           IF ( ALLOCATED( surf_usm_v(l)%tt_wall_m    ) )  surf_usm_v(l)%tt_wall_m    = 0.0_wp
1198           ALLOCATE ( surf_usm_v(l)%tt_surface_window_m(1:surf_usm_v(l)%ns)             )
1199           ALLOCATE ( surf_usm_v(l)%tt_window_m(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1200           IF ( ALLOCATED( surf_usm_v(l)%tt_surface_window_m ) )  surf_usm_v(l)%tt_surface_window_m = 0.0_wp
1201           IF ( ALLOCATED( surf_usm_v(l)%tt_window_m  ) )  surf_usm_v(l)%tt_window_m    = 0.0_wp
1202           ALLOCATE ( surf_usm_v(l)%tt_surface_green_m(1:surf_usm_v(l)%ns)              )
1203           IF ( ALLOCATED( surf_usm_v(l)%tt_surface_green_m ) )  surf_usm_v(l)%tt_surface_green_m = 0.0_wp
1204           ALLOCATE ( surf_usm_v(l)%tt_green_m(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)  )
1205           IF ( ALLOCATED( surf_usm_v(l)%tt_green_m   ) )  surf_usm_v(l)%tt_green_m    = 0.0_wp
1206        ENDDO
1207
1208!--     allocate wall heat flux output array and set initial values. For horizontal surfaces
1209!         ALLOCATE ( surf_usm_h%wshf(1:surf_usm_h%ns)    )  !can be removed
1210        ALLOCATE ( surf_usm_h%wshf_eb(1:surf_usm_h%ns) )
1211        ALLOCATE ( surf_usm_h%wghf_eb(1:surf_usm_h%ns) )
1212        ALLOCATE ( surf_usm_h%wghf_eb_window(1:surf_usm_h%ns) )
1213        ALLOCATE ( surf_usm_h%wghf_eb_green(1:surf_usm_h%ns) )
1214        ALLOCATE ( surf_usm_h%iwghf_eb(1:surf_usm_h%ns) )
1215        ALLOCATE ( surf_usm_h%iwghf_eb_window(1:surf_usm_h%ns) )
1216        IF ( ALLOCATED( surf_usm_h%wshf    ) )  surf_usm_h%wshf    = 0.0_wp
1217        IF ( ALLOCATED( surf_usm_h%wshf_eb ) )  surf_usm_h%wshf_eb = 0.0_wp
1218        IF ( ALLOCATED( surf_usm_h%wghf_eb ) )  surf_usm_h%wghf_eb = 0.0_wp
1219        IF ( ALLOCATED( surf_usm_h%wghf_eb_window ) )  surf_usm_h%wghf_eb_window = 0.0_wp
1220        IF ( ALLOCATED( surf_usm_h%wghf_eb_green ) )  surf_usm_h%wghf_eb_green = 0.0_wp
1221        IF ( ALLOCATED( surf_usm_h%iwghf_eb ) )  surf_usm_h%iwghf_eb = 0.0_wp
1222        IF ( ALLOCATED( surf_usm_h%iwghf_eb_window ) )  surf_usm_h%iwghf_eb_window = 0.0_wp
1223!
1224!--     Now, for vertical surfaces
1225        DO  l = 0, 3
1226!            ALLOCATE ( surf_usm_v(l)%wshf(1:surf_usm_v(l)%ns)    )    ! can be removed
1227           ALLOCATE ( surf_usm_v(l)%wshf_eb(1:surf_usm_v(l)%ns) )
1228           ALLOCATE ( surf_usm_v(l)%wghf_eb(1:surf_usm_v(l)%ns) )
1229           ALLOCATE ( surf_usm_v(l)%wghf_eb_window(1:surf_usm_v(l)%ns) )
1230           ALLOCATE ( surf_usm_v(l)%wghf_eb_green(1:surf_usm_v(l)%ns) )
1231           ALLOCATE ( surf_usm_v(l)%iwghf_eb(1:surf_usm_v(l)%ns) )
1232           ALLOCATE ( surf_usm_v(l)%iwghf_eb_window(1:surf_usm_v(l)%ns) )
1233           IF ( ALLOCATED( surf_usm_v(l)%wshf    ) )  surf_usm_v(l)%wshf    = 0.0_wp
1234           IF ( ALLOCATED( surf_usm_v(l)%wshf_eb ) )  surf_usm_v(l)%wshf_eb = 0.0_wp
1235           IF ( ALLOCATED( surf_usm_v(l)%wghf_eb ) )  surf_usm_v(l)%wghf_eb = 0.0_wp
1236           IF ( ALLOCATED( surf_usm_v(l)%wghf_eb_window ) )  surf_usm_v(l)%wghf_eb_window = 0.0_wp
1237           IF ( ALLOCATED( surf_usm_v(l)%wghf_eb_green ) )  surf_usm_v(l)%wghf_eb_green = 0.0_wp
1238           IF ( ALLOCATED( surf_usm_v(l)%iwghf_eb ) )  surf_usm_v(l)%iwghf_eb = 0.0_wp
1239           IF ( ALLOCATED( surf_usm_v(l)%iwghf_eb_window ) )  surf_usm_v(l)%iwghf_eb_window = 0.0_wp
1240        ENDDO
1241       
1242    END SUBROUTINE usm_allocate_surface
1243
1244
1245!------------------------------------------------------------------------------!
1246! Description:
1247! ------------
1248!> Sum up and time-average urban surface output quantities as well as allocate
1249!> the array necessary for storing the average.
1250!------------------------------------------------------------------------------!
1251    SUBROUTINE usm_average_3d_data( mode, variable )
1252
1253        IMPLICIT NONE
1254
1255        CHARACTER (len=*), INTENT(IN) ::  mode
1256        CHARACTER (len=*), INTENT(IN) :: variable
1257 
1258        INTEGER(iwp)                                       :: i, j, k, l, m, ids, idsint, iwl, istat
1259        CHARACTER (len=varnamelength)                      :: var, surfid
1260        INTEGER(iwp), PARAMETER                            :: nd = 5
1261        CHARACTER(len=6), DIMENSION(0:nd-1), PARAMETER     :: dirname = (/ '_roof ', '_south', '_north', '_west ', '_east ' /)
1262        INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER         :: dirint = (/ iup_u, isouth_u, inorth_u, iwest_u, ieast_u /)
1263
1264!--     find the real name of the variable
1265        ids = -1
1266        var = TRIM(variable)
1267        DO i = 0, nd-1
1268            k = len(TRIM(var))
1269            j = len(TRIM(dirname(i)))
1270            IF ( var(k-j+1:k) == dirname(i) )  THEN
1271                ids = i
1272                idsint = dirint(ids)
1273                var = var(:k-j)
1274                EXIT
1275            ENDIF
1276        ENDDO
1277        IF ( ids == -1 )  THEN
1278            var = TRIM(variable)
1279        ENDIF
1280        IF ( var(1:11) == 'usm_t_wall_'  .AND.  len(TRIM(var)) >= 12 )  THEN
1281!--          wall layers
1282            READ(var(12:12), '(I1)', iostat=istat ) iwl
1283            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1284                var = var(1:10)
1285            ELSE
1286!--             wrong wall layer index
1287                RETURN
1288            ENDIF
1289        ENDIF
1290        IF ( var(1:13) == 'usm_t_window_'  .AND.  len(TRIM(var)) >= 14 )  THEN
1291!--          wall layers
1292            READ(var(14:14), '(I1)', iostat=istat ) iwl
1293            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1294                var = var(1:12)
1295            ELSE
1296!--             wrong window layer index
1297                RETURN
1298            ENDIF
1299        ENDIF
1300        IF ( var(1:12) == 'usm_t_green_'  .AND.  len(TRIM(var)) >= 13 )  THEN
1301!--          wall layers
1302            READ(var(13:13), '(I1)', iostat=istat ) iwl
1303            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1304                var = var(1:11)
1305            ELSE
1306!--             wrong green layer index
1307                RETURN
1308            ENDIF
1309        ENDIF
1310
1311        IF ( mode == 'allocate' )  THEN
1312           
1313           SELECT CASE ( TRIM( var ) )
1314               
1315                CASE ( 'usm_rad_net' )
1316!--                 array of complete radiation balance
1317                    IF ( .NOT.  ALLOCATED(surf_usm_h%rad_net_av) )  THEN
1318                        ALLOCATE( surf_usm_h%rad_net_av(1:surf_usm_h%ns) )
1319                        surf_usm_h%rad_net_av = 0.0_wp
1320                    ENDIF
1321                    DO  l = 0, 3
1322                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%rad_net_av) )  THEN
1323                           ALLOCATE( surf_usm_v(l)%rad_net_av(1:surf_usm_v(l)%ns) )
1324                           surf_usm_v(l)%rad_net_av = 0.0_wp
1325                       ENDIF
1326                    ENDDO
1327                   
1328                CASE ( 'usm_rad_insw' )
1329!--                 array of sw radiation falling to surface after i-th reflection
1330                    IF ( .NOT.  ALLOCATED(surfinsw_av) )  THEN
1331                        ALLOCATE( surfinsw_av(nsurfl) )
1332                        surfinsw_av = 0.0_wp
1333                    ENDIF
1334
1335                CASE ( 'usm_rad_inlw' )
1336!--                 array of lw radiation falling to surface after i-th reflection
1337                    IF ( .NOT.  ALLOCATED(surfinlw_av) )  THEN
1338                        ALLOCATE( surfinlw_av(nsurfl) )
1339                        surfinlw_av = 0.0_wp
1340                    ENDIF
1341
1342                CASE ( 'usm_rad_inswdir' )
1343!--                 array of direct sw radiation falling to surface from sun
1344                    IF ( .NOT.  ALLOCATED(surfinswdir_av) )  THEN
1345                        ALLOCATE( surfinswdir_av(nsurfl) )
1346                        surfinswdir_av = 0.0_wp
1347                    ENDIF
1348
1349                CASE ( 'usm_rad_inswdif' )
1350!--                 array of difusion sw radiation falling to surface from sky and borders of the domain
1351                    IF ( .NOT.  ALLOCATED(surfinswdif_av) )  THEN
1352                        ALLOCATE( surfinswdif_av(nsurfl) )
1353                        surfinswdif_av = 0.0_wp
1354                    ENDIF
1355
1356                CASE ( 'usm_rad_inswref' )
1357!--                 array of sw radiation falling to surface from reflections
1358                    IF ( .NOT.  ALLOCATED(surfinswref_av) )  THEN
1359                        ALLOCATE( surfinswref_av(nsurfl) )
1360                        surfinswref_av = 0.0_wp
1361                    ENDIF
1362
1363                CASE ( 'usm_rad_inlwdif' )
1364!--                 array of sw radiation falling to surface after i-th reflection
1365                   IF ( .NOT.  ALLOCATED(surfinlwdif_av) )  THEN
1366                        ALLOCATE( surfinlwdif_av(nsurfl) )
1367                        surfinlwdif_av = 0.0_wp
1368                    ENDIF
1369
1370                CASE ( 'usm_rad_inlwref' )
1371!--                 array of lw radiation falling to surface from reflections
1372                    IF ( .NOT.  ALLOCATED(surfinlwref_av) )  THEN
1373                        ALLOCATE( surfinlwref_av(nsurfl) )
1374                        surfinlwref_av = 0.0_wp
1375                    ENDIF
1376
1377                CASE ( 'usm_rad_outsw' )
1378!--                 array of sw radiation emitted from surface after i-th reflection
1379                    IF ( .NOT.  ALLOCATED(surfoutsw_av) )  THEN
1380                        ALLOCATE( surfoutsw_av(nsurfl) )
1381                        surfoutsw_av = 0.0_wp
1382                    ENDIF
1383
1384                CASE ( 'usm_rad_outlw' )
1385!--                 array of lw radiation emitted from surface after i-th reflection
1386                    IF ( .NOT.  ALLOCATED(surfoutlw_av) )  THEN
1387                        ALLOCATE( surfoutlw_av(nsurfl) )
1388                        surfoutlw_av = 0.0_wp
1389                    ENDIF
1390                CASE ( 'usm_rad_ressw' )
1391!--                 array of residua of sw radiation absorbed in surface after last reflection
1392                    IF ( .NOT.  ALLOCATED(surfins_av) )  THEN
1393                        ALLOCATE( surfins_av(nsurfl) )
1394                        surfins_av = 0.0_wp
1395                    ENDIF
1396                                   
1397                CASE ( 'usm_rad_reslw' )
1398!--                 array of residua of lw radiation absorbed in surface after last reflection
1399                    IF ( .NOT.  ALLOCATED(surfinl_av) )  THEN
1400                        ALLOCATE( surfinl_av(nsurfl) )
1401                        surfinl_av = 0.0_wp
1402                    ENDIF
1403                                   
1404                CASE ( 'usm_rad_hf' )
1405!--                 array of heat flux from radiation for surfaces after i-th reflection
1406                    IF ( .NOT.  ALLOCATED(surf_usm_h%surfhf_av) )  THEN
1407                        ALLOCATE( surf_usm_h%surfhf_av(1:surf_usm_h%ns) )
1408                        surf_usm_h%surfhf_av = 0.0_wp
1409                    ENDIF
1410                    DO  l = 0, 3
1411                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%surfhf_av) )  THEN
1412                           ALLOCATE( surf_usm_v(l)%surfhf_av(1:surf_usm_v(l)%ns) )
1413                           surf_usm_v(l)%surfhf_av = 0.0_wp
1414                       ENDIF
1415                    ENDDO
1416
1417                CASE ( 'usm_wshf' )
1418!--                 array of sensible heat flux from surfaces
1419!--                 land surfaces
1420                    IF ( .NOT.  ALLOCATED(surf_usm_h%wshf_eb_av) )  THEN
1421                        ALLOCATE( surf_usm_h%wshf_eb_av(1:surf_usm_h%ns) )
1422                        surf_usm_h%wshf_eb_av = 0.0_wp
1423                    ENDIF
1424                    DO  l = 0, 3
1425                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%wshf_eb_av) )  THEN
1426                           ALLOCATE( surf_usm_v(l)%wshf_eb_av(1:surf_usm_v(l)%ns) )
1427                           surf_usm_v(l)%wshf_eb_av = 0.0_wp
1428                       ENDIF
1429                    ENDDO
1430!
1431!--             Please note, the following output quantities belongs to the
1432!--             individual tile fractions - ground heat flux at wall-, window-,
1433!--             and green fraction. Aggregated ground-heat flux is treated
1434!--             accordingly in average_3d_data, sum_up_3d_data, etc..
1435                CASE ( 'usm_wghf' )
1436!--                 array of heat flux from ground (wall, roof, land)
1437                    IF ( .NOT.  ALLOCATED(surf_usm_h%wghf_eb_av) )  THEN
1438                        ALLOCATE( surf_usm_h%wghf_eb_av(1:surf_usm_h%ns) )
1439                        surf_usm_h%wghf_eb_av = 0.0_wp
1440                    ENDIF
1441                    DO  l = 0, 3
1442                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%wghf_eb_av) )  THEN
1443                           ALLOCATE( surf_usm_v(l)%wghf_eb_av(1:surf_usm_v(l)%ns) )
1444                           surf_usm_v(l)%wghf_eb_av = 0.0_wp
1445                       ENDIF
1446                    ENDDO
1447
1448                CASE ( 'usm_wghf_window' )
1449!--                 array of heat flux from window ground (wall, roof, land)
1450                    IF ( .NOT.  ALLOCATED(surf_usm_h%wghf_eb_window_av) )  THEN
1451                        ALLOCATE( surf_usm_h%wghf_eb_window_av(1:surf_usm_h%ns) )
1452                        surf_usm_h%wghf_eb_window_av = 0.0_wp
1453                    ENDIF
1454                    DO  l = 0, 3
1455                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%wghf_eb_window_av) )  THEN
1456                           ALLOCATE( surf_usm_v(l)%wghf_eb_window_av(1:surf_usm_v(l)%ns) )
1457                           surf_usm_v(l)%wghf_eb_window_av = 0.0_wp
1458                       ENDIF
1459                    ENDDO
1460
1461                CASE ( 'usm_wghf_green' )
1462!--                 array of heat flux from green ground (wall, roof, land)
1463                    IF ( .NOT.  ALLOCATED(surf_usm_h%wghf_eb_green_av) )  THEN
1464                        ALLOCATE( surf_usm_h%wghf_eb_green_av(1:surf_usm_h%ns) )
1465                        surf_usm_h%wghf_eb_green_av = 0.0_wp
1466                    ENDIF
1467                    DO  l = 0, 3
1468                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%wghf_eb_green_av) )  THEN
1469                           ALLOCATE( surf_usm_v(l)%wghf_eb_green_av(1:surf_usm_v(l)%ns) )
1470                           surf_usm_v(l)%wghf_eb_green_av = 0.0_wp
1471                       ENDIF
1472                    ENDDO
1473
1474                CASE ( 'usm_iwghf' )
1475!--                 array of heat flux from indoor ground (wall, roof, land)
1476                    IF ( .NOT.  ALLOCATED(surf_usm_h%iwghf_eb_av) )  THEN
1477                        ALLOCATE( surf_usm_h%iwghf_eb_av(1:surf_usm_h%ns) )
1478                        surf_usm_h%iwghf_eb_av = 0.0_wp
1479                    ENDIF
1480                    DO  l = 0, 3
1481                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%iwghf_eb_av) )  THEN
1482                           ALLOCATE( surf_usm_v(l)%iwghf_eb_av(1:surf_usm_v(l)%ns) )
1483                           surf_usm_v(l)%iwghf_eb_av = 0.0_wp
1484                       ENDIF
1485                    ENDDO
1486
1487                CASE ( 'usm_iwghf_window' )
1488!--                 array of heat flux from indoor window ground (wall, roof, land)
1489                    IF ( .NOT.  ALLOCATED(surf_usm_h%iwghf_eb_window_av) )  THEN
1490                        ALLOCATE( surf_usm_h%iwghf_eb_window_av(1:surf_usm_h%ns) )
1491                        surf_usm_h%iwghf_eb_window_av = 0.0_wp
1492                    ENDIF
1493                    DO  l = 0, 3
1494                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%iwghf_eb_window_av) )  THEN
1495                           ALLOCATE( surf_usm_v(l)%iwghf_eb_window_av(1:surf_usm_v(l)%ns) )
1496                           surf_usm_v(l)%iwghf_eb_window_av = 0.0_wp
1497                       ENDIF
1498                    ENDDO
1499                   
1500                CASE ( 'usm_t_surf' )
1501!--                 surface temperature for surfaces
1502                    IF ( .NOT.  ALLOCATED(surf_usm_h%t_surf_av) )  THEN
1503                        ALLOCATE( surf_usm_h%t_surf_av(1:surf_usm_h%ns) )
1504                        surf_usm_h%t_surf_av = 0.0_wp
1505                    ENDIF
1506                    DO  l = 0, 3
1507                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_surf_av) )  THEN
1508                           ALLOCATE( surf_usm_v(l)%t_surf_av(1:surf_usm_v(l)%ns) )
1509                           surf_usm_v(l)%t_surf_av = 0.0_wp
1510                       ENDIF
1511                    ENDDO
1512
1513                CASE ( 'usm_t_surf_window' )
1514!--                 surface temperature for window surfaces
1515                    IF ( .NOT.  ALLOCATED(surf_usm_h%t_surf_window_av) )  THEN
1516                        ALLOCATE( surf_usm_h%t_surf_window_av(1:surf_usm_h%ns) )
1517                        surf_usm_h%t_surf_window_av = 0.0_wp
1518                    ENDIF
1519                    DO  l = 0, 3
1520                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_surf_window_av) )  THEN
1521                           ALLOCATE( surf_usm_v(l)%t_surf_window_av(1:surf_usm_v(l)%ns) )
1522                           surf_usm_v(l)%t_surf_window_av = 0.0_wp
1523                       ENDIF
1524                    ENDDO
1525                   
1526                CASE ( 'usm_t_surf_green' )
1527!--                 surface temperature for green surfaces
1528                    IF ( .NOT.  ALLOCATED(surf_usm_h%t_surf_green_av) )  THEN
1529                        ALLOCATE( surf_usm_h%t_surf_green_av(1:surf_usm_h%ns) )
1530                        surf_usm_h%t_surf_green_av = 0.0_wp
1531                    ENDIF
1532                    DO  l = 0, 3
1533                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_surf_green_av) )  THEN
1534                           ALLOCATE( surf_usm_v(l)%t_surf_green_av(1:surf_usm_v(l)%ns) )
1535                           surf_usm_v(l)%t_surf_green_av = 0.0_wp
1536                       ENDIF
1537                    ENDDO
1538               
1539                CASE ( 'usm_t_surf_10cm' )
1540!--                 near surface temperature for whole surfaces
1541                    IF ( .NOT.  ALLOCATED(surf_usm_h%t_surf_10cm_av) )  THEN
1542                        ALLOCATE( surf_usm_h%t_surf_10cm_av(1:surf_usm_h%ns) )
1543                        surf_usm_h%t_surf_10cm_av = 0.0_wp
1544                    ENDIF
1545                    DO  l = 0, 3
1546                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_surf_10cm_av) )  THEN
1547                           ALLOCATE( surf_usm_v(l)%t_surf_10cm_av(1:surf_usm_v(l)%ns) )
1548                           surf_usm_v(l)%t_surf_10cm_av = 0.0_wp
1549                       ENDIF
1550                    ENDDO
1551
1552                CASE ( 'usm_t_wall' )
1553!--                 wall temperature for iwl layer of walls and land
1554                    IF ( .NOT.  ALLOCATED(surf_usm_h%t_wall_av) )  THEN
1555                        ALLOCATE( surf_usm_h%t_wall_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1556                        surf_usm_h%t_wall_av = 0.0_wp
1557                    ENDIF
1558                    DO  l = 0, 3
1559                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_wall_av) )  THEN
1560                           ALLOCATE( surf_usm_v(l)%t_wall_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1561                           surf_usm_v(l)%t_wall_av = 0.0_wp
1562                       ENDIF
1563                    ENDDO
1564
1565                CASE ( 'usm_t_window' )
1566!--                 window temperature for iwl layer of walls and land
1567                    IF ( .NOT.  ALLOCATED(surf_usm_h%t_window_av) )  THEN
1568                        ALLOCATE( surf_usm_h%t_window_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1569                        surf_usm_h%t_window_av = 0.0_wp
1570                    ENDIF
1571                    DO  l = 0, 3
1572                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_window_av) )  THEN
1573                           ALLOCATE( surf_usm_v(l)%t_window_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1574                           surf_usm_v(l)%t_window_av = 0.0_wp
1575                       ENDIF
1576                    ENDDO
1577
1578                CASE ( 'usm_t_green' )
1579!--                 green temperature for iwl layer of walls and land
1580                    IF ( .NOT.  ALLOCATED(surf_usm_h%t_green_av) )  THEN
1581                        ALLOCATE( surf_usm_h%t_green_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1582                        surf_usm_h%t_green_av = 0.0_wp
1583                    ENDIF
1584                    DO  l = 0, 3
1585                       IF ( .NOT.  ALLOCATED(surf_usm_v(l)%t_green_av) )  THEN
1586                           ALLOCATE( surf_usm_v(l)%t_green_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1587                           surf_usm_v(l)%t_green_av = 0.0_wp
1588                       ENDIF
1589                    ENDDO
1590
1591               CASE DEFAULT
1592                   CONTINUE
1593
1594           END SELECT
1595
1596        ELSEIF ( mode == 'sum' )  THEN
1597           
1598           SELECT CASE ( TRIM( var ) )
1599               
1600                CASE ( 'usm_rad_net' )
1601!--                 array of complete radiation balance
1602                    DO  m = 1, surf_usm_h%ns
1603                       surf_usm_h%rad_net_av(m) =                              &
1604                                          surf_usm_h%rad_net_av(m) +           &
1605                                          surf_usm_h%rad_net_l(m)
1606                    ENDDO
1607                    DO  l = 0, 3
1608                       DO  m = 1, surf_usm_v(l)%ns
1609                          surf_usm_v(l)%rad_net_av(m) =                        &
1610                                          surf_usm_v(l)%rad_net_av(m) +        &
1611                                          surf_usm_v(l)%rad_net_l(m)
1612                       ENDDO
1613                    ENDDO
1614                   
1615                CASE ( 'usm_rad_insw' )
1616!--                 array of sw radiation falling to surface after i-th reflection
1617                    DO l = 1, nsurfl
1618                        IF ( surfl(id,l) == idsint )  THEN
1619                            surfinsw_av(l) = surfinsw_av(l) + surfinsw(l)
1620                        ENDIF
1621                    ENDDO
1622                             
1623                CASE ( 'usm_rad_inlw' )
1624!--                 array of lw radiation falling to surface after i-th reflection
1625                    DO l = 1, nsurfl
1626                        IF ( surfl(id,l) == idsint )  THEN
1627                            surfinlw_av(l) = surfinlw_av(l) + surfinlw(l)
1628                        ENDIF
1629                    ENDDO
1630                   
1631                CASE ( 'usm_rad_inswdir' )
1632!--                 array of direct sw radiation falling to surface from sun
1633                    DO l = 1, nsurfl
1634                        IF ( surfl(id,l) == idsint )  THEN
1635                            surfinswdir_av(l) = surfinswdir_av(l) + surfinswdir(l)
1636                        ENDIF
1637                    ENDDO
1638                   
1639                CASE ( 'usm_rad_inswdif' )
1640!--                 array of difusion sw radiation falling to surface from sky and borders of the domain
1641                    DO l = 1, nsurfl
1642                        IF ( surfl(id,l) == idsint )  THEN
1643                            surfinswdif_av(l) = surfinswdif_av(l) + surfinswdif(l)
1644                        ENDIF
1645                    ENDDO
1646                   
1647                CASE ( 'usm_rad_inswref' )
1648!--                 array of sw radiation falling to surface from reflections
1649                    DO l = 1, nsurfl
1650                        IF ( surfl(id,l) == idsint )  THEN
1651                            surfinswref_av(l) = surfinswref_av(l) + surfinsw(l) - &
1652                                                surfinswdir(l) - surfinswdif(l)
1653                        ENDIF
1654                    ENDDO
1655
1656                   
1657                CASE ( 'usm_rad_inlwdif' )
1658!--                 array of sw radiation falling to surface after i-th reflection
1659                    DO l = 1, nsurfl
1660                        IF ( surfl(id,l) == idsint )  THEN
1661                            surfinlwdif_av(l) = surfinlwdif_av(l) + surfinlwdif(l)
1662                        ENDIF
1663                    ENDDO
1664!                     
1665                CASE ( 'usm_rad_inlwref' )
1666!--                 array of lw radiation falling to surface from reflections
1667                    DO l = 1, nsurfl
1668                        IF ( surfl(id,l) == idsint )  THEN
1669                            surfinlwref_av(l) = surfinlwref_av(l) + &
1670                                                surfinlw(l) - surfinlwdif(l)
1671                        ENDIF
1672                    ENDDO
1673                   
1674                CASE ( 'usm_rad_outsw' )
1675!--                 array of sw radiation emitted from surface after i-th reflection
1676                    DO l = 1, nsurfl
1677                        IF ( surfl(id,l) == idsint )  THEN
1678                            surfoutsw_av(l) = surfoutsw_av(l) + surfoutsw(l)
1679                        ENDIF
1680                    ENDDO
1681                   
1682                CASE ( 'usm_rad_outlw' )
1683!--                 array of lw radiation emitted from surface after i-th reflection
1684                    DO l = 1, nsurfl
1685                        IF ( surfl(id,l) == idsint )  THEN
1686                            surfoutlw_av(l) = surfoutlw_av(l) + surfoutlw(l)
1687                        ENDIF
1688                    ENDDO
1689                   
1690                CASE ( 'usm_rad_ressw' )
1691!--                 array of residua of sw radiation absorbed in surface after last reflection
1692                    DO l = 1, nsurfl
1693                        IF ( surfl(id,l) == idsint )  THEN
1694                            surfins_av(l) = surfins_av(l) + surfins(l)
1695                        ENDIF
1696                    ENDDO
1697                                   
1698                CASE ( 'usm_rad_reslw' )
1699!--                 array of residua of lw radiation absorbed in surface after last reflection
1700                    DO l = 1, nsurfl
1701                        IF ( surfl(id,l) == idsint )  THEN
1702                            surfinl_av(l) = surfinl_av(l) + surfinl(l)
1703                        ENDIF
1704                    ENDDO
1705                   
1706                CASE ( 'usm_rad_hf' )
1707!--                 array of heat flux from radiation for surfaces after i-th reflection
1708                    DO  m = 1, surf_usm_h%ns
1709                       surf_usm_h%surfhf_av(m) =                               &
1710                                          surf_usm_h%surfhf_av(m) +            &
1711                                          surf_usm_h%surfhf(m)
1712                    ENDDO
1713                    DO  l = 0, 3
1714                       DO  m = 1, surf_usm_v(l)%ns
1715                          surf_usm_v(l)%surfhf_av(m) =                         &
1716                                          surf_usm_v(l)%surfhf_av(m) +         &
1717                                          surf_usm_v(l)%surfhf(m)
1718                       ENDDO
1719                    ENDDO
1720                   
1721                CASE ( 'usm_wshf' )
1722!--                 array of sensible heat flux from surfaces (land, roof, wall)
1723                    DO  m = 1, surf_usm_h%ns
1724                       surf_usm_h%wshf_eb_av(m) =                              &
1725                                          surf_usm_h%wshf_eb_av(m) +           &
1726                                          surf_usm_h%wshf_eb(m)
1727                    ENDDO
1728                    DO  l = 0, 3
1729                       DO  m = 1, surf_usm_v(l)%ns
1730                          surf_usm_v(l)%wshf_eb_av(m) =                        &
1731                                          surf_usm_v(l)%wshf_eb_av(m) +        &
1732                                          surf_usm_v(l)%wshf_eb(m)
1733                       ENDDO
1734                    ENDDO
1735                   
1736                CASE ( 'usm_wghf' )
1737!--                 array of heat flux from ground (wall, roof, land)
1738                    DO  m = 1, surf_usm_h%ns
1739                       surf_usm_h%wghf_eb_av(m) =                              &
1740                                          surf_usm_h%wghf_eb_av(m) +           &
1741                                          surf_usm_h%wghf_eb(m)
1742                    ENDDO
1743                    DO  l = 0, 3
1744                       DO  m = 1, surf_usm_v(l)%ns
1745                          surf_usm_v(l)%wghf_eb_av(m) =                        &
1746                                          surf_usm_v(l)%wghf_eb_av(m) +        &
1747                                          surf_usm_v(l)%wghf_eb(m)
1748                       ENDDO
1749                    ENDDO
1750                   
1751                CASE ( 'usm_wghf_window' )
1752!--                 array of heat flux from window ground (wall, roof, land)
1753                    DO  m = 1, surf_usm_h%ns
1754                       surf_usm_h%wghf_eb_window_av(m) =                              &
1755                                          surf_usm_h%wghf_eb_window_av(m) +           &
1756                                          surf_usm_h%wghf_eb_window(m)
1757                    ENDDO
1758                    DO  l = 0, 3
1759                       DO  m = 1, surf_usm_v(l)%ns
1760                          surf_usm_v(l)%wghf_eb_window_av(m) =                        &
1761                                          surf_usm_v(l)%wghf_eb_window_av(m) +        &
1762                                          surf_usm_v(l)%wghf_eb_window(m)
1763                       ENDDO
1764                    ENDDO
1765
1766                CASE ( 'usm_wghf_green' )
1767!--                 array of heat flux from green ground (wall, roof, land)
1768                    DO  m = 1, surf_usm_h%ns
1769                       surf_usm_h%wghf_eb_green_av(m) =                              &
1770                                          surf_usm_h%wghf_eb_green_av(m) +           &
1771                                          surf_usm_h%wghf_eb_green(m)
1772                    ENDDO
1773                    DO  l = 0, 3
1774                       DO  m = 1, surf_usm_v(l)%ns
1775                          surf_usm_v(l)%wghf_eb_green_av(m) =                        &
1776                                          surf_usm_v(l)%wghf_eb_green_av(m) +        &
1777                                          surf_usm_v(l)%wghf_eb_green(m)
1778                       ENDDO
1779                    ENDDO
1780                   
1781                CASE ( 'usm_iwghf' )
1782!--                 array of heat flux from indoor ground (wall, roof, land)
1783                    DO  m = 1, surf_usm_h%ns
1784                       surf_usm_h%iwghf_eb_av(m) =                              &
1785                                          surf_usm_h%iwghf_eb_av(m) +           &
1786                                          surf_usm_h%iwghf_eb(m)
1787                    ENDDO
1788                    DO  l = 0, 3
1789                       DO  m = 1, surf_usm_v(l)%ns
1790                          surf_usm_v(l)%iwghf_eb_av(m) =                        &
1791                                          surf_usm_v(l)%iwghf_eb_av(m) +        &
1792                                          surf_usm_v(l)%iwghf_eb(m)
1793                       ENDDO
1794                    ENDDO
1795                   
1796                CASE ( 'usm_iwghf_window' )
1797!--                 array of heat flux from indoor window ground (wall, roof, land)
1798                    DO  m = 1, surf_usm_h%ns
1799                       surf_usm_h%iwghf_eb_window_av(m) =                              &
1800                                          surf_usm_h%iwghf_eb_window_av(m) +           &
1801                                          surf_usm_h%iwghf_eb_window(m)
1802                    ENDDO
1803                    DO  l = 0, 3
1804                       DO  m = 1, surf_usm_v(l)%ns
1805                          surf_usm_v(l)%iwghf_eb_window_av(m) =                        &
1806                                          surf_usm_v(l)%iwghf_eb_window_av(m) +        &
1807                                          surf_usm_v(l)%iwghf_eb_window(m)
1808                       ENDDO
1809                    ENDDO
1810                   
1811                CASE ( 'usm_t_surf' )
1812!--                 surface temperature for surfaces
1813                    DO  m = 1, surf_usm_h%ns
1814                       surf_usm_h%t_surf_av(m) =                               & 
1815                                          surf_usm_h%t_surf_av(m) +            &
1816                                          t_surf_h(m)
1817                    ENDDO
1818                    DO  l = 0, 3
1819                       DO  m = 1, surf_usm_v(l)%ns
1820                          surf_usm_v(l)%t_surf_av(m) =                         &
1821                                          surf_usm_v(l)%t_surf_av(m) +         &
1822                                          t_surf_v(l)%t(m)
1823                       ENDDO
1824                    ENDDO
1825                   
1826                CASE ( 'usm_t_surf_window' )
1827!--                 surface temperature for window surfaces
1828                    DO  m = 1, surf_usm_h%ns
1829                       surf_usm_h%t_surf_window_av(m) =                               & 
1830                                          surf_usm_h%t_surf_window_av(m) +            &
1831                                          t_surf_window_h(m)
1832                    ENDDO
1833                    DO  l = 0, 3
1834                       DO  m = 1, surf_usm_v(l)%ns
1835                          surf_usm_v(l)%t_surf_window_av(m) =                         &
1836                                          surf_usm_v(l)%t_surf_window_av(m) +         &
1837                                          t_surf_window_v(l)%t(m)
1838                       ENDDO
1839                    ENDDO
1840                   
1841                CASE ( 'usm_t_surf_green' )
1842!--                 surface temperature for green surfaces
1843                    DO  m = 1, surf_usm_h%ns
1844                       surf_usm_h%t_surf_green_av(m) =                               & 
1845                                          surf_usm_h%t_surf_green_av(m) +            &
1846                                          t_surf_green_h(m)
1847                    ENDDO
1848                    DO  l = 0, 3
1849                       DO  m = 1, surf_usm_v(l)%ns
1850                          surf_usm_v(l)%t_surf_green_av(m) =                         &
1851                                          surf_usm_v(l)%t_surf_green_av(m) +         &
1852                                          t_surf_green_v(l)%t(m)
1853                       ENDDO
1854                    ENDDO
1855               
1856                CASE ( 'usm_t_surf_10cm' )
1857!--                 near surface temperature for whole surfaces
1858                    DO  m = 1, surf_usm_h%ns
1859                       surf_usm_h%t_surf_10cm_av(m) =                               & 
1860                                          surf_usm_h%t_surf_10cm_av(m) +            &
1861                                          t_surf_10cm_h(m)
1862                    ENDDO
1863                    DO  l = 0, 3
1864                       DO  m = 1, surf_usm_v(l)%ns
1865                          surf_usm_v(l)%t_surf_10cm_av(m) =                         &
1866                                          surf_usm_v(l)%t_surf_10cm_av(m) +         &
1867                                          t_surf_10cm_v(l)%t(m)
1868                       ENDDO
1869                    ENDDO
1870
1871                   
1872                CASE ( 'usm_t_wall' )
1873!--                 wall temperature for  iwl layer of walls and land
1874                    DO  m = 1, surf_usm_h%ns
1875                       surf_usm_h%t_wall_av(iwl,m) =                           &
1876                                          surf_usm_h%t_wall_av(iwl,m) +        &
1877                                          t_wall_h(iwl,m)
1878                    ENDDO
1879                    DO  l = 0, 3
1880                       DO  m = 1, surf_usm_v(l)%ns
1881                          surf_usm_v(l)%t_wall_av(iwl,m) =                     &
1882                                          surf_usm_v(l)%t_wall_av(iwl,m) +     &
1883                                          t_wall_v(l)%t(iwl,m)
1884                       ENDDO
1885                    ENDDO
1886                   
1887                CASE ( 'usm_t_window' )
1888!--                 window temperature for  iwl layer of walls and land
1889                    DO  m = 1, surf_usm_h%ns
1890                       surf_usm_h%t_window_av(iwl,m) =                           &
1891                                          surf_usm_h%t_window_av(iwl,m) +        &
1892                                          t_window_h(iwl,m)
1893                    ENDDO
1894                    DO  l = 0, 3
1895                       DO  m = 1, surf_usm_v(l)%ns
1896                          surf_usm_v(l)%t_window_av(iwl,m) =                     &
1897                                          surf_usm_v(l)%t_window_av(iwl,m) +     &
1898                                          t_window_v(l)%t(iwl,m)
1899                       ENDDO
1900                    ENDDO
1901
1902                CASE ( 'usm_t_green' )
1903!--                 green temperature for  iwl layer of walls and land
1904                    DO  m = 1, surf_usm_h%ns
1905                       surf_usm_h%t_green_av(iwl,m) =                           &
1906                                          surf_usm_h%t_green_av(iwl,m) +        &
1907                                          t_green_h(iwl,m)
1908                    ENDDO
1909                    DO  l = 0, 3
1910                       DO  m = 1, surf_usm_v(l)%ns
1911                          surf_usm_v(l)%t_green_av(iwl,m) =                     &
1912                                          surf_usm_v(l)%t_green_av(iwl,m) +     &
1913                                          t_green_v(l)%t(iwl,m)
1914                       ENDDO
1915                    ENDDO
1916
1917                CASE DEFAULT
1918                    CONTINUE
1919
1920           END SELECT
1921
1922        ELSEIF ( mode == 'average' )  THEN
1923           
1924           SELECT CASE ( TRIM( var ) )
1925               
1926                CASE ( 'usm_rad_net' )
1927!--                 array of complete radiation balance
1928                    DO  m = 1, surf_usm_h%ns
1929                       surf_usm_h%rad_net_av(m) =                              &
1930                                          surf_usm_h%rad_net_av(m) /           &
1931                                          REAL( average_count_3d, kind=wp )
1932                    ENDDO
1933                    DO  l = 0, 3
1934                       DO  m = 1, surf_usm_v(l)%ns
1935                          surf_usm_v(l)%rad_net_av(m) =                        &
1936                                          surf_usm_v(l)%rad_net_av(m) /        &
1937                                          REAL( average_count_3d, kind=wp )
1938                       ENDDO
1939                    ENDDO
1940                   
1941                CASE ( 'usm_rad_insw' )
1942!--                 array of sw radiation falling to surface after i-th reflection
1943                    DO l = 1, nsurfl
1944                        IF ( surfl(id,l) == idsint )  THEN
1945                            surfinsw_av(l) = surfinsw_av(l) / REAL( average_count_3d, kind=wp )
1946                        ENDIF
1947                    ENDDO
1948                             
1949                CASE ( 'usm_rad_inlw' )
1950!--                 array of lw radiation falling to surface after i-th reflection
1951                    DO l = 1, nsurfl
1952                        IF ( surfl(id,l) == idsint )  THEN
1953                            surfinlw_av(l) = surfinlw_av(l) / REAL( average_count_3d, kind=wp )
1954                        ENDIF
1955                    ENDDO
1956                   
1957                CASE ( 'usm_rad_inswdir' )
1958!--                 array of direct sw radiation falling to surface from sun
1959                    DO l = 1, nsurfl
1960                        IF ( surfl(id,l) == idsint )  THEN
1961                            surfinswdir_av(l) = surfinswdir_av(l) / REAL( average_count_3d, kind=wp )
1962                        ENDIF
1963                    ENDDO
1964                   
1965                CASE ( 'usm_rad_inswdif' )
1966!--                 array of difusion sw radiation falling to surface from sky and borders of the domain
1967                    DO l = 1, nsurfl
1968                        IF ( surfl(id,l) == idsint )  THEN
1969                            surfinswdif_av(l) = surfinswdif_av(l) / REAL( average_count_3d, kind=wp )
1970                        ENDIF
1971                    ENDDO
1972                   
1973                CASE ( 'usm_rad_inswref' )
1974!--                 array of sw radiation falling to surface from reflections
1975                    DO l = 1, nsurfl
1976                        IF ( surfl(id,l) == idsint )  THEN
1977                            surfinswref_av(l) = surfinswref_av(l) / REAL( average_count_3d, kind=wp )
1978                        ENDIF
1979                    ENDDO
1980                   
1981                CASE ( 'usm_rad_inlwdif' )
1982!--                 array of sw radiation falling to surface after i-th reflection
1983                    DO l = 1, nsurfl
1984                        IF ( surfl(id,l) == idsint )  THEN
1985                            surfinlwdif_av(l) = surfinlwdif_av(l) / REAL( average_count_3d, kind=wp )
1986                        ENDIF
1987                    ENDDO
1988                   
1989                CASE ( 'usm_rad_inlwref' )
1990!--                 array of lw radiation falling to surface from reflections
1991                    DO l = 1, nsurfl
1992                        IF ( surfl(id,l) == idsint )  THEN
1993                            surfinlwref_av(l) = surfinlwref_av(l) / REAL( average_count_3d, kind=wp )
1994                        ENDIF
1995                    ENDDO
1996                   
1997                CASE ( 'usm_rad_outsw' )
1998!--                 array of sw radiation emitted from surface after i-th reflection
1999                    DO l = 1, nsurfl
2000                        IF ( surfl(id,l) == idsint )  THEN
2001                            surfoutsw_av(l) = surfoutsw_av(l) / REAL( average_count_3d, kind=wp )
2002                        ENDIF
2003                    ENDDO
2004                   
2005                CASE ( 'usm_rad_outlw' )
2006!--                 array of lw radiation emitted from surface after i-th reflection
2007                    DO l = 1, nsurfl
2008                        IF ( surfl(id,l) == idsint )  THEN
2009                            surfoutlw_av(l) = surfoutlw_av(l) / REAL( average_count_3d, kind=wp )
2010                        ENDIF
2011                    ENDDO
2012                   
2013                CASE ( 'usm_rad_ressw' )
2014!--                 array of residua of sw radiation absorbed in surface after last reflection
2015                    DO l = 1, nsurfl
2016                        IF ( surfl(id,l) == idsint )  THEN
2017                            surfins_av(l) = surfins_av(l) / REAL( average_count_3d, kind=wp )
2018                        ENDIF
2019                    ENDDO
2020                                   
2021                CASE ( 'usm_rad_reslw' )
2022!--                 array of residua of lw radiation absorbed in surface after last reflection
2023                    DO l = 1, nsurfl
2024                        IF ( surfl(id,l) == idsint )  THEN
2025                            surfinl_av(l) = surfinl_av(l) / REAL( average_count_3d, kind=wp )
2026                        ENDIF
2027                    ENDDO
2028                   
2029                CASE ( 'usm_rad_hf' )
2030!--                 array of heat flux from radiation for surfaces after i-th reflection
2031                    DO  m = 1, surf_usm_h%ns
2032                       surf_usm_h%surfhf_av(m) =                               &
2033                                          surf_usm_h%surfhf_av(m) /            &
2034                                          REAL( average_count_3d, kind=wp )
2035                    ENDDO
2036                    DO  l = 0, 3
2037                       DO  m = 1, surf_usm_v(l)%ns
2038                          surf_usm_v(l)%surfhf_av(m) =                         &
2039                                          surf_usm_v(l)%surfhf_av(m) /         &
2040                                          REAL( average_count_3d, kind=wp )
2041                       ENDDO
2042                    ENDDO
2043                   
2044                CASE ( 'usm_wshf' )
2045!--                 array of sensible heat flux from surfaces (land, roof, wall)
2046                    DO  m = 1, surf_usm_h%ns
2047                       surf_usm_h%wshf_eb_av(m) =                              &
2048                                          surf_usm_h%wshf_eb_av(m) /           &
2049                                          REAL( average_count_3d, kind=wp )
2050                    ENDDO
2051                    DO  l = 0, 3
2052                       DO  m = 1, surf_usm_v(l)%ns
2053                          surf_usm_v(l)%wshf_eb_av(m) =                        &
2054                                          surf_usm_v(l)%wshf_eb_av(m) /        &
2055                                          REAL( average_count_3d, kind=wp )
2056                       ENDDO
2057                    ENDDO
2058                   
2059                CASE ( 'usm_wghf' )
2060!--                 array of heat flux from ground (wall, roof, land)
2061                    DO  m = 1, surf_usm_h%ns
2062                       surf_usm_h%wghf_eb_av(m) =                              &
2063                                          surf_usm_h%wghf_eb_av(m) /           &
2064                                          REAL( average_count_3d, kind=wp )
2065                    ENDDO
2066                    DO  l = 0, 3
2067                       DO  m = 1, surf_usm_v(l)%ns
2068                          surf_usm_v(l)%wghf_eb_av(m) =                        &
2069                                          surf_usm_v(l)%wghf_eb_av(m) /        &
2070                                          REAL( average_count_3d, kind=wp )
2071                       ENDDO
2072                    ENDDO
2073                   
2074                CASE ( 'usm_wghf_window' )
2075!--                 array of heat flux from window ground (wall, roof, land)
2076                    DO  m = 1, surf_usm_h%ns
2077                       surf_usm_h%wghf_eb_window_av(m) =                              &
2078                                          surf_usm_h%wghf_eb_window_av(m) /           &
2079                                          REAL( average_count_3d, kind=wp )
2080                    ENDDO
2081                    DO  l = 0, 3
2082                       DO  m = 1, surf_usm_v(l)%ns
2083                          surf_usm_v(l)%wghf_eb_window_av(m) =                        &
2084                                          surf_usm_v(l)%wghf_eb_window_av(m) /        &
2085                                          REAL( average_count_3d, kind=wp )
2086                       ENDDO
2087                    ENDDO
2088
2089                CASE ( 'usm_wghf_green' )
2090!--                 array of heat flux from green ground (wall, roof, land)
2091                    DO  m = 1, surf_usm_h%ns
2092                       surf_usm_h%wghf_eb_green_av(m) =                              &
2093                                          surf_usm_h%wghf_eb_green_av(m) /           &
2094                                          REAL( average_count_3d, kind=wp )
2095                    ENDDO
2096                    DO  l = 0, 3
2097                       DO  m = 1, surf_usm_v(l)%ns
2098                          surf_usm_v(l)%wghf_eb_green_av(m) =                        &
2099                                          surf_usm_v(l)%wghf_eb_green_av(m) /        &
2100                                          REAL( average_count_3d, kind=wp )
2101                       ENDDO
2102                    ENDDO
2103
2104                CASE ( 'usm_iwghf' )
2105!--                 array of heat flux from indoor ground (wall, roof, land)
2106                    DO  m = 1, surf_usm_h%ns
2107                       surf_usm_h%iwghf_eb_av(m) =                              &
2108                                          surf_usm_h%iwghf_eb_av(m) /           &
2109                                          REAL( average_count_3d, kind=wp )
2110                    ENDDO
2111                    DO  l = 0, 3
2112                       DO  m = 1, surf_usm_v(l)%ns
2113                          surf_usm_v(l)%iwghf_eb_av(m) =                        &
2114                                          surf_usm_v(l)%iwghf_eb_av(m) /        &
2115                                          REAL( average_count_3d, kind=wp )
2116                       ENDDO
2117                    ENDDO
2118                   
2119                CASE ( 'usm_iwghf_window' )
2120!--                 array of heat flux from indoor window ground (wall, roof, land)
2121                    DO  m = 1, surf_usm_h%ns
2122                       surf_usm_h%iwghf_eb_window_av(m) =                              &
2123                                          surf_usm_h%iwghf_eb_window_av(m) /           &
2124                                          REAL( average_count_3d, kind=wp )
2125                    ENDDO
2126                    DO  l = 0, 3
2127                       DO  m = 1, surf_usm_v(l)%ns
2128                          surf_usm_v(l)%iwghf_eb_window_av(m) =                        &
2129                                          surf_usm_v(l)%iwghf_eb_window_av(m) /        &
2130                                          REAL( average_count_3d, kind=wp )
2131                       ENDDO
2132                    ENDDO
2133                   
2134                CASE ( 'usm_t_surf' )
2135!--                 surface temperature for surfaces
2136                    DO  m = 1, surf_usm_h%ns
2137                       surf_usm_h%t_surf_av(m) =                               & 
2138                                          surf_usm_h%t_surf_av(m) /            &
2139                                          REAL( average_count_3d, kind=wp )
2140                    ENDDO
2141                    DO  l = 0, 3
2142                       DO  m = 1, surf_usm_v(l)%ns
2143                          surf_usm_v(l)%t_surf_av(m) =                         &
2144                                          surf_usm_v(l)%t_surf_av(m) /         &
2145                                          REAL( average_count_3d, kind=wp )
2146                       ENDDO
2147                    ENDDO
2148                   
2149                CASE ( 'usm_t_surf_window' )
2150!--                 surface temperature for window surfaces
2151                    DO  m = 1, surf_usm_h%ns
2152                       surf_usm_h%t_surf_window_av(m) =                               & 
2153                                          surf_usm_h%t_surf_window_av(m) /            &
2154                                          REAL( average_count_3d, kind=wp )
2155                    ENDDO
2156                    DO  l = 0, 3
2157                       DO  m = 1, surf_usm_v(l)%ns
2158                          surf_usm_v(l)%t_surf_window_av(m) =                         &
2159                                          surf_usm_v(l)%t_surf_window_av(m) /         &
2160                                          REAL( average_count_3d, kind=wp )
2161                       ENDDO
2162                    ENDDO
2163                   
2164                CASE ( 'usm_t_surf_green' )
2165!--                 surface temperature for green surfaces
2166                    DO  m = 1, surf_usm_h%ns
2167                       surf_usm_h%t_surf_green_av(m) =                               & 
2168                                          surf_usm_h%t_surf_green_av(m) /            &
2169                                          REAL( average_count_3d, kind=wp )
2170                    ENDDO
2171                    DO  l = 0, 3
2172                       DO  m = 1, surf_usm_v(l)%ns
2173                          surf_usm_v(l)%t_surf_green_av(m) =                         &
2174                                          surf_usm_v(l)%t_surf_green_av(m) /         &
2175                                          REAL( average_count_3d, kind=wp )
2176                       ENDDO
2177                    ENDDO
2178                   
2179                CASE ( 'usm_t_surf_10cm' )
2180!--                 near surface temperature for whole surfaces
2181                    DO  m = 1, surf_usm_h%ns
2182                       surf_usm_h%t_surf_10cm_av(m) =                               & 
2183                                          surf_usm_h%t_surf_10cm_av(m) /            &
2184                                          REAL( average_count_3d, kind=wp )
2185                    ENDDO
2186                    DO  l = 0, 3
2187                       DO  m = 1, surf_usm_v(l)%ns
2188                          surf_usm_v(l)%t_surf_10cm_av(m) =                         &
2189                                          surf_usm_v(l)%t_surf_10cm_av(m) /         &
2190                                          REAL( average_count_3d, kind=wp )
2191                       ENDDO
2192                    ENDDO
2193                   
2194                CASE ( 'usm_t_wall' )
2195!--                 wall temperature for  iwl layer of walls and land
2196                    DO  m = 1, surf_usm_h%ns
2197                       surf_usm_h%t_wall_av(iwl,m) =                           &
2198                                          surf_usm_h%t_wall_av(iwl,m) /        &
2199                                          REAL( average_count_3d, kind=wp )
2200                    ENDDO
2201                    DO  l = 0, 3
2202                       DO  m = 1, surf_usm_v(l)%ns
2203                          surf_usm_v(l)%t_wall_av(iwl,m) =                     &
2204                                          surf_usm_v(l)%t_wall_av(iwl,m) /     &
2205                                          REAL( average_count_3d, kind=wp )
2206                       ENDDO
2207                    ENDDO
2208
2209                CASE ( 'usm_t_window' )
2210!--                 window temperature for  iwl layer of walls and land
2211                    DO  m = 1, surf_usm_h%ns
2212                       surf_usm_h%t_window_av(iwl,m) =                           &
2213                                          surf_usm_h%t_window_av(iwl,m) /        &
2214                                          REAL( average_count_3d, kind=wp )
2215                    ENDDO
2216                    DO  l = 0, 3
2217                       DO  m = 1, surf_usm_v(l)%ns
2218                          surf_usm_v(l)%t_window_av(iwl,m) =                     &
2219                                          surf_usm_v(l)%t_window_av(iwl,m) /     &
2220                                          REAL( average_count_3d, kind=wp )
2221                       ENDDO
2222                    ENDDO
2223
2224                CASE ( 'usm_t_green' )
2225!--                 green temperature for  iwl layer of walls and land
2226                    DO  m = 1, surf_usm_h%ns
2227                       surf_usm_h%t_green_av(iwl,m) =                           &
2228                                          surf_usm_h%t_green_av(iwl,m) /        &
2229                                          REAL( average_count_3d, kind=wp )
2230                    ENDDO
2231                    DO  l = 0, 3
2232                       DO  m = 1, surf_usm_v(l)%ns
2233                          surf_usm_v(l)%t_green_av(iwl,m) =                     &
2234                                          surf_usm_v(l)%t_green_av(iwl,m) /     &
2235                                          REAL( average_count_3d, kind=wp )
2236                       ENDDO
2237                    ENDDO
2238
2239
2240           END SELECT
2241
2242        ENDIF
2243
2244    END SUBROUTINE usm_average_3d_data
2245
2246
2247
2248!------------------------------------------------------------------------------!
2249! Description:
2250! ------------
2251!> Set internal Neumann boundary condition at outer soil grid points
2252!> for temperature and humidity.
2253!------------------------------------------------------------------------------!
2254 SUBROUTINE usm_boundary_condition
2255 
2256    IMPLICIT NONE
2257
2258    INTEGER(iwp) :: i      !< grid index x-direction
2259    INTEGER(iwp) :: ioff   !< offset index x-direction indicating location of soil grid point
2260    INTEGER(iwp) :: j      !< grid index y-direction
2261    INTEGER(iwp) :: joff   !< offset index x-direction indicating location of soil grid point
2262    INTEGER(iwp) :: k      !< grid index z-direction
2263    INTEGER(iwp) :: koff   !< offset index x-direction indicating location of soil grid point
2264    INTEGER(iwp) :: l      !< running index surface-orientation
2265    INTEGER(iwp) :: m      !< running index surface elements
2266
2267    koff = surf_usm_h%koff
2268    DO  m = 1, surf_usm_h%ns
2269       i = surf_usm_h%i(m)
2270       j = surf_usm_h%j(m)
2271       k = surf_usm_h%k(m)
2272       pt(k+koff,j,i) = pt(k,j,i)
2273    ENDDO
2274
2275    DO  l = 0, 3
2276       ioff = surf_usm_v(l)%ioff
2277       joff = surf_usm_v(l)%joff
2278       DO  m = 1, surf_usm_v(l)%ns
2279          i = surf_usm_v(l)%i(m)
2280          j = surf_usm_v(l)%j(m)
2281          k = surf_usm_v(l)%k(m)
2282          pt(k,j+joff,i+ioff) = pt(k,j,i)
2283       ENDDO
2284    ENDDO
2285
2286 END SUBROUTINE usm_boundary_condition
2287
2288
2289!------------------------------------------------------------------------------!
2290!
2291! Description:
2292! ------------
2293!> Subroutine checks variables and assigns units.
2294!> It is called out from subroutine check_parameters.
2295!------------------------------------------------------------------------------!
2296    SUBROUTINE usm_check_data_output( variable, unit )
2297       
2298        IMPLICIT NONE
2299 
2300        CHARACTER (len=*),INTENT(IN)    ::  variable !:
2301        CHARACTER (len=*),INTENT(OUT)   ::  unit     !:
2302       
2303        CHARACTER (len=varnamelength)   :: var
2304
2305        var = TRIM(variable)
2306        IF ( var(1:12) == 'usm_rad_net_'  .OR.  var(1:13) == 'usm_rad_insw_'  .OR.        &
2307             var(1:13) == 'usm_rad_inlw_'  .OR.  var(1:16) == 'usm_rad_inswdir_'  .OR.    &
2308             var(1:16) == 'usm_rad_inswdif_'  .OR.  var(1:16) == 'usm_rad_inswref_'  .OR. &
2309             var(1:16) == 'usm_rad_inlwdif_'  .OR.  var(1:16) == 'usm_rad_inlwref_'  .OR. &
2310             var(1:14) == 'usm_rad_outsw_'  .OR.  var(1:14) == 'usm_rad_outlw_'  .OR.     &
2311             var(1:14) == 'usm_rad_ressw_'  .OR.  var(1:14) == 'usm_rad_reslw_'  .OR.     &
2312             var(1:11) == 'usm_rad_hf_'  .OR.                                             &
2313             var(1:9)  == 'usm_wshf_'  .OR.  var(1:9) == 'usm_wghf_' .OR.                 &
2314             var(1:16) == 'usm_wghf_window_' .OR. var(1:15) == 'usm_wghf_green_' .OR.     &
2315             var(1:10) == 'usm_iwghf_' .OR. var(1:17) == 'usm_iwghf_window_' )  THEN
2316            unit = 'W/m2'
2317        ELSE IF ( var(1:10) == 'usm_t_surf'   .OR.  var(1:10) == 'usm_t_wall' .OR.         &
2318                  var(1:12) == 'usm_t_window' .OR. var(1:17) == 'usm_t_surf_window' .OR.  &
2319                  var(1:16) == 'usm_t_surf_green'  .OR.                                   &
2320                  var(1:11) == 'usm_t_green' .OR.                                         &
2321                  var(1:15) == 'usm_t_surf_10cm')  THEN
2322            unit = 'K'
2323        ELSE IF ( var(1:9) == 'usm_surfz'  .OR.  var(1:7) == 'usm_svf'  .OR.              & 
2324                  var(1:7) == 'usm_dif'  .OR.  var(1:11) == 'usm_surfcat'  .OR.           &
2325                  var(1:11) == 'usm_surfalb'  .OR.  var(1:12) == 'usm_surfemis'  .OR.     &
2326                  var(1:9) == 'usm_skyvf' .OR. var(1:9) == 'usm_skyvft' )  THEN
2327            unit = '1'
2328        ELSE
2329            unit = 'illegal'
2330        ENDIF
2331
2332    END SUBROUTINE usm_check_data_output
2333
2334
2335!------------------------------------------------------------------------------!
2336! Description:
2337! ------------
2338!> Check parameters routine for urban surface model
2339!------------------------------------------------------------------------------!
2340    SUBROUTINE usm_check_parameters
2341   
2342       USE control_parameters,                                                 &
2343           ONLY:  bc_pt_b, bc_q_b, constant_flux_layer, large_scale_forcing,   &
2344                  lsf_surf, topography
2345
2346!
2347!--    Dirichlet boundary conditions are required as the surface fluxes are
2348!--    calculated from the temperature/humidity gradients in the urban surface
2349!--    model
2350       IF ( bc_pt_b == 'neumann'   .OR.   bc_q_b == 'neumann' )  THEN
2351          message_string = 'urban surface model requires setting of '//        &
2352                           'bc_pt_b = "dirichlet" and '//                      &
2353                           'bc_q_b  = "dirichlet"'
2354          CALL message( 'usm_check_parameters', 'PA0590', 1, 2, 0, 6, 0 )
2355       ENDIF
2356
2357       IF ( .NOT.  constant_flux_layer )  THEN
2358          message_string = 'urban surface model requires '//                   &
2359                           'constant_flux_layer = .T.'
2360          CALL message( 'usm_check_parameters', 'PA0084', 1, 2, 0, 6, 0 )
2361       ENDIF
2362
2363       IF (  .NOT.  radiation )  THEN
2364          message_string = 'urban surface model requires '//                   &
2365                           'the radiation model to be switched on'
2366          CALL message( 'usm_check_parameters', 'PA0084', 1, 2, 0, 6, 0 )
2367       ENDIF
2368!       
2369!--    Surface forcing has to be disabled for LSF in case of enabled
2370!--    urban surface module
2371       IF ( large_scale_forcing )  THEN
2372          lsf_surf = .FALSE.
2373       ENDIF
2374!
2375!--    Topography
2376       IF ( topography == 'flat' )  THEN
2377          message_string = 'topography /= "flat" is required '//               &
2378                           'when using the urban surface model'
2379          CALL message( 'check_parameters', 'PA0592', 1, 2, 0, 6, 0 )
2380       ENDIF
2381!
2382!--    naheatlayers
2383       IF ( naheatlayers > nzt )  THEN
2384          message_string = 'number of anthropogenic heat layers '//            &
2385                           '"naheatlayers" can not be larger than'//           &
2386                           ' number of domain layers "nzt"'
2387          CALL message( 'check_parameters', 'PA0593', 1, 2, 0, 6, 0 )
2388       ENDIF
2389
2390    END SUBROUTINE usm_check_parameters
2391
2392
2393!------------------------------------------------------------------------------!
2394!
2395! Description:
2396! ------------
2397!> Output of the 3D-arrays in netCDF and/or AVS format
2398!> for variables of urban_surface model.
2399!> It resorts the urban surface module output quantities from surf style
2400!> indexing into temporary 3D array with indices (i,j,k).
2401!> It is called from subroutine data_output_3d.
2402!------------------------------------------------------------------------------!
2403    SUBROUTINE usm_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
2404       
2405        IMPLICIT NONE
2406
2407        INTEGER(iwp), INTENT(IN)       ::  av        !<
2408        CHARACTER (len=*), INTENT(IN)  ::  variable  !<
2409        INTEGER(iwp), INTENT(IN)       ::  nzb_do    !< lower limit of the data output (usually 0)
2410        INTEGER(iwp), INTENT(IN)       ::  nzt_do    !< vertical upper limit of the data output (usually nz_do3d)
2411        LOGICAL, INTENT(OUT)           ::  found     !<
2412        REAL(sp), DIMENSION(nxl:nxr,nys:nyn,nzb_do:nzt_do) ::  local_pf   !< sp - it has to correspond to module data_output_3d
2413        REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr)     ::  temp_pf    !< temp array for urban surface output procedure
2414       
2415        CHARACTER (len=varnamelength)                          :: var, surfid
2416        INTEGER(iwp), PARAMETER                                :: nd = 5
2417        CHARACTER(len=6), DIMENSION(0:nd-1), PARAMETER         :: dirname = (/ '_roof ', '_south', '_north', '_west ', '_east ' /)
2418        INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER             :: dirint =  (/    iup_u, isouth_u, inorth_u,  iwest_u,  ieast_u /)
2419        INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER             :: diridx =  (/       -1,        1,        0,        3,        2 /)
2420                                                                     !< index for surf_*_v: 0:3 = (North, South, East, West)
2421        INTEGER(iwp), DIMENSION(0:nd-1)                        :: dirstart
2422        INTEGER(iwp), DIMENSION(0:nd-1)                        :: dirend
2423        INTEGER(iwp)                                           :: ids,idsint,idsidx,isurf,isvf,isurfs,isurflt
2424        INTEGER(iwp)                                           :: is,js,ks,i,j,k,iwl,istat, l, m
2425        INTEGER(iwp)                                           :: k_topo    !< topography top index
2426
2427        dirstart = (/ startland, startwall, startwall, startwall, startwall /)
2428        dirend = (/ endland, endwall, endwall, endwall, endwall /)
2429
2430        found = .TRUE.
2431        temp_pf = -1._wp
2432       
2433        ids = -1
2434        var = TRIM(variable)
2435        DO i = 0, nd-1
2436            k = len(TRIM(var))
2437            j = len(TRIM(dirname(i)))
2438            IF ( var(k-j+1:k) == dirname(i) )  THEN
2439                ids = i
2440                idsint = dirint(ids)
2441                idsidx = diridx(ids)
2442                var = var(:k-j)
2443                EXIT
2444            ENDIF
2445        ENDDO
2446        IF ( ids == -1 )  THEN
2447            var = TRIM(variable)
2448        ENDIF
2449        IF ( var(1:11) == 'usm_t_wall_'  .AND.  len(TRIM(var)) >= 12 )  THEN
2450!--         wall layers
2451            READ(var(12:12), '(I1)', iostat=istat ) iwl
2452            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
2453                var = var(1:10)
2454            ENDIF
2455        ENDIF
2456        IF ( var(1:13) == 'usm_t_window_'  .AND.  len(TRIM(var)) >= 14 )  THEN
2457!--         window layers
2458            READ(var(14:14), '(I1)', iostat=istat ) iwl
2459            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
2460                var = var(1:12)
2461            ENDIF
2462        ENDIF
2463        IF ( var(1:12) == 'usm_t_green_'  .AND.  len(TRIM(var)) >= 13 )  THEN
2464!--         green layers
2465            READ(var(13:13), '(I1)', iostat=istat ) iwl
2466            IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
2467                var = var(1:11)
2468            ENDIF
2469        ENDIF
2470        IF ( (var(1:8) == 'usm_svf_'  .OR.  var(1:8) == 'usm_dif_')  .AND.  len(TRIM(var)) >= 13 )  THEN
2471!--         svf values to particular surface
2472            surfid = var(9:)
2473            i = index(surfid,'_')
2474            j = index(surfid(i+1:),'_')
2475            READ(surfid(1:i-1),*, iostat=istat ) is
2476            IF ( istat == 0 )  THEN
2477                READ(surfid(i+1:i+j-1),*, iostat=istat ) js
2478            ENDIF
2479            IF ( istat == 0 )  THEN
2480                READ(surfid(i+j+1:),*, iostat=istat ) ks
2481            ENDIF
2482            IF ( istat == 0 )  THEN
2483                var = var(1:7)
2484            ENDIF
2485        ENDIF
2486       
2487        SELECT CASE ( TRIM(var) )
2488
2489          CASE ( 'usm_surfz' )
2490!--           array of lw radiation falling to local surface after i-th reflection
2491              IF ( idsint == iup_u )  THEN
2492                 DO  m = 1, surf_usm_h%ns
2493                    i = surf_usm_h%i(m)
2494                    j = surf_usm_h%j(m)
2495                    k = surf_usm_h%k(m)
2496                    temp_pf(0,j,i) = MAX( temp_pf(0,j,i), REAL( k, kind=wp) )
2497                 ENDDO
2498              ELSE
2499                 l = idsidx
2500                 DO  m = 1, surf_usm_v(l)%ns
2501                    i = surf_usm_v(l)%i(m)
2502                    j = surf_usm_v(l)%j(m)
2503                    k = surf_usm_v(l)%k(m)
2504                    temp_pf(0,j,i) = MAX( temp_pf(0,j,i), REAL( k, kind=wp) + 1.0_wp )
2505                 ENDDO
2506              ENDIF
2507
2508          CASE ( 'usm_surfcat' )
2509!--           surface category
2510              IF ( idsint == iup_u )  THEN
2511                 DO  m = 1, surf_usm_h%ns
2512                    i = surf_usm_h%i(m)
2513                    j = surf_usm_h%j(m)
2514                    k = surf_usm_h%k(m)
2515                    temp_pf(k,j,i) = surf_usm_h%surface_types(m)
2516                 ENDDO
2517              ELSE
2518                 l = idsidx
2519                 DO  m = 1, surf_usm_v(l)%ns
2520                    i = surf_usm_v(l)%i(m)
2521                    j = surf_usm_v(l)%j(m)
2522                    k = surf_usm_v(l)%k(m)
2523                    temp_pf(k,j,i) = surf_usm_v(l)%surface_types(m)
2524                 ENDDO
2525              ENDIF
2526             
2527          CASE ( 'usm_surfalb' )
2528!--           surface albedo, weighted average
2529              IF ( idsint == iup_u )  THEN
2530                 DO  m = 1, surf_usm_h%ns
2531                    i = surf_usm_h%i(m)
2532                    j = surf_usm_h%j(m)
2533                    k = surf_usm_h%k(m)
2534                    temp_pf(k,j,i) = surf_usm_h%frac(ind_veg_wall,m)     *     &
2535                                     surf_usm_h%albedo(ind_veg_wall,m)  +      &
2536                                     surf_usm_h%frac(ind_pav_green,m)    *     &
2537                                     surf_usm_h%albedo(ind_pav_green,m) +      &
2538                                     surf_usm_h%frac(ind_wat_win,m)      *     &
2539                                     surf_usm_h%albedo(ind_wat_win,m)
2540                 ENDDO
2541              ELSE
2542                 l = idsidx
2543                 DO  m = 1, surf_usm_v(l)%ns
2544                    i = surf_usm_v(l)%i(m)
2545                    j = surf_usm_v(l)%j(m)
2546                    k = surf_usm_v(l)%k(m)
2547                    temp_pf(k,j,i) = surf_usm_v(l)%frac(ind_veg_wall,m)     *  &
2548                                     surf_usm_v(l)%albedo(ind_veg_wall,m)  +   &
2549                                     surf_usm_v(l)%frac(ind_pav_green,m)    *  &
2550                                     surf_usm_v(l)%albedo(ind_pav_green,m) +   &
2551                                     surf_usm_v(l)%frac(ind_wat_win,m)      *  &
2552                                     surf_usm_v(l)%albedo(ind_wat_win,m)
2553                 ENDDO
2554              ENDIF
2555             
2556          CASE ( 'usm_surfemis' )
2557!--           surface emissivity, weighted average
2558              IF ( idsint == iup_u )  THEN
2559                 DO  m = 1, surf_usm_h%ns
2560                    i = surf_usm_h%i(m)
2561                    j = surf_usm_h%j(m)
2562                    k = surf_usm_h%k(m)
2563                    temp_pf(k,j,i) =  surf_usm_h%frac(ind_veg_wall,m)      *   &
2564                                      surf_usm_h%emissivity(ind_veg_wall,m)  + &
2565                                      surf_usm_h%frac(ind_pav_green,m)     *   &
2566                                      surf_usm_h%emissivity(ind_pav_green,m) + &
2567                                      surf_usm_h%frac(ind_wat_win,m)       *   &
2568                                      surf_usm_h%emissivity(ind_wat_win,m)
2569                 ENDDO
2570              ELSE
2571                 l = idsidx
2572                 DO  m = 1, surf_usm_v(l)%ns
2573                    i = surf_usm_v(l)%i(m)
2574                    j = surf_usm_v(l)%j(m)
2575                    k = surf_usm_v(l)%k(m)
2576                    temp_pf(k,j,i) = surf_usm_v(l)%frac(ind_veg_wall,m)       *&
2577                                     surf_usm_v(l)%emissivity(ind_veg_wall,m) +&
2578                                     surf_usm_v(l)%frac(ind_pav_green,m)      *&
2579                                     surf_usm_v(l)%emissivity(ind_pav_green,m)+&
2580                                     surf_usm_v(l)%frac(ind_wat_win,m)        *&
2581                                     surf_usm_v(l)%emissivity(ind_wat_win,m)
2582                 ENDDO
2583              ENDIF
2584
2585          CASE ( 'usm_surfwintrans' )
2586!--           transmissivity window tiles
2587              IF ( idsint == iup_u )  THEN
2588                 DO  m = 1, surf_usm_h%ns
2589                    i = surf_usm_h%i(m)
2590                    j = surf_usm_h%j(m)
2591                    k = surf_usm_h%k(m)
2592                    temp_pf(k,j,i) = surf_usm_h%transmissivity(m)
2593                 ENDDO
2594              ELSE
2595                 l = idsidx
2596                 DO  m = 1, surf_usm_v(l)%ns
2597                    i = surf_usm_v(l)%i(m)
2598                    j = surf_usm_v(l)%j(m)
2599                    k = surf_usm_v(l)%k(m)
2600                    temp_pf(k,j,i) = surf_usm_v(l)%transmissivity(m)
2601                 ENDDO
2602              ENDIF
2603
2604          CASE ( 'usm_skyvf' )
2605!--           sky view factor
2606              DO isurf = dirstart(ids), dirend(ids)
2607                 IF ( surfl(id,isurf) == idsint )  THEN
2608                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = skyvf(isurf)
2609                 ENDIF
2610              ENDDO
2611             
2612          CASE ( 'usm_skyvft' )
2613!--           sky view factor
2614              DO isurf = dirstart(ids), dirend(ids)
2615                 IF ( surfl(id,isurf) == ids )  THEN
2616                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = skyvft(isurf)
2617                 ENDIF
2618              ENDDO
2619
2620!
2621!-- Not adjusted so far             
2622          CASE ( 'usm_svf', 'usm_dif' )
2623!--           shape view factors or iradiance factors to selected surface
2624              IF ( TRIM(var)=='usm_svf' )  THEN
2625                  k = 1
2626              ELSE
2627                  k = 2
2628              ENDIF
2629              DO isvf = 1, nsvfl
2630                  isurflt = svfsurf(1, isvf)
2631                  isurfs = svfsurf(2, isvf)
2632                             
2633                  IF ( surf(ix,isurfs) == is  .AND.  surf(iy,isurfs) == js  .AND.       &
2634                       surf(iz,isurfs) == ks  .AND.  surf(id,isurfs) == idsint )  THEN
2635  !--                 correct source surface
2636                      temp_pf(surfl(iz,isurflt),surfl(iy,isurflt),surfl(ix,isurflt)) = svf(k,isvf)
2637                  ENDIF
2638              ENDDO
2639
2640          CASE ( 'usm_rad_net' )
2641!--           array of complete radiation balance
2642              IF ( av == 0 )  THEN
2643                 IF ( idsint == iup_u )  THEN
2644                    DO  m = 1, surf_usm_h%ns
2645                       i = surf_usm_h%i(m)
2646                       j = surf_usm_h%j(m)
2647                       k = surf_usm_h%k(m)
2648                       temp_pf(k,j,i) = surf_usm_h%rad_net_l(m)
2649                    ENDDO
2650                 ELSE
2651                    l = idsidx
2652                    DO  m = 1, surf_usm_v(l)%ns
2653                       i = surf_usm_v(l)%i(m)
2654                       j = surf_usm_v(l)%j(m)
2655                       k = surf_usm_v(l)%k(m)
2656                       temp_pf(k,j,i) = surf_usm_v(l)%rad_net_l(m)
2657                    ENDDO
2658                 ENDIF
2659              ELSE
2660                 IF ( idsint == iup_u )  THEN
2661                    DO  m = 1, surf_usm_h%ns
2662                       i = surf_usm_h%i(m)
2663                       j = surf_usm_h%j(m)
2664                       k = surf_usm_h%k(m)
2665                       temp_pf(k,j,i) = surf_usm_h%rad_net_av(m)
2666                    ENDDO
2667                 ELSE
2668                    l = idsidx
2669                    DO  m = 1, surf_usm_v(l)%ns
2670                       i = surf_usm_v(l)%i(m)
2671                       j = surf_usm_v(l)%j(m)
2672                       k = surf_usm_v(l)%k(m)
2673                       temp_pf(k,j,i) = surf_usm_v(l)%rad_net_av(m)
2674                    ENDDO
2675                 ENDIF
2676              ENDIF
2677
2678          CASE ( 'usm_rad_insw' )
2679!--           array of sw radiation falling to surface after i-th reflection
2680              DO isurf = dirstart(ids), dirend(ids)
2681                 IF ( surfl(id,isurf) == idsint )  THEN
2682                   IF ( av == 0 )  THEN
2683                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinsw(isurf)
2684                   ELSE
2685                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinsw_av(isurf)
2686                   ENDIF
2687                 ENDIF
2688              ENDDO
2689
2690          CASE ( 'usm_rad_inlw' )
2691!--           array of lw radiation falling to surface after i-th reflection
2692              DO isurf = dirstart(ids), dirend(ids)
2693                 IF ( surfl(id,isurf) == idsint )  THEN
2694                   IF ( av == 0 )  THEN
2695                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinlw(isurf)
2696                   ELSE
2697                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinlw_av(isurf)
2698                   ENDIF
2699                 ENDIF
2700              ENDDO
2701
2702          CASE ( 'usm_rad_inswdir' )
2703!--           array of direct sw radiation falling to surface from sun
2704              DO isurf = dirstart(ids), dirend(ids)
2705                 IF ( surfl(id,isurf) == idsint )  THEN
2706                   IF ( av == 0 )  THEN
2707                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinswdir(isurf)
2708                   ELSE
2709                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinswdir_av(isurf)
2710                   ENDIF
2711                 ENDIF
2712              ENDDO
2713
2714          CASE ( 'usm_rad_inswdif' )
2715!--           array of difusion sw radiation falling to surface from sky and borders of the domain
2716              DO isurf = dirstart(ids), dirend(ids)
2717                 IF ( surfl(id,isurf) == idsint )  THEN
2718                   IF ( av == 0 )  THEN
2719                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinswdif(isurf)
2720                   ELSE
2721                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinswdif_av(isurf)
2722                   ENDIF
2723                 ENDIF
2724              ENDDO
2725
2726          CASE ( 'usm_rad_inswref' )
2727!--           array of sw radiation falling to surface from reflections
2728              DO isurf = dirstart(ids), dirend(ids)
2729                 IF ( surfl(id,isurf) == idsint )  THEN
2730                   IF ( av == 0 )  THEN
2731                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = &
2732                       surfinsw(isurf) - surfinswdir(isurf) - surfinswdif(isurf)
2733                   ELSE
2734                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinswref_av(isurf)
2735                   ENDIF
2736                 ENDIF
2737              ENDDO
2738
2739          CASE ( 'usm_rad_inlwdif' )
2740!--           array of difusion lw radiation falling to surface from sky and borders of the domain
2741              DO isurf = dirstart(ids), dirend(ids)
2742                 IF ( surfl(id,isurf) == idsint )  THEN
2743                   IF ( av == 0 )  THEN
2744                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinlwdif(isurf)
2745                   ELSE
2746                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinlwdif_av(isurf)
2747                   ENDIF
2748                 ENDIF
2749              ENDDO
2750
2751          CASE ( 'usm_rad_inlwref' )
2752!--           array of lw radiation falling to surface from reflections
2753              DO isurf = dirstart(ids), dirend(ids)
2754                 IF ( surfl(id,isurf) == idsint )  THEN
2755                   IF ( av == 0 )  THEN
2756                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinlw(isurf) - surfinlwdif(isurf)
2757                   ELSE
2758                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinlwref_av(isurf)
2759                   ENDIF
2760                 ENDIF
2761              ENDDO
2762
2763          CASE ( 'usm_rad_outsw' )
2764!--           array of sw radiation emitted from surface after i-th reflection
2765              DO isurf = dirstart(ids), dirend(ids)
2766                 IF ( surfl(id,isurf) == idsint )  THEN
2767                   IF ( av == 0 )  THEN
2768                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfoutsw(isurf)
2769                   ELSE
2770                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfoutsw_av(isurf)
2771                   ENDIF
2772                 ENDIF
2773              ENDDO
2774
2775          CASE ( 'usm_rad_outlw' )
2776!--           array of lw radiation emitted from surface after i-th reflection
2777              DO isurf = dirstart(ids), dirend(ids)
2778                 IF ( surfl(id,isurf) == idsint )  THEN
2779                   IF ( av == 0 )  THEN
2780                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfoutlw(isurf)
2781                   ELSE
2782                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfoutlw_av(isurf)
2783                   ENDIF
2784                 ENDIF
2785              ENDDO
2786
2787          CASE ( 'usm_rad_ressw' )
2788!--           average of array of residua of sw radiation absorbed in surface after last reflection
2789              DO isurf = dirstart(ids), dirend(ids)
2790                 IF ( surfl(id,isurf) == idsint )  THEN
2791                   IF ( av == 0 )  THEN
2792                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfins(isurf)
2793                   ELSE
2794                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfins_av(isurf)
2795                   ENDIF
2796                 ENDIF
2797              ENDDO
2798
2799          CASE ( 'usm_rad_reslw' )
2800!--           average of array of residua of lw radiation absorbed in surface after last reflection
2801              DO isurf = dirstart(ids), dirend(ids)
2802                 IF ( surfl(id,isurf) == idsint )  THEN
2803                   IF ( av == 0 )  THEN
2804                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinl(isurf)
2805                   ELSE
2806                     temp_pf(surfl(iz,isurf),surfl(iy,isurf),surfl(ix,isurf)) = surfinl_av(isurf)
2807                   ENDIF
2808                 ENDIF
2809              ENDDO
2810 
2811          CASE ( 'usm_rad_hf' )
2812!--           array of heat flux from radiation for surfaces after all reflections
2813              IF ( av == 0 )  THEN
2814                 IF ( idsint == iup_u )  THEN
2815                    DO  m = 1, surf_usm_h%ns
2816                       i = surf_usm_h%i(m)
2817                       j = surf_usm_h%j(m)
2818                       k = surf_usm_h%k(m)
2819                       temp_pf(k,j,i) = surf_usm_h%surfhf(m)
2820                    ENDDO
2821                 ELSE
2822                    l = idsidx
2823                    DO  m = 1, surf_usm_v(l)%ns
2824                       i = surf_usm_v(l)%i(m)
2825                       j = surf_usm_v(l)%j(m)
2826                       k = surf_usm_v(l)%k(m)
2827                       temp_pf(k,j,i) = surf_usm_v(l)%surfhf(m)
2828                    ENDDO
2829                 ENDIF
2830              ELSE
2831                 IF ( idsint == iup_u )  THEN
2832                    DO  m = 1, surf_usm_h%ns
2833                       i = surf_usm_h%i(m)
2834                       j = surf_usm_h%j(m)
2835                       k = surf_usm_h%k(m)
2836                       temp_pf(k,j,i) = surf_usm_h%surfhf_av(m)
2837                    ENDDO
2838                 ELSE
2839                    l = idsidx
2840                    DO  m = 1, surf_usm_v(l)%ns
2841                       i = surf_usm_v(l)%i(m)
2842                       j = surf_usm_v(l)%j(m)
2843                       k = surf_usm_v(l)%k(m)
2844                       temp_pf(k,j,i) = surf_usm_v(l)%surfhf_av(m)
2845                    ENDDO
2846                 ENDIF
2847              ENDIF
2848 
2849          CASE ( 'usm_wshf' )
2850!--           array of sensible heat flux from surfaces
2851              IF ( av == 0 )  THEN
2852                 IF ( idsint == iup_u )  THEN
2853                    DO  m = 1, surf_usm_h%ns
2854                       i = surf_usm_h%i(m)
2855                       j = surf_usm_h%j(m)
2856                       k = surf_usm_h%k(m)
2857                       temp_pf(k,j,i) = surf_usm_h%wshf_eb(m)
2858                    ENDDO
2859                 ELSE
2860                    l = idsidx
2861                    DO  m = 1, surf_usm_v(l)%ns
2862                       i = surf_usm_v(l)%i(m)
2863                       j = surf_usm_v(l)%j(m)
2864                       k = surf_usm_v(l)%k(m)
2865                       temp_pf(k,j,i) = surf_usm_v(l)%wshf_eb(m)
2866                    ENDDO
2867                 ENDIF
2868              ELSE
2869                 IF ( idsint == iup_u )  THEN
2870                    DO  m = 1, surf_usm_h%ns
2871                       i = surf_usm_h%i(m)
2872                       j = surf_usm_h%j(m)
2873                       k = surf_usm_h%k(m)
2874                       temp_pf(k,j,i) = surf_usm_h%wshf_eb_av(m)
2875                    ENDDO
2876                 ELSE
2877                    l = idsidx
2878                    DO  m = 1, surf_usm_v(l)%ns
2879                       i = surf_usm_v(l)%i(m)
2880                       j = surf_usm_v(l)%j(m)
2881                       k = surf_usm_v(l)%k(m)
2882                       temp_pf(k,j,i) = surf_usm_v(l)%wshf_eb_av(m)
2883                    ENDDO
2884                 ENDIF
2885              ENDIF
2886
2887
2888          CASE ( 'usm_wghf' )
2889!--           array of heat flux from ground (land, wall, roof)
2890              IF ( av == 0 )  THEN
2891                 IF ( idsint == iup_u )  THEN
2892                    DO  m = 1, surf_usm_h%ns
2893                       i = surf_usm_h%i(m)
2894                       j = surf_usm_h%j(m)
2895                       k = surf_usm_h%k(m)
2896                       temp_pf(k,j,i) = surf_usm_h%wghf_eb(m)
2897                    ENDDO
2898                 ELSE
2899                    l = idsidx
2900                    DO  m = 1, surf_usm_v(l)%ns
2901                       i = surf_usm_v(l)%i(m)
2902                       j = surf_usm_v(l)%j(m)
2903                       k = surf_usm_v(l)%k(m)
2904                       temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb(m)
2905                    ENDDO
2906                 ENDIF
2907              ELSE
2908                 IF ( idsint == iup_u )  THEN
2909                    DO  m = 1, surf_usm_h%ns
2910                       i = surf_usm_h%i(m)
2911                       j = surf_usm_h%j(m)
2912                       k = surf_usm_h%k(m)
2913                       temp_pf(k,j,i) = surf_usm_h%wghf_eb_av(m)
2914                    ENDDO
2915                 ELSE
2916                    l = idsidx
2917                    DO  m = 1, surf_usm_v(l)%ns
2918                       i = surf_usm_v(l)%i(m)
2919                       j = surf_usm_v(l)%j(m)
2920                       k = surf_usm_v(l)%k(m)
2921                       temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb_av(m)
2922                    ENDDO
2923                 ENDIF
2924              ENDIF
2925
2926          CASE ( 'usm_wghf_window' )
2927!--           array of heat flux from window ground (land, wall, roof)
2928
2929              IF ( av == 0 )  THEN
2930                 IF ( idsint == iup_u )  THEN
2931                    DO  m = 1, surf_usm_h%ns
2932                       i = surf_usm_h%i(m)
2933                       j = surf_usm_h%j(m)
2934                       k = surf_usm_h%k(m)
2935                       temp_pf(k,j,i) = surf_usm_h%wghf_eb_window(m)
2936                    ENDDO
2937                 ELSE
2938                    l = idsidx
2939                    DO  m = 1, surf_usm_v(l)%ns
2940                       i = surf_usm_v(l)%i(m)
2941                       j = surf_usm_v(l)%j(m)
2942                       k = surf_usm_v(l)%k(m)
2943                       temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb_window(m)
2944                    ENDDO
2945                 ENDIF
2946              ELSE
2947                 IF ( idsint == iup_u )  THEN
2948                    DO  m = 1, surf_usm_h%ns
2949                       i = surf_usm_h%i(m)
2950                       j = surf_usm_h%j(m)
2951                       k = surf_usm_h%k(m)
2952                       temp_pf(k,j,i) = surf_usm_h%wghf_eb_window_av(m)
2953                    ENDDO
2954                 ELSE
2955                    l = idsidx
2956                    DO  m = 1, surf_usm_v(l)%ns
2957                       i = surf_usm_v(l)%i(m)
2958                       j = surf_usm_v(l)%j(m)
2959                       k = surf_usm_v(l)%k(m)
2960                       temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb_window_av(m)
2961                    ENDDO
2962                 ENDIF
2963              ENDIF
2964
2965          CASE ( 'usm_wghf_green' )
2966!--           array of heat flux from green ground (land, wall, roof)
2967
2968              IF ( av == 0 )  THEN
2969                 IF ( idsint == iup_u )  THEN
2970                    DO  m = 1, surf_usm_h%ns
2971                       i = surf_usm_h%i(m)
2972                       j = surf_usm_h%j(m)
2973                       k = surf_usm_h%k(m)
2974                       temp_pf(k,j,i) = surf_usm_h%wghf_eb_green(m)
2975                    ENDDO
2976                 ELSE
2977                    l = idsidx
2978                    DO  m = 1, surf_usm_v(l)%ns
2979                       i = surf_usm_v(l)%i(m)
2980                       j = surf_usm_v(l)%j(m)
2981                       k = surf_usm_v(l)%k(m)
2982                       temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb_green(m)
2983                    ENDDO
2984                 ENDIF
2985              ELSE
2986                 IF ( idsint == iup_u )  THEN
2987                    DO  m = 1, surf_usm_h%ns
2988                       i = surf_usm_h%i(m)
2989                       j = surf_usm_h%j(m)
2990                       k = surf_usm_h%k(m)
2991                       temp_pf(k,j,i) = surf_usm_h%wghf_eb_green_av(m)
2992                    ENDDO
2993                 ELSE
2994                    l = idsidx
2995                    DO  m = 1, surf_usm_v(l)%ns
2996                       i = surf_usm_v(l)%i(m)
2997                       j = surf_usm_v(l)%j(m)
2998                       k = surf_usm_v(l)%k(m)
2999                       temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb_green_av(m)
3000                    ENDDO
3001                 ENDIF
3002              ENDIF
3003
3004          CASE ( 'usm_iwghf' )
3005!--           array of heat flux from indoor ground (land, wall, roof)
3006              IF ( av == 0 )  THEN
3007                 IF ( idsint == iup_u )  THEN
3008                    DO  m = 1, surf_usm_h%ns
3009                       i = surf_usm_h%i(m)
3010                       j = surf_usm_h%j(m)
3011                       k = surf_usm_h%k(m)
3012                       temp_pf(k,j,i) = surf_usm_h%iwghf_eb(m)
3013                    ENDDO
3014                 ELSE
3015                    l = idsidx
3016                    DO  m = 1, surf_usm_v(l)%ns
3017                       i = surf_usm_v(l)%i(m)
3018                       j = surf_usm_v(l)%j(m)
3019                       k = surf_usm_v(l)%k(m)
3020                       temp_pf(k,j,i) = surf_usm_v(l)%iwghf_eb(m)
3021                    ENDDO
3022                 ENDIF
3023              ELSE
3024                 IF ( idsint == iup_u )  THEN
3025                    DO  m = 1, surf_usm_h%ns
3026                       i = surf_usm_h%i(m)
3027                       j = surf_usm_h%j(m)
3028                       k = surf_usm_h%k(m)
3029                       temp_pf(k,j,i) = surf_usm_h%iwghf_eb_av(m)
3030                    ENDDO
3031                 ELSE
3032                    l = idsidx
3033                    DO  m = 1, surf_usm_v(l)%ns
3034                       i = surf_usm_v(l)%i(m)
3035                       j = surf_usm_v(l)%j(m)
3036                       k = surf_usm_v(l)%k(m)
3037                       temp_pf(k,j,i) = surf_usm_v(l)%iwghf_eb_av(m)
3038                    ENDDO
3039                 ENDIF
3040              ENDIF
3041
3042          CASE ( 'usm_iwghf_window' )
3043!--           array of heat flux from indoor window ground (land, wall, roof)
3044
3045              IF ( av == 0 )  THEN
3046                 IF ( idsint == iup_u )  THEN
3047                    DO  m = 1, surf_usm_h%ns
3048                       i = surf_usm_h%i(m)
3049                       j = surf_usm_h%j(m)
3050                       k = surf_usm_h%k(m)
3051                       temp_pf(k,j,i) = surf_usm_h%iwghf_eb_window(m)
3052                    ENDDO
3053                 ELSE
3054                    l = idsidx
3055                    DO  m = 1, surf_usm_v(l)%ns
3056                       i = surf_usm_v(l)%i(m)
3057                       j = surf_usm_v(l)%j(m)
3058                       k = surf_usm_v(l)%k(m)
3059                       temp_pf(k,j,i) = surf_usm_v(l)%iwghf_eb_window(m)
3060                    ENDDO
3061                 ENDIF
3062              ELSE
3063                 IF ( idsint == iup_u )  THEN
3064                    DO  m = 1, surf_usm_h%ns
3065                       i = surf_usm_h%i(m)
3066                       j = surf_usm_h%j(m)
3067                       k = surf_usm_h%k(m)
3068                       temp_pf(k,j,i) = surf_usm_h%iwghf_eb_window_av(m)
3069                    ENDDO
3070                 ELSE
3071                    l = idsidx
3072                    DO  m = 1, surf_usm_v(l)%ns
3073                       i = surf_usm_v(l)%i(m)
3074                       j = surf_usm_v(l)%j(m)
3075                       k = surf_usm_v(l)%k(m)
3076                       temp_pf(k,j,i) = surf_usm_v(l)%iwghf_eb_window_av(m)
3077                    ENDDO
3078                 ENDIF
3079              ENDIF
3080             
3081          CASE ( 'usm_t_surf' )
3082!--           surface temperature for surfaces
3083              IF ( av == 0 )  THEN
3084                 IF ( idsint == iup_u )  THEN
3085                    DO  m = 1, surf_usm_h%ns
3086                       i = surf_usm_h%i(m)
3087                       j = surf_usm_h%j(m)
3088                       k = surf_usm_h%k(m)
3089                       temp_pf(k,j,i) = t_surf_h(m)
3090                    ENDDO
3091                 ELSE
3092                    l = idsidx
3093                    DO  m = 1, surf_usm_v(l)%ns
3094                       i = surf_usm_v(l)%i(m)
3095                       j = surf_usm_v(l)%j(m)
3096                       k = surf_usm_v(l)%k(m)
3097                       temp_pf(k,j,i) = t_surf_v(l)%t(m)
3098                    ENDDO
3099                 ENDIF
3100              ELSE
3101                 IF ( idsint == iup_u )  THEN
3102                    DO  m = 1, surf_usm_h%ns
3103                       i = surf_usm_h%i(m)
3104                       j = surf_usm_h%j(m)
3105                       k = surf_usm_h%k(m)
3106                       temp_pf(k,j,i) = surf_usm_h%t_surf_av(m)
3107                    ENDDO
3108                 ELSE
3109                    l = idsidx
3110                    DO  m = 1, surf_usm_v(l)%ns
3111                       i = surf_usm_v(l)%i(m)
3112                       j = surf_usm_v(l)%j(m)
3113                       k = surf_usm_v(l)%k(m)
3114                       temp_pf(k,j,i) = surf_usm_v(l)%t_surf_av(m)
3115                    ENDDO
3116                 ENDIF
3117              ENDIF
3118             
3119          CASE ( 'usm_t_surf_window' )
3120!--           surface temperature for window surfaces
3121
3122              IF ( av == 0 )  THEN
3123                 IF ( idsint == iup_u )  THEN
3124                    DO  m = 1, surf_usm_h%ns
3125                       i = surf_usm_h%i(m)
3126                       j = surf_usm_h%j(m)
3127                       k = surf_usm_h%k(m)
3128                       temp_pf(k,j,i) = t_surf_window_h(m)
3129                    ENDDO
3130                 ELSE
3131                    l = idsidx
3132                    DO  m = 1, surf_usm_v(l)%ns
3133                       i = surf_usm_v(l)%i(m)
3134                       j = surf_usm_v(l)%j(m)
3135                       k = surf_usm_v(l)%k(m)
3136                       temp_pf(k,j,i) = t_surf_window_v(l)%t(m)
3137                    ENDDO
3138                 ENDIF
3139
3140              ELSE
3141                 IF ( idsint == iup_u )  THEN
3142                    DO  m = 1, surf_usm_h%ns
3143                       i = surf_usm_h%i(m)
3144                       j = surf_usm_h%j(m)
3145                       k = surf_usm_h%k(m)
3146                       temp_pf(k,j,i) = surf_usm_h%t_surf_window_av(m)
3147                    ENDDO
3148                 ELSE
3149                    l = idsidx
3150                    DO  m = 1, surf_usm_v(l)%ns
3151                       i = surf_usm_v(l)%i(m)
3152                       j = surf_usm_v(l)%j(m)
3153                       k = surf_usm_v(l)%k(m)
3154                       temp_pf(k,j,i) = surf_usm_v(l)%t_surf_window_av(m)
3155                    ENDDO
3156
3157                 ENDIF
3158
3159              ENDIF
3160
3161          CASE ( 'usm_t_surf_green' )
3162!--           surface temperature for green surfaces
3163
3164              IF ( av == 0 )  THEN
3165                 IF ( idsint == iup_u )  THEN
3166                    DO  m = 1, surf_usm_h%ns
3167                       i = surf_usm_h%i(m)
3168                       j = surf_usm_h%j(m)
3169                       k = surf_usm_h%k(m)
3170                       temp_pf(k,j,i) = t_surf_green_h(m)
3171                    ENDDO
3172                 ELSE
3173                    l = idsidx
3174                    DO  m = 1, surf_usm_v(l)%ns
3175                       i = surf_usm_v(l)%i(m)
3176                       j = surf_usm_v(l)%j(m)
3177                       k = surf_usm_v(l)%k(m)
3178                       temp_pf(k,j,i) = t_surf_green_v(l)%t(m)
3179                    ENDDO
3180                 ENDIF
3181
3182              ELSE
3183                 IF ( idsint == iup_u )  THEN
3184                    DO  m = 1, surf_usm_h%ns
3185                       i = surf_usm_h%i(m)
3186                       j = surf_usm_h%j(m)
3187                       k = surf_usm_h%k(m)
3188                       temp_pf(k,j,i) = surf_usm_h%t_surf_green_av(m)
3189                    ENDDO
3190                 ELSE
3191                    l = idsidx
3192                    DO  m = 1, surf_usm_v(l)%ns
3193                       i = surf_usm_v(l)%i(m)
3194                       j = surf_usm_v(l)%j(m)
3195                       k = surf_usm_v(l)%k(m)
3196                       temp_pf(k,j,i) = surf_usm_v(l)%t_surf_green_av(m)
3197                    ENDDO
3198
3199                 ENDIF
3200
3201              ENDIF
3202
3203          CASE ( 'usm_t_surf_10cm' )
3204!--           near surface temperature for whole surfaces
3205
3206              IF ( av == 0 )  THEN
3207                 IF ( idsint == iup_u )  THEN
3208                    DO  m = 1, surf_usm_h%ns
3209                       i = surf_usm_h%i(m)
3210                       j = surf_usm_h%j(m)
3211                       k = surf_usm_h%k(m)
3212                       temp_pf(k,j,i) = t_surf_10cm_h(m)
3213                    ENDDO
3214                 ELSE
3215                    l = idsidx
3216                    DO  m = 1, surf_usm_v(l)%ns
3217                       i = surf_usm_v(l)%i(m)
3218                       j = surf_usm_v(l)%j(m)
3219                       k = surf_usm_v(l)%k(m)
3220                       temp_pf(k,j,i) = t_surf_10cm_v(l)%t(m)
3221                    ENDDO
3222                 ENDIF
3223
3224              ELSE
3225                 IF ( idsint == iup_u )  THEN
3226                    DO  m = 1, surf_usm_h%ns
3227                       i = surf_usm_h%i(m)
3228                       j = surf_usm_h%j(m)
3229                       k = surf_usm_h%k(m)
3230                       temp_pf(k,j,i) = surf_usm_h%t_surf_10cm_av(m)
3231                    ENDDO
3232                 ELSE
3233                    l = idsidx
3234                    DO  m = 1, surf_usm_v(l)%ns
3235                       i = surf_usm_v(l)%i(m)
3236                       j = surf_usm_v(l)%j(m)
3237                       k = surf_usm_v(l)%k(m)
3238                       temp_pf(k,j,i) = surf_usm_v(l)%t_surf_10cm_av(m)
3239                    ENDDO
3240
3241                 ENDIF
3242
3243              ENDIF
3244
3245             
3246          CASE ( 'usm_t_wall' )
3247!--           wall temperature for  iwl layer of walls and land
3248              IF ( av == 0 )  THEN
3249                 IF ( idsint == iup_u )  THEN
3250                    DO  m = 1, surf_usm_h%ns
3251                       i = surf_usm_h%i(m)
3252                       j = surf_usm_h%j(m)
3253                       k = surf_usm_h%k(m)
3254                       temp_pf(k,j,i) = t_wall_h(iwl,m)
3255                    ENDDO
3256                 ELSE
3257                    l = idsidx
3258                    DO  m = 1, surf_usm_v(l)%ns
3259                       i = surf_usm_v(l)%i(m)
3260                       j = surf_usm_v(l)%j(m)
3261                       k = surf_usm_v(l)%k(m)
3262                       temp_pf(k,j,i) = t_wall_v(l)%t(iwl,m)
3263                    ENDDO
3264                 ENDIF
3265              ELSE
3266                 IF ( idsint == iup_u )  THEN
3267                    DO  m = 1, surf_usm_h%ns
3268                       i = surf_usm_h%i(m)
3269                       j = surf_usm_h%j(m)
3270                       k = surf_usm_h%k(m)
3271                       temp_pf(k,j,i) = surf_usm_h%t_wall_av(iwl,m)
3272                    ENDDO
3273                 ELSE
3274                    l = idsidx
3275                    DO  m = 1, surf_usm_v(l)%ns
3276                       i = surf_usm_v(l)%i(m)
3277                       j = surf_usm_v(l)%j(m)
3278                       k = surf_usm_v(l)%k(m)
3279                       temp_pf(k,j,i) = surf_usm_v(l)%t_wall_av(iwl,m)
3280                    ENDDO
3281                 ENDIF
3282              ENDIF
3283             
3284          CASE ( 'usm_t_window' )
3285!--           window temperature for iwl layer of walls and land
3286              IF ( av == 0 )  THEN
3287                 IF ( idsint == iup_u )  THEN
3288                    DO  m = 1, surf_usm_h%ns
3289                       i = surf_usm_h%i(m)
3290                       j = surf_usm_h%j(m)
3291                       k = surf_usm_h%k(m)
3292                       temp_pf(k,j,i) = t_window_h(iwl,m)
3293                    ENDDO
3294                 ELSE
3295                    l = idsidx
3296                    DO  m = 1, surf_usm_v(l)%ns
3297                       i = surf_usm_v(l)%i(m)
3298                       j = surf_usm_v(l)%j(m)
3299                       k = surf_usm_v(l)%k(m)
3300                       temp_pf(k,j,i) = t_window_v(l)%t(iwl,m)
3301                    ENDDO
3302                 ENDIF
3303              ELSE
3304                 IF ( idsint == iup_u )  THEN
3305                    DO  m = 1, surf_usm_h%ns
3306                       i = surf_usm_h%i(m)
3307                       j = surf_usm_h%j(m)
3308                       k = surf_usm_h%k(m)
3309                       temp_pf(k,j,i) = surf_usm_h%t_window_av(iwl,m)
3310                    ENDDO
3311                 ELSE
3312                    l = idsidx
3313                    DO  m = 1, surf_usm_v(l)%ns
3314                       i = surf_usm_v(l)%i(m)
3315                       j = surf_usm_v(l)%j(m)
3316                       k = surf_usm_v(l)%k(m)
3317                       temp_pf(k,j,i) = surf_usm_v(l)%t_window_av(iwl,m)
3318                    ENDDO
3319                 ENDIF
3320              ENDIF
3321
3322          CASE ( 'usm_t_green' )
3323!--           green temperature for  iwl layer of walls and land
3324              IF ( av == 0 )  THEN
3325                 IF ( idsint == iup_u )  THEN
3326                    DO  m = 1, surf_usm_h%ns
3327                       i = surf_usm_h%i(m)
3328                       j = surf_usm_h%j(m)
3329                       k = surf_usm_h%k(m)
3330                       temp_pf(k,j,i) = t_green_h(iwl,m)
3331                    ENDDO
3332                 ELSE
3333                    l = idsidx
3334                    DO  m = 1, surf_usm_v(l)%ns
3335                       i = surf_usm_v(l)%i(m)
3336                       j = surf_usm_v(l)%j(m)
3337                       k = surf_usm_v(l)%k(m)
3338                       temp_pf(k,j,i) = t_green_v(l)%t(iwl,m)
3339                    ENDDO
3340                 ENDIF
3341              ELSE
3342                 IF ( idsint == iup_u )  THEN
3343                    DO  m = 1, surf_usm_h%ns
3344                       i = surf_usm_h%i(m)
3345                       j = surf_usm_h%j(m)
3346                       k = surf_usm_h%k(m)
3347                       temp_pf(k,j,i) = surf_usm_h%t_green_av(iwl,m)
3348                    ENDDO
3349                 ELSE
3350                    l = idsidx
3351                    DO  m = 1, surf_usm_v(l)%ns
3352                       i = surf_usm_v(l)%i(m)
3353                       j = surf_usm_v(l)%j(m)
3354                       k = surf_usm_v(l)%k(m)
3355                       temp_pf(k,j,i) = surf_usm_v(l)%t_green_av(iwl,m)
3356                    ENDDO
3357                 ENDIF
3358              ENDIF
3359
3360             
3361          CASE DEFAULT
3362              found = .FALSE.
3363             
3364        END SELECT
3365
3366!
3367!--     Rearrange dimensions for NetCDF output
3368!--     FIXME: this may generate FPE overflow upon conversion from DP to SP
3369        DO  j = nys, nyn
3370            DO  i = nxl, nxr
3371                DO  k = nzb_do, nzt_do
3372                    local_pf(i,j,k) = temp_pf(k,j,i)
3373                ENDDO
3374            ENDDO
3375        ENDDO
3376       
3377    END SUBROUTINE usm_data_output_3d
3378   
3379
3380!------------------------------------------------------------------------------!
3381!
3382! Description:
3383! ------------
3384!> Soubroutine defines appropriate grid for netcdf variables.
3385!> It is called out from subroutine netcdf.
3386!------------------------------------------------------------------------------!
3387    SUBROUTINE usm_define_netcdf_grid( variable, found, grid_x, grid_y, grid_z )
3388   
3389        IMPLICIT NONE
3390
3391        CHARACTER (len=*), INTENT(IN)  ::  variable    !<
3392        LOGICAL, INTENT(OUT)           ::  found       !<
3393        CHARACTER (len=*), INTENT(OUT) ::  grid_x      !<
3394        CHARACTER (len=*), INTENT(OUT) ::  grid_y      !<
3395        CHARACTER (len=*), INTENT(OUT) ::  grid_z      !<
3396
3397        CHARACTER (len=varnamelength)  :: var
3398
3399        var = TRIM(variable)
3400        IF ( var(1:12) == 'usm_rad_net_'  .OR.  var(1:13) == 'usm_rad_insw_'  .OR.          &
3401             var(1:13) == 'usm_rad_inlw_'  .OR.  var(1:16) == 'usm_rad_inswdir_'  .OR.      &
3402             var(1:16) == 'usm_rad_inswdif_'  .OR.  var(1:16) == 'usm_rad_inswref_'  .OR.   &
3403             var(1:16) == 'usm_rad_inlwdif_'  .OR.  var(1:16) == 'usm_rad_inlwref_'  .OR.   &
3404             var(1:14) == 'usm_rad_outsw_'  .OR.  var(1:14) == 'usm_rad_outlw_'  .OR.       &
3405             var(1:14) == 'usm_rad_ressw_'  .OR.  var(1:14) == 'usm_rad_reslw_'  .OR.       &
3406             var(1:11) == 'usm_rad_hf_'  .OR.                                               &
3407             var(1:9) == 'usm_wshf_'  .OR.  var(1:9) == 'usm_wghf_'  .OR.                   &
3408             var(1:16) == 'usm_wghf_window_'  .OR. var(1:15) == 'usm_wghf_green_' .OR.      &
3409             var(1:10) == 'usm_iwghf_'  .OR. var(1:17) == 'usm_iwghf_window_' .OR.          &
3410             var(1:10) == 'usm_t_surf'  .OR.  var(1:10) == 'usm_t_wall'  .OR.               &
3411             var(1:17) == 'usm_t_surf_window'  .OR.  var(1:12) == 'usm_t_window'  .OR.      &
3412             var(1:16) == 'usm_t_surf_green'  .OR.                                          &
3413             var(1:15) == 'usm_t_surf_10cm' .OR.                                            &
3414             var(1:9) == 'usm_surfz'  .OR.  var(1:7) == 'usm_svf'  .OR.                     & 
3415             var(1:7) == 'usm_dif'  .OR.  var(1:11) == 'usm_surfcat'  .OR.                  &
3416             var(1:11) == 'usm_surfalb'  .OR.  var(1:12) == 'usm_surfemis'  .OR.            &
3417             var(1:16) == 'usm_surfwintrans'  .OR.                                          &
3418             var(1:9) == 'usm_skyvf' .OR. var(1:9) == 'usm_skyvft' ) THEN
3419
3420            found = .TRUE.
3421            grid_x = 'x'
3422            grid_y = 'y'
3423            grid_z = 'zu'
3424        ELSE
3425            found  = .FALSE.
3426            grid_x = 'none'
3427            grid_y = 'none'
3428            grid_z = 'none'
3429        ENDIF
3430
3431    END SUBROUTINE usm_define_netcdf_grid
3432   
3433
3434!------------------------------------------------------------------------------!
3435! Description:
3436! ------------
3437!> Initialization of the wall surface model
3438!------------------------------------------------------------------------------!
3439    SUBROUTINE usm_init_material_model
3440
3441        IMPLICIT NONE
3442
3443        INTEGER(iwp) ::  k, l, m            !< running indices
3444       
3445        CALL location_message( '    initialization of wall surface model', .TRUE. )
3446       
3447!--     Calculate wall grid spacings.
3448!--     Temperature is defined at the center of the wall layers,
3449!--     whereas gradients/fluxes are defined at the edges (_stag)     
3450!--     apply for all particular surface grids. First for horizontal surfaces
3451        DO  m = 1, surf_usm_h%ns
3452
3453           surf_usm_h%dz_wall(nzb_wall,m) = surf_usm_h%zw(nzb_wall,m)
3454           DO k = nzb_wall+1, nzt_wall
3455               surf_usm_h%dz_wall(k,m) = surf_usm_h%zw(k,m) -                  &
3456                                         surf_usm_h%zw(k-1,m)
3457           ENDDO
3458           surf_usm_h%dz_window(nzb_wall,m) = surf_usm_h%zw_window(nzb_wall,m)
3459           DO k = nzb_wall+1, nzt_wall
3460               surf_usm_h%dz_window(k,m) = surf_usm_h%zw_window(k,m) -         &
3461                                         surf_usm_h%zw_window(k-1,m)
3462           ENDDO
3463           surf_usm_h%dz_green(nzb_wall,m) = surf_usm_h%zw_green(nzb_wall,m)
3464           DO k = nzb_wall+1, nzt_wall
3465               surf_usm_h%dz_green(k,m) = surf_usm_h%zw_green(k,m) -           &
3466                                         surf_usm_h%zw_green(k-1,m)
3467           ENDDO
3468           
3469           surf_usm_h%dz_wall(nzt_wall+1,m) = surf_usm_h%dz_wall(nzt_wall,m)
3470
3471           DO k = nzb_wall, nzt_wall-1
3472               surf_usm_h%dz_wall_stag(k,m) = 0.5 * (                          &
3473                           surf_usm_h%dz_wall(k+1,m) + surf_usm_h%dz_wall(k,m) )
3474           ENDDO
3475           surf_usm_h%dz_wall_stag(nzt_wall,m) = surf_usm_h%dz_wall(nzt_wall,m)
3476           
3477           surf_usm_h%dz_window(nzt_wall+1,m) = surf_usm_h%dz_window(nzt_wall,m)
3478
3479           DO k = nzb_wall, nzt_wall-1
3480               surf_usm_h%dz_window_stag(k,m) = 0.5 * (                        &
3481                           surf_usm_h%dz_window(k+1,m) + surf_usm_h%dz_window(k,m) )
3482           ENDDO
3483           surf_usm_h%dz_window_stag(nzt_wall,m) = surf_usm_h%dz_window(nzt_wall,m)
3484
3485           surf_usm_h%dz_green(nzt_wall+1,m) = surf_usm_h%dz_green(nzt_wall,m)
3486
3487           DO k = nzb_wall, nzt_wall-1
3488               surf_usm_h%dz_green_stag(k,m) = 0.5 * (                         &
3489                           surf_usm_h%dz_green(k+1,m) + surf_usm_h%dz_green(k,m) )
3490           ENDDO
3491           surf_usm_h%dz_green_stag(nzt_wall,m) = surf_usm_h%dz_green(nzt_wall,m)
3492        ENDDO
3493        surf_usm_h%ddz_wall        = 1.0_wp / surf_usm_h%dz_wall
3494        surf_usm_h%ddz_wall_stag   = 1.0_wp / surf_usm_h%dz_wall_stag
3495        surf_usm_h%ddz_window      = 1.0_wp / surf_usm_h%dz_window
3496        surf_usm_h%ddz_window_stag = 1.0_wp / surf_usm_h%dz_window_stag
3497        surf_usm_h%ddz_green       = 1.0_wp / surf_usm_h%dz_green
3498        surf_usm_h%ddz_green_stag  = 1.0_wp / surf_usm_h%dz_green_stag
3499!       
3500!--     For vertical surfaces
3501        DO  l = 0, 3
3502           DO  m = 1, surf_usm_v(l)%ns
3503              surf_usm_v(l)%dz_wall(nzb_wall,m) = surf_usm_v(l)%zw(nzb_wall,m)
3504              DO k = nzb_wall+1, nzt_wall
3505                  surf_usm_v(l)%dz_wall(k,m) = surf_usm_v(l)%zw(k,m) -         &
3506                                               surf_usm_v(l)%zw(k-1,m)
3507              ENDDO
3508              surf_usm_v(l)%dz_window(nzb_wall,m) = surf_usm_v(l)%zw_window(nzb_wall,m)
3509              DO k = nzb_wall+1, nzt_wall
3510                  surf_usm_v(l)%dz_window(k,m) = surf_usm_v(l)%zw_window(k,m) - &
3511                                               surf_usm_v(l)%zw_window(k-1,m)
3512              ENDDO
3513              surf_usm_v(l)%dz_green(nzb_wall,m) = surf_usm_v(l)%zw_green(nzb_wall,m)
3514              DO k = nzb_wall+1, nzt_wall
3515                  surf_usm_v(l)%dz_green(k,m) = surf_usm_v(l)%zw_green(k,m) - &
3516                                               surf_usm_v(l)%zw_green(k-1,m)
3517              ENDDO
3518           
3519              surf_usm_v(l)%dz_wall(nzt_wall+1,m) =                            &
3520                                              surf_usm_v(l)%dz_wall(nzt_wall,m)
3521
3522              DO k = nzb_wall, nzt_wall-1
3523                  surf_usm_v(l)%dz_wall_stag(k,m) = 0.5 * (                    &
3524                                                surf_usm_v(l)%dz_wall(k+1,m) + &
3525                                                surf_usm_v(l)%dz_wall(k,m) )
3526              ENDDO
3527              surf_usm_v(l)%dz_wall_stag(nzt_wall,m) =                         &
3528                                              surf_usm_v(l)%dz_wall(nzt_wall,m)
3529              surf_usm_v(l)%dz_window(nzt_wall+1,m) =                            &
3530                                              surf_usm_v(l)%dz_window(nzt_wall,m)
3531
3532              DO k = nzb_wall, nzt_wall-1
3533                  surf_usm_v(l)%dz_window_stag(k,m) = 0.5 * (                    &
3534                                                surf_usm_v(l)%dz_window(k+1,m) + &
3535                                                surf_usm_v(l)%dz_window(k,m) )
3536              ENDDO
3537              surf_usm_v(l)%dz_window_stag(nzt_wall,m) =                         &
3538                                              surf_usm_v(l)%dz_window(nzt_wall,m)
3539              surf_usm_v(l)%dz_green(nzt_wall+1,m) =                            &
3540                                              surf_usm_v(l)%dz_green(nzt_wall,m)
3541
3542              DO k = nzb_wall, nzt_wall-1
3543                  surf_usm_v(l)%dz_green_stag(k,m) = 0.5 * (                    &
3544                                                surf_usm_v(l)%dz_green(k+1,m) + &
3545                                                surf_usm_v(l)%dz_green(k,m) )
3546              ENDDO
3547              surf_usm_v(l)%dz_green_stag(nzt_wall,m) =                         &
3548                                              surf_usm_v(l)%dz_green(nzt_wall,m)
3549           ENDDO
3550           surf_usm_v(l)%ddz_wall        = 1.0_wp / surf_usm_v(l)%dz_wall
3551           surf_usm_v(l)%ddz_wall_stag   = 1.0_wp / surf_usm_v(l)%dz_wall_stag
3552           surf_usm_v(l)%ddz_window      = 1.0_wp / surf_usm_v(l)%dz_window
3553           surf_usm_v(l)%ddz_window_stag = 1.0_wp / surf_usm_v(l)%dz_window_stag
3554           surf_usm_v(l)%ddz_green       = 1.0_wp / surf_usm_v(l)%dz_green
3555           surf_usm_v(l)%ddz_green_stag  = 1.0_wp / surf_usm_v(l)%dz_green_stag
3556        ENDDO     
3557
3558       
3559        CALL location_message( '    wall structures filed out', .TRUE. )
3560
3561        CALL location_message( '    initialization of wall surface model finished', .TRUE. )
3562
3563    END SUBROUTINE usm_init_material_model
3564
3565 
3566!------------------------------------------------------------------------------!
3567! Description:
3568! ------------
3569!> Initialization of the urban surface model
3570!------------------------------------------------------------------------------!
3571    SUBROUTINE usm_init_urban_surface
3572
3573        USE arrays_3d,                                                         &
3574            ONLY:  zw
3575
3576        USE netcdf_data_input_mod,                                             &
3577            ONLY:  building_pars_f, building_type_f, terrain_height_f
3578   
3579        IMPLICIT NONE
3580
3581        INTEGER(iwp) ::  i                   !< loop index x-dirction
3582        INTEGER(iwp) ::  ind_emis_wall       !< index in input list for wall emissivity
3583        INTEGER(iwp) ::  ind_emis_green      !< index in input list for green emissivity
3584        INTEGER(iwp) ::  ind_emis_win        !< index in input list for window emissivity
3585        INTEGER(iwp) ::  ind_green_frac_w    !< index in input list for green fraction on wall
3586        INTEGER(iwp) ::  ind_green_frac_r    !< index in input list for green fraction on roof
3587        INTEGER(iwp) ::  ind_hc1             !< index in input list for heat capacity at first wall layer
3588        INTEGER(iwp) ::  ind_hc2             !< index in input list for heat capacity at second wall layer
3589        INTEGER(iwp) ::  ind_hc3             !< index in input list for heat capacity at third wall layer
3590        INTEGER(iwp) ::  ind_lai_r           !< index in input list for LAI on roof
3591        INTEGER(iwp) ::  ind_lai_w           !< index in input list for LAI on wall
3592        INTEGER(iwp) ::  ind_tc1             !< index in input list for thermal conductivity at first wall layer
3593        INTEGER(iwp) ::  ind_tc2             !< index in input list for thermal conductivity at second wall layer
3594        INTEGER(iwp) ::  ind_tc3             !< index in input list for thermal conductivity at third wall layer
3595        INTEGER(iwp) ::  ind_trans           !< index in input list for window transmissivity
3596        INTEGER(iwp) ::  ind_wall_frac       !< index in input list for wall fraction
3597        INTEGER(iwp) ::  ind_win_frac        !< index in input list for window fraction
3598        INTEGER(iwp) ::  ind_z0              !< index in input list for z0
3599        INTEGER(iwp) ::  ind_z0qh            !< index in input list for z0h / z0q
3600        INTEGER(iwp) ::  j                   !< loop index y-dirction
3601        INTEGER(iwp) ::  k                   !< loop index z-dirction
3602        INTEGER(iwp) ::  l                   !< loop index surface orientation
3603        INTEGER(iwp) ::  m                   !< loop index surface element
3604        INTEGER(iwp) ::  st                  !< dummy 
3605
3606        REAL(wp)     ::  c, d, tin, twin
3607        REAL(wp)     ::  ground_floor_level_l         !< local height of ground floor level
3608        REAL(wp)     ::  z_agl                        !< height above ground
3609        REAL(wp), DIMENSION(nzb:nzt)   ::  exn        !< value of the Exner function in layers
3610
3611!
3612!-- NOPOINTER version not implemented yet
3613#if defined( __nopointer )
3614    message_string = 'The urban surface module only runs with POINTER version'
3615    CALL message( 'urban_surface_mod', 'PA0452', 1, 2, 0, 6, 0 )
3616#endif
3617
3618        CALL cpu_log( log_point_s(78), 'usm_init', 'start' )
3619!--     surface forcing have to be disabled for LSF
3620!--     in case of enabled urban surface module
3621        IF ( large_scale_forcing )  THEN
3622            lsf_surf = .FALSE.
3623        ENDIF
3624
3625!
3626!--     Flag surface elements belonging to the ground floor level. Therefore,
3627!--     use terrain height array from file, if available. This flag is later used
3628!--     to control initialization of surface attributes.
3629        surf_usm_h%ground_level = .FALSE. 
3630        DO  m = 1, surf_usm_h%ns
3631           i = surf_usm_h%i(m)
3632           j = surf_usm_h%j(m)
3633           k = surf_usm_h%k(m)
3634!
3635!--        Get local ground level. If no ground level is given in input file,
3636!--        use default value.
3637           ground_floor_level_l = ground_floor_level
3638           IF ( building_pars_f%from_file )  THEN
3639              IF ( building_pars_f%pars_xy(ind_gflh,j,i) /=                    &
3640                   building_pars_f%fill )  &
3641                 ground_floor_level_l = building_pars_f%pars_xy(ind_gflh,j,i)         
3642           ENDIF
3643!
3644!--        Determine height of surface element above ground level
3645           IF (  terrain_height_f%from_file )  THEN
3646              z_agl = zw(k) - terrain_height_f%var(j,i)
3647           ELSE
3648              z_agl = zw(k)
3649           ENDIF
3650!
3651!--        Set flag for ground level
3652           IF ( z_agl <= ground_floor_level_l )                                &
3653              surf_usm_h%ground_level(m) = .TRUE.
3654        ENDDO
3655
3656        DO  l = 0, 3
3657           surf_usm_v(l)%ground_level = .FALSE.
3658           DO  m = 1, surf_usm_v(l)%ns
3659              i = surf_usm_v(l)%i(m) + surf_usm_v(l)%ioff
3660              j = surf_usm_v(l)%j(m) + surf_usm_v(l)%joff
3661              k = surf_usm_v(l)%k(m)
3662!
3663!--           Get local ground level. If no ground level is given in input file,
3664!--           use default value.
3665              ground_floor_level_l = ground_floor_level
3666              IF ( building_pars_f%from_file )  THEN
3667                 IF ( building_pars_f%pars_xy(ind_gflh,j,i) /=                 &
3668                      building_pars_f%fill ) &
3669                    ground_floor_level_l = building_pars_f%pars_xy(ind_gflh,j,i)
3670              ENDIF
3671!
3672!--           Determine height of surface element above ground level. Please
3673!--           note, height of surface element is determined with respect to
3674!--           its height of the adjoing atmospheric grid point.
3675              IF (  terrain_height_f%from_file )  THEN
3676                 z_agl = zw(k) - terrain_height_f%var(j-surf_usm_v(l)%joff,    &
3677                                                      i-surf_usm_v(l)%ioff)
3678              ELSE
3679                 z_agl = zw(k)
3680              ENDIF
3681!
3682!--           Set flag for ground level
3683              IF ( z_agl <= ground_floor_level_l )                                &
3684                 surf_usm_v(l)%ground_level(m) = .TRUE.
3685
3686           ENDDO
3687        ENDDO
3688!
3689!--     Initialization of resistances.
3690        DO  m = 1, surf_usm_h%ns
3691           surf_usm_h%r_a(m)        = 50.0_wp
3692           surf_usm_h%r_a_green(m)  = 50.0_wp
3693           surf_usm_h%r_a_window(m) = 50.0_wp
3694        ENDDO
3695        DO  l = 0, 3
3696           DO  m = 1, surf_usm_v(l)%ns
3697              surf_usm_v(l)%r_a(m)        = 50.0_wp
3698              surf_usm_v(l)%r_a_green(m)  = 50.0_wp
3699              surf_usm_v(l)%r_a_window(m) = 50.0_wp
3700           ENDDO
3701        ENDDO
3702!
3703!--     Initialize urban-type surface attribute. According to initialization in
3704!--     land-surface model, follow a 3-level approach.
3705!--     Level 1 - initialization via default attributes
3706        DO  m = 1, surf_usm_h%ns
3707!
3708!--        Now, all horizontal surfaces are roof surfaces (?)
3709           surf_usm_h%isroof_surf(m)   = .TRUE.
3710           surf_usm_h%surface_types(m) = roof_category         !< default category for root surface
3711!
3712!--        In order to distinguish between ground floor level and
3713!--        above-ground-floor level surfaces, set input indices.
3714           ind_wall_frac    = MERGE( ind_wall_frac_gfl,    ind_wall_frac_agfl,    &
3715                                     surf_usm_h%ground_level(m) )
3716           ind_win_frac     = MERGE( ind_win_frac_gfl,     ind_win_frac_agfl,     &
3717                                     surf_usm_h%ground_level(m) )
3718           ind_green_frac_w = MERGE( ind_green_frac_w_gfl, ind_green_frac_w_agfl, &
3719                                     surf_usm_h%ground_level(m) )
3720           ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, &
3721                                     surf_usm_h%ground_level(m) )
3722           ind_lai_r        = MERGE( ind_lai_r_gfl,        ind_lai_r_agfl,        &
3723                                     surf_usm_h%ground_level(m) )
3724           ind_lai_w        = MERGE( ind_lai_w_gfl,        ind_lai_w_agfl,        &
3725                                     surf_usm_h%ground_level(m) )
3726           ind_hc1          = MERGE( ind_hc1_gfl,          ind_hc1_agfl,          &
3727                                     surf_usm_h%ground_level(m) )
3728           ind_hc2          = MERGE( ind_hc2_gfl,          ind_hc2_agfl,          &
3729                                     surf_usm_h%ground_level(m) )
3730           ind_hc3          = MERGE( ind_hc3_gfl,          ind_hc3_agfl,          &
3731                                     surf_usm_h%ground_level(m) )
3732           ind_tc1          = MERGE( ind_tc1_gfl,          ind_tc1_agfl,          &
3733                                     surf_usm_h%ground_level(m) )
3734           ind_tc2          = MERGE( ind_tc2_gfl,          ind_tc2_agfl,          &
3735                                     surf_usm_h%ground_level(m) )
3736           ind_tc3          = MERGE( ind_tc3_gfl,          ind_tc3_agfl,          &
3737                                     surf_usm_h%ground_level(m) )
3738           ind_emis_wall    = MERGE( ind_emis_wall_gfl,    ind_emis_wall_agfl,    &
3739                                     surf_usm_h%ground_level(m) )
3740           ind_emis_green   = MERGE( ind_emis_green_gfl,   ind_emis_green_agfl,   &
3741                                     surf_usm_h%ground_level(m) )
3742           ind_emis_win     = MERGE( ind_emis_win_gfl,     ind_emis_win_agfl,     &
3743                                     surf_usm_h%ground_level(m) )
3744           ind_trans        = MERGE( ind_trans_gfl,        ind_trans_agfl,        &
3745                                     surf_usm_h%ground_level(m) )
3746           ind_z0           = MERGE( ind_z0_gfl,           ind_z0_agfl,           &
3747                                     surf_usm_h%ground_level(m) )
3748           ind_z0qh         = MERGE( ind_z0qh_gfl,         ind_z0qh_agfl,         &
3749                                     surf_usm_h%ground_level(m) )
3750!
3751!--        Initialize relatvie wall- (0), green- (1) and window (2) fractions
3752           surf_usm_h%frac(ind_veg_wall,m)  = building_pars(ind_wall_frac,building_type)   
3753           surf_usm_h%frac(ind_pav_green,m) = building_pars(ind_green_frac_r,building_type) 
3754           surf_usm_h%frac(ind_wat_win,m)   = building_pars(ind_win_frac,building_type) 
3755           surf_usm_h%lai(m)                = building_pars(ind_green_frac_r,building_type) 
3756
3757           surf_usm_h%rho_c_wall(nzb_wall,m)   = building_pars(ind_hc1,building_type) 
3758           surf_usm_h%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1,building_type)
3759           surf_usm_h%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2,building_type)
3760           surf_usm_h%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3,building_type)   
3761           surf_usm_h%lambda_h(nzb_wall,m)   = building_pars(ind_tc1,building_type) 
3762           surf_usm_h%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1,building_type) 
3763           surf_usm_h%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2,building_type)
3764           surf_usm_h%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3,building_type)   
3765           surf_usm_h%rho_c_green(nzb_wall,m)   = building_pars(ind_hc1,building_type) 
3766           surf_usm_h%rho_c_green(nzb_wall+1,m) = building_pars(ind_hc1,building_type)
3767           surf_usm_h%rho_c_green(nzb_wall+2,m) = building_pars(ind_hc2,building_type)
3768           surf_usm_h%rho_c_green(nzb_wall+3,m) = building_pars(ind_hc3,building_type)   
3769           surf_usm_h%lambda_h_green(nzb_wall,m)   = building_pars(ind_tc1,building_type) 
3770           surf_usm_h%lambda_h_green(nzb_wall+1,m) = building_pars(ind_tc1,building_type) 
3771           surf_usm_h%lambda_h_green(nzb_wall+2,m) = building_pars(ind_tc2,building_type)
3772           surf_usm_h%lambda_h_green(nzb_wall+3,m) = building_pars(ind_tc3,building_type)
3773           surf_usm_h%rho_c_window(nzb_wall,m)   = building_pars(ind_hc1,building_type) 
3774           surf_usm_h%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1,building_type)
3775           surf_usm_h%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2,building_type)
3776           surf_usm_h%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3,building_type)   
3777           surf_usm_h%lambda_h_window(nzb_wall,m)   = building_pars(ind_tc1,building_type) 
3778           surf_usm_h%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1,building_type) 
3779           surf_usm_h%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2,building_type)
3780           surf_usm_h%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3,building_type)   
3781
3782           surf_usm_h%target_temp_summer(m)  = building_pars(12,building_type)   
3783           surf_usm_h%target_temp_winter(m)  = building_pars(13,building_type)   
3784!
3785!--        emissivity of wall-, green- and window fraction
3786           surf_usm_h%emissivity(ind_veg_wall,m)  = building_pars(ind_emis_wall,building_type)
3787           surf_usm_h%emissivity(ind_pav_green,m) = building_pars(ind_emis_green,building_type)
3788           surf_usm_h%emissivity(ind_wat_win,m)   = building_pars(ind_emis_win,building_type)
3789
3790           surf_usm_h%transmissivity(m)      = building_pars(ind_trans,building_type)
3791
3792           surf_usm_h%z0(m)                  = building_pars(ind_z0,building_type)
3793           surf_usm_h%z0h(m)                 = building_pars(ind_z0qh,building_type)
3794           surf_usm_h%z0q(m)                 = building_pars(ind_z0qh,building_type)
3795!
3796!--        albedo type for wall fraction, green fraction, window fraction
3797           surf_usm_h%albedo_type(ind_veg_wall,m)  = INT( building_pars(ind_alb_wall,building_type)  )
3798           surf_usm_h%albedo_type(ind_pav_green,m) = INT( building_pars(ind_alb_green,building_type) )
3799           surf_usm_h%albedo_type(ind_wat_win,m)   = INT( building_pars(ind_alb_win,building_type)   )
3800
3801           surf_usm_h%zw(nzb_wall,m)         = building_pars(ind_thick_1,building_type)
3802           surf_usm_h%zw(nzb_wall+1,m)       = building_pars(ind_thick_2,building_type)
3803           surf_usm_h%zw(nzb_wall+2,m)       = building_pars(ind_thick_3,building_type)
3804           surf_usm_h%zw(nzb_wall+3,m)       = building_pars(ind_thick_4,building_type)
3805           
3806           surf_usm_h%zw_green(nzb_wall,m)         = building_pars(ind_thick_1,building_type)
3807           surf_usm_h%zw_green(nzb_wall+1,m)       = building_pars(ind_thick_2,building_type)
3808           surf_usm_h%zw_green(nzb_wall+2,m)       = building_pars(ind_thick_3,building_type)
3809           surf_usm_h%zw_green(nzb_wall+3,m)       = building_pars(ind_thick_4,building_type)
3810           
3811           surf_usm_h%zw_window(nzb_wall,m)         = building_pars(ind_thick_1,building_type)
3812           surf_usm_h%zw_window(nzb_wall+1,m)       = building_pars(ind_thick_2,building_type)
3813           surf_usm_h%zw_window(nzb_wall+2,m)       = building_pars(ind_thick_3,building_type)
3814           surf_usm_h%zw_window(nzb_wall+3,m)       = building_pars(ind_thick_4,building_type)
3815
3816           surf_usm_h%c_surface(m)           = building_pars(45,building_type) 
3817           surf_usm_h%lambda_surf(m)         = building_pars(46,building_type) 
3818           surf_usm_h%c_surface_green(m)     = building_pars(45,building_type) 
3819           surf_usm_h%lambda_surf_green(m)   = building_pars(46,building_type) 
3820           surf_usm_h%c_surface_window(m)    = building_pars(45,building_type) 
3821           surf_usm_h%lambda_surf_window(m)  = building_pars(46,building_type) 
3822
3823        ENDDO
3824
3825        DO  l = 0, 3
3826           DO  m = 1, surf_usm_v(l)%ns
3827
3828              surf_usm_v(l)%surface_types(m) = wall_category         !< default category for root surface
3829!
3830!--           In order to distinguish between ground floor level and
3831!--           above-ground-floor level surfaces, set input indices.
3832              ind_wall_frac    = MERGE( ind_wall_frac_gfl,    ind_wall_frac_agfl,    &
3833                                        surf_usm_v(l)%ground_level(m) )
3834              ind_win_frac     = MERGE( ind_win_frac_gfl,     ind_win_frac_agfl,     &
3835                                        surf_usm_v(l)%ground_level(m) )
3836              ind_green_frac_w = MERGE( ind_green_frac_w_gfl, ind_green_frac_w_agfl, &
3837                                        surf_usm_v(l)%ground_level(m) )
3838              ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, &
3839                                        surf_usm_v(l)%ground_level(m) )
3840              ind_lai_r        = MERGE( ind_lai_r_gfl,        ind_lai_r_agfl,        &
3841                                        surf_usm_v(l)%ground_level(m) )
3842              ind_lai_w        = MERGE( ind_lai_w_gfl,        ind_lai_w_agfl,        &
3843                                        surf_usm_v(l)%ground_level(m) )
3844              ind_hc1          = MERGE( ind_hc1_gfl,          ind_hc1_agfl,          &
3845                                        surf_usm_v(l)%ground_level(m) )
3846              ind_hc2          = MERGE( ind_hc2_gfl,          ind_hc2_agfl,          &
3847                                        surf_usm_v(l)%ground_level(m) )
3848              ind_hc3          = MERGE( ind_hc3_gfl,          ind_hc3_agfl,          &
3849                                        surf_usm_v(l)%ground_level(m) )
3850              ind_tc1          = MERGE( ind_tc1_gfl,          ind_tc1_agfl,          &
3851                                        surf_usm_v(l)%ground_level(m) )
3852              ind_tc2          = MERGE( ind_tc2_gfl,          ind_tc2_agfl,          &
3853                                        surf_usm_v(l)%ground_level(m) )
3854              ind_tc3          = MERGE( ind_tc3_gfl,          ind_tc3_agfl,          &
3855                                        surf_usm_v(l)%ground_level(m) )
3856              ind_emis_wall    = MERGE( ind_emis_wall_gfl,    ind_emis_wall_agfl,    &
3857                                        surf_usm_v(l)%ground_level(m) )
3858              ind_emis_green   = MERGE( ind_emis_green_gfl,   ind_emis_green_agfl,   &
3859                                        surf_usm_v(l)%ground_level(m) )
3860              ind_emis_win     = MERGE( ind_emis_win_gfl,     ind_emis_win_agfl,     &
3861                                        surf_usm_v(l)%ground_level(m) )
3862              ind_trans        = MERGE( ind_trans_gfl,       ind_trans_agfl,         &
3863                                        surf_usm_v(l)%ground_level(m) )
3864              ind_z0           = MERGE( ind_z0_gfl,           ind_z0_agfl,           &
3865                                        surf_usm_v(l)%ground_level(m) )
3866              ind_z0qh         = MERGE( ind_z0qh_gfl,         ind_z0qh_agfl,         &
3867                                        surf_usm_v(l)%ground_level(m) )
3868
3869!
3870!--           Initialize relatvie wall- (0), green- (1) and window (2) fractions
3871              surf_usm_v(l)%frac(ind_veg_wall,m)   = building_pars(ind_wall_frac,building_type)   
3872              surf_usm_v(l)%frac(ind_pav_green,m)  = building_pars(ind_green_frac_w,building_type) 
3873              surf_usm_v(l)%frac(ind_wat_win,m)    = building_pars(ind_win_frac,building_type) 
3874              surf_usm_v(l)%lai(m)                 = building_pars(ind_lai_w,building_type) 
3875
3876              surf_usm_v(l)%rho_c_wall(nzb_wall,m)   = building_pars(ind_hc1,building_type) 
3877              surf_usm_v(l)%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1,building_type)
3878              surf_usm_v(l)%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2,building_type)
3879              surf_usm_v(l)%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3,building_type)   
3880             
3881              surf_usm_v(l)%rho_c_green(nzb_wall,m)   = building_pars(ind_hc1,building_type) 
3882              surf_usm_v(l)%rho_c_green(nzb_wall+1,m) = building_pars(ind_hc1,building_type)
3883              surf_usm_v(l)%rho_c_green(nzb_wall+2,m) = building_pars(ind_hc2,building_type)
3884              surf_usm_v(l)%rho_c_green(nzb_wall+3,m) = building_pars(ind_hc3,building_type)   
3885             
3886              surf_usm_v(l)%rho_c_window(nzb_wall,m)   = building_pars(ind_hc1,building_type) 
3887              surf_usm_v(l)%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1,building_type)
3888              surf_usm_v(l)%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2,building_type)
3889              surf_usm_v(l)%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3,building_type)   
3890
3891              surf_usm_v(l)%lambda_h(nzb_wall,m)   = building_pars(ind_tc1,building_type) 
3892              surf_usm_v(l)%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1,building_type) 
3893              surf_usm_v(l)%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2,building_type)
3894              surf_usm_v(l)%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3,building_type)   
3895             
3896              surf_usm_v(l)%lambda_h_green(nzb_wall,m)   = building_pars(ind_tc1,building_type) 
3897              surf_usm_v(l)%lambda_h_green(nzb_wall+1,m) = building_pars(ind_tc1,building_type) 
3898              surf_usm_v(l)%lambda_h_green(nzb_wall+2,m) = building_pars(ind_tc2,building_type)
3899              surf_usm_v(l)%lambda_h_green(nzb_wall+3,m) = building_pars(ind_tc3,building_type)   
3900
3901              surf_usm_v(l)%lambda_h_window(nzb_wall,m)   = building_pars(ind_tc1,building_type) 
3902              surf_usm_v(l)%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1,building_type) 
3903              surf_usm_v(l)%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2,building_type)
3904              surf_usm_v(l)%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3,building_type)   
3905
3906              surf_usm_v(l)%target_temp_summer(m)  = building_pars(12,building_type)   
3907              surf_usm_v(l)%target_temp_winter(m)  = building_pars(13,building_type)   
3908!
3909!--           emissivity of wall-, green- and window fraction
3910              surf_usm_v(l)%emissivity(ind_veg_wall,m)  = building_pars(ind_emis_wall,building_type)
3911              surf_usm_v(l)%emissivity(ind_pav_green,m) = building_pars(ind_emis_green,building_type)
3912              surf_usm_v(l)%emissivity(ind_wat_win,m)   = building_pars(ind_emis_win,building_type)
3913
3914              surf_usm_v(l)%transmissivity(m)      = building_pars(ind_trans,building_type)
3915
3916              surf_usm_v(l)%z0(m)                  = building_pars(ind_z0,building_type)
3917              surf_usm_v(l)%z0h(m)                 = building_pars(ind_z0qh,building_type)
3918              surf_usm_v(l)%z0q(m)                 = building_pars(ind_z0qh,building_type)
3919
3920              surf_usm_v(l)%albedo_type(ind_veg_wall,m)  = INT( building_pars(ind_alb_wall,building_type) )
3921              surf_usm_v(l)%albedo_type(ind_pav_green,m) = INT( building_pars(ind_alb_green,building_type) )
3922              surf_usm_v(l)%albedo_type(ind_wat_win,m)   = INT( building_pars(ind_alb_win,building_type) )
3923
3924              surf_usm_v(l)%zw(nzb_wall,m)         = building_pars(ind_thick_1,building_type)
3925              surf_usm_v(l)%zw(nzb_wall+1,m)       = building_pars(ind_thick_2,building_type)
3926              surf_usm_v(l)%zw(nzb_wall+2,m)       = building_pars(ind_thick_3,building_type)
3927              surf_usm_v(l)%zw(nzb_wall+3,m)       = building_pars(ind_thick_4,building_type)
3928             
3929              surf_usm_v(l)%zw_green(nzb_wall,m)         = building_pars(ind_thick_1,building_type)
3930              surf_usm_v(l)%zw_green(nzb_wall+1,m)       = building_pars(ind_thick_2,building_type)
3931              surf_usm_v(l)%zw_green(nzb_wall+2,m)       = building_pars(ind_thick_3,building_type)
3932              surf_usm_v(l)%zw_green(nzb_wall+3,m)       = building_pars(ind_thick_4,building_type)
3933
3934              surf_usm_v(l)%zw_window(nzb_wall,m)         = building_pars(ind_thick_1,building_type)
3935              surf_usm_v(l)%zw_window(nzb_wall+1,m)       = building_pars(ind_thick_2,building_type)
3936              surf_usm_v(l)%zw_window(nzb_wall+2,m)       = building_pars(ind_thick_3,building_type)
3937              surf_usm_v(l)%zw_window(nzb_wall+3,m)       = building_pars(ind_thick_4,building_type)
3938
3939              surf_usm_v(l)%c_surface(m)           = building_pars(45,building_type) 
3940              surf_usm_v(l)%lambda_surf(m)         = building_pars(46,building_type)
3941              surf_usm_v(l)%c_surface_green(m)     = building_pars(45,building_type) 
3942              surf_usm_v(l)%lambda_surf_green(m)   = building_pars(46,building_type)
3943              surf_usm_v(l)%c_surface_window(m)    = building_pars(45,building_type) 
3944              surf_usm_v(l)%lambda_surf_window(m)  = building_pars(46,building_type)
3945
3946           ENDDO
3947        ENDDO
3948!
3949!--     Level 2 - initialization via building type read from file
3950        IF ( building_type_f%from_file )  THEN
3951           DO  m = 1, surf_usm_h%ns
3952              i = surf_usm_h%i(m)
3953              j = surf_usm_h%j(m)
3954!
3955!--           For the moment, limit building type to 6 (to overcome errors in input file).
3956              st = building_type_f%var(j,i)
3957              IF ( st /= building_type_f%fill )  THEN
3958
3959!
3960!--              In order to distinguish between ground floor level and
3961!--              above-ground-floor level surfaces, set input indices.
3962                 ind_wall_frac    = MERGE( ind_wall_frac_gfl,    ind_wall_frac_agfl,    &
3963                                           surf_usm_h%ground_level(m) )
3964                 ind_win_frac     = MERGE( ind_win_frac_gfl,     ind_win_frac_agfl,     &
3965                                           surf_usm_h%ground_level(m) )
3966                 ind_green_frac_w = MERGE( ind_green_frac_w_gfl, ind_green_frac_w_agfl, &
3967                                           surf_usm_h%ground_level(m) )
3968                 ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, &
3969                                           surf_usm_h%ground_level(m) )
3970                 ind_lai_r        = MERGE( ind_lai_r_gfl,        ind_lai_r_agfl,        &
3971                                           surf_usm_h%ground_level(m) )
3972                 ind_lai_w        = MERGE( ind_lai_w_gfl,        ind_lai_w_agfl,        &
3973                                           surf_usm_h%ground_level(m) )
3974                 ind_hc1          = MERGE( ind_hc1_gfl,          ind_hc1_agfl,          &
3975                                           surf_usm_h%ground_level(m) )
3976                 ind_hc2          = MERGE( ind_hc2_gfl,          ind_hc2_agfl,          &
3977                                           surf_usm_h%ground_level(m) )
3978                 ind_hc3          = MERGE( ind_hc3_gfl,          ind_hc3_agfl,          &
3979                                           surf_usm_h%ground_level(m) )
3980                 ind_tc1          = MERGE( ind_tc1_gfl,          ind_tc1_agfl,          &
3981                                           surf_usm_h%ground_level(m) )
3982                 ind_tc2          = MERGE( ind_tc2_gfl,          ind_tc2_agfl,          &
3983                                           surf_usm_h%ground_level(m) )
3984                 ind_tc3          = MERGE( ind_tc3_gfl,          ind_tc3_agfl,          &
3985                                           surf_usm_h%ground_level(m) )
3986                 ind_emis_wall    = MERGE( ind_emis_wall_gfl,    ind_emis_wall_agfl,    &
3987                                           surf_usm_h%ground_level(m) )
3988                 ind_emis_green   = MERGE( ind_emis_green_gfl,   ind_emis_green_agfl,   &
3989                                           surf_usm_h%ground_level(m) )
3990                 ind_emis_win     = MERGE( ind_emis_win_gfl,     ind_emis_win_agfl,     &
3991                                           surf_usm_h%ground_level(m) )
3992                 ind_trans        = MERGE( ind_trans_gfl,        ind_trans_agfl,        &
3993                                           surf_usm_h%ground_level(m) )
3994                 ind_z0           = MERGE( ind_z0_gfl,           ind_z0_agfl,           &
3995                                           surf_usm_h%ground_level(m) )
3996                 ind_z0qh         = MERGE( ind_z0qh_gfl,         ind_z0qh_agfl,         &
3997                                           surf_usm_h%ground_level(m) )
3998
3999!
4000!--              Initialize relatvie wall- (0), green- (1) and window (2) fractions
4001                 surf_usm_h%frac(ind_veg_wall,m)  = building_pars(ind_wall_frac,st)   
4002                 surf_usm_h%frac(ind_pav_green,m) = building_pars(ind_green_frac_r,st) 
4003                 surf_usm_h%frac(ind_wat_win,m)   = building_pars(ind_win_frac,st) 
4004                 surf_usm_h%lai(m)                = building_pars(ind_green_frac_r,st) 
4005
4006                 surf_usm_h%rho_c_wall(nzb_wall,m)   = building_pars(ind_hc1,st) 
4007                 surf_usm_h%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1,st)
4008                 surf_usm_h%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2,st)
4009                 surf_usm_h%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3,st)   
4010                 surf_usm_h%lambda_h(nzb_wall,m)   = building_pars(ind_tc1,st) 
4011                 surf_usm_h%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1,st) 
4012                 surf_usm_h%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2,st)
4013                 surf_usm_h%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3,st)   
4014                 
4015                 surf_usm_h%rho_c_green(nzb_wall,m)   = building_pars(ind_hc1,st) 
4016                 surf_usm_h%rho_c_green(nzb_wall+1,m) = building_pars(ind_hc1,st)
4017                 surf_usm_h%rho_c_green(nzb_wall+2,m) = building_pars(ind_hc2,st)
4018                 surf_usm_h%rho_c_green(nzb_wall+3,m) = building_pars(ind_hc3,st)   
4019                 surf_usm_h%lambda_h_green(nzb_wall,m)   = building_pars(ind_tc1,st) 
4020                 surf_usm_h%lambda_h_green(nzb_wall+1,m) = building_pars(ind_tc1,st) 
4021                 surf_usm_h%lambda_h_green(nzb_wall+2,m) = building_pars(ind_tc2,st)
4022                 surf_usm_h%lambda_h_green(nzb_wall+3,m) = building_pars(ind_tc3,st)   
4023               
4024                 surf_usm_h%rho_c_window(nzb_wall,m)   = building_pars(ind_hc1,st) 
4025                 surf_usm_h%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1,st)
4026                 surf_usm_h%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2,st)
4027                 surf_usm_h%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3,st)   
4028                 surf_usm_h%lambda_h_window(nzb_wall,m)   = building_pars(ind_tc1,st) 
4029                 surf_usm_h%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1,st) 
4030                 surf_usm_h%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2,st)
4031                 surf_usm_h%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3,st)   
4032
4033                 surf_usm_h%target_temp_summer(m)  = building_pars(12,st)   
4034                 surf_usm_h%target_temp_winter(m)  = building_pars(13,st)   
4035!
4036!--              emissivity of wall-, green- and window fraction
4037                 surf_usm_h%emissivity(ind_veg_wall,m)  = building_pars(ind_emis_wall,st)
4038                 surf_usm_h%emissivity(ind_pav_green,m) = building_pars(ind_emis_green,st)
4039                 surf_usm_h%emissivity(ind_wat_win,m)   = building_pars(ind_emis_win,st)
4040
4041                 surf_usm_h%transmissivity(m)      = building_pars(ind_trans,st)
4042
4043                 surf_usm_h%z0(m)                  = building_pars(ind_z0,st)
4044                 surf_usm_h%z0h(m)                 = building_pars(ind_z0qh,st)
4045                 surf_usm_h%z0q(m)                 = building_pars(ind_z0qh,st)
4046!
4047!--              albedo type for wall fraction, green fraction, window fraction
4048                 surf_usm_h%albedo_type(ind_veg_wall,m)  = INT( building_pars(ind_alb_wall,st) )
4049                 surf_usm_h%albedo_type(ind_pav_green,m) = INT( building_pars(ind_alb_green,st) )
4050                 surf_usm_h%albedo_type(ind_wat_win,m)   = INT( building_pars(ind_alb_win,st) )
4051
4052                 surf_usm_h%zw(nzb_wall,m)         = building_pars(ind_thick_1,st)
4053                 surf_usm_h%zw(nzb_wall+1,m)       = building_pars(ind_thick_2,st)
4054                 surf_usm_h%zw(nzb_wall+2,m)       = building_pars(ind_thick_3,st)
4055                 surf_usm_h%zw(nzb_wall+3,m)       = building_pars(ind_thick_4,st)
4056                 
4057                 surf_usm_h%zw_green(nzb_wall,m)         = building_pars(ind_thick_1,st)
4058                 surf_usm_h%zw_green(nzb_wall+1,m)       = building_pars(ind_thick_2,st)
4059                 surf_usm_h%zw_green(nzb_wall+2,m)       = building_pars(ind_thick_3,st)
4060                 surf_usm_h%zw_green(nzb_wall+3,m)       = building_pars(ind_thick_4,st)
4061
4062                 surf_usm_h%zw_window(nzb_wall,m)         = building_pars(ind_thick_1,st)
4063                 surf_usm_h%zw_window(nzb_wall+1,m)       = building_pars(ind_thick_2,st)
4064                 surf_usm_h%zw_window(nzb_wall+2,m)       = building_pars(ind_thick_3,st)
4065                 surf_usm_h%zw_window(nzb_wall+3,m)       = building_pars(ind_thick_4,st)
4066
4067                 surf_usm_h%c_surface(m)           = building_pars(45,st) 
4068                 surf_usm_h%lambda_surf(m)         = building_pars(46,st)
4069                 surf_usm_h%c_surface_green(m)     = building_pars(45,st) 
4070                 surf_usm_h%lambda_surf_green(m)   = building_pars(46,st)
4071                 surf_usm_h%c_surface_window(m)    = building_pars(45,st) 
4072                 surf_usm_h%lambda_surf_window(m)  = building_pars(46,st)
4073
4074              ENDIF
4075           ENDDO
4076
4077           DO  l = 0, 3
4078              DO  m = 1, surf_usm_v(l)%ns
4079                 i = surf_usm_v(l)%i(m) + surf_usm_v(l)%ioff
4080                 j = surf_usm_v(l)%j(m) + surf_usm_v(l)%joff
4081!
4082!--              For the moment, limit building type to 6 (to overcome errors in input file).
4083
4084                 st = building_type_f%var(j,i)
4085                 IF ( st /= building_type_f%fill )  THEN
4086
4087!
4088!--                 In order to distinguish between ground floor level and
4089!--                 above-ground-floor level surfaces, set input indices.
4090                    ind_wall_frac    = MERGE( ind_wall_frac_gfl,    ind_wall_frac_agfl,    &
4091                                              surf_usm_v(l)%ground_level(m) )
4092                    ind_win_frac     = MERGE( ind_win_frac_gfl,     ind_win_frac_agfl,     &
4093                                              surf_usm_v(l)%ground_level(m) )
4094                    ind_green_frac_w = MERGE( ind_green_frac_w_gfl, ind_green_frac_w_agfl, &
4095                                              surf_usm_v(l)%ground_level(m) )
4096                    ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, &
4097                                              surf_usm_v(l)%ground_level(m) )
4098                    ind_lai_r        = MERGE( ind_lai_r_gfl,        ind_lai_r_agfl,        &
4099                                              surf_usm_v(l)%ground_level(m) )
4100                    ind_lai_w        = MERGE( ind_lai_w_gfl,        ind_lai_w_agfl,        &
4101                                              surf_usm_v(l)%ground_level(m) )
4102                    ind_hc1          = MERGE( ind_hc1_gfl,          ind_hc1_agfl,          &
4103                                              surf_usm_v(l)%ground_level(m) )
4104                    ind_hc2          = MERGE( ind_hc2_gfl,          ind_hc2_agfl,          &
4105                                              surf_usm_v(l)%ground_level(m) )
4106                    ind_hc3          = MERGE( ind_hc3_gfl,          ind_hc3_agfl,          &
4107                                              surf_usm_v(l)%ground_level(m) )
4108                    ind_tc1          = MERGE( ind_tc1_gfl,          ind_tc1_agfl,          &
4109                                              surf_usm_v(l)%ground_level(m) )
4110                    ind_tc2          = MERGE( ind_tc2_gfl,          ind_tc2_agfl,          &
4111                                              surf_usm_v(l)%ground_level(m) )
4112                    ind_tc3          = MERGE( ind_tc3_gfl,          ind_tc3_agfl,          &
4113                                              surf_usm_v(l)%ground_level(m) )
4114                    ind_emis_wall    = MERGE( ind_emis_wall_gfl,    ind_emis_wall_agfl,    &
4115                                              surf_usm_v(l)%ground_level(m) )
4116                    ind_emis_green   = MERGE( ind_emis_green_gfl,   ind_emis_green_agfl,   &
4117                                              surf_usm_v(l)%ground_level(m) )
4118                    ind_emis_win     = MERGE( ind_emis_win_gfl,     ind_emis_win_agfl,     &
4119                                              surf_usm_v(l)%ground_level(m) )
4120                    ind_trans        = MERGE( ind_trans_gfl,       ind_trans_agfl,         &
4121                                        surf_usm_v(l)%ground_level(m) )
4122                    ind_z0           = MERGE( ind_z0_gfl,           ind_z0_agfl,           &
4123                                              surf_usm_v(l)%ground_level(m) )
4124                    ind_z0qh         = MERGE( ind_z0qh_gfl,         ind_z0qh_agfl,         &
4125                                              surf_usm_v(l)%ground_level(m) )
4126
4127!
4128!--                 Initialize relatvie wall- (0), green- (1) and window (2) fractions
4129                    surf_usm_v(l)%frac(ind_veg_wall,m)  = building_pars(ind_wall_frac,st)   
4130                    surf_usm_v(l)%frac(ind_pav_green,m) = building_pars(ind_green_frac_w,st) 
4131                    surf_usm_v(l)%frac(ind_wat_win,m)   = building_pars(ind_win_frac,st)   
4132                    surf_usm_v(l)%lai(m)                = building_pars(ind_lai_w,st) 
4133
4134                    surf_usm_v(l)%rho_c_wall(nzb_wall,m)   = building_pars(ind_hc1,st) 
4135                    surf_usm_v(l)%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1,st)
4136                    surf_usm_v(l)%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2,st)
4137                    surf_usm_v(l)%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3,st)
4138                   
4139                    surf_usm_v(l)%rho_c_green(nzb_wall,m)   = building_pars(ind_hc1,st) 
4140                    surf_usm_v(l)%rho_c_green(nzb_wall+1,m) = building_pars(ind_hc1,st)
4141                    surf_usm_v(l)%rho_c_green(nzb_wall+2,m) = building_pars(ind_hc2,st)
4142                    surf_usm_v(l)%rho_c_green(nzb_wall+3,m) = building_pars(ind_hc3,st)
4143                   
4144                    surf_usm_v(l)%rho_c_window(nzb_wall,m)   = building_pars(ind_hc1,st) 
4145                    surf_usm_v(l)%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1,st)
4146                    surf_usm_v(l)%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2,st)
4147                    surf_usm_v(l)%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3,st)
4148
4149                    surf_usm_v(l)%lambda_h(nzb_wall,m)   = building_pars(ind_tc1,st) 
4150                    surf_usm_v(l)%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1,st) 
4151                    surf_usm_v(l)%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2,st)
4152                    surf_usm_v(l)%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3,st) 
4153                   
4154                    surf_usm_v(l)%lambda_h_green(nzb_wall,m)   = building_pars(ind_tc1,st) 
4155                    surf_usm_v(l)%lambda_h_green(nzb_wall+1,m) = building_pars(ind_tc1,st) 
4156                    surf_usm_v(l)%lambda_h_green(nzb_wall+2,m) = building_pars(ind_tc2,st)
4157                    surf_usm_v(l)%lambda_h_green(nzb_wall+3,m) = building_pars(ind_tc3,st) 
4158                   
4159                    surf_usm_v(l)%lambda_h_window(nzb_wall,m)   = building_pars(ind_tc1,st) 
4160                    surf_usm_v(l)%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1,st) 
4161                    surf_usm_v(l)%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2,st)
4162                    surf_usm_v(l)%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3,st) 
4163
4164                    surf_usm_v(l)%target_temp_summer(m)  = building_pars(12,st)   
4165                    surf_usm_v(l)%target_temp_winter(m)  = building_pars(13,st)   
4166!
4167!--                 emissivity of wall-, green- and window fraction
4168                    surf_usm_v(l)%emissivity(ind_veg_wall,m)  = building_pars(ind_emis_wall,st)
4169                    surf_usm_v(l)%emissivity(ind_pav_green,m) = building_pars(ind_emis_green,st)
4170                    surf_usm_v(l)%emissivity(ind_wat_win,m)   = building_pars(ind_emis_win,st)
4171
4172                    surf_usm_v(l)%transmissivity(m)      = building_pars(ind_trans,st)
4173
4174                    surf_usm_v(l)%z0(m)                  = building_pars(ind_z0,st)
4175                    surf_usm_v(l)%z0h(m)                 = building_pars(ind_z0qh,st)
4176                    surf_usm_v(l)%z0q(m)                 = building_pars(ind_z0qh,st)
4177
4178                    surf_usm_v(l)%albedo_type(ind_veg_wall,m)  = INT( building_pars(ind_alb_wall,st) )
4179                    surf_usm_v(l)%albedo_type(ind_pav_green,m) = INT( building_pars(ind_alb_green,st) )
4180                    surf_usm_v(l)%albedo_type(ind_wat_win,m)   = INT( building_pars(ind_alb_win,st) )
4181
4182                    surf_usm_v(l)%zw(nzb_wall,m)         = building_pars(ind_thick_1,st)
4183                    surf_usm_v(l)%zw(nzb_wall+1,m)       = building_pars(ind_thick_2,st)
4184                    surf_usm_v(l)%zw(nzb_wall+2,m)       = building_pars(ind_thick_3,st)
4185                    surf_usm_v(l)%zw(nzb_wall+3,m)       = building_pars(ind_thick_4,st)
4186                   
4187                    surf_usm_v(l)%zw_green(nzb_wall,m)         = building_pars(ind_thick_1,st)
4188                    surf_usm_v(l)%zw_green(nzb_wall+1,m)       = building_pars(ind_thick_2,st)
4189                    surf_usm_v(l)%zw_green(nzb_wall+2,m)       = building_pars(ind_thick_3,st)
4190                    surf_usm_v(l)%zw_green(nzb_wall+3,m)       = building_pars(ind_thick_4,st)
4191                   
4192                    surf_usm_v(l)%zw_window(nzb_wall,m)         = building_pars(ind_thick_1,st)
4193                    surf_usm_v(l)%zw_window(nzb_wall+1,m)       = building_pars(ind_thick_2,st)
4194                    surf_usm_v(l)%zw_window(nzb_wall+2,m)       = building_pars(ind_thick_3,st)
4195                    surf_usm_v(l)%zw_window(nzb_wall+3,m)       = building_pars(ind_thick_4,st)
4196
4197                    surf_usm_v(l)%c_surface(m)           = building_pars(45,st) 
4198                    surf_usm_v(l)%lambda_surf(m)         = building_pars(46,st) 
4199                    surf_usm_v(l)%c_surface_green(m)     = building_pars(45,st) 
4200                    surf_usm_v(l)%lambda_surf_green(m)   = building_pars(46,st) 
4201                    surf_usm_v(l)%c_surface_window(m)    = building_pars(45,st) 
4202                    surf_usm_v(l)%lambda_surf_window(m)  = building_pars(46,st) 
4203
4204
4205                 ENDIF
4206              ENDDO
4207           ENDDO
4208        ENDIF 
4209
4210!
4211!--     Level 3 - initialization via building_pars read from file
4212        IF ( building_pars_f%from_file )  THEN
4213           DO  m = 1, surf_usm_h%ns
4214              i = surf_usm_h%i(m)
4215              j = surf_usm_h%j(m)
4216
4217!
4218!--           In order to distinguish between ground floor level and
4219!--           above-ground-floor level surfaces, set input indices.
4220              ind_wall_frac    = MERGE( ind_wall_frac_gfl,    ind_wall_frac_agfl,    &
4221                                        surf_usm_h%ground_level(m) )
4222              ind_win_frac     = MERGE( ind_win_frac_gfl,     ind_win_frac_agfl,     &
4223                                        surf_usm_h%ground_level(m) )
4224              ind_green_frac_w = MERGE( ind_green_frac_w_gfl, ind_green_frac_w_agfl, &
4225                                        surf_usm_h%ground_level(m) )
4226              ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, &
4227                                        surf_usm_h%ground_level(m) )
4228              ind_lai_r        = MERGE( ind_lai_r_gfl,        ind_lai_r_agfl,        &
4229                                        surf_usm_h%ground_level(m) )
4230              ind_lai_w        = MERGE( ind_lai_w_gfl,        ind_lai_w_agfl,        &
4231                                        surf_usm_h%ground_level(m) )
4232              ind_hc1          = MERGE( ind_hc1_gfl,          ind_hc1_agfl,          &
4233                                        surf_usm_h%ground_level(m) )
4234              ind_hc2          = MERGE( ind_hc2_gfl,          ind_hc2_agfl,          &
4235                                        surf_usm_h%ground_level(m) )
4236              ind_hc3          = MERGE( ind_hc3_gfl,          ind_hc3_agfl,          &
4237                                        surf_usm_h%ground_level(m) )
4238              ind_tc1          = MERGE( ind_tc1_gfl,          ind_tc1_agfl,          &
4239                                        surf_usm_h%ground_level(m) )
4240              ind_tc2          = MERGE( ind_tc2_gfl,          ind_tc2_agfl,          &
4241                                        surf_usm_h%ground_level(m) )
4242              ind_tc3          = MERGE( ind_tc3_gfl,          ind_tc3_agfl,          &
4243                                        surf_usm_h%ground_level(m) )
4244              ind_emis_wall    = MERGE( ind_emis_wall_gfl,    ind_emis_wall_agfl,    &
4245                                        surf_usm_h%ground_level(m) )
4246              ind_emis_green   = MERGE( ind_emis_green_gfl,   ind_emis_green_agfl,   &
4247                                        surf_usm_h%ground_level(m) )
4248              ind_emis_win     = MERGE( ind_emis_win_gfl,     ind_emis_win_agfl,     &
4249                                        surf_usm_h%ground_level(m) )
4250              ind_trans        = MERGE( ind_trans_gfl,        ind_trans_agfl,        &
4251                                        surf_usm_h%ground_level(m) )
4252              ind_z0           = MERGE( ind_z0_gfl,           ind_z0_agfl,           &
4253                                        surf_usm_h%ground_level(m) )
4254              ind_z0qh         = MERGE( ind_z0qh_gfl,         ind_z0qh_agfl,         &
4255                                        surf_usm_h%ground_level(m) )
4256
4257!
4258!--           Initialize relatvie wall- (0), green- (1) and window (2) fractions
4259              IF ( building_pars_f%pars_xy(ind_wall_frac,j,i) /= building_pars_f%fill )    &
4260                 surf_usm_h%frac(ind_veg_wall,m)  = building_pars_f%pars_xy(ind_wall_frac,j,i)   
4261              IF ( building_pars_f%pars_xy(ind_green_frac_r,j,i) /= building_pars_f%fill ) & 
4262                 surf_usm_h%frac(ind_pav_green,m) = building_pars_f%pars_xy(ind_green_frac_r,j,i) 
4263              IF ( building_pars_f%pars_xy(ind_win_frac,j,i) /= building_pars_f%fill )     & 
4264                 surf_usm_h%frac(ind_wat_win,m)   = building_pars_f%pars_xy(ind_win_frac,j,i)
4265
4266 
4267              IF ( building_pars_f%pars_xy(ind_lai_r,j,i) /= building_pars_f%fill )        &
4268                 surf_usm_h%lai(m)             = building_pars_f%pars_xy(ind_lai_r,j,i)
4269
4270              IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4271                 surf_usm_h%rho_c_wall(nzb_wall,m)   = building_pars_f%pars_xy(ind_hc1,j,i) 
4272                 surf_usm_h%rho_c_wall(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4273              ENDIF
4274              IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )    &
4275                 surf_usm_h%rho_c_wall(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4276              IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )    & 
4277                 surf_usm_h%rho_c_wall(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4278              IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4279                 surf_usm_h%rho_c_green(nzb_wall,m)   = building_pars_f%pars_xy(ind_hc1,j,i) 
4280                 surf_usm_h%rho_c_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4281              ENDIF
4282              IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )    &
4283                 surf_usm_h%rho_c_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4284              IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )    & 
4285                 surf_usm_h%rho_c_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4286              IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4287                 surf_usm_h%rho_c_window(nzb_wall,m)   = building_pars_f%pars_xy(ind_hc1,j,i) 
4288                 surf_usm_h%rho_c_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4289              ENDIF
4290              IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )    &
4291                 surf_usm_h%rho_c_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4292              IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )    & 
4293                 surf_usm_h%rho_c_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4294
4295              IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4296                 surf_usm_h%lambda_h(nzb_wall,m)   = building_pars_f%pars_xy(ind_tc1,j,i)         
4297                 surf_usm_h%lambda_h(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)       
4298              ENDIF
4299              IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )    &
4300                 surf_usm_h%lambda_h(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4301              IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )    & 
4302                 surf_usm_h%lambda_h(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)   
4303              IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4304                 surf_usm_h%lambda_h_green(nzb_wall,m)   = building_pars_f%pars_xy(ind_tc1,j,i)         
4305                 surf_usm_h%lambda_h_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)       
4306              ENDIF
4307              IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )    &
4308                 surf_usm_h%lambda_h_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4309              IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )    & 
4310                 surf_usm_h%lambda_h_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)   
4311              IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4312                 surf_usm_h%lambda_h_window(nzb_wall,m)   = building_pars_f%pars_xy(ind_tc1,j,i)         
4313                 surf_usm_h%lambda_h_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)       
4314              ENDIF
4315              IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )    &
4316                 surf_usm_h%lambda_h_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4317              IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )    & 
4318                 surf_usm_h%lambda_h_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)   
4319
4320              IF ( building_pars_f%pars_xy(12,j,i) /= building_pars_f%fill )         & 
4321                 surf_usm_h%target_temp_summer(m)  = building_pars_f%pars_xy(12,j,i)   
4322              IF ( building_pars_f%pars_xy(13,j,i) /= building_pars_f%fill )         & 
4323                 surf_usm_h%target_temp_winter(m)  = building_pars_f%pars_xy(13,j,i)   
4324
4325              IF ( building_pars_f%pars_xy(ind_emis_wall,j,i) /= building_pars_f%fill ) & 
4326                 surf_usm_h%emissivity(ind_veg_wall,m)  = building_pars_f%pars_xy(ind_emis_wall,j,i)
4327              IF ( building_pars_f%pars_xy(ind_emis_green,j,i) /= building_pars_f%fill )& 
4328                 surf_usm_h%emissivity(ind_pav_green,m) = building_pars_f%pars_xy(ind_emis_green,j,i)
4329              IF ( building_pars_f%pars_xy(ind_emis_win,j,i) /= building_pars_f%fill )  & 
4330                 surf_usm_h%emissivity(ind_wat_win,m)   = building_pars_f%pars_xy(ind_emis_win,j,i)
4331
4332              IF ( building_pars_f%pars_xy(ind_trans,j,i) /= building_pars_f%fill )    & 
4333                 surf_usm_h%transmissivity(m)      = building_pars_f%pars_xy(ind_trans,j,i)
4334
4335              IF ( building_pars_f%pars_xy(ind_z0,j,i) /= building_pars_f%fill )    & 
4336                 surf_usm_h%z0(m)                  = building_pars_f%pars_xy(ind_z0,j,i)
4337              IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill )  & 
4338                 surf_usm_h%z0h(m)                 = building_pars_f%pars_xy(ind_z0qh,j,i)
4339              IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill )  & 
4340                 surf_usm_h%z0q(m)                 = building_pars_f%pars_xy(ind_z0qh,j,i)
4341
4342              IF ( building_pars_f%pars_xy(ind_alb_wall,j,i) /= building_pars_f%fill )    & 
4343                 surf_usm_h%albedo_type(ind_veg_wall,m)  = building_pars_f%pars_xy(ind_alb_wall,j,i)
4344              IF ( building_pars_f%pars_xy(ind_alb_green,j,i) /= building_pars_f%fill )    & 
4345                 surf_usm_h%albedo_type(ind_pav_green,m) = building_pars_f%pars_xy(ind_alb_green,j,i)
4346              IF ( building_pars_f%pars_xy(ind_alb_win,j,i) /= building_pars_f%fill )    & 
4347                 surf_usm_h%albedo_type(ind_wat_win,m)   = building_pars_f%pars_xy(ind_alb_win,j,i)
4348
4349              IF ( building_pars_f%pars_xy(ind_thick_1,j,i) /= building_pars_f%fill )    & 
4350                 surf_usm_h%zw(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1,j,i)
4351              IF ( building_pars_f%pars_xy(ind_thick_2,j,i) /= building_pars_f%fill )    & 
4352                 surf_usm_h%zw(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2,j,i)
4353              IF ( building_pars_f%pars_xy(ind_thick_3,j,i) /= building_pars_f%fill )    & 
4354                 surf_usm_h%zw(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3,j,i)
4355              IF ( building_pars_f%pars_xy(ind_thick_4,j,i) /= building_pars_f%fill )    & 
4356                 surf_usm_h%zw(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4,j,i)
4357              IF ( building_pars_f%pars_xy(ind_thick_1,j,i) /= building_pars_f%fill )    & 
4358                 surf_usm_h%zw_green(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1,j,i)
4359              IF ( building_pars_f%pars_xy(ind_thick_2,j,i) /= building_pars_f%fill )    & 
4360                 surf_usm_h%zw_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2,j,i)
4361              IF ( building_pars_f%pars_xy(ind_thick_3,j,i) /= building_pars_f%fill )    & 
4362                 surf_usm_h%zw_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3,j,i)
4363              IF ( building_pars_f%pars_xy(ind_thick_4,j,i) /= building_pars_f%fill )    & 
4364                 surf_usm_h%zw_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4,j,i)
4365              IF ( building_pars_f%pars_xy(ind_thick_1,j,i) /= building_pars_f%fill )    & 
4366                 surf_usm_h%zw_window(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1,j,i)
4367              IF ( building_pars_f%pars_xy(ind_thick_2,j,i) /= building_pars_f%fill )    & 
4368                 surf_usm_h%zw_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2,j,i)
4369              IF ( building_pars_f%pars_xy(ind_thick_3,j,i) /= building_pars_f%fill )    & 
4370                 surf_usm_h%zw_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3,j,i)
4371              IF ( building_pars_f%pars_xy(ind_thick_4,j,i) /= building_pars_f%fill )    & 
4372                 surf_usm_h%zw_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4,j,i)
4373
4374              IF ( building_pars_f%pars_xy(45,j,i) /= building_pars_f%fill )    & 
4375                 surf_usm_h%c_surface(m)           = building_pars_f%pars_xy(45,j,i)
4376              IF ( building_pars_f%pars_xy(46,j,i) /= building_pars_f%fill )    & 
4377                 surf_usm_h%lambda_surf(m)         = building_pars_f%pars_xy(46,j,i)
4378              IF ( building_pars_f%pars_xy(45,j,i) /= building_pars_f%fill )    & 
4379                 surf_usm_h%c_surface_green(m)           = building_pars_f%pars_xy(45,j,i)
4380              IF ( building_pars_f%pars_xy(46,j,i) /= building_pars_f%fill )    & 
4381                 surf_usm_h%lambda_surf_green(m)         = building_pars_f%pars_xy(46,j,i)
4382              IF ( building_pars_f%pars_xy(45,j,i) /= building_pars_f%fill )    & 
4383                 surf_usm_h%c_surface_window(m)           = building_pars_f%pars_xy(45,j,i)
4384              IF ( building_pars_f%pars_xy(46,j,i) /= building_pars_f%fill )    & 
4385                 surf_usm_h%lambda_surf_window(m)         = building_pars_f%pars_xy(46,j,i)
4386           ENDDO
4387
4388
4389
4390           DO  l = 0, 3
4391              DO  m = 1, surf_usm_v(l)%ns
4392                 i = surf_usm_v(l)%i(m) + surf_usm_v(l)%ioff
4393                 j = surf_usm_v(l)%j(m) + surf_usm_v(l)%joff
4394               
4395!
4396!--              In order to distinguish between ground floor level and
4397!--              above-ground-floor level surfaces, set input indices.
4398                 ind_wall_frac    = MERGE( ind_wall_frac_gfl,    ind_wall_frac_agfl,     &
4399                                           surf_usm_v(l)%ground_level(m) )
4400                 ind_win_frac     = MERGE( ind_win_frac_gfl,     ind_win_frac_agfl,     &
4401                                           surf_usm_v(l)%ground_level(m) )
4402                 ind_green_frac_w = MERGE( ind_green_frac_w_gfl, ind_green_frac_w_agfl, &
4403                                           surf_usm_v(l)%ground_level(m) )
4404                 ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl, &
4405                                           surf_usm_v(l)%ground_level(m) )
4406                 ind_lai_r        = MERGE( ind_lai_r_gfl,        ind_lai_r_agfl,        &
4407                                           surf_usm_v(l)%ground_level(m) )
4408                 ind_lai_w        = MERGE( ind_lai_w_gfl,        ind_lai_w_agfl,        &
4409                                           surf_usm_v(l)%ground_level(m) )
4410                 ind_hc1          = MERGE( ind_hc1_gfl,          ind_hc1_agfl,          &
4411                                           surf_usm_v(l)%ground_level(m) )
4412                 ind_hc2          = MERGE( ind_hc2_gfl,          ind_hc2_agfl,          &
4413                                           surf_usm_v(l)%ground_level(m) )
4414                 ind_hc3          = MERGE( ind_hc3_gfl,          ind_hc3_agfl,          &
4415                                           surf_usm_v(l)%ground_level(m) )
4416                 ind_tc1          = MERGE( ind_tc1_gfl,          ind_tc1_agfl,          &
4417                                           surf_usm_v(l)%ground_level(m) )
4418                 ind_tc2          = MERGE( ind_tc2_gfl,          ind_tc2_agfl,          &
4419                                           surf_usm_v(l)%ground_level(m) )
4420                 ind_tc3          = MERGE( ind_tc3_gfl,          ind_tc3_agfl,          &
4421                                           surf_usm_v(l)%ground_level(m) )
4422                 ind_emis_wall    = MERGE( ind_emis_wall_gfl,    ind_emis_wall_agfl,    &
4423                                           surf_usm_v(l)%ground_level(m) )
4424                 ind_emis_green   = MERGE( ind_emis_green_gfl,   ind_emis_green_agfl,   &
4425                                           surf_usm_v(l)%ground_level(m) )
4426                 ind_emis_win     = MERGE( ind_emis_win_gfl,     ind_emis_win_agfl,     &
4427                                           surf_usm_v(l)%ground_level(m) )
4428                 ind_trans        = MERGE( ind_trans_gfl,       ind_trans_agfl,         &
4429                                           surf_usm_v(l)%ground_level(m) )
4430                 ind_z0           = MERGE( ind_z0_gfl,           ind_z0_agfl,           &
4431                                           surf_usm_v(l)%ground_level(m) )
4432                 ind_z0qh         = MERGE( ind_z0qh_gfl,         ind_z0qh_agfl,         &
4433                                              surf_usm_v(l)%ground_level(m) )
4434
4435!
4436!--              Initialize relatvie wall- (0), green- (1) and window (2) fractions
4437                 IF ( building_pars_f%pars_xy(ind_wall_frac,j,i) /=                     &
4438                      building_pars_f%fill )                                            &
4439                    surf_usm_v(l)%frac(ind_veg_wall,m)  =                               &
4440                                      building_pars_f%pars_xy(ind_wall_frac,j,i)   
4441                 IF ( building_pars_f%pars_xy(ind_green_frac_w,j,i) /=                  &
4442                      building_pars_f%fill )                                            & 
4443                    surf_usm_v(l)%frac(ind_pav_green,m) =                               &
4444                                      building_pars_f%pars_xy(ind_green_frac_w,j,i) 
4445                 IF ( building_pars_f%pars_xy(ind_win_frac,j,i) /=                      &
4446                      building_pars_f%fill )                                            & 
4447                    surf_usm_v(l)%frac(ind_wat_win,m)   =                               &
4448                                      building_pars_f%pars_xy(ind_win_frac,j,i)
4449 
4450                 IF ( building_pars_f%pars_xy(ind_lai_w,j,i) /= building_pars_f%fill )  & 
4451                    surf_usm_v(l)%lai(m) = building_pars_f%pars_xy(ind_lai_w,j,i)
4452
4453                 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )    &
4454                 THEN
4455                    surf_usm_v(l)%rho_c_wall(nzb_wall,m)   =                            &
4456                                                    building_pars_f%pars_xy(ind_hc1,j,i) 
4457                    surf_usm_v(l)%rho_c_wall(nzb_wall+1,m) =                            &
4458                                                    building_pars_f%pars_xy(ind_hc1,j,i)
4459                 ENDIF
4460                 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )    &
4461                    surf_usm_v(l)%rho_c_wall(nzb_wall+2,m) =                            &                           
4462                                                    building_pars_f%pars_xy(ind_hc2,j,i)
4463                 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )    & 
4464                    surf_usm_v(l)%rho_c_wall(nzb_wall+3,m) =                            &
4465                                                    building_pars_f%pars_xy(ind_hc3,j,i)
4466                 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4467                    surf_usm_v(l)%rho_c_green(nzb_wall,m)   =                           &
4468                                                    building_pars_f%pars_xy(ind_hc1,j,i) 
4469                    surf_usm_v(l)%rho_c_green(nzb_wall+1,m) =                           &
4470                                                    building_pars_f%pars_xy(ind_hc1,j,i)
4471                 ENDIF
4472                 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )    &
4473                    surf_usm_v(l)%rho_c_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4474                 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )    & 
4475                    surf_usm_v(l)%rho_c_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)   
4476                 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4477                    surf_usm_v(l)%rho_c_window(nzb_wall,m)   = building_pars_f%pars_xy(ind_hc1,j,i) 
4478                    surf_usm_v(l)%rho_c_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4479                 ENDIF
4480                 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )    &
4481                    surf_usm_v(l)%rho_c_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4482                 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )    &
4483                    surf_usm_v(l)%rho_c_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4484
4485                 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4486                    surf_usm_v(l)%lambda_h(nzb_wall,m)   = building_pars_f%pars_xy(ind_tc1,j,i)         
4487                    surf_usm_v(l)%lambda_h(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)       
4488                 ENDIF
4489                 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )    &
4490                    surf_usm_v(l)%lambda_h(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4491                 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )    & 
4492                    surf_usm_v(l)%lambda_h(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)   
4493                 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4494                    surf_usm_v(l)%lambda_h_green(nzb_wall,m)   = building_pars_f%pars_xy(ind_tc1,j,i)         
4495                    surf_usm_v(l)%lambda_h_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)       
4496                 ENDIF
4497                 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )    &
4498                    surf_usm_v(l)%lambda_h_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4499                 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )    & 
4500                    surf_usm_v(l)%lambda_h_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)   
4501                 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4502                    surf_usm_v(l)%lambda_h_window(nzb_wall,m)   = building_pars_f%pars_xy(ind_tc1,j,i)         
4503                    surf_usm_v(l)%lambda_h_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)       
4504                 ENDIF
4505                 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )    &
4506                    surf_usm_v(l)%lambda_h_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4507                 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )    & 
4508                    surf_usm_v(l)%lambda_h_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)
4509
4510                 IF ( building_pars_f%pars_xy(12,j,i) /= building_pars_f%fill )         & 
4511                    surf_usm_v(l)%target_temp_summer(m)  = building_pars_f%pars_xy(12,j,i)   
4512                 IF ( building_pars_f%pars_xy(13,j,i) /= building_pars_f%fill )         & 
4513                    surf_usm_v(l)%target_temp_winter(m)  = building_pars_f%pars_xy(13,j,i)   
4514
4515                 IF ( building_pars_f%pars_xy(ind_emis_wall,j,i) /= building_pars_f%fill ) & 
4516                    surf_usm_v(l)%emissivity(ind_veg_wall,m)  = building_pars_f%pars_xy(ind_emis_wall,j,i)
4517                 IF ( building_pars_f%pars_xy(ind_emis_green,j,i) /= building_pars_f%fill )& 
4518                    surf_usm_v(l)%emissivity(ind_pav_green,m) = building_pars_f%pars_xy(ind_emis_green,j,i)
4519                 IF ( building_pars_f%pars_xy(ind_emis_win,j,i) /= building_pars_f%fill )  & 
4520                    surf_usm_v(l)%emissivity(ind_wat_win,m)   = building_pars_f%pars_xy(ind_emis_win,j,i)
4521
4522                 IF ( building_pars_f%pars_xy(ind_trans,j,i) /= building_pars_f%fill )    & 
4523                    surf_usm_v(l)%transmissivity(m)      = building_pars_f%pars_xy(ind_trans,j,i)
4524
4525                 IF ( building_pars_f%pars_xy(ind_z0,j,i) /= building_pars_f%fill )    & 
4526                    surf_usm_v(l)%z0(m)                  = building_pars_f%pars_xy(ind_z0,j,i)
4527                 IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill )  & 
4528                    surf_usm_v(l)%z0h(m)                 = building_pars_f%pars_xy(ind_z0qh,j,i)
4529                 IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill )  & 
4530                    surf_usm_v(l)%z0q(m)                 = building_pars_f%pars_xy(ind_z0qh,j,i)
4531
4532                 IF ( building_pars_f%pars_xy(ind_alb_wall,j,i) /= building_pars_f%fill )    & 
4533                    surf_usm_v(l)%albedo_type(ind_veg_wall,m)  = building_pars_f%pars_xy(ind_alb_wall,j,i)
4534                 IF ( building_pars_f%pars_xy(ind_alb_green,j,i) /= building_pars_f%fill )    & 
4535                    surf_usm_v(l)%albedo_type(ind_pav_green,m) = building_pars_f%pars_xy(ind_alb_green,j,i)
4536                 IF ( building_pars_f%pars_xy(ind_alb_win,j,i) /= building_pars_f%fill )    & 
4537                    surf_usm_v(l)%albedo_type(ind_wat_win,m)   = building_pars_f%pars_xy(ind_alb_win,j,i)
4538
4539                 IF ( building_pars_f%pars_xy(ind_thick_1,j,i) /= building_pars_f%fill )    & 
4540                    surf_usm_v(l)%zw(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1,j,i)
4541                 IF ( building_pars_f%pars_xy(ind_thick_2,j,i) /= building_pars_f%fill )    & 
4542                    surf_usm_v(l)%zw(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2,j,i)
4543                 IF ( building_pars_f%pars_xy(ind_thick_3,j,i) /= building_pars_f%fill )    & 
4544                    surf_usm_v(l)%zw(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3,j,i)
4545                 IF ( building_pars_f%pars_xy(ind_thick_4,j,i) /= building_pars_f%fill )    & 
4546                    surf_usm_v(l)%zw(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4,j,i)
4547                 IF ( building_pars_f%pars_xy(ind_thick_1,j,i) /= building_pars_f%fill )    & 
4548                    surf_usm_v(l)%zw_green(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1,j,i)
4549                 IF ( building_pars_f%pars_xy(ind_thick_2,j,i) /= building_pars_f%fill )    & 
4550                    surf_usm_v(l)%zw_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2,j,i)
4551                 IF ( building_pars_f%pars_xy(ind_thick_3,j,i) /= building_pars_f%fill )    & 
4552                    surf_usm_v(l)%zw_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3,j,i)
4553                 IF ( building_pars_f%pars_xy(ind_thick_4,j,i) /= building_pars_f%fill )    & 
4554                    surf_usm_v(l)%zw_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4,j,i)
4555                 IF ( building_pars_f%pars_xy(ind_thick_1,j,i) /= building_pars_f%fill )    & 
4556                    surf_usm_v(l)%zw_window(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1,j,i)
4557                 IF ( building_pars_f%pars_xy(ind_thick_2,j,i) /= building_pars_f%fill )    & 
4558                    surf_usm_v(l)%zw_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2,j,i)
4559                 IF ( building_pars_f%pars_xy(ind_thick_3,j,i) /= building_pars_f%fill )    & 
4560                    surf_usm_v(l)%zw_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3,j,i)
4561                 IF ( building_pars_f%pars_xy(ind_thick_4,j,i) /= building_pars_f%fill )    & 
4562                    surf_usm_v(l)%zw_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4,j,i)
4563
4564                 IF ( building_pars_f%pars_xy(45,j,i) /= building_pars_f%fill )    & 
4565                    surf_usm_v(l)%c_surface(m)           = building_pars_f%pars_xy(45,j,i)
4566                 IF ( building_pars_f%pars_xy(46,j,i) /= building_pars_f%fill )    & 
4567                    surf_usm_v(l)%lambda_surf(m)         = building_pars_f%pars_xy(46,j,i)
4568                 IF ( building_pars_f%pars_xy(45,j,i) /= building_pars_f%fill )    & 
4569                    surf_usm_v(l)%c_surface_green(m)     = building_pars_f%pars_xy(45,j,i)
4570                 IF ( building_pars_f%pars_xy(46,j,i) /= building_pars_f%fill )    & 
4571                    surf_usm_v(l)%lambda_surf_green(m)   = building_pars_f%pars_xy(46,j,i)
4572                 IF ( building_pars_f%pars_xy(45,j,i) /= building_pars_f%fill )    & 
4573                    surf_usm_v(l)%c_surface_window(m)    = building_pars_f%pars_xy(45,j,i)
4574                 IF ( building_pars_f%pars_xy(46,j,i) /= building_pars_f%fill )    & 
4575                    surf_usm_v(l)%lambda_surf_window(m)  = building_pars_f%pars_xy(46,j,i)
4576
4577              ENDDO
4578           ENDDO
4579        ENDIF 
4580!       
4581!--     Read the surface_types array.
4582!--     Please note, here also initialization of surface attributes is done as
4583!--     long as _urbsurf and _surfpar files are available. Values from above
4584!--     will be overwritten. This might be removed later, but is still in the
4585!--     code to enable compatibility with older model version.
4586        CALL usm_read_urban_surface_types()
4587       
4588!--     init material heat model
4589        CALL usm_init_material_model()
4590       
4591!--     init anthropogenic sources of heat
4592        IF ( usm_anthropogenic_heat )  THEN
4593!--         init anthropogenic sources of heat (from transportation for now)
4594            CALL usm_read_anthropogenic_heat()
4595        ENDIF
4596
4597        IF ( plant_canopy )  THEN
4598           
4599            IF ( .NOT.  ALLOCATED( pc_heating_rate) )  THEN
4600!--             then pc_heating_rate is allocated in init_plant_canopy
4601!--             in case of cthf /= 0 => we need to allocate it for our use here
4602                ALLOCATE( pc_heating_rate(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
4603
4604                pc_heating_rate = 0.0_wp
4605
4606            ENDIF
4607
4608            IF ( .NOT.  ALLOCATED( pc_transpiration_rate) )  THEN
4609!--             then pc_heating_rate is allocated in init_plant_canopy
4610!--             in case of cthf /= 0 => we need to allocate it for our use here
4611                ALLOCATE( pc_transpiration_rate(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
4612
4613                pc_transpiration_rate = 0.0_wp
4614
4615
4616            ENDIF
4617        ENDIF
4618!
4619!--    Check for consistent initialization.
4620!--    Check if roughness length for momentum, or heat, exceed surface-layer
4621!--    height and decrease local roughness length where necessary.
4622       DO  m = 1, surf_usm_h%ns
4623          IF ( surf_usm_h%z0(m) >= surf_usm_h%z_mo(m) )  THEN
4624         
4625             surf_usm_h%z0(m) = 0.9_wp * surf_usm_h%z_mo(m)
4626             
4627             WRITE( message_string, * ) 'z0 exceeds surface-layer height ' //  &
4628                            'at horizontal urban surface and is ' //           &
4629                            'decreased appropriately at grid point (i,j) = ',  &
4630                            surf_usm_h%i(m), surf_usm_h%j(m)
4631             CALL message( 'urban_surface_model_mod', 'PA0503',                &
4632                            0, 0, 0, 6, 0 )
4633          ENDIF
4634          IF ( surf_usm_h%z0h(m) >= surf_usm_h%z_mo(m) )  THEN
4635         
4636             surf_usm_h%z0h(m) = 0.9_wp * surf_usm_h%z_mo(m)
4637             surf_usm_h%z0q(m) = 0.9_wp * surf_usm_h%z_mo(m)
4638             
4639             WRITE( message_string, * ) 'z0h exceeds surface-layer height ' // &
4640                            'at horizontal urban surface and is ' //           &
4641                            'decreased appropriately at grid point (i,j) = ',  &
4642                            surf_usm_h%i(m), surf_usm_h%j(m)
4643             CALL message( 'urban_surface_model_mod', 'PA0507',                &
4644                            0, 0, 0, 6, 0 )
4645          ENDIF         
4646       ENDDO
4647       
4648       DO  l = 0, 3
4649          DO  m = 1, surf_usm_v(l)%ns
4650             IF ( surf_usm_v(l)%z0(m) >= surf_usm_v(l)%z_mo(m) )  THEN
4651         
4652                surf_usm_v(l)%z0(m) = 0.9_wp * surf_usm_v(l)%z_mo(m)
4653             
4654                WRITE( message_string, * ) 'z0 exceeds surface-layer height '//&
4655                            'at vertical urban surface and is ' //             &
4656                            'decreased appropriately at grid point (i,j) = ',  &
4657                            surf_usm_v(l)%i(m)+surf_usm_v(l)%ioff,             &
4658                            surf_usm_v(l)%j(m)+surf_usm_v(l)%joff
4659                CALL message( 'urban_surface_model_mod', 'PA0503',             &
4660                            0, 0, 0, 6, 0 )
4661             ENDIF
4662             IF ( surf_usm_v(l)%z0h(m) >= surf_usm_v(l)%z_mo(m) )  THEN
4663         
4664                surf_usm_v(l)%z0h(m) = 0.9_wp * surf_usm_v(l)%z_mo(m)
4665                surf_usm_v(l)%z0q(m) = 0.9_wp * surf_usm_v(l)%z_mo(m)
4666             
4667                WRITE( message_string, * ) 'z0h exceeds surface-layer height '//&
4668                            'at vertical urban surface and is ' //             &
4669                            'decreased appropriately at grid point (i,j) = ',  &
4670                            surf_usm_v(l)%i(m)+surf_usm_v(l)%ioff,             &
4671                            surf_usm_v(l)%j(m)+surf_usm_v(l)%joff
4672                CALL message( 'urban_surface_model_mod', 'PA0507',             &
4673                            0, 0, 0, 6, 0 )
4674             ENDIF
4675          ENDDO
4676       ENDDO   
4677
4678!--     Intitialization of the surface and wall/ground/roof temperature
4679
4680!--     Initialization for restart runs
4681        IF ( TRIM( initializing_actions ) /= 'read_restart_data'  .AND.        &
4682             TRIM( initializing_actions ) /= 'cyclic_fill' )  THEN
4683       
4684!--         Calculate initial surface temperature from pt of adjacent gridbox
4685#if ! defined( __nopointer )
4686            exn(nzb:nzt) = (hyp(nzb:nzt) / 100000.0_wp )**0.286_wp          !< Exner function
4687#endif
4688
4689!
4690!--         At horizontal surfaces. Please note, t_surf_h is defined on a
4691!--         different data type, but with the same dimension.
4692#if ! defined( __nopointer )
4693            DO  m = 1, surf_usm_h%ns
4694               i = surf_usm_h%i(m)           
4695               j = surf_usm_h%j(m)
4696               k = surf_usm_h%k(m)
4697
4698               t_surf_h(m) = pt(k,j,i) * exn(k)
4699               t_surf_window_h(m) = pt(k,j,i) * exn(k)
4700               t_surf_green_h(m) = pt(k,j,i) * exn(k)
4701               surf_usm_h%pt_surface(m) = pt(k,j,i) * exn(k)
4702            ENDDO
4703!
4704!--         At vertical surfaces.
4705            DO  l = 0, 3
4706               DO  m = 1, surf_usm_v(l)%ns
4707                  i = surf_usm_v(l)%i(m)           
4708                  j = surf_usm_v(l)%j(m)
4709                  k = surf_usm_v(l)%k(m)
4710
4711                  t_surf_v(l)%t(m) = pt(k,j,i) * exn(k)
4712                  t_surf_window_v(l)%t(m) = pt(k,j,i) * exn(k)
4713                  t_surf_green_v(l)%t(m) = pt(k,j,i) * exn(k)
4714                  surf_usm_v(l)%pt_surface(m) = pt(k,j,i) * exn(k)
4715               ENDDO
4716            ENDDO
4717#endif
4718!
4719!--         For the sake of correct initialization, set also q_surface.
4720!--         Note, at urban surfaces q_surface is initialized with 0.
4721            IF ( humidity )  THEN
4722               DO  m = 1, surf_usm_h%ns
4723                  surf_usm_h%q_surface(m) = 0.0_wp
4724               ENDDO
4725               DO  l = 0, 3
4726                  DO  m = 1, surf_usm_v(l)%ns
4727                     surf_usm_v(l)%q_surface(m) = 0.0_wp
4728                  ENDDO
4729               ENDDO
4730            ENDIF
4731     
4732!--         initial values for t_wall
4733!--         outer value is set to surface temperature
4734!--         inner value is set to wall_inner_temperature
4735!--         and profile is logaritmic (linear in nz).
4736!--         Horizontal surfaces
4737            DO  m = 1, surf_usm_h%ns
4738!
4739!--            Roof
4740               IF ( surf_usm_h%isroof_surf(m) )  THEN
4741                   tin = roof_inner_temperature
4742                   twin = window_inner_temperature
4743!
4744!--            Normal land surface
4745               ELSE
4746                   tin = soil_inner_temperature
4747                   twin = window_inner_temperature
4748               ENDIF
4749
4750               DO k = nzb_wall, nzt_wall+1
4751                   c = REAL( k - nzb_wall, wp ) /                              &
4752                       REAL( nzt_wall + 1 - nzb_wall , wp )
4753
4754                   t_wall_h(k,m) = ( 1.0_wp - c ) * t_surf_h(m) + c * tin
4755                   t_window_h(k,m) = ( 1.0_wp - c ) * t_surf_window_h(m) + c * twin
4756                   t_green_h(k,m) = t_surf_h(m)
4757               ENDDO
4758            ENDDO
4759!
4760!--         Vertical surfaces
4761            DO  l = 0, 3
4762               DO  m = 1, surf_usm_v(l)%ns
4763!
4764!--               Inner wall
4765                  tin = wall_inner_temperature
4766                  twin = window_inner_temperature
4767
4768                  DO k = nzb_wall, nzt_wall+1
4769                     c = REAL( k - nzb_wall, wp ) /                            &
4770                         REAL( nzt_wall + 1 - nzb_wall , wp )
4771                     t_wall_v(l)%t(k,m) = ( 1.0_wp - c ) * t_surf_v(l)%t(m) + c * tin
4772                     t_window_v(l)%t(k,m) = ( 1.0_wp - c ) * t_surf_window_v(l)%t(m) + c * twin
4773                     t_green_v(l)%t(k,m) = t_surf_v(l)%t(m)
4774                  ENDDO
4775               ENDDO
4776            ENDDO
4777        ELSE
4778!--         If specified, replace constant wall temperatures with fully 3D values from file
4779            IF ( read_wall_temp_3d )  CALL usm_read_wall_temperature()
4780!
4781        ENDIF
4782       
4783!--   
4784!--     Possibly DO user-defined actions (e.g. define heterogeneous wall surface)
4785        CALL user_init_urban_surface
4786
4787!--     initialize prognostic values for the first timestep
4788        t_surf_h_p = t_surf_h
4789        t_surf_v_p = t_surf_v
4790        t_surf_window_h_p = t_surf_window_h
4791        t_surf_window_v_p = t_surf_window_v
4792        t_surf_green_h_p = t_surf_green_h
4793        t_surf_green_v_p = t_surf_green_v
4794        t_surf_10cm_h_p = t_surf_10cm_h
4795        t_surf_10cm_v_p = t_surf_10cm_v
4796
4797        t_wall_h_p = t_wall_h
4798        t_wall_v_p = t_wall_v
4799        t_window_h_p = t_window_h
4800        t_window_v_p = t_window_v
4801        t_green_h_p = t_green_h
4802        t_green_v_p = t_green_v
4803
4804!--     Adjust radiative fluxes for urban surface at model start
4805        !CALL radiation_interaction
4806!--     TODO: interaction should be called once before first output,
4807!--     that is not yet possible.
4808       
4809        CALL cpu_log( log_point_s(78), 'usm_init', 'stop' )
4810
4811    END SUBROUTINE usm_init_urban_surface
4812
4813
4814!------------------------------------------------------------------------------!
4815! Description:
4816! ------------
4817!
4818!> Wall model as part of the urban surface model. The model predicts wall
4819!> temperature.
4820!------------------------------------------------------------------------------!
4821    SUBROUTINE usm_material_heat_model
4822
4823
4824        IMPLICIT NONE
4825
4826        INTEGER(iwp) ::  i,j,k,l,kw, m                      !< running indices
4827
4828        REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: wtend, wintend  !< tendency
4829
4830!
4831!--     For horizontal surfaces                                   
4832        DO  m = 1, surf_usm_h%ns
4833!
4834!--        Obtain indices
4835           i = surf_usm_h%i(m)           
4836           j = surf_usm_h%j(m)
4837           k = surf_usm_h%k(m)
4838!
4839!--        prognostic equation for ground/roof temperature t_wall_h
4840           wtend(:) = 0.0_wp
4841           wtend(nzb_wall) = (1.0_wp / surf_usm_h%rho_c_wall(nzb_wall,m)) *        &
4842                                       ( surf_usm_h%lambda_h(nzb_wall,m) *         &
4843                                         ( t_wall_h(nzb_wall+1,m)                  &
4844                                         - t_wall_h(nzb_wall,m) ) *                &
4845                                         surf_usm_h%ddz_wall(nzb_wall+1,m)         &
4846                                       + surf_usm_h%frac(ind_veg_wall,m)           &
4847                                         / (surf_usm_h%frac(ind_veg_wall,m)        &
4848                                           + surf_usm_h%frac(ind_pav_green,m) )    &
4849                                         * surf_usm_h%wghf_eb(m)                   &
4850                                       - surf_usm_h%frac(ind_pav_green,m)          &
4851                                          / (surf_usm_h%frac(ind_veg_wall,m)       &
4852                                            + surf_usm_h%frac(ind_pav_green,m) )   &
4853                                         * ( surf_usm_h%lambda_h_green(nzt_wall,m) &
4854                                           * surf_usm_h%ddz_green(nzt_wall,m)      &
4855                                           + surf_usm_h%lambda_h(nzb_wall,m)       &
4856                                           * surf_usm_h%ddz_wall(nzb_wall,m) )     &
4857                                         / ( surf_usm_h%ddz_green(nzt_wall,m)      &
4858                                           + surf_usm_h%ddz_wall(nzb_wall,m) )     &
4859                                         * ( t_wall_h(nzb_wall,m)                  &
4860                                           - t_green_h(nzt_wall,m) ) ) *           &
4861                                       surf_usm_h%ddz_wall_stag(nzb_wall,m)
4862
4863!dummy value for testing
4864surf_usm_h%iwghf_eb(m) = 0.
4865
4866           IF ( indoor_model ) then
4867              DO  kw = nzb_wall+1, nzt_wall-1
4868                  wtend(kw) = (1.0_wp / surf_usm_h%rho_c_wall(kw,m))              &
4869                                 * (   surf_usm_h%lambda_h(kw,m)                  &
4870                                    * ( t_wall_h(kw+1,m) - t_wall_h(kw,m) )       &
4871                                    * surf_usm_h%ddz_wall(kw+1,m)                 &
4872                                 - surf_usm_h%lambda_h(kw-1,m)                    &
4873                                    * ( t_wall_h(kw,m) - t_wall_h(kw-1,m) )       &
4874                                    * surf_usm_h%ddz_wall(kw,m)                   &
4875                                   ) * surf_usm_h%ddz_wall_stag(kw,m)
4876              ENDDO
4877              wtend(nzt_wall) = (1.0_wp / surf_usm_h%rho_c_wall(nzt_wall,m)) *    &
4878                                         ( surf_usm_h%lambda_h(nzt_wall-1,m) *    &
4879                                           ( t_wall_h(nzt_wall,m)                 &
4880                                           - t_wall_h(nzt_wall-1,m) ) *           &
4881                                           surf_usm_h%ddz_wall(nzt_wall,m)        &
4882                                         + surf_usm_h%iwghf_eb(m) ) *             &
4883                                           surf_usm_h%ddz_wall_stag(nzt_wall,m)
4884           ELSE
4885              DO  kw = nzb_wall+1, nzt_wall
4886                  wtend(kw) = (1.0_wp / surf_usm_h%rho_c_wall(kw,m))              &
4887                                 * (   surf_usm_h%lambda_h(kw,m)                  &
4888                                    * ( t_wall_h(kw+1,m) - t_wall_h(kw,m) )       &
4889                                    * surf_usm_h%ddz_wall(kw+1,m)                 &
4890                                 - surf_usm_h%lambda_h(kw-1,m)                    &
4891                                    * ( t_wall_h(kw,m) - t_wall_h(kw-1,m) )       &
4892                                    * surf_usm_h%ddz_wall(kw,m)                   &
4893                                   ) * surf_usm_h%ddz_wall_stag(kw,m)
4894              ENDDO
4895           ENDIF
4896
4897           t_wall_h_p(nzb_wall:nzt_wall,m) = t_wall_h(nzb_wall:nzt_wall,m)     &
4898                                 + dt_3d * ( tsc(2)                            &
4899                                 * wtend(nzb_wall:nzt_wall) + tsc(3)           &
4900                                 * surf_usm_h%tt_wall_m(nzb_wall:nzt_wall,m) )   
4901
4902!--        prognostic equation for ground/roof window temperature t_window_h
4903           wintend(:) = 0.0_wp
4904           wintend(nzb_wall) = (1.0_wp / surf_usm_h%rho_c_window(nzb_wall,m)) *   &
4905                                      ( surf_usm_h%lambda_h_window(nzb_wall,m) *  &
4906                                        ( t_window_h(nzb_wall+1,m)                &
4907                                        - t_window_h(nzb_wall,m) ) *              &
4908                                        surf_usm_h%ddz_window(nzb_wall+1,m)       &
4909                                      + surf_usm_h%wghf_eb_window(m)              &
4910                                      + surf_usm_h%rad_sw_in(m)                   &
4911                                        * (1.0_wp - exp(-surf_usm_h%transmissivity(m) &
4912                                        * surf_usm_h%zw_window(nzb_wall,m) ) )    &
4913                                      ) * surf_usm_h%ddz_window_stag(nzb_wall,m)
4914
4915           IF ( indoor_model ) then
4916              DO  kw = nzb_wall+1, nzt_wall-1
4917                  wintend(kw) = (1.0_wp / surf_usm_h%rho_c_window(kw,m))          &
4918                                 * (   surf_usm_h%lambda_h_window(kw,m)           &
4919                                    * ( t_window_h(kw+1,m) - t_window_h(kw,m) )   &
4920                                    * surf_usm_h%ddz_window(kw+1,m)               &
4921                                 - surf_usm_h%lambda_h_window(kw-1,m)             &
4922                                    * ( t_window_h(kw,m) - t_window_h(kw-1,m) )   &
4923                                    * surf_usm_h%ddz_window(kw,m)                 &
4924                                 + surf_usm_h%rad_sw_in(m)                        &
4925                                    * (exp(-surf_usm_h%transmissivity(m)       &
4926                                        * surf_usm_h%zw_window(kw-1,m) )          &
4927                                        - exp(-surf_usm_h%transmissivity(m)    &
4928                                        * surf_usm_h%zw_window(kw,m) ) )          &
4929                                   ) * surf_usm_h%ddz_window_stag(kw,m)
4930
4931              ENDDO
4932              wintend(nzt_wall) = (1.0_wp / surf_usm_h%rho_c_window(nzt_wall,m)) *     &
4933                                         ( surf_usm_h%lambda_h_window(nzt_wall-1,m) *  &
4934                                           ( t_window_h(nzt_wall,m)                    &
4935                                           - t_window_h(nzt_wall-1,m) ) *              &
4936                                           surf_usm_h%ddz_window(nzt_wall,m)           &
4937                                         + surf_usm_h%iwghf_eb_window(m)               &
4938                                         + surf_usm_h%rad_sw_in(m)                     &
4939                                           * (1.0_wp - exp(-surf_usm_h%transmissivity(m) &
4940                                           * surf_usm_h%zw_window(nzt_wall,m) ) )      &
4941                                         ) * surf_usm_h%ddz_window_stag(nzt_wall,m)
4942           ELSE
4943              DO  kw = nzb_wall+1, nzt_wall
4944                  wintend(kw) = (1.0_wp / surf_usm_h%rho_c_window(kw,m))          &
4945                                 * (   surf_usm_h%lambda_h_window(kw,m)           &
4946                                    * ( t_window_h(kw+1,m) - t_window_h(kw,m) )   &
4947                                    * surf_usm_h%ddz_window(kw+1,m)               &
4948                                 - surf_usm_h%lambda_h_window(kw-1,m)             &
4949                                    * ( t_window_h(kw,m) - t_window_h(kw-1,m) )   &
4950                                    * surf_usm_h%ddz_window(kw,m)                 &
4951                                 + surf_usm_h%rad_sw_in(m)                        &
4952                                    * (exp(-surf_usm_h%transmissivity(m)       &
4953                                        * surf_usm_h%zw_window(kw-1,m) )          &
4954                                        - exp(-surf_usm_h%transmissivity(m)    &
4955                                        * surf_usm_h%zw_window(kw,m) ) )          &
4956                                   ) * surf_usm_h%ddz_window_stag(kw,m)
4957
4958              ENDDO
4959           ENDIF
4960
4961           t_window_h_p(nzb_wall:nzt_wall,m) = t_window_h(nzb_wall:nzt_wall,m)    &
4962                                 + dt_3d * ( tsc(2)                               &
4963                                 * wintend(nzb_wall:nzt_wall) + tsc(3)            &
4964                                 * surf_usm_h%tt_window_m(nzb_wall:nzt_wall,m) )   
4965           
4966!
4967!--        calculate t_wall tendencies for the next Runge-Kutta step
4968           IF ( timestep_scheme(1:5) == 'runge' )  THEN
4969               IF ( intermediate_timestep_count == 1 )  THEN
4970                  DO  kw = nzb_wall, nzt_wall
4971                     surf_usm_h%tt_wall_m(kw,m) = wtend(kw)
4972                  ENDDO
4973               ELSEIF ( intermediate_timestep_count <                          &
4974                        intermediate_timestep_count_max )  THEN
4975                   DO  kw = nzb_wall, nzt_wall
4976                      surf_usm_h%tt_wall_m(kw,m) = -9.5625_wp * wtend(kw) +    &
4977                                         5.3125_wp * surf_usm_h%tt_wall_m(kw,m)
4978                   ENDDO
4979               ENDIF
4980           ENDIF
4981
4982!--        calculate t_window tendencies for the next Runge-Kutta step
4983           IF ( timestep_scheme(1:5) == 'runge' )  THEN
4984               IF ( intermediate_timestep_count == 1 )  THEN
4985                  DO  kw = nzb_wall, nzt_wall
4986                     surf_usm_h%tt_window_m(kw,m) = wintend(kw)
4987                  ENDDO
4988               ELSEIF ( intermediate_timestep_count <                          &
4989                        intermediate_timestep_count_max )  THEN
4990                   DO  kw = nzb_wall, nzt_wall
4991                      surf_usm_h%tt_window_m(kw,m) = -9.5625_wp * wintend(kw) +    &
4992                                         5.3125_wp * surf_usm_h%tt_window_m(kw,m)
4993                   ENDDO
4994               ENDIF
4995           ENDIF
4996        ENDDO
4997
4998!
4999!--     For vertical surfaces     
5000        DO  l = 0, 3                             
5001           DO  m = 1, surf_usm_v(l)%ns
5002!
5003!--           Obtain indices
5004              i = surf_usm_v(l)%i(m)           
5005              j = surf_usm_v(l)%j(m)
5006              k = surf_usm_v(l)%k(m)
5007!
5008!--           prognostic equation for wall temperature t_wall_v
5009              wtend(:) = 0.0_wp
5010
5011               wtend(nzb_wall) = (1.0_wp / surf_usm_v(l)%rho_c_wall(nzb_wall,m)) *    &
5012                                       ( surf_usm_v(l)%lambda_h(nzb_wall,m) *         &
5013                                         ( t_wall_v(l)%t(nzb_wall+1,m)                &
5014                                         - t_wall_v(l)%t(nzb_wall,m) ) *              &
5015                                         surf_usm_v(l)%ddz_wall(nzb_wall+1,m)         &
5016                                       + surf_usm_v(l)%frac(ind_veg_wall,m)           &
5017                                         / (surf_usm_v(l)%frac(ind_veg_wall,m)        &
5018                                           + surf_usm_v(l)%frac(ind_pav_green,m) )    &
5019                                         * surf_usm_v(l)%wghf_eb(m)                   &
5020                                       - surf_usm_v(l)%frac(ind_pav_green,m)          &
5021                                         / (surf_usm_v(l)%frac(ind_veg_wall,m)        &
5022                                           + surf_usm_v(l)%frac(ind_pav_green,m) )    &
5023                                         * ( surf_usm_v(l)%lambda_h_green(nzt_wall,m) &
5024                                           * surf_usm_v(l)%ddz_green(nzt_wall,m)      &
5025                                           + surf_usm_v(l)%lambda_h(nzb_wall,m)       &
5026                                           * surf_usm_v(l)%ddz_wall(nzb_wall,m) )     &
5027                                         / ( surf_usm_v(l)%ddz_green(nzt_wall,m)      &
5028                                           + surf_usm_v(l)%ddz_wall(nzb_wall,m) )     &
5029                                         * ( t_wall_v(l)%t(nzb_wall,m)                &
5030                                           - t_green_v(l)%t(nzt_wall,m) ) ) *         &
5031                                         surf_usm_v(l)%ddz_wall_stag(nzb_wall,m)
5032
5033!dummy value for testing
5034surf_usm_v(l)%iwghf_eb(m) = 0.
5035
5036              IF ( indoor_model ) then
5037                 DO  kw = nzb_wall+1, nzt_wall-1
5038                     wtend(kw) = (1.0_wp / surf_usm_v(l)%rho_c_wall(kw,m))        &
5039                              * (   surf_usm_v(l)%lambda_h(kw,m)                  &
5040                                 * ( t_wall_v(l)%t(kw+1,m) - t_wall_v(l)%t(kw,m) )&
5041                                 * surf_usm_v(l)%ddz_wall(kw+1,m)                 &
5042                              - surf_usm_v(l)%lambda_h(kw-1,m)                    &
5043                                 * ( t_wall_v(l)%t(kw,m) - t_wall_v(l)%t(kw-1,m) )&
5044                                 * surf_usm_v(l)%ddz_wall(kw,m)                   &
5045                                 ) * surf_usm_v(l)%ddz_wall_stag(kw,m)
5046                 ENDDO
5047                 wtend(nzt_wall) = (1.0_wp / surf_usm_v(l)%rho_c_wall(nzt_wall,m)) * &
5048                                         ( surf_usm_v(l)%lambda_h(nzt_wall-1,m) *    &
5049                                           ( t_wall_v(l)%t(nzt_wall,m)               &
5050                                           - t_wall_v(l)%t(nzt_wall-1,m) ) *         &
5051                                           surf_usm_v(l)%ddz_wall(nzt_wall,m)        &
5052                                         + surf_usm_v(l)%iwghf_eb(m) ) *             &
5053                                           surf_usm_v(l)%ddz_wall_stag(nzt_wall,m)
5054              ELSE
5055                 DO  kw = nzb_wall+1, nzt_wall
5056                     wtend(kw) = (1.0_wp / surf_usm_v(l)%rho_c_wall(kw,m))        &
5057                              * (   surf_usm_v(l)%lambda_h(kw,m)                  &
5058                                 * ( t_wall_v(l)%t(kw+1,m) - t_wall_v(l)%t(kw,m) )&
5059                                 * surf_usm_v(l)%ddz_wall(kw+1,m)                 &
5060                              - surf_usm_v(l)%lambda_h(kw-1,m)                    &
5061                                 * ( t_wall_v(l)%t(kw,m) - t_wall_v(l)%t(kw-1,m) )&
5062                                 * surf_usm_v(l)%ddz_wall(kw,m)                   &
5063                                 ) * surf_usm_v(l)%ddz_wall_stag(kw,m)
5064                 ENDDO
5065              ENDIF
5066
5067              t_wall_v_p(l)%t(nzb_wall:nzt_wall,m) =                           &
5068                                   t_wall_v(l)%t(nzb_wall:nzt_wall,m)          &
5069                                 + dt_3d * ( tsc(2)                            &
5070                                 * wtend(nzb_wall:nzt_wall) + tsc(3)           &
5071                                 * surf_usm_v(l)%tt_wall_m(nzb_wall:nzt_wall,m) )   
5072
5073!--           prognostic equation for window temperature t_window_v
5074              wintend(:) = 0.0_wp
5075              wintend(nzb_wall) = (1.0_wp / surf_usm_v(l)%rho_c_window(nzb_wall,m)) * &
5076                                      ( surf_usm_v(l)%lambda_h_window(nzb_wall,m) *   &
5077                                        ( t_window_v(l)%t(nzb_wall+1,m)               &
5078                                        - t_window_v(l)%t(nzb_wall,m) ) *             &
5079                                        surf_usm_v(l)%ddz_window(nzb_wall+1,m)        &
5080                                      + surf_usm_v(l)%wghf_eb_window(m)               &
5081                                      + surf_usm_v(l)%rad_sw_in(m)                    &
5082                                        * (1.0_wp - exp(-surf_usm_v(l)%transmissivity(m) &
5083                                        * surf_usm_v(l)%zw_window(nzb_wall,m) ) )     &
5084                                      ) * surf_usm_v(l)%ddz_window_stag(nzb_wall,m)
5085
5086              IF ( indoor_model ) then
5087                 DO  kw = nzb_wall+1, nzt_wall -1
5088                     wintend(kw) = (1.0_wp / surf_usm_v(l)%rho_c_window(kw,m))         &
5089                              * (   surf_usm_v(l)%lambda_h_window(kw,m)                &
5090                                 * ( t_window_v(l)%t(kw+1,m) - t_window_v(l)%t(kw,m) ) &
5091                                 * surf_usm_v(l)%ddz_window(kw+1,m)                    &
5092                              - surf_usm_v(l)%lambda_h_window(kw-1,m)                  &
5093                                 * ( t_window_v(l)%t(kw,m) - t_window_v(l)%t(kw-1,m) ) &
5094                                 * surf_usm_v(l)%ddz_window(kw,m)                      &
5095                              + surf_usm_v(l)%rad_sw_in(m)                             &
5096                                 * (exp(-surf_usm_v(l)%transmissivity(m)            &
5097                                    * surf_usm_v(l)%zw_window(kw-1,m)       )          &
5098                                        - exp(-surf_usm_v(l)%transmissivity(m)      &
5099                                        * surf_usm_v(l)%zw_window(kw,m) ) )            &
5100                                 ) * surf_usm_v(l)%ddz_window_stag(kw,m)
5101                  ENDDO
5102                  wintend(nzt_wall) = (1.0_wp / surf_usm_v(l)%rho_c_window(nzt_wall,m)) * &
5103                                          ( surf_usm_v(l)%lambda_h_window(nzt_wall-1,m) * &
5104                                            ( t_window_v(l)%t(nzt_wall,m)                 &
5105                                            - t_window_v(l)%t(nzt_wall-1,m) ) *           &
5106                                            surf_usm_v(l)%ddz_window(nzt_wall,m)          &
5107                                          + surf_usm_v(l)%iwghf_eb_window(m)              &
5108                                          + surf_usm_v(l)%rad_sw_in(m)                    &
5109                                            * (1.0_wp - exp(-surf_usm_v(l)%transmissivity(m) &
5110                                            * surf_usm_v(l)%zw_window(nzt_wall,m) ) )     &
5111                                          ) * surf_usm_v(l)%ddz_window_stag(nzt_wall,m)
5112              ELSE
5113                 DO  kw = nzb_wall+1, nzt_wall
5114                     wintend(kw) = (1.0_wp / surf_usm_v(l)%rho_c_window(kw,m))         &
5115                              * (   surf_usm_v(l)%lambda_h_window(kw,m)                &
5116                                 * ( t_window_v(l)%t(kw+1,m) - t_window_v(l)%t(kw,m) ) &
5117                                 * surf_usm_v(l)%ddz_window(kw+1,m)                    &
5118                              - surf_usm_v(l)%lambda_h_window(kw-1,m)                  &
5119                                 * ( t_window_v(l)%t(kw,m) - t_window_v(l)%t(kw-1,m) ) &
5120                                 * surf_usm_v(l)%ddz_window(kw,m)                      &
5121                              + surf_usm_v(l)%rad_sw_in(m)                             &
5122                                 * (exp(-surf_usm_v(l)%transmissivity(m)            &
5123                                    * surf_usm_v(l)%zw_window(kw-1,m)       )          &
5124                                        - exp(-surf_usm_v(l)%transmissivity(m)      &
5125                                        * surf_usm_v(l)%zw_window(kw,m) ) )            &
5126                                 ) * surf_usm_v(l)%ddz_window_stag(kw,m)
5127                 ENDDO
5128              ENDIF
5129
5130              t_window_v_p(l)%t(nzb_wall:nzt_wall,m) =                           &
5131                                   t_window_v(l)%t(nzb_wall:nzt_wall,m)          &
5132                                 + dt_3d * ( tsc(2)                              &
5133                                 * wintend(nzb_wall:nzt_wall) + tsc(3)           &
5134                                 * surf_usm_v(l)%tt_window_m(nzb_wall:nzt_wall,m) )   
5135
5136!
5137!--           calculate t_wall tendencies for the next Runge-Kutta step
5138              IF ( timestep_scheme(1:5) == 'runge' )  THEN
5139                  IF ( intermediate_timestep_count == 1 )  THEN
5140                     DO  kw = nzb_wall, nzt_wall
5141                        surf_usm_v(l)%tt_wall_m(kw,m) = wtend(kw)
5142                     ENDDO
5143                  ELSEIF ( intermediate_timestep_count <                       &
5144                           intermediate_timestep_count_max )  THEN
5145                      DO  kw = nzb_wall, nzt_wall
5146                         surf_usm_v(l)%tt_wall_m(kw,m) =                       &
5147                                     - 9.5625_wp * wtend(kw) +                 &
5148                                       5.3125_wp * surf_usm_v(l)%tt_wall_m(kw,m)
5149                      ENDDO
5150                  ENDIF
5151              ENDIF
5152!--           calculate t_window tendencies for the next Runge-Kutta step
5153              IF ( timestep_scheme(1:5) == 'runge' )  THEN
5154                  IF ( intermediate_timestep_count == 1 )  THEN
5155                     DO  kw = nzb_wall, nzt_wall
5156                        surf_usm_v(l)%tt_window_m(kw,m) = wintend(kw)
5157                     ENDDO
5158                  ELSEIF ( intermediate_timestep_count <                       &
5159                           intermediate_timestep_count_max )  THEN
5160                      DO  kw = nzb_wall, nzt_wall
5161                         surf_usm_v(l)%tt_window_m(kw,m) =                     &
5162                                     - 9.5625_wp * wintend(kw) +               &
5163                                       5.3125_wp * surf_usm_v(l)%tt_window_m(kw,m)
5164                      ENDDO
5165                  ENDIF
5166              ENDIF
5167           ENDDO
5168        ENDDO
5169
5170    END SUBROUTINE usm_material_heat_model
5171
5172!------------------------------------------------------------------------------!
5173! Description:
5174! ------------
5175!
5176!> Green and substrate model as part of the urban surface model. The model predicts ground
5177!> temperatures.
5178!------------------------------------------------------------------------------!
5179    SUBROUTINE usm_green_heat_model
5180
5181
5182        IMPLICIT NONE
5183
5184        INTEGER(iwp) ::  i,j,k,l,kw, m                      !< running indices
5185
5186        REAL(wp), DIMENSION(nzb_wall:nzt_wall) :: gtend  !< tendency
5187
5188!
5189!--     For horizontal surfaces                                   
5190        DO  m = 1, surf_usm_h%ns
5191!
5192!--        Obtain indices
5193           i = surf_usm_h%i(m)           
5194           j = surf_usm_h%j(m)
5195           k = surf_usm_h%k(m)
5196
5197           t_green_h(nzt_wall+1,m) = t_wall_h(nzb_wall,m)
5198!
5199!--        prognostic equation for ground/roof temperature t_green_h
5200           gtend(:) = 0.0_wp
5201           gtend(nzb_wall) = (1.0_wp / surf_usm_h%rho_c_green(nzb_wall,m)) *    &
5202                                      ( surf_usm_h%lambda_h_green(nzb_wall,m) * &
5203                                        ( t_green_h(nzb_wall+1,m)               &
5204                                        - t_green_h(nzb_wall,m) ) *             &
5205                                        surf_usm_h%ddz_green(nzb_wall+1,m)      &
5206                                      + surf_usm_h%wghf_eb_green(m) ) *         &
5207                                        surf_usm_h%ddz_green_stag(nzb_wall,m)
5208           
5209            DO  kw = nzb_wall+1, nzt_wall
5210                gtend(kw) = (1.0_wp / surf_usm_h%rho_c_green(kw,m))             &
5211                               * (   surf_usm_h%lambda_h_green(kw,m)            &
5212                                  * ( t_green_h(kw+1,m) - t_green_h(kw,m) )     &
5213                                  * surf_usm_h%ddz_green(kw+1,m)                &
5214                               - surf_usm_h%lambda_h_green(kw-1,m)              &
5215                                  * ( t_green_h(kw,m) - t_green_h(kw-1,m) )     &
5216                                  * surf_usm_h%ddz_green(kw,m)                  &
5217                                 ) * surf_usm_h%ddz_green_stag(kw,m)
5218            ENDDO
5219
5220           t_green_h_p(nzb_wall:nzt_wall,m) = t_green_h(nzb_wall:nzt_wall,m)    &
5221                                 + dt_3d * ( tsc(2)                             &
5222                                 * gtend(nzb_wall:nzt_wall) + tsc(3)            &
5223                                 * surf_usm_h%tt_green_m(nzb_wall:nzt_wall,m) )   
5224
5225         
5226!
5227!--        calculate t_green tendencies for the next Runge-Kutta step
5228           IF ( timestep_scheme(1:5) == 'runge' )  THEN
5229               IF ( intermediate_timestep_count == 1 )  THEN
5230                  DO  kw = nzb_wall, nzt_wall
5231                     surf_usm_h%tt_green_m(kw,m) = gtend(kw)
5232                  ENDDO
5233               ELSEIF ( intermediate_timestep_count <                           &
5234                        intermediate_timestep_count_max )  THEN
5235                   DO  kw = nzb_wall, nzt_wall
5236                      surf_usm_h%tt_green_m(kw,m) = -9.5625_wp * gtend(kw) +    &
5237                                         5.3125_wp * surf_usm_h%tt_green_m(kw,m)
5238                   ENDDO
5239               ENDIF
5240           ENDIF
5241        ENDDO
5242
5243!
5244!--     For vertical surfaces     
5245        DO  l = 0, 3                             
5246           DO  m = 1, surf_usm_v(l)%ns
5247!
5248!--           Obtain indices
5249              i = surf_usm_v(l)%i(m)           
5250              j = surf_usm_v(l)%j(m)
5251              k = surf_usm_v(l)%k(m)
5252
5253              t_green_v(l)%t(nzt_wall+1,m) = t_wall_v(l)%t(nzb_wall,m)
5254!
5255!--           prognostic equation for green temperature t_green_v
5256              gtend(:) = 0.0_wp
5257              gtend(nzb_wall) = (1.0_wp / surf_usm_v(l)%rho_c_green(nzb_wall,m)) * &
5258                                      ( surf_usm_v(l)%lambda_h_green(nzb_wall,m) * &
5259                                        ( t_green_v(l)%t(nzb_wall+1,m)             &
5260                                        - t_green_v(l)%t(nzb_wall,m) ) *           &
5261                                        surf_usm_v(l)%ddz_green(nzb_wall+1,m)      &
5262                                      + surf_usm_v(l)%wghf_eb(m) ) *               &
5263                                        surf_usm_v(l)%ddz_green_stag(nzb_wall,m)
5264           
5265              DO  kw = nzb_wall+1, nzt_wall
5266                 gtend(kw) = (1.0_wp / surf_usm_v(l)%rho_c_green(kw,m))          &
5267                           * (   surf_usm_v(l)%lambda_h_green(kw,m)              &
5268                             * ( t_green_v(l)%t(kw+1,m) - t_green_v(l)%t(kw,m) ) &
5269                             * surf_usm_v(l)%ddz_green(kw+1,m)                   &
5270                           - surf_usm_v(l)%lambda_h(kw-1,m)                      &
5271                             * ( t_green_v(l)%t(kw,m) - t_green_v(l)%t(kw-1,m) ) &
5272                             * surf_usm_v(l)%ddz_green(kw,m) )                   &
5273                           * surf_usm_v(l)%ddz_green_stag(kw,m)
5274              ENDDO
5275
5276              t_green_v_p(l)%t(nzb_wall:nzt_wall,m) =                              &
5277                                   t_green_v(l)%t(nzb_wall:nzt_wall,m)             &
5278                                 + dt_3d * ( tsc(2)                                &
5279                                 * gtend(nzb_wall:nzt_wall) + tsc(3)               &
5280                                 * surf_usm_v(l)%tt_green_m(nzb_wall:nzt_wall,m) )   
5281
5282!
5283!--           calculate t_green tendencies for the next Runge-Kutta step
5284              IF ( timestep_scheme(1:5) == 'runge' )  THEN
5285                  IF ( intermediate_timestep_count == 1 )  THEN
5286                     DO  kw = nzb_wall, nzt_wall
5287                        surf_usm_v(l)%tt_green_m(kw,m) = gtend(kw)
5288                     ENDDO
5289                  ELSEIF ( intermediate_timestep_count <                           &
5290                           intermediate_timestep_count_max )  THEN
5291                      DO  kw = nzb_wall, nzt_wall
5292                         surf_usm_v(l)%tt_green_m(kw,m) =                          &
5293                                     - 9.5625_wp * gtend(kw) +                     &
5294                                       5.3125_wp * surf_usm_v(l)%tt_green_m(kw,m)
5295                      ENDDO
5296                  ENDIF
5297              ENDIF
5298
5299           ENDDO
5300        ENDDO
5301
5302    END SUBROUTINE usm_green_heat_model
5303
5304!------------------------------------------------------------------------------!
5305! Description:
5306! ------------
5307!> Parin for &usm_par for urban surface model
5308!------------------------------------------------------------------------------!
5309    SUBROUTINE usm_parin
5310
5311       IMPLICIT NONE
5312
5313       CHARACTER (LEN=80) ::  line  !< string containing current line of file PARIN
5314
5315       NAMELIST /urban_surface_par/                                            &
5316                           building_type,                                      &
5317                           land_category,                                      &
5318                           naheatlayers,                                       &
5319                           pedestrian_category,                                &
5320                           roughness_concrete,                                 &
5321                           read_wall_temp_3d,                                  &
5322                           roof_category,                                      &
5323                           urban_surface,                                      &
5324                           usm_anthropogenic_heat,                             &
5325                           usm_material_model,                                 &
5326                           wall_category,                                      &
5327                           indoor_model,                                       &
5328                           wall_inner_temperature,                             &
5329                           roof_inner_temperature,                             &
5330                           soil_inner_temperature,                             &
5331                           window_inner_temperature
5332
5333       NAMELIST /urban_surface_parameters/                                     &
5334                           building_type,                                      &
5335                           land_category,                                      &
5336                           naheatlayers,                                       &
5337                           pedestrian_category,                                &
5338                           roughness_concrete,                                 &
5339                           read_wall_temp_3d,                                  &
5340                           roof_category,                                      &
5341                           urban_surface,                                      &
5342                           usm_anthropogenic_heat,                             &
5343                           usm_material_model,                                 &
5344                           wall_category,                                      &
5345                           indoor_model,                                       &
5346                           wall_inner_temperature,                             &
5347                           roof_inner_temperature,                             &
5348                           soil_inner_temperature,                             &
5349                           window_inner_temperature
5350!
5351!--    Try to find urban surface model package
5352       REWIND ( 11 )
5353       line = ' '
5354       DO   WHILE ( INDEX( line, '&urban_surface_parameters' ) == 0 )
5355          READ ( 11, '(A)', END=10 )  line
5356       ENDDO
5357       BACKSPACE ( 11 )
5358
5359!
5360!--    Read user-defined namelist
5361       READ ( 11, urban_surface_parameters )
5362!
5363!--    Set flag that indicates that the land surface model is switched on
5364       urban_surface = .TRUE.
5365
5366       GOTO 12
5367!
5368!--    Try to find old namelist
5369 10    REWIND ( 11 )
5370       line = ' '
5371       DO   WHILE ( INDEX( line, '&urban_surface_par' ) == 0 )
5372          READ ( 11, '(A)', END=12 )  line
5373       ENDDO
5374       BACKSPACE ( 11 )
5375
5376!
5377!--    Read user-defined namelist
5378       READ ( 11, urban_surface_par )
5379
5380       message_string = 'namelist urban_surface_par is deprecated and will be ' // &
5381                     'removed in near future. Please use namelist ' //             &
5382                     'urban_surface_parameters instead' 
5383       CALL message( 'usm_parin', 'PA0487', 0, 1, 0, 6, 0 )
5384!
5385!--    Set flag that indicates that the land surface model is switched on
5386       urban_surface = .TRUE.
5387
5388 12    CONTINUE
5389
5390
5391    END SUBROUTINE usm_parin
5392
5393!------------------------------------------------------------------------------!
5394! Description:
5395! ------------
5396!> Calculates temperature near surface (10 cm) for indoor model
5397!------------------------------------------------------------------------------!
5398    SUBROUTINE usm_temperature_near_surface
5399
5400       IMPLICIT NONE
5401
5402       INTEGER(iwp)                          :: i, j, k, l, m   !< running indices
5403
5404!       
5405!--    First, treat horizontal surface elements
5406       DO  m = 1, surf_usm_h%ns
5407
5408!--       Get indices of respective grid point
5409          i = surf_usm_h%i(m)
5410          j = surf_usm_h%j(m)
5411          k = surf_usm_h%k(m)
5412
5413          t_surf_10cm_h(m) = surf_usm_h%pt_surface(m) + surf_usm_h%ts(m) / kappa        &
5414                             * ( log( 0.1_wp /  surf_usm_h%z0h(m) )              &
5415                               - psi_h( 0.1_wp / surf_usm_h%ol(m) )              &
5416                               + psi_h( surf_usm_h%z0h(m) / surf_usm_h%ol(m) ) )
5417
5418       ENDDO
5419!
5420!--    Now, treat vertical surface elements
5421       DO  l = 0, 3
5422          DO  m = 1, surf_usm_v(l)%ns
5423
5424!--          Get indices of respective grid point
5425             i = surf_usm_v(l)%i(m)
5426             j = surf_usm_v(l)%j(m)
5427             k = surf_usm_v(l)%k(m)
5428
5429             t_surf_10cm_v(l)%t(m) =surf_usm_v(l)%pt_surface(m) + surf_usm_v(l)%ts(m) / kappa &
5430                                     * ( log( 0.1_wp / surf_usm_v(l)%z0h(m) )             &
5431                                       - psi_h( 0.1_wp / surf_usm_v(l)%ol(m) )            &
5432                                       + psi_h( surf_usm_v(l)%z0h(m) / surf_usm_v(l)%ol(m) ) )
5433
5434          ENDDO
5435
5436       ENDDO
5437
5438
5439    END SUBROUTINE usm_temperature_near_surface
5440
5441   
5442 
5443!------------------------------------------------------------------------------!
5444! Description:
5445! ------------
5446!
5447!> This subroutine is part of the urban surface model.
5448!> It reads daily heat produced by anthropogenic sources
5449!> and the diurnal cycle of the heat.
5450!------------------------------------------------------------------------------!
5451    SUBROUTINE usm_read_anthropogenic_heat
5452   
5453        INTEGER(iwp)                  :: i,j,k,ii
5454        REAL(wp)                      :: heat
5455
5456!--     allocation of array of sources of anthropogenic heat and their diural profile
5457        ALLOCATE( aheat(naheatlayers,nys:nyn,nxl:nxr) )
5458        ALLOCATE( aheatprof(naheatlayers,0:24) )
5459
5460!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5461!--     read daily amount of heat and its daily cycle
5462!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5463        aheat = 0.0_wp
5464        DO  ii = 0, io_blocks-1
5465            IF ( ii == io_group )  THEN
5466
5467!--             open anthropogenic heat file
5468                OPEN( 151, file='ANTHROPOGENIC_HEAT'//TRIM(coupling_char), action='read', &
5469                           status='old', form='formatted', err=11 )
5470                i = 0
5471                j = 0
5472                DO
5473                    READ( 151, *, err=12, end=13 )  i, j, k, heat
5474                    IF ( i >= nxl  .AND.  i <= nxr  .AND.  j >= nys  .AND.  j <= nyn )  THEN
5475                        IF ( k <= naheatlayers  .AND.  k > get_topography_top_index_ji( j, i, 's' ) )  THEN
5476!--                         write heat into the array
5477                            aheat(k,j,i) = heat
5478                        ENDIF
5479                    ENDIF
5480                    CYCLE
5481 12                 WRITE(message_string,'(a,2i4)') 'error in file ANTHROPOGENIC_HEAT'//TRIM(coupling_char)//' after line ',i,j
5482                    CALL message( 'usm_read_anthropogenic_heat', 'PA0515', 0, 1, 0, 6, 0 )
5483                ENDDO
5484 13             CLOSE(151)
5485                CYCLE
5486 11             message_string = 'file ANTHROPOGENIC_HEAT'//TRIM(coupling_char)//' does not exist'
5487                CALL message( 'usm_read_anthropogenic_heat', 'PA0516', 1, 2, 0, 6, 0 )
5488            ENDIF
5489           
5490#if defined( __parallel )
5491            CALL MPI_BARRIER( comm2d, ierr )
5492#endif
5493        ENDDO
5494       
5495!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5496!--     read diurnal profiles of heat sources
5497!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5498        aheatprof = 0.0_wp
5499        DO  ii = 0, io_blocks-1
5500            IF ( ii == io_group )  THEN
5501
5502!--             open anthropogenic heat profile file
5503                OPEN( 151, file='ANTHROPOGENIC_HEAT_PROFILE'//TRIM(coupling_char), action='read', &
5504                           status='old', form='formatted', err=21 )
5505                i = 0
5506                DO
5507                    READ( 151, *, err=22, end=23 )  i, k, heat
5508                    IF ( i >= 0  .AND.  i <= 24  .AND.  k <= naheatlayers )  THEN
5509!--                     write heat into the array
5510                        aheatprof(k,i) = heat
5511                    ENDIF
5512                    CYCLE
5513 22                 WRITE(message_string,'(a,i4)') 'error in file ANTHROPOGENIC_HEAT_PROFILE'// &
5514                                                     TRIM(coupling_char)//' after line ',i
5515                    CALL message( 'usm_read_anthropogenic_heat', 'PA0517', 0, 1, 0, 6, 0 )
5516                ENDDO
5517                aheatprof(:,24) = aheatprof(:,0)
5518 23             CLOSE(151)
5519                CYCLE
5520 21             message_string = 'file ANTHROPOGENIC_HEAT_PROFILE'//TRIM(coupling_char)//' does not exist'
5521                CALL message( 'usm_read_anthropogenic_heat', 'PA0518', 1, 2, 0, 6, 0 )
5522            ENDIF
5523           
5524#if defined( __parallel )
5525            CALL MPI_BARRIER( comm2d, ierr )
5526#endif
5527        ENDDO
5528       
5529    END SUBROUTINE usm_read_anthropogenic_heat
5530   
5531
5532!------------------------------------------------------------------------------!
5533! Description:
5534! ------------
5535!> Soubroutine reads t_surf and t_wall data from restart files
5536!------------------------------------------------------------------------------!
5537    SUBROUTINE usm_rrd_local( i, k, nxlf, nxlc, nxl_on_file, nxrf, nxrc,       &
5538                              nxr_on_file, nynf, nync, nyn_on_file, nysf, nysc,&
5539                              nys_on_file, found )
5540
5541
5542       USE control_parameters,                                                 &
5543           ONLY: length, restart_string
5544           
5545       IMPLICIT NONE
5546
5547       CHARACTER (LEN=1)  ::  dum              !< dummy to create correct string for reading input variable
5548
5549       INTEGER(iwp)       ::  l                !< index variable for surface type
5550       INTEGER(iwp)       ::  i                !< running index over input files
5551       INTEGER(iwp)       ::  k                !< running index over previous input files covering current local domain
5552       INTEGER(iwp)       ::  ns_h_on_file_usm !< number of horizontal surface elements (urban type) on file
5553       INTEGER(iwp)       ::  nxlc             !< index of left boundary on current subdomain
5554       INTEGER(iwp)       ::  nxlf             !< index of left boundary on former subdomain
5555       INTEGER(iwp)       ::  nxl_on_file      !< index of left boundary on former local domain
5556       INTEGER(iwp)       ::  nxrc             !< index of right boundary on current subdomain
5557       INTEGER(iwp)       ::  nxrf             !< index of right boundary on former subdomain
5558       INTEGER(iwp)       ::  nxr_on_file      !< index of right boundary on former local domain
5559       INTEGER(iwp)       ::  nync             !< index of north boundary on current subdomain
5560       INTEGER(iwp)       ::  nynf             !< index of north boundary on former subdomain
5561       INTEGER(iwp)       ::  nyn_on_file      !< index of north boundary on former local domain
5562       INTEGER(iwp)       ::  nysc             !< index of south boundary on current subdomain
5563       INTEGER(iwp)       ::  nysf             !< index of south boundary on former subdomain
5564       INTEGER(iwp)       ::  nys_on_file      !< index of south boundary on former local domain
5565       
5566       INTEGER(iwp)       ::  ns_v_on_file_usm(0:3) !< number of vertical surface elements (urban type) on file
5567       
5568       INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE, SAVE ::  start_index_on_file 
5569       INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE, SAVE ::  end_index_on_file
5570
5571       LOGICAL, INTENT(OUT)  ::  found 
5572       
5573       REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE   ::  tmp_surf_h, tmp_surf_window_h, tmp_surf_green_h
5574       REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE ::  tmp_wall_h, tmp_window_h, tmp_green_h
5575       
5576       TYPE( t_surf_vertical ), DIMENSION(0:3), SAVE ::  tmp_surf_v, tmp_surf_window_v, tmp_surf_green_v
5577       TYPE( t_wall_vertical ), DIMENSION(0:3), SAVE ::  tmp_wall_v, tmp_window_v, tmp_green_v
5578
5579
5580       found = .TRUE.
5581
5582
5583          SELECT CASE ( restart_string(1:length) ) 
5584
5585             CASE ( 'ns_h_on_file_usm') 
5586                IF ( k == 1 )  THEN
5587                   READ ( 13 ) ns_h_on_file_usm
5588               
5589                   IF ( ALLOCATED( tmp_surf_h ) ) DEALLOCATE( tmp_surf_h )
5590                   IF ( ALLOCATED( tmp_wall_h ) ) DEALLOCATE( tmp_wall_h ) 
5591                   IF ( ALLOCATED( tmp_surf_window_h ) )                       &
5592                      DEALLOCATE( tmp_surf_window_h ) 
5593                   IF ( ALLOCATED( tmp_window_h) ) DEALLOCATE( tmp_window_h ) 
5594                   IF ( ALLOCATED( tmp_surf_green_h) )                         &
5595                      DEALLOCATE( tmp_surf_green_h ) 
5596                   IF ( ALLOCATED( tmp_green_h) ) DEALLOCATE( tmp_green_h )
5597 
5598!
5599!--                Allocate temporary arrays for reading data on file. Note,
5600!--                the size of allocated surface elements do not necessarily
5601!--                need  to match the size of present surface elements on
5602!--                current processor, as the number of processors between
5603!--                restarts can change.
5604                   ALLOCATE( tmp_surf_h(1:ns_h_on_file_usm) )
5605                   ALLOCATE( tmp_wall_h(nzb_wall:nzt_wall+1,                   &
5606                                        1:ns_h_on_file_usm) )
5607                   ALLOCATE( tmp_surf_window_h(1:ns_h_on_file_usm) )
5608                   ALLOCATE( tmp_window_h(nzb_wall:nzt_wall+1,                 &
5609                                          1:ns_h_on_file_usm) )
5610                   ALLOCATE( tmp_surf_green_h(1:ns_h_on_file_usm) )
5611                   ALLOCATE( tmp_green_h(nzb_wall:nzt_wall+1,                  &
5612                                         1:ns_h_on_file_usm) )
5613
5614                ENDIF
5615
5616             CASE ( 'ns_v_on_file_usm')
5617                IF ( k == 1 )  THEN
5618                   READ ( 13 ) ns_v_on_file_usm 
5619
5620                   DO  l = 0, 3
5621                      IF ( ALLOCATED( tmp_surf_v(l)%t ) )                      &
5622                         DEALLOCATE( tmp_surf_v(l)%t )
5623                      IF ( ALLOCATED( tmp_wall_v(l)%t ) )                      &
5624                         DEALLOCATE( tmp_wall_v(l)%t )
5625                      IF ( ALLOCATED( tmp_surf_window_v(l)%t ) )               & 
5626                         DEALLOCATE( tmp_surf_window_v(l)%t )
5627                      IF ( ALLOCATED( tmp_window_v(l)%t ) )                    &
5628                         DEALLOCATE( tmp_window_v(l)%t )
5629                      IF ( ALLOCATED( tmp_surf_green_v(l)%t ) )                &
5630                         DEALLOCATE( tmp_surf_green_v(l)%t )
5631                      IF ( ALLOCATED( tmp_green_v(l)%t ) )                     &
5632                         DEALLOCATE( tmp_green_v(l)%t )
5633                   ENDDO 
5634
5635!
5636!--                Allocate temporary arrays for reading data on file. Note,
5637!--                the size of allocated surface elements do not necessarily
5638!--                need to match the size of present surface elements on
5639!--                current processor, as the number of processors between
5640!--                restarts can change.
5641                   DO  l = 0, 3
5642                      ALLOCATE( tmp_surf_v(l)%t(1:ns_v_on_file_usm(l)) )
5643                      ALLOCATE( tmp_wall_v(l)%t(nzb_wall:nzt_wall+1,           &
5644                                                1:ns_v_on_file_usm(l) ) )
5645                      ALLOCATE( tmp_surf_window_v(l)%t(1:ns_v_on_file_usm(l)) )
5646                      ALLOCATE( tmp_window_v(l)%t(nzb_wall:nzt_wall+1,         & 
5647                                                  1:ns_v_on_file_usm(l) ) )
5648                      ALLOCATE( tmp_surf_green_v(l)%t(1:ns_v_on_file_usm(l)) )
5649                      ALLOCATE( tmp_green_v(l)%t(nzb_wall:nzt_wall+1,          &
5650                                                 1:ns_v_on_file_usm(l) ) )
5651                   ENDDO
5652
5653                ENDIF   
5654         
5655             CASE ( 'usm_start_index_h', 'usm_start_index_v'  )   
5656                IF ( k == 1 )  THEN
5657
5658                   IF ( ALLOCATED( start_index_on_file ) )                     &
5659                      DEALLOCATE( start_index_on_file )
5660
5661                   ALLOCATE ( start_index_on_file(nys_on_file:nyn_on_file,     &
5662                                                  nxl_on_file:nxr_on_file) )
5663
5664                   READ ( 13 )  start_index_on_file
5665
5666                ENDIF
5667               
5668             CASE ( 'usm_end_index_h', 'usm_end_index_v' )   
5669                IF ( k == 1 )  THEN
5670
5671                   IF ( ALLOCATED( end_index_on_file ) )                       &
5672                      DEALLOCATE( end_index_on_file )
5673
5674                   ALLOCATE ( end_index_on_file(nys_on_file:nyn_on_file,       &
5675                                                nxl_on_file:nxr_on_file) )
5676
5677                   READ ( 13 )  end_index_on_file
5678
5679                ENDIF
5680         
5681             CASE ( 't_surf_h' )
5682#if defined( __nopointer )                   
5683                IF ( k == 1 )  THEN
5684                   IF ( .NOT.  ALLOCATED( t_surf_h ) )                         &
5685                      ALLOCATE( t_surf_h(1:surf_usm_h%ns) )
5686                   READ ( 13 )  tmp_surf_h
5687                ENDIF
5688                CALL surface_restore_elements(                                 &
5689                                        t_surf_h, tmp_surf_h,                  &
5690                                        surf_usm_h%start_index,                & 
5691                                        start_index_on_file,                   &
5692                                        end_index_on_file,                     &
5693                                        nxlc, nysc,                            &
5694                                        nxlf, nxrf, nysf, nynf,                &
5695                                        nys_on_file, nyn_on_file,              &
5696                                        nxl_on_file,nxr_on_file )
5697#else                 
5698                IF ( k == 1 )  THEN
5699                   IF ( .NOT.  ALLOCATED( t_surf_h_1 ) )                       &
5700                      ALLOCATE( t_surf_h_1(1:surf_usm_h%ns) )
5701                   READ ( 13 )  tmp_surf_h
5702                ENDIF             
5703                CALL surface_restore_elements(                                 &
5704                                        t_surf_h_1, tmp_surf_h,                &
5705                                        surf_usm_h%start_index,                & 
5706                                        start_index_on_file,                   &
5707                                        end_index_on_file,                     &
5708                                        nxlc, nysc,                            &
5709                                        nxlf, nxrf, nysf, nynf,                &
5710                                        nys_on_file, nyn_on_file,              &
5711                                        nxl_on_file,nxr_on_file )
5712#endif
5713
5714             CASE ( 't_surf_v(0)' )
5715#if defined( __nopointer )           
5716                IF ( k == 1 )  THEN
5717                   IF ( .NOT.  ALLOCATED( t_surf_v(0)%t ) )                    &
5718                      ALLOCATE( t_surf_v(0)%t(1:surf_usm_v(0)%ns) )
5719                   READ ( 13 )  tmp_surf_v(0)%t
5720                ENDIF
5721                CALL surface_restore_elements(                                 &
5722                                        t_surf_v(0)%t, tmp_surf_v(0)%t,        &
5723                                        surf_usm_v(0)%start_index,             &
5724                                        start_index_on_file,                   &
5725                                        end_index_on_file,                     &
5726                                        nxlc, nysc,                            &
5727                                        nxlf, nxrf, nysf, nynf,                &
5728                                        nys_on_file, nyn_on_file,              &
5729                                        nxl_on_file,nxr_on_file )
5730#else                     
5731                IF ( k == 1 )  THEN
5732                   IF ( .NOT.  ALLOCATED( t_surf_v_1(0)%t ) )                  &
5733                      ALLOCATE( t_surf_v_1(0)%t(1:surf_usm_v(0)%ns) )
5734                   READ ( 13 )  tmp_surf_v(0)%t
5735                ENDIF
5736                CALL surface_restore_elements(                                 &
5737                                        t_surf_v_1(0)%t, tmp_surf_v(0)%t,      &
5738                                        surf_usm_v(0)%start_index,             & 
5739                                        start_index_on_file,                   &
5740                                        end_index_on_file,                     &
5741                                        nxlc, nysc,                            &
5742                                        nxlf, nxrf, nysf, nynf,                &
5743                                        nys_on_file, nyn_on_file,              &
5744                                        nxl_on_file,nxr_on_file )
5745#endif
5746                     
5747             CASE ( 't_surf_v(1)' )
5748#if defined( __nopointer )       
5749                IF ( k == 1 )  THEN
5750                   IF ( .NOT.  ALLOCATED( t_surf_v(1)%t ) )                    &
5751                      ALLOCATE( t_surf_v(1)%t(1:surf_usm_v(1)%ns) )
5752                   READ ( 13 )  tmp_surf_v(1)%t
5753                ENDIF
5754                CALL surface_restore_elements(                                 &
5755                                        t_surf_v(1)%t, tmp_surf_v(1)%t,        &
5756                                        surf_usm_v(1)%start_index,             & 
5757                                        start_index_on_file,                   &
5758                                        end_index_on_file,                     &
5759                                        nxlc, nysc,                            &
5760                                        nxlf, nxrf, nysf, nynf,                &
5761                                        nys_on_file, nyn_on_file,              &
5762                                        nxl_on_file,nxr_on_file )                 
5763#else                     
5764                IF ( k == 1 )  THEN
5765                   IF ( .NOT.  ALLOCATED( t_surf_v_1(1)%t ) )                  &
5766                      ALLOCATE( t_surf_v_1(1)%t(1:surf_usm_v(1)%ns) )
5767                   READ ( 13 )  tmp_surf_v(1)%t
5768                ENDIF
5769                CALL surface_restore_elements(                                 &
5770                                        t_surf_v_1(1)%t, tmp_surf_v(1)%t,      &
5771                                        surf_usm_v(1)%start_index,             & 
5772                                        start_index_on_file,                   &
5773                                        end_index_on_file,                     &
5774                                        nxlc, nysc,                            &
5775                                        nxlf, nxrf, nysf, nynf,                &
5776                                        nys_on_file, nyn_on_file,              &
5777                                        nxl_on_file,nxr_on_file )
5778#endif
5779
5780             CASE ( 't_surf_v(2)' )
5781#if defined( __nopointer )         
5782                IF ( k == 1 )  THEN
5783                   IF ( .NOT.  ALLOCATED( t_surf_v(2)%t ) )                    &
5784                      ALLOCATE( t_surf_v(2)%t(1:surf_usm_v(2)%ns) )
5785                   READ ( 13 )  tmp_surf_v(2)%t
5786                ENDIF
5787                CALL surface_restore_elements(                                 &
5788                                        t_surf_v(2)%t, tmp_surf_v(2)%t,        &
5789                                        surf_usm_v(2)%start_index,             & 
5790                                        start_index_on_file,                   &
5791                                        end_index_on_file,                     &
5792                                        nxlc, nysc,                            &
5793                                        nxlf, nxrf, nysf, nynf,                &
5794                                        nys_on_file, nyn_on_file,              &
5795                                        nxl_on_file,nxr_on_file )
5796#else                     
5797                IF ( k == 1 )  THEN
5798                   IF ( .NOT.  ALLOCATED( t_surf_v_1(2)%t ) )                  &
5799                      ALLOCATE( t_surf_v_1(2)%t(1:surf_usm_v(2)%ns) )
5800                   READ ( 13 )  tmp_surf_v(2)%t
5801                ENDIF
5802                CALL surface_restore_elements(                                 &
5803                                        t_surf_v_1(2)%t, tmp_surf_v(2)%t,      &
5804                                        surf_usm_v(2)%start_index,             & 
5805                                        start_index_on_file,                   &
5806                                        end_index_on_file,                     &
5807                                        nxlc, nysc,                            &
5808                                        nxlf, nxrf, nysf, nynf,                &
5809                                        nys_on_file, nyn_on_file,              &
5810                                        nxl_on_file,nxr_on_file )
5811#endif
5812                     
5813             CASE ( 't_surf_v(3)' )
5814#if defined( __nopointer )   
5815                IF ( k == 1 )  THEN
5816                   IF ( .NOT.  ALLOCATED( t_surf_v(3)%t ) )                    &
5817                      ALLOCATE( t_surf_v(3)%t(1:surf_usm_v(3)%ns) )
5818                   READ ( 13 )  tmp_surf_v(3)%t
5819                ENDIF
5820                CALL surface_restore_elements(                                 &
5821                                        t_surf_v(3)%t, tmp_surf_v(3)%t,        &
5822                                        surf_usm_v(3)%start_index,             & 
5823                                        start_index_on_file,                   &
5824                                        end_index_on_file,                     &
5825                                        nxlc, nysc,                            &
5826                                        nxlf, nxrf, nysf, nynf,                &
5827                                        nys_on_file, nyn_on_file,              &
5828                                        nxl_on_file,nxr_on_file )
5829#else                     
5830                IF ( k == 1 )  THEN
5831                   IF ( .NOT.  ALLOCATED( t_surf_v_1(3)%t ) )                  &
5832                      ALLOCATE( t_surf_v_1(3)%t(1:surf_usm_v(3)%ns) )
5833                   READ ( 13 )  tmp_surf_v(3)%t
5834                ENDIF
5835                CALL surface_restore_elements(                                 &
5836                                        t_surf_v_1(3)%t, tmp_surf_v(3)%t,      &
5837                                        surf_usm_v(3)%start_index,             & 
5838                                        start_index_on_file,                   &
5839                                        end_index_on_file,                     &
5840                                        nxlc, nysc,                            &
5841                                        nxlf, nxrf, nysf, nynf,                &
5842                                        nys_on_file, nyn_on_file,              &
5843                                        nxl_on_file,nxr_on_file )
5844#endif
5845             CASE ( 't_surf_green_h' )
5846#if defined( __nopointer )                   
5847                IF ( k == 1 )  THEN
5848                   IF ( .NOT.  ALLOCATED( t_surf_green_h ) )                   &
5849                      ALLOCATE( t_surf_green_h(1:surf_usm_h%ns) )
5850                   READ ( 13 )  tmp_surf_green_h
5851                ENDIF
5852                CALL surface_restore_elements(                                 &
5853                                        t_surf_green_h, tmp_surf_green_h,      &
5854                                        surf_usm_h%start_index,                & 
5855                                        start_index_on_file,                   &
5856                                        end_index_on_file,                     &
5857                                        nxlc, nysc,                            &
5858                                        nxlf, nxrf, nysf, nynf,                &
5859                                        nys_on_file, nyn_on_file,              &
5860                                        nxl_on_file,nxr_on_file )
5861#else                     
5862                IF ( k == 1 )  THEN
5863                   IF ( .NOT.  ALLOCATED( t_surf_green_h_1 ) )                 &
5864                      ALLOCATE( t_surf_green_h_1(1:surf_usm_h%ns) )
5865                   READ ( 13 )  tmp_surf_green_h
5866                ENDIF
5867                CALL surface_restore_elements(                                 &
5868                                        t_surf_green_h_1, tmp_surf_green_h,    &
5869                                        surf_usm_h%start_index,                & 
5870                                        start_index_on_file,                   &
5871                                        end_index_on_file,                     &
5872                                        nxlc, nysc,                            &
5873                                        nxlf, nxrf, nysf, nynf,                &
5874                                        nys_on_file, nyn_on_file,              &
5875                                        nxl_on_file,nxr_on_file )
5876#endif
5877
5878             CASE ( 't_surf_green_v(0)' )
5879#if defined( __nopointer )           
5880                IF ( k == 1 )  THEN
5881                   IF ( .NOT.  ALLOCATED( t_surf_green_v(0)%t ) )              &
5882                      ALLOCATE( t_surf_green_v(0)%t(1:surf_usm_v(0)%ns) )
5883                   READ ( 13 )  tmp_surf_green_v(0)%t
5884                ENDIF
5885                CALL surface_restore_elements(                                 &
5886                                        t_surf_green_v(0)%t,                   &
5887                                        tmp_surf_green_v(0)%t,                 &
5888                                        surf_usm_v(0)%start_index,             & 
5889                                        start_index_on_file,                   &
5890                                        end_index_on_file,                     &
5891                                        nxlc, nysc,                            &
5892                                        nxlf, nxrf, nysf, nynf,                &
5893                                        nys_on_file, nyn_on_file,              &
5894                                        nxl_on_file,nxr_on_file )
5895#else                     
5896                IF ( k == 1 )  THEN
5897                   IF ( .NOT.  ALLOCATED( t_surf_green_v_1(0)%t ) )            &
5898                      ALLOCATE( t_surf_green_v_1(0)%t(1:surf_usm_v(0)%ns) )
5899                   READ ( 13 )  tmp_surf_green_v(0)%t
5900                ENDIF
5901                CALL surface_restore_elements(                                 &
5902                                        t_surf_green_v_1(0)%t,                 &
5903                                        tmp_surf_green_v(0)%t,                 &
5904                                        surf_usm_v(0)%start_index,             & 
5905                                        start_index_on_file,                   &
5906                                        end_index_on_file,                     &
5907                                        nxlc, nysc,                            &
5908                                        nxlf, nxrf, nysf, nynf,                &
5909                                        nys_on_file, nyn_on_file,              &
5910                                        nxl_on_file,nxr_on_file )
5911#endif
5912                   
5913             CASE ( 't_surf_green_v(1)' )
5914#if defined( __nopointer )       
5915                IF ( k == 1 )  THEN
5916                   IF ( .NOT.  ALLOCATED( t_surf_green_v(1)%t ) )              &
5917                      ALLOCATE( t_surf_green_v(1)%t(1:surf_usm_v(1)%ns) )
5918                   READ ( 13 )  tmp_surf_green_v(1)%t
5919                ENDIF
5920                CALL surface_restore_elements(                                 &
5921                                        t_surf_green_v(1)%t,                   &
5922                                        tmp_surf_green_v(1)%t,                 &
5923                                        surf_usm_v(1)%start_index,             & 
5924                                        start_index_on_file,                   &
5925                                        end_index_on_file,                     &
5926                                        nxlc, nysc,                            &
5927                                        nxlf, nxrf, nysf, nynf,                &
5928                                        nys_on_file, nyn_on_file,              &
5929                                        nxl_on_file,nxr_on_file )                 
5930#else                     
5931                IF ( k == 1 )  THEN
5932                   IF ( .NOT.  ALLOCATED( t_surf_green_v_1(1)%t ) )            &
5933                      ALLOCATE( t_surf_green_v_1(1)%t(1:surf_usm_v(1)%ns) )
5934                   READ ( 13 )  tmp_surf_green_v(1)%t
5935                ENDIF
5936                CALL surface_restore_elements(                                 &
5937                                        t_surf_green_v_1(1)%t,                 &
5938                                        tmp_surf_green_v(1)%t,                 &
5939                                        surf_usm_v(1)%start_index,             & 
5940                                        start_index_on_file,                   &
5941                                        end_index_on_file,                     &
5942                                        nxlc, nysc,                            &
5943                                        nxlf, nxrf, nysf, nynf,                &
5944                                        nys_on_file, nyn_on_file,              &
5945                                        nxl_on_file,nxr_on_file )
5946#endif
5947
5948             CASE ( 't_surf_green_v(2)' )
5949#if defined( __nopointer )         
5950                IF ( k == 1 )  THEN
5951                   IF ( .NOT.  ALLOCATED( t_surf_green_v(2)%t ) )              &
5952                      ALLOCATE( t_surf_green_v(2)%t(1:surf_usm_v(2)%ns) )
5953                   READ ( 13 )  tmp_surf_green_v(2)%t
5954                ENDIF
5955                CALL surface_restore_elements(                                 &
5956                                        t_surf_green_v(2)%t,                   & 
5957                                        tmp_surf_green_v(2)%t,                 &
5958                                        surf_usm_v(2)%start_index,             & 
5959                                        start_index_on_file,                   &
5960                                        end_index_on_file,                     &
5961                                        nxlc, nysc,                            &
5962                                        nxlf, nxrf, nysf, nynf,                &
5963                                        nys_on_file, nyn_on_file,              &
5964                                        nxl_on_file,nxr_on_file )
5965#else                     
5966                IF ( k == 1 )  THEN
5967                   IF ( .NOT.  ALLOCATED( t_surf_green_v_1(2)%t ) )            &
5968                      ALLOCATE( t_surf_green_v_1(2)%t(1:surf_usm_v(2)%ns) )
5969                   READ ( 13 )  tmp_surf_green_v(2)%t
5970                ENDIF
5971                CALL surface_restore_elements(                                 &
5972                                        t_surf_green_v_1(2)%t,                 &
5973                                        tmp_surf_green_v(2)%t,                 &
5974                                        surf_usm_v(2)%start_index,             & 
5975                                        start_index_on_file,                   &
5976                                        end_index_on_file,                     &
5977                                        nxlc, nysc,                            &
5978                                        nxlf, nxrf, nysf, nynf,                &
5979                                        nys_on_file, nyn_on_file,              &
5980                                        nxl_on_file,nxr_on_file )
5981#endif
5982                   
5983             CASE ( 't_surf_green_v(3)' )
5984#if defined( __nopointer )   
5985                IF ( k == 1 )  THEN
5986                   IF ( .NOT.  ALLOCATED( t_surf_green_v(3)%t ) )              &
5987                      ALLOCATE( t_surf_green_v(3)%t(1:surf_usm_v(3)%ns) )
5988                   READ ( 13 )  tmp_surf_green_v(3)%t
5989                ENDIF
5990                CALL surface_restore_elements(                                 &
5991                                        t_surf_green_v(3)%t,                   &
5992                                        tmp_surf_green_v(3)%t,                 &
5993                                        surf_usm_v(3)%start_index,             & 
5994                                        start_index_on_file,                   &
5995                                        end_index_on_file,                     &
5996                                        nxlc, nysc,                            &
5997                                        nxlf, nxrf, nysf, nynf,                &
5998                                        nys_on_file, nyn_on_file,              &
5999                                        nxl_on_file,nxr_on_file )
6000#else                     
6001                IF ( k == 1 )  THEN
6002                   IF ( .NOT.  ALLOCATED( t_surf_green_v_1(3)%t ) )            &
6003                      ALLOCATE( t_surf_green_v_1(3)%t(1:surf_usm_v(3)%ns) )
6004                   READ ( 13 )  tmp_surf_green_v(3)%t
6005                ENDIF
6006                CALL surface_restore_elements(                                 &
6007                                        t_surf_green_v_1(3)%t,                 & 
6008                                        tmp_surf_green_v(3)%t,                 &
6009                                        surf_usm_v(3)%start_index,             & 
6010                                        start_index_on_file,                   &
6011                                        end_index_on_file,                     &
6012                                        nxlc, nysc,                            &
6013                                        nxlf, nxrf, nysf, nynf,                &
6014                                        nys_on_file, nyn_on_file,              &
6015                                        nxl_on_file,nxr_on_file )
6016#endif
6017             CASE ( 't_surf_window_h' )
6018#if defined( __nopointer )                   
6019                IF ( k == 1 )  THEN
6020                   IF ( .NOT.  ALLOCATED( t_surf_window_h ) )                  &
6021                      ALLOCATE( t_surf_window_h(1:surf_usm_h%ns) )
6022                   READ ( 13 )  tmp_surf_window_h
6023                ENDIF
6024                CALL surface_restore_elements(                                 &
6025                                        t_surf_window_h, tmp_surf_window_h,    &
6026                                        surf_usm_h%start_index,                & 
6027                                        start_index_on_file,                   &
6028                                        end_index_on_file,                     &
6029                                        nxlc, nysc,                            &
6030                                        nxlf, nxrf, nysf, nynf,                &
6031                                        nys_on_file, nyn_on_file,              &
6032                                        nxl_on_file,nxr_on_file )
6033#else                     
6034                IF ( k == 1 )  THEN
6035                   IF ( .NOT.  ALLOCATED( t_surf_window_h_1 ) )                &
6036                      ALLOCATE( t_surf_window_h_1(1:surf_usm_h%ns) )
6037                   READ ( 13 )  tmp_surf_window_h
6038                ENDIF
6039                CALL surface_restore_elements(                                 &
6040                                        t_surf_window_h_1,                     &
6041                                        tmp_surf_window_h,                     &
6042                                        surf_usm_h%start_index,                & 
6043                                        start_index_on_file,                   &
6044                                        end_index_on_file,                     &
6045                                        nxlc, nysc,                            &
6046                                        nxlf, nxrf, nysf, nynf,                &
6047                                        nys_on_file, nyn_on_file,              &
6048                                        nxl_on_file,nxr_on_file )
6049#endif
6050
6051             CASE ( 't_surf_window_v(0)' )
6052#if defined( __nopointer )           
6053                IF ( k == 1 )  THEN
6054                   IF ( .NOT.  ALLOCATED( t_surf_window_v(0)%t ) )             &
6055                      ALLOCATE( t_surf_window_v(0)%t(1:surf_usm_v(0)%ns) )
6056                   READ ( 13 )  tmp_surf_window_v(0)%t
6057                ENDIF
6058                CALL surface_restore_elements(                                 &
6059                                        t_surf_window_v(0)%t,                  &
6060                                        tmp_surf_window_v(0)%t,                &
6061                                        surf_usm_v(0)%start_index,             & 
6062                                        start_index_on_file,                   &
6063                                        end_index_on_file,                     &
6064                                        nxlc, nysc,                            &
6065                                        nxlf, nxrf, nysf, nynf,                &
6066                                        nys_on_file, nyn_on_file,              &
6067                                        nxl_on_file,nxr_on_file )
6068#else                     
6069                IF ( k == 1 )  THEN
6070                   IF ( .NOT.  ALLOCATED( t_surf_window_v_1(0)%t ) )           &
6071                      ALLOCATE( t_surf_window_v_1(0)%t(1:surf_usm_v(0)%ns) )
6072                   READ ( 13 )  tmp_surf_window_v(0)%t
6073                ENDIF
6074                CALL surface_restore_elements(                                 &
6075                                        t_surf_window_v_1(0)%t,                &
6076                                        tmp_surf_window_v(0)%t,                &
6077                                        surf_usm_v(0)%start_index,             & 
6078                                        start_index_on_file,                   &
6079                                        end_index_on_file,                     &
6080                                        nxlc, nysc,                            &
6081                                        nxlf, nxrf, nysf, nynf,                &
6082                                        nys_on_file, nyn_on_file,              &
6083                                        nxl_on_file,nxr_on_file )
6084#endif
6085                   
6086             CASE ( 't_surf_window_v(1)' )
6087#if defined( __nopointer )       
6088                IF ( k == 1 )  THEN
6089                   IF ( .NOT.  ALLOCATED( t_surf_window_v(1)%t ) )             &
6090                      ALLOCATE( t_surf_window_v(1)%t(1:surf_usm_v(1)%ns) )
6091                   READ ( 13 )  tmp_surf_window_v(1)%t
6092                ENDIF
6093                CALL surface_restore_elements(                                 &
6094                                        t_surf_window_v(1)%t,                  & 
6095                                        tmp_surf_window_v(1)%t,                &
6096                                        surf_usm_v(1)%start_index,             & 
6097                                        start_index_on_file,                   &
6098                                        end_index_on_file,                     &
6099                                        nxlc, nysc,                            &
6100                                        nxlf, nxrf, nysf, nynf,                &
6101                                        nys_on_file, nyn_on_file,              &
6102                                        nxl_on_file,nxr_on_file )                 
6103#else                     
6104                IF ( k == 1 )  THEN
6105                   IF ( .NOT.  ALLOCATED( t_surf_window_v_1(1)%t ) )           &
6106                      ALLOCATE( t_surf_window_v_1(1)%t(1:surf_usm_v(1)%ns) )
6107                   READ ( 13 )  tmp_surf_window_v(1)%t
6108                ENDIF
6109                CALL surface_restore_elements(                                 &
6110                                        t_surf_window_v_1(1)%t,                &
6111                                        tmp_surf_window_v(1)%t,                &
6112                                        surf_usm_v(1)%start_index,             & 
6113                                        start_index_on_file,                   &
6114                                        end_index_on_file,                     &
6115                                        nxlc, nysc,                            &
6116                                        nxlf, nxrf, nysf, nynf,                &
6117                                        nys_on_file, nyn_on_file,              &
6118                                        nxl_on_file,nxr_on_file )
6119#endif
6120
6121             CASE ( 't_surf_window_v(2)' )
6122#if defined( __nopointer )         
6123                IF ( k == 1 )  THEN
6124                   IF ( .NOT.  ALLOCATED( t_surf_window_v(2)%t ) )             &
6125                      ALLOCATE( t_surf_window_v(2)%t(1:surf_usm_v(2)%ns) )
6126                   READ ( 13 )  tmp_surf_window_v(2)%t
6127                ENDIF
6128                CALL surface_restore_elements(                                 &
6129                                        t_surf_window_v(2)%t,                  &
6130                                        tmp_surf_window_v(2)%t,                &
6131                                        surf_usm_v(2)%start_index,             &   
6132                                        start_index_on_file,                   &
6133                                        end_index_on_file,                     &
6134                                        nxlc, nysc,                            &
6135                                        nxlf, nxrf, nysf, nynf,                &
6136                                        nys_on_file, nyn_on_file,              &
6137                                        nxl_on_file,nxr_on_file )
6138#else                     
6139                IF ( k == 1 )  THEN
6140                   IF ( .NOT.  ALLOCATED( t_surf_window_v_1(2)%t ) )           &
6141                      ALLOCATE( t_surf_window_v_1(2)%t(1:surf_usm_v(2)%ns) )
6142                   READ ( 13 )  tmp_surf_window_v(2)%t
6143                ENDIF
6144                CALL surface_restore_elements(                                 &
6145                                        t_surf_window_v_1(2)%t,                & 
6146                                        tmp_surf_window_v(2)%t,                &
6147                                        surf_usm_v(2)%start_index,             & 
6148                                        start_index_on_file,                   &
6149                                        end_index_on_file,                     &
6150                                        nxlc, nysc,                            &
6151                                        nxlf, nxrf, nysf, nynf,                &
6152                                        nys_on_file, nyn_on_file,              &
6153                                        nxl_on_file,nxr_on_file )
6154#endif
6155                   
6156             CASE ( 't_surf_window_v(3)' )
6157#if defined( __nopointer )   
6158                IF ( k == 1 )  THEN
6159                   IF ( .NOT.  ALLOCATED( t_surf_window_v(3)%t ) )             &
6160                      ALLOCATE( t_surf_window_v(3)%t(1:surf_usm_v(3)%ns) )
6161                   READ ( 13 )  tmp_surf_window_v(3)%t
6162                ENDIF
6163                CALL surface_restore_elements(                                 &
6164                                        t_surf_window_v(3)%t,                  &
6165                                        tmp_surf_window_v(3)%t,                &
6166                                        surf_usm_v(3)%start_index,             & 
6167                                        start_index_on_file,                   &
6168                                        end_index_on_file,                     &
6169                                        nxlc, nysc,                            &
6170                                        nxlf, nxrf, nysf, nynf,                &
6171                                        nys_on_file, nyn_on_file,              &
6172                                        nxl_on_file,nxr_on_file )
6173#else                     
6174                IF ( k == 1 )  THEN
6175                   IF ( .NOT.  ALLOCATED( t_surf_window_v_1(3)%t ) )           &
6176                      ALLOCATE( t_surf_window_v_1(3)%t(1:surf_usm_v(3)%ns) )
6177                   READ ( 13 )  tmp_surf_window_v(3)%t
6178                ENDIF
6179                CALL surface_restore_elements(                                 &
6180                                        t_surf_window_v_1(3)%t,                & 
6181                                        tmp_surf_window_v(3)%t,                &
6182                                        surf_usm_v(3)%start_index,             & 
6183                                        start_index_on_file,                   &
6184                                        end_index_on_file,                     &
6185                                        nxlc, nysc,                            &
6186                                        nxlf, nxrf, nysf, nynf,                &
6187                                        nys_on_file, nyn_on_file,              &
6188                                        nxl_on_file,nxr_on_file )
6189#endif
6190             CASE ( 't_wall_h' )
6191#if defined( __nopointer )
6192                IF ( k == 1 )  THEN
6193                   IF ( .NOT.  ALLOCATED( t_wall_h ) )                         &
6194                      ALLOCATE( t_wall_h(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
6195                   READ ( 13 )  tmp_wall_h
6196                ENDIF
6197                CALL surface_restore_elements(                                 &
6198                                        t_wall_h, tmp_wall_h,                  &
6199                                        surf_usm_h%start_index,                & 
6200                                        start_index_on_file,                   &
6201                                        end_index_on_file,                     &
6202                                        nxlc, nysc,                            &
6203                                        nxlf, nxrf, nysf, nynf,                &
6204                                        nys_on_file, nyn_on_file,              &
6205                                        nxl_on_file,nxr_on_file )
6206#else
6207                IF ( k == 1 )  THEN
6208                   IF ( .NOT.  ALLOCATED( t_wall_h_1 ) )                       &
6209                      ALLOCATE( t_wall_h_1(nzb_wall:nzt_wall+1,                &
6210                                           1:surf_usm_h%ns) )
6211                   READ ( 13 )  tmp_wall_h
6212                ENDIF
6213                CALL surface_restore_elements(                                 &
6214                                        t_wall_h_1, tmp_wall_h,                &
6215                                        surf_usm_h%start_index,                & 
6216                                        start_index_on_file,                   &
6217                                        end_index_on_file,                     &
6218                                        nxlc, nysc,                            &
6219                                        nxlf, nxrf, nysf, nynf,                &
6220                                        nys_on_file, nyn_on_file,              &
6221                                        nxl_on_file,nxr_on_file )
6222#endif
6223             CASE ( 't_wall_v(0)' )
6224#if defined( __nopointer )
6225                IF ( k == 1 )  THEN
6226                   IF ( .NOT.  ALLOCATED( t_wall_v(0)%t ) )                    &
6227                      ALLOCATE( t_wall_v(0)%t(nzb_wall:nzt_wall+1,             &
6228                                              1:surf_usm_v(0)%ns) )
6229                   READ ( 13 )  tmp_wall_v(0)%t
6230                ENDIF
6231                CALL surface_restore_elements(                                 &
6232                                        t_wall_v(0)%t, tmp_wall_v(0)%t,        &
6233                                        surf_usm_v(0)%start_index,             &   
6234                                        start_index_on_file,                   &
6235                                        end_index_on_file,                     &
6236                                        nxlc, nysc,                            &
6237                                        nxlf, nxrf, nysf, nynf,                &
6238                                        nys_on_file, nyn_on_file,              &
6239                                        nxl_on_file,nxr_on_file )
6240#else
6241                IF ( k == 1 )  THEN
6242                   IF ( .NOT.  ALLOCATED( t_wall_v_1(0)%t ) )                  &
6243                      ALLOCATE( t_wall_v_1(0)%t(nzb_wall:nzt_wall+1,           &
6244                                                1:surf_usm_v(0)%ns) )
6245                   READ ( 13 )  tmp_wall_v(0)%t
6246                ENDIF
6247                CALL surface_restore_elements(                                 &
6248                                        t_wall_v_1(0)%t, tmp_wall_v(0)%t,      &
6249                                        surf_usm_v(0)%start_index,             & 
6250                                        start_index_on_file,                   &
6251                                        end_index_on_file,                     &
6252                                        nxlc, nysc,                            &
6253                                        nxlf, nxrf, nysf, nynf,                &
6254                                        nys_on_file, nyn_on_file,              &
6255                                        nxl_on_file,nxr_on_file )
6256#endif
6257             CASE ( 't_wall_v(1)' )
6258#if defined( __nopointer )
6259                IF ( k == 1 )  THEN
6260                   IF ( .NOT.  ALLOCATED( t_wall_v(1)%t ) )                    &
6261                      ALLOCATE( t_wall_v(1)%t(nzb_wall:nzt_wall+1,             &
6262                                              1:surf_usm_v(1)%ns) )
6263                   READ ( 13 )  tmp_wall_v(1)%t
6264                ENDIF
6265                CALL surface_restore_elements(                                 &
6266                                        t_wall_v(1)%t, tmp_wall_v(1)%t,        &
6267                                        surf_usm_v(1)%start_index,             & 
6268                                        start_index_on_file,                   &
6269                                        end_index_on_file ,                    &
6270                                        nxlc, nysc,                            &
6271                                        nys_on_file, nyn_on_file,              &
6272                                        nxl_on_file, nxr_on_file )
6273#else
6274                IF ( k == 1 )  THEN
6275                   IF ( .NOT.  ALLOCATED( t_wall_v_1(1)%t ) )                  &
6276                      ALLOCATE( t_wall_v_1(1)%t(nzb_wall:nzt_wall+1,           &
6277                                                1:surf_usm_v(1)%ns) )
6278                   READ ( 13 )  tmp_wall_v(1)%t
6279                ENDIF
6280                CALL surface_restore_elements(                                 &
6281                                        t_wall_v_1(1)%t, tmp_wall_v(1)%t,      &
6282                                        surf_usm_v(1)%start_index,             & 
6283                                        start_index_on_file,                   &
6284                                        end_index_on_file,                     &
6285                                        nxlc, nysc,                            &
6286                                        nxlf, nxrf, nysf, nynf,                &
6287                                        nys_on_file, nyn_on_file,              &
6288                                        nxl_on_file,nxr_on_file )
6289#endif
6290             CASE ( 't_wall_v(2)' )
6291#if defined( __nopointer )
6292                IF ( k == 1 )  THEN
6293                   IF ( .NOT.  ALLOCATED( t_wall_v(2)%t ) )                    &
6294                      ALLOCATE( t_wall_v(2)%t(nzb_wall:nzt_wall+1,             &
6295                                              1:surf_usm_v(2)%ns) )
6296                   READ ( 13 )  tmp_wall_v(2)%t
6297                ENDIF
6298                CALL surface_restore_elements(                                 &
6299                                        t_wall_v(2)%t, tmp_wall_v(2)%t,        &
6300                                        surf_usm_v(2)%start_index,             & 
6301                                        start_index_on_file,                   &
6302                                        end_index_on_file,                     &
6303                                        nxlc, nysc,                            &
6304                                        nxlf, nxrf, nysf, nynf,                &
6305                                        nys_on_file, nyn_on_file,              &
6306                                        nxl_on_file,nxr_on_file )
6307#else
6308                IF ( k == 1 )  THEN
6309                   IF ( .NOT.  ALLOCATED( t_wall_v_1(2)%t ) )                  &
6310                      ALLOCATE( t_wall_v_1(2)%t(nzb_wall:nzt_wall+1,           &
6311                                                1:surf_usm_v(2)%ns) )
6312                   READ ( 13 )  tmp_wall_v(2)%t
6313                ENDIF
6314                CALL surface_restore_elements(                                 &
6315                                        t_wall_v_1(2)%t, tmp_wall_v(2)%t,      &
6316                                        surf_usm_v(2)%start_index,             & 
6317                                        start_index_on_file,                   &
6318                                        end_index_on_file ,                    &
6319                                        nxlc, nysc,                            &
6320                                        nxlf, nxrf, nysf, nynf,                &
6321                                        nys_on_file, nyn_on_file,              &
6322                                        nxl_on_file,nxr_on_file )
6323#endif
6324             CASE ( 't_wall_v(3)' )
6325#if defined( __nopointer )
6326                IF ( k == 1 )  THEN
6327                   IF ( .NOT.  ALLOCATED( t_wall_v(3)%t ) )                    &
6328                      ALLOCATE( t_wall_v(3)%t(nzb_wall:nzt_wall+1,             &
6329                                              1:surf_usm_v(3)%ns) )
6330                   READ ( 13 )  tmp_wall_v(3)%t
6331                ENDIF
6332                CALL surface_restore_elements(                                 &
6333                                        t_wall_v(3)%t, tmp_wall_v(3)%t,        &
6334                                        surf_usm_v(3)%start_index,             &   
6335                                        start_index_on_file,                   &
6336                                        end_index_on_file,                     &
6337                                        nxlc, nysc,                            &
6338                                        nxlf, nxrf, nysf, nynf,                &
6339                                        nys_on_file, nyn_on_file,              &
6340                                        nxl_on_file,nxr_on_file )
6341#else
6342                IF ( k == 1 )  THEN
6343                   IF ( .NOT.  ALLOCATED( t_wall_v_1(3)%t ) )                  &
6344                      ALLOCATE( t_wall_v_1(3)%t(nzb_wall:nzt_wall+1,           &
6345                                                1:surf_usm_v(3)%ns) )
6346                   READ ( 13 )  tmp_wall_v(3)%t
6347                ENDIF
6348                CALL surface_restore_elements(                                 &
6349                                        t_wall_v_1(3)%t, tmp_wall_v(3)%t,      &
6350                                        surf_usm_v(3)%start_index,             &   
6351                                        start_index_on_file,                   &
6352                                        end_index_on_file,                     &
6353                                        nxlc, nysc,                            &
6354                                        nxlf, nxrf, nysf, nynf,                &
6355                                        nys_on_file, nyn_on_file,              &
6356                                        nxl_on_file,nxr_on_file )
6357#endif
6358             CASE ( 't_green_h' )
6359#if defined( __nopointer )
6360                IF ( k == 1 )  THEN
6361                   IF ( .NOT.  ALLOCATED( t_green_h ) )                        &
6362                      ALLOCATE( t_green_h(nzb_wall:nzt_wall+1,                 &
6363                                          1:surf_usm_h%ns) )
6364                   READ ( 13 )  tmp_green_h
6365                ENDIF
6366                CALL surface_restore_elements(                                 &
6367                                        t_green_h, tmp_green_h,                &
6368                                        surf_usm_h%start_index,                & 
6369                                        start_index_on_file,                   &
6370                                        end_index_on_file,                     &
6371                                        nxlc, nysc,                            &
6372                                        nxlf, nxrf, nysf, nynf,                &
6373                                        nys_on_file, nyn_on_file,              &
6374                                        nxl_on_file,nxr_on_file )
6375#else
6376                IF ( k == 1 )  THEN
6377                   IF ( .NOT.  ALLOCATED( t_green_h_1 ) )                      &
6378                      ALLOCATE( t_green_h_1(nzb_wall:nzt_wall+1,               &
6379                                            1:surf_usm_h%ns) )
6380                   READ ( 13 )  tmp_green_h
6381                ENDIF
6382                CALL surface_restore_elements(                                 &
6383                                        t_green_h_1, tmp_green_h,              &
6384                                        surf_usm_h%start_index,                & 
6385                                        start_index_on_file,                   &
6386                                        end_index_on_file,                     &
6387                                        nxlc, nysc,                            &
6388                                        nxlf, nxrf, nysf, nynf,                &
6389                                        nys_on_file, nyn_on_file,              &
6390                                        nxl_on_file,nxr_on_file )
6391#endif
6392             CASE ( 't_green_v(0)' )
6393#if defined( __nopointer )
6394                IF ( k == 1 )  THEN
6395                   IF ( .NOT.  ALLOCATED( t_green_v(0)%t ) )                   &
6396                      ALLOCATE( t_green_v(0)%t(nzb_wall:nzt_wall+1,            &
6397                                               1:surf_usm_v(0)%ns) )
6398                   READ ( 13 )  tmp_green_v(0)%t
6399                ENDIF
6400                CALL surface_restore_elements(                                 &
6401                                        t_green_v(0)%t, tmp_green_v(0)%t,      &
6402                                        surf_usm_v(0)%start_index,             & 
6403                                        start_index_on_file,                   &
6404                                        end_index_on_file,                     &
6405                                        nxlc, nysc,                            &
6406                                        nxlf, nxrf, nysf, nynf,                &
6407                                        nys_on_file, nyn_on_file,              &
6408                                        nxl_on_file,nxr_on_file )
6409#else
6410                IF ( k == 1 )  THEN
6411                   IF ( .NOT.  ALLOCATED( t_green_v_1(0)%t ) )                 &
6412                      ALLOCATE( t_green_v_1(0)%t(nzb_wall:nzt_wall+1,          &
6413                                                 1:surf_usm_v(0)%ns) )
6414                   READ ( 13 )  tmp_green_v(0)%t
6415                ENDIF
6416                CALL surface_restore_elements(                                 &
6417                                        t_green_v_1(0)%t, tmp_green_v(0)%t,    &
6418                                        surf_usm_v(0)%start_index,             & 
6419                                        start_index_on_file,                   &
6420                                        end_index_on_file,                     &
6421                                        nxlc, nysc,                            &
6422                                        nxlf, nxrf, nysf, nynf,                &
6423                                        nys_on_file, nyn_on_file,              &
6424                                        nxl_on_file,nxr_on_file )
6425#endif
6426             CASE ( 't_green_v(1)' )
6427#if defined( __nopointer )
6428                IF ( k == 1 )  THEN
6429                   IF ( .NOT.  ALLOCATED( t_green_v(1)%t ) )                   &
6430                      ALLOCATE( t_green_v(1)%t(nzb_wall:nzt_wall+1,            &
6431                                               1:surf_usm_v(1)%ns) )
6432                   READ ( 13 )  tmp_green_v(1)%t
6433                ENDIF
6434                CALL surface_restore_elements(                                 &
6435                                        t_green_v(1)%t, tmp_green_v(1)%t,      &
6436                                        surf_usm_v(1)%start_index,             & 
6437                                        start_index_on_file,                   &
6438                                        end_index_on_file ,                    &
6439                                        nxlc, nysc,                            &
6440                                        nys_on_file, nyn_on_file,              &
6441                                        nxl_on_file,nxr_on_file )
6442#else
6443                IF ( k == 1 )  THEN
6444                   IF ( .NOT.  ALLOCATED( t_green_v_1(1)%t ) )                 &
6445                      ALLOCATE( t_green_v_1(1)%t(nzb_wall:nzt_wall+1,          &
6446                                                 1:surf_usm_v(1)%ns) )
6447                   READ ( 13 )  tmp_green_v(1)%t
6448                ENDIF
6449                CALL surface_restore_elements(                                 &
6450                                        t_green_v_1(1)%t, tmp_green_v(1)%t,    &
6451                                        surf_usm_v(1)%start_index,             & 
6452                                        start_index_on_file,                   &
6453                                        end_index_on_file,                     &
6454                                        nxlc, nysc,                            &
6455                                        nxlf, nxrf, nysf, nynf,                &
6456                                        nys_on_file, nyn_on_file,              &
6457                                        nxl_on_file,nxr_on_file )
6458#endif
6459             CASE ( 't_green_v(2)' )
6460#if defined( __nopointer )
6461                IF ( k == 1 )  THEN
6462                   IF ( .NOT.  ALLOCATED( t_green_v(2)%t ) )                   &
6463                      ALLOCATE( t_green_v(2)%t(nzb_wall:nzt_wall+1,            &
6464                                               1:surf_usm_v(2)%ns) )
6465                   READ ( 13 )  tmp_green_v(2)%t
6466                ENDIF
6467                CALL surface_restore_elements(                                 &
6468                                        t_green_v(2)%t, tmp_green_v(2)%t,      &
6469                                        surf_usm_v(2)%start_index,             & 
6470                                        start_index_on_file,                   &
6471                                        end_index_on_file,                     &
6472                                        nxlc, nysc,                            &
6473                                        nxlf, nxrf, nysf, nynf,                &
6474                                        nys_on_file, nyn_on_file,              &
6475                                        nxl_on_file,nxr_on_file )
6476#else
6477                IF ( k == 1 )  THEN
6478                   IF ( .NOT.  ALLOCATED( t_green_v_1(2)%t ) )                 &
6479                      ALLOCATE( t_green_v_1(2)%t(nzb_wall:nzt_wall+1,          &
6480                                                 1:surf_usm_v(2)%ns) )
6481                   READ ( 13 )  tmp_green_v(2)%t
6482                ENDIF
6483                CALL surface_restore_elements(                                 &
6484                                        t_green_v_1(2)%t, tmp_green_v(2)%t,    &
6485                                        surf_usm_v(2)%start_index,             & 
6486                                        start_index_on_file,                   &
6487                                        end_index_on_file ,                    &
6488                                        nxlc, nysc,                            &
6489                                        nxlf, nxrf, nysf, nynf,                &
6490                                        nys_on_file, nyn_on_file,              &
6491                                        nxl_on_file,nxr_on_file )
6492#endif
6493             CASE ( 't_green_v(3)' )
6494#if defined( __nopointer )
6495                IF ( k == 1 )  THEN
6496                   IF ( .NOT.  ALLOCATED( t_green_v(3)%t ) )                   &
6497                      ALLOCATE( t_green_v(3)%t(nzb_wall:nzt_wall+1,            &
6498                                               1:surf_usm_v(3)%ns) )
6499                   READ ( 13 )  tmp_green_v(3)%t
6500                ENDIF
6501                CALL surface_restore_elements(                                 &
6502                                        t_green_v(3)%t, tmp_green_v(3)%t,      &
6503                                        surf_usm_v(3)%start_index,             & 
6504                                        start_index_on_file,                   &
6505                                        end_index_on_file,                     &
6506                                        nxlc, nysc,                            &
6507                                        nxlf, nxrf, nysf, nynf,                &
6508                                        nys_on_file, nyn_on_file,              &
6509                                        nxl_on_file,nxr_on_file )
6510#else
6511                IF ( k == 1 )  THEN
6512                   IF ( .NOT.  ALLOCATED( t_green_v_1(3)%t ) )                 &
6513                      ALLOCATE( t_green_v_1(3)%t(nzb_wall:nzt_wall+1,          &
6514                                                 1:surf_usm_v(3)%ns) )
6515                   READ ( 13 )  tmp_green_v(3)%t
6516                ENDIF
6517                CALL surface_restore_elements(                                 &
6518                                        t_green_v_1(3)%t, tmp_green_v(3)%t,    &
6519                                        surf_usm_v(3)%start_index,             & 
6520                                        start_index_on_file,                   &
6521                                        end_index_on_file,                     &
6522                                        nxlc, nysc,                            &
6523                                        nxlf, nxrf, nysf, nynf,                &
6524                                        nys_on_file, nyn_on_file,              &
6525                                        nxl_on_file,nxr_on_file )
6526#endif
6527             CASE ( 't_window_h' )
6528#if defined( __nopointer )
6529                IF ( k == 1 )  THEN
6530                   IF ( .NOT.  ALLOCATED( t_window_h ) )                       &
6531                      ALLOCATE( t_window_h(nzb_wall:nzt_wall+1,                &
6532                                           1:surf_usm_h%ns) )
6533                   READ ( 13 )  tmp_window_h
6534                ENDIF
6535                CALL surface_restore_elements(                                 &
6536                                        t_window_h, tmp_window_h,              &
6537                                        surf_usm_h%start_index,                & 
6538                                        start_index_on_file,                   &
6539                                        end_index_on_file,                     &
6540                                        nxlc, nysc,                            &
6541                                        nxlf, nxrf, nysf, nynf,                &
6542                                        nys_on_file, nyn_on_file,              &
6543                                        nxl_on_file,nxr_on_file )
6544#else
6545                IF ( k == 1 )  THEN
6546                   IF ( .NOT.  ALLOCATED( t_window_h_1 ) )                     &
6547                      ALLOCATE( t_window_h_1(nzb_wall:nzt_wall+1,              &
6548                                             1:surf_usm_h%ns) )
6549                   READ ( 13 )  tmp_window_h
6550                ENDIF
6551                CALL surface_restore_elements(                                 &
6552                                        t_window_h_1, tmp_window_h,            &
6553                                        surf_usm_h%start_index,                & 
6554                                        start_index_on_file,                   &
6555                                        end_index_on_file,                     &
6556                                        nxlc, nysc,                            &
6557                                        nxlf, nxrf, nysf, nynf,                &
6558                                        nys_on_file, nyn_on_file,              &
6559                                        nxl_on_file, nxr_on_file )
6560#endif
6561             CASE ( 't_window_v(0)' )
6562#if defined( __nopointer )
6563                IF ( k == 1 )  THEN
6564                   IF ( .NOT.  ALLOCATED( t_window_v(0)%t ) )                  &
6565                      ALLOCATE( t_window_v(0)%t(nzb_wall:nzt_wall+1,           &
6566                                                1:surf_usm_v(0)%ns) )
6567                   READ ( 13 )  tmp_window_v(0)%t
6568                ENDIF
6569                CALL surface_restore_elements(                                 &
6570                                        t_window_v(0)%t, tmp_window_v(0)%t,    &
6571                                        surf_usm_v(0)%start_index,             & 
6572                                        start_index_on_file,                   &
6573                                        end_index_on_file,                     &
6574                                        nxlc, nysc,                            &
6575                                        nxlf, nxrf, nysf, nynf,                &
6576                                        nys_on_file, nyn_on_file,              &
6577                                        nxl_on_file, nxr_on_file )
6578#else
6579                IF ( k == 1 )  THEN
6580                   IF ( .NOT.  ALLOCATED( t_window_v_1(0)%t ) )                &
6581                      ALLOCATE( t_window_v_1(0)%t(nzb_wall:nzt_wall+1,         &
6582                                                  1:surf_usm_v(0)%ns) )
6583                   READ ( 13 )  tmp_window_v(0)%t
6584                ENDIF
6585                CALL surface_restore_elements(                                 &
6586                                        t_window_v_1(0)%t,                     & 
6587                                        tmp_window_v(0)%t,                     &
6588                                        surf_usm_v(0)%start_index,             &
6589                                        start_index_on_file,                   &
6590                                        end_index_on_file,                     &
6591                                        nxlc, nysc,                            &
6592                                        nxlf, nxrf, nysf, nynf,                &
6593                                        nys_on_file, nyn_on_file,              &
6594                                        nxl_on_file,nxr_on_file )
6595#endif
6596             CASE ( 't_window_v(1)' )
6597#if defined( __nopointer )
6598                IF ( k == 1 )  THEN
6599                   IF ( .NOT.  ALLOCATED( t_window_v(1)%t ) )                  &
6600                      ALLOCATE( t_window_v(1)%t(nzb_wall:nzt_wall+1,           &
6601                                                1:surf_usm_v(1)%ns) )
6602                   READ ( 13 )  tmp_window_v(1)%t
6603                ENDIF
6604                CALL surface_restore_elements(                                 &
6605                                        t_window_v(1)%t, tmp_window_v(1)%t,    &
6606                                        surf_usm_v(1)%start_index,             & 
6607                                        start_index_on_file,                   &
6608                                        end_index_on_file ,                    &
6609                                        nxlc, nysc,                            &
6610                                        nys_on_file, nyn_on_file,              &
6611                                        nxl_on_file, nxr_on_file )
6612#else
6613                IF ( k == 1 )  THEN
6614                   IF ( .NOT.  ALLOCATED( t_window_v_1(1)%t ) )                &
6615                      ALLOCATE( t_window_v_1(1)%t(nzb_wall:nzt_wall+1,         &
6616                                                  1:surf_usm_v(1)%ns) )
6617                   READ ( 13 )  tmp_window_v(1)%t
6618                ENDIF
6619                CALL surface_restore_elements(                                 &
6620                                        t_window_v_1(1)%t,                     & 
6621                                        tmp_window_v(1)%t,                     &
6622                                        surf_usm_v(1)%start_index,             & 
6623                                        start_index_on_file,                   &
6624                                        end_index_on_file,                     &
6625                                        nxlc, nysc,                            &
6626                                        nxlf, nxrf, nysf, nynf,                &
6627                                        nys_on_file, nyn_on_file,              &
6628                                        nxl_on_file,nxr_on_file )
6629#endif
6630             CASE ( 't_window_v(2)' )
6631#if defined( __nopointer )
6632                IF ( k == 1 )  THEN
6633                   IF ( .NOT.  ALLOCATED( t_window_v(2)%t ) )                  &
6634                      ALLOCATE( t_window_v(2)%t(nzb_wall:nzt_wall+1,           &
6635                                                1:surf_usm_v(2)%ns) )
6636                   READ ( 13 )  tmp_window_v(2)%t
6637                ENDIF
6638                CALL surface_restore_elements(                                 &
6639                                        t_window_v(2)%t, tmp_window_v(2)%t,    &
6640                                        surf_usm_v(2)%start_index,             & 
6641                                        start_index_on_file,                   &
6642                                        end_index_on_file,                     &
6643                                        nxlc, nysc,                            &
6644                                        nxlf, nxrf, nysf, nynf,                &
6645                                        nys_on_file, nyn_on_file,              &
6646                                        nxl_on_file,nxr_on_file )
6647#else
6648                IF ( k == 1 )  THEN
6649                   IF ( .NOT.  ALLOCATED( t_window_v_1(2)%t ) )                &
6650                      ALLOCATE( t_window_v_1(2)%t(nzb_wall:nzt_wall+1,         &
6651                                                  1:surf_usm_v(2)%ns) )
6652                   READ ( 13 )  tmp_window_v(2)%t
6653                ENDIF
6654                CALL surface_restore_elements(                                 &
6655                                        t_window_v_1(2)%t,                     & 
6656                                        tmp_window_v(2)%t,                     &
6657                                        surf_usm_v(2)%start_index,             & 
6658                                        start_index_on_file,                   &
6659                                        end_index_on_file ,                    &
6660                                        nxlc, nysc,                            &
6661                                        nxlf, nxrf, nysf, nynf,                &
6662                                        nys_on_file, nyn_on_file,              &
6663                                        nxl_on_file,nxr_on_file )
6664#endif
6665             CASE ( 't_window_v(3)' )
6666#if defined( __nopointer )
6667                IF ( k == 1 )  THEN
6668                   IF ( .NOT.  ALLOCATED( t_window_v(3)%t ) )                  &
6669                      ALLOCATE( t_window_v(3)%t(nzb_wall:nzt_wall+1,           &
6670                                                1:surf_usm_v(3)%ns) )
6671                   READ ( 13 )  tmp_window_v(3)%t
6672                ENDIF
6673                CALL surface_restore_elements(                                 &
6674                                        t_window_v(3)%t, tmp_window_v(3)%t,    &
6675                                        surf_usm_v(3)%start_index,             & 
6676                                        start_index_on_file,                   &
6677                                        end_index_on_file,                     &
6678                                        nxlc, nysc,                            &
6679                                        nxlf, nxrf, nysf, nynf,                &
6680                                        nys_on_file, nyn_on_file,              &
6681                                        nxl_on_file,nxr_on_file )
6682#else
6683                IF ( k == 1 )  THEN
6684                   IF ( .NOT.  ALLOCATED( t_window_v_1(3)%t ) )                &
6685                      ALLOCATE( t_window_v_1(3)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(3)%ns) )
6686                   READ ( 13 )  tmp_window_v(3)%t
6687                ENDIF
6688                CALL surface_restore_elements(                                 &
6689                                        t_window_v_1(3)%t,                     & 
6690                                        tmp_window_v(3)%t,                     &
6691                                        surf_usm_v(3)%start_index,             & 
6692                                        start_index_on_file,                   &
6693                                        end_index_on_file,                     &
6694                                        nxlc, nysc,                            &
6695                                        nxlf, nxrf, nysf, nynf,                &
6696                                        nys_on_file, nyn_on_file,              &
6697                                        nxl_on_file,nxr_on_file )
6698#endif
6699             CASE DEFAULT
6700
6701                   found = .FALSE.
6702
6703          END SELECT
6704
6705       
6706    END SUBROUTINE usm_rrd_local
6707   
6708
6709   
6710!------------------------------------------------------------------------------!
6711! Description:
6712! ------------
6713!
6714!> This subroutine reads walls, roofs and land categories and it parameters
6715!> from input files.
6716!------------------------------------------------------------------------------!
6717    SUBROUTINE usm_read_urban_surface_types
6718   
6719        USE netcdf_data_input_mod,                                             &
6720            ONLY:  building_pars_f, building_type_f
6721
6722        IMPLICIT NONE
6723
6724        CHARACTER(12)                                         :: wtn
6725        INTEGER(iwp)                                          :: wtc
6726        REAL(wp), DIMENSION(n_surface_params)                 :: wtp
6727   
6728        INTEGER(iwp), DIMENSION(0:17, nysg:nyng, nxlg:nxrg)   :: usm_par
6729        REAL(wp), DIMENSION(1:14, nysg:nyng, nxlg:nxrg)       :: usm_val
6730        INTEGER(iwp)                                          :: k, l, d, iw, jw, kw, it, ip, ii, ij, m
6731        INTEGER(iwp)                                          :: i, j
6732        INTEGER(iwp)                                          :: nz, roof, dirwe, dirsn
6733        INTEGER(iwp)                                          :: category
6734        INTEGER(iwp)                                          :: weheight1, wecat1, snheight1, sncat1
6735        INTEGER(iwp)                                          :: weheight2, wecat2, snheight2, sncat2
6736        INTEGER(iwp)                                          :: weheight3, wecat3, snheight3, sncat3
6737        REAL(wp)                                              :: height, albedo, thick
6738        REAL(wp)                                              :: wealbedo1, wethick1, snalbedo1, snthick1
6739        REAL(wp)                                              :: wealbedo2, wethick2, snalbedo2, snthick2
6740        REAL(wp)                                              :: wealbedo3, wethick3, snalbedo3, snthick3
6741       
6742        LOGICAL                                               ::  surfpar
6743        LOGICAL                                               ::  urbsurf
6744
6745!
6746!--     If building_pars or building_type are already read from static input
6747!--     file, skip reading ASCII file.
6748        IF ( building_type_f%from_file  .OR.  building_pars_f%from_file )      &
6749           RETURN
6750
6751!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
6752!--     read categories of walls and their parameters
6753!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
6754        DO  ii = 0, io_blocks-1
6755            IF ( ii == io_group )  THEN
6756
6757!--             open urban surface file
6758                OPEN( 151, file='SURFACE_PARAMETERS'//coupling_char, action='read', &
6759                           status='old', form='formatted', err=15 ) 
6760!--             first test and get n_surface_types
6761                k = 0
6762                l = 0
6763                DO
6764                    l = l+1
6765                    READ( 151, *, err=11, end=12 )  wtc, wtp, wtn
6766                    k = k+1
6767                    CYCLE
6768 11                 CONTINUE
6769                ENDDO
6770 12             n_surface_types = k
6771                ALLOCATE( surface_type_names(n_surface_types) )
6772                ALLOCATE( surface_type_codes(n_surface_types) )
6773                ALLOCATE( surface_params(n_surface_params, n_surface_types) )
6774!--             real reading
6775                rewind( 151 )
6776                k = 0
6777                DO
6778                    READ( 151, *, err=13, end=14 )  wtc, wtp, wtn
6779                    k = k+1
6780                    surface_type_codes(k) = wtc
6781                    surface_params(:,k) = wtp
6782                    surface_type_names(k) = wtn
6783                    CYCLE
678413                  WRITE(6,'(i3,a,2i5)') myid, 'readparams2 error k=', k
6785                    FLUSH(6)
6786                    CONTINUE
6787                ENDDO
6788 14             CLOSE(151)
6789                CYCLE
6790 15             message_string = 'file SURFACE_PARAMETERS'//TRIM(coupling_char)//' does not exist'
6791                CALL message( 'usm_read_urban_surface_types', 'PA0513', 1, 2, 0, 6, 0 )
6792            ENDIF
6793        ENDDO
6794   
6795!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
6796!--     read types of surfaces
6797!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
6798        usm_par = 0
6799        DO  ii = 0, io_blocks-1
6800            IF ( ii == io_group )  THEN
6801
6802                !
6803!--             open csv urban surface file
6804                OPEN( 151, file='URBAN_SURFACE'//TRIM(coupling_char), action='read', &
6805                      status='old', form='formatted', err=23 )
6806               
6807                l = 0
6808                DO
6809                    l = l+1
6810!--                 i, j, height, nz, roof, dirwe, dirsn, category, soilcat,
6811!--                 weheight1, wecat1, snheight1, sncat1, weheight2, wecat2, snheight2, sncat2,
6812!--                 weheight3, wecat3, snheight3, sncat3
6813                    READ( 151, *, err=21, end=25 )  i, j, height, nz, roof, dirwe, dirsn,            &
6814                                            category, albedo, thick,                                 &
6815                                            weheight1, wecat1, wealbedo1, wethick1,                  &
6816                                            weheight2, wecat2, wealbedo2, wethick2,                  &
6817                                            weheight3, wecat3, wealbedo3, wethick3,                  &
6818                                            snheight1, sncat1, snalbedo1, snthick1,                  &
6819                                            snheight2, sncat2, snalbedo2, snthick2,                  &
6820                                            snheight3, sncat3, snalbedo3, snthick3
6821
6822                    IF ( i >= nxlg  .AND.  i <= nxrg  .AND.  j >= nysg  .AND.  j <= nyng )  THEN
6823!--                     write integer variables into array
6824                        usm_par(:,j,i) = (/1, nz, roof, dirwe, dirsn, category,                      &
6825                                          weheight1, wecat1, weheight2, wecat2, weheight3, wecat3,   &
6826                                          snheight1, sncat1, snheight2, sncat2, snheight3, sncat3 /)
6827!--                     write real values into array
6828                        usm_val(:,j,i) = (/ albedo, thick,                                           &
6829                                           wealbedo1, wethick1, wealbedo2, wethick2,                 &
6830                                           wealbedo3, wethick3, snalbedo1, snthick1,                 &
6831                                           snalbedo2, snthick2, snalbedo3, snthick3 /)
6832                    ENDIF
6833                    CYCLE
6834 21                 WRITE (message_string, "(A,I5)") 'errors in file URBAN_SURFACE'//TRIM(coupling_char)//' on line ', l
6835                    CALL message( 'usm_read_urban_surface_types', 'PA0512', 0, 1, 0, 6, 0 )
6836                ENDDO
6837         
6838 23             message_string = 'file URBAN_SURFACE'//TRIM(coupling_char)//' does not exist'
6839                CALL message( 'usm_read_urban_surface_types', 'PA0514', 1, 2, 0, 6, 0 )
6840
6841 25             CLOSE( 151 )
6842
6843            ENDIF
6844#if defined( __parallel )
6845            CALL MPI_BARRIER( comm2d, ierr )
6846#endif
6847        ENDDO
6848       
6849!
6850!--     check completeness and formal correctness of the data
6851        DO i = nxlg, nxrg
6852            DO j = nysg, nyng
6853                IF ( usm_par(0,j,i) /= 0  .AND.  (        &  !< incomplete data,supply default values later
6854                     usm_par(1,j,i) < nzb  .OR.           &
6855                     usm_par(1,j,i) > nzt  .OR.           &  !< incorrect height (nz < nzb  .OR.  nz > nzt)
6856                     usm_par(2,j,i) < 0  .OR.             &
6857                     usm_par(2,j,i) > 1  .OR.             &  !< incorrect roof sign
6858                     usm_par(3,j,i) < nzb-nzt  .OR.       & 
6859                     usm_par(3,j,i) > nzt-nzb  .OR.       &  !< incorrect west-east wall direction sign
6860                     usm_par(4,j,i) < nzb-nzt  .OR.       &
6861                     usm_par(4,j,i) > nzt-nzb  .OR.       &  !< incorrect south-north wall direction sign
6862                     usm_par(6,j,i) < nzb  .OR.           & 
6863                     usm_par(6,j,i) > nzt  .OR.           &  !< incorrect pedestrian level height for west-east wall
6864                     usm_par(8,j,i) > nzt  .OR.           &
6865                     usm_par(10,j,i) > nzt  .OR.          &  !< incorrect wall or roof level height for west-east wall
6866                     usm_par(12,j,i) < nzb  .OR.          & 
6867                     usm_par(12,j,i) > nzt  .OR.          &  !< incorrect pedestrian level height for south-north wall
6868                     usm_par(14,j,i) > nzt  .OR.          &
6869                     usm_par(16,j,i) > nzt                &  !< incorrect wall or roof level height for south-north wall
6870                    ) )  THEN
6871!--                 incorrect input data
6872                    WRITE (message_string, "(A,2I5)") 'missing or incorrect data in file URBAN_SURFACE'// &
6873                                                       TRIM(coupling_char)//' for i,j=', i,j
6874                    CALL message( 'usm_read_urban_surface', 'PA0504', 1, 2, 0, 6, 0 )
6875                ENDIF
6876               
6877            ENDDO
6878        ENDDO
6879!       
6880!--     Assign the surface types to the respective data type.
6881!--     First, for horizontal upward-facing surfaces.
6882        DO  m = 1, surf_usm_h%ns
6883           iw = surf_usm_h%i(m)
6884           jw = surf_usm_h%j(m)
6885           kw = surf_usm_h%k(m)
6886
6887           IF ( usm_par(5,jw,iw) == 0 )  THEN
6888#if ! defined( __nopointer )
6889              IF ( zu(kw) >= roof_height_limit )  THEN
6890                 surf_usm_h%isroof_surf(m)   = .TRUE.
6891                 surf_usm_h%surface_types(m) = roof_category         !< default category for root surface
6892              ELSE
6893                 surf_usm_h%isroof_surf(m)   = .FALSE.
6894                 surf_usm_h%surface_types(m) = land_category         !< default category for land surface
6895              ENDIF
6896#endif
6897              surf_usm_h%albedo(:,m)    = -1.0_wp
6898              surf_usm_h%thickness_wall(m) = -1.0_wp
6899              surf_usm_h%thickness_green(m) = -1.0_wp
6900              surf_usm_h%thickness_window(m) = -1.0_wp
6901           ELSE
6902              IF ( usm_par(2,jw,iw)==0 )  THEN
6903                 surf_usm_h%isroof_surf(m)    = .FALSE.
6904                 surf_usm_h%thickness_wall(m) = -1.0_wp
6905                 surf_usm_h%thickness_window(m) = -1.0_wp
6906                 surf_usm_h%thickness_green(m)  = -1.0_wp
6907              ELSE
6908                 surf_usm_h%isroof_surf(m)    = .TRUE.
6909                 surf_usm_h%thickness_wall(m) = usm_val(2,jw,iw)
6910                 surf_usm_h%thickness_window(m) = usm_val(2,jw,iw)
6911                 surf_usm_h%thickness_green(m)  = usm_val(2,jw,iw)
6912              ENDIF
6913              surf_usm_h%surface_types(m) = usm_par(5,jw,iw)
6914              surf_usm_h%albedo(:,m)   = usm_val(1,jw,iw)
6915              surf_usm_h%transmissivity(m)    = 0.0_wp
6916           ENDIF
6917!
6918!--        Find the type position
6919           it = surf_usm_h%surface_types(m)
6920           ip = -99999
6921           DO k = 1, n_surface_types
6922              IF ( surface_type_codes(k) == it )  THEN
6923                 ip = k
6924                 EXIT
6925              ENDIF
6926           ENDDO
6927           IF ( ip == -99999 )  THEN
6928!--           wall category not found
6929              WRITE (message_string, "(A,I5,A,3I5)") 'wall category ', it,     &
6930                                     ' not found  for i,j,k=', iw,jw,kw
6931              CALL message( 'usm_read_urban_surface', 'PA0506', 1, 2, 0, 6, 0 )
6932           ENDIF
6933!
6934!--        Albedo
6935           IF ( surf_usm_h%albedo(ind_veg_wall,m) < 0.0_wp )  THEN
6936              surf_usm_h%albedo(:,m) = surface_params(ialbedo,ip)
6937           ENDIF
6938!--        Albedo type is 0 (custom), others are replaced later
6939           surf_usm_h%albedo_type(:,m) = 0
6940!--        Transmissivity
6941           IF ( surf_usm_h%transmissivity(m) < 0.0_wp )  THEN
6942              surf_usm_h%transmissivity(m) = 0.0_wp
6943           ENDIF
6944!
6945!--        emissivity of the wall
6946           surf_usm_h%emissivity(:,m) = surface_params(iemiss,ip)
6947!           
6948!--        heat conductivity λS between air and wall ( W m−2 K−1 )
6949           surf_usm_h%lambda_surf(m) = surface_params(ilambdas,ip)
6950           surf_usm_h%lambda_surf_window(m) = surface_params(ilambdas,ip)
6951           surf_usm_h%lambda_surf_green(m)  = surface_params(ilambdas,ip)
6952!           
6953!--        roughness length for momentum, heat and humidity
6954           surf_usm_h%z0(m) = surface_params(irough,ip)
6955           surf_usm_h%z0h(m) = surface_params(iroughh,ip)
6956           surf_usm_h%z0q(m) = surface_params(iroughh,ip)
6957!
6958!--        Surface skin layer heat capacity (J m−2 K−1 )
6959           surf_usm_h%c_surface(m) = surface_params(icsurf,ip)
6960           surf_usm_h%c_surface_window(m) = surface_params(icsurf,ip)
6961           surf_usm_h%c_surface_green(m)  = surface_params(icsurf,ip)
6962!           
6963!--        wall material parameters:
6964!--        thickness of the wall (m)
6965!--        missing values are replaced by default value for category
6966           IF ( surf_usm_h%thickness_wall(m) <= 0.001_wp )  THEN
6967                surf_usm_h%thickness_wall(m) = surface_params(ithick,ip)
6968           ENDIF
6969           IF ( surf_usm_h%thickness_window(m) <= 0.001_wp )  THEN
6970                surf_usm_h%thickness_window(m) = surface_params(ithick,ip)
6971           ENDIF
6972           IF ( surf_usm_h%thickness_green(m) <= 0.001_wp )  THEN
6973                surf_usm_h%thickness_green(m) = surface_params(ithick,ip)
6974           ENDIF
6975!           
6976!--        volumetric heat capacity rho*C of the wall ( J m−3 K−1 )
6977           surf_usm_h%rho_c_wall(:,m) = surface_params(irhoC,ip)
6978           surf_usm_h%rho_c_window(:,m) = surface_params(irhoC,ip)
6979           surf_usm_h%rho_c_green(:,m)  = surface_params(irhoC,ip)
6980!           
6981!--        thermal conductivity λH of the wall (W m−1 K−1 )
6982           surf_usm_h%lambda_h(:,m) = surface_params(ilambdah,ip)
6983           surf_usm_h%lambda_h_window(:,m) = surface_params(ilambdah,ip)
6984           surf_usm_h%lambda_h_green(:,m)  = surface_params(ilambdah,ip)
6985
6986        ENDDO
6987!
6988!--     For vertical surface elements ( 0 -- northward-facing, 1 -- southward-facing,
6989!--     2 -- eastward-facing, 3 -- westward-facing )
6990        DO  l = 0, 3
6991           DO  m = 1, surf_usm_v(l)%ns
6992              i  = surf_usm_v(l)%i(m)
6993              j  = surf_usm_v(l)%j(m)
6994              kw = surf_usm_v(l)%k(m)
6995             
6996              IF ( l == 3 )  THEN ! westward facing
6997                 iw = i
6998                 jw = j
6999                 ii = 6
7000                 ij = 3
7001              ELSEIF ( l == 2 )  THEN
7002                 iw = i-1
7003                 jw = j
7004                 ii = 6
7005                 ij = 3
7006              ELSEIF ( l == 1 )  THEN
7007                 iw = i
7008                 jw = j
7009                 ii = 12
7010                 ij = 9
7011              ELSEIF ( l == 0 )  THEN
7012                 iw = i
7013                 jw = j-1
7014                 ii = 12
7015                 ij = 9
7016              ENDIF
7017
7018              IF ( iw < 0 .OR. jw < 0 ) THEN
7019!--              wall on west or south border of the domain - assign default category
7020                 IF ( kw <= roof_height_limit ) THEN
7021                     surf_usm_v(l)%surface_types(m) = wall_category   !< default category for wall surface in wall zone
7022                 ELSE
7023                     surf_usm_v(l)%surface_types(m) = roof_category   !< default category for wall surface in roof zone
7024                 END IF
7025                 surf_usm_v(l)%albedo(:,m)    = -1.0_wp
7026                 surf_usm_v(l)%thickness_wall(m) = -1.0_wp
7027              ELSE IF ( kw <= usm_par(ii,jw,iw) )  THEN
7028!--                 pedestrian zone
7029                 IF ( usm_par(ii+1,jw,iw) == 0 )  THEN
7030                     surf_usm_v(l)%surface_types(m)  = pedestrian_category   !< default category for wall surface in pedestrian zone
7031                     surf_usm_v(l)%albedo(:,m)    = -1.0_wp
7032                     surf_usm_v(l)%thickness_wall(m) = -1.0_wp
7033                     surf_usm_v(l)%thickness_window(m)   = -1.0_wp
7034                     surf_usm_v(l)%thickness_green(m)    = -1.0_wp
7035                     surf_usm_v(l)%transmissivity(m)  = -1.0_wp
7036                 ELSE
7037                     surf_usm_v(l)%surface_types(m)  = usm_par(ii+1,jw,iw)
7038                     surf_usm_v(l)%albedo(:,m)    = usm_val(ij,jw,iw)
7039                     surf_usm_v(l)%thickness_wall(m) = usm_val(ij+1,jw,iw)
7040                     surf_usm_v(l)%thickness_window(m)   = usm_val(ij+1,jw,iw)
7041                     surf_usm_v(l)%thickness_green(m)    = usm_val(ij+1,jw,iw)
7042                     surf_usm_v(l)%transmissivity(m)  = 0.0_wp
7043                 ENDIF
7044              ELSE IF ( kw <= usm_par(ii+2,jw,iw) )  THEN
7045!--              wall zone
7046                 IF ( usm_par(ii+3,jw,iw) == 0 )  THEN
7047                     surf_usm_v(l)%surface_types(m)  = wall_category         !< default category for wall surface
7048                     surf_usm_v(l)%albedo(:,m)    = -1.0_wp
7049                     surf_usm_v(l)%thickness_wall(m) = -1.0_wp
7050                     surf_usm_v(l)%thickness_window(m)   = -1.0_wp
7051                     surf_usm_v(l)%thickness_green(m)    = -1.0_wp
7052                     surf_usm_v(l)%transmissivity(m)  = -1.0_wp
7053                 ELSE
7054                     surf_usm_v(l)%surface_types(m)  = usm_par(ii+3,jw,iw)
7055                     surf_usm_v(l)%albedo(:,m)    = usm_val(ij+2,jw,iw)
7056                     surf_usm_v(l)%thickness_wall(m) = usm_val(ij+3,jw,iw)
7057                     surf_usm_v(l)%thickness_window(m)   = usm_val(ij+3,jw,iw)
7058                     surf_usm_v(l)%thickness_green(m)    = usm_val(ij+3,jw,iw)
7059                     surf_usm_v(l)%transmissivity(m)  = 0.0_wp
7060                 ENDIF
7061              ELSE IF ( kw <= usm_par(ii+4,jw,iw) )  THEN
7062!--              roof zone
7063                 IF ( usm_par(ii+5,jw,iw) == 0 )  THEN
7064                     surf_usm_v(l)%surface_types(m)  = roof_category         !< default category for roof surface
7065                     surf_usm_v(l)%albedo(:,m)    = -1.0_wp
7066                     surf_usm_v(l)%thickness_wall(m) = -1.0_wp
7067                     surf_usm_v(l)%thickness_window(m)   = -1.0_wp
7068                     surf_usm_v(l)%thickness_green(m)    = -1.0_wp
7069                     surf_usm_v(l)%transmissivity(m)  = -1.0_wp
7070                 ELSE
7071                     surf_usm_v(l)%surface_types(m)  = usm_par(ii+5,jw,iw)
7072                     surf_usm_v(l)%albedo(:,m)    = usm_val(ij+4,jw,iw)
7073                     surf_usm_v(l)%thickness_wall(m) = usm_val(ij+5,jw,iw)
7074                     surf_usm_v(l)%thickness_window(m)   = usm_val(ij+5,jw,iw)
7075                     surf_usm_v(l)%thickness_green(m)    = usm_val(ij+5,jw,iw)
7076                     surf_usm_v(l)%transmissivity(m)  = 0.0_wp
7077                 ENDIF
7078              ELSE
7079!
7080!--              supply the default category
7081                 IF ( kw <= roof_height_limit ) THEN
7082                     surf_usm_v(l)%surface_types(m) = wall_category   !< default category for wall surface in wall zone
7083                 ELSE
7084                     surf_usm_v(l)%surface_types(m) = roof_category   !< default category for wall surface in roof zone
7085                 END IF
7086                 surf_usm_v(l)%albedo(:,m)    = -1.0_wp
7087                 surf_usm_v(l)%thickness_wall(m) = -1.0_wp
7088              ENDIF
7089!
7090!--           Find the type position
7091              it = surf_usm_v(l)%surface_types(m)
7092              ip = -99999
7093              DO k = 1, n_surface_types
7094                 IF ( surface_type_codes(k) == it )  THEN
7095                    ip = k
7096                    EXIT
7097                 ENDIF
7098              ENDDO
7099              IF ( ip == -99999 )  THEN
7100!--              wall category not found
7101                 WRITE (message_string, "(A,I7,A,3I5)") 'wall category ', it,  &
7102                                        ' not found  for i,j,k=', iw,jw,kw
7103                 WRITE(9,*) message_string
7104              ENDIF
7105!
7106!--           Albedo
7107              IF ( surf_usm_v(l)%albedo(ind_veg_wall,m) < 0.0_wp )  THEN
7108                 surf_usm_v(l)%albedo(:,m) = surface_params(ialbedo,ip)
7109              ENDIF
7110!--           Albedo type is 0 (custom), others are replaced later
7111              surf_usm_v(l)%albedo_type(:,m) = 0
7112!--           Transmissivity of the windows
7113              IF ( surf_usm_v(l)%transmissivity(m) < 0.0_wp )  THEN
7114                 surf_usm_v(l)%transmissivity(m) = 0.0_wp
7115              ENDIF
7116!
7117!--           emissivity of the wall
7118              surf_usm_v(l)%emissivity(:,m) = surface_params(iemiss,ip)
7119!           
7120!--           heat conductivity lambda S between air and wall ( W m-2 K-1 )
7121              surf_usm_v(l)%lambda_surf(m) = surface_params(ilambdas,ip)
7122              surf_usm_v(l)%lambda_surf_window(m) = surface_params(ilambdas,ip)
7123              surf_usm_v(l)%lambda_surf_green(m) = surface_params(ilambdas,ip)
7124!           
7125!--           roughness length
7126              surf_usm_v(l)%z0(m) = surface_params(irough,ip)
7127              surf_usm_v(l)%z0h(m) = surface_params(iroughh,ip)
7128              surf_usm_v(l)%z0q(m) = surface_params(iroughh,ip)
7129!           
7130!--           Surface skin layer heat capacity (J m-2 K-1 )
7131              surf_usm_v(l)%c_surface(m) = surface_params(icsurf,ip)
7132              surf_usm_v(l)%c_surface_window(m) = surface_params(icsurf,ip)
7133              surf_usm_v(l)%c_surface_green(m) = surface_params(icsurf,ip)
7134!           
7135!--           wall material parameters:
7136!--           thickness of the wall (m)
7137!--           missing values are replaced by default value for category
7138              IF ( surf_usm_v(l)%thickness_wall(m) <= 0.001_wp )  THEN
7139                   surf_usm_v(l)%thickness_wall(m) = surface_params(ithick,ip)
7140              ENDIF
7141              IF ( surf_usm_v(l)%thickness_window(m) <= 0.001_wp )  THEN
7142                   surf_usm_v(l)%thickness_window(m) = surface_params(ithick,ip)
7143              ENDIF
7144              IF ( surf_usm_v(l)%thickness_green(m) <= 0.001_wp )  THEN
7145                   surf_usm_v(l)%thickness_green(m) = surface_params(ithick,ip)
7146              ENDIF
7147!
7148!--           volumetric heat capacity rho*C of the wall ( J m-3 K-1 )
7149              surf_usm_v(l)%rho_c_wall(:,m) = surface_params(irhoC,ip)
7150              surf_usm_v(l)%rho_c_window(:,m) = surface_params(irhoC,ip)
7151              surf_usm_v(l)%rho_c_green(:,m) = surface_params(irhoC,ip)
7152!           
7153!--           thermal conductivity lambda H of the wall (W m-1 K-1 )
7154              surf_usm_v(l)%lambda_h(:,m) = surface_params(ilambdah,ip)
7155              surf_usm_v(l)%lambda_h_window(:,m) = surface_params(ilambdah,ip)
7156              surf_usm_v(l)%lambda_h_green(:,m) = surface_params(ilambdah,ip)
7157
7158           ENDDO
7159        ENDDO 
7160!
7161!--     Initialize wall layer thicknesses. Please note, this will be removed
7162!--     after migration to Palm input data standard. 
7163        DO k = nzb_wall, nzt_wall
7164           zwn(k) = zwn_default(k)
7165           zwn_green(k) = zwn_default_green(k)
7166           zwn_window(k) = zwn_default_window(k)
7167        ENDDO
7168!
7169!--     apply for all particular surface grids. First for horizontal surfaces
7170        DO  m = 1, surf_usm_h%ns
7171           surf_usm_h%zw(:,m) = zwn(:) * surf_usm_h%thickness_wall(m)
7172           surf_usm_h%zw_green(:,m) = zwn_green(:) * surf_usm_h%thickness_green(m)
7173           surf_usm_h%zw_window(:,m) = zwn_window(:) * surf_usm_h%thickness_window(m)
7174        ENDDO
7175        DO  l = 0, 3
7176           DO  m = 1, surf_usm_v(l)%ns
7177              surf_usm_v(l)%zw(:,m) = zwn(:) * surf_usm_v(l)%thickness_wall(m)
7178              surf_usm_v(l)%zw_green(:,m) = zwn_green(:) * surf_usm_v(l)%thickness_green(m)
7179              surf_usm_v(l)%zw_window(:,m) = zwn_window(:) * surf_usm_v(l)%thickness_window(m)
7180           ENDDO
7181        ENDDO
7182
7183        CALL location_message( '    types and parameters of urban surfaces read', .TRUE. )
7184   
7185    END SUBROUTINE usm_read_urban_surface_types
7186
7187
7188!------------------------------------------------------------------------------!
7189! Description:
7190! ------------
7191!
7192!> This function advances through the list of local surfaces to find given
7193!> x, y, d, z coordinates
7194!------------------------------------------------------------------------------!
7195    PURE FUNCTION advance_surface(isurfl_start, isurfl_stop, x, y, z, d) &
7196            result(isurfl)
7197
7198        INTEGER(iwp), INTENT(in)                :: isurfl_start, isurfl_stop
7199        INTEGER(iwp), INTENT(in)                :: x, y, z, d
7200        INTEGER(iwp)                            :: isx, isy, isz, isd
7201        INTEGER(iwp)                            :: isurfl
7202
7203        DO isurfl = isurfl_start, isurfl_stop
7204            isx = surfl(ix, isurfl)
7205            isy = surfl(iy, isurfl)
7206            isz = surfl(iz, isurfl)
7207            isd = surfl(id, isurfl)
7208            IF ( isx==x .and. isy==y .and. isz==z .and. isd==d )  RETURN
7209        ENDDO
7210
7211!--     coordinate not found
7212        isurfl = -1
7213
7214    END FUNCTION
7215
7216
7217!------------------------------------------------------------------------------!
7218! Description:
7219! ------------
7220!
7221!> This subroutine reads temperatures of respective material layers in walls,
7222!> roofs and ground from input files. Data in the input file must be in
7223!> standard order, i.e. horizontal surfaces first ordered by x, y and then
7224!> vertical surfaces ordered by x, y, direction, z
7225!------------------------------------------------------------------------------!
7226    SUBROUTINE usm_read_wall_temperature
7227
7228        INTEGER(iwp)                                          :: i, j, k, d, ii, iline
7229        INTEGER(iwp)                                          :: isurfl
7230        REAL(wp)                                              :: rtsurf
7231        REAL(wp), DIMENSION(nzb_wall:nzt_wall+1)              :: rtwall
7232
7233
7234
7235
7236        DO  ii = 0, io_blocks-1
7237            IF ( ii == io_group )  THEN
7238
7239!--             open wall temperature file
7240                OPEN( 152, file='WALL_TEMPERATURE'//coupling_char, action='read', &
7241                           status='old', form='formatted', err=15 )
7242
7243                isurfl = 0
7244                iline = 1
7245                DO
7246                    rtwall = -9999.0_wp  !< for incomplete lines
7247                    READ( 152, *, err=13, end=14 )  i, j, k, d, rtsurf, rtwall
7248
7249                    IF ( nxl <= i .and. i <= nxr .and. &
7250                        nys <= j .and. j <= nyn)  THEN  !< local processor
7251!--                     identify surface id
7252                        isurfl = advance_surface(isurfl+1, nsurfl, i, j, k, d)
7253                        IF ( isurfl == -1 )  THEN
7254                            WRITE(message_string, '(a,4i5,a,i5,a)') 'Coordinates (xyzd) ', i, j, k, d, &
7255                                ' on line ', iline, &
7256                                ' in file WALL_TEMPERATURE are either not present or out of standard order of surfaces.'
7257                            CALL message( 'usm_read_wall_temperature', 'PA0521', 1, 2, 0, 6, 0 )
7258                        ENDIF
7259
7260!--                     assign temperatures
7261                        IF ( d == 0 ) THEN
7262                           t_surf_h(isurfl) = rtsurf
7263                           t_wall_h(:,isurfl) = rtwall(:)
7264                        ELSE
7265                           t_surf_v(d-1)%t(isurfl) = rtsurf
7266                           t_wall_v(d-1)%t(:,isurfl) = rtwall(:)
7267                        ENDIF
7268                    ENDIF
7269
7270                    iline = iline + 1
7271                    CYCLE
7272 13                 WRITE(message_string, '(a,i5,a)') 'Error reading line ', iline, &
7273                        ' in file WALL_TEMPERATURE.'
7274                    CALL message( 'usm_read_wall_temperature', 'PA0522', 1, 2, 0, 6, 0 )
7275                ENDDO
7276 14             CLOSE(152)
7277                CYCLE
7278 15             message_string = 'file WALL_TEMPERATURE'//TRIM(coupling_char)//' does not exist'
7279                CALL message( 'usm_read_wall_temperature', 'PA0523', 1, 2, 0, 6, 0 )
7280            ENDIF
7281#if defined( __parallel )
7282            CALL MPI_BARRIER( comm2d, ierr )
7283#endif
7284        ENDDO
7285
7286        CALL location_message( '    wall layer temperatures read', .TRUE. )
7287
7288    END SUBROUTINE usm_read_wall_temperature
7289
7290
7291
7292!------------------------------------------------------------------------------!
7293! Description:
7294! ------------
7295!> Solver for the energy balance at the ground/roof/wall surface.
7296!> It follows basic ideas and structure of lsm_energy_balance
7297!> with many simplifications and adjustments.
7298!> TODO better description
7299!------------------------------------------------------------------------------!
7300    SUBROUTINE usm_surface_energy_balance
7301
7302        IMPLICIT NONE
7303
7304        INTEGER(iwp)                          :: i, j, k, l, d, m   !< running indices
7305       
7306        REAL(wp)                              :: stend              !< surface tendency
7307        REAL(wp)                              :: stend_window       !< surface tendency
7308        REAL(wp)                              :: stend_green        !< surface tendency
7309        REAL(wp)                              :: coef_1             !< first coeficient for prognostic equation
7310        REAL(wp)                              :: coef_window_1      !< first coeficient for prognostic window equation
7311        REAL(wp)                              :: coef_green_1       !< first coeficient for prognostic green wall equation
7312        REAL(wp)                              :: coef_2             !< second  coeficient for prognostic equation
7313        REAL(wp)                              :: coef_window_2      !< second  coeficient for prognostic window equation
7314        REAL(wp)                              :: coef_green_2       !< second  coeficient for prognostic green wall equation
7315        REAL(wp)                              :: rho_cp             !< rho_wall_surface * cp
7316        REAL(wp)                              :: f_shf              !< factor for shf_eb
7317        REAL(wp)                              :: f_shf_window       !< factor for shf_eb window
7318        REAL(wp)                              :: f_shf_green        !< factor for shf_eb green wall
7319        REAL(wp)                              :: lambda_surface     !< current value of lambda_surface (heat conductivity between air and wall)
7320        REAL(wp)                              :: lambda_surface_window !< current value of lambda_surface (heat conductivity between air and window)
7321        REAL(wp)                              :: lambda_surface_green  !< current value of lambda_surface (heat conductivity between air and greeb wall)
7322        REAL(wp), DIMENSION(nzb:nzt)          :: exn                !< value of the Exner function in layers
7323       
7324        REAL(wp)                              :: dtime              !< simulated time of day (in UTC)
7325        INTEGER(iwp)                          :: dhour              !< simulated hour of day (in UTC)
7326        REAL(wp)                              :: acoef              !< actual coefficient of diurnal profile of anthropogenic heat
7327
7328
7329#if ! defined( __nopointer )
7330        exn(nzb:nzt) = (hyp(nzb:nzt) / 100000.0_wp )**0.286_wp          !< Exner function
7331#endif
7332!       
7333!--     First, treat horizontal surface elements
7334        DO  m = 1, surf_usm_h%ns
7335!
7336!--        Get indices of respective grid point
7337           i = surf_usm_h%i(m)
7338           j = surf_usm_h%j(m)
7339           k = surf_usm_h%k(m)
7340!
7341!--        TODO - how to calculate lambda_surface for horizontal surfaces
7342!--        (lambda_surface is set according to stratification in land surface model)
7343!--        MS: ???
7344           IF ( surf_usm_h%ol(m) >= 0.0_wp )  THEN
7345              lambda_surface = surf_usm_h%lambda_surf(m)
7346              lambda_surface_window = surf_usm_h%lambda_surf_window(m)
7347              lambda_surface_green = surf_usm_h%lambda_surf_green(m)
7348           ELSE
7349              lambda_surface = surf_usm_h%lambda_surf(m)
7350              lambda_surface_window = surf_usm_h%lambda_surf_window(m)
7351              lambda_surface_green = surf_usm_h%lambda_surf_green(m)
7352           ENDIF
7353#if ! defined( __nopointer )
7354!
7355!--        calculate rho * cp coefficient at surface layer
7356           rho_cp  = cp * hyp(k) / ( r_d * surf_usm_h%pt1(m) * exn(k) )
7357#endif
7358!
7359!--        Calculate aerodyamic resistance.
7360!--        Calculation for horizontal surfaces follows LSM formulation
7361!--        pt, us, ts are not available for the prognostic time step,
7362!--        data from the last time step is used here.
7363
7364!--        Workaround: use single r_a as stability is only treated for the
7365!--        average temperature
7366           surf_usm_h%r_a(m) = ( surf_usm_h%pt1(m) - surf_usm_h%pt_surface(m) ) /&
7367                               ( surf_usm_h%ts(m) * surf_usm_h%us(m) + 1.0E-20_wp )   
7368           surf_usm_h%r_a_window(m) = surf_usm_h%r_a(m)
7369           surf_usm_h%r_a_green(m)  = surf_usm_h%r_a(m)
7370
7371!            r_a = ( surf_usm_h%pt1(m) - t_surf_h(m) / exn(k) ) /                              &
7372!                  ( surf_usm_h%ts(m) * surf_usm_h%us(m) + 1.0E-20_wp )
7373!            r_a_window = ( surf_usm_h%pt1(m) - t_surf_window_h(m) / exn(k) ) /                &
7374!                  ( surf_usm_h%ts(m) * surf_usm_h%us(m) + 1.0E-20_wp )
7375!            r_a_green = ( surf_usm_h%pt1(m) - t_surf_green_h(m) / exn(k) ) /                  &
7376!                  ( surf_usm_h%ts(m) * surf_usm_h%us(m) + 1.0E-20_wp )
7377               
7378!--        Make sure that the resistance does not drop to zero
7379           IF ( surf_usm_h%r_a(m)        < 1.0_wp )                            &
7380               surf_usm_h%r_a(m)        = 1.0_wp
7381           IF ( surf_usm_h%r_a_green(m)  < 1.0_wp )                            &
7382               surf_usm_h%r_a_green(m) = 1.0_wp
7383           IF ( surf_usm_h%r_a_window(m) < 1.0_wp )                            &
7384               surf_usm_h%r_a_window(m) = 1.0_wp
7385             
7386!
7387!--        Make sure that the resistacne does not exceed a maxmium value in case
7388!--        of zero velocities
7389           IF ( surf_usm_h%r_a(m)        > 300.0_wp )                          &
7390               surf_usm_h%r_a(m)        = 300.0_wp
7391           IF ( surf_usm_h%r_a_green(m)  > 300.0_wp )                          &
7392               surf_usm_h%r_a_green(m) = 300.0_wp
7393           IF ( surf_usm_h%r_a_window(m) > 300.0_wp )                          &
7394               surf_usm_h%r_a_window(m) = 300.0_wp               
7395               
7396               
7397!--        factor for shf_eb
7398           f_shf  = rho_cp / surf_usm_h%r_a(m)
7399           f_shf_window  = rho_cp / surf_usm_h%r_a_window(m)
7400           f_shf_green  = rho_cp / surf_usm_h%r_a_green(m)
7401       
7402!--        add LW up so that it can be removed in prognostic equation
7403           surf_usm_h%rad_net_l(m) = surf_usm_h%rad_sw_in(m)  -                &
7404                                     surf_usm_h%rad_sw_out(m) +                &
7405                                     surf_usm_h%rad_lw_in(m)  -                &
7406                                     surf_usm_h%rad_lw_out(m)
7407
7408!--        numerator of the prognostic equation
7409!--     Todo: Adjust to tile approach. So far, emissivity for wall (element 0)
7410!--           is used
7411           coef_1 = surf_usm_h%rad_net_l(m) +                                  & 
7412                 ( 3.0_wp + 1.0_wp ) * surf_usm_h%emissivity(ind_veg_wall,m) * &
7413                                       sigma_sb * t_surf_h(m) ** 4 +           & 
7414                                       f_shf * surf_usm_h%pt1(m) +             &
7415                                       lambda_surface * t_wall_h(nzb_wall,m)
7416           coef_window_1 = surf_usm_h%rad_net_l(m) +                           & 
7417                   ( 3.0_wp + 1.0_wp ) * surf_usm_h%emissivity(ind_wat_win,m)  &
7418                                       * sigma_sb * t_surf_window_h(m) ** 4 +  & 
7419                                       f_shf_window * surf_usm_h%pt1(m) +      &
7420                                       lambda_surface_window * t_window_h(nzb_wall,m)
7421           coef_green_1 = surf_usm_h%rad_net_l(m) +                            & 
7422                 ( 3.0_wp + 1.0_wp ) * surf_usm_h%emissivity(ind_pav_green,m) *&
7423                                       sigma_sb * t_surf_green_h(m) ** 4 +     & 
7424                                       f_shf_green * surf_usm_h%pt1(m) +       &
7425                                       lambda_surface_green * t_wall_h(nzb_wall,m)
7426
7427!--        denominator of the prognostic equation
7428           coef_2 = 4.0_wp * surf_usm_h%emissivity(ind_veg_wall,m) *           &
7429                             sigma_sb * t_surf_h(m) ** 3                       &
7430                           + lambda_surface + f_shf / exn(k)
7431           coef_window_2 = 4.0_wp * surf_usm_h%emissivity(ind_wat_win,m) *     &
7432                             sigma_sb * t_surf_window_h(m) ** 3                &
7433                           + lambda_surface_window + f_shf_window / exn(k)
7434           coef_green_2 = 4.0_wp * surf_usm_h%emissivity(ind_pav_green,m) *    &
7435                             sigma_sb * t_surf_green_h(m) ** 3                 &
7436                           + lambda_surface_green + f_shf_green / exn(k)
7437
7438!--        implicit solution when the surface layer has no heat capacity,
7439!--        otherwise use RK3 scheme.
7440           t_surf_h_p(m) = ( coef_1 * dt_3d * tsc(2) +                        &
7441                             surf_usm_h%c_surface(m) * t_surf_h(m) ) /        & 
7442                           ( surf_usm_h%c_surface(m) + coef_2 * dt_3d * tsc(2) ) 
7443           t_surf_window_h_p(m) = ( coef_window_1 * dt_3d * tsc(2) +                        &
7444                             surf_usm_h%c_surface_window(m) * t_surf_window_h(m) ) /        & 
7445                           ( surf_usm_h%c_surface_window(m) + coef_window_2 * dt_3d * tsc(2) ) 
7446           t_surf_green_h_p(m) = ( coef_green_1 * dt_3d * tsc(2) +                        &
7447                             surf_usm_h%c_surface_green(m) * t_surf_green_h(m) ) /        & 
7448                           ( surf_usm_h%c_surface_green(m) + coef_green_2 * dt_3d * tsc(2) ) 
7449
7450!--        add RK3 term
7451           t_surf_h_p(m) = t_surf_h_p(m) + dt_3d * tsc(3) *                   &
7452                           surf_usm_h%tt_surface_m(m)
7453           t_surf_window_h_p(m) = t_surf_window_h_p(m) + dt_3d * tsc(3) *     &
7454                           surf_usm_h%tt_surface_window_m(m)
7455           t_surf_green_h_p(m) = t_surf_green_h_p(m) + dt_3d * tsc(3) *       &
7456                           surf_usm_h%tt_surface_green_m(m)
7457!
7458!--        Store surface temperature on pt_surface. Further, in case humidity is used
7459!--        store also vpt_surface, which is, due to the lack of moisture on roofs simply
7460!--        assumed to be the surface temperature.
7461           surf_usm_h%pt_surface(m) = ( surf_usm_h%frac(ind_veg_wall,m) * t_surf_h_p(m)   &
7462                               + surf_usm_h%frac(ind_wat_win,m) * t_surf_window_h_p(m)   &
7463                               + surf_usm_h%frac(ind_pav_green,m) * t_surf_green_h_p(m) )  &
7464                               / exn(k)
7465                               
7466           IF ( humidity )  surf_usm_h%vpt_surface(m) =                        &
7467                                                   surf_usm_h%pt_surface(m)
7468                       
7469!--        calculate true tendency
7470           stend = ( t_surf_h_p(m) - t_surf_h(m) - dt_3d * tsc(3) *           &
7471                     surf_usm_h%tt_surface_m(m)) / ( dt_3d  * tsc(2) )
7472           stend_window = ( t_surf_window_h_p(m) - t_surf_window_h(m) - dt_3d * tsc(3) *        &
7473                     surf_usm_h%tt_surface_window_m(m)) / ( dt_3d  * tsc(2) )
7474           stend_green = ( t_surf_green_h_p(m) - t_surf_green_h(m) - dt_3d * tsc(3) *           &
7475                     surf_usm_h%tt_surface_green_m(m)) / ( dt_3d  * tsc(2) )
7476
7477!--        calculate t_surf tendencies for the next Runge-Kutta step
7478           IF ( timestep_scheme(1:5) == 'runge' )  THEN
7479              IF ( intermediate_timestep_count == 1 )  THEN
7480                 surf_usm_h%tt_surface_m(m) = stend
7481                 surf_usm_h%tt_surface_window_m(m) = stend_window
7482                 surf_usm_h%tt_surface_green_m(m) = stend_green
7483              ELSEIF ( intermediate_timestep_count <                          &
7484                        intermediate_timestep_count_max )  THEN
7485                 surf_usm_h%tt_surface_m(m) = -9.5625_wp * stend +            &
7486                                     5.3125_wp * surf_usm_h%tt_surface_m(m)
7487                 surf_usm_h%tt_surface_window_m(m) = -9.5625_wp * stend_window +   &
7488                                     5.3125_wp * surf_usm_h%tt_surface_window_m(m)
7489                 surf_usm_h%tt_surface_green_m(m) = -9.5625_wp * stend_green +     &
7490                                     5.3125_wp * surf_usm_h%tt_surface_green_m(m)
7491              ENDIF
7492           ENDIF
7493
7494!--        in case of fast changes in the skin temperature, it is required to
7495!--        update the radiative fluxes in order to keep the solution stable
7496           IF ( ( ABS( t_surf_h_p(m) - t_surf_h(m) ) > 1.0_wp ) .OR. &
7497                ( ABS( t_surf_green_h_p(m) - t_surf_green_h(m) ) > 1.0_wp ) .OR. &
7498                ( ABS( t_surf_window_h_p(m) - t_surf_window_h(m) ) > 1.0_wp ) ) THEN
7499              force_radiation_call_l = .TRUE.
7500           ENDIF
7501!
7502!--        calculate fluxes
7503!--        rad_net_l is never used!           
7504           surf_usm_h%rad_net_l(m) = surf_usm_h%rad_net_l(m) +                           &
7505                                     surf_usm_h%frac(ind_veg_wall,m) *                   &
7506                                     sigma_sb * surf_usm_h%emissivity(ind_veg_wall,m) *  &
7507                                     ( t_surf_h_p(m)**4 - t_surf_h(m)**4 )               &
7508                                    + surf_usm_h%frac(ind_wat_win,m) *                   &
7509                                     sigma_sb * surf_usm_h%emissivity(ind_wat_win,m) *   &
7510                                     ( t_surf_window_h_p(m)**4 - t_surf_window_h(m)**4 ) &
7511                                    + surf_usm_h%frac(ind_pav_green,m) *                 &
7512                                     sigma_sb * surf_usm_h%emissivity(ind_pav_green,m) * &
7513                                     ( t_surf_green_h_p(m)**4 - t_surf_green_h(m)**4 )
7514
7515           surf_usm_h%wghf_eb(m)   = lambda_surface *                         &
7516                                      ( t_surf_h_p(m) - t_wall_h(nzb_wall,m) )
7517           surf_usm_h%wghf_eb_green(m)  = lambda_surface_green *                        &
7518                                          ( t_surf_green_h_p(m) - t_green_h(nzb_wall,m) )
7519           surf_usm_h%wghf_eb_window(m) = lambda_surface_window *                       &
7520                                           ( t_surf_window_h_p(m) - t_window_h(nzb_wall,m) )
7521
7522!
7523!--        ground/wall/roof surface heat flux
7524           surf_usm_h%wshf_eb(m)   = - f_shf  * ( surf_usm_h%pt1(m) - t_surf_h_p(m) / exn(k) ) *               &
7525                                       surf_usm_h%frac(ind_veg_wall,m)         &
7526                                     - f_shf_window  * ( surf_usm_h%pt1(m) - t_surf_window_h_p(m) / exn(k) ) * &
7527                                       surf_usm_h%frac(ind_wat_win,m)          &
7528                                     - f_shf_green  * ( surf_usm_h%pt1(m) - t_surf_green_h_p(m) / exn(k) ) *   &
7529                                       surf_usm_h%frac(ind_pav_green,m)
7530!           
7531!--        store kinematic surface heat fluxes for utilization in other processes
7532!--        diffusion_s, surface_layer_fluxes,...
7533           surf_usm_h%shf(m) = surf_usm_h%wshf_eb(m) / cp
7534
7535       ENDDO
7536!
7537!--    Now, treat vertical surface elements
7538       DO  l = 0, 3
7539          DO  m = 1, surf_usm_v(l)%ns
7540!
7541!--          Get indices of respective grid point
7542             i = surf_usm_v(l)%i(m)
7543             j = surf_usm_v(l)%j(m)
7544             k = surf_usm_v(l)%k(m)
7545
7546!
7547!--          TODO - how to calculate lambda_surface for horizontal (??? do you mean verical ???) surfaces
7548!--          (lambda_surface is set according to stratification in land surface model).
7549!--          Please note, for vertical surfaces no ol is defined, since
7550!--          stratification is not considered in this case.
7551             lambda_surface = surf_usm_v(l)%lambda_surf(m)
7552             lambda_surface_window = surf_usm_v(l)%lambda_surf_window(m)
7553             lambda_surface_green = surf_usm_v(l)%lambda_surf_green(m)
7554
7555#if ! defined( __nopointer )         
7556!
7557!--          calculate rho * cp coefficient at surface layer
7558             rho_cp  = cp * hyp(k) / ( r_d * surf_usm_v(l)%pt1(m) * exn(k) )
7559#endif
7560
7561!--          Calculation of r_a for vertical surfaces
7562!--
7563!--          heat transfer coefficient for forced convection along vertical walls
7564!--          follows formulation in TUF3d model (Krayenhoff & Voogt, 2006)
7565!--           
7566!--          H = httc (Tsfc - Tair)
7567!--          httc = rw * (11.8 + 4.2 * Ueff) - 4.0
7568!--           
7569!--                rw: wall patch roughness relative to 1.0 for concrete
7570!--                Ueff: effective wind speed
7571!--                - 4.0 is a reduction of Rowley et al (1930) formulation based on
7572!--                Cole and Sturrock (1977)
7573!--           
7574!--                Ucan: Canyon wind speed
7575!--                wstar: convective velocity
7576!--                Qs: surface heat flux
7577!--                zH: height of the convective layer
7578!--                wstar = (g/Tcan*Qs*zH)**(1./3.)
7579               
7580!--          Effective velocity components must always
7581!--          be defined at scalar grid point. The wall normal component is
7582!--          obtained by simple linear interpolation. ( An alternative would
7583!--          be an logarithmic interpolation. )
7584!--          A roughness lenght of 0.001 is assumed for concrete (the inverse,
7585!--          1000 is used in the nominator for scaling)
7586             surf_usm_v(l)%r_a(m) = rho_cp / ( surf_usm_v(l)%z0(m) * 1000.0_wp &
7587                        * ( 11.8_wp + 4.2_wp *                                 &
7588                        SQRT( MAX( ( ( u(k,j,i) + u(k,j,i+1) ) * 0.5_wp )**2 + &
7589                                   ( ( v(k,j,i) + v(k,j+1,i) ) * 0.5_wp )**2 + &
7590                                   ( ( w(k,j,i) + w(k-1,j,i) ) * 0.5_wp )**2,  &
7591                              0.01_wp ) )                                      &
7592                           )  - 4.0_wp  ) 
7593!
7594!--          Limit aerodynamic resistance
7595             IF ( surf_usm_v(l)%r_a(m) < 1.0_wp )  surf_usm_v(l)%r_a(m) = 1.0_wp   
7596             
7597                           
7598             f_shf         = rho_cp / surf_usm_v(l)%r_a(m)
7599             f_shf_window  = rho_cp / surf_usm_v(l)%r_a(m)
7600             f_shf_green   = rho_cp / surf_usm_v(l)%r_a(m)
7601
7602
7603
7604!--          add LW up so that it can be removed in prognostic equation
7605             surf_usm_v(l)%rad_net_l(m) = surf_usm_v(l)%rad_sw_in(m)  -        &
7606                                          surf_usm_v(l)%rad_sw_out(m) +        &
7607                                          surf_usm_v(l)%rad_lw_in(m)  -        &
7608                                          surf_usm_v(l)%rad_lw_out(m)
7609
7610!--           numerator of the prognostic equation
7611              coef_1 = surf_usm_v(l)%rad_net_l(m) +                            & ! coef +1 corresponds to -lwout included in calculation of radnet_l
7612             ( 3.0_wp + 1.0_wp ) * surf_usm_v(l)%emissivity(ind_veg_wall,m) *  &
7613                                     sigma_sb *  t_surf_v(l)%t(m) ** 4 +       & 
7614                                     f_shf * surf_usm_v(l)%pt1(m) +            &
7615                                     lambda_surface * t_wall_v(l)%t(nzb_wall,m)
7616              coef_window_1 = surf_usm_v(l)%rad_net_l(m) +                     & ! coef +1 corresponds to -lwout included in calculation of radnet_l
7617               ( 3.0_wp + 1.0_wp ) * surf_usm_v(l)%emissivity(ind_wat_win,m) * &
7618                                     sigma_sb * t_surf_window_v(l)%t(m) ** 4 + & 
7619                                     f_shf * surf_usm_v(l)%pt1(m) +            &
7620                                     lambda_surface_window * t_window_v(l)%t(nzb_wall,m)
7621
7622              coef_green_1 = surf_usm_v(l)%rad_net_l(m) +                      & ! coef +1 corresponds to -lwout included in calculation of radnet_l
7623              ( 3.0_wp + 1.0_wp ) * surf_usm_v(l)%emissivity(ind_pav_green,m) *&
7624                                     sigma_sb * t_surf_green_v(l)%t(m) ** 4 +  & 
7625                                     f_shf * surf_usm_v(l)%pt1(m) +            &
7626                                     lambda_surface_green * t_wall_v(l)%t(nzb_wall,m)
7627
7628!--           denominator of the prognostic equation
7629              coef_2 = 4.0_wp * surf_usm_v(l)%emissivity(ind_veg_wall,m) *     &
7630                                sigma_sb * t_surf_v(l)%t(m) ** 3               &
7631                              + lambda_surface + f_shf / exn(k)
7632              coef_window_2 = 4.0_wp * surf_usm_v(l)%emissivity(ind_wat_win,m) *&
7633                                sigma_sb * t_surf_window_v(l)%t(m) ** 3        &
7634                              + lambda_surface_window + f_shf / exn(k)
7635              coef_green_2 = 4.0_wp * surf_usm_v(l)%emissivity(ind_pav_green,m) *&
7636                                sigma_sb * t_surf_green_v(l)%t(m) ** 3         &
7637                              + lambda_surface_green + f_shf / exn(k)
7638
7639!--           implicit solution when the surface layer has no heat capacity,
7640!--           otherwise use RK3 scheme.
7641              t_surf_v_p(l)%t(m) = ( coef_1 * dt_3d * tsc(2) +                 &
7642                             surf_usm_v(l)%c_surface(m) * t_surf_v(l)%t(m) ) / & 
7643                           ( surf_usm_v(l)%c_surface(m) + coef_2 * dt_3d * tsc(2) ) 
7644              t_surf_window_v_p(l)%t(m) = ( coef_window_1 * dt_3d * tsc(2) +                 &
7645                             surf_usm_v(l)%c_surface_window(m) * t_surf_window_v(l)%t(m) ) / & 
7646                           ( surf_usm_v(l)%c_surface_window(m) + coef_window_2 * dt_3d * tsc(2) ) 
7647
7648              t_surf_green_v_p(l)%t(m) = ( coef_green_1 * dt_3d * tsc(2) +                 &
7649                             surf_usm_v(l)%c_surface_green(m) * t_surf_green_v(l)%t(m) ) / & 
7650                           ( surf_usm_v(l)%c_surface_green(m) + coef_green_2 * dt_3d * tsc(2) ) 
7651
7652
7653
7654!--           add RK3 term
7655              t_surf_v_p(l)%t(m) = t_surf_v_p(l)%t(m) + dt_3d * tsc(3) *       &
7656                                surf_usm_v(l)%tt_surface_m(m)
7657              t_surf_window_v_p(l)%t(m) = t_surf_window_v_p(l)%t(m) + dt_3d * tsc(3) *     &
7658                                surf_usm_v(l)%tt_surface_window_m(m)
7659              t_surf_green_v_p(l)%t(m) = t_surf_green_v_p(l)%t(m) + dt_3d * tsc(3) *       &
7660                                surf_usm_v(l)%tt_surface_green_m(m)
7661!
7662!--           Store surface temperature. Further, in case humidity is used
7663!--           store also vpt_surface, which is, due to the lack of moisture on roofs simply
7664!--           assumed to be the surface temperature.     
7665              surf_usm_v(l)%pt_surface(m) =  ( surf_usm_v(l)%frac(ind_veg_wall,m) * t_surf_v_p(l)%t(m)  &
7666                                      + surf_usm_v(l)%frac(ind_wat_win,m) * t_surf_window_v_p(l)%t(m)  &
7667                                      + surf_usm_v(l)%frac(ind_pav_green,m) * t_surf_green_v_p(l)%t(m) ) &
7668                                      / exn(k) 
7669                                     
7670              IF ( humidity )  surf_usm_v(l)%vpt_surface(m) =                  &
7671                                                    surf_usm_v(l)%pt_surface(m)
7672           
7673!--           calculate true tendency
7674              stend = ( t_surf_v_p(l)%t(m) - t_surf_v(l)%t(m) - dt_3d * tsc(3) *&
7675                        surf_usm_v(l)%tt_surface_m(m) ) / ( dt_3d  * tsc(2) )
7676              stend_window = ( t_surf_window_v_p(l)%t(m) - t_surf_window_v(l)%t(m) - dt_3d * tsc(3) *&
7677                        surf_usm_v(l)%tt_surface_window_m(m) ) / ( dt_3d  * tsc(2) )
7678              stend_green = ( t_surf_green_v_p(l)%t(m) - t_surf_green_v(l)%t(m) - dt_3d * tsc(3) *&
7679                        surf_usm_v(l)%tt_surface_green_m(m) ) / ( dt_3d  * tsc(2) )
7680
7681!--           calculate t_surf tendencies for the next Runge-Kutta step
7682              IF ( timestep_scheme(1:5) == 'runge' )  THEN
7683                 IF ( intermediate_timestep_count == 1 )  THEN
7684                    surf_usm_v(l)%tt_surface_m(m) = stend
7685                    surf_usm_v(l)%tt_surface_window_m(m) = stend_window
7686                    surf_usm_v(l)%tt_surface_green_m(m) = stend_green
7687                 ELSEIF ( intermediate_timestep_count <                        &
7688                          intermediate_timestep_count_max )  THEN
7689                    surf_usm_v(l)%tt_surface_m(m) = -9.5625_wp * stend +       &
7690                                     5.3125_wp * surf_usm_v(l)%tt_surface_m(m)
7691                    surf_usm_v(l)%tt_surface_green_m(m) = -9.5625_wp * stend_green +       &
7692                                     5.3125_wp * surf_usm_v(l)%tt_surface_green_m(m)
7693                    surf_usm_v(l)%tt_surface_window_m(m) = -9.5625_wp * stend_window +       &
7694                                     5.3125_wp * surf_usm_v(l)%tt_surface_window_m(m)
7695                 ENDIF
7696              ENDIF
7697
7698!--           in case of fast changes in the skin temperature, it is required to
7699!--           update the radiative fluxes in order to keep the solution stable
7700
7701              IF ( ( ABS( t_surf_v_p(l)%t(m) - t_surf_v(l)%t(m) ) > 1.0_wp ) .OR. &
7702                   ( ABS( t_surf_green_v_p(l)%t(m) - t_surf_green_v(l)%t(m) ) > 1.0_wp ) .OR.  &
7703                   ( ABS( t_surf_window_v_p(l)%t(m) - t_surf_window_v(l)%t(m) ) > 1.0_wp ) ) THEN
7704                 force_radiation_call_l = .TRUE.
7705              ENDIF
7706
7707!--           calculate fluxes
7708!--           prognostic rad_net_l is used just for output!           
7709              surf_usm_v(l)%rad_net_l(m) = surf_usm_v(l)%frac(ind_veg_wall,m) *                      &
7710                                           ( surf_usm_v(l)%rad_net_l(m) +                            &
7711                                           3.0_wp * sigma_sb *                                       &
7712                                           t_surf_v(l)%t(m)**4 - 4.0_wp * sigma_sb *                 &
7713                                           t_surf_v(l)%t(m)**3 * t_surf_v_p(l)%t(m) )                &
7714                                         + surf_usm_v(l)%frac(ind_wat_win,m) *                       &
7715                                           ( surf_usm_v(l)%rad_net_l(m) +                            &
7716                                           3.0_wp * sigma_sb *                                       &
7717                                           t_surf_window_v(l)%t(m)**4 - 4.0_wp * sigma_sb *          &
7718                                           t_surf_window_v(l)%t(m)**3 * t_surf_window_v_p(l)%t(m) )  &
7719                                         + surf_usm_v(l)%frac(ind_pav_green,m) *                     &
7720                                           ( surf_usm_v(l)%rad_net_l(m) +                            &
7721                                           3.0_wp * sigma_sb *                                       &
7722                                           t_surf_green_v(l)%t(m)**4 - 4.0_wp * sigma_sb *           &
7723                                           t_surf_green_v(l)%t(m)**3 * t_surf_green_v_p(l)%t(m) )
7724
7725              surf_usm_v(l)%wghf_eb_window(m) = lambda_surface_window * &
7726                                                ( t_surf_window_v_p(l)%t(m) - t_window_v(l)%t(nzb_wall,m) )
7727              surf_usm_v(l)%wghf_eb(m)   = lambda_surface *                    &
7728                                     ( t_surf_v_p(l)%t(m) - t_wall_v(l)%t(nzb_wall,m) )
7729              surf_usm_v(l)%wghf_eb_green(m)  = lambda_surface_green *  &
7730                                                ( t_surf_green_v_p(l)%t(m) - t_green_v(l)%t(nzb_wall,m) )
7731
7732!--           ground/wall/roof surface heat flux
7733              surf_usm_v(l)%wshf_eb(m)   =                                     &
7734                 - f_shf  * ( surf_usm_v(l)%pt1(m) -                           &
7735                 t_surf_v_p(l)%t(m) / exn(k) ) * surf_usm_v(l)%frac(ind_veg_wall,m)       &
7736                 - f_shf_window  * ( surf_usm_v(l)%pt1(m) -                    &
7737                 t_surf_window_v_p(l)%t(m) / exn(k) ) * surf_usm_v(l)%frac(ind_wat_win,m)&
7738                 - f_shf_green  * ( surf_usm_v(l)%pt1(m) -                     &
7739                 t_surf_green_v_p(l)%t(m) / exn(k) ) * surf_usm_v(l)%frac(ind_pav_green,m)
7740
7741!           
7742!--           store kinematic surface heat fluxes for utilization in other processes
7743!--           diffusion_s, surface_layer_fluxes,...
7744              surf_usm_v(l)%shf(m) = surf_usm_v(l)%wshf_eb(m) / cp
7745
7746           ENDDO
7747
7748        ENDDO
7749!
7750!--     Add-up anthropogenic heat, for now only at upward-facing surfaces
7751        IF ( usm_anthropogenic_heat  .AND.  &
7752             intermediate_timestep_count == intermediate_timestep_count_max )  THEN
7753!--        application of the additional anthropogenic heat sources
7754!--        we considere the traffic for now so all heat is absorbed
7755!--        to the first layer, generalization would be worth.
7756           
7757!--        calculation of actual profile coefficient
7758!--        ??? check time_since_reference_point ???
7759           dtime = mod(simulated_time + time_utc_init, 24.0_wp*3600.0_wp)
7760           dhour = INT(dtime/3600.0_wp)
7761           DO m = 1, naheatlayers
7762!--           Get indices of respective grid point
7763              i = surf_usm_h%i(m)
7764              j = surf_usm_h%j(m)
7765              k = surf_usm_h%k(m)
7766              IF ( k > get_topography_top_index_ji( j, i, 's' )  .AND. &
7767                   k <= naheatlayers )  THEN
7768!--              increase of pt in box i,j,k in time dt_3d
7769!--              given to anthropogenic heat aheat*acoef (W*m-2)
7770!--              linear interpolation of coeficient
7771                 acoef = (REAL(dhour+1,wp)-dtime/3600.0_wp)*aheatprof(k,dhour) + &
7772                         (dtime/3600.0_wp-REAL(dhour,wp))*aheatprof(k,dhour+1)
7773                 IF ( aheat(k,j,i) > 0.0_wp )  THEN
7774                    pt(k,j,i) = pt(k,j,i) + aheat(k,j,i)*acoef*dt_3d/(exn(k)*rho_cp*dzu(k))
7775                 ENDIF
7776              ENDIF
7777           ENDDO
7778
7779        ENDIF
7780       
7781!--     pt and shf are defined on nxlg:nxrg,nysg:nyng
7782!--     get the borders from neighbours
7783#if ! defined( __nopointer )
7784        CALL exchange_horiz( pt, nbgp )
7785#endif
7786
7787!--     calculation of force_radiation_call:
7788!--     Make logical OR for all processes.
7789!--     Force radiation call if at least one processor forces it.
7790        IF ( intermediate_timestep_count == intermediate_timestep_count_max-1 )&
7791        THEN
7792#if defined( __parallel )
7793          IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
7794          CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call,    &
7795                              1, MPI_LOGICAL, MPI_LOR, comm2d, ierr )
7796#else
7797          force_radiation_call = force_radiation_call_l
7798#endif
7799          force_radiation_call_l = .FALSE.
7800       ENDIF
7801
7802    END SUBROUTINE usm_surface_energy_balance
7803
7804
7805!------------------------------------------------------------------------------!
7806! Description:
7807! ------------
7808!> Swapping of timelevels for t_surf and t_wall
7809!> called out from subroutine swap_timelevel
7810!------------------------------------------------------------------------------!
7811    SUBROUTINE usm_swap_timelevel ( mod_count )
7812
7813       IMPLICIT NONE
7814
7815       INTEGER(iwp), INTENT(IN) :: mod_count
7816       INTEGER(iwp)             :: i
7817     
7818#if defined( __nopointer )
7819       t_surf_h    = t_surf_h_p
7820       t_wall_h    = t_wall_h_p
7821       t_surf_v    = t_surf_v_p
7822       t_wall_v    = t_wall_v_p
7823       t_surf_window_h    = t_surf_window_h_p
7824       t_window_h    = t_window_h_p
7825       t_surf_window_v    = t_surf_window_v_p
7826       t_window_v    = t_window_v_p
7827       t_surf_green_h    = t_surf_green_h_p
7828       t_surf_green_v    = t_surf_green_v_p
7829       t_green_h    = t_green_h_p
7830       t_green_v    = t_green_v_p
7831#else
7832       SELECT CASE ( mod_count )
7833          CASE ( 0 )
7834!
7835!--          Horizontal surfaces
7836             t_surf_h  => t_surf_h_1; t_surf_h_p  => t_surf_h_2
7837             t_wall_h     => t_wall_h_1;    t_wall_h_p     => t_wall_h_2
7838             t_surf_window_h  => t_surf_window_h_1; t_surf_window_h_p  => t_surf_window_h_2
7839             t_window_h     => t_window_h_1;    t_window_h_p     => t_window_h_2
7840             t_surf_green_h  => t_surf_green_h_1; t_surf_green_h_p  => t_surf_green_h_2
7841             t_green_h     => t_green_h_1;    t_green_h_p     => t_green_h_2
7842!
7843!--          Vertical surfaces
7844             t_surf_v  => t_surf_v_1; t_surf_v_p  => t_surf_v_2
7845             t_wall_v     => t_wall_v_1;    t_wall_v_p     => t_wall_v_2
7846             t_surf_window_v  => t_surf_window_v_1; t_surf_window_v_p  => t_surf_window_v_2
7847             t_window_v     => t_window_v_1;    t_window_v_p     => t_window_v_2
7848             t_surf_green_v  => t_surf_green_v_1; t_surf_green_v_p  => t_surf_green_v_2
7849             t_green_v     => t_green_v_1;    t_green_v_p     => t_green_v_2
7850          CASE ( 1 )
7851!
7852!--          Horizontal surfaces
7853             t_surf_h  => t_surf_h_2; t_surf_h_p  => t_surf_h_1
7854             t_wall_h     => t_wall_h_2;    t_wall_h_p     => t_wall_h_1
7855             t_surf_window_h  => t_surf_window_h_2; t_surf_window_h_p  => t_surf_window_h_1
7856             t_window_h     => t_window_h_2;    t_window_h_p     => t_window_h_1
7857             t_surf_green_h  => t_surf_green_h_2; t_surf_green_h_p  => t_surf_green_h_1
7858             t_green_h     => t_green_h_2;    t_green_h_p     => t_green_h_1
7859!
7860!--          Vertical surfaces
7861             t_surf_v  => t_surf_v_2; t_surf_v_p  => t_surf_v_1
7862             t_wall_v     => t_wall_v_2;    t_wall_v_p     => t_wall_v_1
7863             t_surf_window_v  => t_surf_window_v_2; t_surf_window_v_p  => t_surf_window_v_1
7864             t_window_v     => t_window_v_2;    t_window_v_p     => t_window_v_1
7865             t_surf_green_v  => t_surf_green_v_2; t_surf_green_v_p  => t_surf_green_v_1
7866             t_green_v     => t_green_v_2;    t_green_v_p     => t_green_v_1
7867       END SELECT
7868#endif
7869       
7870    END SUBROUTINE usm_swap_timelevel
7871
7872!------------------------------------------------------------------------------!
7873! Description:
7874! ------------
7875!> Subroutine writes t_surf and t_wall data into restart files
7876!------------------------------------------------------------------------------!
7877    SUBROUTINE usm_wrd_local
7878
7879   
7880       IMPLICIT NONE
7881       
7882       CHARACTER(LEN=1) ::  dum     !< dummy string to create output-variable name 
7883       INTEGER(iwp)     ::  l       !< index surface type orientation
7884
7885       CALL wrd_write_string( 'ns_h_on_file_usm' )
7886       WRITE ( 14 )  surf_usm_h%ns
7887
7888       CALL wrd_write_string( 'ns_v_on_file_usm' )
7889       WRITE ( 14 )  surf_usm_v(0:3)%ns
7890
7891       CALL wrd_write_string( 'usm_start_index_h' )
7892       WRITE ( 14 )  surf_usm_h%start_index
7893
7894       CALL wrd_write_string( 'usm_end_index_h' )
7895       WRITE ( 14 )  surf_usm_h%end_index
7896
7897       CALL wrd_write_string( 't_surf_h' )
7898       WRITE ( 14 )  t_surf_h
7899
7900       CALL wrd_write_string( 't_surf_window_h' )
7901       WRITE ( 14 )  t_surf_window_h
7902
7903       CALL wrd_write_string( 't_surf_green_h' )
7904       WRITE ( 14 )  t_surf_green_h
7905
7906       DO  l = 0, 3
7907
7908          CALL wrd_write_string( 'usm_start_index_v' )
7909          WRITE ( 14 )  surf_usm_v(l)%start_index
7910
7911          CALL wrd_write_string( 'usm_end_index_v' )
7912          WRITE ( 14 )  surf_usm_v(l)%end_index
7913
7914          WRITE( dum, '(I1)')  l         
7915
7916          CALL wrd_write_string( 't_surf_v(' // dum // ')' )
7917          WRITE ( 14 )  t_surf_v(l)%t
7918
7919          CALL wrd_write_string( 't_surf_window_v(' // dum // ')' )
7920          WRITE ( 14 ) t_surf_window_v(l)%t     
7921
7922          CALL wrd_write_string( 't_surf_green_v(' // dum // ')' )
7923          WRITE ( 14 ) t_surf_green_v(l)%t   
7924         
7925       ENDDO
7926
7927       CALL wrd_write_string( 'usm_start_index_h' )
7928       WRITE ( 14 )  surf_usm_h%start_index
7929
7930       CALL wrd_write_string( 'usm_end_index_h' )
7931       WRITE ( 14 )  surf_usm_h%end_index
7932
7933       CALL wrd_write_string( 't_wall_h' )
7934       WRITE ( 14 )  t_wall_h
7935
7936       CALL wrd_write_string( 't_window_h' )
7937       WRITE ( 14 )  t_window_h
7938
7939       CALL wrd_write_string( 't_green_h' )
7940       WRITE ( 14 )  t_green_h
7941
7942       DO  l = 0, 3
7943
7944          CALL wrd_write_string( 'usm_start_index_v' )
7945          WRITE ( 14 )  surf_usm_v(l)%start_index
7946
7947          CALL wrd_write_string( 'usm_end_index_v' )
7948          WRITE ( 14 )  surf_usm_v(l)%end_index
7949
7950          WRITE( dum, '(I1)')  l     
7951
7952          CALL wrd_write_string( 't_wall_v(' // dum // ')' )
7953          WRITE ( 14 )  t_wall_v(l)%t
7954
7955          CALL wrd_write_string( 't_window_v(' // dum // ')' )
7956          WRITE ( 14 )  t_window_v(l)%t
7957
7958          CALL wrd_write_string( 't_green_v(' // dum // ')' )
7959          WRITE ( 14 )  t_green_v(l)%t
7960       
7961       ENDDO
7962
7963       
7964    END SUBROUTINE usm_wrd_local
7965
7966!
7967!-- Integrated stability function for heat and moisture
7968    FUNCTION psi_h( zeta )
7969
7970           USE kinds
7971
7972       IMPLICIT NONE
7973
7974       REAL(wp)            :: psi_h !< Integrated similarity function result
7975       REAL(wp)            :: zeta  !< Stability parameter z/L
7976       REAL(wp)            :: x     !< dummy variable
7977
7978       REAL(wp), PARAMETER :: a = 1.0_wp            !< constant
7979       REAL(wp), PARAMETER :: b = 0.66666666666_wp  !< constant
7980       REAL(wp), PARAMETER :: c = 5.0_wp            !< constant
7981       REAL(wp), PARAMETER :: d = 0.35_wp           !< constant
7982       REAL(wp), PARAMETER :: c_d_d = c / d         !< constant
7983       REAL(wp), PARAMETER :: bc_d_d = b * c / d    !< constant
7984
7985
7986      IF ( zeta < 0.0_wp )  THEN
7987         x = SQRT( 1.0_wp  - 16.0_wp * zeta )
7988         psi_h = 2.0_wp * LOG( (1.0_wp + x ) / 2.0_wp )
7989      ELSE
7990         psi_h = - b * ( zeta - c_d_d ) * EXP( -d * zeta ) - (1.0_wp          &
7991                 + 0.66666666666_wp * a * zeta )**1.5_wp - bc_d_d             &
7992                 + 1.0_wp
7993!
7994!--       Old version for stable conditions (only valid for z/L < 0.5)
7995!--       psi_h = - 5.0_wp * zeta
7996       ENDIF
7997
7998   END FUNCTION psi_h
7999   
8000 END MODULE urban_surface_mod
Note: See TracBrowser for help on using the repository browser.