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

Last change on this file since 3435 was 3435, checked in by gronemeier, 3 years ago

new: terrain-following masked output; bugfixes: increase vertical dimension of gamma_w_green_sat by 1, add checks for masked output for chemistry_model and radiation_model, reordered calls to xxx_define_netcdf_grid in masked output part

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