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

Last change on this file since 4598 was 4581, checked in by suehring, 10 months ago

mesoscale nesting: omit explicit pressure forcing via geostrophic wind components; chemistry: enable profile output of vertical fluxes; urban-surface: bugfix in initialization in case of cyclic_fill

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