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

Last change on this file since 4783 was 4783, checked in by raasch, 20 months ago

bugfix for reading restart data with MPI-I/O (does not work with blockwise I/O); missed revision comments from previous commit added

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