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

Last change on this file since 4509 was 4509, checked in by raasch, 9 months ago

files re-formatted to follow the PALM coding standard

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