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

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

Correct working precision for REAL and INTEGER numbers

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