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

Last change on this file since 4850 was 4850, checked in by suehring, 8 months ago

Bugfix in indoor model: consider previous indoor temperature during restarts; Further bugfix in mpi-io restart mechanism for the waste-heat flux from buildings

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