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

Last change on this file since 4517 was 4517, checked in by raasch, 14 months ago

added restart with MPI-IO for reading local arrays

  • Property svn:keywords set to Id
File size: 531.5 KB
Line 
1!> @file urban_surface_mod.f90
2!--------------------------------------------------------------------------------------------------!
3! This file is part of the PALM model system.
4!
5! PALM is free software: you can redistribute it and/or modify it under the terms of the GNU General
6! Public License as published by the Free Software Foundation, either version 3 of the License, or
7! (at your option) any later version.
8!
9! PALM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
10! implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
11! Public License for more details.
12!
13! You should have received a copy of the GNU General Public License along with PALM. If not, see
14! <http://www.gnu.org/licenses/>.
15!
16! Copyright 2015-2020 Czech Technical University in Prague
17! Copyright 2015-2020 Institute of Computer Science of the Czech Academy of Sciences, Prague
18! Copyright 1997-2020 Leibniz Universitaet Hannover
19!--------------------------------------------------------------------------------------------------!
20!
21!
22! Current revisions:
23! -----------------
24!
25!
26! Former revisions:
27! -----------------
28! $Id: urban_surface_mod.f90 4517 2020-05-03 14:29:30Z raasch $
29! added restart with MPI-IO for reading local arrays
30!
31! 4510 2020-04-29 14:19:18Z raasch
32! Further re-formatting to follow the PALM coding standard
33!
34! 4509 2020-04-26 15:57:55Z raasch
35! File re-formatted to follow the PALM coding standard
36!
37! 4500 2020-04-17 10:12:45Z suehring
38! Allocate array for wall heat flux, which is further used to aggregate tile
39! fractions in the surface output
40!
41! 4495 2020-04-13 20:11:20Z raasch
42! Restart data handling with MPI-IO added
43!
44! 4493 2020-04-10 09:49:43Z pavelkrc
45! J.Resler, 2020/03/19
46! - Remove reading of deprecated input parameters c_surface and lambda_surf
47! - And calculate them from parameters of the outer wall/roof layer
48!
49! 4481 2020-03-31 18:55:54Z maronga
50! Use statement for exchange horiz added
51!
52! 4442 2020-03-04 19:21:13Z suehring
53! Change order of dimension in surface arrays %frac, %emissivity and %albedo to allow for better
54! vectorization in the radiation interactions.
55!
56! 4441 2020-03-04 19:20:35Z suehring
57! Removed wall_flags_static_0 from USE statements as it's not used within the module
58!
59! 4329 2019-12-10 15:46:36Z motisi
60! Renamed wall_flags_0 to wall_flags_static_0
61!
62! 4309 2019-11-26 18:49:59Z suehring
63! - Bugfix, include m_liq into restarts
64! - Remove unused arrays for liquid water and saturation moisture at vertical walls
65!
66! 4305 2019-11-25 11:15:40Z suehring
67! Revision of some indoor-model parameters
68!
69! 4259 2019-10-09 10:05:22Z suehring
70! Instead of terminate the job in case the relative wall fractions do not sum-up to one, give only
71! an informative message and normalize the fractions.
72!
73! 4258 2019-10-07 13:29:08Z suehring
74! - Add checks to ensure that relative fractions of walls, windowns and green surfaces sum-up to one.
75! - Revise message calls dealing with local checks.
76!
77! 4245 2019-09-30 08:40:37Z pavelkrc
78! Initialize explicit per-surface parameters from building_surface_pars
79!
80! 4238 2019-09-25 16:06:01Z suehring
81! Indoor-model parameters for some building types adjusted in order to avoid unrealistically high
82! indoor temperatures (S. Rissmann)
83!
84! 4230 2019-09-11 13:58:14Z suehring
85! Bugfix, initialize canopy resistance. Even if no green fraction is set, r_canopy must be
86! initialized for output purposes.
87!
88! 4227 2019-09-10 18:04:34Z gronemeier
89! Implement new palm_date_time_mod
90!
91! 4214 2019-09-02 15:57:02Z suehring
92! Bugfix, missing initialization and clearing of soil-moisture tendency (J.Resler)
93!
94! 4182 2019-08-22 15:20:23Z scharf
95! Corrected 'Former revisions' section
96!
97! 4168 2019-08-16 13:50:17Z suehring
98! Replace function get_topography_top_index by topo_top_ind
99!
100! 4148 2019-08-08 11:26:00Z suehring
101! - Add anthropogenic heat output factors for heating and cooling to building data base
102! - Move definition of building_pars to usm_init_arrays since it is already required in the indoor
103!   model
104!
105! 4127 2019-07-30 14:47:10Z suehring
106! Do not add anthopogenic energy during wall/soil spin-up (merge from branch resler)
107!
108! 4077 2019-07-09 13:27:11Z gronemeier
109! Set roughness length z0 and z0h/q at ground-floor level to same value as those above ground-floor
110! level
111!
112! 4051 2019-06-24 13:58:30Z suehring
113! Remove work-around for green surface fraction on buildings (do not set it zero)
114!
115! 4050 2019-06-24 13:57:27Z suehring
116! In order to avoid confusion with global control parameter, rename the USM-internal flag spinup
117! into during_spinup.
118!
119! 3987 2019-05-22 09:52:13Z kanani
120! Introduce alternative switch for debug output during timestepping
121!
122! 3943 2019-05-02 09:50:41Z maronga
123! Removed qsws_eb. Bugfix in calculation of qsws.
124!
125! 3933 2019-04-25 12:33:20Z kanani
126! Remove allocation of pt_2m, this is done in surface_mod now (surfaces%pt_2m)
127!
128! 3921 2019-04-18 14:21:10Z suehring
129! Undo accidentally commented initialization
130!
131! 3918 2019-04-18 13:33:11Z suehring
132! Set green fraction to zero also at vertical surfaces
133!
134! 3914 2019-04-17 16:02:02Z suehring
135! In order to obtain correct surface temperature during spinup set window fraction to zero
136! (only during spinup) instead of just disabling time-integration of window-surface temperature.
137!
138! 3901 2019-04-16 16:17:02Z suehring
139! Workaround - set green fraction to zero ( green-heat model crashes ).
140!
141! 3896 2019-04-15 10:10:17Z suehring
142!
143!
144! 3896 2019-04-15 10:10:17Z suehring
145! Bugfix, wrong index used for accessing building_pars from PIDS
146!
147! 3885 2019-04-11 11:29:34Z kanani
148! Changes related to global restructuring of location messages and introduction of additional debug
149! messages
150!
151! 3882 2019-04-10 11:08:06Z suehring
152! Avoid different type kinds
153! Move definition of building-surface properties from declaration block to an extra routine
154!
155! 3881 2019-04-10 09:31:22Z suehring
156! Revise determination of local ground-floor level height.
157! Make level 3 initalization conform with Palm-input-data standard
158! Move output of albedo and emissivity to radiation module
159!
160! 3832 2019-03-28 13:16:58Z raasch
161! Instrumented with openmp directives
162!
163! 3824 2019-03-27 15:56:16Z pavelkrc
164! Remove unused imports
165!
166!
167! 3814 2019-03-26 08:40:31Z pavelkrc
168! Unused subroutine commented out
169!
170! 3769 2019-02-28 10:16:49Z moh.hefny
171! Removed unused variables
172!
173! 3767 2019-02-27 08:18:02Z raasch
174! Unused variables removed from rrd-subroutines parameter list
175!
176! 3748 2019-02-18 10:38:31Z suehring
177! Revise conversion of waste-heat flux (do not divide by air density, will be done in diffusion_s)
178!
179! 3745 2019-02-15 18:57:56Z suehring
180! - Remove internal flag indoor_model (is a global control parameter)
181! - Add waste heat from buildings to the kinmatic heat flux
182! - Consider waste heat in restart data
183! - Remove unused USE statements
184!
185! 3744 2019-02-15 18:38:58Z suehring
186! Fixed surface heat capacity in the building parameters convert the file back to unix format
187!
188! 3730 2019-02-11 11:26:47Z moh.hefny
189! Formatting and clean-up (rvtils)
190!
191! 3710 2019-01-30 18:11:19Z suehring
192! Check if building type is set within a valid range.
193!
194! 3705 2019-01-29 19:56:39Z suehring
195! Make nzb_wall public, required for virtual-measurements
196!
197! 3704 2019-01-29 19:51:41Z suehring
198! Some interface calls moved to module_interface + cleanup
199!
200! 3655 2019-01-07 16:51:22Z knoop
201! Implementation of the PALM module interface
202!
203! 2007 2016-08-24 15:47:17Z kanani
204! Initial revision
205!
206!
207! Description:
208! ------------
209! 2016/6/9 - Initial version of the USM (Urban Surface Model)
210!            authors: Jaroslav Resler, Pavel Krc (Czech Technical University in Prague and Institute
211!            of Computer Science of the Czech Academy of Sciences, Prague)
212!            with contributions: Michal Belda, Nina Benesova, Ondrej Vlcek
213!            partly inspired by PALM LSM (B. Maronga)
214!            parameterizations of Ra checked with TUF3D (E. S. Krayenhoff)
215!> Module for Urban Surface Model (USM)
216!> The module includes:
217!>    1. Radiation model with direct/diffuse radiation, shading, reflections and integration with
218!>       plant canopy
219!>    2. Wall and wall surface model
220!>    3. Surface layer energy balance
221!>    4. Anthropogenic heat (only from transportation so far)
222!>    5. Necessary auxiliary subroutines (reading inputs, writing outputs, restart simulations, ...)
223!> It also makes use of standard radiation and integrates it into urban surface model.
224!>
225!> Further work:
226!> -------------
227!> @todo Output of _av variables in case of restarts
228!> @todo Revise flux conversion in energy-balance solver
229!> @todo Check divisions in wtend (etc.) calculations for possible division by zero, e.g. in case
230!> fraq(0,m) + fraq(1,m) = 0?!
231!> @todo Use unit 90 for OPEN/CLOSE of input files (FK)
232!> @todo Remove reading of old csv inputs
233!--------------------------------------------------------------------------------------------------!
234 MODULE urban_surface_mod
235
236    USE arrays_3d,                                                                                 &
237        ONLY:  exner,                                                                              &
238               hyp,                                                                                &
239               hyrho,                                                                              &
240               p,                                                                                  &
241               prr,                                                                                &
242               pt,                                                                                 &
243               q,                                                                                  &
244               ql,                                                                                 &
245               tend,                                                                               &
246               u,                                                                                  &
247               v,                                                                                  &
248               vpt,                                                                                &
249               w,                                                                                  &
250               zu
251
252    USE calc_mean_profile_mod,                                                                     &
253        ONLY:  calc_mean_profile
254
255    USE basic_constants_and_equations_mod,                                                         &
256        ONLY:  c_p,                                                                                &
257               g,                                                                                  &
258               kappa,                                                                              &
259               l_v,                                                                                &
260               pi,                                                                                 &
261               r_d,                                                                                &
262               rho_l,                                                                              &
263               sigma_sb
264
265    USE control_parameters,                                                                        &
266        ONLY:  average_count_3d,                                                                   &
267               coupling_char,                                                                      &
268               coupling_start_time,                                                                &
269               debug_output,                                                                       &
270               debug_output_timestep,                                                              &
271               debug_string,                                                                       &
272               dt_do3d,                                                                            &
273               dt_3d,                                                                              &
274               dz,                                                                                 &
275               end_time,                                                                           &
276               humidity,                                                                           &
277               indoor_model,                                                                       &
278               initializing_actions,                                                               &
279               intermediate_timestep_count,                                                        &
280               intermediate_timestep_count_max,                                                    &
281               io_blocks,                                                                          &
282               io_group,                                                                           &
283               large_scale_forcing,                                                                &
284               lsf_surf,                                                                           &
285               message_string,                                                                     &
286               pt_surface,                                                                         &
287               restart_data_format_output,                                                         &
288               simulated_time,                                                                     &
289               surface_pressure,                                                                   &
290               spinup_pt_mean,                                                                     &
291               spinup_time,                                                                        &
292               time_do3d,                                                                          &
293               time_since_reference_point,                                                         &
294               timestep_scheme,                                                                    &
295               topography,                                                                         &
296               tsc,                                                                                &
297               urban_surface,                                                                      &
298               varnamelength
299
300
301    USE bulk_cloud_model_mod,                                                                      &
302        ONLY:  bulk_cloud_model,                                                                   &
303               precipitation
304
305    USE cpulog,                                                                                    &
306        ONLY:  cpu_log,                                                                            &
307               log_point,                                                                          &
308               log_point_s
309
310    USE grid_variables,                                                                            &
311        ONLY:  ddx,                                                                                &
312               ddx2,                                                                               &
313               ddy,                                                                                &
314               ddy2,                                                                               &
315               dx,                                                                                 &
316               dy
317
318    USE indices,                                                                                   &
319        ONLY:  nbgp,                                                                               &
320               nnx,                                                                                &
321               nny,                                                                                &
322               nnz,                                                                                &
323               nx,                                                                                 &
324               nxl,                                                                                &
325               nxlg,                                                                               &
326               nxr,                                                                                &
327               nxrg,                                                                               &
328               ny,                                                                                 &
329               nyn,                                                                                &
330               nyng,                                                                               &
331               nys,                                                                                &
332               nysg,                                                                               &
333               nzb,                                                                                &
334               nzt,                                                                                &
335               topo_top_ind
336
337    USE, INTRINSIC :: iso_c_binding
338
339    USE kinds
340
341    USE palm_date_time_mod,                                                                        &
342        ONLY:  get_date_time,                                                                      &
343               seconds_per_hour
344
345    USE pegrid
346
347    USE radiation_model_mod,                                                                       &
348        ONLY:  albedo_type,                                                                        &
349               force_radiation_call,                                                               &
350               id,                                                                                 &
351               ieast_l,                                                                            &
352               ieast_u,                                                                            &
353               inorth_l,                                                                           &
354               inorth_u,                                                                           &
355               isouth_l,                                                                           &
356               isouth_u,                                                                           &
357               iup_l,                                                                              &
358               iup_u,                                                                              &
359               iwest_l,                                                                            &
360               iwest_u,                                                                            &
361               nz_urban_b,                                                                         &
362               nz_urban_t,                                                                         &
363               radiation_interaction,                                                              &
364               radiation,                                                                          &
365               rad_lw_in,                                                                          &
366               rad_lw_out,                                                                         &
367               rad_sw_in,                                                                          &
368               rad_sw_out,                                                                         &
369               unscheduled_radiation_calls
370
371    USE restart_data_mpi_io_mod,                                                                   &
372        ONLY:  rd_mpi_io_surface_filetypes,                                                        &
373               rrd_mpi_io,                                                                         &
374               rrd_mpi_io_surface,                                                                 &
375               wrd_mpi_io,                                                                         &
376               wrd_mpi_io_surface
377
378    USE statistics,                                                                                &
379        ONLY:  hom,                                                                                &
380               statistic_regions
381
382    USE surface_mod,                                                                               &
383        ONLY:  ind_pav_green,                                                                      &
384               ind_veg_wall,                                                                       &
385               ind_wat_win,                                                                        &
386               surf_usm_h,                                                                         &
387               surf_usm_v,                                                                         &
388               surface_restore_elements
389
390
391    IMPLICIT NONE
392
393!
394!-- USM model constants
395
396    REAL(wp), PARAMETER ::  b_ch               = 6.04_wp    !< Clapp & Hornberger exponent
397    REAL(wp), PARAMETER ::  lambda_h_green_dry = 0.19_wp    !< heat conductivity for dry soil
398    REAL(wp), PARAMETER ::  lambda_h_green_sm  = 3.44_wp    !< heat conductivity of the soil matrix
399    REAL(wp), PARAMETER ::  lambda_h_water     = 0.57_wp    !< heat conductivity of water
400    REAL(wp), PARAMETER ::  psi_sat            = -0.388_wp  !< soil matrix potential at saturation
401    REAL(wp), PARAMETER ::  rho_c_soil         = 2.19E6_wp  !< volumetric heat capacity of soil
402    REAL(wp), PARAMETER ::  rho_c_water        = 4.20E6_wp  !< volumetric heat capacity of water
403!    REAL(wp), PARAMETER ::  m_max_depth        = 0.0002_wp  !< Maximum capacity of the water reservoir (m)
404
405!
406!-- Soil parameters I           alpha_vg,      l_vg_green,    n_vg, gamma_w_green_sat
407    REAL(wp), DIMENSION(0:3,1:7), PARAMETER ::  soil_pars = RESHAPE( (/     &
408                                 3.83_wp,  1.250_wp, 1.38_wp,  6.94E-6_wp, &  !< soil 1
409                                 3.14_wp, -2.342_wp, 1.28_wp,  1.16E-6_wp, &  !< soil 2
410                                 0.83_wp, -0.588_wp, 1.25_wp,  0.26E-6_wp, &  !< soil 3
411                                 3.67_wp, -1.977_wp, 1.10_wp,  2.87E-6_wp, &  !< soil 4
412                                 2.65_wp,  2.500_wp, 1.10_wp,  1.74E-6_wp, &  !< soil 5
413                                 1.30_wp,  0.400_wp, 1.20_wp,  0.93E-6_wp, &  !< soil 6
414                                 0.00_wp,  0.00_wp,  0.00_wp,  0.57E-6_wp  &  !< soil 7
415                                 /), (/ 4, 7 /) )
416
417!
418!-- Soil parameters II              swc_sat,     fc,   wilt,    swc_res
419    REAL(wp), DIMENSION(0:3,1:7), PARAMETER ::  m_soil_pars = RESHAPE( (/ &
420                                 0.403_wp, 0.244_wp, 0.059_wp, 0.025_wp, &  !< soil 1
421                                 0.439_wp, 0.347_wp, 0.151_wp, 0.010_wp, &  !< soil 2
422                                 0.430_wp, 0.383_wp, 0.133_wp, 0.010_wp, &  !< soil 3
423                                 0.520_wp, 0.448_wp, 0.279_wp, 0.010_wp, &  !< soil 4
424                                 0.614_wp, 0.541_wp, 0.335_wp, 0.010_wp, &  !< soil 5
425                                 0.766_wp, 0.663_wp, 0.267_wp, 0.010_wp, &  !< soil 6
426                                 0.472_wp, 0.323_wp, 0.171_wp, 0.000_wp  &  !< soil 7
427                                 /), (/ 4, 7 /) )
428!
429!-- Value 9999999.9_wp -> Generic available or user-defined value must be set otherwise
430!-- -> No generic variable and user setting is optional
431    REAL(wp) ::  alpha_vangenuchten = 9999999.9_wp      !< NAMELIST alpha_vg
432    REAL(wp) ::  field_capacity = 9999999.9_wp          !< NAMELIST fc
433    REAL(wp) ::  hydraulic_conductivity = 9999999.9_wp  !< NAMELIST gamma_w_green_sat
434    REAL(wp) ::  l_vangenuchten = 9999999.9_wp          !< NAMELIST l_vg
435    REAL(wp) ::  n_vangenuchten = 9999999.9_wp          !< NAMELIST n_vg
436    REAL(wp) ::  residual_moisture = 9999999.9_wp       !< NAMELIST m_res
437    REAL(wp) ::  saturation_moisture = 9999999.9_wp     !< NAMELIST m_sat
438    REAL(wp) ::  wilting_point = 9999999.9_wp           !< NAMELIST m_wilt
439
440!
441!-- Configuration parameters (they can be setup in PALM config)
442    LOGICAL ::  force_radiation_call_l = .FALSE.   !< flag parameter for unscheduled radiation model calls
443    LOGICAL ::  read_wall_temp_3d = .FALSE.        !<
444    LOGICAL ::  usm_anthropogenic_heat = .FALSE.   !< flag parameter indicating wheather the anthropogenic heat sources
445                                                   !< (e.g.transportation) are used
446    LOGICAL ::  usm_material_model = .TRUE.        !< flag parameter indicating wheather the  model of heat in materials is used
447    LOGICAL ::  usm_wall_mod = .FALSE.             !< reduces conductivity of the first 2 wall layers by factor 0.1
448
449
450    INTEGER(iwp) ::  building_type = 1               !< default building type (preleminary setting)
451    INTEGER(iwp) ::  land_category = 2               !< default category for land surface
452    INTEGER(iwp) ::  pedestrian_category = 2         !< default category for wall surface in pedestrian zone
453    INTEGER(iwp) ::  roof_category = 2               !< default category for root surface
454    INTEGER(iwp) ::  wall_category = 2               !< default category for wall surface over pedestrian zone
455
456    REAL(wp)     ::  roughness_concrete = 0.001_wp   !< roughness length of average concrete surface
457
458!
459!-- Indices of input attributes in building_pars for (above) ground floor level
460    INTEGER(iwp) ::  ind_alb_wall_agfl     = 38   !< index in input list for albedo_type of wall above ground floor level
461    INTEGER(iwp) ::  ind_alb_wall_gfl      = 66   !< index in input list for albedo_type of wall ground floor level
462    INTEGER(iwp) ::  ind_alb_wall_r        = 101  !< index in input list for albedo_type of wall roof
463    INTEGER(iwp) ::  ind_alb_green_agfl    = 39   !< index in input list for albedo_type of green above ground floor level
464    INTEGER(iwp) ::  ind_alb_green_gfl     = 78   !< index in input list for albedo_type of green ground floor level
465    INTEGER(iwp) ::  ind_alb_green_r       = 117  !< index in input list for albedo_type of green roof
466    INTEGER(iwp) ::  ind_alb_win_agfl      = 40   !< index in input list for albedo_type of window fraction above ground floor
467                                                  !< level
468    INTEGER(iwp) ::  ind_alb_win_gfl       = 77   !< index in input list for albedo_type of window fraction ground floor level
469    INTEGER(iwp) ::  ind_alb_win_r         = 115  !< index in input list for albedo_type of window fraction roof
470    INTEGER(iwp) ::  ind_emis_wall_agfl    = 14   !< index in input list for wall emissivity, above ground floor level
471    INTEGER(iwp) ::  ind_emis_wall_gfl     = 32   !< index in input list for wall emissivity, ground floor level
472    INTEGER(iwp) ::  ind_emis_wall_r       = 100  !< index in input list for wall emissivity, roof
473    INTEGER(iwp) ::  ind_emis_green_agfl   = 15   !< index in input list for green emissivity, above ground floor level
474    INTEGER(iwp) ::  ind_emis_green_gfl    = 34   !< index in input list for green emissivity, ground floor level
475    INTEGER(iwp) ::  ind_emis_green_r      = 116  !< index in input list for green emissivity, roof
476    INTEGER(iwp) ::  ind_emis_win_agfl     = 16   !< index in input list for window emissivity, above ground floor level
477    INTEGER(iwp) ::  ind_emis_win_gfl      = 33   !< index in input list for window emissivity, ground floor level
478    INTEGER(iwp) ::  ind_emis_win_r        = 113  !< index in input list for window emissivity, roof
479    INTEGER(iwp) ::  ind_gflh              = 20   !< index in input list for ground floor level height
480    INTEGER(iwp) ::  ind_green_frac_w_agfl = 2    !< index in input list for green fraction on wall, above ground floor level
481    INTEGER(iwp) ::  ind_green_frac_w_gfl  = 23   !< index in input list for green fraction on wall, ground floor level
482    INTEGER(iwp) ::  ind_green_frac_r_agfl = 3    !< index in input list for green fraction on roof, above ground floor level
483    INTEGER(iwp) ::  ind_green_frac_r_gfl  = 24   !< index in input list for green fraction on roof, ground floor level
484    INTEGER(iwp) ::  ind_green_type_roof   = 118  !< index in input list for type of green roof
485    INTEGER(iwp) ::  ind_hc1_agfl          = 6    !< index in input list for heat capacity at first wall layer,
486                                                  !< above ground floor level
487    INTEGER(iwp) ::  ind_hc1_gfl           = 26   !< index in input list for heat capacity at first wall layer, ground floor level
488    INTEGER(iwp) ::  ind_hc1_wall_r        = 94   !< index in input list for heat capacity at first wall layer, roof
489    INTEGER(iwp) ::  ind_hc1_win_agfl      = 83   !< index in input list for heat capacity at first window layer,
490                                                  !< above ground floor level
491    INTEGER(iwp) ::  ind_hc1_win_gfl       = 71   !< index in input list for heat capacity at first window layer,
492                                                  !< ground floor level
493    INTEGER(iwp) ::  ind_hc1_win_r         = 107  !< index in input list for heat capacity at first window layer, roof
494    INTEGER(iwp) ::  ind_hc2_agfl          = 7    !< index in input list for heat capacity at second wall layer,
495                                                  !< above ground floor level
496    INTEGER(iwp) ::  ind_hc2_gfl           = 27   !< index in input list for heat capacity at second wall layer, ground floor level
497    INTEGER(iwp) ::  ind_hc2_wall_r        = 95   !< index in input list for heat capacity at second wall layer, roof
498    INTEGER(iwp) ::  ind_hc2_win_agfl      = 84   !< index in input list for heat capacity at second window layer,
499                                                  !< above ground floor level
500    INTEGER(iwp) ::  ind_hc2_win_gfl       = 72   !< index in input list for heat capacity at second window layer,
501                                                  !< ground floor level
502    INTEGER(iwp) ::  ind_hc2_win_r         = 108  !< index in input list for heat capacity at second window layer, roof
503    INTEGER(iwp) ::  ind_hc3_agfl          = 8    !< index in input list for heat capacity at third wall layer,
504                                                  !< above ground floor level
505    INTEGER(iwp) ::  ind_hc3_gfl           = 28   !< index in input list for heat capacity at third wall layer, ground floor level
506    INTEGER(iwp) ::  ind_hc3_wall_r        = 96   !< index in input list for heat capacity at third wall layer, roof
507    INTEGER(iwp) ::  ind_hc3_win_agfl      = 85   !< index in input list for heat capacity at third window layer,
508                                                  !< above ground floor level
509    INTEGER(iwp) ::  ind_hc3_win_gfl       = 73   !< index in input list for heat capacity at third window layer,
510                                                  !< ground floor level
511    INTEGER(iwp) ::  ind_hc3_win_r         = 109  !< index in input list for heat capacity at third window layer, roof
512    INTEGER(iwp) ::  ind_indoor_target_temp_summer = 12  !<
513    INTEGER(iwp) ::  ind_indoor_target_temp_winter = 13  !<
514    INTEGER(iwp) ::  ind_lai_r_agfl        = 4    !< index in input list for LAI on roof, above ground floor level
515    INTEGER(iwp) ::  ind_lai_r_gfl         = 4    !< index in input list for LAI on roof, ground floor level
516    INTEGER(iwp) ::  ind_lai_w_agfl        = 5    !< index in input list for LAI on wall, above ground floor level
517    INTEGER(iwp) ::  ind_lai_w_gfl         = 25   !< index in input list for LAI on wall, ground floor level
518    INTEGER(iwp) ::  ind_tc1_agfl          = 9    !< index in input list for thermal conductivity at first wall layer,
519                                                  !< above ground floor level
520    INTEGER(iwp) ::  ind_tc1_gfl           = 29   !< index in input list for thermal conductivity at first wall layer,
521                                                  !< ground floor level
522    INTEGER(iwp) ::  ind_tc1_wall_r        = 97   !< index in input list for thermal conductivity at first wall layer, roof
523    INTEGER(iwp) ::  ind_tc1_win_agfl      = 86   !< index in input list for thermal conductivity at first window layer,
524                                                  !< above ground floor level
525    INTEGER(iwp) ::  ind_tc1_win_gfl       = 74   !< index in input list for thermal conductivity at first window layer,
526                                                  !< ground floor level
527    INTEGER(iwp) ::  ind_tc1_win_r         = 110  !< index in input list for thermal conductivity at first window layer, roof
528    INTEGER(iwp) ::  ind_tc2_agfl          = 10   !< index in input list for thermal conductivity at second wall layer,
529                                                  !< above ground floor level
530    INTEGER(iwp) ::  ind_tc2_gfl           = 30   !< index in input list for thermal conductivity at second wall layer,
531                                                  !< ground floor level
532    INTEGER(iwp) ::  ind_tc2_wall_r        = 98   !< index in input list for thermal conductivity at second wall layer, roof
533    INTEGER(iwp) ::  ind_tc2_win_agfl      = 87   !< index in input list for thermal conductivity at second window layer,
534                                                  !< above ground floor level
535    INTEGER(iwp) ::  ind_tc2_win_gfl       = 75   !< index in input list for thermal conductivity at second window layer,
536                                                  !< ground floor level
537    INTEGER(iwp) ::  ind_tc2_win_r         = 111  !< index in input list for thermal conductivity at second window layer,
538                                                  !< ground floor level
539    INTEGER(iwp) ::  ind_tc3_agfl          = 11   !< index in input list for thermal conductivity at third wall layer,
540                                                  !< above ground floor level
541    INTEGER(iwp) ::  ind_tc3_gfl           = 31   !< index in input list for thermal conductivity at third wall layer,
542                                                  !< ground floor level
543    INTEGER(iwp) ::  ind_tc3_wall_r        = 99   !< index in input list for thermal conductivity at third wall layer, roof
544    INTEGER(iwp) ::  ind_tc3_win_agfl      = 88   !< index in input list for thermal conductivity at third window layer,
545                                                  !< above ground floor level
546    INTEGER(iwp) ::  ind_tc3_win_gfl       = 76   !< index in input list for thermal conductivity at third window layer,
547                                                  !< ground floor level
548    INTEGER(iwp) ::  ind_tc3_win_r         = 112  !< index in input list for thermal conductivity at third window layer, roof
549    INTEGER(iwp) ::  ind_thick_1_agfl      = 41   !< index for wall layer thickness - 1st layer above ground floor level
550    INTEGER(iwp) ::  ind_thick_1_gfl       = 62   !< index for wall layer thickness - 1st layer ground floor level
551    INTEGER(iwp) ::  ind_thick_1_wall_r    = 90   !< index for wall layer thickness - 1st layer roof
552    INTEGER(iwp) ::  ind_thick_1_win_agfl  = 79   !< index for window layer thickness - 1st layer above ground floor level
553    INTEGER(iwp) ::  ind_thick_1_win_gfl   = 67   !< index for window layer thickness - 1st layer ground floor level
554    INTEGER(iwp) ::  ind_thick_1_win_r     = 103  !< index for window layer thickness - 1st layer roof
555    INTEGER(iwp) ::  ind_thick_2_agfl      = 42   !< index for wall layer thickness - 2nd layer above ground floor level
556    INTEGER(iwp) ::  ind_thick_2_gfl       = 63   !< index for wall layer thickness - 2nd layer ground floor level
557    INTEGER(iwp) ::  ind_thick_2_wall_r    = 91   !< index for wall layer thickness - 2nd layer roof
558    INTEGER(iwp) ::  ind_thick_2_win_agfl  = 80   !< index for window layer thickness - 2nd layer above ground floor level
559    INTEGER(iwp) ::  ind_thick_2_win_gfl   = 68   !< index for window layer thickness - 2nd layer ground floor level
560    INTEGER(iwp) ::  ind_thick_2_win_r     = 104  !< index for window layer thickness - 2nd layer roof
561    INTEGER(iwp) ::  ind_thick_3_agfl      = 43   !< index for wall layer thickness - 3rd layer above ground floor level
562    INTEGER(iwp) ::  ind_thick_3_gfl       = 64   !< index for wall layer thickness - 3rd layer ground floor level
563    INTEGER(iwp) ::  ind_thick_3_wall_r    = 92   !< index for wall layer thickness - 3rd layer roof
564    INTEGER(iwp) ::  ind_thick_3_win_agfl  = 81   !< index for window layer thickness - 3rd layer above ground floor level
565    INTEGER(iwp) ::  ind_thick_3_win_gfl   = 69   !< index for window layer thickness - 3rd layer ground floor level
566    INTEGER(iwp) ::  ind_thick_3_win_r     = 105  !< index for window layer thickness - 3rd layer roof
567    INTEGER(iwp) ::  ind_thick_4_agfl      = 44   !< index for wall layer thickness - 4th layer above ground floor level
568    INTEGER(iwp) ::  ind_thick_4_gfl       = 65   !< index for wall layer thickness - 4th layer ground floor level
569    INTEGER(iwp) ::  ind_thick_4_wall_r    = 93   !< index for wall layer thickness - 4st layer roof
570    INTEGER(iwp) ::  ind_thick_4_win_agfl  = 82   !< index for window layer thickness - 4th layer above ground floor level
571    INTEGER(iwp) ::  ind_thick_4_win_gfl   = 70   !< index for window layer thickness - 4th layer ground floor level
572    INTEGER(iwp) ::  ind_thick_4_win_r     = 106  !< index for window layer thickness - 4th layer roof
573    INTEGER(iwp) ::  ind_trans_agfl        = 17   !< index in input list for window transmissivity, above ground floor level
574    INTEGER(iwp) ::  ind_trans_gfl         = 35   !< index in input list for window transmissivity, ground floor level
575    INTEGER(iwp) ::  ind_trans_r           = 114  !< index in input list for window transmissivity, roof
576    INTEGER(iwp) ::  ind_wall_frac_agfl    = 0    !< index in input list for wall fraction, above ground floor level
577    INTEGER(iwp) ::  ind_wall_frac_gfl     = 21   !< index in input list for wall fraction, ground floor level
578    INTEGER(iwp) ::  ind_wall_frac_r       = 89   !< index in input list for wall fraction, roof
579    INTEGER(iwp) ::  ind_win_frac_agfl     = 1    !< index in input list for window fraction, above ground floor level
580    INTEGER(iwp) ::  ind_win_frac_gfl      = 22   !< index in input list for window fraction, ground floor level
581    INTEGER(iwp) ::  ind_win_frac_r        = 102  !< index in input list for window fraction, roof
582    INTEGER(iwp) ::  ind_z0_agfl           = 18   !< index in input list for z0, above ground floor level
583    INTEGER(iwp) ::  ind_z0_gfl            = 36   !< index in input list for z0, ground floor level
584    INTEGER(iwp) ::  ind_z0qh_agfl         = 19   !< index in input list for z0h / z0q, above ground floor level
585    INTEGER(iwp) ::  ind_z0qh_gfl          = 37   !< index in input list for z0h / z0q, ground floor level
586!
587!-- Indices of input attributes in building_surface_pars (except for radiation-related, which are in
588!-- radiation_model_mod)
589    CHARACTER(37), DIMENSION(0:7), PARAMETER ::  building_type_name = (/     &
590                                   'user-defined                         ', &  !< type 0
591                                   'residential - 1950                   ', &  !< type  1
592                                   'residential 1951 - 2000              ', &  !< type  2
593                                   'residential 2001 -                   ', &  !< type  3
594                                   'office - 1950                        ', &  !< type  4
595                                   'office 1951 - 2000                   ', &  !< type  5
596                                   'office 2001 -                        ', &  !< type  6
597                                   'bridges                              '  &  !< type  7
598                                                                     /)
599
600    INTEGER(iwp) ::  ind_s_emis_green                = 14  !< index for emissivity of green fraction (0-1)
601    INTEGER(iwp) ::  ind_s_emis_wall                 = 13  !< index for emissivity of wall fraction (0-1)
602    INTEGER(iwp) ::  ind_s_emis_win                  = 15  !< index for emissivity o f window fraction (0-1)
603    INTEGER(iwp) ::  ind_s_green_frac_r              = 3   !< index for green fraction on roof (0-1)
604    INTEGER(iwp) ::  ind_s_green_frac_w              = 2   !< index for green fraction on wall (0-1)
605    INTEGER(iwp) ::  ind_s_hc1                       = 5   !< index for heat capacity of wall layer 1
606    INTEGER(iwp) ::  ind_s_hc2                       = 6   !< index for heat capacity of wall layer 2
607    INTEGER(iwp) ::  ind_s_hc3                       = 7   !< index for heat capacity of wall layer 3
608    INTEGER(iwp) ::  ind_s_indoor_target_temp_summer = 11  !< index for indoor target summer temperature
609    INTEGER(iwp) ::  ind_s_indoor_target_temp_winter = 12  !< index for indoor target winter temperature
610    INTEGER(iwp) ::  ind_s_lai_r                     = 4   !< index for leaf area index of green fraction
611    INTEGER(iwp) ::  ind_s_tc1                       = 8   !< index for thermal conducivity of wall layer 1
612    INTEGER(iwp) ::  ind_s_tc2                       = 9   !< index for thermal conducivity of wall layer 2
613    INTEGER(iwp) ::  ind_s_tc3                       = 10  !< index for thermal conducivity of wall layer 3
614    INTEGER(iwp) ::  ind_s_trans                     = 16  !< index for transmissivity of window fraction (0-1)
615    INTEGER(iwp) ::  ind_s_wall_frac                 = 0   !< index for wall fraction (0-1)
616    INTEGER(iwp) ::  ind_s_win_frac                  = 1   !< index for window fraction (0-1)
617    INTEGER(iwp) ::  ind_s_z0                        = 17  !< index for roughness length for momentum (m)
618    INTEGER(iwp) ::  ind_s_z0qh                      = 18  !< index for roughness length for heat (m)
619
620    REAL(wp)  ::  ground_floor_level = 4.0_wp  !< default ground floor level
621    REAL(wp)  ::  roof_height_limit  = 4.0_wp  !< height to distinguish between land surfaces and roofs
622
623
624!
625!-- Building facade/wall/green/window properties (partly according to PIDS).
626!-- Initialization of building_pars is outsourced to usm_init_pars. This is needed because of the
627!-- huge number of attributes given in building_pars (>700), while intel and gfortran compiler have
628!-- hard limit of continuation lines of 511.
629    REAL(wp), DIMENSION(0:135,1:7) ::  building_pars  !<
630!
631!-- Type for surface temperatures at vertical walls. Is not necessary for horizontal walls.
632    TYPE t_surf_vertical
633       REAL(wp), DIMENSION(:), ALLOCATABLE         ::  t  !<
634    END TYPE t_surf_vertical
635!
636!-- Type for wall temperatures at vertical walls. Is not necessary for horizontal walls.
637    TYPE t_wall_vertical
638       REAL(wp), DIMENSION(:,:), ALLOCATABLE       ::  t  !<
639    END TYPE t_wall_vertical
640
641    TYPE surf_type_usm
642       REAL(wp), DIMENSION(:),   ALLOCATABLE ::  var_usm_1d  !< 1D prognostic variable
643       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  var_usm_2d  !< 2D prognostic variable
644    END TYPE surf_type_usm
645
646    TYPE(surf_type_usm), POINTER  ::  m_liq_usm_h    !< liquid water reservoir (m), horizontal surface elements
647    TYPE(surf_type_usm), POINTER  ::  m_liq_usm_h_p  !< progn. liquid water reservoir (m), horizontal surface elements
648
649    TYPE(surf_type_usm), TARGET   ::  m_liq_usm_h_1  !<
650    TYPE(surf_type_usm), TARGET   ::  m_liq_usm_h_2  !<
651
652    TYPE(surf_type_usm), TARGET   ::  tm_liq_usm_h_m  !< liquid water reservoir tendency (m), horizontal surface elements
653!
654!-- Anthropogenic heat sources
655    INTEGER(iwp)                                   ::  naheatlayers = 1  !< number of layers of anthropogenic heat
656
657    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE        ::  aheat             !< daily average of anthropogenic heat (W/m2)
658    REAL(wp), DIMENSION(:,:), ALLOCATABLE          ::  aheatprof         !< diurnal profiles of anthropogenic heat
659                                                                         !< for particular layers
660
661!
662!-- Wall surface model
663!-- Wall surface model constants
664    INTEGER(iwp), PARAMETER                        ::  nzb_wall = 0  !< inner side of the wall model (to be switched)
665    INTEGER(iwp), PARAMETER                        ::  nzt_wall = 3  !< outer side of the wall model (to be switched)
666    INTEGER(iwp), PARAMETER                        ::  nzw      = 4  !< number of wall layers (fixed for now)
667
668    INTEGER(iwp)                                   ::  soil_type     !<
669
670
671    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         ::  zwn_default        = (/0.0242_wp, 0.0969_wp, 0.346_wp, 1.0_wp /)
672    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         ::  zwn_default_green  = (/0.25_wp,   0.5_wp,    0.75_wp,  1.0_wp /)
673                                                                          !< normalized soil, wall and roof, window and
674                                                                          !< green layer depths (m/m)
675    REAL(wp), DIMENSION(nzb_wall:nzt_wall)         ::  zwn_default_window = (/0.25_wp,   0.5_wp,    0.75_wp,  1.0_wp /)
676
677
678    REAL(wp)  ::  m_total                  = 0.0_wp    !< weighted total water content of the soil (m3/m3)
679    REAL(wp)  ::  roof_inner_temperature   = 295.0_wp  !< temperature of the inner roof
680                                                       !< surface (~22 degrees C) (K)
681    REAL(wp)  ::  soil_inner_temperature   = 288.0_wp  !< temperature of the deep soil
682                                                       !< (~15 degrees C) (K)
683    REAL(wp)  ::  wall_inner_temperature   = 295.0_wp  !< temperature of the inner wall
684                                                       !< surface (~22 degrees C) (K)
685    REAL(wp)  ::  window_inner_temperature = 295.0_wp  !< temperature of the inner window
686                                                       !< surface (~22 degrees C) (K)
687
688!
689!-- Surface and material model variables for walls, ground, roofs
690    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  zwn                 !< normalized wall layer depths (m)
691    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  zwn_green           !< normalized green layer depths (m)
692    REAL(wp), DIMENSION(:), ALLOCATABLE            ::  zwn_window          !< normalized window layer depths (m)
693
694    REAL(wp), DIMENSION(:), POINTER                ::  t_surf_green_h      !<
695    REAL(wp), DIMENSION(:), POINTER                ::  t_surf_green_h_p    !<
696    REAL(wp), DIMENSION(:), POINTER                ::  t_surf_wall_h       !<
697    REAL(wp), DIMENSION(:), POINTER                ::  t_surf_wall_h_p     !<
698    REAL(wp), DIMENSION(:), POINTER                ::  t_surf_window_h     !<
699    REAL(wp), DIMENSION(:), POINTER                ::  t_surf_window_h_p   !<
700
701    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    ::  t_surf_green_h_1    !<
702    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    ::  t_surf_green_h_2    !<
703    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    ::  t_surf_wall_h_1     !<
704    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    ::  t_surf_wall_h_2     !<
705    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    ::  t_surf_window_h_1   !<
706    REAL(wp), DIMENSION(:), ALLOCATABLE, TARGET    ::  t_surf_window_h_2   !<
707
708    TYPE(t_surf_vertical), DIMENSION(:), POINTER   ::  t_surf_green_v      !<
709    TYPE(t_surf_vertical), DIMENSION(:), POINTER   ::  t_surf_green_v_p    !<
710    TYPE(t_surf_vertical), DIMENSION(:), POINTER   ::  t_surf_wall_v       !<
711    TYPE(t_surf_vertical), DIMENSION(:), POINTER   ::  t_surf_wall_v_p     !<
712    TYPE(t_surf_vertical), DIMENSION(:), POINTER   ::  t_surf_window_v     !<
713    TYPE(t_surf_vertical), DIMENSION(:), POINTER   ::  t_surf_window_v_p   !<
714
715    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_green_v_1    !<
716    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_green_v_2    !<
717    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_wall_v_1     !<
718    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_wall_v_2     !<
719    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_window_v_1   !<
720    TYPE(t_surf_vertical), DIMENSION(0:3), TARGET  ::  t_surf_window_v_2   !<
721
722!
723!-- Energy balance variables
724!-- Parameters of the land, roof and wall surfaces
725    REAL(wp), DIMENSION(:,:), POINTER                ::  fc_h          !<
726    REAL(wp), DIMENSION(:,:), POINTER                ::  rootfr_h      !<
727    REAL(wp), DIMENSION(:,:), POINTER                ::  swc_h         !<
728    REAL(wp), DIMENSION(:,:), POINTER                ::  swc_h_p       !<
729    REAL(wp), DIMENSION(:,:), POINTER                ::  swc_res_h     !<
730    REAL(wp), DIMENSION(:,:), POINTER                ::  swc_sat_h     !<
731    REAL(wp), DIMENSION(:,:), POINTER                ::  t_green_h     !<
732    REAL(wp), DIMENSION(:,:), POINTER                ::  t_green_h_p   !<
733    REAL(wp), DIMENSION(:,:), POINTER                ::  t_wall_h      !<
734    REAL(wp), DIMENSION(:,:), POINTER                ::  t_wall_h_p    !<
735    REAL(wp), DIMENSION(:,:), POINTER                ::  wilt_h        !<
736    REAL(wp), DIMENSION(:,:), POINTER                ::  t_window_h    !<
737    REAL(wp), DIMENSION(:,:), POINTER                ::  t_window_h_p  !<
738
739
740    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  fc_h_1        !<
741    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  rootfr_h_1    !<
742    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  swc_h_1       !<
743    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  swc_h_2       !<
744    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  swc_res_h_1   !<
745    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  swc_sat_h_1   !<
746    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  t_green_h_1   !<
747    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  t_green_h_2   !<
748    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  t_wall_h_1    !<
749    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  t_wall_h_2    !<
750    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  wilt_h_1      !<
751    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  t_window_h_1  !<
752    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET    ::  t_window_h_2  !<
753
754
755    TYPE(t_wall_vertical), DIMENSION(:), POINTER   ::  t_green_v     !<
756    TYPE(t_wall_vertical), DIMENSION(:), POINTER   ::  t_green_v_p   !<
757    TYPE(t_wall_vertical), DIMENSION(:), POINTER   ::  t_wall_v      !<
758    TYPE(t_wall_vertical), DIMENSION(:), POINTER   ::  t_wall_v_p    !<
759    TYPE(t_wall_vertical), DIMENSION(:), POINTER   ::  t_window_v    !<
760    TYPE(t_wall_vertical), DIMENSION(:), POINTER   ::  t_window_v_p  !<
761
762
763    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  ::  t_green_v_1   !<
764    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  ::  t_green_v_2   !<
765    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  ::  t_wall_v_1    !<
766    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  ::  t_wall_v_2    !<
767    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  ::  t_window_v_1  !<
768    TYPE(t_wall_vertical), DIMENSION(0:3), TARGET  ::  t_window_v_2  !<
769
770!
771!-- Surface and material parameter classes (surface_type)
772!-- Albedo, emissivity, lambda_surf, roughness, thickness, volumetric heat capacity, thermal conductivity
773    CHARACTER(12), DIMENSION(:), ALLOCATABLE  ::  surface_type_names    !< names of wall types (used only for reports)
774
775    INTEGER(iwp)                              ::  n_surface_types       !< number of the wall type categories
776
777    INTEGER(iwp), PARAMETER                   ::  ialbedo  = 1          !< albedo of the surface
778    INTEGER(iwp), PARAMETER                   ::  icsurf   = 6          !< Surface skin layer heat capacity (J m-2 K-1 )
779    INTEGER(iwp), PARAMETER                   ::  iemiss   = 2          !< emissivity of the surface
780    INTEGER(iwp), PARAMETER                   ::  ilambdah = 9          !< thermal conductivity lambda H
781                                                                        !< of the wall (W m-1 K-1 )
782    INTEGER(iwp), PARAMETER                   ::  ilambdas = 3          !< heat conductivity lambda S between surface
783                                                                        !< and material ( W m-2 K-1 )
784    INTEGER(iwp), PARAMETER                   ::  irhoC    = 8          !< volumetric heat capacity rho*C of
785                                                                        !< the material ( J m-3 K-1 )
786    INTEGER(iwp), PARAMETER                   ::  irough   = 4          !< roughness length z0 for movements
787    INTEGER(iwp), PARAMETER                   ::  iroughh  = 5          !< roughness length z0h for scalars
788                                                                        !< (heat, humidity,...)
789    INTEGER(iwp), PARAMETER                   ::  ithick   = 7          !< thickness of the surface (wall, roof, land) (m)
790    INTEGER(iwp), PARAMETER                   ::  n_surface_params = 9  !< number of parameters for each type of the wall
791
792
793    INTEGER(iwp), DIMENSION(:), ALLOCATABLE   ::  surface_type_codes    !< codes of wall types
794
795
796    REAL(wp), DIMENSION(:,:), ALLOCATABLE     ::  surface_params        !< parameters of wall types
797
798!
799!-- Interfaces of subroutines accessed from outside of this module
800    INTERFACE usm_3d_data_averaging
801       MODULE PROCEDURE usm_3d_data_averaging
802    END INTERFACE usm_3d_data_averaging
803
804    INTERFACE usm_boundary_condition
805       MODULE PROCEDURE usm_boundary_condition
806    END INTERFACE usm_boundary_condition
807
808    INTERFACE usm_check_data_output
809       MODULE PROCEDURE usm_check_data_output
810    END INTERFACE usm_check_data_output
811
812    INTERFACE usm_check_parameters
813       MODULE PROCEDURE usm_check_parameters
814    END INTERFACE usm_check_parameters
815
816    INTERFACE usm_data_output_3d
817       MODULE PROCEDURE usm_data_output_3d
818    END INTERFACE usm_data_output_3d
819
820    INTERFACE usm_define_netcdf_grid
821       MODULE PROCEDURE usm_define_netcdf_grid
822    END INTERFACE usm_define_netcdf_grid
823
824    INTERFACE usm_init
825       MODULE PROCEDURE usm_init
826    END INTERFACE usm_init
827
828    INTERFACE usm_init_arrays
829       MODULE PROCEDURE usm_init_arrays
830    END INTERFACE usm_init_arrays
831
832    INTERFACE usm_material_heat_model
833       MODULE PROCEDURE usm_material_heat_model
834    END INTERFACE usm_material_heat_model
835
836    INTERFACE usm_green_heat_model
837       MODULE PROCEDURE usm_green_heat_model
838    END INTERFACE usm_green_heat_model
839
840    INTERFACE usm_parin
841       MODULE PROCEDURE usm_parin
842    END INTERFACE usm_parin
843
844    INTERFACE usm_rrd_local
845       MODULE PROCEDURE usm_rrd_local_ftn
846       MODULE PROCEDURE usm_rrd_local_mpi
847    END INTERFACE usm_rrd_local
848
849    INTERFACE usm_surface_energy_balance
850       MODULE PROCEDURE usm_surface_energy_balance
851    END INTERFACE usm_surface_energy_balance
852
853    INTERFACE usm_swap_timelevel
854       MODULE PROCEDURE usm_swap_timelevel
855    END INTERFACE usm_swap_timelevel
856
857    INTERFACE usm_wrd_local
858       MODULE PROCEDURE usm_wrd_local
859    END INTERFACE usm_wrd_local
860
861
862    SAVE
863
864    PRIVATE
865
866!
867!-- Public functions
868    PUBLIC usm_boundary_condition,                                                                 &
869           usm_check_data_output,                                                                  &
870           usm_check_parameters,                                                                   &
871           usm_data_output_3d,                                                                     &
872           usm_define_netcdf_grid,                                                                 &
873           usm_init,                                                                               &
874           usm_init_arrays,                                                                        &
875           usm_material_heat_model,                                                                &
876           usm_parin,                                                                              &
877           usm_rrd_local,                                                                          &
878           usm_surface_energy_balance,                                                             &
879           usm_swap_timelevel,                                                                     &
880           usm_wrd_local,                                                                          &
881           usm_3d_data_averaging
882
883!
884!-- Public parameters, constants and initial values
885    PUBLIC building_type,                                                                          &
886           building_pars,                                                                          &
887           nzb_wall,                                                                               &
888           nzt_wall,                                                                               &
889           t_wall_h,                                                                               &
890           t_wall_v,                                                                               &
891           t_window_h,                                                                             &
892           t_window_v,                                                                             &
893           usm_anthropogenic_heat,                                                                 &
894           usm_green_heat_model,                                                                   &
895           usm_material_model,                                                                     &
896           usm_wall_mod
897
898
899
900
901
902
903 CONTAINS
904
905!--------------------------------------------------------------------------------------------------!
906! Description:
907! ------------
908!> This subroutine creates the necessary indices of the urban surfaces and plant canopy and it
909!> allocates the needed arrays for USM
910!--------------------------------------------------------------------------------------------------!
911 SUBROUTINE usm_init_arrays
912
913    IMPLICIT NONE
914
915    INTEGER(iwp) ::  l  !<
916
917    IF ( debug_output )  CALL debug_message( 'usm_init_arrays', 'start' )
918
919!
920!-- Allocate radiation arrays which are part of the new data type.
921!-- For horizontal surfaces.
922    ALLOCATE ( surf_usm_h%surfhf(1:surf_usm_h%ns)    )
923    ALLOCATE ( surf_usm_h%rad_net_l(1:surf_usm_h%ns) )
924!
925!-- For vertical surfaces
926    DO  l = 0, 3
927       ALLOCATE ( surf_usm_v(l)%surfhf(1:surf_usm_v(l)%ns)    )
928       ALLOCATE ( surf_usm_v(l)%rad_net_l(1:surf_usm_v(l)%ns) )
929    ENDDO
930
931!
932!-- Wall surface model
933!-- Allocate arrays for wall surface model and define pointers
934!-- Allocate array of wall types and wall parameters
935    ALLOCATE ( surf_usm_h%surface_types(1:surf_usm_h%ns)      )
936    ALLOCATE ( surf_usm_h%building_type(1:surf_usm_h%ns)      )
937    ALLOCATE ( surf_usm_h%building_type_name(1:surf_usm_h%ns) )
938    surf_usm_h%building_type      = 0
939    surf_usm_h%building_type_name = 'none'
940    DO  l = 0, 3
941       ALLOCATE ( surf_usm_v(l)%surface_types(1:surf_usm_v(l)%ns)      )
942       ALLOCATE ( surf_usm_v(l)%building_type(1:surf_usm_v(l)%ns)      )
943       ALLOCATE ( surf_usm_v(l)%building_type_name(1:surf_usm_v(l)%ns) )
944       surf_usm_v(l)%building_type      = 0
945       surf_usm_v(l)%building_type_name = 'none'
946    ENDDO
947!
948!-- Allocate albedo_type and albedo. Each surface element has 3 values, 0: wall fraction,
949!-- 1: green fraction, 2: window fraction.
950    ALLOCATE ( surf_usm_h%albedo_type(1:surf_usm_h%ns,0:2) )
951    ALLOCATE ( surf_usm_h%albedo(1:surf_usm_h%ns,0:2)      )
952    surf_usm_h%albedo_type = albedo_type
953    DO  l = 0, 3
954       ALLOCATE ( surf_usm_v(l)%albedo_type(1:surf_usm_v(l)%ns,0:2) )
955       ALLOCATE ( surf_usm_v(l)%albedo(1:surf_usm_v(l)%ns,0:2)      )
956       surf_usm_v(l)%albedo_type = albedo_type
957    ENDDO
958
959!
960!-- Allocate indoor target temperature for summer and winter
961    ALLOCATE ( surf_usm_h%target_temp_summer(1:surf_usm_h%ns) )
962    ALLOCATE ( surf_usm_h%target_temp_winter(1:surf_usm_h%ns) )
963    DO  l = 0, 3
964       ALLOCATE ( surf_usm_v(l)%target_temp_summer(1:surf_usm_v(l)%ns) )
965       ALLOCATE ( surf_usm_v(l)%target_temp_winter(1:surf_usm_v(l)%ns) )
966    ENDDO
967!
968!-- In case the indoor model is applied, allocate memory for waste heat and indoor temperature.
969    IF ( indoor_model )  THEN
970       ALLOCATE ( surf_usm_h%waste_heat(1:surf_usm_h%ns) )
971       surf_usm_h%waste_heat = 0.0_wp
972       DO  l = 0, 3
973          ALLOCATE ( surf_usm_v(l)%waste_heat(1:surf_usm_v(l)%ns) )
974          surf_usm_v(l)%waste_heat = 0.0_wp
975       ENDDO
976    ENDIF
977!
978!-- Allocate flag indicating ground floor level surface elements
979    ALLOCATE ( surf_usm_h%ground_level(1:surf_usm_h%ns) )
980    DO  l = 0, 3
981       ALLOCATE ( surf_usm_v(l)%ground_level(1:surf_usm_v(l)%ns) )
982    ENDDO
983!
984!--  Allocate arrays for relative surface fraction.
985!--  0 - wall fraction, 1 - green fraction, 2 - window fraction
986     ALLOCATE ( surf_usm_h%frac(1:surf_usm_h%ns,0:2) )
987     surf_usm_h%frac = 0.0_wp
988     DO  l = 0, 3
989        ALLOCATE ( surf_usm_v(l)%frac(1:surf_usm_v(l)%ns,0:2) )
990        surf_usm_v(l)%frac = 0.0_wp
991     ENDDO
992
993!
994!-- Wall and roof surface parameters. First for horizontal surfaces
995    ALLOCATE ( surf_usm_h%isroof_surf(1:surf_usm_h%ns)        )
996    ALLOCATE ( surf_usm_h%lambda_surf(1:surf_usm_h%ns)        )
997    ALLOCATE ( surf_usm_h%lambda_surf_window(1:surf_usm_h%ns) )
998    ALLOCATE ( surf_usm_h%lambda_surf_green(1:surf_usm_h%ns)  )
999    ALLOCATE ( surf_usm_h%c_surface(1:surf_usm_h%ns)          )
1000    ALLOCATE ( surf_usm_h%c_surface_window(1:surf_usm_h%ns)   )
1001    ALLOCATE ( surf_usm_h%c_surface_green(1:surf_usm_h%ns)    )
1002    ALLOCATE ( surf_usm_h%transmissivity(1:surf_usm_h%ns)     )
1003    ALLOCATE ( surf_usm_h%lai(1:surf_usm_h%ns)                )
1004    ALLOCATE ( surf_usm_h%emissivity(1:surf_usm_h%ns,0:2)     )
1005    ALLOCATE ( surf_usm_h%r_a(1:surf_usm_h%ns)                )
1006    ALLOCATE ( surf_usm_h%r_a_green(1:surf_usm_h%ns)          )
1007    ALLOCATE ( surf_usm_h%r_a_window(1:surf_usm_h%ns)         )
1008    ALLOCATE ( surf_usm_h%green_type_roof(1:surf_usm_h%ns)    )
1009    ALLOCATE ( surf_usm_h%r_s(1:surf_usm_h%ns)                )
1010
1011!
1012!-- For vertical surfaces.
1013    DO  l = 0, 3
1014       ALLOCATE ( surf_usm_v(l)%lambda_surf(1:surf_usm_v(l)%ns)        )
1015       ALLOCATE ( surf_usm_v(l)%c_surface(1:surf_usm_v(l)%ns)          )
1016       ALLOCATE ( surf_usm_v(l)%lambda_surf_window(1:surf_usm_v(l)%ns) )
1017       ALLOCATE ( surf_usm_v(l)%c_surface_window(1:surf_usm_v(l)%ns)   )
1018       ALLOCATE ( surf_usm_v(l)%lambda_surf_green(1:surf_usm_v(l)%ns)  )
1019       ALLOCATE ( surf_usm_v(l)%c_surface_green(1:surf_usm_v(l)%ns)    )
1020       ALLOCATE ( surf_usm_v(l)%transmissivity(1:surf_usm_v(l)%ns)     )
1021       ALLOCATE ( surf_usm_v(l)%lai(1:surf_usm_v(l)%ns)                )
1022       ALLOCATE ( surf_usm_v(l)%emissivity(1:surf_usm_v(l)%ns,0:2)     )
1023       ALLOCATE ( surf_usm_v(l)%r_a(1:surf_usm_v(l)%ns)                )
1024       ALLOCATE ( surf_usm_v(l)%r_a_green(1:surf_usm_v(l)%ns)          )
1025       ALLOCATE ( surf_usm_v(l)%r_a_window(1:surf_usm_v(l)%ns)         )
1026       ALLOCATE ( surf_usm_v(l)%r_s(1:surf_usm_v(l)%ns)                )
1027    ENDDO
1028
1029!
1030!-- Allocate wall and roof material parameters. First for horizontal surfaces
1031    ALLOCATE ( surf_usm_h%thickness_wall(1:surf_usm_h%ns)                    )
1032    ALLOCATE ( surf_usm_h%thickness_window(1:surf_usm_h%ns)                  )
1033    ALLOCATE ( surf_usm_h%thickness_green(1:surf_usm_h%ns)                   )
1034    ALLOCATE ( surf_usm_h%lambda_h(nzb_wall:nzt_wall,1:surf_usm_h%ns)        )
1035    ALLOCATE ( surf_usm_h%rho_c_wall(nzb_wall:nzt_wall,1:surf_usm_h%ns)      )
1036    ALLOCATE ( surf_usm_h%lambda_h_window(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1037    ALLOCATE ( surf_usm_h%rho_c_window(nzb_wall:nzt_wall,1:surf_usm_h%ns)    )
1038    ALLOCATE ( surf_usm_h%lambda_h_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
1039    ALLOCATE ( surf_usm_h%rho_c_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)     )
1040
1041    ALLOCATE ( surf_usm_h%rho_c_total_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)    )
1042    ALLOCATE ( surf_usm_h%n_vg_green(1:surf_usm_h%ns)                             )
1043    ALLOCATE ( surf_usm_h%alpha_vg_green(1:surf_usm_h%ns)                         )
1044    ALLOCATE ( surf_usm_h%l_vg_green(1:surf_usm_h%ns)                             )
1045    ALLOCATE ( surf_usm_h%gamma_w_green_sat(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)  )
1046    ALLOCATE ( surf_usm_h%lambda_w_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)       )
1047    ALLOCATE ( surf_usm_h%gamma_w_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)        )
1048    ALLOCATE ( surf_usm_h%tswc_h_m(nzb_wall:nzt_wall,1:surf_usm_h%ns)             )
1049
1050!
1051!-- For vertical surfaces.
1052    DO  l = 0, 3
1053       ALLOCATE ( surf_usm_v(l)%thickness_wall(1:surf_usm_v(l)%ns)                    )
1054       ALLOCATE ( surf_usm_v(l)%thickness_window(1:surf_usm_v(l)%ns)                  )
1055       ALLOCATE ( surf_usm_v(l)%thickness_green(1:surf_usm_v(l)%ns)                   )
1056       ALLOCATE ( surf_usm_v(l)%lambda_h(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)        )
1057       ALLOCATE ( surf_usm_v(l)%rho_c_wall(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)      )
1058       ALLOCATE ( surf_usm_v(l)%lambda_h_window(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1059       ALLOCATE ( surf_usm_v(l)%rho_c_window(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)    )
1060       ALLOCATE ( surf_usm_v(l)%lambda_h_green(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1061       ALLOCATE ( surf_usm_v(l)%rho_c_green(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)     )
1062    ENDDO
1063
1064!
1065!-- Allocate green wall and roof vegetation and soil parameters. First horizontal surfaces
1066    ALLOCATE ( surf_usm_h%g_d(1:surf_usm_h%ns)              )
1067    ALLOCATE ( surf_usm_h%c_liq(1:surf_usm_h%ns)            )
1068    ALLOCATE ( surf_usm_h%qsws_liq(1:surf_usm_h%ns)         )
1069    ALLOCATE ( surf_usm_h%qsws_veg(1:surf_usm_h%ns)         )
1070    ALLOCATE ( surf_usm_h%r_canopy(1:surf_usm_h%ns)         )
1071    ALLOCATE ( surf_usm_h%r_canopy_min(1:surf_usm_h%ns)     )
1072    ALLOCATE ( surf_usm_h%pt_10cm(1:surf_usm_h%ns)          )
1073
1074!
1075!-- For vertical surfaces.
1076    DO  l = 0, 3
1077      ALLOCATE ( surf_usm_v(l)%g_d(1:surf_usm_v(l)%ns)              )
1078      ALLOCATE ( surf_usm_v(l)%c_liq(1:surf_usm_v(l)%ns)            )
1079      ALLOCATE ( surf_usm_v(l)%qsws_liq(1:surf_usm_v(l)%ns)         )
1080      ALLOCATE ( surf_usm_v(l)%qsws_veg(1:surf_usm_v(l)%ns)         )
1081      ALLOCATE ( surf_usm_v(l)%r_canopy(1:surf_usm_v(l)%ns)         )
1082      ALLOCATE ( surf_usm_v(l)%r_canopy_min(1:surf_usm_v(l)%ns)     )
1083      ALLOCATE ( surf_usm_v(l)%pt_10cm(1:surf_usm_v(l)%ns)          )
1084    ENDDO
1085
1086!
1087!-- Allocate wall and roof layers sizes. For horizontal surfaces.
1088    ALLOCATE ( zwn(nzb_wall:nzt_wall)                                        )
1089    ALLOCATE ( surf_usm_h%dz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)       )
1090    ALLOCATE ( zwn_window(nzb_wall:nzt_wall)                                 )
1091    ALLOCATE ( surf_usm_h%dz_window(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)     )
1092    ALLOCATE ( zwn_green(nzb_wall:nzt_wall)                                  )
1093    ALLOCATE ( surf_usm_h%dz_green(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)      )
1094    ALLOCATE ( surf_usm_h%ddz_wall(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)      )
1095    ALLOCATE ( surf_usm_h%dz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)    )
1096    ALLOCATE ( surf_usm_h%ddz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)   )
1097    ALLOCATE ( surf_usm_h%zw(nzb_wall:nzt_wall,1:surf_usm_h%ns)              )
1098    ALLOCATE ( surf_usm_h%ddz_window(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)    )
1099    ALLOCATE ( surf_usm_h%dz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
1100    ALLOCATE ( surf_usm_h%ddz_window_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1101    ALLOCATE ( surf_usm_h%zw_window(nzb_wall:nzt_wall,1:surf_usm_h%ns)       )
1102    ALLOCATE ( surf_usm_h%ddz_green(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)     )
1103    ALLOCATE ( surf_usm_h%dz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)   )
1104    ALLOCATE ( surf_usm_h%ddz_green_stag(nzb_wall:nzt_wall,1:surf_usm_h%ns)  )
1105    ALLOCATE ( surf_usm_h%zw_green(nzb_wall:nzt_wall,1:surf_usm_h%ns)        )
1106
1107!
1108!-- For vertical surfaces.
1109    DO  l = 0, 3
1110       ALLOCATE ( surf_usm_v(l)%dz_wall(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)       )
1111       ALLOCATE ( surf_usm_v(l)%dz_window(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)     )
1112       ALLOCATE ( surf_usm_v(l)%dz_green(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)      )
1113       ALLOCATE ( surf_usm_v(l)%ddz_wall(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)      )
1114       ALLOCATE ( surf_usm_v(l)%dz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)    )
1115       ALLOCATE ( surf_usm_v(l)%ddz_wall_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)   )
1116       ALLOCATE ( surf_usm_v(l)%zw(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)              )
1117       ALLOCATE ( surf_usm_v(l)%ddz_window(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)    )
1118       ALLOCATE ( surf_usm_v(l)%dz_window_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1119       ALLOCATE ( surf_usm_v(l)%ddz_window_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1120       ALLOCATE ( surf_usm_v(l)%zw_window(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)       )
1121       ALLOCATE ( surf_usm_v(l)%ddz_green(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns)     )
1122       ALLOCATE ( surf_usm_v(l)%dz_green_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)   )
1123       ALLOCATE ( surf_usm_v(l)%ddz_green_stag(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)  )
1124       ALLOCATE ( surf_usm_v(l)%zw_green(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns)        )
1125    ENDDO
1126
1127!
1128!-- Allocate wall and roof temperature arrays, for horizontal walls.
1129!-- Allocate if required. Note, in case of restarts, some of these arrays might be already allocated.
1130    IF ( .NOT. ALLOCATED( t_surf_wall_h_1 ) )                                                      &
1131       ALLOCATE ( t_surf_wall_h_1(1:surf_usm_h%ns) )
1132    IF ( .NOT. ALLOCATED( t_surf_wall_h_2 ) )                                                      &
1133       ALLOCATE ( t_surf_wall_h_2(1:surf_usm_h%ns) )
1134    IF ( .NOT. ALLOCATED( t_wall_h_1 ) )                                                           &
1135       ALLOCATE ( t_wall_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1136    IF ( .NOT. ALLOCATED( t_wall_h_2 ) )                                                           &
1137       ALLOCATE ( t_wall_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1138    IF ( .NOT. ALLOCATED( t_surf_window_h_1 ) )                                                    &
1139       ALLOCATE ( t_surf_window_h_1(1:surf_usm_h%ns) )
1140    IF ( .NOT. ALLOCATED( t_surf_window_h_2 ) )                                                    &
1141       ALLOCATE ( t_surf_window_h_2(1:surf_usm_h%ns) )
1142    IF ( .NOT. ALLOCATED( t_window_h_1 ) )                                                         &
1143       ALLOCATE ( t_window_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1144    IF ( .NOT. ALLOCATED( t_window_h_2 ) )                                                         &
1145       ALLOCATE ( t_window_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1146    IF ( .NOT. ALLOCATED( t_surf_green_h_1 ) )                                                     &
1147       ALLOCATE ( t_surf_green_h_1(1:surf_usm_h%ns) )
1148    IF ( .NOT. ALLOCATED( t_surf_green_h_2 ) )                                                     &
1149       ALLOCATE ( t_surf_green_h_2(1:surf_usm_h%ns) )
1150    IF ( .NOT. ALLOCATED( t_green_h_1 ) )                                                          &
1151       ALLOCATE ( t_green_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1152    IF ( .NOT. ALLOCATED( t_green_h_2 ) )                                                          &
1153       ALLOCATE ( t_green_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1154    IF ( .NOT. ALLOCATED( swc_h_1 ) )                                                              &
1155       ALLOCATE ( swc_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1156    IF ( .NOT. ALLOCATED( swc_sat_h_1 ) )                                                          &
1157       ALLOCATE ( swc_sat_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1158    IF ( .NOT. ALLOCATED( swc_res_h_1 ) )                                                          &
1159       ALLOCATE ( swc_res_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1160    IF ( .NOT. ALLOCATED( swc_h_2 ) )                                                              &
1161       ALLOCATE ( swc_h_2(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1162    IF ( .NOT. ALLOCATED( rootfr_h_1 ) )                                                           &
1163       ALLOCATE ( rootfr_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1164    IF ( .NOT. ALLOCATED( wilt_h_1 ) )                                                             &
1165       ALLOCATE ( wilt_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1166    IF ( .NOT. ALLOCATED( fc_h_1 ) )                                                               &
1167       ALLOCATE ( fc_h_1(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1168
1169    IF ( .NOT. ALLOCATED( m_liq_usm_h_1%var_usm_1d ) )                                             &
1170       ALLOCATE ( m_liq_usm_h_1%var_usm_1d(1:surf_usm_h%ns) )
1171    IF ( .NOT. ALLOCATED( m_liq_usm_h_2%var_usm_1d ) )                                             &
1172       ALLOCATE ( m_liq_usm_h_2%var_usm_1d(1:surf_usm_h%ns) )
1173
1174!
1175!-- Initial assignment of the pointers
1176    t_wall_h    => t_wall_h_1;   t_wall_h_p   => t_wall_h_2
1177    t_window_h  => t_window_h_1; t_window_h_p => t_window_h_2
1178    t_green_h   => t_green_h_1;  t_green_h_p  => t_green_h_2
1179    t_surf_wall_h   => t_surf_wall_h_1;   t_surf_wall_h_p   => t_surf_wall_h_2
1180    t_surf_window_h => t_surf_window_h_1; t_surf_window_h_p => t_surf_window_h_2
1181    t_surf_green_h  => t_surf_green_h_1;  t_surf_green_h_p  => t_surf_green_h_2
1182    m_liq_usm_h     => m_liq_usm_h_1;     m_liq_usm_h_p     => m_liq_usm_h_2
1183    swc_h     => swc_h_1; swc_h_p => swc_h_2
1184    swc_sat_h => swc_sat_h_1
1185    swc_res_h => swc_res_h_1
1186    rootfr_h  => rootfr_h_1
1187    wilt_h    => wilt_h_1
1188    fc_h      => fc_h_1
1189
1190!
1191!-- Allocate wall and roof temperature arrays, for vertical walls if required.
1192!-- Allocate if required. Note, in case of restarts, some of these arrays might be already allocated.
1193    DO  l = 0, 3
1194       IF ( .NOT. ALLOCATED( t_surf_wall_v_1(l)%t ) )                                              &
1195          ALLOCATE ( t_surf_wall_v_1(l)%t(1:surf_usm_v(l)%ns) )
1196       IF ( .NOT. ALLOCATED( t_surf_wall_v_2(l)%t ) )                                              &
1197          ALLOCATE ( t_surf_wall_v_2(l)%t(1:surf_usm_v(l)%ns) )
1198       IF ( .NOT. ALLOCATED( t_wall_v_1(l)%t ) )                                                   &
1199          ALLOCATE ( t_wall_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1200       IF ( .NOT. ALLOCATED( t_wall_v_2(l)%t ) )                                                   &
1201          ALLOCATE ( t_wall_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1202       IF ( .NOT. ALLOCATED( t_surf_window_v_1(l)%t ) )                                            &
1203          ALLOCATE ( t_surf_window_v_1(l)%t(1:surf_usm_v(l)%ns) )
1204       IF ( .NOT. ALLOCATED( t_surf_window_v_2(l)%t ) )                                            &
1205          ALLOCATE ( t_surf_window_v_2(l)%t(1:surf_usm_v(l)%ns) )
1206       IF ( .NOT. ALLOCATED( t_window_v_1(l)%t ) )                                                 &
1207          ALLOCATE ( t_window_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1208       IF ( .NOT. ALLOCATED( t_window_v_2(l)%t ) )                                                 &
1209          ALLOCATE ( t_window_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1210       IF ( .NOT. ALLOCATED( t_surf_green_v_1(l)%t ) )                                             &
1211          ALLOCATE ( t_surf_green_v_1(l)%t(1:surf_usm_v(l)%ns) )
1212       IF ( .NOT. ALLOCATED( t_surf_green_v_2(l)%t ) )                                             &
1213          ALLOCATE ( t_surf_green_v_2(l)%t(1:surf_usm_v(l)%ns) )
1214       IF ( .NOT. ALLOCATED( t_green_v_1(l)%t ) )                                                  &
1215          ALLOCATE ( t_green_v_1(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1216       IF ( .NOT. ALLOCATED( t_green_v_2(l)%t ) )                                                  &
1217          ALLOCATE ( t_green_v_2(l)%t(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1218    ENDDO
1219!
1220!-- Initial assignment of the pointers
1221    t_wall_v        => t_wall_v_1;        t_wall_v_p        => t_wall_v_2
1222    t_surf_wall_v   => t_surf_wall_v_1;   t_surf_wall_v_p   => t_surf_wall_v_2
1223    t_window_v      => t_window_v_1;      t_window_v_p      => t_window_v_2
1224    t_green_v       => t_green_v_1;       t_green_v_p       => t_green_v_2
1225    t_surf_window_v => t_surf_window_v_1; t_surf_window_v_p => t_surf_window_v_2
1226    t_surf_green_v  => t_surf_green_v_1;  t_surf_green_v_p  => t_surf_green_v_2
1227
1228!
1229!-- Allocate intermediate timestep arrays. For horizontal surfaces.
1230    ALLOCATE ( surf_usm_h%tt_surface_wall_m(1:surf_usm_h%ns)               )
1231    ALLOCATE ( surf_usm_h%tt_wall_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)   )
1232    ALLOCATE ( surf_usm_h%tt_surface_window_m(1:surf_usm_h%ns)             )
1233    ALLOCATE ( surf_usm_h%tt_window_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns) )
1234    ALLOCATE ( surf_usm_h%tt_green_m(nzb_wall:nzt_wall+1,1:surf_usm_h%ns)  )
1235    ALLOCATE ( surf_usm_h%tt_surface_green_m(1:surf_usm_h%ns)              )
1236
1237!
1238!-- Allocate intermediate timestep arrays
1239!-- Horizontal surfaces
1240    ALLOCATE ( tm_liq_usm_h_m%var_usm_1d(1:surf_usm_h%ns) )
1241    tm_liq_usm_h_m%var_usm_1d = 0.0_wp
1242!
1243!-- Set inital values for prognostic quantities
1244    IF ( ALLOCATED( surf_usm_h%tt_surface_wall_m )   )  surf_usm_h%tt_surface_wall_m   = 0.0_wp
1245    IF ( ALLOCATED( surf_usm_h%tt_wall_m )           )  surf_usm_h%tt_wall_m           = 0.0_wp
1246    IF ( ALLOCATED( surf_usm_h%tt_surface_window_m ) )  surf_usm_h%tt_surface_window_m = 0.0_wp
1247    IF ( ALLOCATED( surf_usm_h%tt_window_m    )      )  surf_usm_h%tt_window_m         = 0.0_wp
1248    IF ( ALLOCATED( surf_usm_h%tt_green_m    )       )  surf_usm_h%tt_green_m          = 0.0_wp
1249    IF ( ALLOCATED( surf_usm_h%tt_surface_green_m )  )  surf_usm_h%tt_surface_green_m  = 0.0_wp
1250!
1251!-- Now, for vertical surfaces
1252    DO  l = 0, 3
1253       ALLOCATE ( surf_usm_v(l)%tt_surface_wall_m(1:surf_usm_v(l)%ns) )
1254       ALLOCATE ( surf_usm_v(l)%tt_wall_m(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1255       IF ( ALLOCATED( surf_usm_v(l)%tt_surface_wall_m ) )  surf_usm_v(l)%tt_surface_wall_m = 0.0_wp
1256       IF ( ALLOCATED( surf_usm_v(l)%tt_wall_m ) )  surf_usm_v(l)%tt_wall_m  = 0.0_wp
1257       ALLOCATE ( surf_usm_v(l)%tt_surface_window_m(1:surf_usm_v(l)%ns) )
1258       ALLOCATE ( surf_usm_v(l)%tt_window_m(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1259       IF ( ALLOCATED( surf_usm_v(l)%tt_surface_window_m ) )  surf_usm_v(l)%tt_surface_window_m = 0.0_wp
1260       IF ( ALLOCATED( surf_usm_v(l)%tt_window_m ) )  surf_usm_v(l)%tt_window_m = 0.0_wp
1261       ALLOCATE ( surf_usm_v(l)%tt_surface_green_m(1:surf_usm_v(l)%ns) )
1262       IF ( ALLOCATED( surf_usm_v(l)%tt_surface_green_m ) )  surf_usm_v(l)%tt_surface_green_m = 0.0_wp
1263       ALLOCATE ( surf_usm_v(l)%tt_green_m(nzb_wall:nzt_wall+1,1:surf_usm_v(l)%ns) )
1264       IF ( ALLOCATED( surf_usm_v(l)%tt_green_m ) )  surf_usm_v(l)%tt_green_m = 0.0_wp
1265    ENDDO
1266!
1267!-- Allocate wall heat flux output arrays and set initial values. For horizontal surfaces
1268!    ALLOCATE ( surf_usm_h%wshf(1:surf_usm_h%ns)    )  !can be removed
1269    ALLOCATE ( surf_usm_h%ghf(1:surf_usm_h%ns) )
1270    ALLOCATE ( surf_usm_h%wshf_eb(1:surf_usm_h%ns) )
1271    ALLOCATE ( surf_usm_h%wghf_eb(1:surf_usm_h%ns) )
1272    ALLOCATE ( surf_usm_h%wghf_eb_window(1:surf_usm_h%ns) )
1273    ALLOCATE ( surf_usm_h%wghf_eb_green(1:surf_usm_h%ns) )
1274    ALLOCATE ( surf_usm_h%iwghf_eb(1:surf_usm_h%ns) )
1275    ALLOCATE ( surf_usm_h%iwghf_eb_window(1:surf_usm_h%ns) )
1276    IF ( ALLOCATED( surf_usm_h%ghf     ) )  surf_usm_h%ghf     = 0.0_wp
1277    IF ( ALLOCATED( surf_usm_h%wshf    ) )  surf_usm_h%wshf    = 0.0_wp
1278    IF ( ALLOCATED( surf_usm_h%wshf_eb ) )  surf_usm_h%wshf_eb = 0.0_wp
1279    IF ( ALLOCATED( surf_usm_h%wghf_eb ) )  surf_usm_h%wghf_eb = 0.0_wp
1280    IF ( ALLOCATED( surf_usm_h%wghf_eb_window ) )   surf_usm_h%wghf_eb_window  = 0.0_wp
1281    IF ( ALLOCATED( surf_usm_h%wghf_eb_green ) )    surf_usm_h%wghf_eb_green   = 0.0_wp
1282    IF ( ALLOCATED( surf_usm_h%iwghf_eb ) )         surf_usm_h%iwghf_eb        = 0.0_wp
1283    IF ( ALLOCATED( surf_usm_h%iwghf_eb_window ) )  surf_usm_h%iwghf_eb_window = 0.0_wp
1284!
1285!-- Now, for vertical surfaces
1286    DO  l = 0, 3
1287!       ALLOCATE ( surf_usm_v(l)%wshf(1:surf_usm_v(l)%ns)    )    ! can be removed
1288       ALLOCATE ( surf_usm_v(l)%ghf(1:surf_usm_v(l)%ns) )
1289       ALLOCATE ( surf_usm_v(l)%wshf_eb(1:surf_usm_v(l)%ns) )
1290       ALLOCATE ( surf_usm_v(l)%wghf_eb(1:surf_usm_v(l)%ns) )
1291       ALLOCATE ( surf_usm_v(l)%wghf_eb_window(1:surf_usm_v(l)%ns) )
1292       ALLOCATE ( surf_usm_v(l)%wghf_eb_green(1:surf_usm_v(l)%ns) )
1293       ALLOCATE ( surf_usm_v(l)%iwghf_eb(1:surf_usm_v(l)%ns) )
1294       ALLOCATE ( surf_usm_v(l)%iwghf_eb_window(1:surf_usm_v(l)%ns) )
1295       IF ( ALLOCATED( surf_usm_v(l)%ghf     ) )  surf_usm_v(l)%ghf     = 0.0_wp
1296       IF ( ALLOCATED( surf_usm_v(l)%wshf    ) )  surf_usm_v(l)%wshf    = 0.0_wp
1297       IF ( ALLOCATED( surf_usm_v(l)%wshf_eb ) )  surf_usm_v(l)%wshf_eb = 0.0_wp
1298       IF ( ALLOCATED( surf_usm_v(l)%wghf_eb ) )  surf_usm_v(l)%wghf_eb = 0.0_wp
1299       IF ( ALLOCATED( surf_usm_v(l)%wghf_eb_window ) )   surf_usm_v(l)%wghf_eb_window  = 0.0_wp
1300       IF ( ALLOCATED( surf_usm_v(l)%wghf_eb_green ) )    surf_usm_v(l)%wghf_eb_green   = 0.0_wp
1301       IF ( ALLOCATED( surf_usm_v(l)%iwghf_eb ) )         surf_usm_v(l)%iwghf_eb        = 0.0_wp
1302       IF ( ALLOCATED( surf_usm_v(l)%iwghf_eb_window ) )  surf_usm_v(l)%iwghf_eb_window = 0.0_wp
1303    ENDDO
1304!
1305!-- Initialize building-surface properties, which are also required by other modules, e.g. the
1306!-- indoor model.
1307    CALL usm_define_pars
1308
1309    IF ( debug_output )  CALL debug_message( 'usm_init_arrays', 'end' )
1310
1311 END SUBROUTINE usm_init_arrays
1312
1313
1314!--------------------------------------------------------------------------------------------------!
1315! Description:
1316! ------------
1317!> Sum up and time-average urban surface output quantities as well as allocate the array necessary
1318!> for storing the average.
1319!--------------------------------------------------------------------------------------------------!
1320 SUBROUTINE usm_3d_data_averaging( mode, variable )
1321
1322    IMPLICIT NONE
1323
1324    CHARACTER(LEN=*), INTENT(IN) ::  variable  !<
1325    CHARACTER(LEN=*), INTENT(IN) ::  mode      !<
1326
1327    INTEGER(iwp)                                       ::  i, j, k, l, m, ids, idsint, iwl, istat  !< runnin indices
1328    CHARACTER(LEN=varnamelength)                       ::  var                                     !< trimmed variable
1329    INTEGER(iwp), PARAMETER                            ::  nd = 5                                  !< number of directions
1330    CHARACTER(LEN=6), DIMENSION(0:nd-1), PARAMETER     ::  dirname = (/ '_roof ', '_south', '_north', '_west ', '_east ' /)
1331    INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER         ::  dirint = (/ iup_u, isouth_u, inorth_u, iwest_u, ieast_u /)
1332
1333
1334
1335
1336    IF ( variable(1:4) == 'usm_' )  THEN  ! Is such a check really required?
1337
1338!
1339!-- Find the real name of the variable
1340    ids = -1
1341    l = -1
1342    var = TRIM(variable)
1343    DO  i = 0, nd-1
1344       k = len( TRIM( var ) )
1345       j = len( TRIM( dirname(i) ) )
1346       IF ( TRIM( var(k-j+1:k) ) == TRIM( dirname(i) ) )  THEN
1347           ids = i
1348           idsint = dirint(ids)
1349           var = var(:k-j)
1350           EXIT
1351       ENDIF
1352    ENDDO
1353    l = idsint - 2  ! Horizontal direction index - terrible hack !
1354    IF ( l < 0 .OR. l > 3 )  THEN
1355       l = -1
1356    ENDIF
1357    IF ( ids == -1 )  THEN
1358        var = TRIM( variable )
1359    ENDIF
1360    IF ( var(1:11) == 'usm_t_wall_'  .AND.  len( TRIM( var ) ) >= 12 )  THEN
1361!
1362!--      Wall layers
1363        READ( var(12:12), '(I1)', iostat=istat ) iwl
1364        IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1365            var = var(1:10)
1366        ELSE
1367!
1368!--         Wrong wall layer index
1369            RETURN
1370        ENDIF
1371    ENDIF
1372    IF ( var(1:13) == 'usm_t_window_'  .AND.  len( TRIM(var) ) >= 14 )  THEN
1373!
1374!--      Wall layers
1375        READ( var(14:14), '(I1)', iostat=istat ) iwl
1376        IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1377            var = var(1:12)
1378        ELSE
1379!
1380!--         Wrong window layer index
1381            RETURN
1382        ENDIF
1383    ENDIF
1384    IF ( var(1:12) == 'usm_t_green_'  .AND.  len( TRIM( var ) ) >= 13 )  THEN
1385!
1386!--      Wall layers
1387        READ( var(13:13), '(I1)', iostat=istat ) iwl
1388        IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1389            var = var(1:11)
1390        ELSE
1391!
1392!--         Wrong green layer index
1393            RETURN
1394        ENDIF
1395    ENDIF
1396    IF ( var(1:8) == 'usm_swc_'  .AND.  len( TRIM( var ) ) >= 9 )  THEN
1397!
1398!--      Swc layers
1399        READ( var(9:9), '(I1)', iostat=istat ) iwl
1400        IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
1401            var = var(1:7)
1402        ELSE
1403!
1404!--         Wrong swc layer index
1405            RETURN
1406        ENDIF
1407    ENDIF
1408
1409    IF ( mode == 'allocate' )  THEN
1410
1411       SELECT CASE ( TRIM( var ) )
1412
1413            CASE ( 'usm_wshf' )
1414!
1415!--             Array of sensible heat flux from surfaces
1416!--             Land surfaces
1417                IF ( l == -1 )  THEN
1418                   IF ( .NOT.  ALLOCATED( surf_usm_h%wshf_eb_av ) )  THEN
1419                      ALLOCATE ( surf_usm_h%wshf_eb_av(1:surf_usm_h%ns) )
1420                      surf_usm_h%wshf_eb_av = 0.0_wp
1421                   ENDIF
1422                ELSE
1423                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%wshf_eb_av ) )  THEN
1424                       ALLOCATE ( surf_usm_v(l)%wshf_eb_av(1:surf_usm_v(l)%ns) )
1425                       surf_usm_v(l)%wshf_eb_av = 0.0_wp
1426                   ENDIF
1427                ENDIF
1428
1429            CASE ( 'usm_qsws' )
1430!
1431!--             Array of latent heat flux from surfaces
1432!--             Land surfaces
1433                IF ( l == -1 .AND. .NOT.  ALLOCATED( surf_usm_h%qsws_av ) )  THEN
1434                    ALLOCATE ( surf_usm_h%qsws_av(1:surf_usm_h%ns) )
1435                    surf_usm_h%qsws_av = 0.0_wp
1436                ELSE
1437                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%qsws_av ) )  THEN
1438                       ALLOCATE ( surf_usm_v(l)%qsws_av(1:surf_usm_v(l)%ns) )
1439                       surf_usm_v(l)%qsws_av = 0.0_wp
1440                   ENDIF
1441                ENDIF
1442
1443            CASE ( 'usm_qsws_veg' )
1444!
1445!--             Array of latent heat flux from vegetation surfaces
1446!--             Land surfaces
1447                IF ( l == -1 .AND. .NOT.  ALLOCATED( surf_usm_h%qsws_veg_av ) )  THEN
1448                    ALLOCATE ( surf_usm_h%qsws_veg_av(1:surf_usm_h%ns) )
1449                    surf_usm_h%qsws_veg_av = 0.0_wp
1450                ELSE
1451                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%qsws_veg_av ) )  THEN
1452                       ALLOCATE ( surf_usm_v(l)%qsws_veg_av(1:surf_usm_v(l)%ns) )
1453                       surf_usm_v(l)%qsws_veg_av = 0.0_wp
1454                   ENDIF
1455                ENDIF
1456
1457            CASE ( 'usm_qsws_liq' )
1458!
1459!--             Array of latent heat flux from surfaces with liquid
1460!--             Land surfaces
1461                IF ( l == -1 .AND. .NOT.  ALLOCATED( surf_usm_h%qsws_liq_av ) )  THEN
1462                    ALLOCATE ( surf_usm_h%qsws_liq_av(1:surf_usm_h%ns) )
1463                    surf_usm_h%qsws_liq_av = 0.0_wp
1464                ELSE
1465                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%qsws_liq_av ) )  THEN
1466                       ALLOCATE ( surf_usm_v(l)%qsws_liq_av(1:surf_usm_v(l)%ns) )
1467                       surf_usm_v(l)%qsws_liq_av = 0.0_wp
1468                   ENDIF
1469                ENDIF
1470!
1471!--         Please note, the following output quantities belongs to the individual tile fractions -
1472!--         ground heat flux at wall-, window-, and green fraction. Aggregated ground-heat flux is
1473!--         treated accordingly in average_3d_data, sum_up_3d_data, etc..
1474            CASE ( 'usm_wghf' )
1475!
1476!--             Array of heat flux from ground (wall, roof, land)
1477                IF ( l == -1 )  THEN
1478                   IF ( .NOT.  ALLOCATED( surf_usm_h%wghf_eb_av ) )  THEN
1479                       ALLOCATE ( surf_usm_h%wghf_eb_av(1:surf_usm_h%ns) )
1480                       surf_usm_h%wghf_eb_av = 0.0_wp
1481                   ENDIF
1482                ELSE
1483                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%wghf_eb_av ) )  THEN
1484                       ALLOCATE ( surf_usm_v(l)%wghf_eb_av(1:surf_usm_v(l)%ns) )
1485                       surf_usm_v(l)%wghf_eb_av = 0.0_wp
1486                   ENDIF
1487                ENDIF
1488
1489            CASE ( 'usm_wghf_window' )
1490!
1491!--             Array of heat flux from window ground (wall, roof, land)
1492                IF ( l == -1 )  THEN
1493                   IF ( .NOT.  ALLOCATED( surf_usm_h%wghf_eb_window_av ) )  THEN
1494                       ALLOCATE ( surf_usm_h%wghf_eb_window_av(1:surf_usm_h%ns) )
1495                       surf_usm_h%wghf_eb_window_av = 0.0_wp
1496                   ENDIF
1497                ELSE
1498                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%wghf_eb_window_av ) )  THEN
1499                       ALLOCATE ( surf_usm_v(l)%wghf_eb_window_av(1:surf_usm_v(l)%ns) )
1500                       surf_usm_v(l)%wghf_eb_window_av = 0.0_wp
1501                   ENDIF
1502                ENDIF
1503
1504            CASE ( 'usm_wghf_green' )
1505!
1506!--             Array of heat flux from green ground (wall, roof, land)
1507                IF ( l == -1 )  THEN
1508                   IF ( .NOT.  ALLOCATED( surf_usm_h%wghf_eb_green_av ) )  THEN
1509                       ALLOCATE ( surf_usm_h%wghf_eb_green_av(1:surf_usm_h%ns) )
1510                       surf_usm_h%wghf_eb_green_av = 0.0_wp
1511                   ENDIF
1512                ELSE
1513                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%wghf_eb_green_av ) )  THEN
1514                       ALLOCATE ( surf_usm_v(l)%wghf_eb_green_av(1:surf_usm_v(l)%ns) )
1515                       surf_usm_v(l)%wghf_eb_green_av = 0.0_wp
1516                   ENDIF
1517                ENDIF
1518
1519            CASE ( 'usm_iwghf' )
1520!
1521!--             Array of heat flux from indoor ground (wall, roof, land)
1522                IF ( l == -1 )  THEN
1523                   IF ( .NOT.  ALLOCATED( surf_usm_h%iwghf_eb_av ) )  THEN
1524                       ALLOCATE ( surf_usm_h%iwghf_eb_av(1:surf_usm_h%ns) )
1525                       surf_usm_h%iwghf_eb_av = 0.0_wp
1526                   ENDIF
1527                ELSE
1528                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%iwghf_eb_av ) )  THEN
1529                       ALLOCATE ( surf_usm_v(l)%iwghf_eb_av(1:surf_usm_v(l)%ns) )
1530                       surf_usm_v(l)%iwghf_eb_av = 0.0_wp
1531                   ENDIF
1532                ENDIF
1533
1534            CASE ( 'usm_iwghf_window' )
1535!
1536!--             Array of heat flux from indoor window ground (wall, roof, land)
1537                IF ( l == -1 ) THEN
1538                   IF ( .NOT.  ALLOCATED( surf_usm_h%iwghf_eb_window_av ) )  THEN
1539                       ALLOCATE ( surf_usm_h%iwghf_eb_window_av(1:surf_usm_h%ns) )
1540                       surf_usm_h%iwghf_eb_window_av = 0.0_wp
1541                   ENDIF
1542                ELSE
1543                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%iwghf_eb_window_av ) )  THEN
1544                       ALLOCATE ( surf_usm_v(l)%iwghf_eb_window_av(1:surf_usm_v(l)%ns) )
1545                       surf_usm_v(l)%iwghf_eb_window_av = 0.0_wp
1546                   ENDIF
1547                ENDIF
1548
1549            CASE ( 'usm_t_surf_wall' )
1550!
1551!--             Surface temperature for surfaces
1552                IF ( l == -1 )  THEN
1553                   IF ( .NOT.  ALLOCATED( surf_usm_h%t_surf_wall_av ) )  THEN
1554                       ALLOCATE ( surf_usm_h%t_surf_wall_av(1:surf_usm_h%ns) )
1555                       surf_usm_h%t_surf_wall_av = 0.0_wp
1556                   ENDIF
1557                ELSE
1558                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%t_surf_wall_av ) )  THEN
1559                       ALLOCATE ( surf_usm_v(l)%t_surf_wall_av(1:surf_usm_v(l)%ns) )
1560                       surf_usm_v(l)%t_surf_wall_av = 0.0_wp
1561                   ENDIF
1562                ENDIF
1563
1564            CASE ( 'usm_t_surf_window' )
1565!
1566!--             Surface temperature for window surfaces
1567                IF ( l == -1 )  THEN
1568                   IF ( .NOT.  ALLOCATED( surf_usm_h%t_surf_window_av ) )  THEN
1569                       ALLOCATE ( surf_usm_h%t_surf_window_av(1:surf_usm_h%ns) )
1570                       surf_usm_h%t_surf_window_av = 0.0_wp
1571                   ENDIF
1572                ELSE
1573                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%t_surf_window_av ) )  THEN
1574                       ALLOCATE ( surf_usm_v(l)%t_surf_window_av(1:surf_usm_v(l)%ns) )
1575                       surf_usm_v(l)%t_surf_window_av = 0.0_wp
1576                   ENDIF
1577                ENDIF
1578
1579            CASE ( 'usm_t_surf_green' )
1580!
1581!--             Surface temperature for green surfaces
1582                IF ( l == -1 )  THEN
1583                   IF ( .NOT.  ALLOCATED( surf_usm_h%t_surf_green_av ) )  THEN
1584                       ALLOCATE ( surf_usm_h%t_surf_green_av(1:surf_usm_h%ns) )
1585                       surf_usm_h%t_surf_green_av = 0.0_wp
1586                   ENDIF
1587                ELSE
1588                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%t_surf_green_av ) )  THEN
1589                       ALLOCATE ( surf_usm_v(l)%t_surf_green_av(1:surf_usm_v(l)%ns) )
1590                       surf_usm_v(l)%t_surf_green_av = 0.0_wp
1591                   ENDIF
1592                ENDIF
1593
1594            CASE ( 'usm_theta_10cm' )
1595!
1596!--             Near surface (10cm) temperature for whole surfaces
1597                IF ( l == -1 )  THEN
1598                   IF ( .NOT.  ALLOCATED( surf_usm_h%pt_10cm_av ) )  THEN
1599                       ALLOCATE ( surf_usm_h%pt_10cm_av(1:surf_usm_h%ns) )
1600                       surf_usm_h%pt_10cm_av = 0.0_wp
1601                   ENDIF
1602                ELSE
1603                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%pt_10cm_av ) )  THEN
1604                       ALLOCATE ( surf_usm_v(l)%pt_10cm_av(1:surf_usm_v(l)%ns) )
1605                       surf_usm_v(l)%pt_10cm_av = 0.0_wp
1606                   ENDIF
1607                ENDIF
1608
1609            CASE ( 'usm_t_wall' )
1610!
1611!--             Wall temperature for iwl layer of walls and land
1612                IF ( l == -1 )  THEN
1613                   IF ( .NOT.  ALLOCATED( surf_usm_h%t_wall_av ) )  THEN
1614                       ALLOCATE ( surf_usm_h%t_wall_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1615                       surf_usm_h%t_wall_av = 0.0_wp
1616                   ENDIF
1617                ELSE
1618                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%t_wall_av ) )  THEN
1619                       ALLOCATE ( surf_usm_v(l)%t_wall_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1620                       surf_usm_v(l)%t_wall_av = 0.0_wp
1621                   ENDIF
1622                ENDIF
1623
1624            CASE ( 'usm_t_window' )
1625!
1626!--             Window temperature for iwl layer of walls and land
1627                IF ( l == -1 )  THEN
1628                   IF ( .NOT.  ALLOCATED( surf_usm_h%t_window_av ) )  THEN
1629                       ALLOCATE ( surf_usm_h%t_window_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1630                       surf_usm_h%t_window_av = 0.0_wp
1631                   ENDIF
1632                ELSE
1633                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%t_window_av ) )  THEN
1634                       ALLOCATE ( surf_usm_v(l)%t_window_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1635                       surf_usm_v(l)%t_window_av = 0.0_wp
1636                   ENDIF
1637                ENDIF
1638
1639            CASE ( 'usm_t_green' )
1640!
1641!--             Green temperature for iwl layer of walls and land
1642                IF ( l == -1 )  THEN
1643                   IF ( .NOT.  ALLOCATED( surf_usm_h%t_green_av ) )  THEN
1644                       ALLOCATE ( surf_usm_h%t_green_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1645                       surf_usm_h%t_green_av = 0.0_wp
1646                   ENDIF
1647                ELSE
1648                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%t_green_av ) )  THEN
1649                       ALLOCATE ( surf_usm_v(l)%t_green_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1650                       surf_usm_v(l)%t_green_av = 0.0_wp
1651                   ENDIF
1652                ENDIF
1653            CASE ( 'usm_swc' )
1654!
1655!--             Soil water content for iwl layer of walls and land
1656                IF ( l == -1 .AND. .NOT.  ALLOCATED( surf_usm_h%swc_av ) )  THEN
1657                    ALLOCATE ( surf_usm_h%swc_av(nzb_wall:nzt_wall,1:surf_usm_h%ns) )
1658                    surf_usm_h%swc_av = 0.0_wp
1659                ELSE
1660                   IF ( .NOT.  ALLOCATED( surf_usm_v(l)%swc_av ) )  THEN
1661                       ALLOCATE ( surf_usm_v(l)%swc_av(nzb_wall:nzt_wall,1:surf_usm_v(l)%ns) )
1662                       surf_usm_v(l)%swc_av = 0.0_wp
1663                   ENDIF
1664                ENDIF
1665
1666           CASE DEFAULT
1667               CONTINUE
1668
1669       END SELECT
1670
1671    ELSEIF ( mode == 'sum' )  THEN
1672
1673       SELECT CASE ( TRIM( var ) )
1674
1675            CASE ( 'usm_wshf' )
1676!
1677!--             Array of sensible heat flux from surfaces (land, roof, wall)
1678                IF ( l == -1 )  THEN
1679                   DO  m = 1, surf_usm_h%ns
1680                      surf_usm_h%wshf_eb_av(m) = surf_usm_h%wshf_eb_av(m) + surf_usm_h%wshf_eb(m)
1681                   ENDDO
1682                ELSE
1683                   DO  m = 1, surf_usm_v(l)%ns
1684                      surf_usm_v(l)%wshf_eb_av(m) = surf_usm_v(l)%wshf_eb_av(m) +                  &
1685                                                    surf_usm_v(l)%wshf_eb(m)
1686                   ENDDO
1687                ENDIF
1688
1689            CASE ( 'usm_qsws' )
1690!
1691!--             Array of latent heat flux from surfaces (land, roof, wall)
1692                IF ( l == -1 ) THEN
1693                DO  m = 1, surf_usm_h%ns
1694                   surf_usm_h%qsws_av(m) = surf_usm_h%qsws_av(m) + surf_usm_h%qsws(m) * l_v
1695                ENDDO
1696                ELSE
1697                   DO  m = 1, surf_usm_v(l)%ns
1698                      surf_usm_v(l)%qsws_av(m) =  surf_usm_v(l)%qsws_av(m) +                       &
1699                                                  surf_usm_v(l)%qsws(m) * l_v
1700                   ENDDO
1701                ENDIF
1702
1703            CASE ( 'usm_qsws_veg' )
1704!
1705!--             Array of latent heat flux from vegetation surfaces (land, roof, wall)
1706                IF ( l == -1 )  THEN
1707                DO  m = 1, surf_usm_h%ns
1708                   surf_usm_h%qsws_veg_av(m) = surf_usm_h%qsws_veg_av(m) + surf_usm_h%qsws_veg(m)
1709                ENDDO
1710                ELSE
1711                   DO  m = 1, surf_usm_v(l)%ns
1712                      surf_usm_v(l)%qsws_veg_av(m) = surf_usm_v(l)%qsws_veg_av(m) +                &
1713                                                     surf_usm_v(l)%qsws_veg(m)
1714                   ENDDO
1715                ENDIF
1716
1717            CASE ( 'usm_qsws_liq' )
1718!
1719!--             Array of latent heat flux from surfaces with liquid (land, roof, wall)
1720                IF ( l == -1 ) THEN
1721                DO  m = 1, surf_usm_h%ns
1722                   surf_usm_h%qsws_liq_av(m) = surf_usm_h%qsws_liq_av(m) +                         &
1723                                               surf_usm_h%qsws_liq(m)
1724                ENDDO
1725                ELSE
1726                   DO  m = 1, surf_usm_v(l)%ns
1727                      surf_usm_v(l)%qsws_liq_av(m) = surf_usm_v(l)%qsws_liq_av(m) +                &
1728                                                     surf_usm_v(l)%qsws_liq(m)
1729                   ENDDO
1730                ENDIF
1731
1732            CASE ( 'usm_wghf' )
1733!
1734!--             Array of heat flux from ground (wall, roof, land)
1735                IF ( l == -1 ) THEN
1736                   DO  m = 1, surf_usm_h%ns
1737                      surf_usm_h%wghf_eb_av(m) = surf_usm_h%wghf_eb_av(m) +                        &
1738                                                 surf_usm_h%wghf_eb(m)
1739                   ENDDO
1740                ELSE
1741                   DO  m = 1, surf_usm_v(l)%ns
1742                      surf_usm_v(l)%wghf_eb_av(m) = surf_usm_v(l)%wghf_eb_av(m) +                  &
1743                                                    surf_usm_v(l)%wghf_eb(m)
1744                   ENDDO
1745                ENDIF
1746
1747            CASE ( 'usm_wghf_window' )
1748!
1749!--             Array of heat flux from window ground (wall, roof, land)
1750                IF ( l == -1 )  THEN
1751                   DO  m = 1, surf_usm_h%ns
1752                      surf_usm_h%wghf_eb_window_av(m) = surf_usm_h%wghf_eb_window_av(m) +          &
1753                                                        surf_usm_h%wghf_eb_window(m)
1754                   ENDDO
1755                ELSE
1756                   DO  m = 1, surf_usm_v(l)%ns
1757                      surf_usm_v(l)%wghf_eb_window_av(m) = surf_usm_v(l)%wghf_eb_window_av(m) +    &
1758                                                           surf_usm_v(l)%wghf_eb_window(m)
1759                   ENDDO
1760                ENDIF
1761
1762            CASE ( 'usm_wghf_green' )
1763!
1764!--             Array of heat flux from green ground (wall, roof, land)
1765                IF ( l == -1 )  THEN
1766                   DO  m = 1, surf_usm_h%ns
1767                      surf_usm_h%wghf_eb_green_av(m) = surf_usm_h%wghf_eb_green_av(m) +            &
1768                                                       surf_usm_h%wghf_eb_green(m)
1769                   ENDDO
1770                ELSE
1771                   DO  m = 1, surf_usm_v(l)%ns
1772                      surf_usm_v(l)%wghf_eb_green_av(m) = surf_usm_v(l)%wghf_eb_green_av(m) +      &
1773                                                          surf_usm_v(l)%wghf_eb_green(m)
1774                   ENDDO
1775                ENDIF
1776
1777            CASE ( 'usm_iwghf' )
1778!
1779!--             Array of heat flux from indoor ground (wall, roof, land)
1780                IF ( l == -1 )  THEN
1781                   DO  m = 1, surf_usm_h%ns
1782                      surf_usm_h%iwghf_eb_av(m) = surf_usm_h%iwghf_eb_av(m) + surf_usm_h%iwghf_eb(m)
1783                   ENDDO
1784                ELSE
1785                   DO  m = 1, surf_usm_v(l)%ns
1786                      surf_usm_v(l)%iwghf_eb_av(m) = surf_usm_v(l)%iwghf_eb_av(m) +                &
1787                                                     surf_usm_v(l)%iwghf_eb(m)
1788                   ENDDO
1789                ENDIF
1790
1791            CASE ( 'usm_iwghf_window' )
1792!
1793!--             Array of heat flux from indoor window ground (wall, roof, land)
1794                IF ( l == -1 )  THEN
1795                   DO  m = 1, surf_usm_h%ns
1796                      surf_usm_h%iwghf_eb_window_av(m) = surf_usm_h%iwghf_eb_window_av(m) +        &
1797                                                         surf_usm_h%iwghf_eb_window(m)
1798                   ENDDO
1799                ELSE
1800                   DO  m = 1, surf_usm_v(l)%ns
1801                      surf_usm_v(l)%iwghf_eb_window_av(m) = surf_usm_v(l)%iwghf_eb_window_av(m) +  &
1802                                                            surf_usm_v(l)%iwghf_eb_window(m)
1803                   ENDDO
1804                ENDIF
1805
1806            CASE ( 'usm_t_surf_wall' )
1807!
1808!--             Surface temperature for surfaces
1809                IF ( l == -1 )  THEN
1810                   DO  m = 1, surf_usm_h%ns
1811                   surf_usm_h%t_surf_wall_av(m) = surf_usm_h%t_surf_wall_av(m) + t_surf_wall_h(m)
1812                   ENDDO
1813                ELSE
1814                   DO  m = 1, surf_usm_v(l)%ns
1815                      surf_usm_v(l)%t_surf_wall_av(m) = surf_usm_v(l)%t_surf_wall_av(m) +          &
1816                                                        t_surf_wall_v(l)%t(m)
1817                   ENDDO
1818                ENDIF
1819
1820            CASE ( 'usm_t_surf_window' )
1821!
1822!--             Surface temperature for window surfaces
1823                IF ( l == -1 )  THEN
1824                   DO  m = 1, surf_usm_h%ns
1825                      surf_usm_h%t_surf_window_av(m) = surf_usm_h%t_surf_window_av(m) +            &
1826                                                       t_surf_window_h(m)
1827                   ENDDO
1828                ELSE
1829                   DO  m = 1, surf_usm_v(l)%ns
1830                      surf_usm_v(l)%t_surf_window_av(m) = surf_usm_v(l)%t_surf_window_av(m) +      &
1831                                                          t_surf_window_v(l)%t(m)
1832                   ENDDO
1833                ENDIF
1834
1835            CASE ( 'usm_t_surf_green' )
1836!
1837!--             Surface temperature for green surfaces
1838                IF ( l == -1 )  THEN
1839                   DO  m = 1, surf_usm_h%ns
1840                      surf_usm_h%t_surf_green_av(m) = surf_usm_h%t_surf_green_av(m) +              &
1841                                                      t_surf_green_h(m)
1842                   ENDDO
1843                ELSE
1844                   DO  m = 1, surf_usm_v(l)%ns
1845                      surf_usm_v(l)%t_surf_green_av(m) = surf_usm_v(l)%t_surf_green_av(m) +        &
1846                                                         t_surf_green_v(l)%t(m)
1847                   ENDDO
1848                ENDIF
1849
1850            CASE ( 'usm_theta_10cm' )
1851!
1852!--             Near surface temperature for whole surfaces
1853                IF ( l == -1 )  THEN
1854                   DO  m = 1, surf_usm_h%ns
1855                      surf_usm_h%pt_10cm_av(m) = surf_usm_h%pt_10cm_av(m) +                        &
1856                                                 surf_usm_h%pt_10cm(m)
1857                   ENDDO
1858                ELSE
1859                   DO  m = 1, surf_usm_v(l)%ns
1860                      surf_usm_v(l)%pt_10cm_av(m) = surf_usm_v(l)%pt_10cm_av(m) +                  &
1861                                                    surf_usm_v(l)%pt_10cm(m)
1862                   ENDDO
1863                ENDIF
1864
1865            CASE ( 'usm_t_wall' )
1866!
1867!--             Wall temperature for  iwl layer of walls and land
1868                IF ( l == -1 )  THEN
1869                   DO  m = 1, surf_usm_h%ns
1870                      surf_usm_h%t_wall_av(iwl,m) = surf_usm_h%t_wall_av(iwl,m) +                  &
1871                                                    t_wall_h(iwl,m)
1872                   ENDDO
1873                ELSE
1874                   DO  m = 1, surf_usm_v(l)%ns
1875                      surf_usm_v(l)%t_wall_av(iwl,m) = surf_usm_v(l)%t_wall_av(iwl,m) +            &
1876                                                       t_wall_v(l)%t(iwl,m)
1877                   ENDDO
1878                ENDIF
1879
1880            CASE ( 'usm_t_window' )
1881!
1882!--             Window temperature for  iwl layer of walls and land
1883                IF ( l == -1 )  THEN
1884                   DO  m = 1, surf_usm_h%ns
1885                      surf_usm_h%t_window_av(iwl,m) = surf_usm_h%t_window_av(iwl,m) +              &
1886                                                      t_window_h(iwl,m)
1887                   ENDDO
1888                ELSE
1889                   DO  m = 1, surf_usm_v(l)%ns
1890                      surf_usm_v(l)%t_window_av(iwl,m) = surf_usm_v(l)%t_window_av(iwl,m) +        &
1891                                                         t_window_v(l)%t(iwl,m)
1892                   ENDDO
1893                ENDIF
1894
1895            CASE ( 'usm_t_green' )
1896!
1897!--             Green temperature for  iwl layer of walls and land
1898                IF ( l == -1 )  THEN
1899                   DO  m = 1, surf_usm_h%ns
1900                      surf_usm_h%t_green_av(iwl,m) = surf_usm_h%t_green_av(iwl,m) + t_green_h(iwl,m)
1901                   ENDDO
1902                ELSE
1903                   DO  m = 1, surf_usm_v(l)%ns
1904                      surf_usm_v(l)%t_green_av(iwl,m) = surf_usm_v(l)%t_green_av(iwl,m) +          &
1905                                                        t_green_v(l)%t(iwl,m)
1906                   ENDDO
1907                ENDIF
1908
1909            CASE ( 'usm_swc' )
1910!
1911!--             Soil water content for  iwl layer of walls and land
1912                IF ( l == -1 )  THEN
1913                   DO  m = 1, surf_usm_h%ns
1914                      surf_usm_h%swc_av(iwl,m) = surf_usm_h%swc_av(iwl,m) + swc_h(iwl,m)
1915                   ENDDO
1916                ELSE
1917                ENDIF
1918
1919            CASE DEFAULT
1920                CONTINUE
1921
1922       END SELECT
1923
1924    ELSEIF ( mode == 'average' )  THEN
1925
1926       SELECT CASE ( TRIM( var ) )
1927
1928            CASE ( 'usm_wshf' )
1929!
1930!--             Array of sensible heat flux from surfaces (land, roof, wall)
1931                IF ( l == -1 )  THEN
1932                   DO  m = 1, surf_usm_h%ns
1933                      surf_usm_h%wshf_eb_av(m) = surf_usm_h%wshf_eb_av(m) /                        &
1934                                                 REAL( average_count_3d, kind=wp )
1935                   ENDDO
1936                ELSE
1937                   DO  m = 1, surf_usm_v(l)%ns
1938                      surf_usm_v(l)%wshf_eb_av(m) = surf_usm_v(l)%wshf_eb_av(m) /                  &
1939                                                    REAL( average_count_3d, kind=wp )
1940                   ENDDO
1941                ENDIF
1942
1943            CASE ( 'usm_qsws' )
1944!
1945!--             Array of latent heat flux from surfaces (land, roof, wall)
1946                IF ( l == -1 )  THEN
1947                DO  m = 1, surf_usm_h%ns
1948                   surf_usm_h%qsws_av(m) = surf_usm_h%qsws_av(m) /                                 &
1949                                           REAL( average_count_3d, kind=wp )
1950                ENDDO
1951                ELSE
1952                   DO  m = 1, surf_usm_v(l)%ns
1953                      surf_usm_v(l)%qsws_av(m) = surf_usm_v(l)%qsws_av(m) /                        &
1954                                                 REAL( average_count_3d, kind=wp )
1955                   ENDDO
1956                ENDIF
1957
1958            CASE ( 'usm_qsws_veg' )
1959!
1960!--             Array of latent heat flux from vegetation surfaces (land, roof, wall)
1961                IF ( l == -1 )  THEN
1962                DO  m = 1, surf_usm_h%ns
1963                   surf_usm_h%qsws_veg_av(m) = surf_usm_h%qsws_veg_av(m) /                         &
1964                                               REAL( average_count_3d, kind=wp )
1965                ENDDO
1966                ELSE
1967                   DO  m = 1, surf_usm_v(l)%ns
1968                      surf_usm_v(l)%qsws_veg_av(m) = surf_usm_v(l)%qsws_veg_av(m) /                &
1969                                                     REAL( average_count_3d, kind=wp )
1970                   ENDDO
1971                ENDIF
1972
1973            CASE ( 'usm_qsws_liq' )
1974!
1975!--             Array of latent heat flux from surfaces with liquid (land, roof, wall)
1976                IF ( l == -1 )  THEN
1977                DO  m = 1, surf_usm_h%ns
1978                   surf_usm_h%qsws_liq_av(m) = surf_usm_h%qsws_liq_av(m) /                         &
1979                                               REAL( average_count_3d, kind=wp )
1980                ENDDO
1981                ELSE
1982                   DO  m = 1, surf_usm_v(l)%ns
1983                      surf_usm_v(l)%qsws_liq_av(m) = surf_usm_v(l)%qsws_liq_av(m) /                &
1984                                                     REAL( average_count_3d, kind=wp )
1985                   ENDDO
1986                ENDIF
1987
1988            CASE ( 'usm_wghf' )
1989!
1990!--             Array of heat flux from ground (wall, roof, land)
1991                IF ( l == -1 )  THEN
1992                   DO  m = 1, surf_usm_h%ns
1993                      surf_usm_h%wghf_eb_av(m) = surf_usm_h%wghf_eb_av(m) /                        &
1994                                                 REAL( average_count_3d, kind=wp )
1995                   ENDDO
1996                ELSE
1997                   DO  m = 1, surf_usm_v(l)%ns
1998                      surf_usm_v(l)%wghf_eb_av(m) = surf_usm_v(l)%wghf_eb_av(m) /                  &
1999                                                    REAL( average_count_3d, kind=wp )
2000                   ENDDO
2001                ENDIF
2002
2003            CASE ( 'usm_wghf_window' )
2004!
2005!--             Array of heat flux from window ground (wall, roof, land)
2006                IF ( l == -1 )  THEN
2007                   DO  m = 1, surf_usm_h%ns
2008                      surf_usm_h%wghf_eb_window_av(m) = surf_usm_h%wghf_eb_window_av(m) /          &
2009                                                        REAL( average_count_3d, kind=wp )
2010                   ENDDO
2011                ELSE
2012                   DO  m = 1, surf_usm_v(l)%ns
2013                      surf_usm_v(l)%wghf_eb_window_av(m) = surf_usm_v(l)%wghf_eb_window_av(m) /    &
2014                                                           REAL( average_count_3d, kind=wp )
2015                   ENDDO
2016                ENDIF
2017
2018            CASE ( 'usm_wghf_green' )
2019!
2020!--             Array of heat flux from green ground (wall, roof, land)
2021                IF ( l == -1 )  THEN
2022                   DO  m = 1, surf_usm_h%ns
2023                      surf_usm_h%wghf_eb_green_av(m) = surf_usm_h%wghf_eb_green_av(m) /            &
2024                                                       REAL( average_count_3d, kind=wp )
2025                   ENDDO
2026                ELSE
2027                   DO  m = 1, surf_usm_v(l)%ns
2028                      surf_usm_v(l)%wghf_eb_green_av(m) = surf_usm_v(l)%wghf_eb_green_av(m) /      &
2029                                                          REAL( average_count_3d, kind=wp )
2030                   ENDDO
2031                ENDIF
2032
2033            CASE ( 'usm_iwghf' )
2034!
2035!--             Array of heat flux from indoor ground (wall, roof, land)
2036                IF ( l == -1 )  THEN
2037                   DO  m = 1, surf_usm_h%ns
2038                      surf_usm_h%iwghf_eb_av(m) = surf_usm_h%iwghf_eb_av(m) /                      &
2039                                                  REAL( average_count_3d, kind=wp )
2040                   ENDDO
2041                ELSE
2042                   DO  m = 1, surf_usm_v(l)%ns
2043                      surf_usm_v(l)%iwghf_eb_av(m) = surf_usm_v(l)%iwghf_eb_av(m) /                &
2044                                                     REAL( average_count_3d, kind=wp )
2045                   ENDDO
2046                ENDIF
2047
2048            CASE ( 'usm_iwghf_window' )
2049!
2050!--             Array of heat flux from indoor window ground (wall, roof, land)
2051                IF ( l == -1 )  THEN
2052                   DO  m = 1, surf_usm_h%ns
2053                      surf_usm_h%iwghf_eb_window_av(m) = surf_usm_h%iwghf_eb_window_av(m) /        &
2054                                                         REAL( average_count_3d, kind=wp )
2055                   ENDDO
2056                ELSE
2057                   DO  m = 1, surf_usm_v(l)%ns
2058                      surf_usm_v(l)%iwghf_eb_window_av(m) = surf_usm_v(l)%iwghf_eb_window_av(m) /  &
2059                                                            REAL( average_count_3d, kind=wp )
2060                   ENDDO
2061                ENDIF
2062
2063            CASE ( 'usm_t_surf_wall' )
2064!
2065!--             Surface temperature for surfaces
2066                IF ( l == -1 )  THEN
2067                   DO  m = 1, surf_usm_h%ns
2068                   surf_usm_h%t_surf_wall_av(m) = surf_usm_h%t_surf_wall_av(m) /                   &
2069                                                  REAL( average_count_3d, kind=wp )
2070                   ENDDO
2071                ELSE
2072                   DO  m = 1, surf_usm_v(l)%ns
2073                      surf_usm_v(l)%t_surf_wall_av(m) = surf_usm_v(l)%t_surf_wall_av(m) /          &
2074                                                        REAL( average_count_3d, kind=wp )
2075                   ENDDO
2076                ENDIF
2077
2078            CASE ( 'usm_t_surf_window' )
2079!
2080!--             Surface temperature for window surfaces
2081                IF ( l == -1 )  THEN
2082                   DO  m = 1, surf_usm_h%ns
2083                      surf_usm_h%t_surf_window_av(m) = surf_usm_h%t_surf_window_av(m) /            &
2084                                                       REAL( average_count_3d, kind=wp )
2085                   ENDDO
2086                ELSE
2087                   DO  m = 1, surf_usm_v(l)%ns
2088                      surf_usm_v(l)%t_surf_window_av(m) = surf_usm_v(l)%t_surf_window_av(m) /      &
2089                                                          REAL( average_count_3d, kind=wp )
2090                   ENDDO
2091                ENDIF
2092
2093            CASE ( 'usm_t_surf_green' )
2094!
2095!--             Surface temperature for green surfaces
2096                IF ( l == -1 )  THEN
2097                   DO  m = 1, surf_usm_h%ns
2098                      surf_usm_h%t_surf_green_av(m) = surf_usm_h%t_surf_green_av(m) /              &
2099                                                      REAL( average_count_3d, kind=wp )
2100                   ENDDO
2101                ELSE
2102                   DO  m = 1, surf_usm_v(l)%ns
2103                      surf_usm_v(l)%t_surf_green_av(m) = surf_usm_v(l)%t_surf_green_av(m) /        &
2104                                                         REAL( average_count_3d, kind=wp )
2105                   ENDDO
2106                ENDIF
2107
2108            CASE ( 'usm_theta_10cm' )
2109!
2110!--             Near surface temperature for whole surfaces
2111                IF ( l == -1 )  THEN
2112                   DO  m = 1, surf_usm_h%ns
2113                      surf_usm_h%pt_10cm_av(m) = surf_usm_h%pt_10cm_av(m) /                        &
2114                                                 REAL( average_count_3d, kind=wp )
2115                   ENDDO
2116                ELSE
2117                   DO  m = 1, surf_usm_v(l)%ns
2118                      surf_usm_v(l)%pt_10cm_av(m) = surf_usm_v(l)%pt_10cm_av(m) /                  &
2119                                                    REAL( average_count_3d, kind=wp )
2120                   ENDDO
2121                ENDIF
2122
2123
2124            CASE ( 'usm_t_wall' )
2125!
2126!--             Wall temperature for  iwl layer of walls and land
2127                IF ( l == -1 )  THEN
2128                   DO  m = 1, surf_usm_h%ns
2129                      surf_usm_h%t_wall_av(iwl,m) = surf_usm_h%t_wall_av(iwl,m) /                  &
2130                                                    REAL( average_count_3d, kind=wp )
2131                   ENDDO
2132                ELSE
2133                   DO  m = 1, surf_usm_v(l)%ns
2134                      surf_usm_v(l)%t_wall_av(iwl,m) = surf_usm_v(l)%t_wall_av(iwl,m) /            &
2135                                                       REAL( average_count_3d, kind=wp )
2136                   ENDDO
2137                ENDIF
2138
2139            CASE ( 'usm_t_window' )
2140!
2141!--             Window temperature for  iwl layer of walls and land
2142                IF ( l == -1 )  THEN
2143                   DO  m = 1, surf_usm_h%ns
2144                      surf_usm_h%t_window_av(iwl,m) = surf_usm_h%t_window_av(iwl,m) /              &
2145                                                      REAL( average_count_3d, kind=wp )
2146                   ENDDO
2147                ELSE
2148                   DO  m = 1, surf_usm_v(l)%ns
2149                      surf_usm_v(l)%t_window_av(iwl,m) = surf_usm_v(l)%t_window_av(iwl,m) /        &
2150                                                         REAL( average_count_3d, kind=wp )
2151                   ENDDO
2152                ENDIF
2153
2154            CASE ( 'usm_t_green' )
2155!
2156!--             Green temperature for  iwl layer of walls and land
2157                IF ( l == -1 )  THEN
2158                   DO  m = 1, surf_usm_h%ns
2159                      surf_usm_h%t_green_av(iwl,m) = surf_usm_h%t_green_av(iwl,m) /                &
2160                                                     REAL( average_count_3d, kind=wp )
2161                   ENDDO
2162                ELSE
2163                   DO  m = 1, surf_usm_v(l)%ns
2164                      surf_usm_v(l)%t_green_av(iwl,m) = surf_usm_v(l)%t_green_av(iwl,m) /          &
2165                                                        REAL( average_count_3d, kind=wp )
2166                   ENDDO
2167                ENDIF
2168
2169            CASE ( 'usm_swc' )
2170!
2171!--             Soil water content for  iwl layer of walls and land
2172                IF ( l == -1 )  THEN
2173                DO  m = 1, surf_usm_h%ns
2174                   surf_usm_h%swc_av(iwl,m) = surf_usm_h%swc_av(iwl,m) /                           &
2175                                              REAL( average_count_3d, kind=wp )
2176                ENDDO
2177                ELSE
2178                   DO  m = 1, surf_usm_v(l)%ns
2179                      surf_usm_v(l)%swc_av(iwl,m) = surf_usm_v(l)%swc_av(iwl,m) /                  &
2180                                                    REAL( average_count_3d, kind=wp )
2181                   ENDDO
2182                ENDIF
2183
2184
2185       END SELECT
2186
2187    ENDIF
2188
2189    ENDIF
2190
2191 END SUBROUTINE usm_3d_data_averaging
2192
2193
2194
2195!--------------------------------------------------------------------------------------------------!
2196! Description:
2197! ------------
2198!> Set internal Neumann boundary condition at outer soil grid points for temperature and humidity.
2199!--------------------------------------------------------------------------------------------------!
2200 SUBROUTINE usm_boundary_condition
2201
2202    IMPLICIT NONE
2203
2204    INTEGER(iwp) ::  i      !< grid index x-direction
2205    INTEGER(iwp) ::  ioff   !< offset index x-direction indicating location of soil grid point
2206    INTEGER(iwp) ::  j      !< grid index y-direction
2207    INTEGER(iwp) ::  joff   !< offset index x-direction indicating location of soil grid point
2208    INTEGER(iwp) ::  k      !< grid index z-direction
2209    INTEGER(iwp) ::  koff   !< offset index x-direction indicating location of soil grid point
2210    INTEGER(iwp) ::  l      !< running index surface-orientation
2211    INTEGER(iwp) ::  m      !< running index surface elements
2212
2213    koff = surf_usm_h%koff
2214    DO  m = 1, surf_usm_h%ns
2215       i = surf_usm_h%i(m)
2216       j = surf_usm_h%j(m)
2217       k = surf_usm_h%k(m)
2218       pt(k+koff,j,i) = pt(k,j,i)
2219    ENDDO
2220
2221    DO  l = 0, 3
2222       ioff = surf_usm_v(l)%ioff
2223       joff = surf_usm_v(l)%joff
2224       DO  m = 1, surf_usm_v(l)%ns
2225          i = surf_usm_v(l)%i(m)
2226          j = surf_usm_v(l)%j(m)
2227          k = surf_usm_v(l)%k(m)
2228          pt(k,j+joff,i+ioff) = pt(k,j,i)
2229       ENDDO
2230    ENDDO
2231
2232 END SUBROUTINE usm_boundary_condition
2233
2234
2235!--------------------------------------------------------------------------------------------------!
2236!
2237! Description:
2238! ------------
2239!> Subroutine checks variables and assigns units.
2240!> It is called out from subroutine check_parameters.
2241!--------------------------------------------------------------------------------------------------!
2242 SUBROUTINE usm_check_data_output( variable, unit )
2243
2244    IMPLICIT NONE
2245
2246    CHARACTER(LEN=*),INTENT(IN)    ::  variable   !<
2247    CHARACTER(LEN=*),INTENT(OUT)   ::  unit       !<
2248
2249    CHARACTER(LEN=2)                              ::  ls            !<
2250
2251    CHARACTER(LEN=varnamelength)                  ::  var           !< TRIM(variable)
2252
2253    INTEGER(iwp)                                  ::  i,j,l         !< index
2254
2255    INTEGER(iwp), PARAMETER                       ::  nl1 = 15      !< number of directional usm variables
2256    CHARACTER(LEN=varnamelength), DIMENSION(nl1)  ::  varlist1 = &  !< list of directional usm variables
2257              (/'usm_wshf                      ', &
2258                'usm_wghf                      ', &
2259                'usm_wghf_window               ', &
2260                'usm_wghf_green                ', &
2261                'usm_iwghf                     ', &
2262                'usm_iwghf_window              ', &
2263                'usm_surfz                     ', &
2264                'usm_surfwintrans              ', &
2265                'usm_surfcat                   ', &
2266                'usm_t_surf_wall               ', &
2267                'usm_t_surf_window             ', &
2268                'usm_t_surf_green              ', &
2269                'usm_t_green                   ', &
2270                'usm_qsws                      ', &
2271                'usm_theta_10cm                '/)
2272
2273    INTEGER(iwp), PARAMETER                       ::  nl2 = 3       !< number of directional layer usm variables
2274    CHARACTER(LEN=varnamelength), DIMENSION(nl2)  ::  varlist2 = &  !< list of directional layer usm variables
2275              (/'usm_t_wall                    ', &
2276                'usm_t_window                  ', &
2277                'usm_t_green                   '/)
2278
2279    INTEGER(iwp), PARAMETER                       ::  nd = 5     !< number of directions
2280    CHARACTER(LEN=6), DIMENSION(nd), PARAMETER    ::  dirname = &  !< direction names
2281              (/'_roof ','_south','_north','_west ','_east '/)
2282
2283    LOGICAL                                       ::  lfound     !< flag if the variable is found
2284
2285
2286    lfound = .FALSE.
2287
2288    var = TRIM( variable )
2289
2290!
2291!-- Check if variable exists
2292!-- Directional variables
2293    DO  i = 1, nl1
2294       DO  j = 1, nd
2295          IF ( TRIM( var ) == TRIM( varlist1(i)) // TRIM( dirname(j) ) )  THEN
2296             lfound = .TRUE.
2297             EXIT
2298          ENDIF
2299          IF ( lfound )  EXIT
2300       ENDDO
2301    ENDDO
2302    IF ( lfound )  GOTO 10
2303!
2304!-- Directional layer variables
2305    DO  i = 1, nl2
2306       DO  j = 1, nd
2307          DO  l = nzb_wall, nzt_wall
2308             WRITE( ls,'(A1,I1)' ) '_', l
2309             IF ( TRIM( var ) == TRIM( varlist2(i) ) // TRIM( ls ) // TRIM( dirname(j) ) )  THEN
2310                lfound = .TRUE.
2311                EXIT
2312             ENDIF
2313          ENDDO
2314          IF ( lfound )  EXIT
2315       ENDDO
2316    ENDDO
2317    IF ( .NOT.  lfound )  THEN
2318       unit = 'illegal'
2319       RETURN
2320    ENDIF
232110  CONTINUE
2322
2323    IF ( var(1:9)  == 'usm_wshf_'  .OR.  var(1:9) == 'usm_wghf_' .OR.                              &
2324         var(1:16) == 'usm_wghf_window_' .OR. var(1:15) == 'usm_wghf_green_' .OR.                  &
2325         var(1:10) == 'usm_iwghf_' .OR. var(1:17) == 'usm_iwghf_window_'    .OR.                   &
2326         var(1:17) == 'usm_surfwintrans_' .OR.                                                     &
2327         var(1:9)  == 'usm_qsws_'  .OR.  var(1:13)  == 'usm_qsws_veg_'  .OR.                       &
2328         var(1:13) == 'usm_qsws_liq_' )  THEN
2329        unit = 'W/m2'
2330    ELSE IF ( var(1:15) == 'usm_t_surf_wall'   .OR.  var(1:10) == 'usm_t_wall' .OR.                &
2331              var(1:12) == 'usm_t_window' .OR. var(1:17) == 'usm_t_surf_window' .OR.               &
2332              var(1:16) == 'usm_t_surf_green'  .OR.                                                &
2333              var(1:11) == 'usm_t_green' .OR.  var(1:7) == 'usm_swc' .OR.                          &
2334              var(1:14) == 'usm_theta_10cm' )  THEN
2335        unit = 'K'
2336    ELSE IF ( var(1:9) == 'usm_surfz'  .OR.  var(1:11) == 'usm_surfcat' )  THEN
2337        unit = '1'
2338    ELSE
2339        unit = 'illegal'
2340    ENDIF
2341
2342 END SUBROUTINE usm_check_data_output
2343
2344
2345!--------------------------------------------------------------------------------------------------!
2346! Description:
2347! ------------
2348!> Check parameters routine for urban surface model
2349!--------------------------------------------------------------------------------------------------!
2350 SUBROUTINE usm_check_parameters
2351
2352    USE control_parameters,                                                                        &
2353        ONLY:  bc_pt_b,                                                                            &
2354               bc_q_b,                                                                             &
2355               constant_flux_layer,                                                                &
2356               large_scale_forcing,                                                                &
2357               lsf_surf,                                                                           &
2358               topography
2359
2360    USE netcdf_data_input_mod,                                                                     &
2361         ONLY:  building_type_f
2362
2363    IMPLICIT NONE
2364
2365    INTEGER(iwp) ::  i  !< running index, x-dimension
2366    INTEGER(iwp) ::  j  !< running index, y-dimension
2367
2368!
2369!-- Dirichlet boundary conditions are required as the surface fluxes are calculated from the
2370!-- temperature/humidity gradients in the urban surface model
2371    IF ( bc_pt_b == 'neumann'   .OR.   bc_q_b == 'neumann' )  THEN
2372       message_string = 'urban surface model requires setting of bc_pt_b = "dirichlet" and '//     &
2373                        'bc_q_b  = "dirichlet"'
2374       CALL message( 'usm_check_parameters', 'PA0590', 1, 2, 0, 6, 0 )
2375    ENDIF
2376
2377    IF ( .NOT.  constant_flux_layer )  THEN
2378       message_string = 'urban surface model requires constant_flux_layer = .TRUE.'
2379       CALL message( 'usm_check_parameters', 'PA0084', 1, 2, 0, 6, 0 )
2380    ENDIF
2381
2382    IF (  .NOT.  radiation )  THEN
2383       message_string = 'urban surface model requires the radiation model to be switched on'
2384       CALL message( 'usm_check_parameters', 'PA0084', 1, 2, 0, 6, 0 )
2385    ENDIF
2386!
2387!-- Surface forcing has to be disabled for LSF in case of enabled urban surface module
2388    IF ( large_scale_forcing )  THEN
2389       lsf_surf = .FALSE.
2390    ENDIF
2391!
2392!-- Topography
2393    IF ( topography == 'flat' )  THEN
2394       message_string = 'topography /= "flat" is required when using the urban surface model'
2395       CALL message( 'usm_check_parameters', 'PA0592', 1, 2, 0, 6, 0 )
2396    ENDIF
2397!
2398!-- Naheatlayers
2399    IF ( naheatlayers > nzt )  THEN
2400       message_string = 'number of anthropogenic heat layers "naheatlayers" can not be larger ' // &
2401                        'than number of domain layers "nzt"'
2402       CALL message( 'usm_check_parameters', 'PA0593', 1, 2, 0, 6, 0 )
2403    ENDIF
2404!
2405!-- Check if building types are set within a valid range.
2406    IF ( building_type < LBOUND( building_pars, 2 )  .AND.                                         &
2407         building_type > UBOUND( building_pars, 2 ) )  THEN
2408       WRITE( message_string, * ) 'building_type = ', building_type, ' is out of the valid range'
2409       CALL message( 'usm_check_parameters', 'PA0529', 2, 2, 0, 6, 0 )
2410    ENDIF
2411    IF ( building_type_f%from_file )  THEN
2412       DO  i = nxl, nxr
2413          DO  j = nys, nyn
2414             IF ( building_type_f%var(j,i) /= building_type_f%fill  .AND.                          &
2415           ( building_type_f%var(j,i) < LBOUND( building_pars, 2 )  .OR.                           &
2416             building_type_f%var(j,i) > UBOUND( building_pars, 2 ) ) )  THEN
2417                WRITE( message_string, * ) 'building_type = is out of the valid range at (j,i) = ' &
2418                                           , j, i
2419                CALL message( 'usm_check_parameters', 'PA0529', 2, 2, myid, 6, 0 )
2420             ENDIF
2421          ENDDO
2422       ENDDO
2423    ENDIF
2424 END SUBROUTINE usm_check_parameters
2425
2426
2427!--------------------------------------------------------------------------------------------------!
2428!
2429! Description:
2430! ------------
2431!> Output of the 3D-arrays in netCDF and/or AVS format for variables of urban_surface model.
2432!> It resorts the urban surface module output quantities from surf style indexing into temporary 3D
2433!> array with indices (i,j,k). It is called from subroutine data_output_3d.
2434!--------------------------------------------------------------------------------------------------!
2435 SUBROUTINE usm_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
2436
2437    IMPLICIT NONE
2438
2439    CHARACTER(LEN=*), INTENT(IN)   ::  variable  !< variable name
2440
2441    CHARACTER(LEN=varnamelength)   ::  var  !< trimmed variable name
2442
2443    INTEGER(iwp), INTENT(IN)       ::  av        !< flag if averaged
2444    INTEGER(iwp), INTENT(IN)       ::  nzb_do    !< lower limit of the data output (usually 0)
2445    INTEGER(iwp), INTENT(IN)       ::  nzt_do    !< vertical upper limit of the data output (usually nz_do3d)
2446
2447    INTEGER(iwp), PARAMETER                            ::  nd = 5  !< number of directions
2448    INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER         ::  dirint =  (/    iup_u, isouth_u, inorth_u,  iwest_u,  ieast_u /)  !<
2449    INTEGER(iwp), DIMENSION(0:nd-1), PARAMETER         ::  diridx =  (/       -1,        1,        0,        3,        2 /)
2450                                                           !< index for surf_*_v: 0:3 = (North, South, East, West)
2451    CHARACTER(LEN=6), DIMENSION(0:nd-1), PARAMETER     ::  dirname = (/ '_roof ', '_south', '_north', '_west ', '_east ' /)  !<
2452
2453
2454    INTEGER(iwp)  ::  ids, idsint, idsidx        !<
2455    INTEGER(iwp)  ::  i, j, k, iwl, istat, l, m  !< running indices
2456
2457    LOGICAL, INTENT(OUT)           ::  found     !<
2458
2459    REAL(sp), DIMENSION(nxl:nxr,nys:nyn,nzb_do:nzt_do) ::  local_pf  !< sp - it has to correspond to module data_output_3d
2460    REAL(sp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr)     ::  temp_pf   !< temp array for urban surface output procedure
2461
2462    found = .TRUE.
2463    temp_pf = -1._wp
2464
2465    ids = -1
2466    var = TRIM( variable )
2467    DO i = 0, nd-1
2468        k = len( TRIM( var ) )
2469        j = len( TRIM( dirname(i) ) )
2470        IF ( TRIM( var(k-j+1:k) ) == TRIM( dirname(i) ) )  THEN
2471            ids = i
2472            idsint = dirint(ids)
2473            idsidx = diridx(ids)
2474            var = var(:k-j)
2475            EXIT
2476        ENDIF
2477    ENDDO
2478    IF ( ids == -1 )  THEN
2479        var = TRIM( variable )
2480    ENDIF
2481    IF ( var(1:11) == 'usm_t_wall_'  .AND.  len( TRIM( var ) ) >= 12 )  THEN
2482!
2483!--     Wall layers
2484        READ( var(12:12), '(I1)', iostat = istat ) iwl
2485        IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
2486            var = var(1:10)
2487        ENDIF
2488    ENDIF
2489    IF ( var(1:13) == 'usm_t_window_'  .AND.  len( TRIM( var ) ) >= 14 )  THEN
2490!
2491!--     Window layers
2492        READ( var(14:14), '(I1)', iostat = istat ) iwl
2493        IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
2494            var = var(1:12)
2495        ENDIF
2496    ENDIF
2497    IF ( var(1:12) == 'usm_t_green_'  .AND.  len( TRIM( var ) ) >= 13 )  THEN
2498!
2499!--     Green layers
2500        READ( var(13:13), '(I1)', iostat = istat ) iwl
2501        IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
2502            var = var(1:11)
2503        ENDIF
2504    ENDIF
2505    IF ( var(1:8) == 'usm_swc_'  .AND.  len( TRIM( var ) ) >= 9 )  THEN
2506!
2507!--     Green layers soil water content
2508        READ( var(9:9), '(I1)', iostat = istat ) iwl
2509        IF ( istat == 0  .AND.  iwl >= nzb_wall  .AND.  iwl <= nzt_wall )  THEN
2510            var = var(1:7)
2511        ENDIF
2512    ENDIF
2513
2514    SELECT CASE ( TRIM( var ) )
2515
2516      CASE ( 'usm_surfz' )
2517!
2518!--       Array of surface height (z)
2519          IF ( idsint == iup_u )  THEN
2520             DO  m = 1, surf_usm_h%ns
2521                i = surf_usm_h%i(m)
2522                j = surf_usm_h%j(m)
2523                k = surf_usm_h%k(m)
2524                temp_pf(0,j,i) = MAX( temp_pf(0,j,i), REAL( k, KIND = sp) )
2525             ENDDO
2526          ELSE
2527             l = idsidx
2528             DO  m = 1, surf_usm_v(l)%ns
2529                i = surf_usm_v(l)%i(m)
2530                j = surf_usm_v(l)%j(m)
2531                k = surf_usm_v(l)%k(m)
2532                temp_pf(0,j,i) = MAX( temp_pf(0,j,i), REAL( k, KIND = sp) + 1.0_sp )
2533             ENDDO
2534          ENDIF
2535
2536      CASE ( 'usm_surfcat' )
2537!
2538!--       Surface category
2539          IF ( idsint == iup_u )  THEN
2540             DO  m = 1, surf_usm_h%ns
2541                i = surf_usm_h%i(m)
2542                j = surf_usm_h%j(m)
2543                k = surf_usm_h%k(m)
2544                temp_pf(k,j,i) = surf_usm_h%surface_types(m)
2545             ENDDO
2546          ELSE
2547             l = idsidx
2548             DO  m = 1, surf_usm_v(l)%ns
2549                i = surf_usm_v(l)%i(m)
2550                j = surf_usm_v(l)%j(m)
2551                k = surf_usm_v(l)%k(m)
2552                temp_pf(k,j,i) = surf_usm_v(l)%surface_types(m)
2553             ENDDO
2554          ENDIF
2555
2556      CASE ( 'usm_surfwintrans' )
2557!
2558!--       Transmissivity window tiles
2559          IF ( idsint == iup_u )  THEN
2560             DO  m = 1, surf_usm_h%ns
2561                i = surf_usm_h%i(m)
2562                j = surf_usm_h%j(m)
2563                k = surf_usm_h%k(m)
2564                temp_pf(k,j,i) = surf_usm_h%transmissivity(m)
2565             ENDDO
2566          ELSE
2567             l = idsidx
2568             DO  m = 1, surf_usm_v(l)%ns
2569                i = surf_usm_v(l)%i(m)
2570                j = surf_usm_v(l)%j(m)
2571                k = surf_usm_v(l)%k(m)
2572                temp_pf(k,j,i) = surf_usm_v(l)%transmissivity(m)
2573             ENDDO
2574          ENDIF
2575
2576      CASE ( 'usm_wshf' )
2577!
2578!--       Array of sensible heat flux from surfaces
2579          IF ( av == 0 )  THEN
2580             IF ( idsint == iup_u )  THEN
2581                DO  m = 1, surf_usm_h%ns
2582                   i = surf_usm_h%i(m)
2583                   j = surf_usm_h%j(m)
2584                   k = surf_usm_h%k(m)
2585                   temp_pf(k,j,i) = surf_usm_h%wshf_eb(m)
2586                ENDDO
2587             ELSE
2588                l = idsidx
2589                DO  m = 1, surf_usm_v(l)%ns
2590                   i = surf_usm_v(l)%i(m)
2591                   j = surf_usm_v(l)%j(m)
2592                   k = surf_usm_v(l)%k(m)
2593                   temp_pf(k,j,i) = surf_usm_v(l)%wshf_eb(m)
2594                ENDDO
2595             ENDIF
2596          ELSE
2597             IF ( idsint == iup_u )  THEN
2598                DO  m = 1, surf_usm_h%ns
2599                   i = surf_usm_h%i(m)
2600                   j = surf_usm_h%j(m)
2601                   k = surf_usm_h%k(m)
2602                   temp_pf(k,j,i) = surf_usm_h%wshf_eb_av(m)
2603                ENDDO
2604             ELSE
2605                l = idsidx
2606                DO  m = 1, surf_usm_v(l)%ns
2607                   i = surf_usm_v(l)%i(m)
2608                   j = surf_usm_v(l)%j(m)
2609                   k = surf_usm_v(l)%k(m)
2610                   temp_pf(k,j,i) = surf_usm_v(l)%wshf_eb_av(m)
2611                ENDDO
2612             ENDIF
2613          ENDIF
2614
2615
2616      CASE ( 'usm_qsws' )
2617!
2618!--       Array of latent heat flux from surfaces
2619          IF ( av == 0 )  THEN
2620             IF ( idsint == iup_u )  THEN
2621                DO  m = 1, surf_usm_h%ns
2622                   i = surf_usm_h%i(m)
2623                   j = surf_usm_h%j(m)
2624                   k = surf_usm_h%k(m)
2625                   temp_pf(k,j,i) = surf_usm_h%qsws(m) * l_v
2626                ENDDO
2627             ELSE
2628                l = idsidx
2629                DO  m = 1, surf_usm_v(l)%ns
2630                   i = surf_usm_v(l)%i(m)
2631                   j = surf_usm_v(l)%j(m)
2632                   k = surf_usm_v(l)%k(m)
2633                   temp_pf(k,j,i) = surf_usm_v(l)%qsws(m) * l_v
2634                ENDDO
2635             ENDIF
2636          ELSE
2637             IF ( idsint == iup_u )  THEN
2638                DO  m = 1, surf_usm_h%ns
2639                   i = surf_usm_h%i(m)
2640                   j = surf_usm_h%j(m)
2641                   k = surf_usm_h%k(m)
2642                   temp_pf(k,j,i) = surf_usm_h%qsws_av(m)
2643                ENDDO
2644             ELSE
2645                l = idsidx
2646                DO  m = 1, surf_usm_v(l)%ns
2647                   i = surf_usm_v(l)%i(m)
2648                   j = surf_usm_v(l)%j(m)
2649                   k = surf_usm_v(l)%k(m)
2650                   temp_pf(k,j,i) = surf_usm_v(l)%qsws_av(m)
2651                ENDDO
2652             ENDIF
2653          ENDIF
2654
2655      CASE ( 'usm_qsws_veg' )
2656!
2657!--       Array of latent heat flux from vegetation surfaces
2658          IF ( av == 0 )  THEN
2659             IF ( idsint == iup_u )  THEN
2660                DO  m = 1, surf_usm_h%ns
2661                   i = surf_usm_h%i(m)
2662                   j = surf_usm_h%j(m)
2663                   k = surf_usm_h%k(m)
2664                   temp_pf(k,j,i) = surf_usm_h%qsws_veg(m)
2665                ENDDO
2666             ELSE
2667                l = idsidx
2668                DO  m = 1, surf_usm_v(l)%ns
2669                   i = surf_usm_v(l)%i(m)
2670                   j = surf_usm_v(l)%j(m)
2671                   k = surf_usm_v(l)%k(m)
2672                   temp_pf(k,j,i) = surf_usm_v(l)%qsws_veg(m)
2673                ENDDO
2674             ENDIF
2675          ELSE
2676             IF ( idsint == iup_u )  THEN
2677                DO  m = 1, surf_usm_h%ns
2678                   i = surf_usm_h%i(m)
2679                   j = surf_usm_h%j(m)
2680                   k = surf_usm_h%k(m)
2681                   temp_pf(k,j,i) = surf_usm_h%qsws_veg_av(m)
2682                ENDDO
2683             ELSE
2684                l = idsidx
2685                DO  m = 1, surf_usm_v(l)%ns
2686                   i = surf_usm_v(l)%i(m)
2687                   j = surf_usm_v(l)%j(m)
2688                   k = surf_usm_v(l)%k(m)
2689                   temp_pf(k,j,i) = surf_usm_v(l)%qsws_veg_av(m)
2690                ENDDO
2691             ENDIF
2692          ENDIF
2693
2694      CASE ( 'usm_qsws_liq' )
2695!
2696!--       Array of latent heat flux from surfaces with liquid
2697          IF ( av == 0 )  THEN
2698             IF ( idsint == iup_u )  THEN
2699                DO  m = 1, surf_usm_h%ns
2700                   i = surf_usm_h%i(m)
2701                   j = surf_usm_h%j(m)
2702                   k = surf_usm_h%k(m)
2703                   temp_pf(k,j,i) = surf_usm_h%qsws_liq(m)
2704                ENDDO
2705             ELSE
2706                l = idsidx
2707                DO  m = 1, surf_usm_v(l)%ns
2708                   i = surf_usm_v(l)%i(m)
2709                   j = surf_usm_v(l)%j(m)
2710                   k = surf_usm_v(l)%k(m)
2711                   temp_pf(k,j,i) = surf_usm_v(l)%qsws_liq(m)
2712                ENDDO
2713             ENDIF
2714          ELSE
2715             IF ( idsint == iup_u )  THEN
2716                DO  m = 1, surf_usm_h%ns
2717                   i = surf_usm_h%i(m)
2718                   j = surf_usm_h%j(m)
2719                   k = surf_usm_h%k(m)
2720                   temp_pf(k,j,i) = surf_usm_h%qsws_liq_av(m)
2721                ENDDO
2722             ELSE
2723                l = idsidx
2724                DO  m = 1, surf_usm_v(l)%ns
2725                   i = surf_usm_v(l)%i(m)
2726                   j = surf_usm_v(l)%j(m)
2727                   k = surf_usm_v(l)%k(m)
2728                   temp_pf(k,j,i) = surf_usm_v(l)%qsws_liq_av(m)
2729                ENDDO
2730             ENDIF
2731          ENDIF
2732
2733      CASE ( 'usm_wghf' )
2734!
2735!--       Array of heat flux from ground (land, wall, roof)
2736          IF ( av == 0 )  THEN
2737             IF ( idsint == iup_u )  THEN
2738                DO  m = 1, surf_usm_h%ns
2739                   i = surf_usm_h%i(m)
2740                   j = surf_usm_h%j(m)
2741                   k = surf_usm_h%k(m)
2742                   temp_pf(k,j,i) = surf_usm_h%wghf_eb(m)
2743                ENDDO
2744             ELSE
2745                l = idsidx
2746                DO  m = 1, surf_usm_v(l)%ns
2747                   i = surf_usm_v(l)%i(m)
2748                   j = surf_usm_v(l)%j(m)
2749                   k = surf_usm_v(l)%k(m)
2750                   temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb(m)
2751                ENDDO
2752             ENDIF
2753          ELSE
2754             IF ( idsint == iup_u )  THEN
2755                DO  m = 1, surf_usm_h%ns
2756                   i = surf_usm_h%i(m)
2757                   j = surf_usm_h%j(m)
2758                   k = surf_usm_h%k(m)
2759                   temp_pf(k,j,i) = surf_usm_h%wghf_eb_av(m)
2760                ENDDO
2761             ELSE
2762                l = idsidx
2763                DO  m = 1, surf_usm_v(l)%ns
2764                   i = surf_usm_v(l)%i(m)
2765                   j = surf_usm_v(l)%j(m)
2766                   k = surf_usm_v(l)%k(m)
2767                   temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb_av(m)
2768                ENDDO
2769             ENDIF
2770          ENDIF
2771
2772      CASE ( 'usm_wghf_window' )
2773!
2774!--       Array of heat flux from window ground (land, wall, roof)
2775          IF ( av == 0 )  THEN
2776             IF ( idsint == iup_u )  THEN
2777                DO  m = 1, surf_usm_h%ns
2778                   i = surf_usm_h%i(m)
2779                   j = surf_usm_h%j(m)
2780                   k = surf_usm_h%k(m)
2781                   temp_pf(k,j,i) = surf_usm_h%wghf_eb_window(m)
2782                ENDDO
2783             ELSE
2784                l = idsidx
2785                DO  m = 1, surf_usm_v(l)%ns
2786                   i = surf_usm_v(l)%i(m)
2787                   j = surf_usm_v(l)%j(m)
2788                   k = surf_usm_v(l)%k(m)
2789                   temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb_window(m)
2790                ENDDO
2791             ENDIF
2792          ELSE
2793             IF ( idsint == iup_u )  THEN
2794                DO  m = 1, surf_usm_h%ns
2795                   i = surf_usm_h%i(m)
2796                   j = surf_usm_h%j(m)
2797                   k = surf_usm_h%k(m)
2798                   temp_pf(k,j,i) = surf_usm_h%wghf_eb_window_av(m)
2799                ENDDO
2800             ELSE
2801                l = idsidx
2802                DO  m = 1, surf_usm_v(l)%ns
2803                   i = surf_usm_v(l)%i(m)
2804                   j = surf_usm_v(l)%j(m)
2805                   k = surf_usm_v(l)%k(m)
2806                   temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb_window_av(m)
2807                ENDDO
2808             ENDIF
2809          ENDIF
2810
2811      CASE ( 'usm_wghf_green' )
2812!
2813!--       Array of heat flux from green ground (land, wall, roof)
2814          IF ( av == 0 )  THEN
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%wghf_eb_green(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)%wghf_eb_green(m)
2829                ENDDO
2830             ENDIF
2831          ELSE
2832             IF ( idsint == iup_u )  THEN
2833                DO  m = 1, surf_usm_h%ns
2834                   i = surf_usm_h%i(m)
2835                   j = surf_usm_h%j(m)
2836                   k = surf_usm_h%k(m)
2837                   temp_pf(k,j,i) = surf_usm_h%wghf_eb_green_av(m)
2838                ENDDO
2839             ELSE
2840                l = idsidx
2841                DO  m = 1, surf_usm_v(l)%ns
2842                   i = surf_usm_v(l)%i(m)
2843                   j = surf_usm_v(l)%j(m)
2844                   k = surf_usm_v(l)%k(m)
2845                   temp_pf(k,j,i) = surf_usm_v(l)%wghf_eb_green_av(m)
2846                ENDDO
2847             ENDIF
2848          ENDIF
2849
2850      CASE ( 'usm_iwghf' )
2851!
2852!--       Array of heat flux from indoor ground (land, wall, roof)
2853          IF ( av == 0 )  THEN
2854             IF ( idsint == iup_u )  THEN
2855                DO  m = 1, surf_usm_h%ns
2856                   i = surf_usm_h%i(m)
2857                   j = surf_usm_h%j(m)
2858                   k = surf_usm_h%k(m)
2859                   temp_pf(k,j,i) = surf_usm_h%iwghf_eb(m)
2860                ENDDO
2861             ELSE
2862                l = idsidx
2863                DO  m = 1, surf_usm_v(l)%ns
2864                   i = surf_usm_v(l)%i(m)
2865                   j = surf_usm_v(l)%j(m)
2866                   k = surf_usm_v(l)%k(m)
2867                   temp_pf(k,j,i) = surf_usm_v(l)%iwghf_eb(m)
2868                ENDDO
2869             ENDIF
2870          ELSE
2871             IF ( idsint == iup_u )  THEN
2872                DO  m = 1, surf_usm_h%ns
2873                   i = surf_usm_h%i(m)
2874                   j = surf_usm_h%j(m)
2875                   k = surf_usm_h%k(m)
2876                   temp_pf(k,j,i) = surf_usm_h%iwghf_eb_av(m)
2877                ENDDO
2878             ELSE
2879                l = idsidx
2880                DO  m = 1, surf_usm_v(l)%ns
2881                   i = surf_usm_v(l)%i(m)
2882                   j = surf_usm_v(l)%j(m)
2883                   k = surf_usm_v(l)%k(m)
2884                   temp_pf(k,j,i) = surf_usm_v(l)%iwghf_eb_av(m)
2885                ENDDO
2886             ENDIF
2887          ENDIF
2888
2889      CASE ( 'usm_iwghf_window' )
2890!
2891!--       Array of heat flux from indoor window ground (land, wall, roof)
2892          IF ( av == 0 )  THEN
2893             IF ( idsint == iup_u )  THEN
2894                DO  m = 1, surf_usm_h%ns
2895                   i = surf_usm_h%i(m)
2896                   j = surf_usm_h%j(m)
2897                   k = surf_usm_h%k(m)
2898                   temp_pf(k,j,i) = surf_usm_h%iwghf_eb_window(m)
2899                ENDDO
2900             ELSE
2901                l = idsidx
2902                DO  m = 1, surf_usm_v(l)%ns
2903                   i = surf_usm_v(l)%i(m)
2904                   j = surf_usm_v(l)%j(m)
2905                   k = surf_usm_v(l)%k(m)
2906                   temp_pf(k,j,i) = surf_usm_v(l)%iwghf_eb_window(m)
2907                ENDDO
2908             ENDIF
2909          ELSE
2910             IF ( idsint == iup_u )  THEN
2911                DO  m = 1, surf_usm_h%ns
2912                   i = surf_usm_h%i(m)
2913                   j = surf_usm_h%j(m)
2914                   k = surf_usm_h%k(m)
2915                   temp_pf(k,j,i) = surf_usm_h%iwghf_eb_window_av(m)
2916                ENDDO
2917             ELSE
2918                l = idsidx
2919                DO  m = 1, surf_usm_v(l)%ns
2920                   i = surf_usm_v(l)%i(m)
2921                   j = surf_usm_v(l)%j(m)
2922                   k = surf_usm_v(l)%k(m)
2923                   temp_pf(k,j,i) = surf_usm_v(l)%iwghf_eb_window_av(m)
2924                ENDDO
2925             ENDIF
2926          ENDIF
2927
2928      CASE ( 'usm_t_surf_wall' )
2929!
2930!--       Surface temperature for surfaces
2931          IF ( av == 0 )  THEN
2932             IF ( idsint == iup_u )  THEN
2933                DO  m = 1, surf_usm_h%ns
2934                   i = surf_usm_h%i(m)
2935                   j = surf_usm_h%j(m)
2936                   k = surf_usm_h%k(m)
2937                   temp_pf(k,j,i) = t_surf_wall_h(m)
2938                ENDDO
2939             ELSE
2940                l = idsidx
2941                DO  m = 1, surf_usm_v(l)%ns
2942                   i = surf_usm_v(l)%i(m)
2943                   j = surf_usm_v(l)%j(m)
2944                   k = surf_usm_v(l)%k(m)
2945                   temp_pf(k,j,i) = t_surf_wall_v(l)%t(m)
2946                ENDDO
2947             ENDIF
2948          ELSE
2949             IF ( idsint == iup_u )  THEN
2950                DO  m = 1, surf_usm_h%ns
2951                   i = surf_usm_h%i(m)
2952                   j = surf_usm_h%j(m)
2953                   k = surf_usm_h%k(m)
2954                   temp_pf(k,j,i) = surf_usm_h%t_surf_wall_av(m)
2955                ENDDO
2956             ELSE
2957                l = idsidx
2958                DO  m = 1, surf_usm_v(l)%ns
2959                   i = surf_usm_v(l)%i(m)
2960                   j = surf_usm_v(l)%j(m)
2961                   k = surf_usm_v(l)%k(m)
2962                   temp_pf(k,j,i) = surf_usm_v(l)%t_surf_wall_av(m)
2963                ENDDO
2964             ENDIF
2965          ENDIF
2966
2967      CASE ( 'usm_t_surf_window' )
2968!
2969!--       Surface temperature for window surfaces
2970          IF ( av == 0 )  THEN
2971             IF ( idsint == iup_u )  THEN
2972                DO  m = 1, surf_usm_h%ns
2973                   i = surf_usm_h%i(m)
2974                   j = surf_usm_h%j(m)
2975                   k = surf_usm_h%k(m)
2976                   temp_pf(k,j,i) = t_surf_window_h(m)
2977                ENDDO
2978             ELSE
2979                l = idsidx
2980                DO  m = 1, surf_usm_v(l)%ns
2981                   i = surf_usm_v(l)%i(m)
2982                   j = surf_usm_v(l)%j(m)
2983                   k = surf_usm_v(l)%k(m)
2984                   temp_pf(k,j,i) = t_surf_window_v(l)%t(m)
2985                ENDDO
2986             ENDIF
2987
2988          ELSE
2989             IF ( idsint == iup_u )  THEN
2990                DO  m = 1, surf_usm_h%ns
2991                   i = surf_usm_h%i(m)
2992                   j = surf_usm_h%j(m)
2993                   k = surf_usm_h%k(m)
2994                   temp_pf(k,j,i) = surf_usm_h%t_surf_window_av(m)
2995                ENDDO
2996             ELSE
2997                l = idsidx
2998                DO  m = 1, surf_usm_v(l)%ns
2999                   i = surf_usm_v(l)%i(m)
3000                   j = surf_usm_v(l)%j(m)
3001                   k = surf_usm_v(l)%k(m)
3002                   temp_pf(k,j,i) = surf_usm_v(l)%t_surf_window_av(m)
3003                ENDDO
3004
3005             ENDIF
3006
3007          ENDIF
3008
3009      CASE ( 'usm_t_surf_green' )
3010!
3011!--       Surface temperature for green surfaces
3012          IF ( av == 0 )  THEN
3013             IF ( idsint == iup_u )  THEN
3014                DO  m = 1, surf_usm_h%ns
3015                   i = surf_usm_h%i(m)
3016                   j = surf_usm_h%j(m)
3017                   k = surf_usm_h%k(m)
3018                   temp_pf(k,j,i) = t_surf_green_h(m)
3019                ENDDO
3020             ELSE
3021                l = idsidx
3022                DO  m = 1, surf_usm_v(l)%ns
3023                   i = surf_usm_v(l)%i(m)
3024                   j = surf_usm_v(l)%j(m)
3025                   k = surf_usm_v(l)%k(m)
3026                   temp_pf(k,j,i) = t_surf_green_v(l)%t(m)
3027                ENDDO
3028             ENDIF
3029
3030          ELSE
3031             IF ( idsint == iup_u )  THEN
3032                DO  m = 1, surf_usm_h%ns
3033                   i = surf_usm_h%i(m)
3034                   j = surf_usm_h%j(m)
3035                   k = surf_usm_h%k(m)
3036                   temp_pf(k,j,i) = surf_usm_h%t_surf_green_av(m)
3037                ENDDO
3038             ELSE
3039                l = idsidx
3040                DO  m = 1, surf_usm_v(l)%ns
3041                   i = surf_usm_v(l)%i(m)
3042                   j = surf_usm_v(l)%j(m)
3043                   k = surf_usm_v(l)%k(m)
3044                   temp_pf(k,j,i) = surf_usm_v(l)%t_surf_green_av(m)
3045                ENDDO
3046
3047             ENDIF
3048
3049          ENDIF
3050
3051      CASE ( 'usm_theta_10cm' )
3052!
3053!--       Near surface temperature for whole surfaces
3054          IF ( av == 0 )  THEN
3055             IF ( idsint == iup_u )  THEN
3056                DO  m = 1, surf_usm_h%ns
3057                   i = surf_usm_h%i(m)
3058                   j = surf_usm_h%j(m)
3059                   k = surf_usm_h%k(m)
3060                   temp_pf(k,j,i) = surf_usm_h%pt_10cm(m)
3061                ENDDO
3062             ELSE
3063                l = idsidx
3064                DO  m = 1, surf_usm_v(l)%ns
3065                   i = surf_usm_v(l)%i(m)
3066                   j = surf_usm_v(l)%j(m)
3067                   k = surf_usm_v(l)%k(m)
3068                   temp_pf(k,j,i) = surf_usm_v(l)%pt_10cm(m)
3069                ENDDO
3070             ENDIF
3071
3072
3073          ELSE
3074             IF ( idsint == iup_u )  THEN
3075                DO  m = 1, surf_usm_h%ns
3076                   i = surf_usm_h%i(m)
3077                   j = surf_usm_h%j(m)
3078                   k = surf_usm_h%k(m)
3079                   temp_pf(k,j,i) = surf_usm_h%pt_10cm_av(m)
3080                ENDDO
3081             ELSE
3082                l = idsidx
3083                DO  m = 1, surf_usm_v(l)%ns
3084                   i = surf_usm_v(l)%i(m)
3085                   j = surf_usm_v(l)%j(m)
3086                   k = surf_usm_v(l)%k(m)
3087                   temp_pf(k,j,i) = surf_usm_v(l)%pt_10cm_av(m)
3088                ENDDO
3089
3090              ENDIF
3091          ENDIF
3092
3093      CASE ( 'usm_t_wall' )
3094!
3095!--       Wall temperature for  iwl layer of walls and land
3096          IF ( av == 0 )  THEN
3097             IF ( idsint == iup_u )  THEN
3098                DO  m = 1, surf_usm_h%ns
3099                   i = surf_usm_h%i(m)
3100                   j = surf_usm_h%j(m)
3101                   k = surf_usm_h%k(m)
3102                   temp_pf(k,j,i) = t_wall_h(iwl,m)
3103                ENDDO
3104             ELSE
3105                l = idsidx
3106                DO  m = 1, surf_usm_v(l)%ns
3107                   i = surf_usm_v(l)%i(m)
3108                   j = surf_usm_v(l)%j(m)
3109                   k = surf_usm_v(l)%k(m)
3110                   temp_pf(k,j,i) = t_wall_v(l)%t(iwl,m)
3111                ENDDO
3112             ENDIF
3113          ELSE
3114             IF ( idsint == iup_u )  THEN
3115                DO  m = 1, surf_usm_h%ns
3116                   i = surf_usm_h%i(m)
3117                   j = surf_usm_h%j(m)
3118                   k = surf_usm_h%k(m)
3119                   temp_pf(k,j,i) = surf_usm_h%t_wall_av(iwl,m)
3120                ENDDO
3121             ELSE
3122                l = idsidx
3123                DO  m = 1, surf_usm_v(l)%ns
3124                   i = surf_usm_v(l)%i(m)
3125                   j = surf_usm_v(l)%j(m)
3126                   k = surf_usm_v(l)%k(m)
3127                   temp_pf(k,j,i) = surf_usm_v(l)%t_wall_av(iwl,m)
3128                ENDDO
3129             ENDIF
3130          ENDIF
3131
3132      CASE ( 'usm_t_window' )
3133!
3134!--       Window temperature for iwl layer of walls and land
3135          IF ( av == 0 )  THEN
3136             IF ( idsint == iup_u )  THEN
3137                DO  m = 1, surf_usm_h%ns
3138                   i = surf_usm_h%i(m)
3139                   j = surf_usm_h%j(m)
3140                   k = surf_usm_h%k(m)
3141                   temp_pf(k,j,i) = t_window_h(iwl,m)
3142                ENDDO
3143             ELSE
3144                l = idsidx
3145                DO  m = 1, surf_usm_v(l)%ns
3146                   i = surf_usm_v(l)%i(m)
3147                   j = surf_usm_v(l)%j(m)
3148                   k = surf_usm_v(l)%k(m)
3149                   temp_pf(k,j,i) = t_window_v(l)%t(iwl,m)
3150                ENDDO
3151             ENDIF
3152          ELSE
3153             IF ( idsint == iup_u )  THEN
3154                DO  m = 1, surf_usm_h%ns
3155                   i = surf_usm_h%i(m)
3156                   j = surf_usm_h%j(m)
3157                   k = surf_usm_h%k(m)
3158                   temp_pf(k,j,i) = surf_usm_h%t_window_av(iwl,m)
3159                ENDDO
3160             ELSE
3161                l = idsidx
3162                DO  m = 1, surf_usm_v(l)%ns
3163                   i = surf_usm_v(l)%i(m)
3164                   j = surf_usm_v(l)%j(m)
3165                   k = surf_usm_v(l)%k(m)
3166                   temp_pf(k,j,i) = surf_usm_v(l)%t_window_av(iwl,m)
3167                ENDDO
3168             ENDIF
3169          ENDIF
3170
3171      CASE ( 'usm_t_green' )
3172!
3173!--       Green temperature for  iwl layer of walls and land
3174          IF ( av == 0 )  THEN
3175             IF ( idsint == iup_u )  THEN
3176                DO  m = 1, surf_usm_h%ns
3177                   i = surf_usm_h%i(m)
3178                   j = surf_usm_h%j(m)
3179                   k = surf_usm_h%k(m)
3180                   temp_pf(k,j,i) = t_green_h(iwl,m)
3181                ENDDO
3182             ELSE
3183                l = idsidx
3184                DO  m = 1, surf_usm_v(l)%ns
3185                   i = surf_usm_v(l)%i(m)
3186                   j = surf_usm_v(l)%j(m)
3187                   k = surf_usm_v(l)%k(m)
3188                   temp_pf(k,j,i) = t_green_v(l)%t(iwl,m)
3189                ENDDO
3190             ENDIF
3191          ELSE
3192             IF ( idsint == iup_u )  THEN
3193                DO  m = 1, surf_usm_h%ns
3194                   i = surf_usm_h%i(m)
3195                   j = surf_usm_h%j(m)
3196                   k = surf_usm_h%k(m)
3197                   temp_pf(k,j,i) = surf_usm_h%t_green_av(iwl,m)
3198                ENDDO
3199             ELSE
3200                l = idsidx
3201                DO  m = 1, surf_usm_v(l)%ns
3202                   i = surf_usm_v(l)%i(m)
3203                   j = surf_usm_v(l)%j(m)
3204                   k = surf_usm_v(l)%k(m)
3205                   temp_pf(k,j,i) = surf_usm_v(l)%t_green_av(iwl,m)
3206                ENDDO
3207             ENDIF
3208          ENDIF
3209
3210          CASE ( 'usm_swc' )
3211!
3212!--       Soil water content for  iwl layer of walls and land
3213          IF ( av == 0 )  THEN
3214             IF ( idsint == iup_u )  THEN
3215                DO  m = 1, surf_usm_h%ns
3216                   i = surf_usm_h%i(m)
3217                   j = surf_usm_h%j(m)
3218                   k = surf_usm_h%k(m)
3219                   temp_pf(k,j,i) = swc_h(iwl,m)
3220                ENDDO
3221             ELSE
3222
3223             ENDIF
3224          ELSE
3225             IF ( idsint == iup_u )  THEN
3226                DO  m = 1, surf_usm_h%ns
3227                   i = surf_usm_h%i(m)
3228                   j = surf_usm_h%j(m)
3229                   k = surf_usm_h%k(m)
3230                   temp_pf(k,j,i) = surf_usm_h%swc_av(iwl,m)
3231                ENDDO
3232             ELSE
3233                l = idsidx
3234                DO  m = 1, surf_usm_v(l)%ns
3235                   i = surf_usm_v(l)%i(m)
3236                   j = surf_usm_v(l)%j(m)
3237                   k = surf_usm_v(l)%k(m)
3238                   temp_pf(k,j,i) = surf_usm_v(l)%swc_av(iwl,m)
3239                ENDDO
3240             ENDIF
3241          ENDIF
3242
3243
3244      CASE DEFAULT
3245          found = .FALSE.
3246          RETURN
3247    END SELECT
3248
3249!
3250!-- Rearrange dimensions for NetCDF output
3251!-- FIXME: this may generate FPE overflow upon conversion from DP to SP
3252    DO  j = nys, nyn
3253        DO  i = nxl, nxr
3254            DO  k = nzb_do, nzt_do
3255                local_pf(i,j,k) = temp_pf(k,j,i)
3256            ENDDO
3257        ENDDO
3258    ENDDO
3259
3260 END SUBROUTINE usm_data_output_3d
3261
3262
3263!--------------------------------------------------------------------------------------------------!
3264!
3265! Description:
3266! ------------
3267!> Soubroutine defines appropriate grid for netcdf variables.
3268!> It is called out from subroutine netcdf.
3269!--------------------------------------------------------------------------------------------------!
3270 SUBROUTINE usm_define_netcdf_grid( variable, found, grid_x, grid_y, grid_z )
3271
3272    IMPLICIT NONE
3273
3274    CHARACTER(LEN=*), INTENT(IN)  ::  variable  !<
3275    CHARACTER(LEN=*), INTENT(OUT) ::  grid_x    !<
3276    CHARACTER(LEN=*), INTENT(OUT) ::  grid_y    !<
3277    CHARACTER(LEN=*), INTENT(OUT) ::  grid_z    !<
3278
3279    CHARACTER(LEN=varnamelength)  ::  var  !<
3280
3281    LOGICAL, INTENT(OUT)  ::  found  !<
3282
3283    var = TRIM( variable )
3284    IF ( var(1:9) == 'usm_wshf_'  .OR.  var(1:9) == 'usm_wghf_'  .OR.                              &
3285         var(1:16) == 'usm_wghf_window_'  .OR. var(1:15) == 'usm_wghf_green_' .OR.                 &
3286         var(1:10) == 'usm_iwghf_'  .OR. var(1:17) == 'usm_iwghf_window_' .OR.                     &
3287         var(1:9) == 'usm_qsws_'  .OR.  var(1:13) == 'usm_qsws_veg_'  .OR.                         &
3288         var(1:13) == 'usm_qsws_liq_' .OR.                                                         &
3289         var(1:15) == 'usm_t_surf_wall'  .OR.  var(1:10) == 'usm_t_wall'  .OR.                     &
3290         var(1:17) == 'usm_t_surf_window'  .OR.  var(1:12) == 'usm_t_window'  .OR.                 &
3291         var(1:16) == 'usm_t_surf_green'  .OR. var(1:11) == 'usm_t_green' .OR.                     &
3292         var(1:15) == 'usm_theta_10cm' .OR.                                                        &
3293         var(1:9) == 'usm_surfz'  .OR.  var(1:11) == 'usm_surfcat'  .OR.                           &
3294         var(1:16) == 'usm_surfwintrans'  .OR. var(1:7) == 'usm_swc' ) THEN
3295
3296        found = .TRUE.
3297        grid_x = 'x'
3298        grid_y = 'y'
3299        grid_z = 'zu'
3300    ELSE
3301        found  = .FALSE.
3302        grid_x = 'none'
3303        grid_y = 'none'
3304        grid_z = 'none'
3305    ENDIF
3306
3307 END SUBROUTINE usm_define_netcdf_grid
3308
3309
3310!--------------------------------------------------------------------------------------------------!
3311! Description:
3312! ------------
3313!> Initialization of the wall surface model
3314!--------------------------------------------------------------------------------------------------!
3315 SUBROUTINE usm_init_material_model
3316
3317    IMPLICIT NONE
3318
3319    INTEGER(iwp) ::  k, l, m  !< running indices
3320
3321    IF ( debug_output )  CALL debug_message( 'usm_init_material_model', 'start' )
3322
3323!
3324!-- Calculate wall and window grid spacings. Wall temperature is defined at the center of the
3325!-- wall layers.
3326!-- First for horizontal surfaces:
3327    DO  m = 1, surf_usm_h%ns
3328
3329       surf_usm_h%dz_wall(nzb_wall,m) = surf_usm_h%zw(nzb_wall,m)
3330       DO k = nzb_wall+1, nzt_wall
3331          surf_usm_h%dz_wall(k,m) = surf_usm_h%zw(k,m) - surf_usm_h%zw(k-1,m)
3332       ENDDO
3333       surf_usm_h%dz_window(nzb_wall,m) = surf_usm_h%zw_window(nzb_wall,m)
3334       DO  k = nzb_wall+1, nzt_wall
3335          surf_usm_h%dz_window(k,m) = surf_usm_h%zw_window(k,m) - surf_usm_h%zw_window(k-1,m)
3336       ENDDO
3337
3338       surf_usm_h%dz_wall(nzt_wall+1,m) = surf_usm_h%dz_wall(nzt_wall,m)
3339
3340       DO k = nzb_wall, nzt_wall-1
3341         surf_usm_h%dz_wall_stag(k,m) = 0.5 * ( surf_usm_h%dz_wall(k+1,m) +                        &
3342                                                  surf_usm_h%dz_wall(k,m) )
3343       ENDDO
3344       surf_usm_h%dz_wall_stag(nzt_wall,m) = surf_usm_h%dz_wall(nzt_wall,m)
3345
3346       surf_usm_h%dz_window(nzt_wall+1,m) = surf_usm_h%dz_window(nzt_wall,m)
3347
3348       DO  k = nzb_wall, nzt_wall-1
3349          surf_usm_h%dz_window_stag(k,m) = 0.5 * ( surf_usm_h%dz_window(k+1,m) +                   &
3350                                                   surf_usm_h%dz_window(k,m) )
3351       ENDDO
3352       surf_usm_h%dz_window_stag(nzt_wall,m) = surf_usm_h%dz_window(nzt_wall,m)
3353
3354       IF (surf_usm_h%green_type_roof(m) == 2.0_wp )  THEN
3355!
3356!-- Extensive green roof
3357!-- Set ratio of substrate layer thickness, soil-type and LAI
3358          soil_type = 3
3359          surf_usm_h%lai(m) = 2.0_wp
3360
3361          surf_usm_h%zw_green(nzb_wall,m)   = 0.05_wp
3362          surf_usm_h%zw_green(nzb_wall+1,m) = 0.10_wp
3363          surf_usm_h%zw_green(nzb_wall+2,m) = 0.15_wp
3364          surf_usm_h%zw_green(nzb_wall+3,m) = 0.20_wp
3365       ELSE
3366!
3367!-- Intensiv green roof
3368!-- Set ratio of substrate layer thickness, soil-type and LAI
3369          soil_type = 6
3370          surf_usm_h%lai(m) = 4.0_wp
3371
3372          surf_usm_h%zw_green(nzb_wall,m)   = 0.05_wp
3373          surf_usm_h%zw_green(nzb_wall+1,m) = 0.10_wp
3374          surf_usm_h%zw_green(nzb_wall+2,m) = 0.40_wp
3375          surf_usm_h%zw_green(nzb_wall+3,m) = 0.80_wp
3376       ENDIF
3377
3378       surf_usm_h%dz_green(nzb_wall,m) = surf_usm_h%zw_green(nzb_wall,m)
3379       DO k = nzb_wall+1, nzt_wall
3380           surf_usm_h%dz_green(k,m) = surf_usm_h%zw_green(k,m) - surf_usm_h%zw_green(k-1,m)
3381       ENDDO
3382       surf_usm_h%dz_green(nzt_wall+1,m) = surf_usm_h%dz_green(nzt_wall,m)
3383
3384       DO k = nzb_wall, nzt_wall-1
3385           surf_usm_h%dz_green_stag(k,m) = 0.5 * ( surf_usm_h%dz_green(k+1,m) +                    &
3386                                                   surf_usm_h%dz_green(k,m) )
3387       ENDDO
3388       surf_usm_h%dz_green_stag(nzt_wall,m) = surf_usm_h%dz_green(nzt_wall,m)
3389
3390      IF ( alpha_vangenuchten == 9999999.9_wp )  THEN
3391         alpha_vangenuchten = soil_pars(0,soil_type)
3392      ENDIF
3393
3394      IF ( l_vangenuchten == 9999999.9_wp )  THEN
3395         l_vangenuchten = soil_pars(1,soil_type)
3396      ENDIF
3397
3398      IF ( n_vangenuchten == 9999999.9_wp )  THEN
3399         n_vangenuchten = soil_pars(2,soil_type)
3400      ENDIF
3401
3402      IF ( hydraulic_conductivity == 9999999.9_wp )  THEN
3403         hydraulic_conductivity = soil_pars(3,soil_type)
3404      ENDIF
3405
3406      IF ( saturation_moisture == 9999999.9_wp )  THEN
3407         saturation_moisture = m_soil_pars(0,soil_type)
3408      ENDIF
3409
3410      IF ( field_capacity == 9999999.9_wp )  THEN
3411         field_capacity = m_soil_pars(1,soil_type)
3412      ENDIF
3413
3414      IF ( wilting_point == 9999999.9_wp )  THEN
3415         wilting_point = m_soil_pars(2,soil_type)
3416      ENDIF
3417
3418      IF ( residual_moisture == 9999999.9_wp )  THEN
3419         residual_moisture = m_soil_pars(3,soil_type)
3420      ENDIF
3421
3422      DO  k = nzb_wall, nzt_wall+1
3423         swc_h(k,m) = field_capacity
3424         rootfr_h(k,m) = 0.5_wp
3425         surf_usm_h%alpha_vg_green(m)      = alpha_vangenuchten
3426         surf_usm_h%l_vg_green(m)          = l_vangenuchten
3427         surf_usm_h%n_vg_green(m)          = n_vangenuchten
3428         surf_usm_h%gamma_w_green_sat(k,m) = hydraulic_conductivity
3429         swc_sat_h(k,m)                    = saturation_moisture
3430         fc_h(k,m)                         = field_capacity
3431         wilt_h(k,m)                       = wilting_point
3432         swc_res_h(k,m)                    = residual_moisture
3433      ENDDO
3434
3435    ENDDO
3436
3437    surf_usm_h%ddz_wall        = 1.0_wp / surf_usm_h%dz_wall
3438    surf_usm_h%ddz_wall_stag   = 1.0_wp / surf_usm_h%dz_wall_stag
3439    surf_usm_h%ddz_window      = 1.0_wp / surf_usm_h%dz_window
3440    surf_usm_h%ddz_window_stag = 1.0_wp / surf_usm_h%dz_window_stag
3441    surf_usm_h%ddz_green       = 1.0_wp / surf_usm_h%dz_green
3442    surf_usm_h%ddz_green_stag  = 1.0_wp / surf_usm_h%dz_green_stag
3443!
3444!-- For vertical surfaces
3445    DO  l = 0, 3
3446       DO  m = 1, surf_usm_v(l)%ns
3447          surf_usm_v(l)%dz_wall(nzb_wall,m) = surf_usm_v(l)%zw(nzb_wall,m)
3448          DO  k = nzb_wall+1, nzt_wall
3449             surf_usm_v(l)%dz_wall(k,m) = surf_usm_v(l)%zw(k,m) - surf_usm_v(l)%zw(k-1,m)
3450          ENDDO
3451          surf_usm_v(l)%dz_window(nzb_wall,m) = surf_usm_v(l)%zw_window(nzb_wall,m)
3452          DO  k = nzb_wall+1, nzt_wall
3453             surf_usm_v(l)%dz_window(k,m) = surf_usm_v(l)%zw_window(k,m) -                         &
3454                                            surf_usm_v(l)%zw_window(k-1,m)
3455          ENDDO
3456          surf_usm_v(l)%dz_green(nzb_wall,m) = surf_usm_v(l)%zw_green(nzb_wall,m)
3457          DO  k = nzb_wall+1, nzt_wall
3458             surf_usm_v(l)%dz_green(k,m) = surf_usm_v(l)%zw_green(k,m) -                           &
3459                                           surf_usm_v(l)%zw_green(k-1,m)
3460          ENDDO
3461
3462          surf_usm_v(l)%dz_wall(nzt_wall+1,m) = surf_usm_v(l)%dz_wall(nzt_wall,m)
3463
3464          DO  k = nzb_wall, nzt_wall-1
3465             surf_usm_v(l)%dz_wall_stag(k,m) = 0.5 * ( surf_usm_v(l)%dz_wall(k+1,m) +              &
3466                                                       surf_usm_v(l)%dz_wall(k,m) )
3467          ENDDO
3468          surf_usm_v(l)%dz_wall_stag(nzt_wall,m) = surf_usm_v(l)%dz_wall(nzt_wall,m)
3469          surf_usm_v(l)%dz_window(nzt_wall+1,m)  = surf_usm_v(l)%dz_window(nzt_wall,m)
3470
3471          DO  k = nzb_wall, nzt_wall-1
3472             surf_usm_v(l)%dz_window_stag(k,m) = 0.5 * ( surf_usm_v(l)%dz_window(k+1,m) +          &
3473                                                         surf_usm_v(l)%dz_window(k,m) )
3474          ENDDO
3475          surf_usm_v(l)%dz_window_stag(nzt_wall,m) = surf_usm_v(l)%dz_window(nzt_wall,m)
3476          surf_usm_v(l)%dz_green(nzt_wall+1,m)     = surf_usm_v(l)%dz_green(nzt_wall,m)
3477
3478          DO  k = nzb_wall, nzt_wall-1
3479             surf_usm_v(l)%dz_green_stag(k,m) = 0.5 * ( surf_usm_v(l)%dz_green(k+1,m) +            &
3480                                                        surf_usm_v(l)%dz_green(k,m) )
3481          ENDDO
3482          surf_usm_v(l)%dz_green_stag(nzt_wall,m) = surf_usm_v(l)%dz_green(nzt_wall,m)
3483       ENDDO
3484       surf_usm_v(l)%ddz_wall        = 1.0_wp / surf_usm_v(l)%dz_wall
3485       surf_usm_v(l)%ddz_wall_stag   = 1.0_wp / surf_usm_v(l)%dz_wall_stag
3486       surf_usm_v(l)%ddz_window      = 1.0_wp / surf_usm_v(l)%dz_window
3487       surf_usm_v(l)%ddz_window_stag = 1.0_wp / surf_usm_v(l)%dz_window_stag
3488       surf_usm_v(l)%ddz_green       = 1.0_wp / surf_usm_v(l)%dz_green
3489       surf_usm_v(l)%ddz_green_stag  = 1.0_wp / surf_usm_v(l)%dz_green_stag
3490    ENDDO
3491
3492
3493    IF ( debug_output )  CALL debug_message( 'usm_init_material_model', 'end' )
3494
3495 END SUBROUTINE usm_init_material_model
3496
3497
3498!--------------------------------------------------------------------------------------------------!
3499! Description:
3500! ------------
3501!> Initialization of the urban surface model
3502!--------------------------------------------------------------------------------------------------!
3503 SUBROUTINE usm_init
3504
3505    USE arrays_3d,                                                                                 &
3506        ONLY:  zw
3507
3508    USE netcdf_data_input_mod,                                                                     &
3509        ONLY:  building_pars_f,                                                                    &
3510               building_surface_pars_f,                                                            &
3511               building_type_f,                                                                    &
3512               terrain_height_f
3513
3514    IMPLICIT NONE
3515
3516    INTEGER(iwp) ::  i                 !< loop index x-dirction
3517    INTEGER(iwp) ::  ind_alb_green     !< index in input list for green albedo
3518    INTEGER(iwp) ::  ind_alb_wall      !< index in input list for wall albedo
3519    INTEGER(iwp) ::  ind_alb_win       !< index in input list for window albedo
3520    INTEGER(iwp) ::  ind_emis_wall     !< index in input list for wall emissivity
3521    INTEGER(iwp) ::  ind_emis_green    !< index in input list for green emissivity
3522    INTEGER(iwp) ::  ind_emis_win      !< index in input list for window emissivity
3523    INTEGER(iwp) ::  ind_green_frac_w  !< index in input list for green fraction on wall
3524    INTEGER(iwp) ::  ind_green_frac_r  !< index in input list for green fraction on roof
3525    INTEGER(iwp) ::  ind_hc1           !< index in input list for heat capacity at first wall layer
3526    INTEGER(iwp) ::  ind_hc1_win       !< index in input list for heat capacity at first window layer
3527    INTEGER(iwp) ::  ind_hc2           !< index in input list for heat capacity at second wall layer
3528    INTEGER(iwp) ::  ind_hc2_win       !< index in input list for heat capacity at second window layer
3529    INTEGER(iwp) ::  ind_hc3           !< index in input list for heat capacity at third wall layer
3530    INTEGER(iwp) ::  ind_hc3_win       !< index in input list for heat capacity at third window layer
3531    INTEGER(iwp) ::  ind_lai_r         !< index in input list for LAI on roof
3532    INTEGER(iwp) ::  ind_lai_w         !< index in input list for LAI on wall
3533    INTEGER(iwp) ::  ind_tc1           !< index in input list for thermal conductivity at first wall layer
3534    INTEGER(iwp) ::  ind_tc1_win       !< index in input list for thermal conductivity at first window layer
3535    INTEGER(iwp) ::  ind_tc2           !< index in input list for thermal conductivity at second wall layer
3536    INTEGER(iwp) ::  ind_tc2_win       !< index in input list for thermal conductivity at second window layer
3537    INTEGER(iwp) ::  ind_tc3           !< index in input list for thermal conductivity at third wall layer
3538    INTEGER(iwp) ::  ind_tc3_win       !< index in input list for thermal conductivity at third window layer
3539    INTEGER(iwp) ::  ind_thick_1       !< index in input list for thickness of first wall layer
3540    INTEGER(iwp) ::  ind_thick_1_win   !< index in input list for thickness of first window layer
3541    INTEGER(iwp) ::  ind_thick_2       !< index in input list for thickness of second wall layer
3542    INTEGER(iwp) ::  ind_thick_2_win   !< index in input list for thickness of second window layer
3543    INTEGER(iwp) ::  ind_thick_3       !< index in input list for thickness of third wall layer
3544    INTEGER(iwp) ::  ind_thick_3_win   !< index in input list for thickness of third window layer
3545    INTEGER(iwp) ::  ind_thick_4       !< index in input list for thickness of fourth wall layer
3546    INTEGER(iwp) ::  ind_thick_4_win   !< index in input list for thickness of fourth window layer
3547    INTEGER(iwp) ::  ind_trans         !< index in input list for window transmissivity
3548    INTEGER(iwp) ::  ind_wall_frac     !< index in input list for wall fraction
3549    INTEGER(iwp) ::  ind_win_frac      !< index in input list for window fraction
3550    INTEGER(iwp) ::  ind_z0            !< index in input list for z0
3551    INTEGER(iwp) ::  ind_z0qh          !< index in input list for z0h / z0q
3552    INTEGER(iwp) ::  is                !< loop index input surface element
3553    INTEGER(iwp) ::  j                 !< loop index y-dirction
3554    INTEGER(iwp) ::  k                 !< loop index z-dirction
3555    INTEGER(iwp) ::  l                 !< loop index surface orientation
3556    INTEGER(iwp) ::  m                 !< loop index surface element
3557    INTEGER(iwp) ::  st                !< dummy
3558
3559    LOGICAL      ::  relative_fractions_corrected  !< flag indicating if relative surface fractions require normalization
3560
3561    REAL(wp)     ::  c, tin, twin          !<
3562    REAL(wp)     ::  ground_floor_level_l  !< local height of ground floor level
3563    REAL(wp)     ::  sum_frac              !< sum of the relative material fractions at a surface element
3564    REAL(wp)     ::  z_agl                 !< height of the surface element above terrain
3565
3566    IF ( debug_output )  CALL debug_message( 'usm_init', 'start' )
3567
3568    CALL cpu_log( log_point_s(78), 'usm_init', 'start' )
3569!
3570!-- Surface forcing has to be disabled for LSF in case of enabled urban surface module
3571    IF ( large_scale_forcing )  THEN
3572        lsf_surf = .FALSE.
3573    ENDIF
3574!
3575!-- Flag surface elements belonging to the ground floor level. Therefore, use terrain height array
3576!-- from file, if available. This flag is later used to control initialization of surface attributes.
3577!-- Todo: for the moment disable initialization of building roofs with ground-floor-level properties.
3578    surf_usm_h%ground_level = .FALSE.
3579
3580    DO  l = 0, 3
3581       surf_usm_v(l)%ground_level = .FALSE.
3582       DO  m = 1, surf_usm_v(l)%ns
3583          i = surf_usm_v(l)%i(m) + surf_usm_v(l)%ioff
3584          j = surf_usm_v(l)%j(m) + surf_usm_v(l)%joff
3585          k = surf_usm_v(l)%k(m)
3586!
3587!--       Determine local ground level. Level 1 - default value, level 2 - initialization according
3588!--       to building type, level 3 - initialization from value read from file.
3589          ground_floor_level_l = ground_floor_level
3590
3591          IF ( building_type_f%from_file )  THEN
3592              ground_floor_level_l = building_pars(ind_gflh,building_type_f%var(j,i))
3593          ENDIF
3594
3595          IF ( building_pars_f%from_file )  THEN
3596             IF ( building_pars_f%pars_xy(ind_gflh,j,i) /=  building_pars_f%fill )                 &
3597                ground_floor_level_l = building_pars_f%pars_xy(ind_gflh,j,i)
3598          ENDIF
3599!
3600!--       Determine height of surface element above ground level. Please note, the height of a
3601!--       surface element is determined with respect to its height above ground of the reference
3602!--       grid point in the atmosphere. Therefore, substract the offset values when assessing the
3603!--       terrain height.
3604          IF ( terrain_height_f%from_file )  THEN
3605             z_agl = zw(k) - terrain_height_f%var(j-surf_usm_v(l)%joff, i-surf_usm_v(l)%ioff)
3606          ELSE
3607             z_agl = zw(k)
3608          ENDIF
3609!
3610!--       Set flag for ground level
3611          IF ( z_agl <= ground_floor_level_l ) surf_usm_v(l)%ground_level(m) = .TRUE.
3612
3613       ENDDO
3614    ENDDO
3615!
3616!-- Initialization of resistances.
3617    DO  m = 1, surf_usm_h%ns
3618       surf_usm_h%r_a(m)        = 50.0_wp
3619       surf_usm_h%r_a_green(m)  = 50.0_wp
3620       surf_usm_h%r_a_window(m) = 50.0_wp
3621    ENDDO
3622    DO  l = 0, 3
3623       DO  m = 1, surf_usm_v(l)%ns
3624          surf_usm_v(l)%r_a(m)        = 50.0_wp
3625          surf_usm_v(l)%r_a_green(m)  = 50.0_wp
3626          surf_usm_v(l)%r_a_window(m) = 50.0_wp
3627       ENDDO
3628    ENDDO
3629
3630!
3631!-- Map values onto horizontal elemements
3632    DO  m = 1, surf_usm_h%ns
3633       surf_usm_h%r_canopy(m)     = 200.0_wp !< canopy_resistance
3634       surf_usm_h%r_canopy_min(m) = 200.0_wp !< min_canopy_resistance
3635       surf_usm_h%g_d(m)          = 0.0_wp   !< canopy_resistance_coefficient
3636    ENDDO
3637!
3638!-- Map values onto vertical elements, even though this does not make much sense.
3639    DO  l = 0, 3
3640       DO  m = 1, surf_usm_v(l)%ns
3641          surf_usm_v(l)%r_canopy(m)     = 200.0_wp !< canopy_resistance
3642          surf_usm_v(l)%r_canopy_min(m) = 200.0_wp !< min_canopy_resistance
3643          surf_usm_v(l)%g_d(m)          = 0.0_wp   !< canopy_resistance_coefficient
3644       ENDDO
3645    ENDDO
3646
3647!
3648!--  Initialize urban-type surface attribute. According to initialization in land-surface model,
3649!--  follow a 3-level approach.
3650!--  Level 1 - initialization via default attributes
3651     DO  m = 1, surf_usm_h%ns
3652!
3653!--     Now, all horizontal surfaces are roof surfaces (?)
3654        surf_usm_h%isroof_surf(m)   = .TRUE.
3655        surf_usm_h%surface_types(m) = roof_category         !< default category for root surface
3656!
3657!--     In order to distinguish between ground floor level and above-ground-floor level surfaces,
3658!--     set input indices.
3659
3660        ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl,                     &
3661                                  surf_usm_h%ground_level(m) )
3662        ind_lai_r        = MERGE( ind_lai_r_gfl, ind_lai_r_agfl, surf_usm_h%ground_level(m) )
3663        ind_z0           = MERGE( ind_z0_gfl, ind_z0_agfl, surf_usm_h%ground_level(m) )
3664        ind_z0qh         = MERGE( ind_z0qh_gfl, ind_z0qh_agfl, surf_usm_h%ground_level(m) )
3665!
3666!--     Store building type and its name on each surface element
3667        surf_usm_h%building_type(m)      = building_type
3668        surf_usm_h%building_type_name(m) = building_type_name(building_type)
3669!
3670!--     Initialize relatvie wall- (0), green- (1) and window (2) fractions
3671        surf_usm_h%frac(m,ind_veg_wall)  = building_pars(ind_wall_frac_r,building_type)
3672        surf_usm_h%frac(m,ind_pav_green) = building_pars(ind_green_frac_r,building_type)
3673        surf_usm_h%frac(m,ind_wat_win)   = building_pars(ind_win_frac_r,building_type)
3674        surf_usm_h%lai(m)                = building_pars(ind_lai_r,building_type)
3675
3676        surf_usm_h%rho_c_wall(nzb_wall,m)        = building_pars(ind_hc1_wall_r,building_type)
3677        surf_usm_h%rho_c_wall(nzb_wall+1,m)      = building_pars(ind_hc1_wall_r,building_type)
3678        surf_usm_h%rho_c_wall(nzb_wall+2,m)      = building_pars(ind_hc2_wall_r,building_type)
3679        surf_usm_h%rho_c_wall(nzb_wall+3,m)      = building_pars(ind_hc3_wall_r,building_type)
3680        surf_usm_h%lambda_h(nzb_wall,m)          = building_pars(ind_tc1_wall_r,building_type)
3681        surf_usm_h%lambda_h(nzb_wall+1,m)        = building_pars(ind_tc1_wall_r,building_type)
3682        surf_usm_h%lambda_h(nzb_wall+2,m)        = building_pars(ind_tc2_wall_r,building_type)
3683        surf_usm_h%lambda_h(nzb_wall+3,m)        = building_pars(ind_tc3_wall_r,building_type)
3684        surf_usm_h%rho_c_green(nzb_wall,m)       = rho_c_soil !building_pars(ind_hc1_wall_r,building_type)
3685        surf_usm_h%rho_c_green(nzb_wall+1,m)     = rho_c_soil !building_pars(ind_hc1_wall_r,building_type)
3686        surf_usm_h%rho_c_green(nzb_wall+2,m)     = rho_c_soil !building_pars(ind_hc2_wall_r,building_type)
3687        surf_usm_h%rho_c_green(nzb_wall+3,m)     = rho_c_soil !building_pars(ind_hc3_wall_r,building_type)
3688        surf_usm_h%lambda_h_green(nzb_wall,m)    = lambda_h_green_sm !building_pars(ind_tc1_wall_r,building_type)
3689        surf_usm_h%lambda_h_green(nzb_wall+1,m)  = lambda_h_green_sm !building_pars(ind_tc1_wall_r,building_type)
3690        surf_usm_h%lambda_h_green(nzb_wall+2,m)  = lambda_h_green_sm !building_pars(ind_tc2_wall_r,building_type)
3691        surf_usm_h%lambda_h_green(nzb_wall+3,m)  = lambda_h_green_sm !building_pars(ind_tc3_wall_r,building_type)
3692        surf_usm_h%rho_c_window(nzb_wall,m)      = building_pars(ind_hc1_win_r,building_type)
3693        surf_usm_h%rho_c_window(nzb_wall+1,m)    = building_pars(ind_hc1_win_r,building_type)
3694        surf_usm_h%rho_c_window(nzb_wall+2,m)    = building_pars(ind_hc2_win_r,building_type)
3695        surf_usm_h%rho_c_window(nzb_wall+3,m)    = building_pars(ind_hc3_win_r,building_type)
3696        surf_usm_h%lambda_h_window(nzb_wall,m)   = building_pars(ind_tc1_win_r,building_type)
3697        surf_usm_h%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1_win_r,building_type)
3698        surf_usm_h%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2_win_r,building_type)
3699        surf_usm_h%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3_win_r,building_type)
3700
3701        surf_usm_h%target_temp_summer(m)  = building_pars(ind_indoor_target_temp_summer,building_type)
3702        surf_usm_h%target_temp_winter(m)  = building_pars(ind_indoor_target_temp_winter,building_type)
3703!
3704!--     Emissivity of wall-, green- and window fraction
3705        surf_usm_h%emissivity(m,ind_veg_wall)  = building_pars(ind_emis_wall_r,building_type)
3706        surf_usm_h%emissivity(m,ind_pav_green) = building_pars(ind_emis_green_r,building_type)
3707        surf_usm_h%emissivity(m,ind_wat_win)   = building_pars(ind_emis_win_r,building_type)
3708
3709        surf_usm_h%transmissivity(m)           = building_pars(ind_trans_r,building_type)
3710
3711        surf_usm_h%z0(m)                       = building_pars(ind_z0,building_type)
3712        surf_usm_h%z0h(m)                      = building_pars(ind_z0qh,building_type)
3713        surf_usm_h%z0q(m)                      = building_pars(ind_z0qh,building_type)
3714!
3715!--     Albedo type for wall fraction, green fraction, window fraction
3716        surf_usm_h%albedo_type(m,ind_veg_wall)  = INT( building_pars(ind_alb_wall_r,building_type) )
3717        surf_usm_h%albedo_type(m,ind_pav_green) = INT( building_pars(ind_alb_green_r,building_type) )
3718        surf_usm_h%albedo_type(m,ind_wat_win)   = INT( building_pars(ind_alb_win_r,building_type) )
3719
3720        surf_usm_h%zw(nzb_wall,m)         = building_pars(ind_thick_1_wall_r,building_type)
3721        surf_usm_h%zw(nzb_wall+1,m)       = building_pars(ind_thick_2_wall_r,building_type)
3722        surf_usm_h%zw(nzb_wall+2,m)       = building_pars(ind_thick_3_wall_r,building_type)
3723        surf_usm_h%zw(nzb_wall+3,m)       = building_pars(ind_thick_4_wall_r,building_type)
3724
3725        surf_usm_h%zw_green(nzb_wall,m)         = building_pars(ind_thick_1_wall_r,building_type)
3726        surf_usm_h%zw_green(nzb_wall+1,m)       = building_pars(ind_thick_2_wall_r,building_type)
3727        surf_usm_h%zw_green(nzb_wall+2,m)       = building_pars(ind_thick_3_wall_r,building_type)
3728        surf_usm_h%zw_green(nzb_wall+3,m)       = building_pars(ind_thick_4_wall_r,building_type)
3729
3730        surf_usm_h%zw_window(nzb_wall,m)         = building_pars(ind_thick_1_win_r,building_type)
3731        surf_usm_h%zw_window(nzb_wall+1,m)       = building_pars(ind_thick_2_win_r,building_type)
3732        surf_usm_h%zw_window(nzb_wall+2,m)       = building_pars(ind_thick_3_win_r,building_type)
3733        surf_usm_h%zw_window(nzb_wall+3,m)       = building_pars(ind_thick_4_win_r,building_type)
3734
3735        surf_usm_h%green_type_roof(m)     = building_pars(ind_green_type_roof,building_type)
3736
3737     ENDDO
3738
3739     DO  l = 0, 3
3740        DO  m = 1, surf_usm_v(l)%ns
3741
3742           surf_usm_v(l)%surface_types(m) = wall_category     !< Default category for root surface
3743!
3744!--        In order to distinguish between ground floor level and above-ground-floor level surfaces,
3745!--        set input indices.
3746           ind_alb_green    = MERGE( ind_alb_green_gfl,    ind_alb_green_agfl,                     &
3747                                     surf_usm_v(l)%ground_level(m) )
3748           ind_alb_wall     = MERGE( ind_alb_wall_gfl,     ind_alb_wall_agfl,                      &
3749                                     surf_usm_v(l)%ground_level(m) )
3750           ind_alb_win      = MERGE( ind_alb_win_gfl,      ind_alb_win_agfl,                       &
3751                                     surf_usm_v(l)%ground_level(m) )
3752           ind_wall_frac    = MERGE( ind_wall_frac_gfl,    ind_wall_frac_agfl,                     &
3753                                     surf_usm_v(l)%ground_level(m) )
3754           ind_win_frac     = MERGE( ind_win_frac_gfl,     ind_win_frac_agfl,                      &
3755                                     surf_usm_v(l)%ground_level(m) )
3756           ind_green_frac_w = MERGE( ind_green_frac_w_gfl, ind_green_frac_w_agfl,                  &
3757                                     surf_usm_v(l)%ground_level(m) )
3758           ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl,                  &
3759                                     surf_usm_v(l)%ground_level(m) )
3760           ind_lai_r        = MERGE( ind_lai_r_gfl,        ind_lai_r_agfl,                         &
3761                                     surf_usm_v(l)%ground_level(m) )
3762           ind_lai_w        = MERGE( ind_lai_w_gfl,        ind_lai_w_agfl,                         &
3763                                     surf_usm_v(l)%ground_level(m) )
3764           ind_hc1          = MERGE( ind_hc1_gfl,          ind_hc1_agfl,                           &
3765                                     surf_usm_v(l)%ground_level(m) )
3766           ind_hc1_win      = MERGE( ind_hc1_win_gfl,      ind_hc1_win_agfl,                       &
3767                                     surf_usm_v(l)%ground_level(m) )
3768           ind_hc2          = MERGE( ind_hc2_gfl,          ind_hc2_agfl,                           &
3769                                     surf_usm_v(l)%ground_level(m) )
3770           ind_hc2_win      = MERGE( ind_hc2_win_gfl,      ind_hc2_win_agfl,                       &
3771                                     surf_usm_v(l)%ground_level(m) )
3772           ind_hc3          = MERGE( ind_hc3_gfl,          ind_hc3_agfl,                           &
3773                                     surf_usm_v(l)%ground_level(m) )
3774           ind_hc3_win      = MERGE( ind_hc3_win_gfl,      ind_hc3_win_agfl,                       &
3775                                     surf_usm_v(l)%ground_level(m) )
3776           ind_tc1          = MERGE( ind_tc1_gfl,          ind_tc1_agfl,                           &
3777                                     surf_usm_v(l)%ground_level(m) )
3778           ind_tc1_win      = MERGE( ind_tc1_win_gfl,      ind_tc1_win_agfl,                       &
3779                                     surf_usm_v(l)%ground_level(m) )
3780           ind_tc2          = MERGE( ind_tc2_gfl,          ind_tc2_agfl,                           &
3781                                     surf_usm_v(l)%ground_level(m) )
3782           ind_tc2_win      = MERGE( ind_tc2_win_gfl,      ind_tc2_win_agfl,                       &
3783                                     surf_usm_v(l)%ground_level(m) )
3784           ind_tc3          = MERGE( ind_tc3_gfl,          ind_tc3_agfl,                           &
3785                                     surf_usm_v(l)%ground_level(m) )
3786           ind_tc3_win      = MERGE( ind_tc3_win_gfl,      ind_tc3_win_agfl,                       &
3787                                     surf_usm_v(l)%ground_level(m) )
3788           ind_thick_1      = MERGE( ind_thick_1_gfl,      ind_thick_1_agfl,                       &
3789                                     surf_usm_v(l)%ground_level(m) )
3790           ind_thick_1_win  = MERGE( ind_thick_1_win_gfl,  ind_thick_1_win_agfl,                   &
3791                                     surf_usm_v(l)%ground_level(m) )
3792           ind_thick_2      = MERGE( ind_thick_2_gfl,      ind_thick_2_agfl,                       &
3793                                     surf_usm_v(l)%ground_level(m) )
3794           ind_thick_2_win  = MERGE( ind_thick_2_win_gfl,  ind_thick_2_win_agfl,                   &
3795                                     surf_usm_v(l)%ground_level(m) )
3796           ind_thick_3      = MERGE( ind_thick_3_gfl,      ind_thick_3_agfl,                       &
3797                                     surf_usm_v(l)%ground_level(m) )
3798           ind_thick_3_win  = MERGE( ind_thick_3_win_gfl,  ind_thick_3_win_agfl,                   &
3799                                     surf_usm_v(l)%ground_level(m) )
3800           ind_thick_4      = MERGE( ind_thick_4_gfl,      ind_thick_4_agfl,                       &
3801                                     surf_usm_v(l)%ground_level(m) )
3802           ind_thick_4_win  = MERGE( ind_thick_4_win_gfl,  ind_thick_4_win_agfl,                   &
3803                                     surf_usm_v(l)%ground_level(m) )
3804           ind_emis_wall    = MERGE( ind_emis_wall_gfl,    ind_emis_wall_agfl,                     &
3805                                     surf_usm_v(l)%ground_level(m) )
3806           ind_emis_green   = MERGE( ind_emis_green_gfl,   ind_emis_green_agfl,                    &
3807                                     surf_usm_v(l)%ground_level(m) )
3808           ind_emis_win     = MERGE( ind_emis_win_gfl,     ind_emis_win_agfl,                      &
3809                                     surf_usm_v(l)%ground_level(m) )
3810           ind_trans        = MERGE( ind_trans_gfl,       ind_trans_agfl,                          &
3811                                     surf_usm_v(l)%ground_level(m) )
3812           ind_z0           = MERGE( ind_z0_gfl,           ind_z0_agfl,                            &
3813                                     surf_usm_v(l)%ground_level(m) )
3814           ind_z0qh         = MERGE( ind_z0qh_gfl,         ind_z0qh_agfl,                          &
3815                                     surf_usm_v(l)%ground_level(m) )
3816!
3817!--        Store building type and its name on each surface element
3818           surf_usm_v(l)%building_type(m)      = building_type
3819           surf_usm_v(l)%building_type_name(m) = building_type_name(building_type)
3820!
3821!--        Initialize relatvie wall- (0), green- (1) and window (2) fractions
3822           surf_usm_v(l)%frac(m,ind_veg_wall)   = building_pars(ind_wall_frac,building_type)
3823           surf_usm_v(l)%frac(m,ind_pav_green)  = building_pars(ind_green_frac_w,building_type)
3824           surf_usm_v(l)%frac(m,ind_wat_win)    = building_pars(ind_win_frac,building_type)
3825           surf_usm_v(l)%lai(m)                 = building_pars(ind_lai_w,building_type)
3826
3827           surf_usm_v(l)%rho_c_wall(nzb_wall,m)   = building_pars(ind_hc1,building_type)
3828           surf_usm_v(l)%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1,building_type)
3829           surf_usm_v(l)%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2,building_type)
3830           surf_usm_v(l)%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3,building_type)
3831
3832           surf_usm_v(l)%rho_c_green(nzb_wall,m)   = rho_c_soil !building_pars(ind_hc1,building_type)
3833           surf_usm_v(l)%rho_c_green(nzb_wall+1,m) = rho_c_soil !building_pars(ind_hc1,building_type)
3834           surf_usm_v(l)%rho_c_green(nzb_wall+2,m) = rho_c_soil !building_pars(ind_hc2,building_type)
3835           surf_usm_v(l)%rho_c_green(nzb_wall+3,m) = rho_c_soil !building_pars(ind_hc3,building_type)
3836
3837           surf_usm_v(l)%rho_c_window(nzb_wall,m)   = building_pars(ind_hc1_win,building_type)
3838           surf_usm_v(l)%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1_win,building_type)
3839           surf_usm_v(l)%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2_win,building_type)
3840           surf_usm_v(l)%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3_win,building_type)
3841
3842           surf_usm_v(l)%lambda_h(nzb_wall,m)   = building_pars(ind_tc1,building_type)
3843           surf_usm_v(l)%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1,building_type)
3844           surf_usm_v(l)%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2,building_type)
3845           surf_usm_v(l)%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3,building_type)
3846
3847           surf_usm_v(l)%lambda_h_green(nzb_wall,m)   = lambda_h_green_sm !building_pars(ind_tc1,building_type)
3848           surf_usm_v(l)%lambda_h_green(nzb_wall+1,m) = lambda_h_green_sm !building_pars(ind_tc1,building_type)
3849           surf_usm_v(l)%lambda_h_green(nzb_wall+2,m) = lambda_h_green_sm !building_pars(ind_tc2,building_type)
3850           surf_usm_v(l)%lambda_h_green(nzb_wall+3,m) = lambda_h_green_sm !building_pars(ind_tc3,building_type)
3851
3852           surf_usm_v(l)%lambda_h_window(nzb_wall,m)   = building_pars(ind_tc1_win,building_type)
3853           surf_usm_v(l)%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1_win,building_type)
3854           surf_usm_v(l)%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2_win,building_type)
3855           surf_usm_v(l)%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3_win,building_type)
3856
3857           surf_usm_v(l)%target_temp_summer(m)  = building_pars(ind_indoor_target_temp_summer,building_type)
3858           surf_usm_v(l)%target_temp_winter(m)  = building_pars(ind_indoor_target_temp_winter,building_type)
3859!
3860!--        Emissivity of wall-, green- and window fraction
3861           surf_usm_v(l)%emissivity(m,ind_veg_wall)  = building_pars(ind_emis_wall,building_type)
3862           surf_usm_v(l)%emissivity(m,ind_pav_green) = building_pars(ind_emis_green,building_type)
3863           surf_usm_v(l)%emissivity(m,ind_wat_win)   = building_pars(ind_emis_win,building_type)
3864
3865           surf_usm_v(l)%transmissivity(m)      = building_pars(ind_trans,building_type)
3866
3867           surf_usm_v(l)%z0(m)                  = building_pars(ind_z0,building_type)
3868           surf_usm_v(l)%z0h(m)                 = building_pars(ind_z0qh,building_type)
3869           surf_usm_v(l)%z0q(m)                 = building_pars(ind_z0qh,building_type)
3870
3871           surf_usm_v(l)%albedo_type(m,ind_veg_wall)  = INT( building_pars(ind_alb_wall,building_type) )
3872           surf_usm_v(l)%albedo_type(m,ind_pav_green) = INT( building_pars(ind_alb_green,building_type) )
3873           surf_usm_v(l)%albedo_type(m,ind_wat_win)   = INT( building_pars(ind_alb_win,building_type) )
3874
3875           surf_usm_v(l)%zw(nzb_wall,m)         = building_pars(ind_thick_1,building_type)
3876           surf_usm_v(l)%zw(nzb_wall+1,m)       = building_pars(ind_thick_2,building_type)
3877           surf_usm_v(l)%zw(nzb_wall+2,m)       = building_pars(ind_thick_3,building_type)
3878           surf_usm_v(l)%zw(nzb_wall+3,m)       = building_pars(ind_thick_4,building_type)
3879
3880           surf_usm_v(l)%zw_green(nzb_wall,m)         = building_pars(ind_thick_1,building_type)
3881           surf_usm_v(l)%zw_green(nzb_wall+1,m)       = building_pars(ind_thick_2,building_type)
3882           surf_usm_v(l)%zw_green(nzb_wall+2,m)       = building_pars(ind_thick_3,building_type)
3883           surf_usm_v(l)%zw_green(nzb_wall+3,m)       = building_pars(ind_thick_4,building_type)
3884
3885           surf_usm_v(l)%zw_window(nzb_wall,m)        = building_pars(ind_thick_1_win,building_type)
3886           surf_usm_v(l)%zw_window(nzb_wall+1,m)      = building_pars(ind_thick_2_win,building_type)
3887           surf_usm_v(l)%zw_window(nzb_wall+2,m)      = building_pars(ind_thick_3_win,building_type)
3888           surf_usm_v(l)%zw_window(nzb_wall+3,m)      = building_pars(ind_thick_4_win,building_type)
3889
3890        ENDDO
3891     ENDDO
3892!
3893!--  Level 2 - initialization via building type read from file
3894     IF ( building_type_f%from_file )  THEN
3895        DO  m = 1, surf_usm_h%ns
3896           i = surf_usm_h%i(m)
3897           j = surf_usm_h%j(m)
3898!
3899!--        For the moment, limit building type to 6 (to overcome errors in input file).
3900           st = building_type_f%var(j,i)
3901           IF ( st /= building_type_f%fill )  THEN
3902
3903!
3904!--           In order to distinguish between ground floor level and above-ground-floor level
3905!--           surfaces, set input indices.
3906
3907              ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl,               &
3908                                        surf_usm_h%ground_level(m) )
3909              ind_lai_r        = MERGE( ind_lai_r_gfl, ind_lai_r_agfl, surf_usm_h%ground_level(m) )
3910              ind_z0           = MERGE( ind_z0_gfl, ind_z0_agfl, surf_usm_h%ground_level(m) )
3911              ind_z0qh         = MERGE( ind_z0qh_gfl, ind_z0qh_agfl, surf_usm_h%ground_level(m) )
3912!
3913!--           Store building type and its name on each surface element
3914              surf_usm_h%building_type(m)      = st
3915              surf_usm_h%building_type_name(m) = building_type_name(st)
3916!
3917!--           Initialize relatvie wall- (0), green- (1) and window (2) fractions
3918              surf_usm_h%frac(m,ind_veg_wall)  = building_pars(ind_wall_frac_r,st)
3919              surf_usm_h%frac(m,ind_pav_green) = building_pars(ind_green_frac_r,st)
3920              surf_usm_h%frac(m,ind_wat_win)   = building_pars(ind_win_frac_r,st)
3921              surf_usm_h%lai(m)                = building_pars(ind_lai_r,st)
3922
3923              surf_usm_h%rho_c_wall(nzb_wall,m)   = building_pars(ind_hc1_wall_r,st)
3924              surf_usm_h%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1_wall_r,st)
3925              surf_usm_h%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2_wall_r,st)
3926              surf_usm_h%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3_wall_r,st)
3927              surf_usm_h%lambda_h(nzb_wall,m)     = building_pars(ind_tc1_wall_r,st)
3928              surf_usm_h%lambda_h(nzb_wall+1,m)   = building_pars(ind_tc1_wall_r,st)
3929              surf_usm_h%lambda_h(nzb_wall+2,m)   = building_pars(ind_tc2_wall_r,st)
3930              surf_usm_h%lambda_h(nzb_wall+3,m)   = building_pars(ind_tc3_wall_r,st)
3931
3932              surf_usm_h%rho_c_green(nzb_wall,m)      = rho_c_soil !building_pars(ind_hc1_wall_r,st)
3933              surf_usm_h%rho_c_green(nzb_wall+1,m)    = rho_c_soil !building_pars(ind_hc1_wall_r,st)
3934              surf_usm_h%rho_c_green(nzb_wall+2,m)    = rho_c_soil !building_pars(ind_hc2_wall_r,st)
3935              surf_usm_h%rho_c_green(nzb_wall+3,m)    = rho_c_soil !building_pars(ind_hc3_wall_r,st)
3936              surf_usm_h%lambda_h_green(nzb_wall,m)   = lambda_h_green_sm !building_pars(ind_tc1_wall_r,st)
3937              surf_usm_h%lambda_h_green(nzb_wall+1,m) = lambda_h_green_sm !building_pars(ind_tc1_wall_r,st)
3938              surf_usm_h%lambda_h_green(nzb_wall+2,m) = lambda_h_green_sm !building_pars(ind_tc2_wall_r,st)
3939              surf_usm_h%lambda_h_green(nzb_wall+3,m) = lambda_h_green_sm !building_pars(ind_tc3_wall_r,st)
3940
3941              surf_usm_h%rho_c_window(nzb_wall,m)      = building_pars(ind_hc1_win_r,st)
3942              surf_usm_h%rho_c_window(nzb_wall+1,m)    = building_pars(ind_hc1_win_r,st)
3943              surf_usm_h%rho_c_window(nzb_wall+2,m)    = building_pars(ind_hc2_win_r,st)
3944              surf_usm_h%rho_c_window(nzb_wall+3,m)    = building_pars(ind_hc3_win_r,st)
3945              surf_usm_h%lambda_h_window(nzb_wall,m)   = building_pars(ind_tc1_win_r,st)
3946              surf_usm_h%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1_win_r,st)
3947              surf_usm_h%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2_win_r,st)
3948              surf_usm_h%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3_win_r,st)
3949
3950              surf_usm_h%target_temp_summer(m)  = building_pars(ind_indoor_target_temp_summer,st)
3951              surf_usm_h%target_temp_winter(m)  = building_pars(ind_indoor_target_temp_winter,st)
3952!
3953!--           Emissivity of wall-, green- and window fraction
3954              surf_usm_h%emissivity(m,ind_veg_wall)  = building_pars(ind_emis_wall_r,st)
3955              surf_usm_h%emissivity(m,ind_pav_green) = building_pars(ind_emis_green_r,st)
3956              surf_usm_h%emissivity(m,ind_wat_win)   = building_pars(ind_emis_win_r,st)
3957
3958              surf_usm_h%transmissivity(m)      = building_pars(ind_trans_r,st)
3959
3960              surf_usm_h%z0(m)                  = building_pars(ind_z0,st)
3961              surf_usm_h%z0h(m)                 = building_pars(ind_z0qh,st)
3962              surf_usm_h%z0q(m)                 = building_pars(ind_z0qh,st)
3963!
3964!--           Albedo type for wall fraction, green fraction, window fraction
3965              surf_usm_h%albedo_type(m,ind_veg_wall)  = INT( building_pars(ind_alb_wall_r,st) )
3966              surf_usm_h%albedo_type(m,ind_pav_green) = INT( building_pars(ind_alb_green_r,st) )
3967              surf_usm_h%albedo_type(m,ind_wat_win)   = INT( building_pars(ind_alb_win_r,st) )
3968
3969              surf_usm_h%zw(nzb_wall,m)   = building_pars(ind_thick_1_wall_r,st)
3970              surf_usm_h%zw(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,st)
3971              surf_usm_h%zw(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,st)
3972              surf_usm_h%zw(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,st)
3973
3974              surf_usm_h%zw_green(nzb_wall,m)   = building_pars(ind_thick_1_wall_r,st)
3975              surf_usm_h%zw_green(nzb_wall+1,m) = building_pars(ind_thick_2_wall_r,st)
3976              surf_usm_h%zw_green(nzb_wall+2,m) = building_pars(ind_thick_3_wall_r,st)
3977              surf_usm_h%zw_green(nzb_wall+3,m) = building_pars(ind_thick_4_wall_r,st)
3978
3979              surf_usm_h%zw_window(nzb_wall,m)   = building_pars(ind_thick_1_win_r,st)
3980              surf_usm_h%zw_window(nzb_wall+1,m) = building_pars(ind_thick_2_win_r,st)
3981              surf_usm_h%zw_window(nzb_wall+2,m) = building_pars(ind_thick_3_win_r,st)
3982              surf_usm_h%zw_window(nzb_wall+3,m) = building_pars(ind_thick_4_win_r,st)
3983
3984              surf_usm_h%green_type_roof(m) = building_pars(ind_green_type_roof,st)
3985
3986           ENDIF
3987        ENDDO
3988
3989        DO  l = 0, 3
3990           DO  m = 1, surf_usm_v(l)%ns
3991              i = surf_usm_v(l)%i(m) + surf_usm_v(l)%ioff
3992              j = surf_usm_v(l)%j(m) + surf_usm_v(l)%joff
3993!
3994!--           For the moment, limit building type to 6 (to overcome errors in input file).
3995
3996              st = building_type_f%var(j,i)
3997              IF ( st /= building_type_f%fill )  THEN
3998
3999!
4000!--              In order to distinguish between ground floor level and above-ground-floor level
4001!--              surfaces, set input indices.
4002                 ind_alb_green    = MERGE( ind_alb_green_gfl,    ind_alb_green_agfl,               &
4003                                           surf_usm_v(l)%ground_level(m) )
4004                 ind_alb_wall     = MERGE( ind_alb_wall_gfl,     ind_alb_wall_agfl,                &
4005                                           surf_usm_v(l)%ground_level(m) )
4006                 ind_alb_win      = MERGE( ind_alb_win_gfl,      ind_alb_win_agfl,                 &
4007                                           surf_usm_v(l)%ground_level(m) )
4008                 ind_wall_frac    = MERGE( ind_wall_frac_gfl,    ind_wall_frac_agfl,               &
4009                                           surf_usm_v(l)%ground_level(m) )
4010                 ind_win_frac     = MERGE( ind_win_frac_gfl,     ind_win_frac_agfl,                &
4011                                           surf_usm_v(l)%ground_level(m) )
4012                 ind_green_frac_w = MERGE( ind_green_frac_w_gfl, ind_green_frac_w_agfl,            &
4013                                           surf_usm_v(l)%ground_level(m) )
4014                 ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl,            &
4015                                           surf_usm_v(l)%ground_level(m) )
4016                 ind_lai_r        = MERGE( ind_lai_r_gfl,        ind_lai_r_agfl,                   &
4017                                           surf_usm_v(l)%ground_level(m) )
4018                 ind_lai_w        = MERGE( ind_lai_w_gfl,        ind_lai_w_agfl,                   &
4019                                           surf_usm_v(l)%ground_level(m) )
4020                 ind_hc1          = MERGE( ind_hc1_gfl,          ind_hc1_agfl,                     &
4021                                           surf_usm_v(l)%ground_level(m) )
4022                 ind_hc1_win      = MERGE( ind_hc1_win_gfl,      ind_hc1_win_agfl,                 &
4023                                           surf_usm_v(l)%ground_level(m) )
4024                 ind_hc2          = MERGE( ind_hc2_gfl,          ind_hc2_agfl,                     &
4025                                           surf_usm_v(l)%ground_level(m) )
4026                 ind_hc2_win      = MERGE( ind_hc2_win_gfl,      ind_hc2_win_agfl,                 &
4027                                           surf_usm_v(l)%ground_level(m) )
4028                 ind_hc3          = MERGE( ind_hc3_gfl,          ind_hc3_agfl,                     &
4029                                           surf_usm_v(l)%ground_level(m) )
4030                 ind_hc3_win      = MERGE( ind_hc3_win_gfl,      ind_hc3_win_agfl,                 &
4031                                           surf_usm_v(l)%ground_level(m) )
4032                 ind_tc1          = MERGE( ind_tc1_gfl,          ind_tc1_agfl,                     &
4033                                           surf_usm_v(l)%ground_level(m) )
4034                 ind_tc1_win      = MERGE( ind_tc1_win_gfl,      ind_tc1_win_agfl,                 &
4035                                           surf_usm_v(l)%ground_level(m) )
4036                 ind_tc2          = MERGE( ind_tc2_gfl,          ind_tc2_agfl,                     &
4037                                           surf_usm_v(l)%ground_level(m) )
4038                 ind_tc2_win      = MERGE( ind_tc2_win_gfl,      ind_tc2_win_agfl,                 &
4039                                           surf_usm_v(l)%ground_level(m) )
4040                 ind_tc3          = MERGE( ind_tc3_gfl,          ind_tc3_agfl,                     &
4041                                           surf_usm_v(l)%ground_level(m) )
4042                 ind_tc3_win      = MERGE( ind_tc3_win_gfl,      ind_tc3_win_agfl,                 &
4043                                           surf_usm_v(l)%ground_level(m) )
4044                 ind_thick_1      = MERGE( ind_thick_1_gfl,      ind_thick_1_agfl,                 &
4045                                           surf_usm_v(l)%ground_level(m) )
4046                 ind_thick_1_win  = MERGE( ind_thick_1_win_gfl,  ind_thick_1_win_agfl,             &
4047                                           surf_usm_v(l)%ground_level(m) )
4048                 ind_thick_2      = MERGE( ind_thick_2_gfl,      ind_thick_2_agfl,                 &
4049                                           surf_usm_v(l)%ground_level(m) )
4050                 ind_thick_2_win  = MERGE( ind_thick_2_win_gfl,  ind_thick_2_win_agfl,             &
4051                                           surf_usm_v(l)%ground_level(m) )
4052                 ind_thick_3      = MERGE( ind_thick_3_gfl,      ind_thick_3_agfl,                 &
4053                                           surf_usm_v(l)%ground_level(m) )
4054                 ind_thick_3_win  = MERGE( ind_thick_3_win_gfl,  ind_thick_3_win_agfl,             &
4055                                           surf_usm_v(l)%ground_level(m) )
4056                 ind_thick_4      = MERGE( ind_thick_4_gfl,      ind_thick_4_agfl,                 &
4057                                           surf_usm_v(l)%ground_level(m) )
4058                 ind_thick_4_win  = MERGE( ind_thick_4_win_gfl,  ind_thick_4_win_agfl,             &
4059                                           surf_usm_v(l)%ground_level(m) )
4060                 ind_emis_wall    = MERGE( ind_emis_wall_gfl,    ind_emis_wall_agfl,               &
4061                                           surf_usm_v(l)%ground_level(m) )
4062                 ind_emis_green   = MERGE( ind_emis_green_gfl,   ind_emis_green_agfl,              &
4063                                           surf_usm_v(l)%ground_level(m) )
4064                 ind_emis_win     = MERGE( ind_emis_win_gfl,     ind_emis_win_agfl,                &
4065                                           surf_usm_v(l)%ground_level(m) )
4066                 ind_trans        = MERGE( ind_trans_gfl,       ind_trans_agfl,                    &
4067                                         surf_usm_v(l)%ground_level(m) )
4068                 ind_z0           = MERGE( ind_z0_gfl,           ind_z0_agfl,                      &
4069                                           surf_usm_v(l)%ground_level(m) )
4070                 ind_z0qh         = MERGE( ind_z0qh_gfl,         ind_z0qh_agfl,                    &
4071                                           surf_usm_v(l)%ground_level(m) )
4072!
4073!--              Store building type and its name on each surface element
4074                 surf_usm_v(l)%building_type(m)      = st
4075                 surf_usm_v(l)%building_type_name(m) = building_type_name(st)
4076!
4077!--              Initialize relatvie wall- (0), green- (1) and window (2) fractions
4078                 surf_usm_v(l)%frac(m,ind_veg_wall)  = building_pars(ind_wall_frac,st)
4079                 surf_usm_v(l)%frac(m,ind_pav_green) = building_pars(ind_green_frac_w,st)
4080                 surf_usm_v(l)%frac(m,ind_wat_win)   = building_pars(ind_win_frac,st)
4081                 surf_usm_v(l)%lai(m)                = building_pars(ind_lai_w,st)
4082
4083                 surf_usm_v(l)%rho_c_wall(nzb_wall,m)   = building_pars(ind_hc1,st)
4084                 surf_usm_v(l)%rho_c_wall(nzb_wall+1,m) = building_pars(ind_hc1,st)
4085                 surf_usm_v(l)%rho_c_wall(nzb_wall+2,m) = building_pars(ind_hc2,st)
4086                 surf_usm_v(l)%rho_c_wall(nzb_wall+3,m) = building_pars(ind_hc3,st)
4087
4088                 surf_usm_v(l)%rho_c_green(nzb_wall,m)   = rho_c_soil !building_pars(ind_hc1,st)
4089                 surf_usm_v(l)%rho_c_green(nzb_wall+1,m) = rho_c_soil !building_pars(ind_hc1,st)
4090                 surf_usm_v(l)%rho_c_green(nzb_wall+2,m) = rho_c_soil !building_pars(ind_hc2,st)
4091                 surf_usm_v(l)%rho_c_green(nzb_wall+3,m) = rho_c_soil !building_pars(ind_hc3,st)
4092
4093                 surf_usm_v(l)%rho_c_window(nzb_wall,m)   = building_pars(ind_hc1_win,st)
4094                 surf_usm_v(l)%rho_c_window(nzb_wall+1,m) = building_pars(ind_hc1_win,st)
4095                 surf_usm_v(l)%rho_c_window(nzb_wall+2,m) = building_pars(ind_hc2_win,st)
4096                 surf_usm_v(l)%rho_c_window(nzb_wall+3,m) = building_pars(ind_hc3_win,st)
4097
4098                 surf_usm_v(l)%lambda_h(nzb_wall,m)   = building_pars(ind_tc1,st)
4099                 surf_usm_v(l)%lambda_h(nzb_wall+1,m) = building_pars(ind_tc1,st)
4100                 surf_usm_v(l)%lambda_h(nzb_wall+2,m) = building_pars(ind_tc2,st)
4101                 surf_usm_v(l)%lambda_h(nzb_wall+3,m) = building_pars(ind_tc3,st)
4102
4103                 surf_usm_v(l)%lambda_h_green(nzb_wall,m)   = lambda_h_green_sm !building_pars(ind_tc1,st)
4104                 surf_usm_v(l)%lambda_h_green(nzb_wall+1,m) = lambda_h_green_sm !building_pars(ind_tc1,st)
4105                 surf_usm_v(l)%lambda_h_green(nzb_wall+2,m) = lambda_h_green_sm !building_pars(ind_tc2,st)
4106                 surf_usm_v(l)%lambda_h_green(nzb_wall+3,m) = lambda_h_green_sm !building_pars(ind_tc3,st)
4107
4108                 surf_usm_v(l)%lambda_h_window(nzb_wall,m)   = building_pars(ind_tc1_win,st)
4109                 surf_usm_v(l)%lambda_h_window(nzb_wall+1,m) = building_pars(ind_tc1_win,st)
4110                 surf_usm_v(l)%lambda_h_window(nzb_wall+2,m) = building_pars(ind_tc2_win,st)
4111                 surf_usm_v(l)%lambda_h_window(nzb_wall+3,m) = building_pars(ind_tc3_win,st)
4112
4113                 surf_usm_v(l)%target_temp_summer(m) = building_pars(ind_indoor_target_temp_summer,st)
4114                 surf_usm_v(l)%target_temp_winter(m) = building_pars(ind_indoor_target_temp_winter,st)
4115!
4116!--              Emissivity of wall-, green- and window fraction
4117                 surf_usm_v(l)%emissivity(m,ind_veg_wall)  = building_pars(ind_emis_wall,st)
4118                 surf_usm_v(l)%emissivity(m,ind_pav_green) = building_pars(ind_emis_green,st)
4119                 surf_usm_v(l)%emissivity(m,ind_wat_win)   = building_pars(ind_emis_win,st)
4120
4121                 surf_usm_v(l)%transmissivity(m) = building_pars(ind_trans,st)
4122
4123                 surf_usm_v(l)%z0(m)  = building_pars(ind_z0,st)
4124                 surf_usm_v(l)%z0h(m) = building_pars(ind_z0qh,st)
4125                 surf_usm_v(l)%z0q(m) = building_pars(ind_z0qh,st)
4126
4127                 surf_usm_v(l)%albedo_type(m,ind_veg_wall)  = INT( building_pars(ind_alb_wall,st) )
4128                 surf_usm_v(l)%albedo_type(m,ind_pav_green) = INT( building_pars(ind_alb_green,st) )
4129                 surf_usm_v(l)%albedo_type(m,ind_wat_win)   = INT( building_pars(ind_alb_win,st) )
4130
4131                 surf_usm_v(l)%zw(nzb_wall,m)   = building_pars(ind_thick_1,st)
4132                 surf_usm_v(l)%zw(nzb_wall+1,m) = building_pars(ind_thick_2,st)
4133                 surf_usm_v(l)%zw(nzb_wall+2,m) = building_pars(ind_thick_3,st)
4134                 surf_usm_v(l)%zw(nzb_wall+3,m) = building_pars(ind_thick_4,st)
4135
4136                 surf_usm_v(l)%zw_green(nzb_wall,m)   = building_pars(ind_thick_1,st)
4137                 surf_usm_v(l)%zw_green(nzb_wall+1,m) = building_pars(ind_thick_2,st)
4138                 surf_usm_v(l)%zw_green(nzb_wall+2,m) = building_pars(ind_thick_3,st)
4139                 surf_usm_v(l)%zw_green(nzb_wall+3,m) = building_pars(ind_thick_4,st)
4140
4141                 surf_usm_v(l)%zw_window(nzb_wall,m)   = building_pars(ind_thick_1_win,st)
4142                 surf_usm_v(l)%zw_window(nzb_wall+1,m) = building_pars(ind_thick_2_win,st)
4143                 surf_usm_v(l)%zw_window(nzb_wall+2,m) = building_pars(ind_thick_3_win,st)
4144                 surf_usm_v(l)%zw_window(nzb_wall+3,m) = building_pars(ind_thick_4_win,st)
4145
4146              ENDIF
4147           ENDDO
4148        ENDDO
4149     ENDIF
4150
4151!
4152!--  Level 3 - initialization via building_pars read from file. Note, only variables that are also
4153!--  defined in the input-standard can be initialized via file. Other variables will be initialized
4154!--  on level 1 or 2.
4155     IF ( building_pars_f%from_file )  THEN
4156        DO  m = 1, surf_usm_h%ns
4157           i = surf_usm_h%i(m)
4158           j = surf_usm_h%j(m)
4159
4160!
4161!--        In order to distinguish between ground floor level and above-ground-floor level surfaces,
4162!--        set input indices.
4163           ind_wall_frac    = MERGE( ind_wall_frac_gfl, ind_wall_frac_agfl,                        &
4164                                     surf_usm_h%ground_level(m) )
4165           ind_green_frac_r = MERGE( ind_green_frac_r_gfl, ind_green_frac_r_agfl,                  &
4166                                     surf_usm_h%ground_level(m) )
4167           ind_win_frac     = MERGE( ind_win_frac_gfl, ind_win_frac_agfl,                          &
4168                                     surf_usm_h%ground_level(m) )
4169           ind_lai_r        = MERGE( ind_lai_r_gfl, ind_lai_r_agfl, surf_usm_h%ground_level(m) )
4170           ind_z0           = MERGE( ind_z0_gfl, ind_z0_agfl, surf_usm_h%ground_level(m) )
4171           ind_z0qh         = MERGE( ind_z0qh_gfl, ind_z0qh_agfl, surf_usm_h%ground_level(m) )
4172           ind_hc1          = MERGE( ind_hc1_gfl, ind_hc1_agfl, surf_usm_h%ground_level(m) )
4173           ind_hc2          = MERGE( ind_hc2_gfl, ind_hc2_agfl, surf_usm_h%ground_level(m) )
4174           ind_hc3          = MERGE( ind_hc3_gfl, ind_hc3_agfl, surf_usm_h%ground_level(m) )
4175           ind_tc1          = MERGE( ind_tc1_gfl, ind_tc1_agfl, surf_usm_h%ground_level(m) )
4176           ind_tc2          = MERGE( ind_tc2_gfl, ind_tc2_agfl, surf_usm_h%ground_level(m) )
4177           ind_tc3          = MERGE( ind_tc3_gfl, ind_tc3_agfl, surf_usm_h%ground_level(m) )
4178           ind_emis_wall    = MERGE( ind_emis_wall_gfl, ind_emis_wall_agfl,                        &
4179                                     surf_usm_h%ground_level(m) )
4180           ind_emis_green   = MERGE( ind_emis_green_gfl, ind_emis_green_agfl,                      &
4181                                     surf_usm_h%ground_level(m) )
4182           ind_emis_win     = MERGE( ind_emis_win_gfl, ind_emis_win_agfl,                          &
4183                                     surf_usm_h%ground_level(m) )
4184           ind_trans        = MERGE( ind_trans_gfl, ind_trans_agfl, surf_usm_h%ground_level(m) )
4185
4186!
4187!--        Initialize relatvie wall- (0), green- (1) and window (2) fractions
4188           IF ( building_pars_f%pars_xy(ind_wall_frac,j,i) /= building_pars_f%fill )               &
4189              surf_usm_h%frac(m,ind_veg_wall) = building_pars_f%pars_xy(ind_wall_frac,j,i)
4190
4191           IF ( building_pars_f%pars_xy(ind_green_frac_r,j,i) /= building_pars_f%fill )            &
4192              surf_usm_h%frac(m,ind_pav_green) = building_pars_f%pars_xy(ind_green_frac_r,j,i)
4193
4194           IF ( building_pars_f%pars_xy(ind_win_frac,j,i) /= building_pars_f%fill )                &
4195              surf_usm_h%frac(m,ind_wat_win) = building_pars_f%pars_xy(ind_win_frac,j,i)
4196
4197           IF ( building_pars_f%pars_xy(ind_lai_r,j,i) /= building_pars_f%fill )                   &
4198              surf_usm_h%lai(m) = building_pars_f%pars_xy(ind_lai_r,j,i)
4199
4200           IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4201              surf_usm_h%rho_c_wall(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4202              surf_usm_h%rho_c_wall(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4203           ENDIF
4204
4205
4206           IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )                     &
4207              surf_usm_h%rho_c_wall(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4208
4209           IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )                     &
4210              surf_usm_h%rho_c_wall(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4211
4212           IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4213              surf_usm_h%rho_c_green(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4214              surf_usm_h%rho_c_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4215           ENDIF
4216           IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )                     &
4217              surf_usm_h%rho_c_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4218
4219           IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )                     &
4220              surf_usm_h%rho_c_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4221
4222           IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4223              surf_usm_h%rho_c_window(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4224              surf_usm_h%rho_c_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4225           ENDIF
4226           IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )                     &
4227              surf_usm_h%rho_c_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4228
4229           IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )                     &
4230              surf_usm_h%rho_c_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4231
4232           IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4233              surf_usm_h%lambda_h(nzb_wall,m)   = building_pars_f%pars_xy(ind_tc1,j,i)
4234              surf_usm_h%lambda_h(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)
4235           ENDIF
4236           IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )                     &
4237              surf_usm_h%lambda_h(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4238
4239           IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )                     &
4240              surf_usm_h%lambda_h(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)
4241
4242           IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4243              surf_usm_h%lambda_h_green(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i)
4244              surf_usm_h%lambda_h_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)
4245           ENDIF
4246           IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )                     &
4247              surf_usm_h%lambda_h_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4248
4249           IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )                     &
4250              surf_usm_h%lambda_h_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)
4251
4252           IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4253              surf_usm_h%lambda_h_window(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i)
4254              surf_usm_h%lambda_h_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)
4255           ENDIF
4256           IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )                     &
4257              surf_usm_h%lambda_h_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4258
4259           IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )                     &
4260              surf_usm_h%lambda_h_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)
4261
4262           IF ( building_pars_f%pars_xy(ind_indoor_target_temp_summer,j,i) /=                      &
4263                building_pars_f%fill )                                                             &
4264              surf_usm_h%target_temp_summer(m) =                                                   &
4265              building_pars_f%pars_xy(ind_indoor_target_temp_summer,j,i)
4266
4267           IF ( building_pars_f%pars_xy(ind_indoor_target_temp_winter,j,i) /=                      &
4268                building_pars_f%fill )                                                             &
4269              surf_usm_h%target_temp_winter(m) =                                                   &
4270              building_pars_f%pars_xy(ind_indoor_target_temp_winter,j,i)
4271
4272           IF ( building_pars_f%pars_xy(ind_emis_wall,j,i) /= building_pars_f%fill )               &
4273              surf_usm_h%emissivity(m,ind_veg_wall) = building_pars_f%pars_xy(ind_emis_wall,j,i)
4274
4275           IF ( building_pars_f%pars_xy(ind_emis_green,j,i) /= building_pars_f%fill )              &
4276              surf_usm_h%emissivity(m,ind_pav_green) = building_pars_f%pars_xy(ind_emis_green,j,i)
4277
4278           IF ( building_pars_f%pars_xy(ind_emis_win,j,i) /= building_pars_f%fill )                &
4279              surf_usm_h%emissivity(m,ind_wat_win) = building_pars_f%pars_xy(ind_emis_win,j,i)
4280
4281           IF ( building_pars_f%pars_xy(ind_trans,j,i) /= building_pars_f%fill )                   &
4282              surf_usm_h%transmissivity(m) = building_pars_f%pars_xy(ind_trans,j,i)
4283
4284           IF ( building_pars_f%pars_xy(ind_z0,j,i) /= building_pars_f%fill )                      &
4285              surf_usm_h%z0(m) = building_pars_f%pars_xy(ind_z0,j,i)
4286
4287           IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill )                    &
4288              surf_usm_h%z0h(m) = building_pars_f%pars_xy(ind_z0qh,j,i)
4289
4290           IF ( building_pars_f%pars_xy(ind_z0qh,j,i) /= building_pars_f%fill )                    &
4291              surf_usm_h%z0q(m) = building_pars_f%pars_xy(ind_z0qh,j,i)
4292
4293           IF ( building_pars_f%pars_xy(ind_alb_wall_agfl,j,i) /= building_pars_f%fill )           &
4294              surf_usm_h%albedo_type(m,ind_veg_wall)  =                                            &
4295              building_pars_f%pars_xy(ind_alb_wall_agfl,j,i)
4296
4297           IF ( building_pars_f%pars_xy(ind_alb_green_agfl,j,i) /= building_pars_f%fill )          &
4298              surf_usm_h%albedo_type(m,ind_pav_green) =                                            &
4299              building_pars_f%pars_xy(ind_alb_green_agfl,j,i)
4300
4301           IF ( building_pars_f%pars_xy(ind_alb_win_agfl,j,i) /= building_pars_f%fill )            &
4302              surf_usm_h%albedo_type(m,ind_wat_win)   =                                            &
4303              building_pars_f%pars_xy(ind_alb_win_agfl,j,i)
4304
4305           IF ( building_pars_f%pars_xy(ind_thick_1_agfl,j,i) /= building_pars_f%fill )            &
4306              surf_usm_h%zw(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1_agfl,j,i)
4307
4308           IF ( building_pars_f%pars_xy(ind_thick_2_agfl,j,i) /= building_pars_f%fill )            &
4309              surf_usm_h%zw(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2_agfl,j,i)
4310
4311           IF ( building_pars_f%pars_xy(ind_thick_3_agfl,j,i) /= building_pars_f%fill )            &
4312              surf_usm_h%zw(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3_agfl,j,i)
4313
4314           IF ( building_pars_f%pars_xy(ind_thick_4_agfl,j,i) /= building_pars_f%fill )            &
4315              surf_usm_h%zw(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4_agfl,j,i)
4316
4317           IF ( building_pars_f%pars_xy(ind_thick_1_agfl,j,i) /= building_pars_f%fill )            &
4318              surf_usm_h%zw_green(nzb_wall,m) = building_pars_f%pars_xy(ind_thick_1_agfl,j,i)
4319
4320           IF ( building_pars_f%pars_xy(ind_thick_2_agfl,j,i) /= building_pars_f%fill )            &
4321              surf_usm_h%zw_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_thick_2_agfl,j,i)
4322
4323           IF ( building_pars_f%pars_xy(ind_thick_3_agfl,j,i) /= building_pars_f%fill )            &
4324              surf_usm_h%zw_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_thick_3_agfl,j,i)
4325
4326           IF ( building_pars_f%pars_xy(ind_thick_4_agfl,j,i) /= building_pars_f%fill )            &
4327              surf_usm_h%zw_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_thick_4_agfl,j,i)
4328        ENDDO
4329
4330        DO  l = 0, 3
4331           DO  m = 1, surf_usm_v(l)%ns
4332              i = surf_usm_v(l)%i(m) + surf_usm_v(l)%ioff
4333              j = surf_usm_v(l)%j(m) + surf_usm_v(l)%joff
4334
4335!
4336!--              In order to distinguish between ground floor level and above-ground-floor level
4337!--              surfaces, set input indices.
4338                 ind_wall_frac    = MERGE( ind_wall_frac_gfl, ind_wall_frac_agfl,                  &
4339                                           surf_usm_v(l)%ground_level(m) )
4340                 ind_green_frac_w = MERGE( ind_green_frac_w_gfl, ind_green_frac_w_agfl,            &
4341                                           surf_usm_v(l)%ground_level(m) )
4342                 ind_win_frac     = MERGE( ind_win_frac_gfl, ind_win_frac_agfl,                    &
4343                                           surf_usm_v(l)%ground_level(m) )
4344                 ind_lai_w        = MERGE( ind_lai_w_gfl, ind_lai_w_agfl,                          &
4345                                           surf_usm_v(l)%ground_level(m) )
4346                 ind_z0           = MERGE( ind_z0_gfl, ind_z0_agfl,                                &
4347                                           surf_usm_v(l)%ground_level(m) )
4348                 ind_z0qh         = MERGE( ind_z0qh_gfl, ind_z0qh_agfl,                            &
4349                                           surf_usm_v(l)%ground_level(m) )
4350                 ind_hc1          = MERGE( ind_hc1_gfl, ind_hc1_agfl,                              &
4351                                           surf_usm_v(l)%ground_level(m) )
4352                 ind_hc2          = MERGE( ind_hc2_gfl, ind_hc2_agfl,                              &
4353                                           surf_usm_v(l)%ground_level(m) )
4354                 ind_hc3          = MERGE( ind_hc3_gfl, ind_hc3_agfl,                              &
4355                                           surf_usm_v(l)%ground_level(m) )
4356                 ind_tc1          = MERGE( ind_tc1_gfl, ind_tc1_agfl,                              &
4357                                           surf_usm_v(l)%ground_level(m) )
4358                 ind_tc2          = MERGE( ind_tc2_gfl, ind_tc2_agfl,                              &
4359                                           surf_usm_v(l)%ground_level(m) )
4360                 ind_tc3          = MERGE( ind_tc3_gfl, ind_tc3_agfl,                              &
4361                                           surf_usm_v(l)%ground_level(m) )
4362                 ind_emis_wall    = MERGE( ind_emis_wall_gfl, ind_emis_wall_agfl,                  &
4363                                           surf_usm_v(l)%ground_level(m) )
4364                 ind_emis_green   = MERGE( ind_emis_green_gfl, ind_emis_green_agfl,                &
4365                                           surf_usm_v(l)%ground_level(m) )
4366                 ind_emis_win     = MERGE( ind_emis_win_gfl, ind_emis_win_agfl,                    &
4367                                           surf_usm_v(l)%ground_level(m) )
4368                 ind_trans        = MERGE( ind_trans_gfl, ind_trans_agfl,                          &
4369                                           surf_usm_v(l)%ground_level(m) )
4370
4371!
4372!--              Initialize relatvie wall- (0), green- (1) and window (2) fractions
4373                 IF ( building_pars_f%pars_xy(ind_wall_frac,j,i) /= building_pars_f%fill )         &
4374                    surf_usm_v(l)%frac(m,ind_veg_wall) = building_pars_f%pars_xy(ind_wall_frac,j,i)
4375
4376                 IF ( building_pars_f%pars_xy(ind_green_frac_w,j,i) /= building_pars_f%fill )      &
4377                    surf_usm_v(l)%frac(m,ind_pav_green) =                                          &
4378                    building_pars_f%pars_xy(ind_green_frac_w,j,i)
4379
4380                 IF ( building_pars_f%pars_xy(ind_win_frac,j,i) /= building_pars_f%fill )          &
4381                    surf_usm_v(l)%frac(m,ind_wat_win) = building_pars_f%pars_xy(ind_win_frac,j,i)
4382
4383                 IF ( building_pars_f%pars_xy(ind_lai_w,j,i) /= building_pars_f%fill )             &
4384                    surf_usm_v(l)%lai(m) = building_pars_f%pars_xy(ind_lai_w,j,i)
4385
4386                 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4387                    surf_usm_v(l)%rho_c_wall(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4388                    surf_usm_v(l)%rho_c_wall(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4389                 ENDIF
4390
4391
4392                 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )               &
4393                    surf_usm_v(l)%rho_c_wall(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4394
4395                 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )               &
4396                    surf_usm_v(l)%rho_c_wall(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4397
4398                 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4399                    surf_usm_v(l)%rho_c_green(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4400                    surf_usm_v(l)%rho_c_green(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4401                 ENDIF
4402                 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )               &
4403                    surf_usm_v(l)%rho_c_green(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4404
4405                 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )               &
4406                    surf_usm_v(l)%rho_c_green(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4407
4408                 IF ( building_pars_f%pars_xy(ind_hc1,j,i) /= building_pars_f%fill )  THEN
4409                    surf_usm_v(l)%rho_c_window(nzb_wall,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4410                    surf_usm_v(l)%rho_c_window(nzb_wall+1,m) = building_pars_f%pars_xy(ind_hc1,j,i)
4411                 ENDIF
4412                 IF ( building_pars_f%pars_xy(ind_hc2,j,i) /= building_pars_f%fill )               &
4413                    surf_usm_v(l)%rho_c_window(nzb_wall+2,m) = building_pars_f%pars_xy(ind_hc2,j,i)
4414
4415                 IF ( building_pars_f%pars_xy(ind_hc3,j,i) /= building_pars_f%fill )               &
4416                    surf_usm_v(l)%rho_c_window(nzb_wall+3,m) = building_pars_f%pars_xy(ind_hc3,j,i)
4417
4418                 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4419                    surf_usm_v(l)%lambda_h(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i)
4420                    surf_usm_v(l)%lambda_h(nzb_wall+1,m) = building_pars_f%pars_xy(ind_tc1,j,i)
4421                 ENDIF
4422                 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )               &
4423                    surf_usm_v(l)%lambda_h(nzb_wall+2,m) = building_pars_f%pars_xy(ind_tc2,j,i)
4424
4425                 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )               &
4426                    surf_usm_v(l)%lambda_h(nzb_wall+3,m) = building_pars_f%pars_xy(ind_tc3,j,i)
4427
4428                 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4429                    surf_usm_v(l)%lambda_h_green(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,j,i)
4430                    surf_usm_v(l)%lambda_h_green(nzb_wall+1,m) =                                   &
4431                    building_pars_f%pars_xy(ind_tc1,j,i)
4432                 ENDIF
4433                 IF ( building_pars_f%pars_xy(ind_tc2,j,i) /= building_pars_f%fill )               &
4434                    surf_usm_v(l)%lambda_h_green(nzb_wall+2,m) =                                   &
4435                    building_pars_f%pars_xy(ind_tc2,j,i)
4436
4437                 IF ( building_pars_f%pars_xy(ind_tc3,j,i) /= building_pars_f%fill )               &
4438                    surf_usm_v(l)%lambda_h_green(nzb_wall+3,m) =                                   &
4439                    building_pars_f%pars_xy(ind_tc3,j,i)
4440
4441                 IF ( building_pars_f%pars_xy(ind_tc1,j,i) /= building_pars_f%fill )  THEN
4442                    surf_usm_v(l)%lambda_h_window(nzb_wall,m) = building_pars_f%pars_xy(ind_tc1,