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

Last change on this file since 4843 was 4843, checked in by raasch, 8 months ago

local namelist parameter added to switch off the module although the respective module namelist appears in the namelist file, further copyright updates

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