source: palm/trunk/SOURCE/land_surface_model_mod.f90 @ 4194

Last change on this file since 4194 was 4194, checked in by suehring, 6 years ago

In case z0 exceeds the surface-layer height at water surfaces, apply more strict limitation of z0, in order to avoid instabilities when friction velocity is almost zero.

  • Property svn:keywords set to Id
File size: 327.8 KB
Line 
1!> @file land_surface_model_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 1997-2019 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: land_surface_model_mod.f90 4194 2019-08-28 08:09:44Z suehring $
27! Apply more strict limitation of z0 over water surfaces in case it exceeds the
28! surface-layer height, in order to avoid instabilities.
29!
30! 4188 2019-08-26 14:15:47Z suehring
31! Minor adjustment in error numbers, typos corrected
32!
33! 4187 2019-08-26 12:43:15Z suehring
34! Adjust message call in case of local checks
35!
36! 4182 2019-08-22 15:20:23Z scharf
37! Corrected "Former revisions" section
38!
39! 4118 2019-07-25 16:11:45Z suehring
40! Initialization of soil temperature and moisture via dynamic input file only
41! for vegetation and pavement surfaces.
42!
43! 4110 2019-07-22 17:05:21Z suehring
44! Relax checks for non-consistent initialization in case static or dynamic
45! input is provided. For example, soil_temperature or deep_soil_temperature
46! is not mandatory any more if dynamic input is available. Also, improper
47! settings of x_type in namelist are only checked if no static file is
48! available.
49!
50! 4109 2019-07-22 17:00:34Z suehring
51! Further revision of last commit in order to avoid any side effects when
52! albedo type is not set in namelist and default albedo type changes.
53!
54! 4024 2019-06-12 14:06:46Z suehring
55! Bugfix in albedo initialization, caused crashes in rrtmg calls
56!
57! 3987 2019-05-22 09:52:13Z kanani
58! Introduce alternative switch for debug output during timestepping
59!
60! 3964 2019-05-09 09:48:32Z suehring
61! In a nested child domain, distinguish between soil moisture and temperature
62! initialization from parent via dynamic input file. Further, initialize soil
63! moisture/temperature from dynamic input file only when initialization via
64! 'inifor' is desired.
65!
66! 3943 2019-05-02 09:50:41Z maronga
67! Removed extra blank character
68!
69! 3941 2019-04-30 09:48:33Z suehring
70! Check that at least one surface type is set at surface element.
71!
72! 3933 2019-04-25 12:33:20Z kanani
73! Remove unused subroutine and allocation of pt_2m, this is done in surface_mod
74! now (surfaces%pt_2m)
75!
76!
77! Changes related to global restructuring of location messages and introduction
78! of additional debug messages
79!
80! 3881 2019-04-10 09:31:22Z suehring
81! Bugfix in level 3 initialization of pavement albedo type and pavement
82! emissivity
83!
84! 3868 2019-04-08 11:52:36Z suehring
85! More strict limitation of roughness length when it is in the order of the
86! vertical grid spacing
87!
88! 3856 2019-04-03 11:06:59Z suehring
89! Bugfix in lsm_init in case no surface-fractions are provided
90!
91! 3847 2019-04-01 14:51:44Z suehring
92! Adjust message-call for checks that are especially carried out locally.
93!
94! 3832 2019-03-28 13:16:58Z raasch
95! instrumented with openmp directives
96!
97! 3786 2019-03-06 16:58:03Z raasch
98! further unused variables removed
99!
100! 3767 2019-02-27 08:18:02Z raasch
101! unused variable for file index removed from rrd-subroutines parameter list
102!
103! 3715 2019-02-04 17:34:55Z suehring
104! Revise check for saturation moisture
105!
106! 3710 2019-01-30 18:11:19Z suehring
107! Check if soil-, water-, pavement- and vegetation types are set within a valid
108! range.
109!
110! 3692 2019-01-23 14:45:49Z suehring
111! Revise check for soil moisture higher than its saturation value
112!
113! 3685 2019-01-21 01:02:11Z knoop
114! Some interface calls moved to module_interface + cleanup
115!
116! 3677 2019-01-17 09:07:06Z moh.hefny
117! Removed most_method
118!
119! 3655 2019-01-07 16:51:22Z knoop
120! nopointer option removed
121!
122! 1496 2014-12-02 17:25:50Z maronga
123! Initial revision
124!
125!
126! Description:
127! ------------
128!> Land surface model, consisting of a solver for the energy balance at the
129!> surface and a multi layer soil scheme. The scheme is similar to the TESSEL
130!> scheme implemented in the ECMWF IFS model, with modifications according to
131!> H-TESSEL. The implementation is based on the formulation implemented in the
132!> DALES and UCLA-LES models.
133!>
134!> @todo Extensive verification energy-balance solver for vertical surfaces,
135!>       e.g. parametrization of r_a
136!> @todo Revise single land-surface processes for vertical surfaces, e.g.
137!>       treatment of humidity, etc.
138!> @todo Consider partial absorption of the net shortwave radiation by the
139!>       skin layer.
140!> @todo Improve surface water parameterization
141!> @todo Invert indices (running from -3 to 0. Currently: nzb_soil=0,
142!>       nzt_soil=3)).
143!> @todo Implement surface runoff model (required when performing long-term LES
144!>       with considerable precipitation.
145!> @todo Revise calculation of f2 when wilting point is non-constant in the
146!>       soil
147!> @todo Allow for zero soil moisture (currently, it is set to wilting point)
148!> @note No time step criterion is required as long as the soil layers do not
149!>       become too thin.
150!> @todo Attention, pavement_subpars_1/2 are hardcoded to 8 levels, in case
151!>       more levels are used this may cause an potential bug
152!> @todo Routine calc_q_surface required?
153!> @todo Allow for precipitation water to enter pavements that are semi-pervious
154!------------------------------------------------------------------------------!
155 MODULE land_surface_model_mod
156 
157    USE arrays_3d,                                                             &
158        ONLY:  hyp, pt, prr, q, q_p, ql, vpt, u, v, w, hyrho, exner, d_exner
159
160    USE basic_constants_and_equations_mod,                                     &
161        ONLY:  c_p, g, lv_d_cp, l_v, kappa, magnus, rho_l, r_d, r_v, rd_d_rv
162
163    USE calc_mean_profile_mod,                                                 &
164        ONLY:  calc_mean_profile
165
166    USE control_parameters,                                                    &
167        ONLY:  cloud_droplets, coupling_start_time,                            &
168               debug_output, debug_output_timestep, debug_string,              &
169               dt_3d,                                                          &
170               end_time, humidity, intermediate_timestep_count,                &
171               initializing_actions, intermediate_timestep_count_max,          &
172               land_surface, max_masks, pt_surface,                            &
173               rho_surface, spinup, spinup_pt_mean, spinup_time,               &
174               surface_pressure, timestep_scheme, tsc,                         &
175               time_since_reference_point
176
177    USE indices,                                                               &
178        ONLY:  nbgp, nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb
179
180    USE bulk_cloud_model_mod,                                                  &
181        ONLY: bulk_cloud_model, precipitation
182
183    USE netcdf_data_input_mod,                                                 &
184        ONLY :  building_type_f, init_3d,                                      &
185                input_pids_dynamic,                                            &
186                input_pids_static,                                             &
187                netcdf_data_input_interpolate, netcdf_data_input_init_lsm,     &
188                pavement_pars_f, pavement_subsurface_pars_f, pavement_type_f,  &
189                root_area_density_lsm_f, soil_pars_f, soil_type_f,             &
190                surface_fraction_f, vegetation_pars_f, vegetation_type_f,      &
191                water_pars_f, water_type_f
192
193    USE kinds
194
195    USE pegrid
196
197    USE radiation_model_mod,                                                   &
198        ONLY:  albedo, albedo_type, emissivity, force_radiation_call,          &
199               radiation, radiation_scheme, unscheduled_radiation_calls
200       
201    USE statistics,                                                            &
202        ONLY:  hom, statistic_regions
203
204    USE surface_mod,                                                           &
205        ONLY :  ind_pav_green, ind_veg_wall, ind_wat_win,                      &
206                surf_lsm_h, surf_lsm_v, surf_type, surface_restore_elements
207
208    IMPLICIT NONE
209
210    TYPE surf_type_lsm
211       REAL(wp), DIMENSION(:),   ALLOCATABLE ::  var_1d !< 1D prognostic variable
212       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  var_2d !< 2D prognostic variable
213    END TYPE surf_type_lsm
214
215!
216!-- LSM model constants
217
218    REAL(wp), PARAMETER  ::                    &
219              b_ch               = 6.04_wp,    & ! Clapp & Hornberger exponent
220              lambda_h_dry       = 0.19_wp,    & ! heat conductivity for dry soil (W/m/K) 
221              lambda_h_sm        = 3.44_wp,    & ! heat conductivity of the soil matrix (W/m/K)
222              lambda_h_water     = 0.57_wp,    & ! heat conductivity of water (W/m/K)
223              psi_sat            = -0.388_wp,  & ! soil matrix potential at saturation
224              rho_c_soil         = 2.19E6_wp,  & ! volumetric heat capacity of soil (J/m3/K)
225              rho_c_water        = 4.20E6_wp,  & ! volumetric heat capacity of water (J/m3/K)
226              m_max_depth        = 0.0002_wp     ! Maximum capacity of the water reservoir (m)
227
228
229    REAL(wp), DIMENSION(0:7), PARAMETER  :: dz_soil_default =                  & ! default soil layer configuration
230                                            (/ 0.01_wp, 0.02_wp, 0.04_wp,      &
231                                               0.06_wp, 0.14_wp, 0.26_wp,      &
232                                               0.54_wp, 1.86_wp/)
233
234    REAL(wp), DIMENSION(0:3), PARAMETER  :: dz_soil_ref =                      & ! reference four layer soil configuration used for estimating the root fractions
235                                            (/ 0.07_wp, 0.21_wp, 0.72_wp,      &
236                                               1.89_wp /)
237
238    REAL(wp), DIMENSION(0:3), PARAMETER  :: zs_ref =                           & ! reference four layer soil configuration used for estimating the root fractions
239                                            (/ 0.07_wp, 0.28_wp, 1.0_wp,       &
240                                               2.89_wp /)
241
242
243!
244!-- LSM variables
245    CHARACTER(10) :: surface_type = 'netcdf'      !< general classification. Allowed are:
246                                                  !< 'vegetation', 'pavement', ('building'),
247                                                  !< 'water', and 'netcdf'
248
249
250
251    INTEGER(iwp) :: nzb_soil = 0,             & !< bottom of the soil model (Earth's surface)
252                    nzt_soil = 7,             & !< top of the soil model
253                    nzt_pavement = 0,         & !< top of the pavement within the soil
254                    nzs = 8,                  & !< number of soil layers
255                    pavement_depth_level = 0, & !< default NAMELIST nzt_pavement
256                    pavement_type = 1,        & !< default NAMELIST pavement_type                 
257                    soil_type = 3,            & !< default NAMELIST soil_type
258                    vegetation_type = 2,      & !< default NAMELIST vegetation_type
259                    water_type = 1              !< default NAMELISt water_type
260                   
261   
262       
263    LOGICAL :: conserve_water_content = .TRUE.,  & !< open or closed bottom surface for the soil model
264               constant_roughness = .FALSE.,     & !< use fixed/dynamic roughness lengths for water surfaces
265               force_radiation_call_l = .FALSE., & !< flag to force calling of radiation routine
266               aero_resist_kray = .TRUE.           !< flag to control parametrization of aerodynamic resistance at vertical surface elements
267
268!   value 9999999.9_wp -> generic available or user-defined value must be set
269!   otherwise -> no generic variable and user setting is optional
270    REAL(wp) :: alpha_vangenuchten = 9999999.9_wp,      & !< NAMELIST alpha_vg
271                canopy_resistance_coefficient = 9999999.9_wp, & !< NAMELIST g_d
272                c_surface = 9999999.9_wp,               & !< Surface (skin) heat capacity (J/m2/K)
273                deep_soil_temperature =  9999999.9_wp,  & !< Deep soil temperature (bottom boundary condition)
274                drho_l_lv,                              & !< (rho_l * l_v)**-1
275                field_capacity = 9999999.9_wp,          & !< NAMELIST m_fc
276                f_shortwave_incoming = 9999999.9_wp,    & !< NAMELIST f_sw_in
277                hydraulic_conductivity = 9999999.9_wp,  & !< NAMELIST gamma_w_sat
278                ke = 0.0_wp,                            & !< Kersten number
279                lambda_h_sat = 0.0_wp,                  & !< heat conductivity for saturated soil (W/m/K)
280                lambda_surface_stable = 9999999.9_wp,   & !< NAMELIST lambda_surface_s (W/m2/K)
281                lambda_surface_unstable = 9999999.9_wp, & !< NAMELIST lambda_surface_u (W/m2/K)
282                leaf_area_index = 9999999.9_wp,         & !< NAMELIST lai
283                l_vangenuchten = 9999999.9_wp,          & !< NAMELIST l_vg
284                min_canopy_resistance = 9999999.9_wp,   & !< NAMELIST r_canopy_min
285                min_soil_resistance = 50.0_wp,          & !< NAMELIST r_soil_min
286                m_total = 0.0_wp,                       & !< weighted total water content of the soil (m3/m3)
287                n_vangenuchten = 9999999.9_wp,          & !< NAMELIST n_vg
288                pavement_heat_capacity = 9999999.9_wp,  & !< volumetric heat capacity of pavement (e.g. roads) (J/m3/K)
289                pavement_heat_conduct  = 9999999.9_wp,  & !< heat conductivity for pavements (e.g. roads) (W/m/K)
290                q_s = 0.0_wp,                           & !< saturation water vapor mixing ratio
291                residual_moisture = 9999999.9_wp,       & !< NAMELIST m_res
292                rho_cp,                                 & !< rho_surface * cp
293                rho_lv,                                 & !< rho_ocean * l_v
294                saturation_moisture = 9999999.9_wp,     & !< NAMELIST m_sat
295                skip_time_do_lsm = 0.0_wp,              & !< LSM is not called before this time
296                vegetation_coverage = 9999999.9_wp,     & !< NAMELIST c_veg
297                water_temperature = 9999999.9_wp,       & !< water temperature
298                wilting_point = 9999999.9_wp,           & !< NAMELIST m_wilt
299                z0_vegetation  = 9999999.9_wp,          & !< NAMELIST z0 (lsm_par)
300                z0h_vegetation = 9999999.9_wp,          & !< NAMELIST z0h (lsm_par)
301                z0q_vegetation = 9999999.9_wp,          & !< NAMELIST z0q (lsm_par)
302                z0_pavement    = 9999999.9_wp,          & !< NAMELIST z0 (lsm_par)
303                z0h_pavement   = 9999999.9_wp,          & !< NAMELIST z0h (lsm_par)
304                z0q_pavement   = 9999999.9_wp,          & !< NAMELIST z0q (lsm_par)
305                z0_water       = 9999999.9_wp,          & !< NAMELIST z0 (lsm_par)
306                z0h_water      = 9999999.9_wp,          & !< NAMELIST z0h (lsm_par)
307                z0q_water      = 9999999.9_wp             !< NAMELIST z0q (lsm_par) 
308               
309               
310    REAL(wp), DIMENSION(:), ALLOCATABLE  :: ddz_soil_center, & !< 1/dz_soil_center
311                                            ddz_soil,        & !< 1/dz_soil
312                                            dz_soil_center,  & !< soil grid spacing (center-center)
313                                            zs,              & !< depth of the temperature/moisute levels
314                                            root_extr          !< root extraction
315
316
317                                           
318    REAL(wp), DIMENSION(0:20)  ::  root_fraction = 9999999.9_wp,     & !< (NAMELIST) distribution of root surface area to the individual soil layers
319                                   soil_moisture = 0.0_wp,           & !< NAMELIST soil moisture content (m3/m3)
320                                   soil_temperature = 9999999.9_wp,  & !< NAMELIST soil temperature (K) +1
321                                   dz_soil  = 9999999.9_wp,          & !< (NAMELIST) soil layer depths (spacing)
322                                   zs_layer = 9999999.9_wp             !< soil layer depths (edge)
323                                 
324    TYPE(surf_type_lsm), POINTER ::  t_soil_h,    & !< Soil temperature (K), horizontal surface elements
325                                     t_soil_h_p,  & !< Prog. soil temperature (K), horizontal surface elements
326                                     m_soil_h,    & !< Soil moisture (m3/m3), horizontal surface elements
327                                     m_soil_h_p     !< Prog. soil moisture (m3/m3), horizontal surface elements
328
329    TYPE(surf_type_lsm), TARGET  ::  t_soil_h_1,  & !<
330                                     t_soil_h_2,  & !<
331                                     m_soil_h_1,  & !<
332                                     m_soil_h_2     !<
333
334    TYPE(surf_type_lsm), DIMENSION(:), POINTER :: &
335                                     t_soil_v,    & !< Soil temperature (K), vertical surface elements
336                                     t_soil_v_p,  & !< Prog. soil temperature (K), vertical surface elements
337                                     m_soil_v,    & !< Soil moisture (m3/m3), vertical surface elements
338                                     m_soil_v_p     !< Prog. soil moisture (m3/m3), vertical surface elements   
339
340    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::&
341                                     t_soil_v_1,  & !<
342                                     t_soil_v_2,  & !<
343                                     m_soil_v_1,  & !<
344                                     m_soil_v_2     !<
345
346    TYPE(surf_type_lsm), POINTER  ::  t_surface_h,    & !< surface temperature (K), horizontal surface elements
347                                      t_surface_h_p,  & !< progn. surface temperature (K), horizontal surface elements
348                                      m_liq_h,        & !< liquid water reservoir (m), horizontal surface elements
349                                      m_liq_h_p         !< progn. liquid water reservoir (m), horizontal surface elements
350
351    TYPE(surf_type_lsm), TARGET   ::  t_surface_h_1,  & !<
352                                      t_surface_h_2,  & !<
353                                      m_liq_h_1,      & !<
354                                      m_liq_h_2         !<
355
356    TYPE(surf_type_lsm), DIMENSION(:), POINTER  ::    &
357                                      t_surface_v,    & !< surface temperature (K), vertical surface elements
358                                      t_surface_v_p,  & !< progn. surface temperature (K), vertical surface elements
359                                      m_liq_v,        & !< liquid water reservoir (m), vertical surface elements
360                                      m_liq_v_p         !< progn. liquid water reservoir (m), vertical surface elements
361
362    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET   ::  &
363                                      t_surface_v_1,  & !<
364                                      t_surface_v_2,  & !<
365                                      m_liq_v_1,      & !<
366                                      m_liq_v_2         !<
367
368    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: m_liq_av
369
370    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET ::  t_soil_av, & !< Average of t_soil
371                                                        m_soil_av    !< Average of m_soil
372
373    TYPE(surf_type_lsm), TARGET ::  tm_liq_h_m      !< liquid water reservoir tendency (m), horizontal surface elements
374    TYPE(surf_type_lsm), TARGET ::  tt_surface_h_m  !< surface temperature tendency (K), horizontal surface elements
375    TYPE(surf_type_lsm), TARGET ::  tt_soil_h_m     !< t_soil storage array, horizontal surface elements
376    TYPE(surf_type_lsm), TARGET ::  tm_soil_h_m     !< m_soil storage array, horizontal surface elements
377
378    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::  tm_liq_v_m      !< liquid water reservoir tendency (m), vertical surface elements
379    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::  tt_surface_v_m  !< surface temperature tendency (K), vertical surface elements
380    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::  tt_soil_v_m     !< t_soil storage array, vertical surface elements
381    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::  tm_soil_v_m     !< m_soil storage array, vertical surface elements
382
383!
384!-- Energy balance variables               
385    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
386              c_liq_av,         & !< average of c_liq
387              c_soil_av,        & !< average of c_soil
388              c_veg_av,         & !< average of c_veg
389              lai_av,           & !< average of lai       
390              qsws_liq_av,      & !< average of qsws_liq
391              qsws_soil_av,     & !< average of qsws_soil
392              qsws_veg_av,      & !< average of qsws_veg
393              r_s_av              !< average of r_s
394 
395!
396!-- Predefined Land surface classes (vegetation_type)
397    CHARACTER(26), DIMENSION(0:18), PARAMETER :: vegetation_type_name = (/ &
398                                   'user defined              ',           & !  0
399                                   'bare soil                 ',           & !  1                           
400                                   'crops, mixed farming      ',           & !  2
401                                   'short grass               ',           & !  3
402                                   'evergreen needleleaf trees',           & !  4
403                                   'deciduous needleleaf trees',           & !  5
404                                   'evergreen broadleaf trees ',           & !  6
405                                   'deciduous broadleaf trees ',           & !  7
406                                   'tall grass                ',           & !  8
407                                   'desert                    ',           & !  9
408                                   'tundra                    ',           & ! 10
409                                   'irrigated crops           ',           & ! 11
410                                   'semidesert                ',           & ! 12
411                                   'ice caps and glaciers     ',           & ! 13
412                                   'bogs and marshes          ',           & ! 14
413                                   'evergreen shrubs          ',           & ! 15
414                                   'deciduous shrubs          ',           & ! 16
415                                   'mixed forest/woodland     ',           & ! 17
416                                   'interrupted forest        '            & ! 18
417                                                                 /)
418
419!
420!-- Soil model classes (soil_type)
421    CHARACTER(12), DIMENSION(0:6), PARAMETER :: soil_type_name = (/ &
422                                   'user defined',                  & ! 0
423                                   'coarse      ',                  & ! 1
424                                   'medium      ',                  & ! 2
425                                   'medium-fine ',                  & ! 3
426                                   'fine        ',                  & ! 4
427                                   'very fine   ',                  & ! 5
428                                   'organic     '                   & ! 6
429                                                                 /)
430
431!
432!-- Pavement classes
433    CHARACTER(29), DIMENSION(0:15), PARAMETER :: pavement_type_name = (/ &
434                                   'user defined                 ', & ! 0
435                                   'asphalt/concrete mix         ', & ! 1
436                                   'asphalt (asphalt concrete)   ', & ! 2
437                                   'concrete (Portland concrete) ', & ! 3
438                                   'sett                         ', & ! 4
439                                   'paving stones                ', & ! 5
440                                   'cobblestone                  ', & ! 6
441                                   'metal                        ', & ! 7
442                                   'wood                         ', & ! 8
443                                   'gravel                       ', & ! 9
444                                   'fine gravel                  ', & ! 10
445                                   'pebblestone                  ', & ! 11
446                                   'woodchips                    ', & ! 12
447                                   'tartan (sports)              ', & ! 13
448                                   'artifical turf (sports)      ', & ! 14
449                                   'clay (sports)                '  & ! 15
450                                                                 /)                                                             
451                                                                 
452!
453!-- Water classes
454    CHARACTER(12), DIMENSION(0:5), PARAMETER :: water_type_name = (/ &
455                                   'user defined',                   & ! 0
456                                   'lake        ',                   & ! 1
457                                   'river       ',                   & ! 2
458                                   'ocean       ',                   & ! 3
459                                   'pond        ',                   & ! 4
460                                   'fountain    '                    & ! 5
461                                                                  /)                                                                                 
462                   
463!
464!-- Land surface parameters according to the respective classes (vegetation_type)
465    INTEGER(iwp) ::  ind_v_rc_min = 0    !< index for r_canopy_min in vegetation_pars
466    INTEGER(iwp) ::  ind_v_rc_lai = 1    !< index for LAI in vegetation_pars
467    INTEGER(iwp) ::  ind_v_c_veg   = 2   !< index for c_veg in vegetation_pars
468    INTEGER(iwp) ::  ind_v_gd  = 3       !< index for g_d in vegetation_pars
469    INTEGER(iwp) ::  ind_v_z0 = 4        !< index for z0 in vegetation_pars
470    INTEGER(iwp) ::  ind_v_z0qh = 5      !< index for z0h / z0q in vegetation_pars
471    INTEGER(iwp) ::  ind_v_lambda_s = 6  !< index for lambda_s_s in vegetation_pars
472    INTEGER(iwp) ::  ind_v_lambda_u = 7  !< index for lambda_s_u in vegetation_pars
473    INTEGER(iwp) ::  ind_v_f_sw_in = 8   !< index for f_sw_in in vegetation_pars
474    INTEGER(iwp) ::  ind_v_c_surf = 9    !< index for c_surface in vegetation_pars
475    INTEGER(iwp) ::  ind_v_at = 10       !< index for albedo_type in vegetation_pars
476    INTEGER(iwp) ::  ind_v_emis = 11     !< index for emissivity in vegetation_pars
477
478    INTEGER(iwp) ::  ind_w_temp     = 0    !< index for temperature in water_pars
479    INTEGER(iwp) ::  ind_w_z0       = 1    !< index for z0 in water_pars
480    INTEGER(iwp) ::  ind_w_z0h      = 2    !< index for z0h in water_pars
481    INTEGER(iwp) ::  ind_w_lambda_s = 3    !< index for lambda_s_s in water_pars
482    INTEGER(iwp) ::  ind_w_lambda_u = 4    !< index for lambda_s_u in water_pars
483    INTEGER(iwp) ::  ind_w_at       = 5    !< index for albedo type in water_pars
484    INTEGER(iwp) ::  ind_w_emis     = 6    !< index for emissivity in water_pars
485
486    INTEGER(iwp) ::  ind_p_z0       = 0    !< index for z0 in pavement_pars
487    INTEGER(iwp) ::  ind_p_z0h      = 1    !< index for z0h in pavement_pars
488    INTEGER(iwp) ::  ind_p_at       = 2    !< index for albedo type in pavement_pars
489    INTEGER(iwp) ::  ind_p_emis     = 3    !< index for emissivity in pavement_pars
490    INTEGER(iwp) ::  ind_p_lambda_h = 0    !< index for lambda_h in pavement_subsurface_pars
491    INTEGER(iwp) ::  ind_p_rho_c    = 1    !< index for rho_c in pavement_pars
492!
493!-- Land surface parameters
494!-- r_canopy_min,     lai,   c_veg,     g_d         z0,         z0h, lambda_s_s, lambda_s_u, f_sw_in,  c_surface, albedo_type, emissivity
495    REAL(wp), DIMENSION(0:11,1:18), PARAMETER :: vegetation_pars = RESHAPE( (/ &
496          0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp,  0.005_wp,   0.5E-4_wp,     0.0_wp,    0.0_wp, 0.00_wp, 0.00_wp, 17.0_wp, 0.94_wp, & !  1
497        180.0_wp, 3.00_wp, 1.00_wp, 0.00_wp,   0.10_wp,    0.001_wp,    10.0_wp,   10.0_wp, 0.05_wp, 0.00_wp,  2.0_wp, 0.95_wp, & !  2
498        110.0_wp, 2.00_wp, 1.00_wp, 0.00_wp,   0.03_wp,   0.3E-4_wp,    10.0_wp,   10.0_wp, 0.05_wp, 0.00_wp,  2.0_wp, 0.95_wp, & !  3
499        500.0_wp, 5.00_wp, 1.00_wp, 0.03_wp,   2.00_wp,     2.00_wp,    20.0_wp,   15.0_wp, 0.03_wp, 0.00_wp,  5.0_wp, 0.97_wp, & !  4
500        500.0_wp, 5.00_wp, 1.00_wp, 0.03_wp,   2.00_wp,     2.00_wp,    20.0_wp,   15.0_wp, 0.03_wp, 0.00_wp,  6.0_wp, 0.97_wp, & !  5
501        175.0_wp, 5.00_wp, 1.00_wp, 0.03_wp,   2.00_wp,     2.00_wp,    20.0_wp,   15.0_wp, 0.03_wp, 0.00_wp,  8.0_wp, 0.97_wp, & !  6
502        240.0_wp, 6.00_wp, 0.99_wp, 0.13_wp,   2.00_wp,     2.00_wp,    20.0_wp,   15.0_wp, 0.03_wp, 0.00_wp,  9.0_wp, 0.97_wp, & !  7
503        100.0_wp, 2.00_wp, 0.70_wp, 0.00_wp,   0.47_wp,  0.47E-2_wp,    10.0_wp,   10.0_wp, 0.05_wp, 0.00_wp,  8.0_wp, 0.97_wp, & !  8
504        250.0_wp, 0.05_wp, 0.00_wp, 0.00_wp,  0.013_wp, 0.013E-2_wp,    15.0_wp,   15.0_wp, 0.00_wp, 0.00_wp,  3.0_wp, 0.94_wp, & !  9
505         80.0_wp, 1.00_wp, 0.50_wp, 0.00_wp,  0.034_wp, 0.034E-2_wp,    10.0_wp,   10.0_wp, 0.05_wp, 0.00_wp, 11.0_wp, 0.97_wp, & ! 10
506        180.0_wp, 3.00_wp, 1.00_wp, 0.00_wp,    0.5_wp,  0.50E-2_wp,    10.0_wp,   10.0_wp, 0.05_wp, 0.00_wp, 13.0_wp, 0.97_wp, & ! 11
507        150.0_wp, 0.50_wp, 0.10_wp, 0.00_wp,   0.17_wp,  0.17E-2_wp,    10.0_wp,   10.0_wp, 0.05_wp, 0.00_wp,  2.0_wp, 0.97_wp, & ! 12
508          0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, 1.3E-3_wp,   1.3E-4_wp,    58.0_wp,   58.0_wp, 0.00_wp, 0.00_wp, 11.0_wp, 0.97_wp, & ! 13
509        240.0_wp, 4.00_wp, 0.60_wp, 0.00_wp,   0.83_wp,  0.83E-2_wp,    10.0_wp,   10.0_wp, 0.05_wp, 0.00_wp,  4.0_wp, 0.97_wp, & ! 14
510        225.0_wp, 3.00_wp, 0.50_wp, 0.00_wp,   0.10_wp,  0.10E-2_wp,    10.0_wp,   10.0_wp, 0.05_wp, 0.00_wp,  4.0_wp, 0.97_wp, & ! 15
511        225.0_wp, 1.50_wp, 0.50_wp, 0.00_wp,   0.25_wp,  0.25E-2_wp,    10.0_wp,   10.0_wp, 0.05_wp, 0.00_wp,  4.0_wp, 0.97_wp, & ! 16
512        250.0_wp, 5.00_wp, 1.00_wp, 0.03_wp,   2.00_wp,     2.00_wp,    20.0_wp,   15.0_wp, 0.03_wp, 0.00_wp,  7.0_wp, 0.97_wp, & ! 17
513        175.0_wp, 2.50_wp, 1.00_wp, 0.03_wp,   1.10_wp,     1.10_wp,    20.0_wp,   15.0_wp, 0.03_wp, 0.00_wp,  8.0_wp, 0.97_wp  & ! 18
514                                                               /), (/ 12, 18 /) )
515
516                                   
517!
518!-- Root distribution for default soil layer configuration (sum = 1)
519!--                                level 1 - level 4 according to zs_ref
520    REAL(wp), DIMENSION(0:3,1:18), PARAMETER :: root_distribution = RESHAPE( (/ &
521                                 1.00_wp, 0.00_wp, 0.00_wp, 0.00_wp,            & !  1
522                                 0.24_wp, 0.41_wp, 0.31_wp, 0.04_wp,            & !  2
523                                 0.35_wp, 0.38_wp, 0.23_wp, 0.04_wp,            & !  3
524                                 0.26_wp, 0.39_wp, 0.29_wp, 0.06_wp,            & !  4
525                                 0.26_wp, 0.38_wp, 0.29_wp, 0.07_wp,            & !  5
526                                 0.24_wp, 0.38_wp, 0.31_wp, 0.07_wp,            & !  6
527                                 0.25_wp, 0.34_wp, 0.27_wp, 0.14_wp,            & !  7
528                                 0.27_wp, 0.27_wp, 0.27_wp, 0.09_wp,            & !  8
529                                 1.00_wp, 0.00_wp, 0.00_wp, 0.00_wp,            & !  9
530                                 0.47_wp, 0.45_wp, 0.08_wp, 0.00_wp,            & ! 10
531                                 0.24_wp, 0.41_wp, 0.31_wp, 0.04_wp,            & ! 11
532                                 0.17_wp, 0.31_wp, 0.33_wp, 0.19_wp,            & ! 12
533                                 0.00_wp, 0.00_wp, 0.00_wp, 0.00_wp,            & ! 13
534                                 0.25_wp, 0.34_wp, 0.27_wp, 0.11_wp,            & ! 14
535                                 0.23_wp, 0.36_wp, 0.30_wp, 0.11_wp,            & ! 15
536                                 0.23_wp, 0.36_wp, 0.30_wp, 0.11_wp,            & ! 16
537                                 0.19_wp, 0.35_wp, 0.36_wp, 0.10_wp,            & ! 17
538                                 0.19_wp, 0.35_wp, 0.36_wp, 0.10_wp             & ! 18
539                                 /), (/ 4, 18 /) )
540
541!
542!-- Soil parameters according to the following porosity classes (soil_type)
543
544!
545!-- Soil parameters  alpha_vg,      l_vg,    n_vg, gamma_w_sat,    m_sat,     m_fc,   m_wilt,    m_res
546    REAL(wp), DIMENSION(0:7,1:6), PARAMETER :: soil_pars = RESHAPE( (/     &
547                      3.83_wp,  1.250_wp, 1.38_wp,  6.94E-6_wp, 0.403_wp, 0.244_wp, 0.059_wp, 0.025_wp,& ! 1
548                      3.14_wp, -2.342_wp, 1.28_wp,  1.16E-6_wp, 0.439_wp, 0.347_wp, 0.151_wp, 0.010_wp,& ! 2
549                      0.83_wp, -0.588_wp, 1.25_wp,  0.26E-6_wp, 0.430_wp, 0.383_wp, 0.133_wp, 0.010_wp,& ! 3
550                      3.67_wp, -1.977_wp, 1.10_wp,  2.87E-6_wp, 0.520_wp, 0.448_wp, 0.279_wp, 0.010_wp,& ! 4
551                      2.65_wp,  2.500_wp, 1.10_wp,  1.74E-6_wp, 0.614_wp, 0.541_wp, 0.335_wp, 0.010_wp,& ! 5
552                      1.30_wp,  0.400_wp, 1.20_wp,  0.93E-6_wp, 0.766_wp, 0.663_wp, 0.267_wp, 0.010_wp & ! 6
553                                                                     /), (/ 8, 6 /) )
554
555
556!
557!-- TO BE FILLED
558!-- Pavement parameters      z0,       z0h, albedo_type, emissivity 
559    REAL(wp), DIMENSION(0:3,1:15), PARAMETER :: pavement_pars = RESHAPE( (/ &
560                      5.0E-2_wp, 5.0E-4_wp,     18.0_wp,    0.97_wp,  & !  1
561                      5.0E-2_wp, 5.0E-4_wp,     19.0_wp,    0.94_wp,  & !  2
562                      1.0E-2_wp, 1.0E-4_wp,     20.0_wp,    0.98_wp,  & !  3                                 
563                      1.0E-2_wp, 1.0E-4_wp,     21.0_wp,    0.93_wp,  & !  4
564                      1.0E-2_wp, 1.0E-4_wp,     22.0_wp,    0.97_wp,  & !  5
565                      1.0E-2_wp, 1.0E-4_wp,     23.0_wp,    0.97_wp,  & !  6
566                      1.0E-2_wp, 1.0E-4_wp,     24.0_wp,    0.97_wp,  & !  7
567                      1.0E-2_wp, 1.0E-4_wp,     25.0_wp,    0.94_wp,  & !  8
568                      1.0E-2_wp, 1.0E-4_wp,     26.0_wp,    0.98_wp,  & !  9                                 
569                      1.0E-2_wp, 1.0E-4_wp,     27.0_wp,    0.93_wp,  & ! 10
570                      1.0E-2_wp, 1.0E-4_wp,     28.0_wp,    0.97_wp,  & ! 11
571                      1.0E-2_wp, 1.0E-4_wp,     29.0_wp,    0.97_wp,  & ! 12
572                      1.0E-2_wp, 1.0E-4_wp,     30.0_wp,    0.97_wp,  & ! 13
573                      1.0E-2_wp, 1.0E-4_wp,     31.0_wp,    0.94_wp,  & ! 14
574                      1.0E-2_wp, 1.0E-4_wp,     32.0_wp,    0.98_wp   & ! 15
575                      /), (/ 4, 15 /) )                             
576!
577!-- Pavement subsurface parameters part 1: thermal conductivity (W/m/K)
578!--   0.0-0.01, 0.01-0.03, 0.03-0.07, 0.07-0.15, 0.15-0.30, 0.30-0.50,    0.50-1.25,    1.25-3.00
579    REAL(wp), DIMENSION(0:7,1:15), PARAMETER :: pavement_subsurface_pars_1 = RESHAPE( (/ &
580       0.75_wp,   0.75_wp,   0.75_wp,   0.75_wp,   0.75_wp,   0.75_wp, 9999999.9_wp, 9999999.9_wp, & !  1
581       0.75_wp,   0.75_wp,   0.75_wp,   0.75_wp,   0.75_wp,   0.75_wp, 9999999.9_wp, 9999999.9_wp, & !  2
582       0.89_wp,   0.89_wp,   0.89_wp,   0.89_wp,   0.89_wp,   0.89_wp, 9999999.9_wp, 9999999.9_wp, & !  3
583       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & !  4
584       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & !  5
585       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & !  6
586       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & !  7
587       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & !  8
588       0.70_wp,   0.70_wp,   0.70_wp,   0.70_wp,   0.70_wp,   0.70_wp, 9999999.9_wp, 9999999.9_wp, & !  9
589       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & ! 10
590       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & ! 11
591       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & ! 12
592       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & ! 13
593       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp, & ! 14
594       1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp,   1.00_wp, 9999999.9_wp, 9999999.9_wp  & ! 15
595       /), (/ 8, 15 /) )
596
597!
598!-- Pavement subsurface parameters part 2: volumetric heat capacity (J/m3/K)
599!--     0.0-0.01, 0.01-0.03, 0.03-0.07, 0.07-0.15, 0.15-0.30, 0.30-0.50,    0.50-1.25,    1.25-3.00
600    REAL(wp), DIMENSION(0:7,1:15), PARAMETER :: pavement_subsurface_pars_2 = RESHAPE( (/ &
601       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & !  1
602       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & !  2
603       1.76E6_wp, 1.76E6_wp, 1.76E6_wp, 1.76E6_wp, 1.76E6_wp, 1.76E6_wp, 9999999.9_wp, 9999999.9_wp, & !  3
604       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & !  4
605       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & !  5
606       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & !  6
607       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & !  7
608       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & !  8
609       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & !  9
610       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & ! 10
611       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & ! 11
612       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & ! 12
613       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & ! 13
614       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp, & ! 14
615       1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 1.94E6_wp, 9999999.9_wp, 9999999.9_wp  & ! 15
616                           /), (/ 8, 15 /) )
617 
618!
619!-- TO BE FILLED
620!-- Water parameters                    temperature,     z0,      z0h, albedo_type, emissivity,
621    REAL(wp), DIMENSION(0:6,1:5), PARAMETER :: water_pars = RESHAPE( (/ &
622       283.0_wp, 0.01_wp, 0.001_wp, 1.0E10_wp, 1.0E10_wp, 1.0_wp, 0.99_wp, & ! 1
623       283.0_wp, 0.01_wp, 0.001_wp, 1.0E10_wp, 1.0E10_wp, 1.0_wp, 0.99_wp, & ! 2
624       283.0_wp, 0.01_wp, 0.001_wp, 1.0E10_wp, 1.0E10_wp, 1.0_wp, 0.99_wp, & ! 3
625       283.0_wp, 0.01_wp, 0.001_wp, 1.0E10_wp, 1.0E10_wp, 1.0_wp, 0.99_wp, & ! 4
626       283.0_wp, 0.01_wp, 0.001_wp, 1.0E10_wp, 1.0E10_wp, 1.0_wp, 0.99_wp  & ! 5
627                                                                     /), (/ 7, 5 /) )                                                                   
628                                                                                                                                     
629    SAVE
630
631
632    PRIVATE
633
634   
635!
636!-- Public functions
637    PUBLIC lsm_boundary_condition, lsm_check_data_output,                      &
638           lsm_check_data_output_pr,                                           &
639           lsm_check_parameters, lsm_define_netcdf_grid, lsm_3d_data_averaging,& 
640           lsm_data_output_2d, lsm_data_output_3d, lsm_energy_balance,         &
641           lsm_header, lsm_init, lsm_init_arrays, lsm_parin, lsm_soil_model,   &
642           lsm_swap_timelevel, lsm_rrd_local, lsm_wrd_local
643! !vegetat
644!-- Public parameters, constants and initial values
645    PUBLIC aero_resist_kray, skip_time_do_lsm
646
647!
648!-- Public grid variables
649    PUBLIC nzb_soil, nzs, nzt_soil, zs
650
651!
652!-- Public prognostic variables
653    PUBLIC m_soil_h, t_soil_h
654
655    INTERFACE lsm_boundary_condition
656       MODULE PROCEDURE lsm_boundary_condition
657    END INTERFACE lsm_boundary_condition
658
659    INTERFACE lsm_check_data_output
660       MODULE PROCEDURE lsm_check_data_output
661    END INTERFACE lsm_check_data_output
662   
663    INTERFACE lsm_check_data_output_pr
664       MODULE PROCEDURE lsm_check_data_output_pr
665    END INTERFACE lsm_check_data_output_pr
666   
667    INTERFACE lsm_check_parameters
668       MODULE PROCEDURE lsm_check_parameters
669    END INTERFACE lsm_check_parameters
670   
671    INTERFACE lsm_3d_data_averaging
672       MODULE PROCEDURE lsm_3d_data_averaging
673    END INTERFACE lsm_3d_data_averaging
674
675    INTERFACE lsm_data_output_2d
676       MODULE PROCEDURE lsm_data_output_2d
677    END INTERFACE lsm_data_output_2d
678
679    INTERFACE lsm_data_output_3d
680       MODULE PROCEDURE lsm_data_output_3d
681    END INTERFACE lsm_data_output_3d
682
683    INTERFACE lsm_define_netcdf_grid
684       MODULE PROCEDURE lsm_define_netcdf_grid
685    END INTERFACE lsm_define_netcdf_grid
686
687    INTERFACE lsm_energy_balance
688       MODULE PROCEDURE lsm_energy_balance
689    END INTERFACE lsm_energy_balance
690
691    INTERFACE lsm_header
692       MODULE PROCEDURE lsm_header
693    END INTERFACE lsm_header
694   
695    INTERFACE lsm_init
696       MODULE PROCEDURE lsm_init
697    END INTERFACE lsm_init
698
699    INTERFACE lsm_init_arrays
700       MODULE PROCEDURE lsm_init_arrays
701    END INTERFACE lsm_init_arrays
702   
703    INTERFACE lsm_parin
704       MODULE PROCEDURE lsm_parin
705    END INTERFACE lsm_parin
706   
707    INTERFACE lsm_soil_model
708       MODULE PROCEDURE lsm_soil_model
709    END INTERFACE lsm_soil_model
710
711    INTERFACE lsm_swap_timelevel
712       MODULE PROCEDURE lsm_swap_timelevel
713    END INTERFACE lsm_swap_timelevel
714
715    INTERFACE lsm_rrd_local
716       MODULE PROCEDURE lsm_rrd_local
717    END INTERFACE lsm_rrd_local
718
719    INTERFACE lsm_wrd_local
720       MODULE PROCEDURE lsm_wrd_local
721    END INTERFACE lsm_wrd_local
722
723 CONTAINS
724
725
726!------------------------------------------------------------------------------!
727! Description:
728! ------------
729!> Set internal Neumann boundary condition at outer soil grid points
730!> for temperature and humidity.
731!------------------------------------------------------------------------------!
732 SUBROUTINE lsm_boundary_condition
733 
734    IMPLICIT NONE
735
736    INTEGER(iwp) :: i      !< grid index x-direction
737    INTEGER(iwp) :: ioff   !< offset index x-direction indicating location of soil grid point
738    INTEGER(iwp) :: j      !< grid index y-direction
739    INTEGER(iwp) :: joff   !< offset index x-direction indicating location of soil grid point
740    INTEGER(iwp) :: k      !< grid index z-direction
741    INTEGER(iwp) :: koff   !< offset index x-direction indicating location of soil grid point
742    INTEGER(iwp) :: l      !< running index surface-orientation
743    INTEGER(iwp) :: m      !< running index surface elements
744
745    koff = surf_lsm_h%koff
746    DO  m = 1, surf_lsm_h%ns
747       i = surf_lsm_h%i(m)
748       j = surf_lsm_h%j(m)
749       k = surf_lsm_h%k(m)
750       pt(k+koff,j,i) = pt(k,j,i)
751    ENDDO
752
753    DO  l = 0, 3
754       ioff = surf_lsm_v(l)%ioff
755       joff = surf_lsm_v(l)%joff
756       DO  m = 1, surf_lsm_v(l)%ns
757          i = surf_lsm_v(l)%i(m)
758          j = surf_lsm_v(l)%j(m)
759          k = surf_lsm_v(l)%k(m)
760          pt(k,j+joff,i+ioff) = pt(k,j,i)
761       ENDDO
762    ENDDO
763!
764!-- In case of humidity, set boundary conditions also for q and vpt.
765    IF ( humidity )  THEN
766       koff = surf_lsm_h%koff
767       DO  m = 1, surf_lsm_h%ns
768          i = surf_lsm_h%i(m)
769          j = surf_lsm_h%j(m)
770          k = surf_lsm_h%k(m)
771          q(k+koff,j,i)   = q(k,j,i)
772          vpt(k+koff,j,i) = vpt(k,j,i)
773       ENDDO
774
775       DO  l = 0, 3
776          ioff = surf_lsm_v(l)%ioff
777          joff = surf_lsm_v(l)%joff
778          DO  m = 1, surf_lsm_v(l)%ns
779             i = surf_lsm_v(l)%i(m)
780             j = surf_lsm_v(l)%j(m)
781             k = surf_lsm_v(l)%k(m)
782             q(k,j+joff,i+ioff)   = q(k,j,i)
783             vpt(k,j+joff,i+ioff) = vpt(k,j,i)
784          ENDDO
785       ENDDO
786    ENDIF
787
788 END SUBROUTINE lsm_boundary_condition
789
790!------------------------------------------------------------------------------!
791! Description:
792! ------------
793!> Check data output for land surface model
794!------------------------------------------------------------------------------!
795 SUBROUTINE lsm_check_data_output( var, unit, i, ilen, k )
796 
797 
798    USE control_parameters,                                                    &
799        ONLY:  data_output, message_string
800
801    IMPLICIT NONE
802
803    CHARACTER (LEN=*) ::  unit  !<
804    CHARACTER (LEN=*) ::  var   !<
805
806    INTEGER(iwp) :: i
807    INTEGER(iwp) :: ilen   
808    INTEGER(iwp) :: k
809
810    SELECT CASE ( TRIM( var ) )
811
812       CASE ( 'm_soil' )
813          IF (  .NOT.  land_surface )  THEN
814             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
815                      'res land_surface = .TRUE.'
816             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
817          ENDIF
818          unit = 'm3/m3'
819           
820       CASE ( 't_soil' )
821          IF (  .NOT.  land_surface )  THEN
822             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
823                      'res land_surface = .TRUE.'
824             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
825          ENDIF
826          unit = 'K'   
827             
828       CASE ( 'lai*', 'c_liq*', 'c_soil*', 'c_veg*', 'm_liq*',                 &
829              'qsws_liq*', 'qsws_soil*', 'qsws_veg*', 'r_s*' )
830          IF ( k == 0  .OR.  data_output(i)(ilen-2:ilen) /= '_xy' )  THEN
831             message_string = 'illegal value for data_output: "' //            &
832                              TRIM( var ) // '" & only 2d-horizontal ' //      &
833                              'cross sections are allowed for this value'
834             CALL message( 'lsm_check_data_output', 'PA0111', 1, 2, 0, 6, 0 )
835          ENDIF
836          IF ( TRIM( var ) == 'lai*'  .AND.  .NOT.  land_surface )  THEN
837             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
838                              'res land_surface = .TRUE.'
839             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
840          ENDIF
841          IF ( TRIM( var ) == 'c_liq*'  .AND.  .NOT.  land_surface )  THEN
842             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
843                              'res land_surface = .TRUE.'
844             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
845          ENDIF
846          IF ( TRIM( var ) == 'c_soil*'  .AND.  .NOT.  land_surface )  THEN
847             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
848                              'res land_surface = .TRUE.'
849             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
850          ENDIF
851          IF ( TRIM( var ) == 'c_veg*'  .AND.  .NOT. land_surface )  THEN
852             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
853                              'res land_surface = .TRUE.'
854             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
855          ENDIF
856          IF ( TRIM( var ) == 'm_liq*'  .AND.  .NOT.  land_surface )  THEN
857             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
858                              'res land_surface = .TRUE.'
859             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
860          ENDIF
861          IF ( TRIM( var ) == 'qsws_liq*'  .AND.  .NOT. land_surface )         &
862          THEN
863             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
864                              'res land_surface = .TRUE.'
865             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
866          ENDIF
867          IF ( TRIM( var ) == 'qsws_soil*'  .AND.  .NOT.  land_surface )       &
868          THEN
869             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
870                              'res land_surface = .TRUE.'
871             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
872          ENDIF
873          IF ( TRIM( var ) == 'qsws_veg*'  .AND.  .NOT. land_surface )         &
874          THEN
875             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
876                              'res land_surface = .TRUE.'
877             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
878          ENDIF
879          IF ( TRIM( var ) == 'r_s*'  .AND.  .NOT.  land_surface )             &
880          THEN
881             message_string = 'output of "' // TRIM( var ) // '" requi' //     &
882                              'res land_surface = .TRUE.'
883             CALL message( 'lsm_check_data_output', 'PA0404', 1, 2, 0, 6, 0 )
884          ENDIF
885
886          IF ( TRIM( var ) == 'lai*'   )      unit = 'none' 
887          IF ( TRIM( var ) == 'c_liq*' )      unit = 'none'
888          IF ( TRIM( var ) == 'c_soil*')      unit = 'none'
889          IF ( TRIM( var ) == 'c_veg*' )      unit = 'none'
890          IF ( TRIM( var ) == 'm_liq*'     )  unit = 'm'
891          IF ( TRIM( var ) == 'qsws_liq*'  )  unit = 'W/m2'
892          IF ( TRIM( var ) == 'qsws_soil*' )  unit = 'W/m2'
893          IF ( TRIM( var ) == 'qsws_veg*'  )  unit = 'W/m2'
894          IF ( TRIM( var ) == 'r_s*')         unit = 's/m' 
895             
896       CASE DEFAULT
897          unit = 'illegal'
898
899    END SELECT
900
901
902 END SUBROUTINE lsm_check_data_output
903
904
905
906!------------------------------------------------------------------------------!
907! Description:
908! ------------
909!> Check data output of profiles for land surface model
910!------------------------------------------------------------------------------!
911 SUBROUTINE lsm_check_data_output_pr( variable, var_count, unit, dopr_unit )
912 
913    USE control_parameters,                                                    &
914        ONLY:  data_output_pr, message_string
915
916    USE indices
917
918    USE profil_parameter
919
920    USE statistics
921
922    IMPLICIT NONE
923   
924    CHARACTER (LEN=*) ::  unit      !<
925    CHARACTER (LEN=*) ::  variable  !<
926    CHARACTER (LEN=*) ::  dopr_unit !< local value of dopr_unit
927 
928    INTEGER(iwp) ::  var_count     !<
929
930    SELECT CASE ( TRIM( variable ) )
931       
932       CASE ( 't_soil', '#t_soil' )
933          IF (  .NOT.  land_surface )  THEN
934             message_string = 'data_output_pr = ' //                           &
935                              TRIM( data_output_pr(var_count) ) // ' is' //    &
936                              'not implemented for land_surface = .FALSE.'
937             CALL message( 'lsm_check_data_output_pr', 'PA0402', 1, 2, 0, 6, 0 )
938          ELSE
939             dopr_index(var_count) = 89
940             dopr_unit     = 'K'
941             hom(0:nzs-1,2,89,:)  = SPREAD( - zs(nzb_soil:nzt_soil), 2, statistic_regions+1 )
942             IF ( data_output_pr(var_count)(1:1) == '#' )  THEN
943                dopr_initial_index(var_count) = 90
944                hom(0:nzs-1,2,90,:)   = SPREAD( - zs(nzb_soil:nzt_soil), 2, statistic_regions+1 )
945                data_output_pr(var_count)     = data_output_pr(var_count)(2:)
946             ENDIF
947             unit = dopr_unit
948          ENDIF
949
950       CASE ( 'm_soil', '#m_soil' )
951          IF (  .NOT.  land_surface )  THEN
952             message_string = 'data_output_pr = ' //                           &
953                              TRIM( data_output_pr(var_count) ) // ' is' //    &
954                              ' not implemented for land_surface = .FALSE.'
955             CALL message( 'lsm_check_data_output_pr', 'PA0402', 1, 2, 0, 6, 0 )
956          ELSE
957             dopr_index(var_count) = 91
958             dopr_unit     = 'm3/m3'
959             hom(0:nzs-1,2,91,:)  = SPREAD( - zs(nzb_soil:nzt_soil), 2, statistic_regions+1 )
960             IF ( data_output_pr(var_count)(1:1) == '#' )  THEN
961                dopr_initial_index(var_count) = 92
962                hom(0:nzs-1,2,92,:)   = SPREAD( - zs(nzb_soil:nzt_soil), 2, statistic_regions+1 )
963                data_output_pr(var_count)     = data_output_pr(var_count)(2:)
964             ENDIF
965             unit = dopr_unit
966          ENDIF
967
968
969       CASE DEFAULT
970          unit = 'illegal'
971
972    END SELECT
973
974
975 END SUBROUTINE lsm_check_data_output_pr
976 
977 
978!------------------------------------------------------------------------------!
979! Description:
980! ------------
981!> Check parameters routine for land surface model
982!------------------------------------------------------------------------------!
983 SUBROUTINE lsm_check_parameters
984
985    USE control_parameters,                                                    &
986        ONLY:  bc_pt_b, bc_q_b, constant_flux_layer, message_string
987                     
988   
989    IMPLICIT NONE
990
991    INTEGER(iwp) ::  i        !< running index, x-dimension
992    INTEGER(iwp) ::  j        !< running index, y-dimension
993    INTEGER(iwp) ::  k        !< running index, z-dimension
994
995!
996!-- Check for a valid setting of surface_type. The default value is 'netcdf'.
997!-- In that case, the surface types are read from NetCDF file
998    IF ( TRIM( surface_type ) /= 'vegetation'  .AND.                           &
999         TRIM( surface_type ) /= 'pavement'    .AND.                           &
1000         TRIM( surface_type ) /= 'water'       .AND.                           &
1001         TRIM( surface_type ) /= 'netcdf' )  THEN 
1002       message_string = 'unknown surface type: surface_type = "' //            &
1003                        TRIM( surface_type ) // '"'
1004       CALL message( 'lsm_check_parameters', 'PA0019', 1, 2, 0, 6, 0 )
1005    ENDIF
1006
1007!
1008!-- Dirichlet boundary conditions are required as the surface fluxes are
1009!-- calculated from the temperature/humidity gradients in the land surface
1010!-- model
1011    IF ( bc_pt_b == 'neumann'  .OR.  bc_q_b == 'neumann' )  THEN
1012       message_string = 'lsm requires setting of'//                            &
1013                        'bc_pt_b = "dirichlet" and '//                         &
1014                        'bc_q_b  = "dirichlet"'
1015       CALL message( 'lsm_check_parameters', 'PA0399', 1, 2, 0, 6, 0 )
1016    ENDIF
1017
1018    IF (  .NOT.  constant_flux_layer )  THEN
1019       message_string = 'lsm requires '//                                      &
1020                        'constant_flux_layer = .T.'
1021       CALL message( 'lsm_check_parameters', 'PA0400', 1, 2, 0, 6, 0 )
1022    ENDIF
1023   
1024    IF (  .NOT.  radiation )  THEN
1025       message_string = 'lsm requires '//                                      &
1026                        'the radiation model to be switched on'
1027       CALL message( 'lsm_check_parameters', 'PA0400', 1, 2, 0, 6, 0 )
1028    ENDIF
1029!
1030!-- Check if soil types are set within a valid range.
1031    IF ( TRIM( surface_type ) == 'vegetation'  .OR.                            &
1032         TRIM( surface_type ) == 'pavement' )  THEN
1033       IF ( soil_type < LBOUND( soil_pars, 2 )  .AND.                          &
1034            soil_type > UBOUND( soil_pars, 2 ) )  THEN
1035          WRITE( message_string, * ) 'soil_type = ', soil_type, ' is out ' //  &
1036                                     'of the valid range'
1037          CALL message( 'lsm_check_parameters', 'PA0452', 2, 2, 0, 6, 0 )
1038       ENDIF
1039    ENDIF
1040    IF ( TRIM( surface_type ) == 'netcdf' )  THEN
1041       IF ( soil_type_f%from_file )  THEN
1042          DO  i = nxl, nxr
1043             DO  j = nys, nyn
1044                IF ( soil_type_f%var_2d(j,i) /= soil_type_f%fill  .AND.        &
1045                     ( soil_type_f%var_2d(j,i) < LBOUND( soil_pars, 2 )  .OR.  &
1046                       soil_type_f%var_2d(j,i) > UBOUND( soil_pars, 2 ) ) )  THEN
1047                   WRITE( message_string, * ) 'soil_type = is out  of ' //     &
1048                                        'the valid range at (j,i) = ', j, i
1049                   CALL message( 'lsm_check_parameters', 'PA0452',             &
1050                                  2, 2, myid, 6, 0 )
1051                ENDIF
1052             ENDDO
1053          ENDDO
1054       ENDIF
1055    ENDIF
1056!
1057!-- Check if vegetation types are set within a valid range.   
1058    IF ( TRIM( surface_type ) == 'vegetation' )  THEN
1059       IF ( vegetation_type < LBOUND( vegetation_pars, 2 )  .AND.              &
1060            vegetation_type > UBOUND( vegetation_pars, 2 ) )  THEN
1061          WRITE( message_string, * ) 'vegetation_type = ', vegetation_type,    &
1062                                     ' is out of the valid range'
1063          CALL message( 'lsm_check_parameters', 'PA0526', 2, 2, 0, 6, 0 )
1064       ENDIF
1065    ENDIF
1066    IF ( TRIM( surface_type ) == 'netcdf' )  THEN
1067       IF ( vegetation_type_f%from_file )  THEN
1068          DO  i = nxl, nxr
1069             DO  j = nys, nyn
1070                IF ( vegetation_type_f%var(j,i) /= vegetation_type_f%fill  .AND.&
1071              ( vegetation_type_f%var(j,i) < LBOUND( vegetation_pars, 2 )  .OR.&
1072                vegetation_type_f%var(j,i) > UBOUND( vegetation_pars, 2 ) ) )  &
1073                THEN
1074                   WRITE( message_string, * ) 'vegetation_type = is out of ' //&
1075                                        'the valid range at (j,i) = ', j, i
1076                   CALL message( 'lsm_check_parameters', 'PA0526',             &
1077                                  2, 2, myid, 6, 0 ) 
1078                ENDIF
1079             ENDDO
1080          ENDDO
1081       ENDIF
1082    ENDIF
1083!
1084!-- Check if pavement types are set within a valid range.   
1085    IF ( TRIM( surface_type ) == 'pavement' )  THEN
1086       IF ( pavement_type < LBOUND( pavement_pars, 2 )  .AND.                  &
1087            pavement_type > UBOUND( pavement_pars, 2 ) )  THEN
1088          WRITE( message_string, * ) 'pavement_type = ', pavement_type,        &
1089                                     ' is out of the valid range'
1090          CALL message( 'lsm_check_parameters', 'PA0527', 2, 2, 0, 6, 0 )
1091       ENDIF
1092    ENDIF
1093    IF ( TRIM( surface_type ) == 'netcdf' )  THEN
1094       IF ( pavement_type_f%from_file )  THEN
1095          DO  i = nxl, nxr
1096             DO  j = nys, nyn
1097                IF ( pavement_type_f%var(j,i) /= pavement_type_f%fill  .AND.   &
1098              ( pavement_type_f%var(j,i) < LBOUND( pavement_pars, 2 )  .OR.    &
1099                pavement_type_f%var(j,i) > UBOUND( pavement_pars, 2 ) ) )  THEN
1100                   WRITE( message_string, * ) 'pavement_type = is out of ' //  &
1101                                        'the valid range at (j,i) = ', j, i
1102                   CALL message( 'lsm_check_parameters', 'PA0527',             &
1103                                  2, 2, myid, 6, 0 ) 
1104                ENDIF
1105             ENDDO
1106          ENDDO
1107       ENDIF
1108    ENDIF
1109!
1110!-- Check if water types are set within a valid range.   
1111    IF ( TRIM( surface_type ) == 'water' )  THEN
1112       IF ( water_type < LBOUND( water_pars, 2 )  .AND.                        &
1113            water_type > UBOUND( water_pars, 2 ) )  THEN
1114          WRITE( message_string, * ) 'water_type = ', water_type,              &
1115                                     ' is out of the valid range'
1116          CALL message( 'lsm_check_parameters', 'PA0528', 2, 2, 0, 6, 0 )
1117       ENDIF
1118    ENDIF
1119    IF ( TRIM( surface_type ) == 'netcdf' )  THEN
1120       IF ( water_type_f%from_file )  THEN
1121          DO  i = nxl, nxr
1122             DO  j = nys, nyn
1123                IF ( water_type_f%var(j,i) /= water_type_f%fill  .AND.         &
1124              ( water_type_f%var(j,i) < LBOUND( water_pars, 2 )  .OR.          &
1125                water_type_f%var(j,i) > UBOUND( water_pars, 2 ) ) )  THEN
1126                   WRITE( message_string, * ) 'water_type = is out  of ' //    &
1127                                        'the valid range at (j,i) = ', j, i
1128                   CALL message( 'lsm_check_parameters', 'PA0528',             &
1129                                 2, 2, myid, 6, 0 ) 
1130                ENDIF
1131             ENDDO
1132          ENDDO
1133       ENDIF
1134    ENDIF
1135!
1136!-- Check further settings for consistency.
1137    IF ( TRIM( surface_type ) == 'vegetation' )  THEN
1138   
1139       IF ( vegetation_type == 0 )  THEN
1140          IF ( min_canopy_resistance == 9999999.9_wp )  THEN
1141             message_string = 'vegetation_type = 0 (user defined)'//           &
1142                              'requires setting of min_canopy_resistance'//    &
1143                              '/= 9999999.9'
1144             CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1145          ENDIF
1146
1147          IF ( leaf_area_index == 9999999.9_wp )  THEN
1148             message_string = 'vegetation_type = 0 (user_defined)'//           &
1149                              'requires setting of leaf_area_index'//          &
1150                              '/= 9999999.9'
1151             CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1152          ENDIF
1153
1154          IF ( vegetation_coverage == 9999999.9_wp )  THEN
1155             message_string = 'vegetation_type = 0 (user_defined)'//           &
1156                              'requires setting of vegetation_coverage'//      &
1157                              '/= 9999999.9'
1158             CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1159          ENDIF
1160
1161          IF ( canopy_resistance_coefficient == 9999999.9_wp)  THEN
1162             message_string = 'vegetation_type = 0 (user_defined)'//           &
1163                              'requires setting of'//                          &
1164                              'canopy_resistance_coefficient /= 9999999.9'
1165             CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1166          ENDIF
1167
1168          IF ( lambda_surface_stable == 9999999.9_wp )  THEN
1169             message_string = 'vegetation_type = 0 (user_defined)'//           &
1170                              'requires setting of lambda_surface_stable'//    &
1171                              '/= 9999999.9'
1172             CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1173          ENDIF
1174
1175          IF ( lambda_surface_unstable == 9999999.9_wp )  THEN
1176             message_string = 'vegetation_type = 0 (user_defined)'//           &
1177                              'requires setting of lambda_surface_unstable'//  &
1178                              '/= 9999999.9'
1179             CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1180          ENDIF
1181
1182          IF ( f_shortwave_incoming == 9999999.9_wp )  THEN
1183             message_string = 'vegetation_type = 0 (user_defined)'//           &
1184                              'requires setting of f_shortwave_incoming'//     &
1185                              '/= 9999999.9'
1186             CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1187          ENDIF
1188
1189          IF ( z0_vegetation == 9999999.9_wp )  THEN
1190             message_string = 'vegetation_type = 0 (user_defined)'//           &
1191                              'requires setting of z0_vegetation'//            &
1192                              '/= 9999999.9'
1193             CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1194          ENDIF
1195
1196          IF ( z0h_vegetation == 9999999.9_wp )  THEN
1197             message_string = 'vegetation_type = 0 (user_defined)'//           &
1198                              'requires setting of z0h_vegetation'//           &
1199                              '/= 9999999.9'
1200             CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1201          ENDIF
1202       ENDIF
1203
1204       IF ( vegetation_type == 1 )  THEN
1205          IF ( vegetation_coverage /= 9999999.9_wp  .AND.  vegetation_coverage &
1206               /= 0.0_wp )  THEN
1207             message_string = 'vegetation_type = 1 (bare soil)'//              &
1208                              ' requires vegetation_coverage = 0'
1209             CALL message( 'lsm_check_parameters', 'PA0294', 1, 2, 0, 6, 0 )
1210          ENDIF
1211       ENDIF
1212 
1213    ENDIF
1214   
1215    IF ( TRIM( surface_type ) == 'water' )  THEN
1216
1217       IF ( water_type == 0 )  THEN 
1218       
1219          IF ( z0_water == 9999999.9_wp )  THEN
1220             message_string = 'water_type = 0 (user_defined)'//                &
1221                              'requires setting of z0_water'//                 &
1222                              '/= 9999999.9'
1223             CALL message( 'lsm_check_parameters', 'PA0415', 1, 2, 0, 6, 0 )
1224          ENDIF
1225
1226          IF ( z0h_water == 9999999.9_wp )  THEN
1227             message_string = 'water_type = 0 (user_defined)'//                &
1228                              'requires setting of z0h_water'//                &
1229                              '/= 9999999.9'
1230             CALL message( 'lsm_check_parameters', 'PA0392', 1, 2, 0, 6, 0 )
1231          ENDIF
1232         
1233          IF ( water_temperature == 9999999.9_wp )  THEN
1234             message_string = 'water_type = 0 (user_defined)'//                &
1235                              'requires setting of water_temperature'//        &
1236                              '/= 9999999.9'
1237             CALL message( 'lsm_check_parameters', 'PA0379', 1, 2, 0, 6, 0 )
1238          ENDIF       
1239         
1240       ENDIF
1241       
1242    ENDIF
1243   
1244    IF ( TRIM( surface_type ) == 'pavement' )  THEN
1245
1246       IF ( ANY( dz_soil /= 9999999.9_wp )  .AND.  pavement_type /= 0 )  THEN
1247          message_string = 'non-default setting of dz_soil '//                  &
1248                           'does not allow to use pavement_type /= 0)'
1249          CALL message( 'lsm_check_parameters', 'PA0341', 1, 2, 0, 6, 0 )
1250       ENDIF
1251
1252       IF ( pavement_type == 0 )  THEN 
1253       
1254          IF ( z0_pavement == 9999999.9_wp )  THEN
1255             message_string = 'pavement_type = 0 (user_defined)'//             &
1256                              'requires setting of z0_pavement'//              &
1257                              '/= 9999999.9'
1258             CALL message( 'lsm_check_parameters', 'PA0352', 1, 2, 0, 6, 0 )
1259          ENDIF
1260         
1261          IF ( z0h_pavement == 9999999.9_wp )  THEN
1262             message_string = 'pavement_type = 0 (user_defined)'//             &
1263                              'requires setting of z0h_pavement'//             &
1264                              '/= 9999999.9'
1265             CALL message( 'lsm_check_parameters', 'PA0353', 1, 2, 0, 6, 0 )
1266          ENDIF
1267         
1268          IF ( pavement_heat_conduct == 9999999.9_wp )  THEN
1269             message_string = 'pavement_type = 0 (user_defined)'//             &
1270                              'requires setting of pavement_heat_conduct'//    &
1271                              '/= 9999999.9'
1272             CALL message( 'lsm_check_parameters', 'PA0342', 1, 2, 0, 6, 0 )
1273          ENDIF
1274         
1275           IF ( pavement_heat_capacity == 9999999.9_wp )  THEN
1276             message_string = 'pavement_type = 0 (user_defined)'//             &
1277                              'requires setting of pavement_heat_capacity'//   &
1278                              '/= 9999999.9'
1279             CALL message( 'lsm_check_parameters', 'PA0139', 1, 2, 0, 6, 0 )
1280          ENDIF
1281
1282          IF ( pavement_depth_level == 0 )  THEN
1283             message_string = 'pavement_type = 0 (user_defined)'//             &
1284                              'requires setting of pavement_depth_level'//     &
1285                              '/= 0'
1286             CALL message( 'lsm_check_parameters', 'PA0474', 1, 2, 0, 6, 0 )
1287          ENDIF
1288
1289       ENDIF
1290   
1291    ENDIF
1292
1293    IF ( TRIM( surface_type ) == 'netcdf' )  THEN
1294!
1295!--    MS: Some problme here, after calling message everythings stucks at
1296!--        MPI_FINALIZE call.
1297       IF ( ANY( pavement_type_f%var /= pavement_type_f%fill )  .AND.           &
1298            ANY( dz_soil /= 9999999.9_wp ) )  THEN
1299          message_string = 'pavement-surfaces are not allowed in ' //           &
1300                           'combination with a non-default setting of dz_soil'
1301          CALL message( 'lsm_check_parameters', 'PA0316', 2, 2, 0, 6, 0 )
1302       ENDIF
1303    ENDIF
1304   
1305!
1306!-- Temporary message as long as NetCDF input is not available
1307    IF ( TRIM( surface_type ) == 'netcdf'  .AND.  .NOT. input_pids_static )   &
1308    THEN
1309       message_string = 'surface_type = netcdf requires static input file.'
1310       CALL message( 'lsm_check_parameters', 'PA0465', 1, 2, 0, 6, 0 )
1311    ENDIF
1312
1313    IF ( soil_type == 0  .AND.  .NOT. input_pids_static )  THEN
1314
1315       IF ( alpha_vangenuchten == 9999999.9_wp )  THEN
1316          message_string = 'soil_type = 0 (user_defined)'//                    &
1317                           'requires setting of alpha_vangenuchten'//          &
1318                           '/= 9999999.9'
1319          CALL message( 'lsm_check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1320       ENDIF
1321
1322       IF ( l_vangenuchten == 9999999.9_wp )  THEN
1323          message_string = 'soil_type = 0 (user_defined)'//                    &
1324                           'requires setting of l_vangenuchten'//              &
1325                           '/= 9999999.9'
1326          CALL message( 'lsm_check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1327       ENDIF
1328
1329       IF ( n_vangenuchten == 9999999.9_wp )  THEN
1330          message_string = 'soil_type = 0 (user_defined)'//                    &
1331                           'requires setting of n_vangenuchten'//              &
1332                           '/= 9999999.9'
1333          CALL message( 'lsm_check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1334       ENDIF
1335
1336       IF ( hydraulic_conductivity == 9999999.9_wp )  THEN
1337          message_string = 'soil_type = 0 (user_defined)'//                    &
1338                           'requires setting of hydraulic_conductivity'//      &
1339                           '/= 9999999.9'
1340          CALL message( 'lsm_check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1341       ENDIF
1342
1343       IF ( saturation_moisture == 9999999.9_wp )  THEN
1344          message_string = 'soil_type = 0 (user_defined)'//                    &
1345                           'requires setting of saturation_moisture'//         &
1346                           '/= 9999999.9'
1347          CALL message( 'lsm_check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1348       ENDIF
1349
1350       IF ( field_capacity == 9999999.9_wp )  THEN
1351          message_string = 'soil_type = 0 (user_defined)'//                    &
1352                           'requires setting of field_capacity'//              &
1353                           '/= 9999999.9'
1354          CALL message( 'lsm_check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1355       ENDIF
1356
1357       IF ( wilting_point == 9999999.9_wp )  THEN
1358          message_string = 'soil_type = 0 (user_defined)'//                    &
1359                           'requires setting of wilting_point'//               &
1360                           '/= 9999999.9'
1361          CALL message( 'lsm_check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1362       ENDIF
1363
1364       IF ( residual_moisture == 9999999.9_wp )  THEN
1365          message_string = 'soil_type = 0 (user_defined)'//                    &
1366                           'requires setting of residual_moisture'//           &
1367                           '/= 9999999.9'
1368          CALL message( 'lsm_check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1369       ENDIF
1370
1371    ENDIF
1372
1373
1374!!! these checks are not needed for water surfaces??
1375
1376!
1377!-- Determine number of soil layers to be used and check whether an appropriate
1378!-- root fraction is prescribed
1379    nzb_soil = 0
1380    nzt_soil = -1
1381    IF ( ALL( dz_soil == 9999999.9_wp ) )  THEN
1382       nzt_soil = 7
1383       dz_soil(nzb_soil:nzt_soil) = dz_soil_default
1384    ELSE
1385       DO k = 0, 19
1386          IF ( dz_soil(k) /= 9999999.9_wp )  THEN
1387             nzt_soil = nzt_soil + 1
1388          ENDIF
1389       ENDDO   
1390    ENDIF
1391    nzs = nzt_soil + 1
1392
1393!
1394!-- Check whether valid soil temperatures are prescribed
1395    IF ( .NOT. input_pids_dynamic )  THEN
1396       IF ( COUNT( soil_temperature /= 9999999.9_wp ) /= nzs )  THEN
1397          WRITE( message_string, * )                                           &
1398                                  'number of soil layers (', nzs, ') does not',&
1399                                  ' match to the number of layers specified',  &
1400                                  ' in soil_temperature (', COUNT(             &
1401                                  soil_temperature /= 9999999.9_wp ), ')'
1402             CALL message( 'lsm_check_parameters', 'PA0471', 1, 2, 0, 6, 0 )
1403       ENDIF
1404
1405       IF ( deep_soil_temperature == 9999999.9_wp ) THEN
1406             message_string = 'deep_soil_temperature is not set but must be'// &
1407                              '/= 9999999.9'
1408             CALL message( 'lsm_check_parameters', 'PA0472', 1, 2, 0, 6, 0 )
1409       ENDIF
1410    ENDIF
1411
1412!
1413!-- Check whether the sum of all root fractions equals one
1414    IF ( vegetation_type == 0 )  THEN
1415       IF ( SUM( root_fraction(nzb_soil:nzt_soil) ) /= 1.0_wp )  THEN
1416          message_string = 'vegetation_type = 0 (user_defined)'//              &
1417                           'requires setting of root_fraction'//               &
1418                           '/= 9999999.9 and SUM(root_fraction) = 1'
1419          CALL message( 'lsm_check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1420       ENDIF
1421    ENDIF     
1422!
1423!-- Calculate grid spacings. Temperature and moisture are defined at
1424!-- the center of the soil layers, whereas gradients/fluxes are
1425!-- defined at the edges (_layer)
1426!
1427!-- Allocate global 1D arrays
1428    ALLOCATE ( ddz_soil_center(nzb_soil:nzt_soil) )
1429    ALLOCATE ( ddz_soil(nzb_soil:nzt_soil+1) )
1430    ALLOCATE ( dz_soil_center(nzb_soil:nzt_soil) )
1431    ALLOCATE ( zs(nzb_soil:nzt_soil+1) )
1432
1433
1434    zs(nzb_soil) = 0.5_wp * dz_soil(nzb_soil)
1435    zs_layer(nzb_soil) = dz_soil(nzb_soil)
1436
1437    DO  k = nzb_soil+1, nzt_soil
1438       zs_layer(k) = zs_layer(k-1) + dz_soil(k)
1439       zs(k) = (zs_layer(k) +  zs_layer(k-1)) * 0.5_wp
1440    ENDDO
1441
1442    dz_soil(nzt_soil+1) = zs_layer(nzt_soil) + dz_soil(nzt_soil)
1443    zs(nzt_soil+1) = zs_layer(nzt_soil) + 0.5_wp * dz_soil(nzt_soil)
1444 
1445    DO  k = nzb_soil, nzt_soil-1
1446       dz_soil_center(k) = zs(k+1) - zs(k)
1447       IF ( dz_soil_center(k) <= 0.0_wp )  THEN
1448          message_string = 'invalid soil layer configuration found ' //        &
1449                           '(dz_soil_center(k) <= 0.0)'
1450          CALL message( 'lsm_rrd_local', 'PA0140', 1, 2, 0, 6, 0 )
1451       ENDIF 
1452    ENDDO
1453 
1454    dz_soil_center(nzt_soil) = zs_layer(k-1) + dz_soil(k) - zs(nzt_soil)
1455       
1456    ddz_soil_center = 1.0_wp / dz_soil_center
1457    ddz_soil(nzb_soil:nzt_soil) = 1.0_wp / dz_soil(nzb_soil:nzt_soil)
1458
1459
1460
1461 END SUBROUTINE lsm_check_parameters
1462 
1463!------------------------------------------------------------------------------!
1464! Description:
1465! ------------
1466!> Solver for the energy balance at the surface.
1467!------------------------------------------------------------------------------!
1468 SUBROUTINE lsm_energy_balance( horizontal, l )
1469
1470    USE pegrid
1471    USE radiation_model_mod,  ONLY:  rad_lw_out
1472
1473    IMPLICIT NONE
1474
1475    INTEGER(iwp) ::  i         !< running index
1476    INTEGER(iwp) ::  i_off     !< offset to determine index of surface element, seen from atmospheric grid point, for x
1477    INTEGER(iwp) ::  j         !< running index
1478    INTEGER(iwp) ::  j_off     !< offset to determine index of surface element, seen from atmospheric grid point, for y
1479    INTEGER(iwp) ::  k         !< running index
1480    INTEGER(iwp) ::  k_off     !< offset to determine index of surface element, seen from atmospheric grid point, for z
1481    INTEGER(iwp) ::  ks        !< running index
1482    INTEGER(iwp) ::  l         !< surface-facing index
1483    INTEGER(iwp) ::  m         !< running index concerning wall elements
1484
1485    LOGICAL      ::  horizontal !< Flag indicating horizontal or vertical surfaces
1486
1487    REAL(wp) :: c_surface_tmp,& !< temporary variable for storing the volumetric heat capacity of the surface
1488                f1,          & !< resistance correction term 1
1489                f2,          & !< resistance correction term 2
1490                f3,          & !< resistance correction term 3
1491                m_min,       & !< minimum soil moisture
1492                e,           & !< water vapour pressure
1493                e_s,         & !< water vapour saturation pressure
1494                e_s_dt,      & !< derivate of e_s with respect to T
1495                tend,        & !< tendency
1496                dq_s_dt,     & !< derivate of q_s with respect to T
1497                coef_1,      & !< coef. for prognostic equation
1498                coef_2,      & !< coef. for prognostic equation
1499                f_qsws,      & !< factor for qsws
1500                f_qsws_veg,  & !< factor for qsws_veg
1501                f_qsws_soil, & !< factor for qsws_soil
1502                f_qsws_liq,  & !< factor for qsws_liq
1503                f_shf,       & !< factor for shf
1504                lambda_soil, & !< Thermal conductivity of the uppermost soil layer (W/m2/K)
1505                lambda_surface, & !< Current value of lambda_surface (W/m2/K)
1506                m_liq_max      !< maxmimum value of the liq. water reservoir
1507
1508    TYPE(surf_type_lsm), POINTER ::  surf_t_surface
1509    TYPE(surf_type_lsm), POINTER ::  surf_t_surface_p
1510    TYPE(surf_type_lsm), POINTER ::  surf_tt_surface_m
1511    TYPE(surf_type_lsm), POINTER ::  surf_m_liq
1512    TYPE(surf_type_lsm), POINTER ::  surf_m_liq_p
1513    TYPE(surf_type_lsm), POINTER ::  surf_tm_liq_m
1514
1515    TYPE(surf_type_lsm), POINTER ::  surf_m_soil
1516    TYPE(surf_type_lsm), POINTER ::  surf_t_soil
1517
1518    TYPE(surf_type), POINTER  ::  surf  !< surface-date type variable
1519
1520
1521    IF ( debug_output_timestep )  THEN
1522       WRITE( debug_string, * ) 'lsm_energy_balance', horizontal, l
1523       CALL debug_message( debug_string, 'start' )
1524    ENDIF
1525
1526    IF ( horizontal )  THEN
1527       surf              => surf_lsm_h
1528
1529       surf_t_surface    => t_surface_h
1530       surf_t_surface_p  => t_surface_h_p
1531       surf_tt_surface_m => tt_surface_h_m
1532       surf_m_liq        => m_liq_h
1533       surf_m_liq_p      => m_liq_h_p
1534       surf_tm_liq_m     => tm_liq_h_m
1535       surf_m_soil       => m_soil_h
1536       surf_t_soil       => t_soil_h
1537    ELSE
1538       surf              => surf_lsm_v(l)
1539
1540       surf_t_surface    => t_surface_v(l)
1541       surf_t_surface_p  => t_surface_v_p(l)
1542       surf_tt_surface_m => tt_surface_v_m(l)
1543       surf_m_liq        => m_liq_v(l)
1544       surf_m_liq_p      => m_liq_v_p(l)
1545       surf_tm_liq_m     => tm_liq_v_m(l)
1546       surf_m_soil       => m_soil_v(l)
1547       surf_t_soil       => t_soil_v(l)
1548    ENDIF
1549
1550!
1551!-- Index offset of surface element point with respect to adjoining
1552!-- atmospheric grid point
1553    k_off = surf%koff
1554    j_off = surf%joff
1555    i_off = surf%ioff
1556
1557    !$OMP PARALLEL PRIVATE (m, i, j, k, lambda_h_sat, ke, lambda_soil, lambda_surface,             &
1558    !$OMP&                  c_surface_tmp, f1,m_total, f2, e_s, e, f3, m_min, m_liq_max, q_s,      &
1559    !$OMP&                  f_qsws_veg, f_qsws_soil, f_qsws_liq, f_shf, f_qsws, e_s_dt, dq_s_dt,   &
1560    !$OMP&                  coef_1, coef_2, tend)
1561    !$OMP DO SCHEDULE (STATIC)
1562    DO  m = 1, surf%ns
1563
1564       i   = surf%i(m)           
1565       j   = surf%j(m)
1566       k   = surf%k(m)
1567
1568!
1569!--    Define heat conductivity between surface and soil depending on surface
1570!--    type. For vegetation, a skin layer parameterization is used. The new
1571!--    parameterization uses a combination of two conductivities: a constant
1572!--    conductivity for the skin layer, and a conductivity according to the
1573!--    uppermost soil layer. For bare soil and pavements, no skin layer is
1574!--    applied. In these cases, the temperature is assumed to be constant
1575!--    between the surface and the first soil layer. The heat conductivity is
1576!--    then derived from the soil/pavement properties.
1577!--    For water surfaces, the conductivity is already set to 1E10.
1578!--    Moreover, the heat capacity is set. For bare soil the heat capacity is
1579!--    the capacity of the uppermost soil layer, for pavement it is that of
1580!--    the material involved.
1581
1582!
1583!--    for vegetation type surfaces, the thermal conductivity of the soil is
1584!--    needed
1585
1586       IF ( surf%vegetation_surface(m) )  THEN
1587
1588          lambda_h_sat = lambda_h_sm**(1.0_wp - surf%m_sat(nzb_soil,m)) *      &
1589                         lambda_h_water ** surf_m_soil%var_2d(nzb_soil,m)
1590                         
1591          ke = 1.0_wp + LOG10( MAX( 0.1_wp, surf_m_soil%var_2d(nzb_soil,m) /   &
1592                                                     surf%m_sat(nzb_soil,m) ) )                   
1593                         
1594          lambda_soil = (ke * (lambda_h_sat - lambda_h_dry) + lambda_h_dry )   &
1595                           * ddz_soil(nzb_soil) * 2.0_wp
1596
1597!
1598!--       When bare soil is set without a thermal conductivity (no skin layer),
1599!--       a heat capacity is that of the soil layer, otherwise it is a
1600!--       combination of the conductivities from the skin and the soil layer
1601          IF ( surf%lambda_surface_s(m) == 0.0_wp )  THEN
1602            surf%c_surface(m) = (rho_c_soil * (1.0_wp - surf%m_sat(nzb_soil,m))&
1603                              + rho_c_water * surf_m_soil%var_2d(nzb_soil,m) ) &
1604                              * dz_soil(nzb_soil) * 0.5_wp   
1605            lambda_surface = lambda_soil
1606
1607          ELSE IF ( surf_t_surface%var_1d(m) >= surf_t_soil%var_2d(nzb_soil,m))&
1608          THEN
1609             lambda_surface = surf%lambda_surface_s(m) * lambda_soil           &
1610                              / ( surf%lambda_surface_s(m) + lambda_soil )
1611          ELSE
1612
1613             lambda_surface = surf%lambda_surface_u(m) * lambda_soil           &
1614                              / ( surf%lambda_surface_u(m) + lambda_soil )
1615          ENDIF
1616       ELSE
1617          lambda_surface = surf%lambda_surface_s(m)
1618       ENDIF
1619
1620!
1621!--    Set heat capacity of the skin/surface. It is ususally zero when a skin
1622!--    layer is used, and non-zero otherwise.
1623       c_surface_tmp = surf%c_surface(m) 
1624
1625!
1626!--    First step: calculate aerodyamic resistance. As pt, us, ts
1627!--    are not available for the prognostic time step, data from the last
1628!--    time step is used here. Note that this formulation is the
1629!--    equivalent to the ECMWF formulation using drag coefficients
1630!        IF ( bulk_cloud_model )  THEN
1631!           pt1 = pt(k,j,i) + lv_d_cp * d_exner(k) * ql(k,j,i)
1632!           qv1 = q(k,j,i) - ql(k,j,i)
1633!        ELSEIF ( cloud_droplets ) THEN
1634!           pt1 = pt(k,j,i) + lv_d_cp * d_exner(k) * ql(k,j,i)
1635!           qv1 = q(k,j,i)
1636!        ELSE
1637!           pt1 = pt(k,j,i)
1638!           IF ( humidity )  THEN
1639!              qv1 = q(k,j,i)
1640!           ELSE
1641!              qv1 = 0.0_wp
1642!           ENDIF
1643!        ENDIF
1644!
1645!--     Calculation of r_a for vertical surfaces
1646!--
1647!--     heat transfer coefficient for forced convection along vertical walls
1648!--     follows formulation in TUF3d model (Krayenhoff & Voogt, 2006)
1649!--           
1650!--       H = httc (Tsfc - Tair)
1651!--       httc = rw * (11.8 + 4.2 * Ueff) - 4.0
1652!--           
1653!--             rw: wall patch roughness relative to 1.0 for concrete
1654!--             Ueff: effective wind speed
1655!--             - 4.0 is a reduction of Rowley et al (1930) formulation based on
1656!--             Cole and Sturrock (1977)
1657!--           
1658!--             Ucan: Canyon wind speed
1659!--             wstar: convective velocity
1660!--             Qs: surface heat flux
1661!--             zH: height of the convective layer
1662!--             wstar = (g/Tcan*Qs*zH)**(1./3.)
1663               
1664!--    Effective velocity components must always
1665!--    be defined at scalar grid point. The wall normal component is
1666!--    obtained by simple linear interpolation. ( An alternative would
1667!--    be an logarithmic interpolation. )
1668!--    A roughness lenght of 0.001 is assumed for concrete (the inverse,
1669!--    1000 is used in the nominator for scaling)
1670!--    To do: detailed investigation which approach gives more reliable results!
1671!--    Please note, in case of very small friction velocity, e.g. in little
1672!--    holes, the resistance can become negative. For this reason, limit r_a
1673!--    to positive values.
1674       IF ( horizontal  .OR.  .NOT. aero_resist_kray )  THEN
1675          surf%r_a(m) = ABS( ( surf%pt1(m) - surf%pt_surface(m) ) /            &
1676                             ( surf%ts(m) * surf%us(m) + 1.0E-20_wp ) )
1677       ELSE
1678          surf%r_a(m) = rho_cp / ( surf%z0(m) * 1000.0_wp                      &
1679                        * ( 11.8_wp + 4.2_wp *                                 &
1680                        SQRT( MAX( ( ( u(k,j,i) + u(k,j,i+1) ) * 0.5_wp )**2 + &
1681                                   ( ( v(k,j,i) + v(k,j+1,i) ) * 0.5_wp )**2 + &
1682                                   ( ( w(k,j,i) + w(k-1,j,i) ) * 0.5_wp )**2,  &
1683                              0.01_wp ) )                                      &
1684                           )  - 4.0_wp  ) 
1685       ENDIF
1686!
1687!--    Make sure that the resistance does not drop to zero for neutral
1688!--    stratification. Also, set a maximum resistance to avoid the breakdown of
1689!--    MOST for locations with zero wind speed
1690       IF ( surf%r_a(m) <   1.0_wp )  surf%r_a(m) =   1.0_wp
1691       IF ( surf%r_a(m) > 300.0_wp )  surf%r_a(m) = 300.0_wp       
1692!
1693!--    Second step: calculate canopy resistance r_canopy
1694!--    f1-f3 here are defined as 1/f1-f3 as in ECMWF documentation
1695 
1696!--    f1: correction for incoming shortwave radiation (stomata close at
1697!--    night)
1698       f1 = MIN( 1.0_wp, ( 0.004_wp * surf%rad_sw_in(m) + 0.05_wp ) /          &
1699                        (0.81_wp * (0.004_wp * surf%rad_sw_in(m)               &
1700                         + 1.0_wp)) )
1701
1702!
1703!--    f2: correction for soil moisture availability to plants (the
1704!--    integrated soil moisture must thus be considered here)
1705!--    f2 = 0 for very dry soils
1706       m_total = 0.0_wp
1707       DO  ks = nzb_soil, nzt_soil
1708           m_total = m_total + surf%root_fr(ks,m)                              &
1709                     * MAX( surf_m_soil%var_2d(ks,m), surf%m_wilt(ks,m) )
1710       ENDDO 
1711
1712!
1713!--    The calculation of f2 is based on only one wilting point value for all
1714!--    soil layers. The value at k=nzb_soil is used here as a proxy but might
1715!--    need refinement in the future.
1716       IF ( m_total > surf%m_wilt(nzb_soil,m)  .AND.                           &
1717            m_total < surf%m_fc(nzb_soil,m) )  THEN
1718          f2 = ( m_total - surf%m_wilt(nzb_soil,m) ) /                         &
1719               ( surf%m_fc(nzb_soil,m) - surf%m_wilt(nzb_soil,m) )
1720       ELSEIF ( m_total >= surf%m_fc(nzb_soil,m) )  THEN
1721          f2 = 1.0_wp
1722       ELSE
1723          f2 = 1.0E-20_wp
1724       ENDIF
1725
1726!
1727!--    Calculate water vapour pressure at saturation and convert to hPa
1728!--    The magnus formula is limited to temperatures up to 333.15 K to
1729!--    avoid negative values of q_s
1730       e_s = 0.01_wp * magnus( MIN(surf_t_surface%var_1d(m), 333.15_wp) )
1731
1732!
1733!--    f3: correction for vapour pressure deficit
1734       IF ( surf%g_d(m) /= 0.0_wp )  THEN
1735!
1736!--       Calculate vapour pressure
1737          e  = surf%qv1(m) * surface_pressure / ( surf%qv1(m) + rd_d_rv )
1738          f3 = EXP ( - surf%g_d(m) * (e_s - e) )
1739       ELSE
1740          f3 = 1.0_wp
1741       ENDIF
1742!
1743!--    Calculate canopy resistance. In case that c_veg is 0 (bare soils),
1744!--    this calculation is obsolete, as r_canopy is not used below.
1745!--    To do: check for very dry soil -> r_canopy goes to infinity
1746       surf%r_canopy(m) = surf%r_canopy_min(m) /                               &
1747                              ( surf%lai(m) * f1 * f2 * f3 + 1.0E-20_wp )
1748!
1749!--    Third step: calculate bare soil resistance r_soil.
1750       m_min = surf%c_veg(m) * surf%m_wilt(nzb_soil,m) +                       &
1751                         ( 1.0_wp - surf%c_veg(m) ) * surf%m_res(nzb_soil,m)
1752
1753
1754       f2 = ( surf_m_soil%var_2d(nzb_soil,m) - m_min ) /                       &
1755            ( surf%m_fc(nzb_soil,m) - m_min )
1756       f2 = MAX( f2, 1.0E-20_wp )
1757       f2 = MIN( f2, 1.0_wp     )
1758
1759       surf%r_soil(m) = surf%r_soil_min(m) / f2
1760       
1761!
1762!--    Calculate the maximum possible liquid water amount on plants and
1763!--    bare surface. For vegetated surfaces, a maximum depth of 0.2 mm is
1764!--    assumed, while paved surfaces might hold up 1 mm of water. The
1765!--    liquid water fraction for paved surfaces is calculated after
1766!--    Noilhan & Planton (1989), while the ECMWF formulation is used for
1767!--    vegetated surfaces and bare soils.
1768       IF ( surf%pavement_surface(m) )  THEN
1769          m_liq_max = m_max_depth * 5.0_wp
1770          surf%c_liq(m) = MIN( 1.0_wp, ( surf_m_liq%var_1d(m) / m_liq_max)**0.67 )
1771       ELSE
1772          m_liq_max = m_max_depth * ( surf%c_veg(m) * surf%lai(m)              &
1773                      + ( 1.0_wp - surf%c_veg(m) ) )
1774          surf%c_liq(m) = MIN( 1.0_wp, surf_m_liq%var_1d(m) / m_liq_max )
1775       ENDIF
1776!
1777!--    Calculate saturation water vapor mixing ratio
1778       q_s = rd_d_rv * e_s / ( surface_pressure - e_s )
1779!
1780!--    In case of dewfall, set evapotranspiration to zero
1781!--    All super-saturated water is then removed from the air
1782       IF ( humidity  .AND.  q_s <= surf%qv1(m) )  THEN
1783          surf%r_canopy(m) = 0.0_wp
1784          surf%r_soil(m)   = 0.0_wp
1785       ENDIF
1786
1787!
1788!--    Calculate coefficients for the total evapotranspiration
1789!--    In case of water surface, set vegetation and soil fluxes to zero.
1790!--    For pavements, only evaporation of liquid water is possible.
1791       IF ( surf%water_surface(m) )  THEN
1792          f_qsws_veg  = 0.0_wp
1793          f_qsws_soil = 0.0_wp
1794          f_qsws_liq  = rho_lv / surf%r_a(m)
1795       ELSEIF ( surf%pavement_surface(m) )  THEN
1796          f_qsws_veg  = 0.0_wp
1797          f_qsws_soil = 0.0_wp
1798          f_qsws_liq  = rho_lv * surf%c_liq(m) / surf%r_a(m)
1799       ELSE
1800          f_qsws_veg  = rho_lv * surf%c_veg(m) *                               &
1801                            ( 1.0_wp        - surf%c_liq(m)    ) /             &
1802                            ( surf%r_a(m) + surf%r_canopy(m) )
1803          f_qsws_soil = rho_lv * (1.0_wp    - surf%c_veg(m)    ) /             &
1804                            ( surf%r_a(m) + surf%r_soil(m)   )
1805          f_qsws_liq  = rho_lv * surf%c_veg(m) * surf%c_liq(m)   /             &
1806                              surf%r_a(m)
1807       ENDIF
1808
1809       f_shf  = rho_cp / surf%r_a(m)
1810       f_qsws = f_qsws_veg + f_qsws_soil + f_qsws_liq
1811!
1812!--    Calculate derivative of q_s for Taylor series expansion
1813       e_s_dt = e_s * ( 17.62_wp / ( surf_t_surface%var_1d(m) - 29.65_wp) -   &
1814                        17.62_wp*( surf_t_surface%var_1d(m) - 273.15_wp)      &
1815                       / ( surf_t_surface%var_1d(m) - 29.65_wp)**2 )
1816
1817       dq_s_dt = rd_d_rv * e_s_dt / ( surface_pressure - e_s_dt )
1818!
1819!--    Calculate net radiation radiation without longwave outgoing flux because
1820!--    it has a dependency on surface temperature and thus enters the prognostic
1821!--    equations directly
1822       surf%rad_net_l(m) = surf%rad_sw_in(m) - surf%rad_sw_out(m)              &
1823                           + surf%rad_lw_in(m)
1824!
1825!--    Calculate new skin temperature
1826       IF ( humidity )  THEN
1827!
1828!--       Numerator of the prognostic equation
1829          coef_1 = surf%rad_net_l(m) + surf%rad_lw_out_change_0(m)             &
1830                   * surf_t_surface%var_1d(m) - surf%rad_lw_out(m)             &
1831                   + f_shf * surf%pt1(m) + f_qsws * ( surf%qv1(m) - q_s        &
1832                   + dq_s_dt * surf_t_surface%var_1d(m) ) + lambda_surface     &
1833                   * surf_t_soil%var_2d(nzb_soil,m)
1834
1835!
1836!--       Denominator of the prognostic equation
1837          coef_2 = surf%rad_lw_out_change_0(m) + f_qsws * dq_s_dt              &
1838                   + lambda_surface + f_shf / exner(nzb)
1839       ELSE
1840!
1841!--       Numerator of the prognostic equation
1842          coef_1 = surf%rad_net_l(m) + surf%rad_lw_out_change_0(m)             &
1843                   * surf_t_surface%var_1d(m) - surf%rad_lw_out(m)             &
1844                   + f_shf * surf%pt1(m)  + lambda_surface                     &
1845                   * surf_t_soil%var_2d(nzb_soil,m)
1846!
1847!--       Denominator of the prognostic equation
1848          coef_2 = surf%rad_lw_out_change_0(m) + lambda_surface + f_shf / exner(nzb)
1849
1850       ENDIF
1851
1852       tend = 0.0_wp
1853
1854!
1855!--    Implicit solution when the surface layer has no heat capacity,
1856!--    otherwise use RK3 scheme.
1857       surf_t_surface_p%var_1d(m) = ( coef_1 * dt_3d * tsc(2) + c_surface_tmp *&
1858                          surf_t_surface%var_1d(m) ) / ( c_surface_tmp + coef_2&
1859                                             * dt_3d * tsc(2) ) 
1860
1861!
1862!--    Add RK3 term
1863       IF ( c_surface_tmp /= 0.0_wp )  THEN
1864
1865          surf_t_surface_p%var_1d(m) = surf_t_surface_p%var_1d(m) + dt_3d *    &
1866                                       tsc(3) * surf_tt_surface_m%var_1d(m)
1867
1868!
1869!--       Calculate true tendency
1870          tend = ( surf_t_surface_p%var_1d(m) - surf_t_surface%var_1d(m) -     &
1871                   dt_3d * tsc(3) * surf_tt_surface_m%var_1d(m)) / (dt_3d  * tsc(2))
1872!
1873!--       Calculate t_surface tendencies for the next Runge-Kutta step
1874          IF ( timestep_scheme(1:5) == 'runge' )  THEN
1875             IF ( intermediate_timestep_count == 1 )  THEN
1876                surf_tt_surface_m%var_1d(m) = tend
1877             ELSEIF ( intermediate_timestep_count <                            &
1878                      intermediate_timestep_count_max )  THEN
1879                surf_tt_surface_m%var_1d(m) = -9.5625_wp * tend +              &
1880                                               5.3125_wp * surf_tt_surface_m%var_1d(m)
1881             ENDIF
1882          ENDIF
1883       ENDIF
1884
1885!
1886!--    In case of fast changes in the skin temperature, it is possible to
1887!--    update the radiative fluxes independently from the prescribed
1888!--    radiation call frequency. This effectively prevents oscillations,
1889!--    especially when setting skip_time_do_radiation /= 0. The threshold
1890!--    value of 0.2 used here is just a first guess. This method should be
1891!--    revised in the future as tests have shown that the threshold is
1892!--    often reached, when no oscillations would occur (causes immense
1893!--    computing time for the radiation code).
1894       IF ( ABS( surf_t_surface_p%var_1d(m) - surf_t_surface%var_1d(m) )       &
1895            > 0.2_wp  .AND. &
1896            unscheduled_radiation_calls )  THEN
1897          force_radiation_call_l = .TRUE.
1898       ENDIF
1899
1900       surf%pt_surface(m)          = surf_t_surface_p%var_1d(m) / exner(nzb)
1901
1902!
1903!--    Calculate fluxes
1904       surf%rad_net_l(m) = surf%rad_net_l(m) +                                 &
1905                            surf%rad_lw_out_change_0(m)                        &
1906                          * surf_t_surface%var_1d(m) - surf%rad_lw_out(m)      &
1907                          - surf%rad_lw_out_change_0(m) * surf_t_surface_p%var_1d(m)
1908
1909       surf%rad_net(m) = surf%rad_net_l(m)
1910       surf%rad_lw_out(m) = surf%rad_lw_out(m) + surf%rad_lw_out_change_0(m) * &
1911                     ( surf_t_surface_p%var_1d(m) - surf_t_surface%var_1d(m) )
1912
1913       surf%ghf(m) = lambda_surface * ( surf_t_surface_p%var_1d(m)             &
1914                                             - surf_t_soil%var_2d(nzb_soil,m) )
1915
1916       surf%shf(m) = - f_shf * ( surf%pt1(m) - surf%pt_surface(m) ) / c_p
1917
1918!
1919! update the 3d field of rad_lw_out array to have consistent output
1920       IF ( horizontal ) THEN
1921          IF ( radiation_scheme == 'rrtmg' ) THEN
1922             rad_lw_out(k+k_off,j+j_off,i+i_off) = surf%rad_lw_out(m)
1923          ELSE
1924             rad_lw_out(0,j+j_off,i+i_off) = surf%rad_lw_out(m)
1925          ENDIF
1926       ENDIF
1927
1928       IF ( humidity )  THEN
1929          surf%qsws(m)  = - f_qsws * ( surf%qv1(m) - q_s + dq_s_dt             &
1930                          * surf_t_surface%var_1d(m) - dq_s_dt *               &
1931                            surf_t_surface_p%var_1d(m) )
1932
1933          surf%qsws_veg(m)  = - f_qsws_veg  * ( surf%qv1(m) - q_s              &
1934                              + dq_s_dt * surf_t_surface%var_1d(m) - dq_s_dt   &
1935                              * surf_t_surface_p%var_1d(m) )
1936
1937          surf%qsws_soil(m) = - f_qsws_soil * ( surf%qv1(m) - q_s              &
1938                              + dq_s_dt * surf_t_surface%var_1d(m) - dq_s_dt   &
1939                              * surf_t_surface_p%var_1d(m) )
1940
1941          surf%qsws_liq(m)  = - f_qsws_liq  * ( surf%qv1(m) - q_s              &
1942                              + dq_s_dt * surf_t_surface%var_1d(m) - dq_s_dt   &
1943                              * surf_t_surface_p%var_1d(m) )
1944       ENDIF
1945
1946!
1947!--    Calculate the true surface resistance. ABS is used here to avoid negative
1948!--    values that can occur for very small fluxes due to the artifical addition
1949!--    of 1.0E-20.
1950       IF ( .NOT.  humidity )  THEN
1951          surf%r_s(m) = 1.0E10_wp
1952       ELSE
1953          surf%r_s(m) = ABS(rho_lv / (f_qsws + 1.0E-20_wp) - surf%r_a(m))
1954       ENDIF
1955!
1956!--    Calculate change in liquid water reservoir due to dew fall or
1957!--    evaporation of liquid water
1958       IF ( humidity )  THEN
1959!
1960!--       If precipitation is activated, add rain water to qsws_liq
1961!--       and qsws_soil according the the vegetation coverage.
1962!--       precipitation_rate is given in mm.
1963          IF ( precipitation )  THEN
1964
1965!
1966!--          Add precipitation to liquid water reservoir, if possible.
1967!--          Otherwise, add the water to soil. In case of
1968!--          pavements, the exceeding water amount is explicitly removed
1969!--          (as fictive runoff by drainage systems)
1970             IF ( surf%pavement_surface(m) )  THEN
1971                IF ( surf_m_liq%var_1d(m) < m_liq_max )  THEN
1972                   surf%qsws_liq(m) = surf%qsws_liq(m)                         &
1973                                 + prr(k+k_off,j+j_off,i+i_off)                &
1974                                 * hyrho(k+k_off)                              &
1975                                 * 0.001_wp * rho_l * l_v
1976                ENDIF         
1977             ELSE
1978                IF ( surf_m_liq%var_1d(m) < m_liq_max )  THEN
1979                   surf%qsws_liq(m) = surf%qsws_liq(m)                         &
1980                                 + surf%c_veg(m) * prr(k+k_off,j+j_off,i+i_off)&
1981                                 * hyrho(k+k_off)                              &
1982                                 * 0.001_wp * rho_l * l_v
1983                   surf%qsws_soil(m) = surf%qsws_soil(m) + ( 1.0_wp -          &
1984                                 surf%c_veg(m) ) * prr(k+k_off,j+j_off,i+i_off)&
1985                                 * hyrho(k+k_off)                              &
1986                                 * 0.001_wp * rho_l * l_v                                 
1987                ELSE
1988
1989!--                Add precipitation to bare soil according to the bare soil
1990!--                coverage.
1991                   surf%qsws_soil(m) = surf%qsws_soil(m)                       &
1992                                 + surf%c_veg(m) * prr(k+k_off,j+j_off,i+i_off)&
1993                                 * hyrho(k+k_off)                              &
1994                                 * 0.001_wp * rho_l * l_v
1995
1996                ENDIF
1997             ENDIF
1998
1999          ENDIF
2000
2001!
2002!--       If the air is saturated, check the reservoir water level
2003          IF ( surf%qsws(m) < 0.0_wp )  THEN
2004!
2005!--          Check if reservoir is full (avoid values > m_liq_max)
2006!--          In that case, qsws_liq goes to qsws_soil for pervious surfaces. In
2007!--          this case qsws_veg is zero anyway (because c_liq = 1),       
2008!--          so that tend is zero and no further check is needed
2009             IF ( surf_m_liq%var_1d(m) == m_liq_max )  THEN
2010                IF ( .NOT. surf%pavement_surface(m))  THEN
2011                   surf%qsws_soil(m) = surf%qsws_soil(m) + surf%qsws_liq(m)
2012                ENDIF
2013                surf%qsws_liq(m)  = 0.0_wp
2014             ENDIF
2015
2016!
2017!--          In case qsws_veg becomes negative (unphysical behavior),
2018!--          let the water enter the liquid water reservoir as dew on the
2019!--          plant
2020             IF ( surf%qsws_veg(m) < 0.0_wp )  THEN
2021                surf%qsws_liq(m) = surf%qsws_liq(m) + surf%qsws_veg(m)
2022                surf%qsws_veg(m) = 0.0_wp
2023             ENDIF
2024          ENDIF                   
2025 
2026          surf%qsws(m) = surf%qsws(m) / l_v
2027 
2028          tend = - surf%qsws_liq(m) * drho_l_lv
2029          surf_m_liq_p%var_1d(m) = surf_m_liq%var_1d(m) + dt_3d *              &
2030                                        ( tsc(2) * tend +                      &
2031                                          tsc(3) * surf_tm_liq_m%var_1d(m) )
2032!
2033!--       Check if reservoir is overfull -> reduce to maximum
2034!--       (conservation of water is violated here)
2035          surf_m_liq_p%var_1d(m) = MIN( surf_m_liq_p%var_1d(m),m_liq_max )
2036
2037!
2038!--       Check if reservoir is empty (avoid values < 0.0)
2039!--       (conservation of water is violated here)
2040          surf_m_liq_p%var_1d(m) = MAX( surf_m_liq_p%var_1d(m), 0.0_wp )
2041!
2042!--       Calculate m_liq tendencies for the next Runge-Kutta step
2043          IF ( timestep_scheme(1:5) == 'runge' )  THEN
2044             IF ( intermediate_timestep_count == 1 )  THEN
2045                surf_tm_liq_m%var_1d(m) = tend
2046             ELSEIF ( intermediate_timestep_count <                            &
2047                      intermediate_timestep_count_max )  THEN
2048                surf_tm_liq_m%var_1d(m) = -9.5625_wp * tend +                  &
2049                                           5.3125_wp * surf_tm_liq_m%var_1d(m)
2050             ENDIF
2051          ENDIF
2052
2053       ENDIF
2054
2055    ENDDO
2056    !$OMP END PARALLEL
2057
2058!
2059!-- Make a logical OR for all processes. Force radiation call if at
2060!-- least one processor reached the threshold change in skin temperature
2061    IF ( unscheduled_radiation_calls  .AND.  intermediate_timestep_count       &
2062         == intermediate_timestep_count_max-1 )  THEN
2063#if defined( __parallel )
2064       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
2065       CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call,       &
2066                           1, MPI_LOGICAL, MPI_LOR, comm2d, ierr )
2067#else
2068       force_radiation_call = force_radiation_call_l
2069#endif
2070       force_radiation_call_l = .FALSE.
2071    ENDIF
2072
2073!
2074!-- Calculate surface water vapor mixing ratio
2075    IF ( humidity )  THEN
2076       CALL calc_q_surface
2077    ENDIF
2078
2079!
2080!-- Calculate new roughness lengths (for water surfaces only)
2081    IF ( horizontal  .AND.  .NOT. constant_roughness )  CALL calc_z0_water_surface
2082   
2083    IF ( debug_output_timestep )  THEN
2084       WRITE( debug_string, * ) 'lsm_energy_balance', horizontal, l
2085       CALL debug_message( debug_string, 'end' )
2086    ENDIF
2087
2088    CONTAINS
2089!------------------------------------------------------------------------------!
2090! Description:
2091! ------------
2092!> Calculation of mixing ratio of the skin layer (surface). It is assumend
2093!> that the skin is always saturated.
2094!------------------------------------------------------------------------------!
2095    SUBROUTINE calc_q_surface
2096
2097       IMPLICIT NONE
2098
2099       REAL(wp) ::  e_s           !< saturation water vapor pressure
2100       REAL(wp) ::  q_s           !< saturation mixing ratio
2101       REAL(wp) ::  resistance    !< aerodynamic and soil resistance term
2102
2103
2104       !$OMP PARALLEL PRIVATE (m, i, j, k, e_s, q_s, resistance)
2105       !$OMP DO SCHEDULE (STATIC)
2106       DO  m = 1, surf%ns
2107
2108          i   = surf%i(m)           
2109          j   = surf%j(m)
2110          k   = surf%k(m)
2111!
2112!--       Calculate water vapour pressure at saturation and convert to hPa
2113          e_s = 0.01_wp * magnus( MIN(surf_t_surface_p%var_1d(m), 333.15_wp) )                   
2114
2115!
2116!--       Calculate mixing ratio at saturation
2117          q_s = rd_d_rv * e_s / ( surface_pressure - e_s )
2118
2119          resistance = surf%r_a(m) / ( surf%r_a(m) + surf%r_s(m) + 1E-5_wp )
2120
2121!
2122!--       Calculate mixing ratio at surface
2123          IF ( bulk_cloud_model )  THEN
2124             q(k+k_off,j+j_off,i+i_off) = resistance * q_s +                   &
2125                                        ( 1.0_wp - resistance ) *              &
2126                                        ( q(k,j,i) - ql(k,j,i) )
2127          ELSE
2128             q(k+k_off,j+j_off,i+i_off) = resistance * q_s +                   &
2129                                        ( 1.0_wp - resistance ) *              &
2130                                          q(k,j,i)
2131          ENDIF
2132         
2133          surf%q_surface(m) = q(k+k_off,j+j_off,i+i_off)
2134!
2135!--       Update virtual potential temperature
2136          surf%vpt_surface(m) = surf%pt_surface(m) *                           &
2137                                  ( 1.0_wp + 0.61_wp * surf%q_surface(m) )
2138
2139       
2140                     
2141       ENDDO
2142       !$OMP END PARALLEL
2143 
2144    END SUBROUTINE calc_q_surface
2145       
2146 END SUBROUTINE lsm_energy_balance
2147   
2148   
2149
2150!------------------------------------------------------------------------------!
2151! Description:
2152! ------------
2153!> Header output for land surface model
2154!------------------------------------------------------------------------------!
2155    SUBROUTINE lsm_header ( io )
2156
2157
2158       IMPLICIT NONE
2159
2160       CHARACTER (LEN=86) ::  t_soil_chr          !< String for soil temperature profile
2161       CHARACTER (LEN=86) ::  roots_chr           !< String for root profile
2162       CHARACTER (LEN=86) ::  vertical_index_chr  !< String for the vertical index
2163       CHARACTER (LEN=86) ::  m_soil_chr          !< String for soil moisture
2164       CHARACTER (LEN=86) ::  soil_depth_chr      !< String for soil depth
2165       CHARACTER (LEN=10) ::  coor_chr            !< Temporary string
2166   
2167       INTEGER(iwp) ::  i                         !< Loop index over soil layers
2168 
2169       INTEGER(iwp), INTENT(IN) ::  io            !< Unit of the output file
2170 
2171       t_soil_chr = ''
2172       m_soil_chr    = ''
2173       soil_depth_chr  = '' 
2174       roots_chr        = '' 
2175       vertical_index_chr   = ''
2176
2177       i = 1
2178       DO i = nzb_soil, nzt_soil
2179          WRITE (coor_chr,'(F10.2,7X)') soil_temperature(i)
2180          t_soil_chr = TRIM( t_soil_chr ) // ' ' // TRIM( coor_chr )
2181
2182          WRITE (coor_chr,'(F10.2,7X)') soil_moisture(i)
2183          m_soil_chr = TRIM( m_soil_chr ) // ' ' // TRIM( coor_chr )
2184
2185          WRITE (coor_chr,'(F10.2,7X)')  - zs(i)
2186          soil_depth_chr = TRIM( soil_depth_chr ) // ' '  // TRIM( coor_chr )
2187
2188          WRITE (coor_chr,'(F10.2,7X)')  root_fraction(i)
2189          roots_chr = TRIM( roots_chr ) // ' '  // TRIM( coor_chr )
2190
2191          WRITE (coor_chr,'(I10,7X)')  i
2192          vertical_index_chr = TRIM( vertical_index_chr ) // ' '  //           &
2193                               TRIM( coor_chr )
2194       ENDDO
2195
2196!
2197!--    Write land surface model header
2198       WRITE( io,  1 )
2199       IF ( conserve_water_content )  THEN
2200          WRITE( io, 2 )
2201       ELSE
2202          WRITE( io, 3 )
2203       ENDIF
2204
2205       IF ( vegetation_type_f%from_file )  THEN
2206          WRITE( io, 5 )
2207       ELSE
2208          WRITE( io, 4 ) TRIM( vegetation_type_name(vegetation_type) ),        &
2209                         TRIM (soil_type_name(soil_type) )
2210       ENDIF
2211       WRITE( io, 6 ) TRIM( soil_depth_chr ), TRIM( t_soil_chr ),              &
2212                        TRIM( m_soil_chr ), TRIM( roots_chr ),                 &
2213                        TRIM( vertical_index_chr )
2214
22151   FORMAT (//' Land surface model information:'/                              &
2216              ' ------------------------------'/)
22172   FORMAT ('    --> Soil bottom is closed (water content is conserved',       &
2218            ', default)')
22193   FORMAT ('    --> Soil bottom is open (water content is not conserved)')         
22204   FORMAT ('    --> Land surface type  : ',A,/                                &
2221            '    --> Soil porosity type : ',A)
22225   FORMAT ('    --> Land surface type  : read from file' /                    &
2223            '    --> Soil porosity type : read from file' )
22246   FORMAT (/'    Initial soil temperature and moisture profile:'//            &
2225            '       Height:        ',A,'  m'/                                  &
2226            '       Temperature:   ',A,'  K'/                                  &
2227            '       Moisture:      ',A,'  m**3/m**3'/                          &
2228            '       Root fraction: ',A,'  '/                                   &
2229            '       Grid point:    ',A)
2230
2231
2232    END SUBROUTINE lsm_header
2233
2234
2235!------------------------------------------------------------------------------!
2236! Description:
2237! ------------
2238!> Initialization of the land surface model
2239!------------------------------------------------------------------------------!
2240    SUBROUTINE lsm_init
2241
2242       USE control_parameters,                                                 &
2243           ONLY:  message_string
2244
2245       USE indices,                                                            &
2246           ONLY:  nx, ny, topo_min_level
2247
2248       USE pmc_interface,                                                      &
2249           ONLY:  nested_run
2250   
2251       IMPLICIT NONE
2252
2253       LOGICAL      ::  init_msoil_from_parent   !< flag controlling initialization of soil moisture in nested child domains
2254       LOGICAL      ::  init_tsoil_from_parent   !< flag controlling initialization of soil temperature in nested child domains
2255
2256       INTEGER(iwp) ::  i                       !< running index
2257       INTEGER(iwp) ::  j                       !< running index
2258       INTEGER(iwp) ::  k                       !< running index
2259       INTEGER(iwp) ::  kn                      !< running index
2260       INTEGER(iwp) ::  ko                      !< running index
2261       INTEGER(iwp) ::  kroot                   !< running index
2262       INTEGER(iwp) ::  kzs                     !< running index
2263       INTEGER(iwp) ::  l                       !< running index surface facing
2264       INTEGER(iwp) ::  m                       !< running index
2265       INTEGER(iwp) ::  st                      !< soil-type index
2266       INTEGER(iwp) ::  n_soil_layers_total     !< temperature variable, stores the total number of soil layers + 4
2267
2268       REAL(wp), DIMENSION(:), ALLOCATABLE ::  bound, bound_root_fr  !< temporary arrays for storing index bounds
2269       REAL(wp), DIMENSION(:), ALLOCATABLE ::  pr_soil_init !< temporary array used for averaging soil profiles
2270
2271       IF ( debug_output )  CALL debug_message( 'lsm_init', 'start' )
2272!
2273!--    If no cloud physics is used, rho_surface has not been calculated before
2274       IF (  .NOT.  bulk_cloud_model  .AND.  .NOT.  cloud_droplets )  THEN
2275          CALL calc_mean_profile( pt, 4 )
2276          rho_surface = hyp(nzb) / ( r_d * hom(topo_min_level+1,1,4,0) * exner(nzb) )
2277       ENDIF
2278
2279!
2280!--    Calculate frequently used parameters
2281       rho_cp    = c_p * rho_surface
2282       rho_lv    = rho_surface * l_v
2283       drho_l_lv = 1.0_wp / (rho_l * l_v)
2284
2285!
2286!--    Set initial values for prognostic quantities
2287!--    Horizontal surfaces
2288       tt_surface_h_m%var_1d = 0.0_wp
2289       tt_soil_h_m%var_2d    = 0.0_wp
2290       tm_soil_h_m%var_2d    = 0.0_wp
2291       tm_liq_h_m%var_1d     = 0.0_wp
2292       surf_lsm_h%c_liq      = 0.0_wp
2293
2294       surf_lsm_h%ghf = 0.0_wp
2295
2296       surf_lsm_h%qsws_liq  = 0.0_wp
2297       surf_lsm_h%qsws_soil = 0.0_wp
2298       surf_lsm_h%qsws_veg  = 0.0_wp
2299
2300       surf_lsm_h%r_a        = 50.0_wp
2301       surf_lsm_h%r_s        = 50.0_wp
2302       surf_lsm_h%r_canopy   = 0.0_wp
2303       surf_lsm_h%r_soil     = 0.0_wp
2304!
2305!--    Do the same for vertical surfaces
2306       DO  l = 0, 3
2307          tt_surface_v_m(l)%var_1d = 0.0_wp
2308          tt_soil_v_m(l)%var_2d    = 0.0_wp
2309          tm_soil_v_m(l)%var_2d    = 0.0_wp
2310          tm_liq_v_m(l)%var_1d     = 0.0_wp
2311          surf_lsm_v(l)%c_liq      = 0.0_wp
2312
2313          surf_lsm_v(l)%ghf = 0.0_wp
2314
2315          surf_lsm_v(l)%qsws_liq  = 0.0_wp
2316          surf_lsm_v(l)%qsws_soil = 0.0_wp
2317          surf_lsm_v(l)%qsws_veg  = 0.0_wp
2318
2319          surf_lsm_v(l)%r_a        = 50.0_wp
2320          surf_lsm_v(l)%r_s        = 50.0_wp
2321          surf_lsm_v(l)%r_canopy   = 0.0_wp
2322          surf_lsm_v(l)%r_soil     = 0.0_wp
2323       ENDDO
2324
2325!
2326!--    Set initial values for prognostic soil quantities
2327       IF ( TRIM( initializing_actions ) /= 'read_restart_data' )  THEN
2328          t_soil_h%var_2d = 0.0_wp
2329          m_soil_h%var_2d = 0.0_wp
2330          m_liq_h%var_1d  = 0.0_wp
2331
2332          DO  l = 0, 3
2333             t_soil_v(l)%var_2d = 0.0_wp
2334             m_soil_v(l)%var_2d = 0.0_wp
2335             m_liq_v(l)%var_1d  = 0.0_wp
2336          ENDDO
2337       ENDIF
2338!
2339!--    Allocate 3D soil model arrays
2340!--    First, for horizontal surfaces
2341       ALLOCATE ( surf_lsm_h%alpha_vg(nzb_soil:nzt_soil,1:surf_lsm_h%ns)    )
2342       ALLOCATE ( surf_lsm_h%gamma_w_sat(nzb_soil:nzt_soil,1:surf_lsm_h%ns) )
2343       ALLOCATE ( surf_lsm_h%lambda_h(nzb_soil:nzt_soil,1:surf_lsm_h%ns)    )
2344       ALLOCATE ( surf_lsm_h%lambda_h_def(nzb_soil:nzt_soil,1:surf_lsm_h%ns))
2345       ALLOCATE ( surf_lsm_h%l_vg(nzb_soil:nzt_soil,1:surf_lsm_h%ns)        )
2346       ALLOCATE ( surf_lsm_h%m_fc(nzb_soil:nzt_soil,1:surf_lsm_h%ns)        )
2347       ALLOCATE ( surf_lsm_h%m_res(nzb_soil:nzt_soil,1:surf_lsm_h%ns)       )
2348       ALLOCATE ( surf_lsm_h%m_sat(nzb_soil:nzt_soil,1:surf_lsm_h%ns)       )
2349       ALLOCATE ( surf_lsm_h%m_wilt(nzb_soil:nzt_soil,1:surf_lsm_h%ns)      )
2350       ALLOCATE ( surf_lsm_h%n_vg(nzb_soil:nzt_soil,1:surf_lsm_h%ns)        )
2351       ALLOCATE ( surf_lsm_h%rho_c_total(nzb_soil:nzt_soil,1:surf_lsm_h%ns) )
2352       ALLOCATE ( surf_lsm_h%rho_c_total_def(nzb_soil:nzt_soil,1:surf_lsm_h%ns) )
2353       ALLOCATE ( surf_lsm_h%root_fr(nzb_soil:nzt_soil,1:surf_lsm_h%ns)     )
2354   
2355       surf_lsm_h%lambda_h     = 0.0_wp
2356!
2357!--    If required, allocate humidity-related variables for the soil model
2358       IF ( humidity )  THEN
2359          ALLOCATE ( surf_lsm_h%lambda_w(nzb_soil:nzt_soil,1:surf_lsm_h%ns) )
2360          ALLOCATE ( surf_lsm_h%gamma_w(nzb_soil:nzt_soil,1:surf_lsm_h%ns)  ) 
2361
2362          surf_lsm_h%lambda_w = 0.0_wp 
2363       ENDIF
2364!
2365!--    For vertical surfaces
2366       DO  l = 0, 3
2367          ALLOCATE ( surf_lsm_v(l)%alpha_vg(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)    )
2368          ALLOCATE ( surf_lsm_v(l)%gamma_w_sat(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) )
2369          ALLOCATE ( surf_lsm_v(l)%lambda_h(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)    )
2370          ALLOCATE ( surf_lsm_v(l)%lambda_h_def(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns))
2371          ALLOCATE ( surf_lsm_v(l)%l_vg(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)        )
2372          ALLOCATE ( surf_lsm_v(l)%m_fc(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)        )
2373          ALLOCATE ( surf_lsm_v(l)%m_res(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)       )
2374          ALLOCATE ( surf_lsm_v(l)%m_sat(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)       )
2375          ALLOCATE ( surf_lsm_v(l)%m_wilt(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)      )
2376          ALLOCATE ( surf_lsm_v(l)%n_vg(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)        )
2377          ALLOCATE ( surf_lsm_v(l)%rho_c_total(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 
2378          ALLOCATE ( surf_lsm_v(l)%rho_c_total_def(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) ) 
2379          ALLOCATE ( surf_lsm_v(l)%root_fr(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)     )
2380
2381          surf_lsm_v(l)%lambda_h     = 0.0_wp 
2382         
2383!
2384!--       If required, allocate humidity-related variables for the soil model
2385          IF ( humidity )  THEN
2386             ALLOCATE ( surf_lsm_v(l)%lambda_w(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) )
2387             ALLOCATE ( surf_lsm_v(l)%gamma_w(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)  ) 
2388
2389             surf_lsm_v(l)%lambda_w = 0.0_wp 
2390          ENDIF     
2391       ENDDO
2392!
2393!--    Allocate albedo type and emissivity for vegetation, water and pavement
2394!--    fraction.
2395!--    Set default values at each surface element.
2396       ALLOCATE ( surf_lsm_h%albedo_type(0:2,1:surf_lsm_h%ns) )
2397       ALLOCATE ( surf_lsm_h%emissivity(0:2,1:surf_lsm_h%ns) )
2398!
2399!--    Initialize albedo type according to its default type, in order to set values
2400!--    independent on default albedo_type in radiation model.
2401       surf_lsm_h%albedo_type(ind_veg_wall,:)  =                               &
2402                             INT( vegetation_pars(ind_v_at,vegetation_type) )
2403       surf_lsm_h%albedo_type(ind_wat_win,:)   =                               &
2404                             INT( water_pars(ind_w_at,water_type)           )
2405       surf_lsm_h%albedo_type(ind_pav_green,:) =                               &
2406                             INT( pavement_pars(ind_p_at,pavement_type)     )
2407       surf_lsm_h%emissivity  = emissivity
2408       DO  l = 0, 3
2409          ALLOCATE ( surf_lsm_v(l)%albedo_type(0:2,1:surf_lsm_v(l)%ns) )
2410          ALLOCATE ( surf_lsm_v(l)%emissivity(0:2,1:surf_lsm_v(l)%ns)  )
2411!
2412!--       Initialize albedo type according to its default type, in order to
2413!--       set values independent on default albedo_type in radiation model.
2414          surf_lsm_v(l)%albedo_type(ind_veg_wall,:)  =                         &
2415                             INT( vegetation_pars(ind_v_at,vegetation_type) )
2416          surf_lsm_v(l)%albedo_type(ind_wat_win,:)   =                         &
2417                             INT( water_pars(ind_w_at,water_type)           )
2418          surf_lsm_v(l)%albedo_type(ind_pav_green,:) =                         &
2419                             INT( pavement_pars(ind_p_at,pavement_type)     )
2420          surf_lsm_v(l)%emissivity  = emissivity
2421       ENDDO
2422!
2423!--    Allocate arrays for relative surface fraction.
2424!--    0 - vegetation fraction, 2 - water fraction, 1 - pavement fraction
2425       ALLOCATE( surf_lsm_h%frac(0:2,1:surf_lsm_h%ns) )
2426       surf_lsm_h%frac = 0.0_wp
2427       DO  l = 0, 3
2428          ALLOCATE( surf_lsm_v(l)%frac(0:2,1:surf_lsm_v(l)%ns) )
2429          surf_lsm_v(l)%frac = 0.0_wp
2430       ENDDO
2431!
2432!--    For vertical walls only - allocate special flag indicating if any building is on
2433!--    top of any natural surfaces. Used for initialization only.
2434       DO  l = 0, 3
2435          ALLOCATE( surf_lsm_v(l)%building_covered(1:surf_lsm_v(l)%ns) )
2436       ENDDO
2437!
2438!--    Allocate arrays for the respective types and their names on the surface
2439!--    elements. This will be required to treat deposition of chemical species.
2440       ALLOCATE( surf_lsm_h%pavement_type(1:surf_lsm_h%ns)   )
2441       ALLOCATE( surf_lsm_h%vegetation_type(1:surf_lsm_h%ns) )
2442       ALLOCATE( surf_lsm_h%water_type(1:surf_lsm_h%ns)      )
2443       
2444       surf_lsm_h%pavement_type   = 0
2445       surf_lsm_h%vegetation_type = 0
2446       surf_lsm_h%water_type      = 0
2447       
2448       ALLOCATE( surf_lsm_h%pavement_type_name(1:surf_lsm_h%ns)   )
2449       ALLOCATE( surf_lsm_h%vegetation_type_name(1:surf_lsm_h%ns) )
2450       ALLOCATE( surf_lsm_h%water_type_name(1:surf_lsm_h%ns)      )
2451       
2452       surf_lsm_h%pavement_type_name   = 'none'
2453       surf_lsm_h%vegetation_type_name = 'none'
2454       surf_lsm_h%water_type_name      = 'none'
2455       
2456       DO  l = 0, 3
2457          ALLOCATE( surf_lsm_v(l)%pavement_type(1:surf_lsm_v(l)%ns)   )
2458          ALLOCATE( surf_lsm_v(l)%vegetation_type(1:surf_lsm_v(l)%ns) )
2459          ALLOCATE( surf_lsm_v(l)%water_type(1:surf_lsm_v(l)%ns)      )
2460         
2461          surf_lsm_v(l)%pavement_type   = 0
2462          surf_lsm_v(l)%vegetation_type = 0
2463          surf_lsm_v(l)%water_type      = 0
2464       
2465          ALLOCATE( surf_lsm_v(l)%pavement_type_name(1:surf_lsm_v(l)%ns)   )
2466          ALLOCATE( surf_lsm_v(l)%vegetation_type_name(1:surf_lsm_v(l)%ns) )
2467          ALLOCATE( surf_lsm_v(l)%water_type_name(1:surf_lsm_v(l)%ns)      )
2468       
2469          surf_lsm_v(l)%pavement_type_name   = 'none'
2470          surf_lsm_v(l)%vegetation_type_name = 'none'
2471          surf_lsm_v(l)%water_type_name      = 'none'       
2472       ENDDO
2473       
2474!
2475!--    Set flag parameter for the prescribed surface type depending on user
2476!--    input. Set surface fraction to 1 for the respective type.
2477       SELECT CASE ( TRIM( surface_type ) )
2478         
2479          CASE ( 'vegetation' )
2480         
2481             surf_lsm_h%vegetation_surface = .TRUE.
2482             surf_lsm_h%frac(ind_veg_wall,:) = 1.0_wp
2483             DO  l = 0, 3
2484                surf_lsm_v(l)%vegetation_surface = .TRUE.
2485                surf_lsm_v(l)%frac(ind_veg_wall,:) = 1.0_wp
2486             ENDDO
2487   
2488          CASE ( 'water' )
2489             
2490             surf_lsm_h%water_surface = .TRUE.
2491             surf_lsm_h%frac(ind_wat_win,:) = 1.0_wp
2492!
2493!--          Note, vertical water surface does not really make sense.
2494             DO  l = 0, 3 
2495                surf_lsm_v(l)%water_surface   = .TRUE.
2496                surf_lsm_v(l)%frac(ind_wat_win,:) = 1.0_wp
2497             ENDDO
2498
2499          CASE ( 'pavement' )
2500             
2501             surf_lsm_h%pavement_surface = .TRUE.
2502                surf_lsm_h%frac(ind_pav_green,:) = 1.0_wp
2503             DO  l = 0, 3
2504                surf_lsm_v(l)%pavement_surface   = .TRUE.
2505                surf_lsm_v(l)%frac(ind_pav_green,:) = 1.0_wp
2506             ENDDO
2507
2508          CASE ( 'netcdf' )
2509
2510             DO  m = 1, surf_lsm_h%ns
2511                i = surf_lsm_h%i(m)
2512                j = surf_lsm_h%j(m)
2513                IF ( vegetation_type_f%var(j,i) /= vegetation_type_f%fill )    &
2514                   surf_lsm_h%vegetation_surface(m) = .TRUE.
2515                IF ( pavement_type_f%var(j,i)   /= pavement_type_f%fill )      &
2516                   surf_lsm_h%pavement_surface(m) = .TRUE.
2517                IF ( water_type_f%var(j,i)      /= water_type_f%fill )         &
2518                   surf_lsm_h%water_surface(m) = .TRUE.
2519!
2520!--             Check if at least one type is set.
2521                IF ( .NOT. surf_lsm_h%vegetation_surface(m)  .AND.             &
2522                     .NOT. surf_lsm_h%pavement_surface(m)    .AND.             &
2523                     .NOT. surf_lsm_h%water_surface(m) )  THEN
2524                   WRITE( message_string, * ) 'Horizontal surface element ' // &
2525                                       ' at i, j = ',  i, j,                   &
2526                                       ' is neither a vegetation, ' //         &
2527                                       'pavement, nor a water surface.'
2528                   CALL message( 'land_surface_model_mod', 'PA0619',          &
2529                                  2, 2, myid, 6, 0 )
2530                ENDIF
2531               
2532             ENDDO
2533!
2534!--          For vertical surfaces some special checks and treatment are
2535!--          required for correct initialization.
2536             DO  l = 0, 3
2537                DO  m = 1, surf_lsm_v(l)%ns
2538!
2539!--                Only for vertical surfaces. Check if at the grid point where
2540!--                the wall is defined (i+ioff, j+joff) is any building.
2541!--                This case, no natural surfaces properties will be defined at
2542!--                at this grid point, leading to problems in the initialization.
2543!--                To overcome this, define a special flag which
2544!--                indicates that a building is defined at the wall grid point 
2545!--                and take the surface properties from the adjoining grid
2546!--                point, i.e. without offset values.
2547!--                Further, there can occur a special case where elevation
2548!--                changes are larger than building heights. This case, (j,i)
2549!--                and (j+joff,i+ioff) grid points may be both covered by
2550!--                buildings, but vertical, but vertically natural walls may
2551!--                be located between the buildings. This case, it is not
2552!--                guaranteed that information about natural surface types is
2553!--                given, neither at (j,i) nor at (j+joff,i+ioff), again leading
2554!--                to non-initialized surface properties.
2555                   surf_lsm_v(l)%building_covered(m) = .FALSE.
2556!
2557!--                Wall grid point is building-covered. This case, set
2558!--                flag indicating that surface properties are initialized
2559!--                from neighboring reference grid point, which is not
2560!--                building_covered.
2561                   IF ( building_type_f%from_file )  THEN
2562                      i = surf_lsm_v(l)%i(m)
2563                      j = surf_lsm_v(l)%j(m)
2564                      IF ( building_type_f%var(j+surf_lsm_v(l)%joff,           &
2565                                               i+surf_lsm_v(l)%ioff) /=        &
2566                           building_type_f%fill )                              &
2567                         surf_lsm_v(l)%building_covered(m) = .TRUE.
2568!
2569!--                   Wall grid point as well as neighboring reference grid
2570!--                   point are both building-covered. This case, surface
2571!--                   properties are not necessarily defined (not covered by
2572!--                   checks for static input file) at this surface. Hence,
2573!--                   initialize surface properties by simply setting
2574!--                   vegetation_type_f to bare-soil bulk parametrization.
2575!--                   soil_type_f as well as surface_fractions_f will be set
2576!--                   also.                     
2577                      IF ( building_type_f%var(j+surf_lsm_v(l)%joff,           &
2578                                               i+surf_lsm_v(l)%ioff) /=        &
2579                           building_type_f%fill  .AND.                         &
2580                           building_type_f%var(j,i) /= building_type_f%fill )  &
2581                      THEN
2582                         vegetation_type_f%var(j,i)                 = 1 ! bare soil
2583                         soil_type_f%var_2d(j,i)                    = 1 
2584!                         
2585!--                      Set surface_fraction if provided in static input,
2586!--                      else, in case no tiles are used, this will be done
2587!--                      on basis of the prescribed types (vegetation/pavement/
2588!--                      water_type).
2589                         IF ( surface_fraction_f%from_file )  THEN
2590                            surface_fraction_f%frac(ind_veg_wall,j,i)  = 1.0_wp
2591                            surface_fraction_f%frac(ind_pav_green,j,i) = 0.0_wp
2592                            surface_fraction_f%frac(ind_wat_win,j,i)   = 0.0_wp
2593                         ENDIF
2594                      ENDIF
2595                     
2596                   ENDIF
2597!
2598!--                Normally proceed with setting surface types.
2599                   i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,      &
2600                                            surf_lsm_v(l)%building_covered(m) )
2601                   j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,      &
2602                                            surf_lsm_v(l)%building_covered(m) )
2603                   IF ( vegetation_type_f%var(j,i) /= vegetation_type_f%fill ) &
2604                      surf_lsm_v(l)%vegetation_surface(m) = .TRUE.
2605                   IF ( pavement_type_f%var(j,i)   /= pavement_type_f%fill )   &
2606                      surf_lsm_v(l)%pavement_surface(m) = .TRUE.
2607                   IF ( water_type_f%var(j,i)      /= water_type_f%fill )      &
2608                      surf_lsm_v(l)%water_surface(m) = .TRUE.
2609!
2610!--                Check if at least one type is set.
2611                   IF ( .NOT. surf_lsm_v(l)%vegetation_surface(m)  .AND.       &
2612                        .NOT. surf_lsm_v(l)%pavement_surface(m)    .AND.       &
2613                        .NOT. surf_lsm_v(l)%water_surface(m) )  THEN
2614                      WRITE( message_string, * ) 'Vertical surface element ' //&
2615                                       ' at i, j = ',  i, j,                   &
2616                                       ' is neither a vegetation, ' //         &
2617                                       'pavement, nor a water surface.'
2618                      CALL message( 'land_surface_model_mod', 'PA0619',        &
2619                                     2, 2, myid, 6, 0 )
2620                   ENDIF
2621                ENDDO
2622             ENDDO
2623
2624       END SELECT
2625!
2626!--    In case of netcdf input file, further initialize surface fractions.
2627!--    At the moment only 1 surface is given at a location, so that the fraction
2628!--    is either 0 or 1. This will be revised later. If surface fraction
2629!--    is not given in static input file, relative fractions will be derived
2630!--    from given surface type. In this case, only 1 type is given at a certain
2631!--    location (already checked). 
2632       IF ( input_pids_static  .AND.  surface_fraction_f%from_file )  THEN
2633          DO  m = 1, surf_lsm_h%ns
2634             i = surf_lsm_h%i(m)
2635             j = surf_lsm_h%j(m)
2636!
2637!--          0 - vegetation fraction, 1 - pavement fraction, 2 - water fraction             
2638             surf_lsm_h%frac(ind_veg_wall,m)  =                                &
2639                                    surface_fraction_f%frac(ind_veg_wall,j,i)         
2640             surf_lsm_h%frac(ind_pav_green,m) =                                &
2641                                    surface_fraction_f%frac(ind_pav_green,j,i)       
2642             surf_lsm_h%frac(ind_wat_win,m)   =                                &
2643                                    surface_fraction_f%frac(ind_wat_win,j,i)
2644
2645          ENDDO
2646          DO  l = 0, 3
2647             DO  m = 1, surf_lsm_v(l)%ns
2648                i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,         &
2649                                                surf_lsm_v(l)%building_covered(m) ) 
2650                j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,         &
2651                                                surf_lsm_v(l)%building_covered(m) ) 
2652!
2653!--             0 - vegetation fraction, 1 - pavement fraction, 2 - water fraction       
2654                surf_lsm_v(l)%frac(ind_veg_wall,m)  =                          &
2655                                    surface_fraction_f%frac(ind_veg_wall,j,i)         
2656                surf_lsm_v(l)%frac(ind_pav_green,m) =                          &
2657                                    surface_fraction_f%frac(ind_pav_green,j,i)       
2658                surf_lsm_v(l)%frac(ind_wat_win,m)   =                          &
2659                                    surface_fraction_f%frac(ind_wat_win,j,i)
2660
2661             ENDDO
2662          ENDDO
2663       ELSEIF ( input_pids_static  .AND.  .NOT. surface_fraction_f%from_file ) &
2664       THEN
2665          DO  m = 1, surf_lsm_h%ns
2666             i = surf_lsm_h%i(m)
2667             j = surf_lsm_h%j(m)
2668
2669             IF ( vegetation_type_f%var(j,i) /= vegetation_type_f%fill )       &       
2670                surf_lsm_h%frac(ind_veg_wall,m)  = 1.0_wp
2671             IF ( pavement_type_f%var(j,i)   /= pavement_type_f%fill   )       &       
2672                surf_lsm_h%frac(ind_pav_green,m) = 1.0_wp 
2673             IF ( water_type_f%var(j,i)      /= water_type_f%fill      )       &       
2674                surf_lsm_h%frac(ind_wat_win,m)   = 1.0_wp       
2675          ENDDO
2676          DO  l = 0, 3
2677             DO  m = 1, surf_lsm_v(l)%ns
2678                i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,         &
2679                                                surf_lsm_v(l)%building_covered(m) ) 
2680                j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,         &
2681                                                surf_lsm_v(l)%building_covered(m) ) 
2682     
2683                IF ( vegetation_type_f%var(j,i) /= vegetation_type_f%fill )    &       
2684                   surf_lsm_v(l)%frac(ind_veg_wall,m)  = 1.0_wp
2685                IF ( pavement_type_f%var(j,i)   /= pavement_type_f%fill   )    &       
2686                   surf_lsm_v(l)%frac(ind_pav_green,m) = 1.0_wp 
2687                IF ( water_type_f%var(j,i)      /= water_type_f%fill      )    &       
2688                   surf_lsm_v(l)%frac(ind_wat_win,m)   = 1.0_wp     
2689             ENDDO
2690          ENDDO
2691       ENDIF
2692!
2693!--    Level 1, initialization of soil parameters.
2694!--    It is possible to overwrite each parameter by setting the respecticy
2695!--    NAMELIST variable to a value /= 9999999.9.
2696       IF ( soil_type /= 0 )  THEN 
2697 
2698          IF ( alpha_vangenuchten == 9999999.9_wp )  THEN
2699             alpha_vangenuchten = soil_pars(0,soil_type)
2700          ENDIF
2701
2702          IF ( l_vangenuchten == 9999999.9_wp )  THEN
2703             l_vangenuchten = soil_pars(1,soil_type)
2704          ENDIF
2705
2706          IF ( n_vangenuchten == 9999999.9_wp )  THEN
2707             n_vangenuchten = soil_pars(2,soil_type)           
2708          ENDIF
2709
2710          IF ( hydraulic_conductivity == 9999999.9_wp )  THEN
2711             hydraulic_conductivity = soil_pars(3,soil_type)           
2712          ENDIF
2713
2714          IF ( saturation_moisture == 9999999.9_wp )  THEN
2715             saturation_moisture = soil_pars(4,soil_type)           
2716          ENDIF
2717
2718          IF ( field_capacity == 9999999.9_wp )  THEN
2719             field_capacity = soil_pars(5,soil_type)           
2720          ENDIF
2721
2722          IF ( wilting_point == 9999999.9_wp )  THEN
2723             wilting_point = soil_pars(6,soil_type)           
2724          ENDIF
2725
2726          IF ( residual_moisture == 9999999.9_wp )  THEN
2727             residual_moisture = soil_pars(7,soil_type)       
2728          ENDIF
2729
2730       ENDIF
2731!
2732!--    Map values to the respective 2D/3D arrays
2733!--    Horizontal surfaces
2734       surf_lsm_h%alpha_vg      = alpha_vangenuchten
2735       surf_lsm_h%l_vg          = l_vangenuchten
2736       surf_lsm_h%n_vg          = n_vangenuchten 
2737       surf_lsm_h%gamma_w_sat   = hydraulic_conductivity
2738       surf_lsm_h%m_sat         = saturation_moisture
2739       surf_lsm_h%m_fc          = field_capacity
2740       surf_lsm_h%m_wilt        = wilting_point
2741       surf_lsm_h%m_res         = residual_moisture
2742       surf_lsm_h%r_soil_min    = min_soil_resistance
2743!
2744!--    Vertical surfaces
2745       DO  l = 0, 3
2746          surf_lsm_v(l)%alpha_vg      = alpha_vangenuchten
2747          surf_lsm_v(l)%l_vg          = l_vangenuchten
2748          surf_lsm_v(l)%n_vg          = n_vangenuchten 
2749          surf_lsm_v(l)%gamma_w_sat   = hydraulic_conductivity
2750          surf_lsm_v(l)%m_sat         = saturation_moisture
2751          surf_lsm_v(l)%m_fc          = field_capacity
2752          surf_lsm_v(l)%m_wilt        = wilting_point
2753          surf_lsm_v(l)%m_res         = residual_moisture
2754          surf_lsm_v(l)%r_soil_min    = min_soil_resistance
2755       ENDDO
2756!
2757!--    Level 2, initialization of soil parameters via soil_type read from file.
2758!--    Soil parameters are initialized for each (y,x)-grid point
2759!--    individually using default paramter settings according to the given
2760!--    soil type.
2761       IF ( soil_type_f%from_file )  THEN
2762!
2763!--       Level of detail = 1, i.e. a homogeneous soil distribution along the
2764!--       vertical dimension is assumed.
2765          IF ( soil_type_f%lod == 1 )  THEN
2766!
2767!--          Horizontal surfaces
2768             DO  m = 1, surf_lsm_h%ns
2769                i = surf_lsm_h%i(m)
2770                j = surf_lsm_h%j(m)
2771             
2772                st = soil_type_f%var_2d(j,i)
2773                IF ( st /= soil_type_f%fill )  THEN
2774                   surf_lsm_h%alpha_vg(:,m)    = soil_pars(0,st)
2775                   surf_lsm_h%l_vg(:,m)        = soil_pars(1,st)
2776                   surf_lsm_h%n_vg(:,m)        = soil_pars(2,st)
2777                   surf_lsm_h%gamma_w_sat(:,m) = soil_pars(3,st)
2778                   surf_lsm_h%m_sat(:,m)       = soil_pars(4,st)
2779                   surf_lsm_h%m_fc(:,m)        = soil_pars(5,st)
2780                   surf_lsm_h%m_wilt(:,m)      = soil_pars(6,st)
2781                   surf_lsm_h%m_res(:,m)       = soil_pars(7,st)
2782                ENDIF
2783             ENDDO
2784!
2785!--          Vertical surfaces ( assumes the soil type given at respective (x,y)
2786             DO  l = 0, 3
2787                DO  m = 1, surf_lsm_v(l)%ns
2788                   i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,      &
2789                                                   surf_lsm_v(l)%building_covered(m) ) 
2790                   j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,      &
2791                                                   surf_lsm_v(l)%building_covered(m) ) 
2792
2793                   st = soil_type_f%var_2d(j,i)
2794                   IF ( st /= soil_type_f%fill )  THEN
2795                      surf_lsm_v(l)%alpha_vg(:,m)    = soil_pars(0,st)
2796                      surf_lsm_v(l)%l_vg(:,m)        = soil_pars(1,st)
2797                      surf_lsm_v(l)%n_vg(:,m)        = soil_pars(2,st)
2798                      surf_lsm_v(l)%gamma_w_sat(:,m) = soil_pars(3,st)
2799                      surf_lsm_v(l)%m_sat(:,m)       = soil_pars(4,st)
2800                      surf_lsm_v(l)%m_fc(:,m)        = soil_pars(5,st)
2801                      surf_lsm_v(l)%m_wilt(:,m)      = soil_pars(6,st)
2802                      surf_lsm_v(l)%m_res(:,m)       = soil_pars(7,st)
2803                   ENDIF
2804                ENDDO
2805             ENDDO
2806!
2807!--       Level of detail = 2, i.e. soil type and thus the soil parameters
2808!--       can be heterogeneous along the vertical dimension.
2809          ELSE
2810!
2811!--          Horizontal surfaces
2812             DO  m = 1, surf_lsm_h%ns
2813                i = surf_lsm_h%i(m)
2814                j = surf_lsm_h%j(m)
2815             
2816                DO  k = nzb_soil, nzt_soil
2817                   st = soil_type_f%var_3d(k,j,i)
2818                   IF ( st /= soil_type_f%fill )  THEN
2819                      surf_lsm_h%alpha_vg(k,m)    = soil_pars(0,st)
2820                      surf_lsm_h%l_vg(k,m)        = soil_pars(1,st)
2821                      surf_lsm_h%n_vg(k,m)        = soil_pars(2,st)
2822                      surf_lsm_h%gamma_w_sat(k,m) = soil_pars(3,st)
2823                      surf_lsm_h%m_sat(k,m)       = soil_pars(4,st)
2824                      surf_lsm_h%m_fc(k,m)        = soil_pars(5,st)
2825                      surf_lsm_h%m_wilt(k,m)      = soil_pars(6,st)
2826                      surf_lsm_h%m_res(k,m)       = soil_pars(7,st)
2827                   ENDIF
2828                ENDDO
2829             ENDDO
2830!
2831!--          Vertical surfaces ( assumes the soil type given at respective (x,y)
2832             DO  l = 0, 3
2833                DO  m = 1, surf_lsm_v(l)%ns
2834                   i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,      &
2835                                                   surf_lsm_v(l)%building_covered(m) ) 
2836                   j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,      &
2837                                                   surf_lsm_v(l)%building_covered(m) ) 
2838
2839                   DO  k = nzb_soil, nzt_soil
2840                      st = soil_type_f%var_3d(k,j,i)
2841                      IF ( st /= soil_type_f%fill )  THEN
2842                         surf_lsm_v(l)%alpha_vg(k,m)    = soil_pars(0,st)
2843                         surf_lsm_v(l)%l_vg(k,m)        = soil_pars(1,st)
2844                         surf_lsm_v(l)%n_vg(k,m)        = soil_pars(2,st)
2845                         surf_lsm_v(l)%gamma_w_sat(k,m) = soil_pars(3,st)
2846                         surf_lsm_v(l)%m_sat(k,m)       = soil_pars(4,st)
2847                         surf_lsm_v(l)%m_fc(k,m)        = soil_pars(5,st)
2848                         surf_lsm_v(l)%m_wilt(k,m)      = soil_pars(6,st)
2849                         surf_lsm_v(l)%m_res(k,m)       = soil_pars(7,st)
2850                      ENDIF
2851                   ENDDO
2852                ENDDO
2853             ENDDO
2854          ENDIF
2855       ENDIF
2856!
2857!--    Level 3, initialization of single soil parameters at single z,x,y
2858!--    position via soil_pars read from file.
2859       IF ( soil_pars_f%from_file )  THEN
2860!
2861!--       Level of detail = 1, i.e. a homogeneous vertical distribution of soil
2862!--       parameters is assumed.
2863!--       Horizontal surfaces
2864          IF ( soil_pars_f%lod == 1 )  THEN
2865!
2866!--          Horizontal surfaces
2867             DO  m = 1, surf_lsm_h%ns
2868                i = surf_lsm_h%i(m)
2869                j = surf_lsm_h%j(m)
2870
2871                IF ( soil_pars_f%pars_xy(0,j,i) /= soil_pars_f%fill )              &
2872                   surf_lsm_h%alpha_vg(:,m)    = soil_pars_f%pars_xy(0,j,i)
2873                IF ( soil_pars_f%pars_xy(1,j,i) /= soil_pars_f%fill )              &
2874                   surf_lsm_h%l_vg(:,m)        = soil_pars_f%pars_xy(1,j,i)
2875                IF ( soil_pars_f%pars_xy(2,j,i) /= soil_pars_f%fill )              &
2876                   surf_lsm_h%n_vg(:,m)        = soil_pars_f%pars_xy(2,j,i)
2877                IF ( soil_pars_f%pars_xy(3,j,i) /= soil_pars_f%fill )              &
2878                   surf_lsm_h%gamma_w_sat(:,m) = soil_pars_f%pars_xy(3,j,i)
2879                IF ( soil_pars_f%pars_xy(4,j,i) /= soil_pars_f%fill )              &
2880                   surf_lsm_h%m_sat(:,m)       = soil_pars_f%pars_xy(4,j,i)
2881                IF ( soil_pars_f%pars_xy(5,j,i) /= soil_pars_f%fill )              &
2882                   surf_lsm_h%m_fc(:,m)        = soil_pars_f%pars_xy(5,j,i)
2883                IF ( soil_pars_f%pars_xy(6,j,i) /= soil_pars_f%fill )              &
2884                   surf_lsm_h%m_wilt(:,m)      = soil_pars_f%pars_xy(6,j,i)
2885                IF ( soil_pars_f%pars_xy(7,j,i) /= soil_pars_f%fill )              &
2886                   surf_lsm_h%m_res(:,m)       = soil_pars_f%pars_xy(7,j,i)
2887
2888             ENDDO
2889!
2890!--          Vertical surfaces
2891             DO  l = 0, 3
2892                DO  m = 1, surf_lsm_v(l)%ns
2893                   i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,      &
2894                                                   surf_lsm_v(l)%building_covered(m) ) 
2895                   j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,      &
2896                                                   surf_lsm_v(l)%building_covered(m) ) 
2897
2898                   IF ( soil_pars_f%pars_xy(0,j,i) /= soil_pars_f%fill )           &
2899                      surf_lsm_v(l)%alpha_vg(:,m)    = soil_pars_f%pars_xy(0,j,i)
2900                   IF ( soil_pars_f%pars_xy(1,j,i) /= soil_pars_f%fill )           &
2901                      surf_lsm_v(l)%l_vg(:,m)        = soil_pars_f%pars_xy(1,j,i)
2902                   IF ( soil_pars_f%pars_xy(2,j,i) /= soil_pars_f%fill )           &
2903                      surf_lsm_v(l)%n_vg(:,m)        = soil_pars_f%pars_xy(2,j,i)
2904                   IF ( soil_pars_f%pars_xy(3,j,i) /= soil_pars_f%fill )           &
2905                      surf_lsm_v(l)%gamma_w_sat(:,m) = soil_pars_f%pars_xy(3,j,i)
2906                   IF ( soil_pars_f%pars_xy(4,j,i) /= soil_pars_f%fill )           &
2907                      surf_lsm_v(l)%m_sat(:,m)       = soil_pars_f%pars_xy(4,j,i)
2908                   IF ( soil_pars_f%pars_xy(5,j,i) /= soil_pars_f%fill )           &
2909                      surf_lsm_v(l)%m_fc(:,m)        = soil_pars_f%pars_xy(5,j,i)
2910                   IF ( soil_pars_f%pars_xy(6,j,i) /= soil_pars_f%fill )           &
2911                      surf_lsm_v(l)%m_wilt(:,m)      = soil_pars_f%pars_xy(6,j,i)
2912                   IF ( soil_pars_f%pars_xy(7,j,i) /= soil_pars_f%fill )           &
2913                      surf_lsm_v(l)%m_res(:,m)       = soil_pars_f%pars_xy(7,j,i)
2914
2915                ENDDO
2916             ENDDO
2917!
2918!--       Level of detail = 2, i.e. soil parameters can be set at each soil
2919!--       layer individually.
2920          ELSE
2921!
2922!--          Horizontal surfaces
2923             DO  m = 1, surf_lsm_h%ns
2924                i = surf_lsm_h%i(m)
2925                j = surf_lsm_h%j(m)
2926
2927                DO  k = nzb_soil, nzt_soil
2928                   IF ( soil_pars_f%pars_xyz(0,k,j,i) /= soil_pars_f%fill )        &
2929                      surf_lsm_h%alpha_vg(k,m)    = soil_pars_f%pars_xyz(0,k,j,i)
2930                   IF ( soil_pars_f%pars_xyz(1,k,j,i) /= soil_pars_f%fill )        &
2931                      surf_lsm_h%l_vg(k,m)        = soil_pars_f%pars_xyz(1,k,j,i)
2932                   IF ( soil_pars_f%pars_xyz(2,k,j,i) /= soil_pars_f%fill )        &
2933                      surf_lsm_h%n_vg(k,m)        = soil_pars_f%pars_xyz(2,k,j,i)
2934                   IF ( soil_pars_f%pars_xyz(3,k,j,i) /= soil_pars_f%fill )        &
2935                      surf_lsm_h%gamma_w_sat(k,m) = soil_pars_f%pars_xyz(3,k,j,i)
2936                   IF ( soil_pars_f%pars_xyz(4,k,j,i) /= soil_pars_f%fill )        &
2937                      surf_lsm_h%m_sat(k,m)       = soil_pars_f%pars_xyz(4,k,j,i)
2938                   IF ( soil_pars_f%pars_xyz(5,k,j,i) /= soil_pars_f%fill )        &
2939                      surf_lsm_h%m_fc(k,m)        = soil_pars_f%pars_xyz(5,k,j,i)
2940                   IF ( soil_pars_f%pars_xyz(6,k,j,i) /= soil_pars_f%fill )        &
2941                      surf_lsm_h%m_wilt(k,m)      = soil_pars_f%pars_xyz(6,k,j,i)
2942                   IF ( soil_pars_f%pars_xyz(7,k,j,i) /= soil_pars_f%fill )        &
2943                      surf_lsm_h%m_res(k,m)       = soil_pars_f%pars_xyz(7,k,j,i)
2944                ENDDO
2945
2946             ENDDO
2947!
2948!--          Vertical surfaces
2949             DO  l = 0, 3
2950                DO  m = 1, surf_lsm_v(l)%ns
2951                   i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,      &
2952                                                   surf_lsm_v(l)%building_covered(m) ) 
2953                   j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,      &
2954                                                   surf_lsm_v(l)%building_covered(m) ) 
2955
2956                   DO  k = nzb_soil, nzt_soil
2957                      IF ( soil_pars_f%pars_xyz(0,k,j,i) /= soil_pars_f%fill )        &
2958                         surf_lsm_v(l)%alpha_vg(k,m)    = soil_pars_f%pars_xyz(0,k,j,i)
2959                      IF ( soil_pars_f%pars_xyz(1,k,j,i) /= soil_pars_f%fill )        &
2960                         surf_lsm_v(l)%l_vg(k,m)        = soil_pars_f%pars_xyz(1,k,j,i)
2961                      IF ( soil_pars_f%pars_xyz(2,k,j,i) /= soil_pars_f%fill )        &
2962                         surf_lsm_v(l)%n_vg(k,m)        = soil_pars_f%pars_xyz(2,k,j,i)
2963                      IF ( soil_pars_f%pars_xyz(3,k,j,i) /= soil_pars_f%fill )        &
2964                         surf_lsm_v(l)%gamma_w_sat(k,m) = soil_pars_f%pars_xyz(3,k,j,i)
2965                      IF ( soil_pars_f%pars_xyz(4,k,j,i) /= soil_pars_f%fill )        &
2966                         surf_lsm_v(l)%m_sat(k,m)       = soil_pars_f%pars_xyz(4,k,j,i)
2967                      IF ( soil_pars_f%pars_xyz(5,k,j,i) /= soil_pars_f%fill )        &
2968                         surf_lsm_v(l)%m_fc(k,m)        = soil_pars_f%pars_xyz(5,k,j,i)
2969                      IF ( soil_pars_f%pars_xyz(6,k,j,i) /= soil_pars_f%fill )        &
2970                         surf_lsm_v(l)%m_wilt(k,m)      = soil_pars_f%pars_xyz(6,k,j,i)
2971                      IF ( soil_pars_f%pars_xyz(7,k,j,i) /= soil_pars_f%fill )        &
2972                         surf_lsm_v(l)%m_res(k,m)       = soil_pars_f%pars_xyz(7,k,j,i)
2973                   ENDDO
2974
2975                ENDDO
2976             ENDDO
2977
2978          ENDIF
2979       ENDIF
2980
2981!
2982!--    Level 1, initialization of vegetation parameters. A horizontally
2983!--    homogeneous distribution is assumed here.
2984       IF ( vegetation_type /= 0 )  THEN
2985
2986          IF ( min_canopy_resistance == 9999999.9_wp )  THEN
2987             min_canopy_resistance = vegetation_pars(ind_v_rc_min,vegetation_type)
2988          ENDIF
2989
2990          IF ( leaf_area_index == 9999999.9_wp )  THEN
2991             leaf_area_index = vegetation_pars(ind_v_rc_lai,vegetation_type)         
2992          ENDIF
2993
2994          IF ( vegetation_coverage == 9999999.9_wp )  THEN
2995             vegetation_coverage = vegetation_pars(ind_v_c_veg,vegetation_type)     
2996          ENDIF
2997
2998          IF ( canopy_resistance_coefficient == 9999999.9_wp )  THEN
2999              canopy_resistance_coefficient= vegetation_pars(ind_v_gd,vegetation_type)     
3000          ENDIF
3001
3002          IF ( z0_vegetation == 9999999.9_wp )  THEN
3003             z0_vegetation  = vegetation_pars(ind_v_z0,vegetation_type) 
3004          ENDIF
3005
3006          IF ( z0h_vegetation == 9999999.9_wp )  THEN
3007             z0h_vegetation = vegetation_pars(ind_v_z0qh,vegetation_type)
3008          ENDIF
3009         
3010          IF ( z0q_vegetation == 9999999.9_wp )  THEN
3011             z0q_vegetation = vegetation_pars(ind_v_z0qh,vegetation_type)
3012          ENDIF
3013         
3014          IF ( lambda_surface_stable == 9999999.9_wp )  THEN
3015             lambda_surface_stable = vegetation_pars(ind_v_lambda_s,vegetation_type) 
3016          ENDIF
3017
3018          IF ( lambda_surface_unstable == 9999999.9_wp )  THEN
3019             lambda_surface_unstable = vegetation_pars(ind_v_lambda_u,vegetation_type)           
3020          ENDIF
3021
3022          IF ( f_shortwave_incoming == 9999999.9_wp )  THEN
3023             f_shortwave_incoming = vegetation_pars(ind_v_f_sw_in,vegetation_type)       
3024          ENDIF
3025
3026          IF ( c_surface == 9999999.9_wp )  THEN
3027             c_surface = vegetation_pars(ind_v_c_surf,vegetation_type)       
3028          ENDIF
3029
3030          IF ( albedo_type == 9999999  .AND.  albedo == 9999999.9_wp )  THEN
3031             albedo_type = INT(vegetation_pars(ind_v_at,vegetation_type))       
3032          ENDIF
3033   
3034          IF ( emissivity == 9999999.9_wp )  THEN
3035             emissivity = vegetation_pars(ind_v_emis,vegetation_type)     
3036          ENDIF
3037
3038       ENDIF
3039!
3040!--    Map values onto horizontal elemements
3041       DO  m = 1, surf_lsm_h%ns
3042          IF ( surf_lsm_h%vegetation_surface(m) )  THEN
3043             surf_lsm_h%r_canopy_min(m)     = min_canopy_resistance
3044             surf_lsm_h%lai(m)              = leaf_area_index
3045             surf_lsm_h%c_veg(m)            = vegetation_coverage
3046             surf_lsm_h%g_d(m)              = canopy_resistance_coefficient
3047             surf_lsm_h%z0(m)               = z0_vegetation
3048             surf_lsm_h%z0h(m)              = z0h_vegetation
3049             surf_lsm_h%z0q(m)              = z0q_vegetation
3050             surf_lsm_h%lambda_surface_s(m) = lambda_surface_stable
3051             surf_lsm_h%lambda_surface_u(m) = lambda_surface_unstable
3052             surf_lsm_h%f_sw_in(m)          = f_shortwave_incoming
3053             surf_lsm_h%c_surface(m)        = c_surface
3054             surf_lsm_h%albedo_type(ind_veg_wall,m) = albedo_type
3055             surf_lsm_h%emissivity(ind_veg_wall,m)  = emissivity
3056             
3057             surf_lsm_h%vegetation_type(m)      = vegetation_type
3058             surf_lsm_h%vegetation_type_name(m) = vegetation_type_name(vegetation_type)
3059          ELSE
3060             surf_lsm_h%lai(m)   = 0.0_wp
3061             surf_lsm_h%c_veg(m) = 0.0_wp
3062             surf_lsm_h%g_d(m)   = 0.0_wp
3063          ENDIF
3064 
3065       ENDDO
3066!
3067!--    Map values onto vertical elements, even though this does not make
3068!--    much sense.
3069       DO  l = 0, 3
3070          DO  m = 1, surf_lsm_v(l)%ns
3071             IF ( surf_lsm_v(l)%vegetation_surface(m) )  THEN
3072                surf_lsm_v(l)%r_canopy_min(m)     = min_canopy_resistance
3073                surf_lsm_v(l)%lai(m)              = leaf_area_index
3074                surf_lsm_v(l)%c_veg(m)            = vegetation_coverage
3075                surf_lsm_v(l)%g_d(m)              = canopy_resistance_coefficient
3076                surf_lsm_v(l)%z0(m)               = z0_vegetation
3077                surf_lsm_v(l)%z0h(m)              = z0h_vegetation
3078                surf_lsm_v(l)%z0q(m)              = z0q_vegetation
3079                surf_lsm_v(l)%lambda_surface_s(m) = lambda_surface_stable
3080                surf_lsm_v(l)%lambda_surface_u(m) = lambda_surface_unstable
3081                surf_lsm_v(l)%f_sw_in(m)          = f_shortwave_incoming
3082                surf_lsm_v(l)%c_surface(m)        = c_surface
3083                surf_lsm_v(l)%albedo_type(ind_veg_wall,m) = albedo_type
3084                surf_lsm_v(l)%emissivity(ind_veg_wall,m)  = emissivity
3085               
3086                surf_lsm_v(l)%vegetation_type(m)      = vegetation_type
3087                surf_lsm_v(l)%vegetation_type_name(m) = vegetation_type_name(vegetation_type)
3088             ELSE
3089                surf_lsm_v(l)%lai(m)   = 0.0_wp
3090                surf_lsm_v(l)%c_veg(m) = 0.0_wp
3091                surf_lsm_v(l)%g_d(m)   = 0.0_wp
3092             ENDIF
3093          ENDDO
3094       ENDDO
3095
3096!
3097!--    Level 2, initialization of vegation parameters via vegetation_type read
3098!--    from file. Vegetation parameters are initialized for each (y,x)-grid point
3099!--    individually using default paramter settings according to the given
3100!--    vegetation type.
3101       IF ( vegetation_type_f%from_file )  THEN
3102!
3103!--       Horizontal surfaces
3104          DO  m = 1, surf_lsm_h%ns
3105             i = surf_lsm_h%i(m)
3106             j = surf_lsm_h%j(m)
3107             
3108             st = vegetation_type_f%var(j,i)
3109             IF ( st /= vegetation_type_f%fill  .AND.  st /= 0 )  THEN
3110                surf_lsm_h%r_canopy_min(m)     = vegetation_pars(ind_v_rc_min,st)
3111                surf_lsm_h%lai(m)              = vegetation_pars(ind_v_rc_lai,st)
3112                surf_lsm_h%c_veg(m)            = vegetation_pars(ind_v_c_veg,st)
3113                surf_lsm_h%g_d(m)              = vegetation_pars(ind_v_gd,st)
3114                surf_lsm_h%z0(m)               = vegetation_pars(ind_v_z0,st)
3115                surf_lsm_h%z0h(m)              = vegetation_pars(ind_v_z0qh,st)
3116                surf_lsm_h%z0q(m)              = vegetation_pars(ind_v_z0qh,st)
3117                surf_lsm_h%lambda_surface_s(m) = vegetation_pars(ind_v_lambda_s,st)
3118                surf_lsm_h%lambda_surface_u(m) = vegetation_pars(ind_v_lambda_u,st)
3119                surf_lsm_h%f_sw_in(m)          = vegetation_pars(ind_v_f_sw_in,st)
3120                surf_lsm_h%c_surface(m)        = vegetation_pars(ind_v_c_surf,st)
3121                surf_lsm_h%albedo_type(ind_veg_wall,m) = INT( vegetation_pars(ind_v_at,st) )
3122                surf_lsm_h%emissivity(ind_veg_wall,m)  = vegetation_pars(ind_v_emis,st)
3123               
3124                surf_lsm_h%vegetation_type(m)      = st
3125                surf_lsm_h%vegetation_type_name(m) = vegetation_type_name(st)
3126             ENDIF
3127          ENDDO
3128!
3129!--       Vertical surfaces
3130          DO  l = 0, 3
3131             DO  m = 1, surf_lsm_v(l)%ns
3132                i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,         &
3133                                                surf_lsm_v(l)%building_covered(m) ) 
3134                j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,      &
3135                                                surf_lsm_v(l)%building_covered(m) ) 
3136             
3137                st = vegetation_type_f%var(j,i)
3138                IF ( st /= vegetation_type_f%fill  .AND.  st /= 0 )  THEN
3139                   surf_lsm_v(l)%r_canopy_min(m)     = vegetation_pars(ind_v_rc_min,st)
3140                   surf_lsm_v(l)%lai(m)              = vegetation_pars(ind_v_rc_lai,st)
3141                   surf_lsm_v(l)%c_veg(m)            = vegetation_pars(ind_v_c_veg,st)
3142                   surf_lsm_v(l)%g_d(m)              = vegetation_pars(ind_v_gd,st)
3143                   surf_lsm_v(l)%z0(m)               = vegetation_pars(ind_v_z0,st)
3144                   surf_lsm_v(l)%z0h(m)              = vegetation_pars(ind_v_z0qh,st)
3145                   surf_lsm_v(l)%z0q(m)              = vegetation_pars(ind_v_z0qh,st)
3146                   surf_lsm_v(l)%lambda_surface_s(m) = vegetation_pars(ind_v_lambda_s,st)
3147                   surf_lsm_v(l)%lambda_surface_u(m) = vegetation_pars(ind_v_lambda_u,st)
3148                   surf_lsm_v(l)%f_sw_in(m)          = vegetation_pars(ind_v_f_sw_in,st)
3149                   surf_lsm_v(l)%c_surface(m)        = vegetation_pars(ind_v_c_surf,st)
3150                   surf_lsm_v(l)%albedo_type(ind_veg_wall,m) = INT( vegetation_pars(ind_v_at,st) )
3151                   surf_lsm_v(l)%emissivity(ind_veg_wall,m)  = vegetation_pars(ind_v_emis,st)
3152                   
3153                   surf_lsm_v(l)%vegetation_type(m)      = st
3154                   surf_lsm_v(l)%vegetation_type_name(m) = vegetation_type_name(st)
3155                ENDIF
3156             ENDDO
3157          ENDDO
3158       ENDIF
3159!
3160!--    Level 3, initialization of vegation parameters at single (x,y)
3161!--    position via vegetation_pars read from file.
3162       IF ( vegetation_pars_f%from_file )  THEN
3163!
3164!--       Horizontal surfaces
3165          DO  m = 1, surf_lsm_h%ns
3166
3167             i = surf_lsm_h%i(m)
3168             j = surf_lsm_h%j(m)
3169!
3170!--          If surface element is not a vegetation surface and any value in
3171!--          vegetation_pars is given, neglect this information and give an
3172!--          informative message that this value will not be used.   
3173             IF ( .NOT. surf_lsm_h%vegetation_surface(m)  .AND.                &
3174                   ANY( vegetation_pars_f%pars_xy(:,j,i) /=                    &
3175                   vegetation_pars_f%fill ) )  THEN
3176                WRITE( message_string, * )                                     &
3177                                 'surface element at grid point (j,i) = (',    &
3178                                 j, i, ') is not a vegetation surface, ',      &
3179                                 'so that information given in ',              &
3180                                 'vegetation_pars at this point is neglected.' 
3181                CALL message( 'land_surface_model_mod', 'PA0436', 0, 0, myid, 6, 0 )
3182             ELSE
3183
3184                IF ( vegetation_pars_f%pars_xy(ind_v_rc_min,j,i) /=            &
3185                     vegetation_pars_f%fill )                                  &
3186                   surf_lsm_h%r_canopy_min(m)  =                               &
3187                                   vegetation_pars_f%pars_xy(ind_v_rc_min,j,i)
3188                IF ( vegetation_pars_f%pars_xy(ind_v_rc_lai,j,i) /=            &
3189                     vegetation_pars_f%fill )                                  &
3190                   surf_lsm_h%lai(m)           =                               &
3191                                   vegetation_pars_f%pars_xy(ind_v_rc_lai,j,i)
3192                IF ( vegetation_pars_f%pars_xy(ind_v_c_veg,j,i) /=             &
3193                     vegetation_pars_f%fill )                                  &
3194                   surf_lsm_h%c_veg(m)         =                               &
3195                                   vegetation_pars_f%pars_xy(ind_v_c_veg,j,i)
3196                IF ( vegetation_pars_f%pars_xy(ind_v_gd,j,i) /=                &
3197                     vegetation_pars_f%fill )                                  &
3198                   surf_lsm_h%g_d(m)           =                               &
3199                                   vegetation_pars_f%pars_xy(ind_v_gd,j,i)
3200                IF ( vegetation_pars_f%pars_xy(ind_v_z0,j,i) /=                &
3201                     vegetation_pars_f%fill )                                  &
3202                   surf_lsm_h%z0(m)            =                               &
3203                                   vegetation_pars_f%pars_xy(ind_v_z0,j,i)
3204                IF ( vegetation_pars_f%pars_xy(ind_v_z0qh,j,i) /=              &
3205                     vegetation_pars_f%fill )  THEN
3206                   surf_lsm_h%z0h(m)           =                               &
3207                                   vegetation_pars_f%pars_xy(ind_v_z0qh,j,i)
3208                   surf_lsm_h%z0q(m)           =                               &
3209                                   vegetation_pars_f%pars_xy(ind_v_z0qh,j,i)
3210                ENDIF
3211                IF ( vegetation_pars_f%pars_xy(ind_v_lambda_s,j,i) /=          &
3212                     vegetation_pars_f%fill )                                  &
3213                   surf_lsm_h%lambda_surface_s(m) =                            &
3214                                   vegetation_pars_f%pars_xy(ind_v_lambda_s,j,i)
3215                IF ( vegetation_pars_f%pars_xy(ind_v_lambda_u,j,i) /=          &
3216                     vegetation_pars_f%fill )                                  &
3217                   surf_lsm_h%lambda_surface_u(m) =                            &
3218                                   vegetation_pars_f%pars_xy(ind_v_lambda_u,j,i)
3219                IF ( vegetation_pars_f%pars_xy(ind_v_f_sw_in,j,i) /=           &
3220                     vegetation_pars_f%fill )                                  &
3221                   surf_lsm_h%f_sw_in(m)          =                            &
3222                                   vegetation_pars_f%pars_xy(ind_v_f_sw_in,j,i)
3223                IF ( vegetation_pars_f%pars_xy(ind_v_c_surf,j,i) /=            &
3224                     vegetation_pars_f%fill )                                  &
3225                   surf_lsm_h%c_surface(m)        =                            &
3226                                   vegetation_pars_f%pars_xy(ind_v_c_surf,j,i)
3227                IF ( vegetation_pars_f%pars_xy(ind_v_at,j,i) /=                &
3228                     vegetation_pars_f%fill )                                  &
3229                   surf_lsm_h%albedo_type(ind_veg_wall,m) =                    &
3230                                   INT( vegetation_pars_f%pars_xy(ind_v_at,j,i) )
3231                IF ( vegetation_pars_f%pars_xy(ind_v_emis,j,i) /=              &
3232                     vegetation_pars_f%fill )                                  &
3233                   surf_lsm_h%emissivity(ind_veg_wall,m)  =                    &
3234                                   vegetation_pars_f%pars_xy(ind_v_emis,j,i)
3235             ENDIF
3236          ENDDO
3237!
3238!--       Vertical surfaces
3239          DO  l = 0, 3
3240             DO  m = 1, surf_lsm_v(l)%ns
3241                i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,         &
3242                                                surf_lsm_v(l)%building_covered(m) ) 
3243                j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,         &
3244                                                surf_lsm_v(l)%building_covered(m) ) 
3245!
3246!--             If surface element is not a vegetation surface and any value in
3247!--             vegetation_pars is given, neglect this information and give an
3248!--             informative message that this value will not be used.   
3249                IF ( .NOT. surf_lsm_v(l)%vegetation_surface(m)  .AND.          &
3250                      ANY( vegetation_pars_f%pars_xy(:,j,i) /=                 &
3251                      vegetation_pars_f%fill ) )  THEN
3252                   WRITE( message_string, * )                                  &
3253                                 'surface element at grid point (j,i) = (',    &
3254                                 j, i, ') is not a vegetation surface, ',      &
3255                                 'so that information given in ',              &
3256                                 'vegetation_pars at this point is neglected.' 
3257                   CALL message( 'land_surface_model_mod', 'PA0436', 0, 0, myid, 6, 0 )
3258                ELSE
3259
3260                   IF ( vegetation_pars_f%pars_xy(ind_v_rc_min,j,i) /=         &
3261                        vegetation_pars_f%fill )                               &
3262                      surf_lsm_v(l)%r_canopy_min(m)  =                         &
3263                                   vegetation_pars_f%pars_xy(ind_v_rc_min,j,i)
3264                   IF ( vegetation_pars_f%pars_xy(ind_v_rc_lai,j,i) /=         &
3265                        vegetation_pars_f%fill )                               &
3266                      surf_lsm_v(l)%lai(m)           =                         &
3267                                   vegetation_pars_f%pars_xy(ind_v_rc_lai,j,i)
3268                   IF ( vegetation_pars_f%pars_xy(ind_v_c_veg,j,i) /=          &
3269                        vegetation_pars_f%fill )                               &
3270                      surf_lsm_v(l)%c_veg(m)         =                         &
3271                                   vegetation_pars_f%pars_xy(ind_v_c_veg,j,i)
3272                   IF ( vegetation_pars_f%pars_xy(ind_v_gd,j,i) /=             &
3273                        vegetation_pars_f%fill )                               &
3274                     surf_lsm_v(l)%g_d(m)            =                         &
3275                                   vegetation_pars_f%pars_xy(ind_v_gd,j,i)
3276                   IF ( vegetation_pars_f%pars_xy(ind_v_z0,j,i) /=             &
3277                        vegetation_pars_f%fill )                               &
3278                      surf_lsm_v(l)%z0(m)            =                         &
3279                                   vegetation_pars_f%pars_xy(ind_v_z0,j,i)
3280                   IF ( vegetation_pars_f%pars_xy(ind_v_z0qh,j,i) /=           &
3281                        vegetation_pars_f%fill )  THEN
3282                      surf_lsm_v(l)%z0h(m)           =                         &
3283                                   vegetation_pars_f%pars_xy(ind_v_z0qh,j,i)
3284                      surf_lsm_v(l)%z0q(m)           =                         &
3285                                   vegetation_pars_f%pars_xy(ind_v_z0qh,j,i)
3286                   ENDIF
3287                   IF ( vegetation_pars_f%pars_xy(ind_v_lambda_s,j,i) /=       &
3288                        vegetation_pars_f%fill )                               &
3289                      surf_lsm_v(l)%lambda_surface_s(m)  =                     &
3290                                   vegetation_pars_f%pars_xy(ind_v_lambda_s,j,i)
3291                   IF ( vegetation_pars_f%pars_xy(ind_v_lambda_u,j,i) /=       &
3292                        vegetation_pars_f%fill )                               &
3293                      surf_lsm_v(l)%lambda_surface_u(m)  =                     &
3294                                   vegetation_pars_f%pars_xy(ind_v_lambda_u,j,i)
3295                   IF ( vegetation_pars_f%pars_xy(ind_v_f_sw_in,j,i) /=        &
3296                        vegetation_pars_f%fill )                               &
3297                      surf_lsm_v(l)%f_sw_in(m)           =                     &
3298                                   vegetation_pars_f%pars_xy(ind_v_f_sw_in,j,i)
3299                   IF ( vegetation_pars_f%pars_xy(ind_v_c_surf,j,i) /=         &
3300                        vegetation_pars_f%fill )                               &
3301                      surf_lsm_v(l)%c_surface(m)         =                     &
3302                                   vegetation_pars_f%pars_xy(ind_v_c_surf,j,i)
3303                   IF ( vegetation_pars_f%pars_xy(ind_v_at,j,i) /=             &
3304                        vegetation_pars_f%fill )                               &
3305                      surf_lsm_v(l)%albedo_type(ind_veg_wall,m) =              &
3306                                   INT( vegetation_pars_f%pars_xy(ind_v_at,j,i) )
3307                   IF ( vegetation_pars_f%pars_xy(ind_v_emis,j,i) /=           &
3308                        vegetation_pars_f%fill )                               &
3309                      surf_lsm_v(l)%emissivity(ind_veg_wall,m)  =              &
3310                                   vegetation_pars_f%pars_xy(ind_v_emis,j,i)
3311                ENDIF
3312
3313             ENDDO
3314          ENDDO
3315       ENDIF 
3316
3317!
3318!--    Level 1, initialization of water parameters. A horizontally
3319!--    homogeneous distribution is assumed here.
3320       IF ( water_type /= 0 )  THEN
3321
3322          IF ( water_temperature == 9999999.9_wp )  THEN
3323             water_temperature = water_pars(ind_w_temp,water_type)       
3324          ENDIF
3325
3326          IF ( z0_water == 9999999.9_wp )  THEN
3327             z0_water = water_pars(ind_w_z0,water_type)       
3328          ENDIF       
3329
3330          IF ( z0h_water == 9999999.9_wp )  THEN
3331             z0h_water = water_pars(ind_w_z0h,water_type)       
3332          ENDIF 
3333         
3334          IF ( z0q_water == 9999999.9_wp )  THEN
3335             z0q_water = water_pars(ind_w_z0h,water_type)       
3336          ENDIF
3337
3338          IF ( albedo_type == 9999999  .AND.  albedo == 9999999.9_wp )  THEN
3339             albedo_type = INT(water_pars(ind_w_at,water_type))       
3340          ENDIF
3341   
3342          IF ( emissivity == 9999999.9_wp )  THEN
3343             emissivity = water_pars(ind_w_emis,water_type)       
3344          ENDIF
3345
3346       ENDIF 
3347!
3348!--    Map values onto horizontal elemements
3349       DO  m = 1, surf_lsm_h%ns
3350          IF ( surf_lsm_h%water_surface(m) )  THEN
3351             IF ( TRIM( initializing_actions ) /= 'read_restart_data' )        &
3352                t_soil_h%var_2d(:,m)        = water_temperature
3353             surf_lsm_h%z0(m)               = z0_water
3354             surf_lsm_h%z0h(m)              = z0h_water
3355             surf_lsm_h%z0q(m)              = z0q_water
3356             surf_lsm_h%lambda_surface_s(m) = 1.0E10_wp
3357             surf_lsm_h%lambda_surface_u(m) = 1.0E10_wp               
3358             surf_lsm_h%c_surface(m)        = 0.0_wp
3359             surf_lsm_h%albedo_type(ind_wat_win,m) = albedo_type
3360             surf_lsm_h%emissivity(ind_wat_win,m)  = emissivity
3361             
3362             surf_lsm_h%water_type(m)      = water_type
3363             surf_lsm_h%water_type_name(m) = water_type_name(water_type)
3364          ENDIF
3365       ENDDO
3366!
3367!--    Map values onto vertical elements, even though this does not make
3368!--    much sense.
3369       DO  l = 0, 3
3370          DO  m = 1, surf_lsm_v(l)%ns
3371             IF ( surf_lsm_v(l)%water_surface(m) )  THEN
3372                IF ( TRIM( initializing_actions ) /= 'read_restart_data' )     &
3373                   t_soil_v(l)%var_2d(:,m)           = water_temperature
3374                surf_lsm_v(l)%z0(m)               = z0_water
3375                surf_lsm_v(l)%z0h(m)              = z0h_water
3376                surf_lsm_v(l)%z0q(m)              = z0q_water
3377                surf_lsm_v(l)%lambda_surface_s(m) = 1.0E10_wp
3378                surf_lsm_v(l)%lambda_surface_u(m) = 1.0E10_wp               
3379                surf_lsm_v(l)%c_surface(m)        = 0.0_wp
3380                surf_lsm_v(l)%albedo_type(ind_wat_win,m) = albedo_type
3381                surf_lsm_v(l)%emissivity(ind_wat_win,m)  = emissivity
3382               
3383                surf_lsm_v(l)%water_type(m)      = water_type
3384                surf_lsm_v(l)%water_type_name(m) = water_type_name(water_type)
3385             ENDIF
3386          ENDDO
3387       ENDDO
3388!
3389!
3390!--    Level 2, initialization of water parameters via water_type read
3391!--    from file. Water surfaces are initialized for each (y,x)-grid point
3392!--    individually using default paramter settings according to the given
3393!--    water type.
3394!--    Note, parameter 3/4 of water_pars are albedo and emissivity,
3395!--    whereas paramter 3/4 of water_pars_f are heat conductivities!
3396       IF ( water_type_f%from_file )  THEN
3397!
3398!--       Horizontal surfaces
3399          DO  m = 1, surf_lsm_h%ns
3400             i = surf_lsm_h%i(m)
3401             j = surf_lsm_h%j(m)
3402             
3403             st = water_type_f%var(j,i)
3404             IF ( st /= water_type_f%fill  .AND.  st /= 0 )  THEN
3405                IF ( TRIM( initializing_actions ) /= 'read_restart_data' )     &
3406                   t_soil_h%var_2d(:,m) = water_pars(ind_w_temp,st)
3407                surf_lsm_h%z0(m)     = water_pars(ind_w_z0,st)
3408                surf_lsm_h%z0h(m)    = water_pars(ind_w_z0h,st)
3409                surf_lsm_h%z0q(m)    = water_pars(ind_w_z0h,st)
3410                surf_lsm_h%lambda_surface_s(m) = water_pars(ind_w_lambda_s,st)
3411                surf_lsm_h%lambda_surface_u(m) = water_pars(ind_w_lambda_u,st)             
3412                surf_lsm_h%c_surface(m)        = 0.0_wp
3413                surf_lsm_h%albedo_type(ind_wat_win,m) = INT( water_pars(ind_w_at,st) )
3414                surf_lsm_h%emissivity(ind_wat_win,m)  = water_pars(ind_w_emis,st)
3415               
3416                surf_lsm_h%water_type(m)      = st
3417                surf_lsm_h%water_type_name(m) = water_type_name(st)
3418             ENDIF
3419          ENDDO
3420!
3421!--       Vertical surfaces
3422          DO  l = 0, 3
3423             DO  m = 1, surf_lsm_v(l)%ns
3424                i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,         &
3425                                                surf_lsm_v(l)%building_covered(m) ) 
3426                j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,         &
3427                                                surf_lsm_v(l)%building_covered(m) ) 
3428             
3429                st = water_type_f%var(j,i)
3430                IF ( st /= water_type_f%fill  .AND.  st /= 0 )  THEN
3431                   IF ( TRIM( initializing_actions ) /= 'read_restart_data' )  &
3432                      t_soil_v(l)%var_2d(:,m) = water_pars(ind_w_temp,st)
3433                   surf_lsm_v(l)%z0(m)     = water_pars(ind_w_z0,st)
3434                   surf_lsm_v(l)%z0h(m)    = water_pars(ind_w_z0h,st)
3435                   surf_lsm_v(l)%z0q(m)    = water_pars(ind_w_z0h,st)
3436                   surf_lsm_v(l)%lambda_surface_s(m) =                         &
3437                                                   water_pars(ind_w_lambda_s,st)
3438                   surf_lsm_v(l)%lambda_surface_u(m) =                         &
3439                                                   water_pars(ind_w_lambda_u,st)           
3440                   surf_lsm_v(l)%c_surface(m)     = 0.0_wp
3441                   surf_lsm_v(l)%albedo_type(ind_wat_win,m) =                  &
3442                                                  INT( water_pars(ind_w_at,st) )
3443                   surf_lsm_v(l)%emissivity(ind_wat_win,m)  =                  &
3444                                                  water_pars(ind_w_emis,st)
3445                                                 
3446                   surf_lsm_v(l)%water_type(m)      = st
3447                   surf_lsm_v(l)%water_type_name(m) = water_type_name(st)
3448                ENDIF
3449             ENDDO
3450          ENDDO
3451       ENDIF     
3452
3453!
3454!--    Level 3, initialization of water parameters at single (x,y)
3455!--    position via water_pars read from file.
3456       IF ( water_pars_f%from_file )  THEN
3457!
3458!--       Horizontal surfaces
3459          DO  m = 1, surf_lsm_h%ns
3460             i = surf_lsm_h%i(m)
3461             j = surf_lsm_h%j(m)
3462!
3463!--          If surface element is not a water surface and any value in
3464!--          water_pars is given, neglect this information and give an
3465!--          informative message that this value will not be used.   
3466             IF ( .NOT. surf_lsm_h%water_surface(m)  .AND.                     &
3467                   ANY( water_pars_f%pars_xy(:,j,i) /= water_pars_f%fill ) )  THEN
3468                WRITE( message_string, * )                                     &
3469                              'surface element at grid point (j,i) = (',       &
3470                              j, i, ') is not a water surface, ',              &
3471                              'so that information given in ',                 &
3472                              'water_pars at this point is neglected.' 
3473                CALL message( 'land_surface_model_mod', 'PA0645', 0, 0, myid, 6, 0 )
3474             ELSE
3475                IF ( water_pars_f%pars_xy(ind_w_temp,j,i) /=                   &
3476                     water_pars_f%fill  .AND.                                  &
3477                     TRIM( initializing_actions ) /= 'read_restart_data' )     &
3478                      t_soil_h%var_2d(:,m) = water_pars_f%pars_xy(ind_w_temp,j,i)
3479
3480                IF ( water_pars_f%pars_xy(ind_w_z0,j,i) /= water_pars_f%fill ) &
3481                   surf_lsm_h%z0(m)     = water_pars_f%pars_xy(ind_w_z0,j,i)
3482
3483                IF ( water_pars_f%pars_xy(ind_w_z0h,j,i) /= water_pars_f%fill )&
3484                THEN
3485                   surf_lsm_h%z0h(m)    = water_pars_f%pars_xy(ind_w_z0h,j,i)
3486                   surf_lsm_h%z0q(m)    = water_pars_f%pars_xy(ind_w_z0h,j,i)
3487                ENDIF
3488                IF ( water_pars_f%pars_xy(ind_w_lambda_s,j,i) /=               &
3489                     water_pars_f%fill )                                       &
3490                   surf_lsm_h%lambda_surface_s(m) =                            &
3491                                        water_pars_f%pars_xy(ind_w_lambda_s,j,i)
3492
3493                IF ( water_pars_f%pars_xy(ind_w_lambda_u,j,i) /=               &
3494                      water_pars_f%fill )                                      &
3495                   surf_lsm_h%lambda_surface_u(m) =                            &
3496                                        water_pars_f%pars_xy(ind_w_lambda_u,j,i)     
3497       
3498                IF ( water_pars_f%pars_xy(ind_w_at,j,i) /=                     &
3499                     water_pars_f%fill )                                       &
3500                   surf_lsm_h%albedo_type(ind_wat_win,m) =                     &
3501                                       INT( water_pars_f%pars_xy(ind_w_at,j,i) )
3502
3503                IF ( water_pars_f%pars_xy(ind_w_emis,j,i) /=                   &
3504                     water_pars_f%fill )                                       &
3505                   surf_lsm_h%emissivity(ind_wat_win,m) =                      &
3506                                          water_pars_f%pars_xy(ind_w_emis,j,i) 
3507             ENDIF
3508          ENDDO
3509!
3510!--       Vertical surfaces
3511          DO  l = 0, 3
3512             DO  m = 1, surf_lsm_v(l)%ns
3513                i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,         &
3514                                                surf_lsm_v(l)%building_covered(m) ) 
3515                j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,         &
3516                                                surf_lsm_v(l)%building_covered(m) ) 
3517!
3518!--             If surface element is not a water surface and any value in
3519!--             water_pars is given, neglect this information and give an
3520!--             informative message that this value will not be used.   
3521                IF ( .NOT. surf_lsm_v(l)%water_surface(m)  .AND.               &
3522                      ANY( water_pars_f%pars_xy(:,j,i) /=                      &
3523                      water_pars_f%fill ) )  THEN
3524                   WRITE( message_string, * )                                  &
3525                              'surface element at grid point (j,i) = (',       &
3526                              j, i, ') is not a water surface, ',              &
3527                              'so that information given in ',                 &
3528                              'water_pars at this point is neglected.' 
3529                   CALL message( 'land_surface_model_mod', 'PA0645',           &
3530                                  0, 0, myid, 6, 0 )
3531                ELSE
3532
3533                   IF ( water_pars_f%pars_xy(ind_w_temp,j,i) /=                &
3534                     water_pars_f%fill  .AND.                                  &
3535                     TRIM( initializing_actions ) /= 'read_restart_data' )     &
3536                      t_soil_v(l)%var_2d(:,m) = water_pars_f%pars_xy(ind_w_temp,j,i)
3537
3538                   IF ( water_pars_f%pars_xy(ind_w_z0,j,i) /=                  &
3539                        water_pars_f%fill )                                    &
3540                      surf_lsm_v(l)%z0(m)   = water_pars_f%pars_xy(ind_w_z0,j,i)
3541
3542                   IF ( water_pars_f%pars_xy(ind_w_z0h,j,i) /=                 &
3543                       water_pars_f%fill )  THEN
3544                      surf_lsm_v(l)%z0h(m)  = water_pars_f%pars_xy(ind_w_z0h,j,i)
3545                      surf_lsm_v(l)%z0q(m)  = water_pars_f%pars_xy(ind_w_z0h,j,i)
3546                   ENDIF
3547
3548                   IF ( water_pars_f%pars_xy(ind_w_lambda_s,j,i) /=            &
3549                        water_pars_f%fill )                                    &
3550                      surf_lsm_v(l)%lambda_surface_s(m) =                      &
3551                                      water_pars_f%pars_xy(ind_w_lambda_s,j,i)
3552
3553                   IF ( water_pars_f%pars_xy(ind_w_lambda_u,j,i) /=            &
3554                        water_pars_f%fill )                                    &
3555                      surf_lsm_v(l)%lambda_surface_u(m) =                      &
3556                                      water_pars_f%pars_xy(ind_w_lambda_u,j,i)   
3557 
3558                   IF ( water_pars_f%pars_xy(ind_w_at,j,i) /=                  &
3559                        water_pars_f%fill )                                    &
3560                      surf_lsm_v(l)%albedo_type(ind_wat_win,m) =               &
3561                                      INT( water_pars_f%pars_xy(ind_w_at,j,i) )
3562
3563                   IF ( water_pars_f%pars_xy(ind_w_emis,j,i) /=                &
3564                        water_pars_f%fill )                                    &
3565                      surf_lsm_v(l)%emissivity(ind_wat_win,m)  =               &
3566                                      water_pars_f%pars_xy(ind_w_emis,j,i) 
3567                ENDIF
3568             ENDDO
3569          ENDDO
3570
3571       ENDIF
3572!
3573!--    Initialize pavement-type surfaces, level 1
3574       IF ( pavement_type /= 0 )  THEN 
3575
3576!
3577!--       When a pavement_type is used, overwrite a possible setting of
3578!--       the pavement depth as it is already defined by the pavement type
3579          pavement_depth_level = 0
3580
3581          IF ( z0_pavement == 9999999.9_wp )  THEN
3582             z0_pavement  = pavement_pars(ind_p_z0,pavement_type) 
3583          ENDIF
3584
3585          IF ( z0h_pavement == 9999999.9_wp )  THEN
3586             z0h_pavement = pavement_pars(ind_p_z0h,pavement_type)
3587          ENDIF
3588         
3589          IF ( z0q_pavement == 9999999.9_wp )  THEN
3590             z0q_pavement = pavement_pars(ind_p_z0h,pavement_type)
3591          ENDIF
3592
3593          IF ( pavement_heat_conduct == 9999999.9_wp )  THEN
3594             pavement_heat_conduct = pavement_subsurface_pars_1(0,pavement_type)
3595          ENDIF
3596
3597          IF ( pavement_heat_capacity == 9999999.9_wp )  THEN
3598             pavement_heat_capacity = pavement_subsurface_pars_2(0,pavement_type)
3599          ENDIF   
3600   
3601          IF ( albedo_type == 9999999  .AND.  albedo == 9999999.9_wp )  THEN
3602             albedo_type = INT(pavement_pars(ind_p_at,pavement_type))       
3603          ENDIF
3604   
3605          IF ( emissivity == 9999999.9_wp )  THEN
3606             emissivity = pavement_pars(ind_p_emis,pavement_type)       
3607          ENDIF
3608
3609!
3610!--       If the depth level of the pavement is not set, determine it from
3611!--       lookup table.
3612          IF ( pavement_depth_level == 0 )  THEN
3613             DO  k = nzb_soil, nzt_soil 
3614                IF ( pavement_subsurface_pars_1(k,pavement_type) == 9999999.9_wp &
3615                .OR. pavement_subsurface_pars_2(k,pavement_type) == 9999999.9_wp)&
3616                THEN
3617                   nzt_pavement = k-1
3618                   EXIT
3619                ENDIF
3620             ENDDO
3621          ELSE
3622             nzt_pavement = pavement_depth_level
3623          ENDIF
3624
3625       ENDIF
3626!
3627!--    Level 1 initialization of pavement type surfaces. Horizontally
3628!--    homogeneous characteristics are assumed
3629       surf_lsm_h%nzt_pavement = pavement_depth_level
3630       DO  m = 1, surf_lsm_h%ns
3631          IF ( surf_lsm_h%pavement_surface(m) )  THEN
3632             surf_lsm_h%nzt_pavement(m)        = nzt_pavement
3633             surf_lsm_h%z0(m)                  = z0_pavement
3634             surf_lsm_h%z0h(m)                 = z0h_pavement
3635             surf_lsm_h%z0q(m)                 = z0q_pavement
3636             surf_lsm_h%lambda_surface_s(m)    = pavement_heat_conduct         &
3637                                                  * ddz_soil(nzb_soil)         &
3638                                                  * 2.0_wp   
3639             surf_lsm_h%lambda_surface_u(m)    = pavement_heat_conduct         &
3640                                                  * ddz_soil(nzb_soil)         &
3641                                                  * 2.0_wp           
3642             surf_lsm_h%c_surface(m)           = pavement_heat_capacity        &
3643                                                        * dz_soil(nzb_soil)    &
3644                                                        * 0.25_wp                                   
3645
3646             surf_lsm_h%albedo_type(ind_pav_green,m) = albedo_type
3647             surf_lsm_h%emissivity(ind_pav_green,m)  = emissivity     
3648             
3649             surf_lsm_h%pavement_type(m)      = pavement_type
3650             surf_lsm_h%pavement_type_name(m) = pavement_type_name(pavement_type)
3651     
3652             IF ( pavement_type /= 0 )  THEN
3653                DO  k = nzb_soil, surf_lsm_h%nzt_pavement(m)
3654                   surf_lsm_h%lambda_h_def(k,m)    =                           &
3655                                     pavement_subsurface_pars_1(k,pavement_type)                       
3656                   surf_lsm_h%rho_c_total_def(k,m) =                           &
3657                                     pavement_subsurface_pars_2(k,pavement_type) 
3658                ENDDO
3659             ELSE
3660                surf_lsm_h%lambda_h_def(:,m)     = pavement_heat_conduct
3661                surf_lsm_h%rho_c_total_def(:,m)  = pavement_heat_capacity
3662             ENDIF       
3663          ENDIF
3664       ENDDO                               
3665
3666       DO  l = 0, 3
3667          surf_lsm_v(l)%nzt_pavement = pavement_depth_level
3668          DO  m = 1, surf_lsm_v(l)%ns
3669             IF ( surf_lsm_v(l)%pavement_surface(m) )  THEN
3670                surf_lsm_v(l)%nzt_pavement(m)        = nzt_pavement
3671                surf_lsm_v(l)%z0(m)                  = z0_pavement
3672                surf_lsm_v(l)%z0h(m)                 = z0h_pavement
3673                surf_lsm_v(l)%z0q(m)                 = z0q_pavement
3674                surf_lsm_v(l)%lambda_surface_s(m)    = pavement_heat_conduct   &
3675                                                  * ddz_soil(nzb_soil)         &
3676                                                  * 2.0_wp   
3677                surf_lsm_v(l)%lambda_surface_u(m)    = pavement_heat_conduct   &
3678                                                  * ddz_soil(nzb_soil)         &
3679                                                  * 2.0_wp           
3680                surf_lsm_v(l)%c_surface(m)           = pavement_heat_capacity  &
3681                                                        * dz_soil(nzb_soil)    &
3682                                                        * 0.25_wp                                     
3683
3684                surf_lsm_v(l)%albedo_type(ind_pav_green,m) = albedo_type
3685                surf_lsm_v(l)%emissivity(ind_pav_green,m)  = emissivity
3686               
3687                surf_lsm_v(l)%pavement_type(m)      = pavement_type
3688                surf_lsm_v(l)%pavement_type_name(m) = pavement_type_name(pavement_type)
3689
3690                IF ( pavement_type /= 0 )  THEN
3691                   DO  k = nzb_soil, surf_lsm_v(l)%nzt_pavement(m)
3692                      surf_lsm_v(l)%lambda_h_def(k,m)    =                     &
3693                                     pavement_subsurface_pars_1(k,pavement_type)                       
3694                      surf_lsm_v(l)%rho_c_total_def(k,m) =                     &
3695                                     pavement_subsurface_pars_2(k,pavement_type) 
3696                   ENDDO
3697                ELSE
3698                   surf_lsm_v(l)%lambda_h_def(:,m)     = pavement_heat_conduct
3699                   surf_lsm_v(l)%rho_c_total_def(:,m)  = pavement_heat_capacity
3700                ENDIF     
3701             ENDIF
3702          ENDDO
3703       ENDDO
3704!
3705!--    Level 2 initialization of pavement type surfaces via pavement_type read
3706!--    from file. Pavement surfaces are initialized for each (y,x)-grid point
3707!--    individually.
3708       IF ( pavement_type_f%from_file )  THEN
3709!
3710!--       Horizontal surfaces
3711          DO  m = 1, surf_lsm_h%ns
3712             i = surf_lsm_h%i(m)
3713             j = surf_lsm_h%j(m)
3714             
3715             st = pavement_type_f%var(j,i)
3716             IF ( st /= pavement_type_f%fill  .AND.  st /= 0 )  THEN
3717!
3718!--             Determine deepmost index of pavement layer
3719                DO  k = nzb_soil, nzt_soil 
3720                   IF ( pavement_subsurface_pars_1(k,st) == 9999999.9_wp       &
3721                   .OR. pavement_subsurface_pars_2(k,st) == 9999999.9_wp)      &
3722                   THEN
3723                      surf_lsm_h%nzt_pavement(m) = k-1
3724                      EXIT
3725                   ENDIF
3726                ENDDO
3727
3728                surf_lsm_h%z0(m)                = pavement_pars(ind_p_z0,st)
3729                surf_lsm_h%z0h(m)               = pavement_pars(ind_p_z0h,st)
3730                surf_lsm_h%z0q(m)               = pavement_pars(ind_p_z0h,st)
3731
3732                surf_lsm_h%lambda_surface_s(m)  =                              &
3733                                              pavement_subsurface_pars_1(0,st) &
3734                                                  * ddz_soil(nzb_soil)         &
3735                                                  * 2.0_wp   
3736                surf_lsm_h%lambda_surface_u(m)  =                              &
3737                                              pavement_subsurface_pars_1(0,st) &
3738                                                  * ddz_soil(nzb_soil)         &
3739                                                  * 2.0_wp       
3740                surf_lsm_h%c_surface(m)         =                              &
3741                                               pavement_subsurface_pars_2(0,st)&
3742                                                        * dz_soil(nzb_soil)    &
3743                                                        * 0.25_wp                               
3744                surf_lsm_h%albedo_type(ind_pav_green,m) = INT( pavement_pars(ind_p_at,st) )
3745                surf_lsm_h%emissivity(ind_pav_green,m)  = pavement_pars(ind_p_emis,st) 
3746               
3747                surf_lsm_h%pavement_type(m)      = st
3748                surf_lsm_h%pavement_type_name(m) = pavement_type_name(st)
3749
3750                DO  k = nzb_soil, surf_lsm_h%nzt_pavement(m)
3751                   surf_lsm_h%lambda_h_def(k,m)    =                           &
3752                                     pavement_subsurface_pars_1(k,pavement_type)                       
3753                   surf_lsm_h%rho_c_total_def(k,m) =                           &
3754                                     pavement_subsurface_pars_2(k,pavement_type) 
3755                ENDDO   
3756             ENDIF
3757          ENDDO
3758!
3759!--       Vertical surfaces
3760          DO  l = 0, 3
3761             DO  m = 1, surf_lsm_v(l)%ns
3762                i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,         &
3763                                                surf_lsm_v(l)%building_covered(m) ) 
3764                j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,         &
3765                                                surf_lsm_v(l)%building_covered(m) ) 
3766             
3767                st = pavement_type_f%var(j,i)
3768                IF ( st /= pavement_type_f%fill  .AND.  st /= 0 )  THEN
3769!
3770!--                Determine deepmost index of pavement layer
3771                   DO  k = nzb_soil, nzt_soil 
3772                      IF ( pavement_subsurface_pars_1(k,st) == 9999999.9_wp    &
3773                      .OR. pavement_subsurface_pars_2(k,st) == 9999999.9_wp)   &
3774                      THEN
3775                         surf_lsm_v(l)%nzt_pavement(m) = k-1
3776                         EXIT
3777                      ENDIF
3778                   ENDDO
3779
3780                   surf_lsm_v(l)%z0(m)  = pavement_pars(ind_p_z0,st)
3781                   surf_lsm_v(l)%z0h(m) = pavement_pars(ind_p_z0h,st)
3782                   surf_lsm_v(l)%z0q(m) = pavement_pars(ind_p_z0h,st)
3783
3784                   surf_lsm_v(l)%lambda_surface_s(m)  =                        &
3785                                              pavement_subsurface_pars_1(0,st) &
3786                                                  * ddz_soil(nzb_soil)         & 
3787                                                  * 2.0_wp   
3788                   surf_lsm_v(l)%lambda_surface_u(m)  =                        &
3789                                              pavement_subsurface_pars_1(0,st) &
3790                                                  * ddz_soil(nzb_soil)         &
3791                                                  * 2.0_wp     
3792
3793                   surf_lsm_v(l)%c_surface(m)    =                             &
3794                                           pavement_subsurface_pars_2(0,st)    &
3795                                                        * dz_soil(nzb_soil)    &
3796                                                        * 0.25_wp                                   
3797                   surf_lsm_v(l)%albedo_type(ind_pav_green,m) =                &
3798                                              INT( pavement_pars(ind_p_at,st) )
3799                   surf_lsm_v(l)%emissivity(ind_pav_green,m)  =                &
3800                                              pavement_pars(ind_p_emis,st) 
3801                                             
3802                   surf_lsm_v(l)%pavement_type(m)      = st
3803                   surf_lsm_v(l)%pavement_type_name(m) = pavement_type_name(st)
3804                                             
3805                   DO  k = nzb_soil, surf_lsm_v(l)%nzt_pavement(m)
3806                      surf_lsm_v(l)%lambda_h_def(k,m)    =                     &
3807                                    pavement_subsurface_pars_1(k,pavement_type)                       
3808                      surf_lsm_v(l)%rho_c_total_def(k,m) =                     &
3809                                    pavement_subsurface_pars_2(k,pavement_type) 
3810                   ENDDO   
3811                ENDIF
3812             ENDDO
3813          ENDDO
3814       ENDIF 
3815!
3816!--    Level 3, initialization of pavement parameters at single (x,y)
3817!--    position via pavement_pars read from file.
3818       IF ( pavement_pars_f%from_file )  THEN
3819!
3820!--       Horizontal surfaces
3821          DO  m = 1, surf_lsm_h%ns
3822             i = surf_lsm_h%i(m)
3823             j = surf_lsm_h%j(m)
3824!
3825!--          If surface element is not a pavement surface and any value in
3826!--          pavement_pars is given, neglect this information and give an
3827!--          informative message that this value will not be used.   
3828             IF ( .NOT. surf_lsm_h%pavement_surface(m)  .AND.                  &
3829                   ANY( pavement_pars_f%pars_xy(:,j,i) /=                      &
3830                   pavement_pars_f%fill ) )  THEN
3831                WRITE( message_string, * )                                     &
3832                              'surface element at grid point (j,i) = (',       &
3833                              j, i, ') is not a pavement surface, ',           &
3834                              'so that information given in ',                 &
3835                              'pavement_pars at this point is neglected.' 
3836                CALL message( 'land_surface_model_mod', 'PA0647', 0, 0, myid, 6, 0 )
3837             ELSE
3838                IF ( pavement_pars_f%pars_xy(ind_p_z0,j,i) /=                  &
3839                     pavement_pars_f%fill )                                    &
3840                   surf_lsm_h%z0(m)  = pavement_pars_f%pars_xy(ind_p_z0,j,i)
3841                IF ( pavement_pars_f%pars_xy(ind_p_z0h,j,i) /=                 &
3842                     pavement_pars_f%fill )  THEN
3843                   surf_lsm_h%z0h(m) = pavement_pars_f%pars_xy(ind_p_z0h,j,i)
3844                   surf_lsm_h%z0q(m) = pavement_pars_f%pars_xy(ind_p_z0h,j,i)
3845                ENDIF
3846                IF ( pavement_subsurface_pars_f%pars_xyz(ind_p_lambda_h,0,j,i) &
3847                     /= pavement_subsurface_pars_f%fill )  THEN
3848                   surf_lsm_h%lambda_surface_s(m)  =                           &
3849                      pavement_subsurface_pars_f%pars_xyz(ind_p_lambda_h,0,j,i)&
3850                                                  * ddz_soil(nzb_soil)         &
3851                                                  * 2.0_wp
3852                   surf_lsm_h%lambda_surface_u(m)  =                           &
3853                      pavement_subsurface_pars_f%pars_xyz(ind_p_lambda_h,0,j,i)&
3854                                                  * ddz_soil(nzb_soil)         &
3855                                                  * 2.0_wp   
3856                ENDIF
3857                IF ( pavement_subsurface_pars_f%pars_xyz(ind_p_rho_c,0,j,i) /= &
3858                     pavement_subsurface_pars_f%fill )  THEN
3859                   surf_lsm_h%c_surface(m)     =                               &
3860                      pavement_subsurface_pars_f%pars_xyz(ind_p_rho_c,0,j,i)   &
3861                                                  * dz_soil(nzb_soil)          &
3862                                                  * 0.25_wp                                   
3863                ENDIF
3864                IF ( pavement_pars_f%pars_xy(ind_p_at,j,i) /=                  &
3865                     pavement_pars_f%fill )                                    &
3866                   surf_lsm_h%albedo_type(ind_pav_green,m) =                   &
3867                                   INT( pavement_pars_f%pars_xy(ind_p_at,j,i) )
3868                IF ( pavement_pars_f%pars_xy(ind_p_emis,j,i) /=                &
3869                     pavement_pars_f%fill )                                    &
3870                   surf_lsm_h%emissivity(ind_pav_green,m)  =                   &
3871                                   pavement_pars_f%pars_xy(ind_p_emis,j,i)
3872             ENDIF
3873
3874          ENDDO
3875!
3876!--       Vertical surfaces
3877          DO  l = 0, 3
3878             DO  m = 1, surf_lsm_v(l)%ns
3879                i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,         &
3880                                                surf_lsm_v(l)%building_covered(m) ) 
3881                j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,         &
3882                                                surf_lsm_v(l)%building_covered(m) ) 
3883!
3884!--             If surface element is not a pavement surface and any value in
3885!--             pavement_pars is given, neglect this information and give an
3886!--             informative message that this value will not be used.   
3887                IF ( .NOT. surf_lsm_v(l)%pavement_surface(m)  .AND.            &
3888                      ANY( pavement_pars_f%pars_xy(:,j,i) /=                   &
3889                      pavement_pars_f%fill ) )  THEN
3890                   WRITE( message_string, * )                                  &
3891                                 'surface element at grid point (j,i) = (',    &
3892                                 j, i, ') is not a pavement surface, ',        &
3893                                 'so that information given in ',              &
3894                                 'pavement_pars at this point is neglected.' 
3895                   CALL message( 'land_surface_model_mod', 'PA0647', 0, 0, myid, 6, 0 )
3896                ELSE
3897
3898                   IF ( pavement_pars_f%pars_xy(ind_p_z0,j,i) /=               &
3899                        pavement_pars_f%fill )                                 &
3900                      surf_lsm_v(l)%z0(m) = pavement_pars_f%pars_xy(ind_p_z0,j,i)
3901                   IF ( pavement_pars_f%pars_xy(ind_p_z0h,j,i) /=              &
3902                        pavement_pars_f%fill )  THEN
3903                      surf_lsm_v(l)%z0h(m) = pavement_pars_f%pars_xy(ind_p_z0h,j,i)
3904                      surf_lsm_v(l)%z0q(m) = pavement_pars_f%pars_xy(ind_p_z0h,j,i)
3905                   ENDIF
3906                   IF ( pavement_subsurface_pars_f%pars_xyz(ind_p_lambda_h,0,j,i)&
3907                        /= pavement_subsurface_pars_f%fill )  THEN
3908                      surf_lsm_v(l)%lambda_surface_s(m) =                      &
3909                      pavement_subsurface_pars_f%pars_xyz(ind_p_lambda_h,0,j,i)&
3910                                                  * ddz_soil(nzb_soil)         &
3911                                                  * 2.0_wp
3912                      surf_lsm_v(l)%lambda_surface_u(m) =                      &
3913                      pavement_subsurface_pars_f%pars_xyz(ind_p_lambda_h,0,j,i)&
3914                                                  * ddz_soil(nzb_soil)         &
3915                                                  * 2.0_wp   
3916                   ENDIF
3917                   IF ( pavement_subsurface_pars_f%pars_xyz(ind_p_rho_c,0,j,i) &
3918                        /= pavement_subsurface_pars_f%fill )  THEN
3919                      surf_lsm_v(l)%c_surface(m)    =                          &
3920                         pavement_subsurface_pars_f%pars_xyz(ind_p_rho_c,0,j,i)&
3921                                                  * dz_soil(nzb_soil)          &
3922                                                  * 0.25_wp                                 
3923                   ENDIF
3924                   IF ( pavement_pars_f%pars_xy(ind_p_at,j,i) /=               &
3925                        pavement_pars_f%fill )                                 &
3926                      surf_lsm_v(l)%albedo_type(ind_pav_green,m) =             &
3927                                   INT( pavement_pars_f%pars_xy(ind_p_at,j,i) )
3928
3929                   IF ( pavement_pars_f%pars_xy(ind_p_emis,j,i) /=             &
3930                        pavement_pars_f%fill )                                 &
3931                      surf_lsm_v(l)%emissivity(ind_pav_green,m)  =             &
3932                                   pavement_pars_f%pars_xy(ind_p_emis,j,i) 
3933                ENDIF
3934             ENDDO
3935          ENDDO
3936       ENDIF
3937!
3938!--    Moreover, for grid points which are flagged with pavement-type 0 or whre
3939!--    pavement_subsurface_pars_f is provided, soil heat conductivity and
3940!--    capacity are initialized with parameters given in       
3941!--    pavement_subsurface_pars read from file.
3942       IF ( pavement_subsurface_pars_f%from_file )  THEN
3943!
3944!--       Set pavement depth to nzt_soil. Please note, this is just a
3945!--       workaround at the moment.
3946          DO  m = 1, surf_lsm_h%ns
3947             IF ( surf_lsm_h%pavement_surface(m) )  THEN
3948
3949                i = surf_lsm_h%i(m)
3950                j = surf_lsm_h%j(m)
3951
3952                surf_lsm_h%nzt_pavement(m) = nzt_soil
3953
3954                DO  k = nzb_soil, nzt_soil 
3955                   surf_lsm_h%lambda_h_def(k,m) =                              &
3956                       pavement_subsurface_pars_f%pars_xyz(ind_p_lambda_h,k,j,i)
3957                   surf_lsm_h%rho_c_total_def(k,m) =                           &
3958                       pavement_subsurface_pars_f%pars_xyz(ind_p_rho_c,k,j,i)
3959                ENDDO
3960
3961             ENDIF
3962          ENDDO
3963          DO  l = 0, 3
3964             DO  m = 1, surf_lsm_v(l)%ns
3965                IF ( surf_lsm_v(l)%pavement_surface(m) )  THEN
3966
3967                   i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,      &
3968                                                surf_lsm_v(l)%building_covered(m) ) 
3969                   j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,      &
3970                                                surf_lsm_v(l)%building_covered(m) ) 
3971
3972                   surf_lsm_v(l)%nzt_pavement(m) = nzt_soil
3973
3974                   DO  k = nzb_soil, nzt_soil 
3975                      surf_lsm_v(l)%lambda_h_def(k,m) =                        &
3976                       pavement_subsurface_pars_f%pars_xyz(ind_p_lambda_h,k,j,i)
3977                      surf_lsm_v(l)%rho_c_total_def(k,m) =                     &
3978                       pavement_subsurface_pars_f%pars_xyz(ind_p_rho_c,k,j,i)
3979                   ENDDO
3980
3981                ENDIF
3982             ENDDO
3983          ENDDO
3984       ENDIF
3985
3986!
3987!--    Initial run actions
3988       IF (  TRIM( initializing_actions ) /= 'read_restart_data' )  THEN
3989!
3990!--       Read soil properties from dynamic input file.
3991          IF ( INDEX( initializing_actions, 'inifor' ) /= 0 )                  &
3992             CALL netcdf_data_input_init_lsm
3993!
3994!--       In case no dynamic input is available for a child domain but root
3995!--       domain is initialized with dynamic input file, the different soil
3996!--       properties can lead to significant discrepancies in the atmospheric
3997!--       surface forcing. For this reason, the child domain
3998!--       is initialized with mean soil profiles from the root domain, even if
3999!--       no initialization with inifor is set.
4000          init_tsoil_from_parent = .FALSE. 
4001          init_msoil_from_parent = .FALSE. 
4002          IF ( nested_run )  THEN
4003#if defined( __parallel )
4004             CALL MPI_ALLREDUCE( init_3d%from_file_tsoil,                      &
4005                                 init_tsoil_from_parent,                       &
4006                                 1, MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, ierr )
4007             CALL MPI_ALLREDUCE( init_3d%from_file_msoil,                      &
4008                                 init_msoil_from_parent,                       &
4009                                 1, MPI_LOGICAL, MPI_LOR, MPI_COMM_WORLD, ierr )
4010#endif
4011          ENDIF
4012!
4013!--       First, initialize soil temperature and moisture.
4014!--       According to the initialization for surface and soil parameters,
4015!--       initialize soil moisture and temperature via a level approach. This
4016!--       is to assure that all surface elements are initialized, even if
4017!--       data provided from input file contains fill values at some locations.
4018!--       Level 1, initialization via profiles given in parameter file
4019          DO  m = 1, surf_lsm_h%ns
4020             IF ( surf_lsm_h%vegetation_surface(m)  .OR.                       &
4021                  surf_lsm_h%pavement_surface(m) )  THEN
4022                DO  k = nzb_soil, nzt_soil 
4023                   t_soil_h%var_2d(k,m) = soil_temperature(k)
4024                   m_soil_h%var_2d(k,m) = soil_moisture(k)
4025                ENDDO
4026                t_soil_h%var_2d(nzt_soil+1,m) = deep_soil_temperature
4027             ENDIF
4028          ENDDO
4029          DO  l = 0, 3
4030             DO  m = 1, surf_lsm_v(l)%ns
4031                IF ( surf_lsm_v(l)%vegetation_surface(m)  .OR.                 &
4032                     surf_lsm_v(l)%pavement_surface(m) )  THEN
4033                   DO  k = nzb_soil, nzt_soil 
4034                      t_soil_v(l)%var_2d(k,m) = soil_temperature(k)
4035                      m_soil_v(l)%var_2d(k,m) = soil_moisture(k)
4036                   ENDDO
4037                   t_soil_v(l)%var_2d(nzt_soil+1,m) = deep_soil_temperature
4038                ENDIF
4039             ENDDO
4040          ENDDO
4041!
4042!--       Initialization of soil moisture and temperature from file.
4043!--       In case of no dynamic input file is available for the child domain,
4044!--       transfer soil mean profiles from the root-parent domain onto all
4045!--       child domains.
4046          IF ( init_msoil_from_parent )  THEN
4047!
4048!--          Child domains will be only initialized with horizontally
4049!--          averaged soil profiles in parent domain (for sake of simplicity).
4050!--          If required, average soil data on root parent domain before
4051!--          distribute onto child domains.
4052             IF ( init_3d%from_file_msoil  .AND.  init_3d%lod_msoil == 2 )     &
4053             THEN
4054                ALLOCATE( pr_soil_init(0:init_3d%nzs-1) )
4055
4056                DO  k = 0, init_3d%nzs-1
4057                   pr_soil_init(k) = SUM( init_3d%msoil_3d(k,nys:nyn,nxl:nxr)  )
4058                ENDDO
4059!
4060!--             Allocate 1D array for soil-moisture profile (will not be
4061!--             allocated in lod==2 case).
4062                ALLOCATE( init_3d%msoil_1d(0:init_3d%nzs-1) )
4063                init_3d%msoil_1d = 0.0_wp
4064#if defined( __parallel )
4065                CALL MPI_ALLREDUCE( pr_soil_init(0), init_3d%msoil_1d(0),      &
4066                                    SIZE(pr_soil_init),                        &
4067                                    MPI_REAL, MPI_SUM, comm2d, ierr )
4068#endif
4069                init_3d%msoil_1d = init_3d%msoil_1d /                          &
4070                                        REAL( ( nx + 1 ) * ( ny + 1), KIND=wp )
4071                DEALLOCATE( pr_soil_init )
4072             ENDIF
4073          ENDIF
4074          IF ( init_tsoil_from_parent )  THEN
4075             IF ( init_3d%from_file_tsoil  .AND.  init_3d%lod_tsoil == 2 )  THEN
4076                ALLOCATE( pr_soil_init(0:init_3d%nzs-1) )
4077
4078                DO  k = 0, init_3d%nzs-1
4079                   pr_soil_init(k) = SUM( init_3d%tsoil_3d(k,nys:nyn,nxl:nxr)  )
4080                ENDDO
4081!
4082!--             Allocate 1D array for soil-temperature profile (will not be
4083!--             allocated in lod==2 case).
4084                ALLOCATE( init_3d%tsoil_1d(0:init_3d%nzs-1) )
4085                init_3d%tsoil_1d = 0.0_wp
4086#if defined( __parallel )
4087                CALL MPI_ALLREDUCE( pr_soil_init(0), init_3d%tsoil_1d(0),      &
4088                                    SIZE(pr_soil_init),                        &
4089                                    MPI_REAL, MPI_SUM, comm2d, ierr )
4090#endif
4091                init_3d%tsoil_1d = init_3d%tsoil_1d /                          &
4092                                        REAL( ( nx + 1 ) * ( ny + 1), KIND=wp )
4093                DEALLOCATE( pr_soil_init )
4094
4095             ENDIF
4096          ENDIF
4097          IF ( init_msoil_from_parent  .OR.  init_tsoil_from_parent )  THEN
4098!
4099!--          Distribute soil grid information on file from root to all childs.
4100!--          Only process with rank 0 sends the information.
4101#if defined( __parallel )
4102             CALL MPI_BCAST( init_3d%nzs,    1,                                &
4103                             MPI_INTEGER, 0, MPI_COMM_WORLD, ierr )
4104#endif
4105
4106             IF ( .NOT.  ALLOCATED( init_3d%z_soil ) )                         &
4107                ALLOCATE( init_3d%z_soil(1:init_3d%nzs) )
4108#if defined( __parallel )
4109             CALL MPI_BCAST( init_3d%z_soil, SIZE(init_3d%z_soil),             &
4110                             MPI_REAL, 0, MPI_COMM_WORLD, ierr )
4111#endif
4112          ENDIF
4113!
4114!--       ALLOCATE arrays on child domains and set control attributes.
4115!--       Note, 1d soil profiles are allocated even though soil information
4116!--       is already read from dynamic file in one child domain.
4117!--       This case, however, data is not used for further initialization
4118!--       since the LoD=2.
4119          IF ( init_msoil_from_parent )  THEN
4120             IF ( .NOT. ALLOCATED( init_3d%msoil_1d ) )  THEN
4121                ALLOCATE( init_3d%msoil_1d(0:init_3d%nzs-1) )
4122                IF( .NOT. init_3d%from_file_msoil )  init_3d%lod_msoil = 1
4123                init_3d%from_file_msoil = .TRUE.
4124             ENDIF
4125          ENDIF
4126          IF ( init_tsoil_from_parent )  THEN
4127             IF ( .NOT. ALLOCATED( init_3d%tsoil_1d ) )  THEN
4128                ALLOCATE( init_3d%tsoil_1d(0:init_3d%nzs-1) )
4129                IF( .NOT. init_3d%from_file_tsoil )  init_3d%lod_tsoil = 1
4130                init_3d%from_file_tsoil = .TRUE.
4131             ENDIF
4132          ENDIF
4133!
4134!--       Distribute soil profiles from root to all childs
4135          IF ( init_msoil_from_parent )  THEN
4136#if defined( __parallel )
4137             CALL MPI_BCAST( init_3d%msoil_1d, SIZE(init_3d%msoil_1d),         &
4138                             MPI_REAL, 0, MPI_COMM_WORLD, ierr )
4139#endif
4140                   
4141          ENDIF
4142          IF ( init_tsoil_from_parent )  THEN
4143#if defined( __parallel )
4144             CALL MPI_BCAST( init_3d%tsoil_1d, SIZE(init_3d%tsoil_1d),         &
4145                             MPI_REAL, 0, MPI_COMM_WORLD, ierr )
4146#endif
4147          ENDIF
4148!
4149!--       Proceed with Level 2 initialization.
4150          IF ( init_3d%from_file_msoil )  THEN
4151
4152             IF ( init_3d%lod_msoil == 1 )  THEN
4153                DO  m = 1, surf_lsm_h%ns
4154                   IF ( surf_lsm_h%vegetation_surface(m)  .OR.                 &
4155                        surf_lsm_h%pavement_surface(m) )  THEN
4156
4157                      CALL netcdf_data_input_interpolate(                      &
4158                                       m_soil_h%var_2d(nzb_soil:nzt_soil,m),   &
4159                                       init_3d%msoil_1d(:),                    &
4160                                       zs(nzb_soil:nzt_soil), init_3d%z_soil,  &
4161                                       nzb_soil, nzt_soil,                     &
4162                                       nzb_soil, init_3d%nzs-1 )
4163                   ENDIF
4164                ENDDO
4165                DO  l = 0, 3
4166                   DO  m = 1, surf_lsm_v(l)%ns
4167                      IF ( surf_lsm_v(l)%vegetation_surface(m)  .OR.           &
4168                           surf_lsm_v(l)%pavement_surface(m) )  THEN
4169                         CALL netcdf_data_input_interpolate(                   &
4170                                       m_soil_v(l)%var_2d(nzb_soil:nzt_soil,m),&
4171                                       init_3d%msoil_1d(:),                    &
4172                                       zs(nzb_soil:nzt_soil), init_3d%z_soil,  &
4173                                       nzb_soil, nzt_soil,                     &
4174                                       nzb_soil, init_3d%nzs-1 )
4175                      ENDIF
4176                   ENDDO
4177                ENDDO
4178             ELSE
4179
4180                DO  m = 1, surf_lsm_h%ns
4181                   IF ( surf_lsm_h%vegetation_surface(m)  .OR.                 &
4182                        surf_lsm_h%pavement_surface(m) )  THEN
4183                      i = surf_lsm_h%i(m)
4184                      j = surf_lsm_h%j(m)
4185
4186                      IF ( init_3d%msoil_3d(0,j,i) /= init_3d%fill_msoil )     &
4187                         CALL netcdf_data_input_interpolate(                   &
4188                                       m_soil_h%var_2d(nzb_soil:nzt_soil,m),   &
4189                                       init_3d%msoil_3d(:,j,i),                &
4190                                       zs(nzb_soil:nzt_soil), init_3d%z_soil,  &
4191                                       nzb_soil, nzt_soil,                     &
4192                                       nzb_soil, init_3d%nzs-1 )
4193                   ENDIF
4194                ENDDO
4195                DO  l = 0, 3
4196                   DO  m = 1, surf_lsm_v(l)%ns
4197                      IF ( surf_lsm_v(l)%vegetation_surface(m)  .OR.           &
4198                           surf_lsm_v(l)%pavement_surface(m) )  THEN
4199!
4200!--                      Note, in contrast to the static input data the dynamic
4201!--                      input do not need to be checked whether a grid point
4202!--                      is building covered. This is because soil data in the
4203!--                      dynamic input is provided for the whole domain. 
4204                         i = surf_lsm_v(l)%i(m)
4205                         j = surf_lsm_v(l)%j(m)
4206                         
4207                         IF ( init_3d%msoil_3d(0,j,i) /= init_3d%fill_msoil )  &
4208                            CALL netcdf_data_input_interpolate(                &
4209                                       m_soil_v(l)%var_2d(nzb_soil:nzt_soil,m),&
4210                                       init_3d%msoil_3d(:,j,i),                &
4211                                       zs(nzb_soil:nzt_soil), init_3d%z_soil,  &
4212                                       nzb_soil, nzt_soil,                     &
4213                                       nzb_soil, init_3d%nzs-1 )
4214                      ENDIF
4215                   ENDDO
4216                ENDDO
4217             ENDIF
4218          ENDIF
4219!
4220!--       Soil temperature
4221          IF ( init_3d%from_file_tsoil )  THEN
4222
4223             IF ( init_3d%lod_tsoil == 1 )  THEN ! change to 1 if provided correctly by INIFOR
4224                DO  m = 1, surf_lsm_h%ns
4225                   IF ( surf_lsm_h%vegetation_surface(m)  .OR.                 &
4226                        surf_lsm_h%pavement_surface(m) )  THEN
4227                      CALL netcdf_data_input_interpolate(                      &
4228                                       t_soil_h%var_2d(nzb_soil:nzt_soil,m),   &
4229                                       init_3d%tsoil_1d(:),                    &
4230                                       zs(nzb_soil:nzt_soil), init_3d%z_soil,  &
4231                                       nzb_soil, nzt_soil,                     &
4232                                       nzb_soil, init_3d%nzs-1 )
4233!
4234!--                   Set boundary condition, i.e. deep soil temperature
4235                      t_soil_h%var_2d(nzt_soil+1,m) = t_soil_h%var_2d(nzt_soil,m)
4236                   ENDIF
4237                ENDDO
4238                DO  l = 0, 3
4239                   DO  m = 1, surf_lsm_v(l)%ns
4240                      IF ( surf_lsm_v(l)%vegetation_surface(m)  .OR.           &
4241                           surf_lsm_v(l)%pavement_surface(m) )  THEN
4242                        CALL netcdf_data_input_interpolate(                    &
4243                                       t_soil_v(l)%var_2d(nzb_soil:nzt_soil,m),&
4244                                       init_3d%tsoil_1d(:),                    &
4245                                       zs(nzb_soil:nzt_soil), init_3d%z_soil,  &
4246                                       nzb_soil, nzt_soil,                     &
4247                                       nzb_soil, init_3d%nzs-1 )
4248!
4249!--                      Set boundary condition, i.e. deep soil temperature
4250                         t_soil_v(l)%var_2d(nzt_soil+1,m) =                    &
4251                                                 t_soil_v(l)%var_2d(nzt_soil,m)
4252                      ENDIF
4253                   ENDDO
4254                ENDDO
4255             ELSE
4256
4257                DO  m = 1, surf_lsm_h%ns
4258                   IF ( surf_lsm_h%vegetation_surface(m)  .OR.                 &
4259                        surf_lsm_h%pavement_surface(m) )  THEN
4260                      i = surf_lsm_h%i(m)
4261                      j = surf_lsm_h%j(m)
4262                     
4263                      IF ( init_3d%tsoil_3d(0,j,i) /= init_3d%fill_tsoil )     &
4264                         CALL netcdf_data_input_interpolate(                   &
4265                                       t_soil_h%var_2d(nzb_soil:nzt_soil,m),   &
4266                                       init_3d%tsoil_3d(:,j,i),                &
4267                                       zs(nzb_soil:nzt_soil), init_3d%z_soil,  &
4268                                       nzb_soil, nzt_soil,                     &
4269                                       nzb_soil, init_3d%nzs-1 )
4270!
4271!--                   Set boundary condition, i.e. deep soil temperature
4272                      t_soil_h%var_2d(nzt_soil+1,m) = t_soil_h%var_2d(nzt_soil,m)
4273                   ENDIF
4274                ENDDO
4275                DO  l = 0, 3
4276                   DO  m = 1, surf_lsm_v(l)%ns
4277                      IF ( surf_lsm_v(l)%vegetation_surface(m)  .OR.           &
4278                           surf_lsm_v(l)%pavement_surface(m) )  THEN
4279!
4280!--                      Note, in contrast to the static input data the dynamic
4281!--                      input do not need to be checked whether a grid point
4282!--                      is building covered. This is because soil data in the
4283!--                      dynamic input is provided for the whole domain. 
4284                         i = surf_lsm_v(l)%i(m)
4285                         j = surf_lsm_v(l)%j(m)
4286                         
4287                         IF ( init_3d%tsoil_3d(0,j,i) /= init_3d%fill_tsoil )  &
4288                            CALL netcdf_data_input_interpolate(                &
4289                                       t_soil_v(l)%var_2d(nzb_soil:nzt_soil,m),&
4290                                       init_3d%tsoil_3d(:,j,i),                &
4291                                       zs(nzb_soil:nzt_soil), init_3d%z_soil,  &
4292                                       nzb_soil, nzt_soil,                     &
4293                                       nzb_soil, init_3d%nzs-1 )
4294!
4295!--                      Set boundary condition, i.e. deep soil temperature
4296                         t_soil_v(l)%var_2d(nzt_soil+1,m) =                    &
4297                                                 t_soil_v(l)%var_2d(nzt_soil,m)
4298                      ENDIF
4299                   ENDDO
4300                ENDDO
4301             ENDIF
4302          ENDIF
4303!
4304!--       After soil moisture and temperature are finally initialized, check
4305!--       if soil moisture is higher than its saturation value. Else, this
4306!--       will produce floating point errors in the soil model parametrization.
4307          DO  m = 1, surf_lsm_h%ns
4308             IF ( surf_lsm_h%vegetation_surface(m)  .OR.                       &
4309                  surf_lsm_h%pavement_surface(m) )  THEN
4310                DO  k = nzb_soil, nzt_soil
4311                   IF ( m_soil_h%var_2d(k,m) > surf_lsm_h%m_sat(k,m) )  THEN
4312                      WRITE( message_string, * ) 'soil moisture is higher '//  &
4313                            'than its saturation value at (k,j,i) ', k,        &
4314                            surf_lsm_h%i(m), surf_lsm_h%j(m)
4315                      CALL message( 'lsm_init', 'PA0458', 2, 2, myid, 6, 0 )
4316                   ENDIF               
4317                ENDDO
4318             ENDIF
4319          ENDDO
4320          DO  l = 0, 3
4321             DO  m = 1, surf_lsm_v(l)%ns
4322                IF ( surf_lsm_v(l)%vegetation_surface(m)  .OR.                 &
4323                     surf_lsm_v(l)%pavement_surface(m) )  THEN
4324                   DO  k = nzb_soil, nzt_soil
4325                      IF ( m_soil_v(l)%var_2d(k,m) > surf_lsm_v(l)%m_sat(k,m) )&
4326                      THEN
4327                         WRITE( message_string, * )                            &
4328                            'soil moisture is higher than ' //                 &
4329                            'its saturation value at (k,j,i) ', k,             &
4330                            surf_lsm_v(l)%i(m), surf_lsm_v(l)%j(m)
4331                         CALL message( 'lsm_init', 'PA0458', 2, 2, myid, 6, 0 )                   
4332                      ENDIF
4333                   ENDDO
4334                ENDIF
4335             ENDDO
4336          ENDDO
4337
4338!
4339!--       Further initialization
4340          DO  m = 1, surf_lsm_h%ns
4341
4342             i   = surf_lsm_h%i(m)           
4343             j   = surf_lsm_h%j(m)
4344             k   = surf_lsm_h%k(m)
4345!
4346!--          Initialize surface temperature with soil temperature in the uppermost
4347!--          uppermost layer
4348             t_surface_h%var_1d(m)    = t_soil_h%var_2d(nzb_soil,m)
4349             surf_lsm_h%pt_surface(m) = t_soil_h%var_2d(nzb_soil,m) / exner(nzb)
4350             
4351             IF ( bulk_cloud_model  .OR. cloud_droplets ) THEN
4352                surf_lsm_h%pt1(m) = pt(k,j,i) + lv_d_cp * d_exner(k) * ql(k,j,i)
4353             ELSE
4354                surf_lsm_h%pt1(m) = pt(k,j,i)
4355             ENDIF 
4356!
4357!--          Assure that r_a cannot be zero at model start
4358             IF ( surf_lsm_h%pt1(m) == surf_lsm_h%pt_surface(m) )              &
4359                surf_lsm_h%pt1(m) = surf_lsm_h%pt1(m) + 1.0E-20_wp
4360
4361             surf_lsm_h%us(m)   = 0.1_wp
4362             surf_lsm_h%ts(m)   = ( surf_lsm_h%pt1(m) - surf_lsm_h%pt_surface(m) )&
4363                                  / surf_lsm_h%r_a(m)
4364             surf_lsm_h%shf(m)  = - surf_lsm_h%us(m) * surf_lsm_h%ts(m)        &
4365                                  * rho_surface
4366          ENDDO
4367!
4368!--       Vertical surfaces
4369          DO  l = 0, 3
4370             DO  m = 1, surf_lsm_v(l)%ns
4371                i   = surf_lsm_v(l)%i(m)           
4372                j   = surf_lsm_v(l)%j(m)
4373                k   = surf_lsm_v(l)%k(m)         
4374!
4375!--             Initialize surface temperature with soil temperature in the uppermost
4376!--             uppermost layer
4377                t_surface_v(l)%var_1d(m)      = t_soil_v(l)%var_2d(nzb_soil,m)
4378                surf_lsm_v(l)%pt_surface(m)   = t_soil_v(l)%var_2d(nzb_soil,m) / exner(nzb)
4379
4380                IF ( bulk_cloud_model  .OR. cloud_droplets ) THEN
4381                   surf_lsm_v(l)%pt1(m) = pt(k,j,i) + lv_d_cp * d_exner(k) * ql(k,j,i)
4382                ELSE
4383                   surf_lsm_v(l)%pt1(m) = pt(k,j,i)
4384                ENDIF 
4385
4386!
4387!--             Assure that r_a cannot be zero at model start
4388                IF ( surf_lsm_v(l)%pt1(m) == surf_lsm_v(l)%pt_surface(m) )     &
4389                     surf_lsm_v(l)%pt1(m) = surf_lsm_v(l)%pt1(m) + 1.0E-20_wp
4390!
4391!--             Set artifical values for ts and us so that r_a has its initial value
4392!--             for the first time step. Only for interior core domain, not for ghost points
4393                surf_lsm_v(l)%us(m)   = 0.1_wp
4394                surf_lsm_v(l)%ts(m)   = ( surf_lsm_v(l)%pt1(m) - surf_lsm_v(l)%pt_surface(m) ) /&
4395                                          surf_lsm_v(l)%r_a(m)
4396                surf_lsm_v(l)%shf(m)  = - surf_lsm_v(l)%us(m) *                &
4397                                          surf_lsm_v(l)%ts(m) * rho_surface
4398
4399             ENDDO
4400          ENDDO
4401       ENDIF
4402!
4403!--    Level 1 initialization of root distribution - provided by the user via
4404!--    via namelist.
4405       DO  m = 1, surf_lsm_h%ns
4406          DO  k = nzb_soil, nzt_soil
4407             surf_lsm_h%root_fr(k,m) = root_fraction(k)
4408          ENDDO
4409       ENDDO
4410
4411       DO  l = 0, 3
4412          DO  m = 1, surf_lsm_v(l)%ns
4413             DO  k = nzb_soil, nzt_soil
4414                surf_lsm_v(l)%root_fr(k,m) = root_fraction(k)
4415             ENDDO
4416          ENDDO
4417       ENDDO
4418
4419!
4420!--    Level 2 initialization of root distribution.
4421!--    When no root distribution is given by the user, use look-up table to prescribe
4422!--    the root fraction in the individual soil layers.
4423       IF ( ALL( root_fraction == 9999999.9_wp ) )  THEN
4424!
4425!--       First, calculate the index bounds for integration
4426          n_soil_layers_total = nzt_soil - nzb_soil + 6
4427          ALLOCATE ( bound(0:n_soil_layers_total) )
4428          ALLOCATE ( bound_root_fr(0:n_soil_layers_total) )
4429
4430          kn = 0
4431          ko = 0
4432          bound(0) = 0.0_wp
4433          DO k = 1, n_soil_layers_total-1
4434             IF ( zs_layer(kn) <= zs_ref(ko) )  THEN
4435                bound(k) = zs_layer(kn)
4436                bound_root_fr(k) = ko
4437                kn = kn + 1
4438                IF ( kn > nzt_soil+1 )  THEN
4439                   kn = nzt_soil
4440                ENDIF
4441             ELSE
4442                bound(k) = zs_ref(ko)
4443                bound_root_fr(k) = ko
4444                ko = ko + 1
4445                IF ( ko > 3 )  THEN
4446                   ko = 3
4447                ENDIF
4448             ENDIF
4449
4450          ENDDO
4451
4452!
4453!--       Integrate over all soil layers based on the four-layer root fraction
4454          kzs = 1
4455          root_fraction = 0.0_wp
4456          DO k = 0, n_soil_layers_total-2
4457             kroot = bound_root_fr(k+1)
4458             root_fraction(kzs-1) = root_fraction(kzs-1)                       &
4459                                + root_distribution(kroot,vegetation_type)     &
4460                                / dz_soil_ref(kroot) * ( bound(k+1) - bound(k) )
4461
4462             IF ( bound(k+1) == zs_layer(kzs-1) )  THEN
4463                kzs = kzs+1
4464             ENDIF
4465          ENDDO
4466
4467
4468!
4469!--       Normalize so that the sum of all fractions equals one
4470          root_fraction = root_fraction / SUM(root_fraction)
4471
4472          DEALLOCATE ( bound )
4473          DEALLOCATE ( bound_root_fr )
4474
4475!
4476!--       Map calculated root fractions
4477          DO  m = 1, surf_lsm_h%ns
4478             DO  k = nzb_soil, nzt_soil 
4479                IF ( surf_lsm_h%pavement_surface(m)  .AND.                     &
4480                     k <= surf_lsm_h%nzt_pavement(m) )  THEN
4481                   surf_lsm_h%root_fr(k,m) = 0.0_wp
4482                ELSE
4483                   surf_lsm_h%root_fr(k,m) = root_fraction(k)
4484                ENDIF
4485
4486             ENDDO
4487!
4488!--          Normalize so that the sum = 1. Only relevant when the root         
4489!--          distribution was set to zero due to pavement at some layers.
4490             IF ( SUM( surf_lsm_h%root_fr(:,m) ) > 0.0_wp )  THEN
4491                DO k = nzb_soil, nzt_soil
4492                   surf_lsm_h%root_fr(k,m) = surf_lsm_h%root_fr(k,m)           &
4493                   / SUM( surf_lsm_h%root_fr(:,m) )
4494                ENDDO
4495             ENDIF
4496          ENDDO
4497          DO  l = 0, 3
4498             DO  m = 1, surf_lsm_v(l)%ns
4499                DO  k = nzb_soil, nzt_soil
4500                   IF ( surf_lsm_v(l)%pavement_surface(m)  .AND.               &
4501                        k <= surf_lsm_v(l)%nzt_pavement(m) )  THEN
4502                      surf_lsm_v(l)%root_fr(k,m) = 0.0_wp
4503                   ELSE
4504                      surf_lsm_v(l)%root_fr(k,m) = root_fraction(k)
4505                   ENDIF
4506                ENDDO
4507!
4508!--             Normalize so that the sum = 1. Only relevant when the root     
4509!--             distribution was set to zero due to pavement at some layers.
4510                IF ( SUM( surf_lsm_v(l)%root_fr(:,m) ) > 0.0_wp )  THEN
4511                   DO  k = nzb_soil, nzt_soil 
4512                      surf_lsm_v(l)%root_fr(k,m) = surf_lsm_v(l)%root_fr(k,m)  &
4513                      / SUM( surf_lsm_v(l)%root_fr(:,m) )
4514                   ENDDO
4515                ENDIF
4516             ENDDO
4517           ENDDO
4518       ENDIF
4519!
4520!--    Level 3 initialization of root distribution.
4521!--    Take value from file
4522       IF ( root_area_density_lsm_f%from_file )  THEN
4523          DO  m = 1, surf_lsm_h%ns
4524             IF ( surf_lsm_h%vegetation_surface(m) )  THEN
4525                i = surf_lsm_h%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,            &
4526                                             surf_lsm_v(l)%building_covered(m) ) 
4527                j = surf_lsm_h%j(m) + MERGE( 0, surf_lsm_v(l)%joff,            &
4528                                             surf_lsm_v(l)%building_covered(m) ) 
4529                DO  k = nzb_soil, nzt_soil 
4530                   surf_lsm_h%root_fr(k,m) = root_area_density_lsm_f%var(k,j,i) 
4531                ENDDO
4532
4533             ENDIF
4534          ENDDO
4535
4536          DO  l = 0, 3
4537             DO  m = 1, surf_lsm_v(l)%ns
4538                IF ( surf_lsm_v(l)%vegetation_surface(m) )  THEN
4539                   i = surf_lsm_v(l)%i(m) + MERGE( 0, surf_lsm_v(l)%ioff,      &
4540                                                   surf_lsm_v(l)%building_covered(m) ) 
4541                   j = surf_lsm_v(l)%j(m) + MERGE( 0, surf_lsm_v(l)%joff,      &
4542                                                   surf_lsm_v(l)%building_covered(m) ) 
4543
4544                   DO  k = nzb_soil, nzt_soil 
4545                      surf_lsm_v(l)%root_fr(k,m) = root_area_density_lsm_f%var(k,j,i) 
4546                   ENDDO
4547
4548                ENDIF
4549             ENDDO
4550          ENDDO
4551
4552       ENDIF
4553 
4554!
4555!--    Possibly do user-defined actions (e.g. define heterogeneous land surface)
4556       CALL user_init_land_surface
4557
4558
4559!
4560!--    Calculate new roughness lengths (for water surfaces only, i.e. only
4561!-     horizontal surfaces)
4562       IF ( .NOT. constant_roughness )  CALL calc_z0_water_surface
4563
4564       t_soil_h_p    = t_soil_h
4565       m_soil_h_p    = m_soil_h
4566       m_liq_h_p     = m_liq_h
4567       t_surface_h_p = t_surface_h
4568
4569       t_soil_v_p    = t_soil_v
4570       m_soil_v_p    = m_soil_v
4571       m_liq_v_p     = m_liq_v
4572       t_surface_v_p = t_surface_v
4573
4574
4575
4576!--    Store initial profiles of t_soil and m_soil (assuming they are
4577!--    horizontally homogeneous on this PE)
4578!--    DEACTIVATED FOR NOW - leads to error when number of locations with
4579!--    soil model is zero on a PE.
4580!        hom(nzb_soil:nzt_soil,1,90,:)  = SPREAD( t_soil_h%var_2d(nzb_soil:nzt_soil,1),  &
4581!                                                 2, statistic_regions+1 )
4582!        hom(nzb_soil:nzt_soil,1,92,:)  = SPREAD( m_soil_h%var_2d(nzb_soil:nzt_soil,1),  &
4583!                                                 2, statistic_regions+1 )
4584
4585!
4586!--    Finally, make some consistency checks.
4587!--    Ceck for illegal combination of LAI and vegetation coverage.
4588       IF ( ANY( .NOT. surf_lsm_h%pavement_surface  .AND.                      &
4589                 surf_lsm_h%lai == 0.0_wp  .AND.  surf_lsm_h%c_veg == 1.0_wp ) &
4590          )  THEN
4591          message_string = 'For non-pavement surfaces the combination ' //     &
4592                           ' lai = 0.0 and c_veg = 1.0 is not allowed.'
4593          CALL message( 'lsm_rrd_local', 'PA0671', 2, 2, 0, 6, 0 )
4594       ENDIF
4595
4596       DO  l = 0, 3
4597          IF ( ANY( .NOT. surf_lsm_v(l)%pavement_surface  .AND.                &
4598                    surf_lsm_v(l)%lai == 0.0_wp  .AND.                         &
4599                    surf_lsm_v(l)%c_veg == 1.0_wp ) )  THEN
4600             message_string = 'For non-pavement surfaces the combination ' //  &
4601                              ' lai = 0.0 and c_veg = 1.0 is not allowed.'
4602             CALL message( 'lsm_rrd_local', 'PA0671', 2, 2, 0, 6, 0 )
4603          ENDIF
4604       ENDDO
4605!
4606!--    Check if roughness length for momentum, heat, or moisture exceed
4607!--    surface-layer height and decrease local roughness length where
4608!--    necessary.
4609       DO  m = 1, surf_lsm_h%ns
4610          IF ( surf_lsm_h%z0(m) > 0.5_wp * surf_lsm_h%z_mo(m) )  THEN
4611         
4612             surf_lsm_h%z0(m) = 0.5_wp * surf_lsm_h%z_mo(m)
4613             
4614             WRITE( message_string, * ) 'z0 exceeds surface-layer height ' //  &
4615                            'at horizontal natural surface and is ' //         &
4616                            'decreased appropriately at grid point (i,j) = ',  &
4617                            surf_lsm_h%i(m), surf_lsm_h%j(m)
4618             CALL message( 'land_surface_model_mod', 'PA0503',                 &
4619                            0, 0, myid, 6, 0 )
4620          ENDIF
4621          IF ( surf_lsm_h%z0h(m) > 0.5_wp * surf_lsm_h%z_mo(m) )  THEN
4622         
4623             surf_lsm_h%z0h(m) = 0.5_wp * surf_lsm_h%z_mo(m)
4624             surf_lsm_h%z0q(m) = 0.5_wp * surf_lsm_h%z_mo(m)
4625             
4626             WRITE( message_string, * ) 'z0h exceeds surface-layer height ' // &
4627                            'at horizontal natural surface and is ' //         &
4628                            'decreased appropriately at grid point (i,j) = ',  &
4629                            surf_lsm_h%i(m), surf_lsm_h%j(m)
4630             CALL message( 'land_surface_model_mod', 'PA0507',                 &
4631                            0, 0, myid, 6, 0 )
4632          ENDIF
4633       ENDDO
4634       
4635       DO  l = 0, 3
4636          DO  m = 1, surf_lsm_v(l)%ns
4637             IF ( surf_lsm_v(l)%z0(m) > 0.5_wp * surf_lsm_v(l)%z_mo(m) )  THEN
4638         
4639                surf_lsm_v(l)%z0(m) = 0.5_wp * surf_lsm_v(l)%z_mo(m)
4640             
4641                WRITE( message_string, * ) 'z0 exceeds surface-layer height '//&
4642                            'at vertical natural surface and is ' //           &
4643                            'decreased appropriately at grid point (i,j) = ',  &
4644                            surf_lsm_v(l)%i(m)+surf_lsm_v(l)%ioff,             &
4645                            surf_lsm_v(l)%j(m)+surf_lsm_v(l)%joff
4646                CALL message( 'land_surface_model_mod', 'PA0503',              &
4647                            0, 0, myid, 6, 0 )
4648             ENDIF
4649             IF ( surf_lsm_v(l)%z0h(m) > 0.5_wp * surf_lsm_v(l)%z_mo(m) )  THEN
4650         
4651                surf_lsm_v(l)%z0h(m) = 0.5_wp * surf_lsm_v(l)%z_mo(m)
4652                surf_lsm_v(l)%z0q(m) = 0.5_wp * surf_lsm_v(l)%z_mo(m)
4653             
4654                WRITE( message_string, * ) 'z0h exceeds surface-layer height '//&
4655                            'at vertical natural surface and is ' //           &
4656                            'decreased appropriately at grid point (i,j) = ',  &
4657                            surf_lsm_v(l)%i(m)+surf_lsm_v(l)%ioff,             &
4658                            surf_lsm_v(l)%j(m)+surf_lsm_v(l)%joff
4659                CALL message( 'land_surface_model_mod', 'PA0507',              &
4660                            0, 0, myid, 6, 0 )
4661             ENDIF
4662          ENDDO
4663       ENDDO
4664
4665       IF ( debug_output )  CALL debug_message( 'lsm_init', 'end' )
4666
4667    END SUBROUTINE lsm_init
4668
4669
4670!------------------------------------------------------------------------------!
4671! Description:
4672! ------------
4673!> Allocate land surface model arrays and define pointers
4674!------------------------------------------------------------------------------!
4675    SUBROUTINE lsm_init_arrays
4676   
4677
4678       IMPLICIT NONE
4679
4680       INTEGER(iwp) ::  l !< index indicating facing of surface array
4681   
4682       ALLOCATE ( root_extr(nzb_soil:nzt_soil) )
4683       root_extr = 0.0_wp 
4684       
4685!
4686!--    Allocate surface and soil temperature / humidity. Please note,
4687!--    these arrays are allocated according to surface-data structure,
4688!--    even if they do not belong to the data type due to the
4689!--    pointer arithmetric (TARGET attribute is not allowed in a data-type).
4690!
4691!--    Horizontal surfaces
4692       ALLOCATE ( m_liq_h_1%var_1d(1:surf_lsm_h%ns)                      )
4693       ALLOCATE ( m_liq_h_2%var_1d(1:surf_lsm_h%ns)                      )
4694       ALLOCATE ( t_surface_h_1%var_1d(1:surf_lsm_h%ns)                  )
4695       ALLOCATE ( t_surface_h_2%var_1d(1:surf_lsm_h%ns)                  )
4696       ALLOCATE ( m_soil_h_1%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)   )
4697       ALLOCATE ( m_soil_h_2%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)   )
4698       ALLOCATE ( t_soil_h_1%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) )
4699       ALLOCATE ( t_soil_h_2%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) )
4700!
4701!--    Vertical surfaces
4702       DO  l = 0, 3
4703          ALLOCATE ( m_liq_v_1(l)%var_1d(1:surf_lsm_v(l)%ns)                      )
4704          ALLOCATE ( m_liq_v_2(l)%var_1d(1:surf_lsm_v(l)%ns)                      )
4705          ALLOCATE ( t_surface_v_1(l)%var_1d(1:surf_lsm_v(l)%ns)                  )
4706          ALLOCATE ( t_surface_v_2(l)%var_1d(1:surf_lsm_v(l)%ns)                  )
4707          ALLOCATE ( m_soil_v_1(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)   )
4708          ALLOCATE ( m_soil_v_2(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)   )
4709          ALLOCATE ( t_soil_v_1(l)%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns) )
4710          ALLOCATE ( t_soil_v_2(l)%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns) )
4711       ENDDO
4712
4713!
4714!--    Allocate array for heat flux in W/m2, required for radiation?
4715!--    Consider to remove this array
4716       ALLOCATE( surf_lsm_h%surfhf(1:surf_lsm_h%ns) )
4717       DO  l = 0, 3
4718          ALLOCATE( surf_lsm_v(l)%surfhf(1:surf_lsm_v(l)%ns) )
4719       ENDDO
4720
4721
4722!
4723!--    Allocate intermediate timestep arrays
4724!--    Horizontal surfaces
4725       ALLOCATE ( tm_liq_h_m%var_1d(1:surf_lsm_h%ns)                     )
4726       ALLOCATE ( tt_surface_h_m%var_1d(1:surf_lsm_h%ns)                 )
4727       ALLOCATE ( tm_soil_h_m%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)  )
4728       ALLOCATE ( tt_soil_h_m%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)  ) 
4729!
4730!--    Horizontal surfaces
4731       DO  l = 0, 3
4732          ALLOCATE ( tm_liq_v_m(l)%var_1d(1:surf_lsm_v(l)%ns)                     )
4733          ALLOCATE ( tt_surface_v_m(l)%var_1d(1:surf_lsm_v(l)%ns)                 )
4734          ALLOCATE ( tm_soil_v_m(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)  )
4735          ALLOCATE ( tt_soil_v_m(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)  )
4736       ENDDO 
4737
4738!
4739!--    Allocate 2D vegetation model arrays
4740!--    Horizontal surfaces
4741       ALLOCATE ( surf_lsm_h%building_surface(1:surf_lsm_h%ns)    )
4742       ALLOCATE ( surf_lsm_h%c_liq(1:surf_lsm_h%ns)               )
4743       ALLOCATE ( surf_lsm_h%c_surface(1:surf_lsm_h%ns)           )
4744       ALLOCATE ( surf_lsm_h%c_veg(1:surf_lsm_h%ns)               )
4745       ALLOCATE ( surf_lsm_h%f_sw_in(1:surf_lsm_h%ns)             )
4746       ALLOCATE ( surf_lsm_h%ghf(1:surf_lsm_h%ns)                 )
4747       ALLOCATE ( surf_lsm_h%g_d(1:surf_lsm_h%ns)                 )
4748       ALLOCATE ( surf_lsm_h%lai(1:surf_lsm_h%ns)                 )
4749       ALLOCATE ( surf_lsm_h%lambda_surface_u(1:surf_lsm_h%ns)    )
4750       ALLOCATE ( surf_lsm_h%lambda_surface_s(1:surf_lsm_h%ns)    )
4751       ALLOCATE ( surf_lsm_h%nzt_pavement(1:surf_lsm_h%ns)        )
4752       ALLOCATE ( surf_lsm_h%pavement_surface(1:surf_lsm_h%ns)    )
4753       ALLOCATE ( surf_lsm_h%qsws_soil(1:surf_lsm_h%ns)           )
4754       ALLOCATE ( surf_lsm_h%qsws_liq(1:surf_lsm_h%ns)            )
4755       ALLOCATE ( surf_lsm_h%qsws_veg(1:surf_lsm_h%ns)            )
4756       ALLOCATE ( surf_lsm_h%rad_net_l(1:surf_lsm_h%ns)           ) 
4757       ALLOCATE ( surf_lsm_h%r_a(1:surf_lsm_h%ns)                 )
4758       ALLOCATE ( surf_lsm_h%r_canopy(1:surf_lsm_h%ns)            )
4759       ALLOCATE ( surf_lsm_h%r_soil(1:surf_lsm_h%ns)              )
4760       ALLOCATE ( surf_lsm_h%r_soil_min(1:surf_lsm_h%ns)          )
4761       ALLOCATE ( surf_lsm_h%r_s(1:surf_lsm_h%ns)                 )
4762       ALLOCATE ( surf_lsm_h%r_canopy_min(1:surf_lsm_h%ns)        )
4763       ALLOCATE ( surf_lsm_h%vegetation_surface(1:surf_lsm_h%ns)  )
4764       ALLOCATE ( surf_lsm_h%water_surface(1:surf_lsm_h%ns)       )
4765
4766       surf_lsm_h%water_surface        = .FALSE.
4767       surf_lsm_h%pavement_surface     = .FALSE.
4768       surf_lsm_h%vegetation_surface   = .FALSE. 
4769
4770!
4771!--    Set default values
4772       surf_lsm_h%r_canopy_min = 0.0_wp
4773
4774!
4775!--    Vertical surfaces
4776       DO  l = 0, 3
4777          ALLOCATE ( surf_lsm_v(l)%building_surface(1:surf_lsm_v(l)%ns)    )
4778          ALLOCATE ( surf_lsm_v(l)%c_liq(1:surf_lsm_v(l)%ns)               )
4779          ALLOCATE ( surf_lsm_v(l)%c_surface(1:surf_lsm_v(l)%ns)           )
4780          ALLOCATE ( surf_lsm_v(l)%c_veg(1:surf_lsm_v(l)%ns)               )
4781          ALLOCATE ( surf_lsm_v(l)%f_sw_in(1:surf_lsm_v(l)%ns)             )
4782          ALLOCATE ( surf_lsm_v(l)%ghf(1:surf_lsm_v(l)%ns)                 )
4783          ALLOCATE ( surf_lsm_v(l)%g_d(1:surf_lsm_v(l)%ns)                 )
4784          ALLOCATE ( surf_lsm_v(l)%lai(1:surf_lsm_v(l)%ns)                 )
4785          ALLOCATE ( surf_lsm_v(l)%lambda_surface_u(1:surf_lsm_v(l)%ns)    )
4786          ALLOCATE ( surf_lsm_v(l)%lambda_surface_s(1:surf_lsm_v(l)%ns)    )
4787          ALLOCATE ( surf_lsm_v(l)%nzt_pavement(1:surf_lsm_v(l)%ns)        )
4788          ALLOCATE ( surf_lsm_v(l)%pavement_surface(1:surf_lsm_v(l)%ns)    )
4789          ALLOCATE ( surf_lsm_v(l)%qsws_soil(1:surf_lsm_v(l)%ns)           )
4790          ALLOCATE ( surf_lsm_v(l)%qsws_liq(1:surf_lsm_v(l)%ns)            )
4791          ALLOCATE ( surf_lsm_v(l)%qsws_veg(1:surf_lsm_v(l)%ns)            )
4792          ALLOCATE ( surf_lsm_v(l)%rad_net_l(1:surf_lsm_v(l)%ns)           )
4793          ALLOCATE ( surf_lsm_v(l)%r_a(1:surf_lsm_v(l)%ns)                 )
4794          ALLOCATE ( surf_lsm_v(l)%r_canopy(1:surf_lsm_v(l)%ns)            )
4795          ALLOCATE ( surf_lsm_v(l)%r_soil(1:surf_lsm_v(l)%ns)              )
4796          ALLOCATE ( surf_lsm_v(l)%r_soil_min(1:surf_lsm_v(l)%ns)          )
4797          ALLOCATE ( surf_lsm_v(l)%r_s(1:surf_lsm_v(l)%ns)                 )
4798          ALLOCATE ( surf_lsm_v(l)%r_canopy_min(1:surf_lsm_v(l)%ns)        )
4799          ALLOCATE ( surf_lsm_v(l)%vegetation_surface(1:surf_lsm_v(l)%ns)  )
4800          ALLOCATE ( surf_lsm_v(l)%water_surface(1:surf_lsm_v(l)%ns)       )
4801
4802          surf_lsm_v(l)%water_surface       = .FALSE.
4803          surf_lsm_v(l)%pavement_surface    = .FALSE.
4804          surf_lsm_v(l)%vegetation_surface  = .FALSE. 
4805         
4806
4807!
4808!--       Set default values
4809          surf_lsm_v(l)%r_canopy_min = 0.0_wp
4810       
4811       ENDDO
4812
4813!
4814!--    Initial assignment of the pointers
4815!--    Horizontal surfaces
4816       t_soil_h    => t_soil_h_1;    t_soil_h_p    => t_soil_h_2
4817       t_surface_h => t_surface_h_1; t_surface_h_p => t_surface_h_2
4818       m_soil_h    => m_soil_h_1;    m_soil_h_p    => m_soil_h_2
4819       m_liq_h     => m_liq_h_1;     m_liq_h_p     => m_liq_h_2
4820!
4821!--    Vertical surfaces
4822       t_soil_v    => t_soil_v_1;    t_soil_v_p    => t_soil_v_2
4823       t_surface_v => t_surface_v_1; t_surface_v_p => t_surface_v_2
4824       m_soil_v    => m_soil_v_1;    m_soil_v_p    => m_soil_v_2
4825       m_liq_v     => m_liq_v_1;     m_liq_v_p     => m_liq_v_2
4826
4827
4828    END SUBROUTINE lsm_init_arrays
4829
4830
4831!------------------------------------------------------------------------------!
4832! Description:
4833! ------------
4834!> Parin for &lsmpar for land surface model
4835!------------------------------------------------------------------------------!
4836    SUBROUTINE lsm_parin
4837
4838       USE control_parameters,                                                 &
4839           ONLY:  message_string
4840
4841       IMPLICIT NONE
4842
4843       CHARACTER (LEN=80) ::  line  !< dummy string that contains the current line of the parameter file
4844       
4845       NAMELIST /lsm_par/         alpha_vangenuchten, c_surface,               &
4846                                  canopy_resistance_coefficient,               &
4847                                  constant_roughness,                          &
4848                                  conserve_water_content,                      &
4849                                  deep_soil_temperature,                       &
4850                                  dz_soil,                                     &
4851                                  f_shortwave_incoming, field_capacity,        & 
4852                                  aero_resist_kray, hydraulic_conductivity,    &
4853                                  lambda_surface_stable,                       &
4854                                  lambda_surface_unstable, leaf_area_index,    &
4855                                  l_vangenuchten, min_canopy_resistance,       &
4856                                  min_soil_resistance, n_vangenuchten,         &
4857                                  pavement_depth_level,                        &
4858                                  pavement_heat_capacity,                      &
4859                                  pavement_heat_conduct, pavement_type,        &
4860                                  residual_moisture, root_fraction,            &
4861                                  saturation_moisture, skip_time_do_lsm,       &
4862                                  soil_moisture, soil_temperature,             &
4863                                  soil_type,                                   &
4864                                  surface_type,                                &
4865                                  vegetation_coverage, vegetation_type,        &
4866                                  water_temperature, water_type,               &
4867                                  wilting_point, z0_vegetation,                &
4868                                  z0h_vegetation, z0q_vegetation, z0_water,    &
4869                                  z0h_water, z0q_water, z0_pavement,           &
4870                                  z0h_pavement, z0q_pavement
4871
4872       NAMELIST /land_surface_parameters/                                      &
4873                                  alpha_vangenuchten, c_surface,               &
4874                                  canopy_resistance_coefficient,               &
4875                                  constant_roughness,                          &
4876                                  conserve_water_content,                      &
4877                                  deep_soil_temperature,                       &
4878                                  dz_soil,                                     &
4879                                  f_shortwave_incoming, field_capacity,        & 
4880                                  aero_resist_kray, hydraulic_conductivity,    &
4881                                  lambda_surface_stable,                       &
4882                                  lambda_surface_unstable, leaf_area_index,    &
4883                                  l_vangenuchten, min_canopy_resistance,       &
4884                                  min_soil_resistance, n_vangenuchten,         &
4885                                  pavement_depth_level,                        &
4886                                  pavement_heat_capacity,                      &
4887                                  pavement_heat_conduct, pavement_type,        &
4888                                  residual_moisture, root_fraction,            &
4889                                  saturation_moisture, skip_time_do_lsm,       &
4890                                  soil_moisture, soil_temperature,             &
4891                                  soil_type,                                   &
4892                                  surface_type,                                &
4893                                  vegetation_coverage, vegetation_type,        &
4894                                  water_temperature, water_type,               &
4895                                  wilting_point, z0_vegetation,                &
4896                                  z0h_vegetation, z0q_vegetation, z0_water,    &
4897                                  z0h_water, z0q_water, z0_pavement,           &
4898                                  z0h_pavement, z0q_pavement
4899                                 
4900       line = ' '
4901 
4902!
4903!--    Try to find land surface model package
4904       REWIND ( 11 )
4905       line = ' '
4906       DO WHILE ( INDEX( line, '&land_surface_parameters' ) == 0 )
4907          READ ( 11, '(A)', END=12 )  line
4908       ENDDO
4909       BACKSPACE ( 11 )
4910
4911!
4912!--    Read user-defined namelist
4913       READ ( 11, land_surface_parameters, ERR = 10 )
4914
4915!
4916!--    Set flag that indicates that the land surface model is switched on
4917       land_surface = .TRUE.
4918       
4919       GOTO 14
4920
4921 10    BACKSPACE( 11 )
4922       READ( 11 , '(A)') line
4923       CALL parin_fail_message( 'land_surface_parameters', line )
4924!
4925!--    Try to find old namelist
4926 12    REWIND ( 11 )
4927       line = ' '
4928       DO WHILE ( INDEX( line, '&lsm_par' ) == 0 )
4929          READ ( 11, '(A)', END=14 )  line
4930       ENDDO
4931       BACKSPACE ( 11 )
4932
4933!
4934!--    Read user-defined namelist
4935       READ ( 11, lsm_par, ERR = 13, END = 14 )
4936
4937       message_string = 'namelist lsm_par is deprecated and will be ' // &
4938                     'removed in near future. Please use namelist ' //   &
4939                     'land_surface_parameters instead'
4940       CALL message( 'lsm_parin', 'PA0487', 0, 1, 0, 6, 0 )
4941       
4942!
4943!--    Set flag that indicates that the land surface model is switched on
4944       land_surface = .TRUE.
4945       
4946       GOTO 14
4947
4948 13    BACKSPACE( 11 )
4949       READ( 11 , '(A)') line
4950       CALL parin_fail_message( 'lsm_par', line )
4951
4952
4953 14    CONTINUE
4954       
4955
4956    END SUBROUTINE lsm_parin
4957
4958
4959!------------------------------------------------------------------------------!
4960! Description:
4961! ------------
4962!> Soil model as part of the land surface model. The model predicts soil
4963!> temperature and water content.
4964!------------------------------------------------------------------------------!
4965    SUBROUTINE lsm_soil_model( horizontal, l, calc_soil_moisture )
4966
4967
4968       IMPLICIT NONE
4969
4970       INTEGER(iwp) ::  k       !< running index
4971       INTEGER(iwp) ::  l       !< surface-data type index indication facing
4972       INTEGER(iwp) ::  m       !< running index
4973
4974       LOGICAL, INTENT(IN) ::  calc_soil_moisture !< flag indicating whether soil moisture shall be calculated or not.
4975
4976       LOGICAL      ::  horizontal !< flag indication horizontal wall, required to set pointer accordingly
4977
4978       REAL(wp)     ::  h_vg !< Van Genuchten coef. h
4979
4980       REAL(wp), DIMENSION(nzb_soil:nzt_soil) :: gamma_temp,  & !< temp. gamma
4981                                                 lambda_temp, & !< temp. lambda
4982                                                 tend           !< tendency
4983
4984       TYPE(surf_type_lsm), POINTER ::  surf_m_soil
4985       TYPE(surf_type_lsm), POINTER ::  surf_m_soil_p
4986       TYPE(surf_type_lsm), POINTER ::  surf_t_soil
4987       TYPE(surf_type_lsm), POINTER ::  surf_t_soil_p
4988       TYPE(surf_type_lsm), POINTER ::  surf_tm_soil_m
4989       TYPE(surf_type_lsm), POINTER ::  surf_tt_soil_m
4990
4991       TYPE(surf_type), POINTER  ::  surf  !< surface-date type variable
4992
4993
4994       IF ( debug_output_timestep )  THEN
4995          WRITE( debug_string, * ) 'lsm_soil_model', horizontal, l, calc_soil_moisture
4996          CALL debug_message( debug_string, 'start' )
4997       ENDIF
4998
4999       IF ( horizontal )  THEN
5000          surf           => surf_lsm_h
5001
5002          surf_m_soil    => m_soil_h
5003          surf_m_soil_p  => m_soil_h_p
5004          surf_t_soil    => t_soil_h
5005          surf_t_soil_p  => t_soil_h_p
5006          surf_tm_soil_m => tm_soil_h_m
5007          surf_tt_soil_m => tt_soil_h_m
5008       ELSE
5009          surf           => surf_lsm_v(l)
5010
5011          surf_m_soil    => m_soil_v(l)
5012          surf_m_soil_p  => m_soil_v_p(l)
5013          surf_t_soil    => t_soil_v(l)
5014          surf_t_soil_p  => t_soil_v_p(l)
5015          surf_tm_soil_m => tm_soil_v_m(l)
5016          surf_tt_soil_m => tt_soil_v_m(l)
5017       ENDIF
5018
5019       !$OMP PARALLEL PRIVATE (m, k, lambda_temp, lambda_h_sat, ke, tend, gamma_temp, h_vg, m_total)
5020       !$OMP DO SCHEDULE (STATIC)
5021       DO  m = 1, surf%ns
5022
5023          IF (  .NOT.  surf%water_surface(m) )  THEN
5024             DO  k = nzb_soil, nzt_soil
5025
5026                IF ( surf%pavement_surface(m)  .AND.                           &
5027                     k <= surf%nzt_pavement(m) )  THEN
5028                   
5029                   surf%rho_c_total(k,m) = surf%rho_c_total_def(k,m)
5030                   lambda_temp(k)        = surf%lambda_h_def(k,m) 
5031
5032                ELSE           
5033!
5034!--                Calculate volumetric heat capacity of the soil, taking
5035!--                into account water content
5036                   surf%rho_c_total(k,m) = (rho_c_soil *                       &
5037                                               ( 1.0_wp - surf%m_sat(k,m) )    &
5038                                               + rho_c_water * surf_m_soil%var_2d(k,m) )
5039
5040!
5041!--                Calculate soil heat conductivity at the center of the soil
5042!--                layers
5043                   lambda_h_sat = lambda_h_sm**(1.0_wp - surf%m_sat(k,m)) *    &
5044                                  lambda_h_water ** surf_m_soil%var_2d(k,m)
5045
5046                   ke = 1.0_wp + LOG10( MAX( 0.1_wp, surf_m_soil%var_2d(k,m) / &
5047                                                     surf%m_sat(k,m) ) )
5048
5049                   lambda_temp(k) = ke * (lambda_h_sat - lambda_h_dry) +       &
5050                                    lambda_h_dry
5051                ENDIF
5052             ENDDO
5053
5054!
5055!--          Calculate soil heat conductivity (lambda_h) at the _layer level
5056!--          using linear interpolation. For pavement surface, the
5057!--          true pavement depth is considered
5058             DO  k = nzb_soil, nzt_soil-1
5059                   surf%lambda_h(k,m) = ( lambda_temp(k+1) + lambda_temp(k) )  &
5060                                        * 0.5_wp
5061             ENDDO
5062             surf%lambda_h(nzt_soil,m) = lambda_temp(nzt_soil)
5063
5064!
5065!--          Prognostic equation for soil temperature t_soil
5066             tend(:) = 0.0_wp
5067
5068             tend(nzb_soil) = ( 1.0_wp / surf%rho_c_total(nzb_soil,m) ) *            &
5069                    ( surf%lambda_h(nzb_soil,m) * ( surf_t_soil%var_2d(nzb_soil+1,m) &
5070                      - surf_t_soil%var_2d(nzb_soil,m) ) * ddz_soil_center(nzb_soil) &
5071                      + surf%ghf(m) ) * ddz_soil(nzb_soil)
5072
5073             DO  k = nzb_soil+1, nzt_soil
5074                tend(k) = ( 1.0_wp / surf%rho_c_total(k,m) )                   &
5075                          * (   surf%lambda_h(k,m)                             &
5076                     * ( surf_t_soil%var_2d(k+1,m) - surf_t_soil%var_2d(k,m) ) &
5077                     * ddz_soil_center(k)                                      &
5078                     - surf%lambda_h(k-1,m)                                    &
5079                     * ( surf_t_soil%var_2d(k,m) - surf_t_soil%var_2d(k-1,m) ) &
5080                     * ddz_soil_center(k-1)                                    &
5081                            ) * ddz_soil(k)
5082
5083             ENDDO
5084
5085             surf_t_soil_p%var_2d(nzb_soil:nzt_soil,m) =                       &
5086                                       surf_t_soil%var_2d(nzb_soil:nzt_soil,m) &
5087                                               + dt_3d * ( tsc(2)              &
5088                                               * tend(nzb_soil:nzt_soil)       & 
5089                                               + tsc(3)                        &
5090                                               * surf_tt_soil_m%var_2d(nzb_soil:nzt_soil,m) )
5091
5092!
5093!--          Calculate t_soil tendencies for the next Runge-Kutta step
5094             IF ( timestep_scheme(1:5) == 'runge' )  THEN
5095                IF ( intermediate_timestep_count == 1 )  THEN
5096                   DO  k = nzb_soil, nzt_soil
5097                      surf_tt_soil_m%var_2d(k,m) = tend(k)
5098                   ENDDO
5099                ELSEIF ( intermediate_timestep_count <                         &
5100                         intermediate_timestep_count_max )  THEN
5101                   DO  k = nzb_soil, nzt_soil
5102                      surf_tt_soil_m%var_2d(k,m) = -9.5625_wp * tend(k) +      &
5103                                                    5.3125_wp *                &
5104                                                      surf_tt_soil_m%var_2d(k,m)
5105                   ENDDO
5106                ENDIF
5107             ENDIF
5108
5109
5110             DO  k = nzb_soil, nzt_soil
5111
5112!
5113!--             In order to prevent water tranport through paved surfaces,
5114!--             conductivity and diffusivity are set to zero
5115                IF ( surf%pavement_surface(m)  .AND.                           &
5116                     k <= surf%nzt_pavement(m) )  THEN
5117                   lambda_temp(k) = 0.0_wp
5118                   gamma_temp(k)  = 0.0_wp
5119   
5120                ELSE 
5121   
5122!
5123!--                Calculate soil diffusivity at the center of the soil layers
5124                   lambda_temp(k) = (- b_ch * surf%gamma_w_sat(k,m) * psi_sat  &
5125                                    / surf%m_sat(k,m) ) * (                    &
5126                                    MAX( surf_m_soil%var_2d(k,m),              &
5127                                    surf%m_wilt(k,m) ) / surf%m_sat(k,m) )**(  &
5128                                    b_ch + 2.0_wp )
5129
5130!
5131!--                Parametrization of Van Genuchten
5132!--                Calculate the hydraulic conductivity after Van Genuchten (1980)
5133                   h_vg = ( ( ( surf%m_res(k,m) - surf%m_sat(k,m) ) /          &
5134                              ( surf%m_res(k,m) -                              &
5135                                MAX( surf_m_soil%var_2d(k,m), surf%m_wilt(k,m) )&
5136                              )                                                &
5137                            )**(                                               &
5138                          surf%n_vg(k,m) / ( surf%n_vg(k,m) - 1.0_wp )         &
5139                               ) - 1.0_wp                                      &
5140                          )**( 1.0_wp / surf%n_vg(k,m) ) / surf%alpha_vg(k,m)
5141
5142                   gamma_temp(k) = surf%gamma_w_sat(k,m) * ( ( ( 1.0_wp +      &
5143                          ( surf%alpha_vg(k,m) * h_vg )**surf%n_vg(k,m)        &
5144                                                                  )**(         &
5145                              1.0_wp - 1.0_wp / surf%n_vg(k,m)) - (            &
5146                          surf%alpha_vg(k,m) * h_vg )**( surf%n_vg(k,m)        &
5147                              - 1.0_wp) )**2 )                                 &
5148                              / ( ( 1.0_wp + ( surf%alpha_vg(k,m) * h_vg       &
5149                              )**surf%n_vg(k,m) )**( ( 1.0_wp  - 1.0_wp        &
5150                              / surf%n_vg(k,m) ) *                             &
5151                              ( surf%l_vg(k,m) + 2.0_wp) ) )
5152
5153                ENDIF
5154
5155             ENDDO
5156
5157
5158             IF ( calc_soil_moisture )  THEN
5159
5160!
5161!--             Prognostic equation for soil moisture content. Only performed,
5162!--             when humidity is enabled in the atmosphere.
5163                IF ( humidity )  THEN
5164!
5165!--                Calculate soil diffusivity (lambda_w) at the _layer level
5166!--                using linear interpolation. To do: replace this with
5167!--                ECMWF-IFS Eq. 8.81
5168                   DO  k = nzb_soil, nzt_soil-1
5169               
5170                      surf%lambda_w(k,m) = ( lambda_temp(k+1) + lambda_temp(k) )  &
5171                                           * 0.5_wp
5172                      surf%gamma_w(k,m)  = ( gamma_temp(k+1)  +  gamma_temp(k) )  &
5173                                           * 0.5_wp
5174                                           
5175                   ENDDO
5176!
5177!
5178!--                In case of a closed bottom (= water content is conserved),
5179!--                set hydraulic conductivity to zero to that no water will be
5180!--                lost in the bottom layer. As gamma_w is always a positive value,
5181!--                it cannot be set to zero in case of purely dry soil since this
5182!--                would cause accumulation of (non-existing) water in the lowest
5183!--                soil layer
5184                   IF ( conserve_water_content .AND.                           &
5185                        surf_m_soil%var_2d(nzt_soil,m) /= 0.0_wp )  THEN
5186
5187                      surf%gamma_w(nzt_soil,m) = 0.0_wp
5188                   ELSE
5189                      surf%gamma_w(nzt_soil,m) = gamma_temp(nzt_soil)
5190                   ENDIF     
5191
5192!--                The root extraction (= root_extr * qsws_veg / (rho_l     
5193!--                * l_v)) ensures the mass conservation for water. The         
5194!--                transpiration of plants equals the cumulative withdrawals by
5195!--                the roots in the soil. The scheme takes into account the
5196!--                availability of water in the soil layers as well as the root
5197!--                fraction in the respective layer. Layer with moisture below
5198!--                wilting point will not contribute, which reflects the
5199!--                preference of plants to take water from moister layers.
5200!
5201!--                Calculate the root extraction (ECMWF 7.69, the sum of
5202!--                root_extr = 1). The energy balance solver guarantees a
5203!--                positive transpiration, so that there is no need for an
5204!--                additional check.
5205                   m_total = 0.0_wp
5206                   DO  k = nzb_soil, nzt_soil
5207                      IF ( surf_m_soil%var_2d(k,m) > surf%m_wilt(k,m) )  THEN
5208                         m_total = m_total + surf%root_fr(k,m)                 &
5209                                * surf_m_soil%var_2d(k,m)
5210                      ENDIF
5211                   ENDDO 
5212                   IF ( m_total > 0.0_wp )  THEN
5213                      DO  k = nzb_soil, nzt_soil
5214                         IF ( surf_m_soil%var_2d(k,m) > surf%m_wilt(k,m) )  THEN
5215                            root_extr(k) = surf%root_fr(k,m)                   &
5216                                           * surf_m_soil%var_2d(k,m) / m_total
5217                         ELSE
5218                            root_extr(k) = 0.0_wp
5219                         ENDIF
5220                      ENDDO
5221                   ENDIF
5222!
5223!--                Prognostic equation for soil water content m_soil_h.
5224                   tend(:) = 0.0_wp
5225
5226                   tend(nzb_soil) = ( surf%lambda_w(nzb_soil,m) *   (          &
5227                         surf_m_soil%var_2d(nzb_soil+1,m)                      &
5228                         - surf_m_soil%var_2d(nzb_soil,m) )                    &
5229                         * ddz_soil_center(nzb_soil) - surf%gamma_w(nzb_soil,m)&
5230                         - ( root_extr(nzb_soil) * surf%qsws_veg(m)            &
5231                            + surf%qsws_soil(m) ) * drho_l_lv )                &
5232                            * ddz_soil(nzb_soil)
5233
5234                   DO  k = nzb_soil+1, nzt_soil-1
5235                      tend(k) = ( surf%lambda_w(k,m) * ( surf_m_soil%var_2d(k+1,m)  &
5236                             - surf_m_soil%var_2d(k,m) ) * ddz_soil_center(k)    &
5237                             - surf%gamma_w(k,m)                                 &
5238                             - surf%lambda_w(k-1,m) * ( surf_m_soil%var_2d(k,m)  &
5239                             - surf_m_soil%var_2d(k-1,m)) * ddz_soil_center(k-1) &
5240                             + surf%gamma_w(k-1,m) - (root_extr(k)               &
5241                             * surf%qsws_veg(m) * drho_l_lv)                     &
5242                             ) * ddz_soil(k)
5243                   ENDDO
5244                   tend(nzt_soil) = ( - surf%gamma_w(nzt_soil,m)               &
5245                                   - surf%lambda_w(nzt_soil-1,m)               &
5246                                   * ( surf_m_soil%var_2d(nzt_soil,m)          &
5247                                   - surf_m_soil%var_2d(nzt_soil-1,m))         &
5248                                   * ddz_soil_center(nzt_soil-1)               &
5249                                   + surf%gamma_w(nzt_soil-1,m) - (            &
5250                                   root_extr(nzt_soil)                         &
5251                                   * surf%qsws_veg(m) * drho_l_lv )            &
5252                                  ) * ddz_soil(nzt_soil)             
5253
5254                   surf_m_soil_p%var_2d(nzb_soil:nzt_soil,m) =                 &
5255                                       surf_m_soil%var_2d(nzb_soil:nzt_soil,m) &
5256                                         + dt_3d * ( tsc(2) * tend(:)          &
5257                                         + tsc(3) * surf_tm_soil_m%var_2d(:,m) )   
5258   
5259!
5260!--                Account for dry and wet soils to keep solution stable
5261!--                (mass conservation is violated here)
5262                   DO  k = nzb_soil, nzt_soil
5263                      surf_m_soil_p%var_2d(k,m) = MIN( surf_m_soil_p%var_2d(k,m), surf_m_soil_p%var_2d(k,m) )
5264                      surf_m_soil_p%var_2d(k,m) = MAX( surf_m_soil_p%var_2d(k,m), 0.0_wp )                     
5265                   ENDDO
5266 
5267!
5268!--                Calculate m_soil tendencies for the next Runge-Kutta step
5269                   IF ( timestep_scheme(1:5) == 'runge' )  THEN
5270                      IF ( intermediate_timestep_count == 1 )  THEN
5271                         DO  k = nzb_soil, nzt_soil
5272                            surf_tm_soil_m%var_2d(k,m) = tend(k)
5273                         ENDDO
5274                      ELSEIF ( intermediate_timestep_count <                   &
5275                               intermediate_timestep_count_max )  THEN
5276                         DO  k = nzb_soil, nzt_soil
5277                            surf_tm_soil_m%var_2d(k,m) = -9.5625_wp * tend(k)  &
5278                                                    + 5.3125_wp                &
5279                                                    * surf_tm_soil_m%var_2d(k,m)
5280                         ENDDO
5281
5282                      ENDIF
5283                     
5284                   ENDIF
5285                   
5286                ENDIF
5287
5288             ENDIF
5289
5290          ENDIF
5291
5292       ENDDO
5293       !$OMP END PARALLEL
5294!
5295!--    Debug location message
5296       IF ( debug_output_timestep )  THEN
5297          WRITE( debug_string, * ) 'lsm_soil_model', horizontal, l, calc_soil_moisture
5298          CALL debug_message( debug_string, 'end' )
5299       ENDIF
5300
5301    END SUBROUTINE lsm_soil_model
5302
5303 
5304!------------------------------------------------------------------------------!
5305! Description:
5306! ------------
5307!> Swapping of timelevels
5308!------------------------------------------------------------------------------!
5309    SUBROUTINE lsm_swap_timelevel ( mod_count )
5310
5311       IMPLICIT NONE
5312
5313       INTEGER, INTENT(IN) :: mod_count
5314
5315   
5316       SELECT CASE ( mod_count )
5317
5318          CASE ( 0 )
5319!
5320!--          Horizontal surfaces
5321             t_surface_h  => t_surface_h_1; t_surface_h_p  => t_surface_h_2
5322             t_soil_h     => t_soil_h_1;    t_soil_h_p     => t_soil_h_2
5323             IF ( humidity )  THEN
5324                m_soil_h  => m_soil_h_1;    m_soil_h_p     => m_soil_h_2
5325                m_liq_h   => m_liq_h_1;     m_liq_h_p      => m_liq_h_2
5326             ENDIF
5327
5328!
5329!--          Vertical surfaces
5330             t_surface_v  => t_surface_v_1; t_surface_v_p  => t_surface_v_2
5331             t_soil_v     => t_soil_v_1;    t_soil_v_p     => t_soil_v_2
5332             IF ( humidity )  THEN
5333                m_soil_v  => m_soil_v_1;    m_soil_v_p     => m_soil_v_2
5334                m_liq_v   => m_liq_v_1;     m_liq_v_p      => m_liq_v_2
5335
5336             ENDIF
5337
5338
5339
5340          CASE ( 1 )
5341!
5342!--          Horizontal surfaces
5343             t_surface_h  => t_surface_h_2; t_surface_h_p  => t_surface_h_1
5344             t_soil_h     => t_soil_h_2;    t_soil_h_p     => t_soil_h_1
5345             IF ( humidity )  THEN
5346                m_soil_h  => m_soil_h_2;    m_soil_h_p     => m_soil_h_1
5347                m_liq_h   => m_liq_h_2;     m_liq_h_p      => m_liq_h_1
5348
5349             ENDIF
5350!
5351!--          Vertical surfaces
5352             t_surface_v  => t_surface_v_2; t_surface_v_p  => t_surface_v_1
5353             t_soil_v     => t_soil_v_2;    t_soil_v_p     => t_soil_v_1
5354             IF ( humidity )  THEN
5355                m_soil_v  => m_soil_v_2;    m_soil_v_p     => m_soil_v_1
5356                m_liq_v   => m_liq_v_2;     m_liq_v_p      => m_liq_v_1
5357             ENDIF
5358
5359       END SELECT
5360
5361    END SUBROUTINE lsm_swap_timelevel
5362
5363
5364
5365
5366!------------------------------------------------------------------------------!
5367!
5368! Description:
5369! ------------
5370!> Subroutine for averaging 3D data
5371!------------------------------------------------------------------------------!
5372SUBROUTINE lsm_3d_data_averaging( mode, variable )
5373 
5374
5375    USE control_parameters
5376
5377    USE indices
5378
5379    IMPLICIT NONE
5380
5381    CHARACTER (LEN=*) ::  mode    !<
5382    CHARACTER (LEN=*) :: variable !<
5383
5384    INTEGER(iwp) ::  i       !<
5385    INTEGER(iwp) ::  j       !<
5386    INTEGER(iwp) ::  k       !<
5387    INTEGER(iwp) ::  m       !< running index
5388
5389    IF ( mode == 'allocate' )  THEN
5390
5391       SELECT CASE ( TRIM( variable ) )
5392
5393             CASE ( 'c_liq*' )
5394                IF ( .NOT. ALLOCATED( c_liq_av ) )  THEN
5395                   ALLOCATE( c_liq_av(nysg:nyng,nxlg:nxrg) )
5396                ENDIF
5397                c_liq_av = 0.0_wp
5398
5399             CASE ( 'c_soil*' )
5400                IF ( .NOT. ALLOCATED( c_soil_av ) )  THEN
5401                   ALLOCATE( c_soil_av(nysg:nyng,nxlg:nxrg) )
5402                ENDIF
5403                c_soil_av = 0.0_wp
5404
5405             CASE ( 'c_veg*' )
5406                IF ( .NOT. ALLOCATED( c_veg_av ) )  THEN
5407                   ALLOCATE( c_veg_av(nysg:nyng,nxlg:nxrg) )
5408                ENDIF
5409                c_veg_av = 0.0_wp
5410
5411             CASE ( 'lai*' )
5412                IF ( .NOT. ALLOCATED( lai_av ) )  THEN
5413                   ALLOCATE( lai_av(nysg:nyng,nxlg:nxrg) )
5414                ENDIF
5415                lai_av = 0.0_wp
5416
5417             CASE ( 'm_liq*' )
5418                IF ( .NOT. ALLOCATED( m_liq_av ) )  THEN
5419                   ALLOCATE( m_liq_av(nysg:nyng,nxlg:nxrg) )
5420                ENDIF
5421                m_liq_av = 0.0_wp
5422
5423             CASE ( 'm_soil' )
5424                IF ( .NOT. ALLOCATED( m_soil_av ) )  THEN
5425                   ALLOCATE( m_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
5426                ENDIF
5427                m_soil_av = 0.0_wp
5428
5429             CASE ( 'qsws_liq*' )
5430                IF ( .NOT. ALLOCATED( qsws_liq_av ) )  THEN
5431                   ALLOCATE( qsws_liq_av(nysg:nyng,nxlg:nxrg) )
5432                ENDIF
5433                qsws_liq_av = 0.0_wp
5434
5435             CASE ( 'qsws_soil*' )
5436                IF ( .NOT. ALLOCATED( qsws_soil_av ) )  THEN
5437                   ALLOCATE( qsws_soil_av(nysg:nyng,nxlg:nxrg) )
5438                ENDIF
5439                qsws_soil_av = 0.0_wp
5440
5441             CASE ( 'qsws_veg*' )
5442                IF ( .NOT. ALLOCATED( qsws_veg_av ) )  THEN
5443                   ALLOCATE( qsws_veg_av(nysg:nyng,nxlg:nxrg) )
5444                ENDIF
5445                qsws_veg_av = 0.0_wp
5446
5447             CASE ( 'r_s*' )
5448                IF ( .NOT. ALLOCATED( r_s_av ) )  THEN
5449                   ALLOCATE( r_s_av(nysg:nyng,nxlg:nxrg) )
5450                ENDIF
5451                r_s_av = 0.0_wp
5452
5453             CASE ( 't_soil' )
5454                IF ( .NOT. ALLOCATED( t_soil_av ) )  THEN
5455                   ALLOCATE( t_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
5456                ENDIF
5457                t_soil_av = 0.0_wp
5458
5459          CASE DEFAULT
5460             CONTINUE
5461
5462       END SELECT
5463
5464    ELSEIF ( mode == 'sum' )  THEN
5465
5466       SELECT CASE ( TRIM( variable ) )
5467
5468          CASE ( 'c_liq*' )
5469             IF ( ALLOCATED( c_liq_av ) ) THEN
5470                DO  m = 1, surf_lsm_h%ns
5471                   i   = surf_lsm_h%i(m)           
5472                   j   = surf_lsm_h%j(m)
5473                   c_liq_av(j,i) = c_liq_av(j,i) + surf_lsm_h%c_liq(m)
5474                ENDDO
5475             ENDIF   
5476
5477          CASE ( 'c_soil*' )
5478             IF ( ALLOCATED( c_soil_av ) ) THEN
5479                DO  m = 1, surf_lsm_h%ns
5480                   i   = surf_lsm_h%i(m)           
5481                   j   = surf_lsm_h%j(m)
5482                   c_soil_av(j,i) = c_soil_av(j,i) + (1.0 - surf_lsm_h%c_veg(m))
5483                ENDDO
5484             ENDIF
5485
5486          CASE ( 'c_veg*' )
5487             IF ( ALLOCATED( c_veg_av ) ) THEN
5488                DO  m = 1, surf_lsm_h%ns
5489                   i   = surf_lsm_h%i(m)           
5490                   j   = surf_lsm_h%j(m)
5491                   c_veg_av(j,i) = c_veg_av(j,i) + surf_lsm_h%c_veg(m)
5492                ENDDO
5493             ENDIF
5494
5495          CASE ( 'lai*' )
5496             IF ( ALLOCATED( lai_av ) ) THEN
5497                DO  m = 1, surf_lsm_h%ns
5498                   i   = surf_lsm_h%i(m)           
5499                   j   = surf_lsm_h%j(m)
5500                   lai_av(j,i) = lai_av(j,i) + surf_lsm_h%lai(m)
5501                ENDDO
5502             ENDIF
5503
5504          CASE ( 'm_liq*' )
5505             IF ( ALLOCATED( m_liq_av ) ) THEN
5506                DO  m = 1, surf_lsm_h%ns
5507                   i   = surf_lsm_h%i(m)           
5508                   j   = surf_lsm_h%j(m)
5509                   m_liq_av(j,i) = m_liq_av(j,i) + m_liq_h%var_1d(m)
5510                ENDDO
5511             ENDIF
5512
5513          CASE ( 'm_soil' )
5514             IF ( ALLOCATED( m_soil_av ) ) THEN
5515                DO  m = 1, surf_lsm_h%ns
5516                   i   = surf_lsm_h%i(m)           
5517                   j   = surf_lsm_h%j(m)
5518                   DO  k = nzb_soil, nzt_soil
5519                      m_soil_av(k,j,i) = m_soil_av(k,j,i) + m_soil_h%var_2d(k,m)
5520                   ENDDO
5521                ENDDO
5522             ENDIF
5523
5524          CASE ( 'qsws_liq*' )
5525             IF ( ALLOCATED( qsws_liq_av ) ) THEN
5526                DO  m = 1, surf_lsm_h%ns
5527                   i   = surf_lsm_h%i(m)           
5528                   j   = surf_lsm_h%j(m)
5529                   qsws_liq_av(j,i) = qsws_liq_av(j,i) +                       &
5530                                         surf_lsm_h%qsws_liq(m)
5531                ENDDO
5532             ENDIF
5533
5534          CASE ( 'qsws_soil*' )
5535             IF ( ALLOCATED( qsws_soil_av ) ) THEN
5536                DO  m = 1, surf_lsm_h%ns
5537                   i   = surf_lsm_h%i(m)           
5538                   j   = surf_lsm_h%j(m)
5539                   qsws_soil_av(j,i) = qsws_soil_av(j,i) +                     &
5540                                          surf_lsm_h%qsws_soil(m)
5541                ENDDO
5542             ENDIF
5543
5544          CASE ( 'qsws_veg*' )
5545             IF ( ALLOCATED(qsws_veg_av ) ) THEN
5546                DO  m = 1, surf_lsm_h%ns
5547                   i   = surf_lsm_h%i(m)           
5548                   j   = surf_lsm_h%j(m)
5549                   qsws_veg_av(j,i) = qsws_veg_av(j,i) +                       &
5550                                         surf_lsm_h%qsws_veg(m)
5551                ENDDO
5552             ENDIF
5553
5554          CASE ( 'r_s*' )
5555             IF ( ALLOCATED( r_s_av) ) THEN
5556                DO  m = 1, surf_lsm_h%ns
5557                   i   = surf_lsm_h%i(m)           
5558                   j   = surf_lsm_h%j(m)
5559                   r_s_av(j,i) = r_s_av(j,i) + surf_lsm_h%r_s(m)
5560                ENDDO
5561             ENDIF
5562
5563          CASE ( 't_soil' )
5564             IF ( ALLOCATED( t_soil_av ) ) THEN
5565                DO  m = 1, surf_lsm_h%ns
5566                   i   = surf_lsm_h%i(m)           
5567                   j   = surf_lsm_h%j(m)
5568                   DO  k = nzb_soil, nzt_soil
5569                      t_soil_av(k,j,i) = t_soil_av(k,j,i) + t_soil_h%var_2d(k,m)
5570                   ENDDO
5571                ENDDO
5572             ENDIF
5573             
5574          CASE DEFAULT
5575             CONTINUE
5576
5577       END SELECT
5578
5579    ELSEIF ( mode == 'average' )  THEN
5580
5581       SELECT CASE ( TRIM( variable ) )
5582
5583          CASE ( 'c_liq*' )
5584             IF ( ALLOCATED( c_liq_av ) ) THEN
5585                DO  i = nxl, nxr
5586                   DO  j = nys, nyn
5587                      c_liq_av(j,i) = c_liq_av(j,i)                            &
5588                                      / REAL( average_count_3d, KIND=wp )
5589                   ENDDO
5590                ENDDO
5591             ENDIF
5592
5593          CASE ( 'c_soil*' )
5594             IF ( ALLOCATED( c_soil_av ) ) THEN
5595                DO  i = nxl, nxr
5596                   DO  j = nys, nyn
5597                      c_soil_av(j,i) = c_soil_av(j,i)                          &
5598                                       / REAL( average_count_3d, KIND=wp )
5599                   ENDDO
5600                ENDDO
5601             ENDIF
5602
5603          CASE ( 'c_veg*' )
5604             IF ( ALLOCATED( c_veg_av ) ) THEN
5605                DO  i = nxl, nxr
5606                   DO  j = nys, nyn
5607                      c_veg_av(j,i) = c_veg_av(j,i)                            &
5608                                      / REAL( average_count_3d, KIND=wp )
5609                   ENDDO
5610                ENDDO
5611             ENDIF
5612
5613         CASE ( 'lai*' )
5614             IF ( ALLOCATED( lai_av ) ) THEN
5615                DO  i = nxl, nxr
5616                   DO  j = nys, nyn
5617                      lai_av(j,i) = lai_av(j,i)                                &
5618                                    / REAL( average_count_3d, KIND=wp )
5619                   ENDDO
5620                ENDDO
5621             ENDIF
5622
5623          CASE ( 'm_liq*' )
5624             IF ( ALLOCATED( m_liq_av ) ) THEN
5625                DO  i = nxl, nxr
5626                   DO  j = nys, nyn
5627                      m_liq_av(j,i) = m_liq_av(j,i)                            &
5628                                      / REAL( average_count_3d, KIND=wp )
5629                   ENDDO
5630                ENDDO
5631             ENDIF
5632
5633          CASE ( 'm_soil' )
5634             IF ( ALLOCATED( m_soil_av ) ) THEN
5635                DO  i = nxl, nxr
5636                   DO  j = nys, nyn
5637                      DO  k = nzb_soil, nzt_soil
5638                         m_soil_av(k,j,i) = m_soil_av(k,j,i)                   &
5639                                            / REAL( average_count_3d, KIND=wp )
5640                      ENDDO
5641                   ENDDO
5642                ENDDO
5643             ENDIF
5644
5645          CASE ( 'qsws_liq*' )
5646             IF ( ALLOCATED( qsws_liq_av ) ) THEN
5647                DO  i = nxl, nxr
5648                   DO  j = nys, nyn
5649                      qsws_liq_av(j,i) = qsws_liq_av(j,i)                      &
5650                                         / REAL( average_count_3d, KIND=wp )
5651                   ENDDO
5652                ENDDO
5653             ENDIF
5654
5655          CASE ( 'qsws_soil*' )
5656             IF ( ALLOCATED( qsws_soil_av ) ) THEN
5657                DO  i = nxl, nxr
5658                   DO  j = nys, nyn
5659                      qsws_soil_av(j,i) = qsws_soil_av(j,i)                    &
5660                                          / REAL( average_count_3d, KIND=wp )
5661                   ENDDO
5662                ENDDO
5663             ENDIF
5664
5665          CASE ( 'qsws_veg*' )
5666             IF ( ALLOCATED( qsws_veg_av ) ) THEN
5667                DO  i = nxl, nxr
5668                   DO  j = nys, nyn
5669                      qsws_veg_av(j,i) = qsws_veg_av(j,i)                      &
5670                                         / REAL( average_count_3d, KIND=wp )
5671                   ENDDO
5672                ENDDO
5673             ENDIF
5674
5675          CASE ( 'r_s*' )
5676             IF ( ALLOCATED( r_s_av ) ) THEN
5677                DO  i = nxl, nxr
5678                   DO  j = nys, nyn
5679                      r_s_av(j,i) = r_s_av(j,i)                                & 
5680                                    / REAL( average_count_3d, KIND=wp )
5681                   ENDDO
5682                ENDDO
5683             ENDIF
5684
5685          CASE ( 't_soil' )
5686             IF ( ALLOCATED( t_soil_av ) ) THEN
5687                DO  i = nxl, nxr
5688                   DO  j = nys, nyn
5689                      DO  k = nzb_soil, nzt_soil
5690                         t_soil_av(k,j,i) = t_soil_av(k,j,i)                   &
5691                                            / REAL( average_count_3d, KIND=wp )
5692                      ENDDO
5693                   ENDDO
5694                ENDDO
5695             ENDIF
5696!
5697!--
5698
5699       END SELECT
5700
5701    ENDIF
5702
5703END SUBROUTINE lsm_3d_data_averaging
5704
5705
5706!------------------------------------------------------------------------------!
5707!
5708! Description:
5709! ------------
5710!> Subroutine defining appropriate grid for netcdf variables.
5711!> It is called out from subroutine netcdf.
5712!------------------------------------------------------------------------------!
5713 SUBROUTINE lsm_define_netcdf_grid( var, found, grid_x, grid_y, grid_z )
5714   
5715     IMPLICIT NONE
5716
5717     CHARACTER (LEN=*), INTENT(IN)  ::  var         !<
5718     LOGICAL, INTENT(OUT)           ::  found       !<
5719     CHARACTER (LEN=*), INTENT(OUT) ::  grid_x      !<
5720     CHARACTER (LEN=*), INTENT(OUT) ::  grid_y      !<
5721     CHARACTER (LEN=*), INTENT(OUT) ::  grid_z      !<
5722
5723     found  = .TRUE.
5724
5725!
5726!--  Check for the grid
5727     SELECT CASE ( TRIM( var ) )
5728
5729        CASE ( 'm_soil', 't_soil', 'm_soil_xy', 't_soil_xy', 'm_soil_xz',      &
5730               't_soil_xz', 'm_soil_yz', 't_soil_yz' )
5731           grid_x = 'x'
5732           grid_y = 'y'
5733           grid_z = 'zs'
5734
5735        CASE DEFAULT
5736           found  = .FALSE.
5737           grid_x = 'none'
5738           grid_y = 'none'
5739           grid_z = 'none'
5740     END SELECT
5741
5742 END SUBROUTINE lsm_define_netcdf_grid
5743
5744!------------------------------------------------------------------------------!
5745!
5746! Description:
5747! ------------
5748!> Subroutine defining 3D output variables
5749!------------------------------------------------------------------------------!
5750 SUBROUTINE lsm_data_output_2d( av, variable, found, grid, mode, local_pf,     &
5751                                two_d, nzb_do, nzt_do )
5752 
5753    USE indices
5754
5755
5756    IMPLICIT NONE
5757
5758    CHARACTER (LEN=*) ::  grid     !<
5759    CHARACTER (LEN=*) ::  mode     !<
5760    CHARACTER (LEN=*) ::  variable !<
5761
5762    INTEGER(iwp) ::  av      !<
5763    INTEGER(iwp) ::  i       !< running index
5764    INTEGER(iwp) ::  j       !< running index
5765    INTEGER(iwp) ::  k       !< running index
5766    INTEGER(iwp) ::  m       !< running index
5767    INTEGER(iwp) ::  nzb_do  !<
5768    INTEGER(iwp) ::  nzt_do  !<
5769
5770    LOGICAL      ::  found !<
5771    LOGICAL      ::  two_d !< flag parameter that indicates 2D variables (horizontal cross sections)
5772
5773    REAL(wp) ::  fill_value = -999.0_wp    !< value for the _FillValue attribute
5774
5775    REAL(wp), DIMENSION(nxl:nxr,nys:nyn,nzb_do:nzt_do) ::  local_pf !<
5776
5777
5778    found = .TRUE.
5779
5780    SELECT CASE ( TRIM( variable ) )
5781!
5782!--    Before data is transfered to local_pf, transfer is it 2D dummy variable and exchange ghost points therein.
5783!--    However, at this point this is only required for instantaneous arrays, time-averaged quantities are already exchanged.
5784       CASE ( 'c_liq*_xy' )        ! 2d-array
5785          IF ( av == 0 )  THEN
5786             DO  m = 1, surf_lsm_h%ns
5787                i                   = surf_lsm_h%i(m)           
5788                j                   = surf_lsm_h%j(m)
5789                local_pf(i,j,nzb+1) = surf_lsm_h%c_liq(m) * surf_lsm_h%c_veg(m)
5790             ENDDO
5791          ELSE
5792            IF ( .NOT. ALLOCATED( c_liq_av ) ) THEN
5793               ALLOCATE( c_liq_av(nysg:nyng,nxlg:nxrg) )
5794               c_liq_av = REAL( fill_value, KIND = wp )
5795            ENDIF
5796             DO  i = nxl, nxr
5797                DO  j = nys, nyn
5798                   local_pf(i,j,nzb+1) = c_liq_av(j,i)
5799                ENDDO
5800             ENDDO
5801          ENDIF
5802
5803          two_d = .TRUE.
5804          grid = 'zu1'
5805
5806       CASE ( 'c_soil*_xy' )        ! 2d-array
5807          IF ( av == 0 )  THEN
5808             DO  m = 1, surf_lsm_h%ns
5809                i                   = surf_lsm_h%i(m)           
5810                j                   = surf_lsm_h%j(m)
5811                local_pf(i,j,nzb+1) = 1.0_wp - surf_lsm_h%c_veg(m)
5812             ENDDO
5813          ELSE
5814            IF ( .NOT. ALLOCATED( c_soil_av ) ) THEN
5815               ALLOCATE( c_soil_av(nysg:nyng,nxlg:nxrg) )
5816               c_soil_av = REAL( fill_value, KIND = wp )
5817            ENDIF
5818             DO  i = nxl, nxr
5819                DO  j = nys, nyn
5820                   local_pf(i,j,nzb+1) = c_soil_av(j,i)
5821                ENDDO
5822             ENDDO
5823          ENDIF
5824
5825          two_d = .TRUE.
5826          grid = 'zu1'
5827
5828       CASE ( 'c_veg*_xy' )        ! 2d-array
5829          IF ( av == 0 )  THEN
5830             DO  m = 1, surf_lsm_h%ns
5831                i                   = surf_lsm_h%i(m)           
5832                j                   = surf_lsm_h%j(m)
5833                local_pf(i,j,nzb+1) = surf_lsm_h%c_veg(m)
5834             ENDDO
5835          ELSE
5836            IF ( .NOT. ALLOCATED( c_veg_av ) ) THEN
5837               ALLOCATE( c_veg_av(nysg:nyng,nxlg:nxrg) )
5838               c_veg_av = REAL( fill_value, KIND = wp )
5839            ENDIF
5840             DO  i = nxl, nxr
5841                DO  j = nys, nyn
5842                   local_pf(i,j,nzb+1) = c_veg_av(j,i)
5843                ENDDO
5844             ENDDO
5845          ENDIF
5846
5847          two_d = .TRUE.
5848          grid = 'zu1'
5849
5850       CASE ( 'lai*_xy' )        ! 2d-array
5851          IF ( av == 0 )  THEN
5852             DO  m = 1, surf_lsm_h%ns
5853                i                   = surf_lsm_h%i(m)           
5854                j                   = surf_lsm_h%j(m)
5855                local_pf(i,j,nzb+1) = surf_lsm_h%lai(m)
5856             ENDDO
5857          ELSE
5858            IF ( .NOT. ALLOCATED( lai_av ) ) THEN
5859               ALLOCATE( lai_av(nysg:nyng,nxlg:nxrg) )
5860               lai_av = REAL( fill_value, KIND = wp )
5861            ENDIF
5862             DO  i = nxl, nxr
5863                DO  j = nys, nyn
5864                   local_pf(i,j,nzb+1) = lai_av(j,i)
5865                ENDDO
5866             ENDDO
5867          ENDIF
5868
5869          two_d = .TRUE.
5870          grid = 'zu1'
5871
5872       CASE ( 'm_liq*_xy' )        ! 2d-array
5873          IF ( av == 0 )  THEN
5874             DO  m = 1, surf_lsm_h%ns
5875                i                   = surf_lsm_h%i(m)           
5876                j                   = surf_lsm_h%j(m)
5877                local_pf(i,j,nzb+1) = m_liq_h%var_1d(m)
5878             ENDDO
5879          ELSE
5880            IF ( .NOT. ALLOCATED( m_liq_av ) ) THEN
5881               ALLOCATE( m_liq_av(nysg:nyng,nxlg:nxrg) )
5882               m_liq_av = REAL( fill_value, KIND = wp )
5883            ENDIF
5884             DO  i = nxl, nxr
5885                DO  j = nys, nyn
5886                   local_pf(i,j,nzb+1) = m_liq_av(j,i)
5887                ENDDO
5888             ENDDO
5889          ENDIF
5890
5891          two_d = .TRUE.
5892          grid = 'zu1'
5893
5894       CASE ( 'm_soil_xy', 'm_soil_xz', 'm_soil_yz' )
5895          IF ( av == 0 )  THEN
5896             DO  m = 1, surf_lsm_h%ns
5897                i   = surf_lsm_h%i(m)           
5898                j   = surf_lsm_h%j(m)
5899                DO k = nzb_soil, nzt_soil
5900                   local_pf(i,j,k) = m_soil_h%var_2d(k,m)
5901                ENDDO
5902             ENDDO
5903          ELSE
5904            IF ( .NOT. ALLOCATED( m_soil_av ) ) THEN
5905               ALLOCATE( m_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
5906               m_soil_av = REAL( fill_value, KIND = wp )
5907            ENDIF
5908             DO  i = nxl, nxr
5909                DO  j = nys, nyn
5910                   DO k = nzb_soil, nzt_soil
5911                      local_pf(i,j,k) = m_soil_av(k,j,i)
5912                   ENDDO
5913                ENDDO
5914             ENDDO
5915          ENDIF
5916
5917          nzb_do = nzb_soil
5918          nzt_do = nzt_soil
5919
5920          IF ( mode == 'xy' ) grid = 'zs'
5921         
5922       CASE ( 'qsws_liq*_xy' )        ! 2d-array
5923          IF ( av == 0 ) THEN
5924             DO  m = 1, surf_lsm_h%ns
5925                i                   = surf_lsm_h%i(m)           
5926                j                   = surf_lsm_h%j(m)
5927                local_pf(i,j,nzb+1) = surf_lsm_h%qsws_liq(m)
5928             ENDDO
5929          ELSE
5930            IF ( .NOT. ALLOCATED( qsws_liq_av ) ) THEN
5931               ALLOCATE( qsws_liq_av(nysg:nyng,nxlg:nxrg) )
5932               qsws_liq_av = REAL( fill_value, KIND = wp )
5933            ENDIF
5934             DO  i = nxl, nxr
5935                DO  j = nys, nyn 
5936                   local_pf(i,j,nzb+1) =  qsws_liq_av(j,i)
5937                ENDDO
5938             ENDDO
5939          ENDIF
5940
5941          two_d = .TRUE.
5942          grid = 'zu1'
5943
5944       CASE ( 'qsws_soil*_xy' )        ! 2d-array
5945          IF ( av == 0 ) THEN
5946             DO  m = 1, surf_lsm_h%ns
5947                i                   = surf_lsm_h%i(m)           
5948                j                   = surf_lsm_h%j(m)
5949                local_pf(i,j,nzb+1) =  surf_lsm_h%qsws_soil(m)
5950             ENDDO
5951          ELSE
5952            IF ( .NOT. ALLOCATED( qsws_soil_av ) ) THEN
5953               ALLOCATE( qsws_soil_av(nysg:nyng,nxlg:nxrg) )
5954               qsws_soil_av = REAL( fill_value, KIND = wp )
5955            ENDIF
5956             DO  i = nxl, nxr
5957                DO  j = nys, nyn 
5958                   local_pf(i,j,nzb+1) =  qsws_soil_av(j,i)
5959                ENDDO
5960             ENDDO
5961          ENDIF
5962
5963          two_d = .TRUE.
5964          grid = 'zu1'
5965
5966       CASE ( 'qsws_veg*_xy' )        ! 2d-array
5967          IF ( av == 0 ) THEN
5968             DO  m = 1, surf_lsm_h%ns
5969                i                   = surf_lsm_h%i(m)           
5970                j                   = surf_lsm_h%j(m)
5971                local_pf(i,j,nzb+1) =  surf_lsm_h%qsws_veg(m)
5972             ENDDO
5973          ELSE
5974            IF ( .NOT. ALLOCATED( qsws_veg_av ) ) THEN
5975               ALLOCATE( qsws_veg_av(nysg:nyng,nxlg:nxrg) )
5976               qsws_veg_av = REAL( fill_value, KIND = wp )
5977            ENDIF
5978             DO  i = nxl, nxr
5979                DO  j = nys, nyn 
5980                   local_pf(i,j,nzb+1) =  qsws_veg_av(j,i)
5981                ENDDO
5982             ENDDO
5983          ENDIF
5984
5985          two_d = .TRUE.
5986          grid = 'zu1'
5987
5988
5989       CASE ( 'r_s*_xy' )        ! 2d-array
5990          IF ( av == 0 )  THEN
5991             DO  m = 1, surf_lsm_h%ns
5992                i                   = surf_lsm_h%i(m)           
5993                j                   = surf_lsm_h%j(m)
5994                local_pf(i,j,nzb+1) = surf_lsm_h%r_s(m)
5995             ENDDO
5996          ELSE
5997            IF ( .NOT. ALLOCATED( r_s_av ) ) THEN
5998               ALLOCATE( r_s_av(nysg:nyng,nxlg:nxrg) )
5999               r_s_av = REAL( fill_value, KIND = wp )
6000            ENDIF
6001             DO  i = nxl, nxr
6002                DO  j = nys, nyn
6003                   local_pf(i,j,nzb+1) = r_s_av(j,i)
6004                ENDDO
6005             ENDDO
6006          ENDIF
6007
6008          two_d = .TRUE.
6009          grid = 'zu1'
6010
6011       CASE ( 't_soil_xy', 't_soil_xz', 't_soil_yz' )
6012          IF ( av == 0 )  THEN
6013             DO  m = 1, surf_lsm_h%ns
6014                i   = surf_lsm_h%i(m)           
6015                j   = surf_lsm_h%j(m)
6016                DO k = nzb_soil, nzt_soil
6017                   local_pf(i,j,k) = t_soil_h%var_2d(k,m)
6018                ENDDO
6019             ENDDO
6020          ELSE
6021            IF ( .NOT. ALLOCATED( t_soil_av ) ) THEN
6022               ALLOCATE( t_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
6023               t_soil_av = REAL( fill_value, KIND = wp )
6024            ENDIF
6025             DO  i = nxl, nxr
6026                DO  j = nys, nyn
6027                   DO k = nzb_soil, nzt_soil
6028                      local_pf(i,j,k) = t_soil_av(k,j,i)
6029                   ENDDO
6030                ENDDO
6031             ENDDO
6032          ENDIF
6033
6034          nzb_do = nzb_soil
6035          nzt_do = nzt_soil
6036
6037          IF ( mode == 'xy' )  grid = 'zs'
6038
6039
6040       CASE DEFAULT
6041          found = .FALSE.
6042          grid  = 'none'
6043
6044    END SELECT
6045 
6046 END SUBROUTINE lsm_data_output_2d
6047
6048
6049!------------------------------------------------------------------------------!
6050!
6051! Description:
6052! ------------
6053!> Subroutine defining 3D output variables
6054!------------------------------------------------------------------------------!
6055 SUBROUTINE lsm_data_output_3d( av, variable, found, local_pf )
6056 
6057
6058    USE indices
6059
6060
6061    IMPLICIT NONE
6062
6063    CHARACTER (LEN=*) ::  variable !<
6064
6065    INTEGER(iwp) ::  av    !<
6066    INTEGER(iwp) ::  i     !<
6067    INTEGER(iwp) ::  j     !<
6068    INTEGER(iwp) ::  k     !<
6069    INTEGER(iwp) ::  m     !< running index
6070
6071    LOGICAL      ::  found !<
6072
6073    REAL(wp) ::  fill_value = -999.0_wp    !< value for the _FillValue attribute
6074
6075    REAL(sp), DIMENSION(nxl:nxr,nys:nyn,nzb_soil:nzt_soil) ::  local_pf !<
6076
6077
6078    found = .TRUE.
6079
6080
6081    SELECT CASE ( TRIM( variable ) )
6082!
6083!--   Requires 3D exchange
6084
6085      CASE ( 'm_soil' )
6086
6087         IF ( av == 0 )  THEN
6088            DO  m = 1, surf_lsm_h%ns
6089                i   = surf_lsm_h%i(m)           
6090                j   = surf_lsm_h%j(m)
6091                DO  k = nzb_soil, nzt_soil
6092                   local_pf(i,j,k) = m_soil_h%var_2d(k,m)
6093                ENDDO
6094            ENDDO
6095         ELSE
6096            IF ( .NOT. ALLOCATED( m_soil_av ) ) THEN
6097               ALLOCATE( m_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
6098               m_soil_av = REAL( fill_value, KIND = wp )
6099            ENDIF
6100            DO  i = nxl, nxr
6101               DO  j = nys, nyn
6102                  DO  k = nzb_soil, nzt_soil
6103                     local_pf(i,j,k) = m_soil_av(k,j,i)
6104                  ENDDO
6105               ENDDO
6106            ENDDO
6107         ENDIF
6108
6109      CASE ( 't_soil' )
6110
6111         IF ( av == 0 )  THEN
6112            DO  m = 1, surf_lsm_h%ns
6113               i   = surf_lsm_h%i(m)           
6114               j   = surf_lsm_h%j(m)
6115               DO  k = nzb_soil, nzt_soil
6116                  local_pf(i,j,k) = t_soil_h%var_2d(k,m)
6117               ENDDO
6118            ENDDO
6119         ELSE
6120            IF ( .NOT. ALLOCATED( t_soil_av ) ) THEN
6121               ALLOCATE( t_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
6122               t_soil_av = REAL( fill_value, KIND = wp )
6123            ENDIF
6124            DO  i = nxl, nxr
6125               DO  j = nys, nyn
6126                  DO  k = nzb_soil, nzt_soil
6127                     local_pf(i,j,k) = t_soil_av(k,j,i)
6128                  ENDDO
6129               ENDDO
6130            ENDDO
6131         ENDIF
6132
6133
6134       CASE DEFAULT
6135          found = .FALSE.
6136
6137    END SELECT
6138
6139
6140 END SUBROUTINE lsm_data_output_3d
6141
6142
6143!------------------------------------------------------------------------------!
6144!
6145! Description:
6146! ------------
6147!> Write restart data for land surface model. It is necessary to write
6148!> start_index and end_index several times.
6149!------------------------------------------------------------------------------!
6150 SUBROUTINE lsm_wrd_local
6151       
6152
6153    IMPLICIT NONE
6154
6155    CHARACTER (LEN=1) ::  dum    !< dummy to create correct string for creating variable string
6156    INTEGER(iwp)      ::  l      !< index variable for surface orientation
6157
6158    CALL wrd_write_string( 'ns_h_on_file_lsm' )
6159    WRITE ( 14 )  surf_lsm_h%ns
6160
6161    CALL wrd_write_string( 'ns_v_on_file_lsm' )
6162    WRITE ( 14 )  surf_lsm_v(0:3)%ns
6163
6164
6165    IF ( ALLOCATED( c_liq_av ) )  THEN
6166       CALL wrd_write_string( 'c_liq_av' )
6167       WRITE ( 14 )  c_liq_av
6168    ENDIF
6169
6170    IF ( ALLOCATED( c_soil_av ) )  THEN
6171       CALL wrd_write_string( 'c_soil_av' )
6172       WRITE ( 14 )  c_soil_av
6173    ENDIF
6174
6175    IF ( ALLOCATED( c_veg_av ) )  THEN
6176       CALL wrd_write_string( 'c_veg_av' )
6177       WRITE ( 14 )  c_veg_av
6178    ENDIF
6179
6180    IF ( ALLOCATED( lai_av ) )  THEN
6181       CALL wrd_write_string( 'lai_av' )
6182       WRITE ( 14 )  lai_av
6183    ENDIF
6184
6185    IF ( ALLOCATED( m_liq_av ) )  THEN
6186       CALL wrd_write_string( 'm_liq_av' )
6187       WRITE ( 14 )  m_liq_av
6188    ENDIF
6189
6190    IF ( ALLOCATED( m_soil_av ) )  THEN
6191       CALL wrd_write_string( 'm_soil_av' )
6192       WRITE ( 14 )  m_soil_av
6193    ENDIF
6194
6195    IF ( ALLOCATED( qsws_liq_av ) )  THEN
6196       CALL wrd_write_string( 'qsws_liq_av' )
6197       WRITE ( 14 )  qsws_liq_av
6198    ENDIF
6199
6200    IF ( ALLOCATED( qsws_soil_av ) )  THEN
6201       CALL wrd_write_string( 'qsws_soil_av' )
6202       WRITE ( 14 )  qsws_soil_av
6203    ENDIF
6204
6205    IF ( ALLOCATED( qsws_veg_av ) )  THEN
6206       CALL wrd_write_string( 'qsws_veg_av' )
6207       WRITE ( 14 )  qsws_veg_av
6208    ENDIF
6209   
6210    IF ( ALLOCATED( t_soil_av ) )  THEN
6211       CALL wrd_write_string( 't_soil_av' )
6212       WRITE ( 14 )  t_soil_av
6213    ENDIF
6214
6215    CALL wrd_write_string( 'lsm_start_index_h' )
6216    WRITE ( 14 )  surf_lsm_h%start_index
6217
6218    CALL wrd_write_string( 'lsm_end_index_h' )
6219    WRITE ( 14 )  surf_lsm_h%end_index
6220
6221    CALL wrd_write_string( 't_soil_h' )
6222    WRITE ( 14 )  t_soil_h%var_2d
6223       
6224
6225       
6226    DO  l = 0, 3
6227
6228       CALL wrd_write_string( 'lsm_start_index_v' )
6229       WRITE ( 14 )  surf_lsm_v(l)%start_index
6230
6231       CALL wrd_write_string( 'lsm_end_index_v' )
6232       WRITE ( 14 )  surf_lsm_v(l)%end_index
6233
6234       WRITE( dum, '(I1)')  l   
6235
6236       CALL wrd_write_string( 't_soil_v(' // dum // ')' )
6237       WRITE ( 14 )  t_soil_v(l)%var_2d
6238             
6239    ENDDO
6240
6241    CALL wrd_write_string( 'lsm_start_index_h' )
6242    WRITE ( 14 )  surf_lsm_h%start_index
6243
6244    CALL wrd_write_string( 'lsm_end_index_h' )
6245    WRITE ( 14 )  surf_lsm_h%end_index
6246
6247    CALL wrd_write_string( 'm_soil_h' )
6248    WRITE ( 14 )  m_soil_h%var_2d
6249
6250    DO  l = 0, 3
6251
6252       CALL wrd_write_string( 'lsm_start_index_v' )
6253       WRITE ( 14 )  surf_lsm_v(l)%start_index
6254
6255       CALL wrd_write_string( 'lsm_end_index_v' )
6256       WRITE ( 14 )  surf_lsm_v(l)%end_index
6257
6258       WRITE( dum, '(I1)')  l   
6259
6260       CALL wrd_write_string( 'm_soil_v(' // dum // ')' )
6261       WRITE ( 14 )  m_soil_v(l)%var_2d 
6262     
6263    ENDDO
6264
6265    CALL wrd_write_string( 'lsm_start_index_h' )
6266    WRITE ( 14 )  surf_lsm_h%start_index
6267
6268    CALL wrd_write_string( 'lsm_end_index_h' )
6269    WRITE ( 14 )  surf_lsm_h%end_index
6270
6271    CALL wrd_write_string( 'm_liq_h' )
6272    WRITE ( 14 )  m_liq_h%var_1d
6273       
6274    DO  l = 0, 3
6275
6276       CALL wrd_write_string( 'lsm_start_index_v' )
6277       WRITE ( 14 )  surf_lsm_v(l)%start_index
6278
6279       CALL wrd_write_string( 'lsm_end_index_v' )
6280       WRITE ( 14 )  surf_lsm_v(l)%end_index
6281
6282       WRITE( dum, '(I1)')  l   
6283
6284       CALL wrd_write_string( 'm_liq_v(' // dum // ')' )
6285       WRITE ( 14 )  m_liq_v(l)%var_1d     
6286               
6287    ENDDO
6288
6289    CALL wrd_write_string( 'lsm_start_index_h' )
6290    WRITE ( 14 )  surf_lsm_h%start_index
6291
6292    CALL wrd_write_string( 'lsm_end_index_h' )
6293    WRITE ( 14 )  surf_lsm_h%end_index
6294
6295    CALL wrd_write_string( 't_surface_h' )
6296    WRITE ( 14 )  t_surface_h%var_1d
6297
6298    DO  l = 0, 3
6299
6300       CALL wrd_write_string( 'lsm_start_index_v' )
6301       WRITE ( 14 )  surf_lsm_v(l)%start_index
6302
6303       CALL wrd_write_string( 'lsm_end_index_v' )
6304       WRITE ( 14 )  surf_lsm_v(l)%end_index
6305
6306       WRITE( dum, '(I1)')  l   
6307
6308       CALL wrd_write_string( 't_surface_v(' // dum // ')' )
6309       WRITE ( 14 )  t_surface_v(l)%var_1d     
6310       
6311    ENDDO
6312
6313
6314 END SUBROUTINE lsm_wrd_local
6315
6316
6317!------------------------------------------------------------------------------!
6318!
6319! Description:
6320! ------------
6321!> Soubroutine reads lsm data from restart file(s)
6322!------------------------------------------------------------------------------!
6323SUBROUTINE lsm_rrd_local( k, nxlf, nxlc, nxl_on_file, nxrf, nxrc,              &
6324                          nxr_on_file, nynf, nync, nyn_on_file, nysf, nysc,    &
6325                          nys_on_file, tmp_2d, found )
6326 
6327
6328    USE control_parameters
6329       
6330    USE indices
6331   
6332    USE pegrid
6333
6334
6335    IMPLICIT NONE
6336
6337    INTEGER(iwp) ::  k                 !<
6338    INTEGER(iwp) ::  l                 !< running index surface orientation
6339    INTEGER(iwp) ::  ns_h_on_file_lsm  !< number of horizontal surface elements (natural type) on file
6340    INTEGER(iwp) ::  nxlc              !<
6341    INTEGER(iwp) ::  nxlf              !<
6342    INTEGER(iwp) ::  nxl_on_file       !< index of left boundary on former local domain
6343    INTEGER(iwp) ::  nxrc              !<
6344    INTEGER(iwp) ::  nxrf              !<
6345    INTEGER(iwp) ::  nxr_on_file       !< index of right boundary on former local domain
6346    INTEGER(iwp) ::  nync              !<
6347    INTEGER(iwp) ::  nynf              !<
6348    INTEGER(iwp) ::  nyn_on_file       !< index of north boundary on former local domain
6349    INTEGER(iwp) ::  nysc              !<
6350    INTEGER(iwp) ::  nysf              !<
6351    INTEGER(iwp) ::  nys_on_file       !< index of south boundary on former local domain
6352
6353    INTEGER(iwp) ::  ns_v_on_file_lsm(0:3) !< number of vertical surface elements (natural type) on file
6354
6355    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE, SAVE ::  start_index_on_file 
6356    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE, SAVE ::  end_index_on_file
6357
6358    LOGICAL, INTENT(OUT)  :: found
6359
6360    REAL(wp), DIMENSION(nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) :: tmp_2d   !<
6361
6362    REAL(wp), DIMENSION(nzb_soil:nzt_soil,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) :: tmp_3d   !<
6363
6364    TYPE(surf_type_lsm), SAVE :: tmp_walltype_h_1d   !< temporary 1D array containing the respective surface variable stored on file, horizontal surfaces
6365    TYPE(surf_type_lsm), SAVE :: tmp_walltype_h_2d   !< temporary 2D array containing the respective surface variable stored on file, horizontal surfaces
6366    TYPE(surf_type_lsm), SAVE :: tmp_walltype_h_2d2  !< temporary 2D array containing the respective surface variable stored on file, horizontal surfaces
6367
6368    TYPE(surf_type_lsm), DIMENSION(0:3), SAVE :: tmp_walltype_v_1d   !< temporary 1D array containing the respective surface variable stored on file, vertical surfaces
6369    TYPE(surf_type_lsm), DIMENSION(0:3), SAVE :: tmp_walltype_v_2d   !< temporary 2D array containing the respective surface variable stored on file, vertical surfaces
6370    TYPE(surf_type_lsm), DIMENSION(0:3), SAVE :: tmp_walltype_v_2d2  !< temporary 2D array containing the respective surface variable stored on file, vertical surfaces
6371
6372
6373    found = .TRUE.
6374
6375
6376       SELECT CASE ( restart_string(1:length) )
6377
6378           CASE ( 'ns_h_on_file_lsm' )
6379              IF ( k == 1 )  THEN 
6380                 READ ( 13 ) ns_h_on_file_lsm
6381
6382                 IF ( ALLOCATED( tmp_walltype_h_1d%var_1d ) )                  &
6383                    DEALLOCATE( tmp_walltype_h_1d%var_1d )
6384                 IF ( ALLOCATED( tmp_walltype_h_2d%var_2d ) )                  &   
6385                    DEALLOCATE( tmp_walltype_h_2d%var_2d )
6386                 IF ( ALLOCATED( tmp_walltype_h_2d2%var_2d ) )                 &
6387                    DEALLOCATE( tmp_walltype_h_2d2%var_2d ) 
6388
6389!
6390!--              Allocate temporary arrays to store surface data
6391                 ALLOCATE( tmp_walltype_h_1d%var_1d(1:ns_h_on_file_lsm) )
6392                 ALLOCATE( tmp_walltype_h_2d%var_2d(nzb_soil:nzt_soil+1,       &
6393                                                    1:ns_h_on_file_lsm) )
6394                 ALLOCATE( tmp_walltype_h_2d2%var_2d(nzb_soil:nzt_soil,        &
6395                           1:ns_h_on_file_lsm)  )
6396
6397              ENDIF
6398
6399           CASE ( 'ns_v_on_file_lsm' )
6400              IF ( k == 1 )  THEN
6401                 READ ( 13 ) ns_v_on_file_lsm
6402
6403                 DO  l = 0, 3
6404                    IF ( ALLOCATED( tmp_walltype_v_1d(l)%var_1d ) )            &
6405                       DEALLOCATE( tmp_walltype_v_1d(l)%var_1d )
6406                    IF ( ALLOCATED( tmp_walltype_v_2d(l)%var_2d ) )            &
6407                       DEALLOCATE( tmp_walltype_v_2d(l)%var_2d )
6408                    IF ( ALLOCATED( tmp_walltype_v_2d2(l)%var_2d ) )           &
6409                       DEALLOCATE( tmp_walltype_v_2d2(l)%var_2d )
6410                 ENDDO
6411
6412!
6413!--              Allocate temporary arrays to store surface data
6414                 DO  l = 0, 3
6415                    ALLOCATE( tmp_walltype_v_1d(l)                             &
6416                                 %var_1d(1:ns_v_on_file_lsm(l)) )
6417                    ALLOCATE( tmp_walltype_v_2d(l)                             &
6418                                 %var_2d(nzb_soil:nzt_soil+1,                  &
6419                                         1:ns_v_on_file_lsm(l)) )
6420                    ALLOCATE( tmp_walltype_v_2d2(l)                            &
6421                                 %var_2d(nzb_soil:nzt_soil,                    &
6422                                         1:ns_v_on_file_lsm(l))  )
6423                 ENDDO
6424
6425              ENDIF
6426
6427
6428           CASE ( 'c_liq_av' )
6429              IF ( .NOT. ALLOCATED( c_liq_av ) )  THEN
6430                 ALLOCATE( c_liq_av(nysg:nyng,nxlg:nxrg) )
6431              ENDIF
6432              IF ( k == 1 )  READ ( 13 )  tmp_2d
6433              c_liq_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =              &
6434                 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6435
6436           CASE ( 'c_soil_av' )
6437              IF ( .NOT. ALLOCATED( c_soil_av ) )  THEN
6438                 ALLOCATE( c_soil_av(nysg:nyng,nxlg:nxrg) )
6439              ENDIF
6440              IF ( k == 1 )  READ ( 13 )  tmp_2d
6441              c_soil_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =             &
6442                 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6443
6444           CASE ( 'c_veg_av' )
6445              IF ( .NOT. ALLOCATED( c_veg_av ) )  THEN
6446                 ALLOCATE( c_veg_av(nysg:nyng,nxlg:nxrg) )
6447              ENDIF
6448              IF ( k == 1 )  READ ( 13 )  tmp_2d
6449              c_veg_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =              &
6450                 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6451
6452           CASE ( 'lai_av' )
6453              IF ( .NOT. ALLOCATED( lai_av ) )  THEN
6454                 ALLOCATE( lai_av(nysg:nyng,nxlg:nxrg) )
6455              ENDIF
6456              IF ( k == 1 )  READ ( 13 )  tmp_2d
6457              lai_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                &
6458                 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6459
6460           CASE ( 'm_liq_av' )
6461              IF ( .NOT. ALLOCATED( m_liq_av ) )  THEN
6462                 ALLOCATE( m_liq_av(nysg:nyng,nxlg:nxrg) )
6463              ENDIF
6464              IF ( k == 1 )  READ ( 13 )  tmp_2d
6465              m_liq_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =              &
6466                 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6467
6468           CASE ( 'm_soil_av' )
6469              IF ( .NOT. ALLOCATED( m_soil_av ) )  THEN
6470                 ALLOCATE( m_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
6471              ENDIF
6472              IF ( k == 1 )  READ ( 13 )  tmp_3d(:,:,:)
6473              m_soil_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =           &
6474                 tmp_3d(nzb_soil:nzt_soil,nysf                                 &
6475                        -nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6476
6477           CASE ( 'qsws_liq_av' )
6478              IF ( .NOT. ALLOCATED( qsws_liq_av ) )  THEN
6479                 ALLOCATE( qsws_liq_av(nysg:nyng,nxlg:nxrg) )
6480              ENDIF 
6481              IF ( k == 1 )  READ ( 13 )  tmp_2d
6482              qsws_liq_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  =          &
6483                 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6484           CASE ( 'qsws_soil_av' )
6485              IF ( .NOT. ALLOCATED( qsws_soil_av ) )  THEN
6486                 ALLOCATE( qsws_soil_av(nysg:nyng,nxlg:nxrg) )
6487              ENDIF 
6488              IF ( k == 1 )  READ ( 13 )  tmp_2d
6489              qsws_soil_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  =         &
6490                 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6491
6492           CASE ( 'qsws_veg_av' )
6493              IF ( .NOT. ALLOCATED( qsws_veg_av ) )  THEN
6494                 ALLOCATE( qsws_veg_av(nysg:nyng,nxlg:nxrg) )
6495              ENDIF 
6496              IF ( k == 1 )  READ ( 13 )  tmp_2d
6497              qsws_veg_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  =          &
6498                 tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6499
6500           CASE ( 't_soil_av' )
6501              IF ( .NOT. ALLOCATED( t_soil_av ) )  THEN
6502                 ALLOCATE( t_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
6503              ENDIF
6504              IF ( k == 1 )  READ ( 13 )  tmp_3d(:,:,:)
6505              t_soil_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =           &
6506                 tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
6507                 
6508           CASE ( 'lsm_start_index_h', 'lsm_start_index_v'  )   
6509                IF ( k == 1 )  THEN
6510
6511                   IF ( ALLOCATED( start_index_on_file ) )                     &
6512                      DEALLOCATE( start_index_on_file )
6513
6514                   ALLOCATE ( start_index_on_file(nys_on_file:nyn_on_file,     &
6515                   nxl_on_file:nxr_on_file) )
6516
6517                   READ ( 13 )  start_index_on_file
6518
6519                ENDIF
6520                 
6521           CASE ( 'lsm_end_index_h', 'lsm_end_index_v' )   
6522                IF ( k == 1 )  THEN
6523
6524                   IF ( ALLOCATED( end_index_on_file ) )                       &
6525                      DEALLOCATE( end_index_on_file )
6526
6527                   ALLOCATE ( end_index_on_file(nys_on_file:nyn_on_file,       &
6528                      nxl_on_file:nxr_on_file) )
6529
6530                   READ ( 13 )  end_index_on_file
6531
6532                ENDIF
6533           
6534           CASE ( 't_soil_h' )
6535           
6536              IF ( k == 1 )  THEN
6537                 IF ( .NOT.  ALLOCATED( t_soil_h%var_2d ) )                    &
6538                    ALLOCATE( t_soil_h%var_2d(nzb_soil:nzt_soil+1,             &
6539                                              1:surf_lsm_h%ns) )
6540                 READ ( 13 )  tmp_walltype_h_2d%var_2d
6541              ENDIF
6542              CALL surface_restore_elements(                                   &
6543                                         t_soil_h%var_2d,                      &
6544                                         tmp_walltype_h_2d%var_2d,             &
6545                                         surf_lsm_h%start_index,               & 
6546                                         start_index_on_file,                  &
6547                                         end_index_on_file,                    &
6548                                         nxlc, nysc,                           &
6549                                         nxlf, nxrf, nysf, nynf,               &
6550                                         nys_on_file, nyn_on_file,             &
6551                                         nxl_on_file,nxr_on_file )
6552
6553           CASE ( 't_soil_v(0)' )
6554           
6555              IF ( k == 1 )  THEN
6556                 IF ( .NOT.  ALLOCATED( t_soil_v(0)%var_2d ) )                 &
6557                    ALLOCATE( t_soil_v(0)%var_2d(nzb_soil:nzt_soil+1,          &
6558                                                 1:surf_lsm_v(0)%ns) )
6559                 READ ( 13 )  tmp_walltype_v_2d(0)%var_2d
6560              ENDIF
6561              CALL surface_restore_elements(                                   &
6562                                      t_soil_v(0)%var_2d,                      &
6563                                      tmp_walltype_v_2d(0)%var_2d,             &
6564                                      surf_lsm_v(0)%start_index,               & 
6565                                      start_index_on_file,                     &
6566                                      end_index_on_file,                       &
6567                                      nxlc, nysc,                              &
6568                                      nxlf, nxrf, nysf, nynf,                  &
6569                                      nys_on_file, nyn_on_file,                &
6570                                      nxl_on_file,nxr_on_file )
6571
6572           CASE ( 't_soil_v(1)' )
6573           
6574              IF ( k == 1 )  THEN
6575                 IF ( .NOT.  ALLOCATED( t_soil_v(1)%var_2d ) )                 &
6576                    ALLOCATE( t_soil_v(1)%var_2d(nzb_soil:nzt_soil+1,          &
6577                                                 1:surf_lsm_v(1)%ns) )
6578                 READ ( 13 )  tmp_walltype_v_2d(1)%var_2d
6579              ENDIF
6580              CALL surface_restore_elements(                                   &
6581                                      t_soil_v(1)%var_2d,                      &
6582                                      tmp_walltype_v_2d(1)%var_2d,             &
6583                                      surf_lsm_v(1)%start_index,               &   
6584                                      start_index_on_file,                     &
6585                                      end_index_on_file,                       &
6586                                      nxlc, nysc,                              &
6587                                      nxlf, nxrf, nysf, nynf,                  &
6588                                      nys_on_file, nyn_on_file,                &
6589                                      nxl_on_file,nxr_on_file )
6590
6591           CASE ( 't_soil_v(2)' )
6592           
6593              IF ( k == 1 )  THEN
6594                 IF ( .NOT.  ALLOCATED( t_soil_v(2)%var_2d ) )                 &
6595                    ALLOCATE( t_soil_v(2)%var_2d(nzb_soil:nzt_soil+1,          &
6596                                                 1:surf_lsm_v(2)%ns) )
6597                 READ ( 13 )  tmp_walltype_v_2d(2)%var_2d
6598              ENDIF
6599              CALL surface_restore_elements(                                   &
6600                                      t_soil_v(2)%var_2d,                      &
6601                                      tmp_walltype_v_2d(2)%var_2d,             &
6602                                      surf_lsm_v(2)%start_index,               & 
6603                                      start_index_on_file,                     &
6604                                      end_index_on_file,                       &
6605                                      nxlc, nysc,                              &
6606                                      nxlf, nxrf, nysf, nynf,                  &
6607                                      nys_on_file, nyn_on_file,                &
6608                                      nxl_on_file,nxr_on_file )
6609
6610           CASE ( 't_soil_v(3)' )
6611           
6612              IF ( k == 1 )  THEN
6613                 IF ( .NOT.  ALLOCATED( t_soil_v(3)%var_2d ) )                 &
6614                    ALLOCATE( t_soil_v(1)%var_2d(nzb_soil:nzt_soil+1,          &
6615                                                 1:surf_lsm_v(3)%ns) )
6616                 READ ( 13 )  tmp_walltype_v_2d(3)%var_2d
6617              ENDIF
6618              CALL surface_restore_elements(                                   &
6619                                      t_soil_v(3)%var_2d,                      &
6620                                      tmp_walltype_v_2d(3)%var_2d,             &
6621                                      surf_lsm_v(3)%start_index,               & 
6622                                      start_index_on_file,                     &
6623                                      end_index_on_file,                       &
6624                                      nxlc, nysc,                              &
6625                                      nxlf, nxrf, nysf, nynf,                  &
6626                                      nys_on_file, nyn_on_file,                &
6627                                      nxl_on_file,nxr_on_file )
6628
6629           CASE ( 'm_soil_h' )
6630           
6631              IF ( k == 1 )  THEN
6632                 IF ( .NOT.  ALLOCATED( m_soil_h%var_2d ) )                    &
6633                    ALLOCATE( m_soil_h%var_2d(nzb_soil:nzt_soil+1,             &
6634                                              1:surf_lsm_h%ns) )
6635                 READ ( 13 )  tmp_walltype_h_2d2%var_2d
6636              ENDIF
6637              CALL surface_restore_elements(                                   &
6638                                        m_soil_h%var_2d,                       &
6639                                        tmp_walltype_h_2d2%var_2d,             &
6640                                        surf_lsm_h%start_index,                & 
6641                                        start_index_on_file,                   &
6642                                        end_index_on_file,                     &
6643                                        nxlc, nysc,                            &
6644                                        nxlf, nxrf, nysf, nynf,                &
6645                                        nys_on_file, nyn_on_file,              &
6646                                        nxl_on_file,nxr_on_file )
6647
6648           CASE ( 'm_soil_v(0)' )
6649           
6650              IF ( k == 1 )  THEN
6651                 IF ( .NOT.  ALLOCATED( m_soil_v(0)%var_2d ) )                 &
6652                    ALLOCATE( m_soil_v(0)%var_2d(nzb_soil:nzt_soil+1,          &
6653                                                 1:surf_lsm_v(0)%ns) )
6654                 READ ( 13 )  tmp_walltype_v_2d2(0)%var_2d
6655              ENDIF
6656              CALL surface_restore_elements(                                   &
6657                                     m_soil_v(0)%var_2d,                       & 
6658                                     tmp_walltype_v_2d2(0)%var_2d,             &
6659                                     surf_lsm_v(0)%start_index,                & 
6660                                     start_index_on_file,                      &
6661                                     end_index_on_file,                        &
6662                                     nxlc, nysc,                               &
6663                                     nxlf, nxrf, nysf, nynf,                   &
6664                                     nys_on_file, nyn_on_file,                 &
6665                                     nxl_on_file,nxr_on_file )
6666
6667           CASE ( 'm_soil_v(1)' )
6668           
6669              IF ( k == 1 )  THEN
6670                 IF ( .NOT.  ALLOCATED( m_soil_v(1)%var_2d ) )                 &
6671                    ALLOCATE( m_soil_v(1)%var_2d(nzb_soil:nzt_soil+1,          &
6672                                                 1:surf_lsm_v(1)%ns) )
6673                 READ ( 13 )  tmp_walltype_v_2d2(1)%var_2d
6674              ENDIF
6675              CALL surface_restore_elements(                                   &
6676                                     m_soil_v(1)%var_2d,                       &   
6677                                     tmp_walltype_v_2d2(1)%var_2d,             &
6678                                     surf_lsm_v(1)%start_index,                & 
6679                                     start_index_on_file,                      &
6680                                     end_index_on_file,                        &
6681                                     nxlc, nysc,                               &
6682                                     nxlf, nxrf, nysf, nynf,                   &
6683                                     nys_on_file, nyn_on_file,                 &
6684                                     nxl_on_file,nxr_on_file )
6685
6686
6687           CASE ( 'm_soil_v(2)' )
6688           
6689              IF ( k == 1 )  THEN
6690                 IF ( .NOT.  ALLOCATED( m_soil_v(2)%var_2d ) )                 &
6691                    ALLOCATE( m_soil_v(2)%var_2d(nzb_soil:nzt_soil+1,          &
6692                                                 1:surf_lsm_v(2)%ns) )
6693                 READ ( 13 )  tmp_walltype_v_2d2(2)%var_2d
6694              ENDIF
6695              CALL surface_restore_elements(                                   &
6696                                     m_soil_v(2)%var_2d,                       & 
6697                                     tmp_walltype_v_2d2(2)%var_2d,             &
6698                                     surf_lsm_v(2)%start_index,                &   
6699                                     start_index_on_file,                      &
6700                                     end_index_on_file,                        &
6701                                     nxlc, nysc,                               &
6702                                     nxlf, nxrf, nysf, nynf,                   &
6703                                     nys_on_file, nyn_on_file,                 &
6704                                     nxl_on_file,nxr_on_file )
6705
6706
6707           CASE ( 'm_soil_v(3)' )
6708           
6709              IF ( k == 1 )  THEN
6710                 IF ( .NOT.  ALLOCATED( m_soil_v(3)%var_2d ) )                 &
6711                    ALLOCATE( m_soil_v(1)%var_2d(nzb_soil:nzt_soil+1,          &
6712                                                 1:surf_lsm_v(3)%ns) )
6713                 READ ( 13 )  tmp_walltype_v_2d2(3)%var_2d
6714              ENDIF
6715              CALL surface_restore_elements(                                   &
6716                                     m_soil_v(3)%var_2d,                       & 
6717                                     tmp_walltype_v_2d2(3)%var_2d,             &
6718                                     surf_lsm_v(3)%start_index,                & 
6719                                     start_index_on_file,                      &
6720                                     end_index_on_file,                        &
6721                                     nxlc, nysc,                               &
6722                                     nxlf, nxrf, nysf, nynf,                   &
6723                                     nys_on_file, nyn_on_file,                 &
6724                                     nxl_on_file,nxr_on_file )
6725
6726
6727           CASE ( 'm_liq_h' )
6728           
6729              IF ( k == 1 )  THEN
6730                 IF ( .NOT.  ALLOCATED( m_liq_h%var_1d ) )                     &
6731                    ALLOCATE( m_liq_h%var_1d(1:surf_lsm_h%ns) )
6732                 READ ( 13 )  tmp_walltype_h_1d%var_1d
6733              ENDIF
6734              CALL surface_restore_elements(                                   &
6735                                         m_liq_h%var_1d,                       &
6736                                         tmp_walltype_h_1d%var_1d,             &
6737                                         surf_lsm_h%start_index,               & 
6738                                         start_index_on_file,                  &
6739                                         end_index_on_file,                    &
6740                                         nxlc, nysc,                           &
6741                                         nxlf, nxrf, nysf, nynf,               &
6742                                         nys_on_file, nyn_on_file,             &
6743                                         nxl_on_file,nxr_on_file )
6744
6745
6746           CASE ( 'm_liq_v(0)' )
6747           
6748              IF ( k == 1 )  THEN
6749                 IF ( .NOT.  ALLOCATED( m_liq_v(0)%var_1d ) )                  &
6750                    ALLOCATE( m_liq_v(0)%var_1d(1:surf_lsm_v(0)%ns) )
6751                 READ ( 13 )  tmp_walltype_v_1d(0)%var_1d
6752              ENDIF
6753              CALL surface_restore_elements(                                   &
6754                                      m_liq_v(0)%var_1d,                       &
6755                                      tmp_walltype_v_1d(0)%var_1d,             &
6756                                      surf_lsm_v(0)%start_index,               & 
6757                                      start_index_on_file,                     &
6758                                      end_index_on_file,                       &
6759                                      nxlc, nysc,                              &
6760                                      nxlf, nxrf, nysf, nynf,                  &
6761                                      nys_on_file, nyn_on_file,                &
6762                                      nxl_on_file,nxr_on_file )
6763
6764
6765           CASE ( 'm_liq_v(1)' )
6766           
6767              IF ( k == 1 )  THEN
6768                 IF ( .NOT.  ALLOCATED( m_liq_v(1)%var_1d ) )                  &
6769                    ALLOCATE( m_liq_v(1)%var_1d(1:surf_lsm_v(1)%ns) )
6770                 READ ( 13 )  tmp_walltype_v_1d(1)%var_1d
6771              ENDIF
6772              CALL surface_restore_elements(                                   &
6773                                      m_liq_v(1)%var_1d,                       &
6774                                      tmp_walltype_v_1d(1)%var_1d,             &
6775                                      surf_lsm_v(1)%start_index,               & 
6776                                      start_index_on_file,                     &
6777                                      end_index_on_file,                       &
6778                                      nxlc, nysc,                              &
6779                                      nxlf, nxrf, nysf, nynf,                  &
6780                                      nys_on_file, nyn_on_file,                &
6781                                      nxl_on_file,nxr_on_file )
6782
6783
6784           CASE ( 'm_liq_v(2)' )
6785           
6786              IF ( k == 1 )  THEN
6787                 IF ( .NOT.  ALLOCATED( m_liq_v(2)%var_1d ) )                  &
6788                    ALLOCATE( m_liq_v(2)%var_1d(1:surf_lsm_v(2)%ns) )
6789                 READ ( 13 )  tmp_walltype_v_1d(2)%var_1d
6790              ENDIF
6791              CALL surface_restore_elements(                                   &
6792                                      m_liq_v(2)%var_1d,                       &
6793                                      tmp_walltype_v_1d(2)%var_1d,             &
6794                                      surf_lsm_v(2)%start_index,               & 
6795                                      start_index_on_file,                     &
6796                                      end_index_on_file,                       &
6797                                      nxlc, nysc,                              &
6798                                      nxlf, nxrf, nysf, nynf,                  &
6799                                      nys_on_file, nyn_on_file,                &
6800                                      nxl_on_file,nxr_on_file )
6801
6802           CASE ( 'm_liq_v(3)' )
6803           
6804              IF ( k == 1 )  THEN
6805                 IF ( .NOT.  ALLOCATED( m_liq_v(3)%var_1d ) )                  &
6806                    ALLOCATE( m_liq_v(3)%var_1d(1:surf_lsm_v(3)%ns) )
6807                 READ ( 13 )  tmp_walltype_v_1d(3)%var_1d
6808              ENDIF
6809              CALL surface_restore_elements(                                   &
6810                                      m_liq_v(3)%var_1d,                       &
6811                                      tmp_walltype_v_1d(3)%var_1d,             &
6812                                      surf_lsm_v(3)%start_index,               & 
6813                                      start_index_on_file,                     &
6814                                      end_index_on_file,                       &
6815                                      nxlc, nysc,                              &
6816                                      nxlf, nxrf, nysf, nynf,                  &
6817                                      nys_on_file, nyn_on_file,                &
6818                                      nxl_on_file,nxr_on_file )
6819
6820
6821           CASE ( 't_surface_h' )
6822           
6823              IF ( k == 1 )  THEN
6824                 IF ( .NOT.  ALLOCATED( t_surface_h%var_1d ) )                 &
6825                    ALLOCATE( t_surface_h%var_1d(1:surf_lsm_h%ns) )
6826                 READ ( 13 )  tmp_walltype_h_1d%var_1d
6827              ENDIF
6828              CALL surface_restore_elements(                                   &
6829                                         t_surface_h%var_1d,                   &
6830                                         tmp_walltype_h_1d%var_1d,             &
6831                                         surf_lsm_h%start_index,               & 
6832                                         start_index_on_file,                  &
6833                                         end_index_on_file,                    &
6834                                         nxlc, nysc,                           &
6835                                         nxlf, nxrf, nysf, nynf,               &
6836                                         nys_on_file, nyn_on_file,             &
6837                                         nxl_on_file,nxr_on_file )
6838
6839           CASE ( 't_surface_v(0)' )
6840           
6841              IF ( k == 1 )  THEN
6842                 IF ( .NOT.  ALLOCATED( t_surface_v(0)%var_1d ) )              &
6843                    ALLOCATE( t_surface_v(0)%var_1d(1:surf_lsm_v(0)%ns) )
6844                 READ ( 13 )  tmp_walltype_v_1d(0)%var_1d
6845              ENDIF
6846              CALL surface_restore_elements(                                   &
6847                                      t_surface_v(0)%var_1d,                   &
6848                                      tmp_walltype_v_1d(0)%var_1d,             &
6849                                      surf_lsm_v(0)%start_index,               & 
6850                                      start_index_on_file,                     &
6851                                      end_index_on_file,                       &
6852                                      nxlc, nysc,                              &
6853                                      nxlf, nxrf, nysf, nynf,                  &
6854                                      nys_on_file, nyn_on_file,                &
6855                                      nxl_on_file,nxr_on_file )
6856
6857           CASE ( 't_surface_v(1)' )
6858           
6859              IF ( k == 1 )  THEN
6860                 IF ( .NOT.  ALLOCATED( t_surface_v(1)%var_1d ) )              &
6861                    ALLOCATE( t_surface_v(1)%var_1d(1:surf_lsm_v(1)%ns) )
6862                 READ ( 13 )  tmp_walltype_v_1d(1)%var_1d
6863              ENDIF
6864              CALL surface_restore_elements(                                   &
6865                                      t_surface_v(1)%var_1d,                   &
6866                                      tmp_walltype_v_1d(1)%var_1d,             &
6867                                      surf_lsm_v(1)%start_index,               & 
6868                                      start_index_on_file,                     &
6869                                      end_index_on_file,                       &
6870                                      nxlc, nysc,                              &
6871                                      nxlf, nxrf, nysf, nynf,                  &
6872                                      nys_on_file, nyn_on_file,                & 
6873                                      nxl_on_file,nxr_on_file )
6874
6875           CASE ( 't_surface_v(2)' )
6876           
6877              IF ( k == 1 )  THEN
6878                 IF ( .NOT.  ALLOCATED( t_surface_v(2)%var_1d ) )              &
6879                    ALLOCATE( t_surface_v(2)%var_1d(1:surf_lsm_v(2)%ns) )
6880                 READ ( 13 )  tmp_walltype_v_1d(2)%var_1d
6881              ENDIF
6882              CALL surface_restore_elements(                                   &
6883                                      t_surface_v(2)%var_1d,                   &
6884                                      tmp_walltype_v_1d(2)%var_1d,             &
6885                                      surf_lsm_v(2)%start_index,               & 
6886                                      start_index_on_file,                     &
6887                                      end_index_on_file,                       &
6888                                      nxlc, nysc,                              &
6889                                      nxlf, nxrf, nysf, nynf,                  &
6890                                      nys_on_file, nyn_on_file,                &
6891                                      nxl_on_file,nxr_on_file )
6892
6893           CASE ( 't_surface_v(3)' )
6894           
6895              IF ( k == 1 )  THEN
6896                 IF ( .NOT.  ALLOCATED( t_surface_v(3)%var_1d ) )              &
6897                    ALLOCATE( t_surface_v(3)%var_1d(1:surf_lsm_v(3)%ns) )
6898                 READ ( 13 )  tmp_walltype_v_1d(3)%var_1d
6899              ENDIF
6900              CALL surface_restore_elements(                                   &
6901                                      t_surface_v(3)%var_1d,                   &
6902                                      tmp_walltype_v_1d(3)%var_1d,             &
6903                                      surf_lsm_v(3)%start_index,               &   
6904                                      start_index_on_file,                     &
6905                                      end_index_on_file,                       &
6906                                      nxlc, nysc,                              &
6907                                      nxlf, nxrf, nysf, nynf,                  &
6908                                      nys_on_file, nyn_on_file,                &
6909                                      nxl_on_file,nxr_on_file )
6910
6911          CASE DEFAULT
6912
6913                found = .FALSE.
6914
6915       END SELECT
6916
6917
6918 END SUBROUTINE lsm_rrd_local
6919
6920!------------------------------------------------------------------------------!
6921! Description:
6922! ------------
6923!> Calculation of roughness length for open water (lakes, ocean). The
6924!> parameterization follows Charnock (1955). Two different implementations
6925!> are available: as in ECMWF-IFS (Beljaars 1994) or as in FLake (Subin et al.
6926!> 2012)
6927!------------------------------------------------------------------------------!
6928    SUBROUTINE calc_z0_water_surface
6929
6930       USE control_parameters,                                                 &
6931           ONLY: message_string, molecular_viscosity
6932
6933       IMPLICIT NONE
6934
6935       INTEGER(iwp) ::  i       !< running index
6936       INTEGER(iwp) ::  j       !< running index
6937       INTEGER(iwp) ::  m       !< running index
6938
6939       REAL(wp), PARAMETER :: alpha_ch  = 0.018_wp !< Charnock constant (0.01-0.11). Use 0.01 for FLake and 0.018 for ECMWF
6940!       REAL(wp), PARAMETER :: pr_number = 0.71_wp !< molecular Prandtl number in the Charnock parameterization (differs from prandtl_number)
6941!       REAL(wp), PARAMETER :: sc_number = 0.66_wp !< molecular Schmidt number in the Charnock parameterization
6942!       REAL(wp) :: re_0 !< near-surface roughness Reynolds number
6943
6944       DO  m = 1, surf_lsm_h%ns
6945
6946          i   = surf_lsm_h%i(m)           
6947          j   = surf_lsm_h%j(m)
6948         
6949          IF ( surf_lsm_h%water_surface(m) )  THEN
6950
6951!
6952!--          Disabled: FLake parameterization. Ideally, the Charnock
6953!--          coefficient should depend on the water depth and the fetch
6954!--          length
6955!             re_0 = z0(j,i) * us(j,i) / molecular_viscosity
6956!       
6957!             z0(j,i) = MAX( 0.1_wp * molecular_viscosity / us(j,i),            &
6958!                           alpha_ch * us(j,i) / g )
6959!
6960!             z0h(j,i) = z0(j,i) * EXP( - kappa / pr_number * ( 4.0_wp * SQRT( re_0 ) - 3.2_wp ) )
6961!             z0q(j,i) = z0(j,i) * EXP( - kappa / pr_number * ( 4.0_wp * SQRT( re_0 ) - 4.2_wp ) )
6962
6963!
6964!--           Set minimum roughness length for u* > 0.2
6965!             IF ( us(j,i) > 0.2_wp )  THEN
6966!                z0h(j,i) = MAX( 1.0E-5_wp, z0h(j,i) )
6967!                z0q(j,i) = MAX( 1.0E-5_wp, z0q(j,i) )
6968!             ENDIF
6969
6970!
6971!--          ECMWF IFS model parameterization after Beljaars (1994). At low
6972!--          wind speed, the sea surface becomes aerodynamically smooth and
6973!--          the roughness scales with the viscosity. At high wind speed, the
6974!--          Charnock relation is used.
6975             surf_lsm_h%z0(m)  = ( 0.11_wp * molecular_viscosity /             &
6976                                 surf_lsm_h%us(m) )                            &
6977                               + ( alpha_ch * surf_lsm_h%us(m)**2 / g )
6978
6979             surf_lsm_h%z0h(m) = 0.40_wp * molecular_viscosity /               &
6980                                 surf_lsm_h%us(m)
6981             surf_lsm_h%z0q(m) = 0.62_wp * molecular_viscosity /               &
6982                                 surf_lsm_h%us(m)
6983
6984 
6985             IF ( surf_lsm_h%z0(m) > 0.1_wp * surf_lsm_h%z_mo(m) )  THEN
6986 
6987                surf_lsm_h%z0(m) = 0.1_wp * surf_lsm_h%z_mo(m)
6988             
6989                WRITE( message_string, * ) 'z0 exceeds surface-layer height' //&
6990                            ' at horizontal sea surface and is ' //            &
6991                            'decreased appropriately at grid point (i,j) = ',  &
6992                            surf_lsm_h%i(m), surf_lsm_h%j(m)
6993                CALL message( 'land_surface_model_mod', 'PA0508',              &
6994                              0, 0, myid, 6, 0 )
6995             ENDIF
6996 
6997             IF ( surf_lsm_h%z0h(m) >= 0.1_wp * surf_lsm_h%z_mo(m) )  THEN
6998 
6999                surf_lsm_h%z0h(m) = 0.1_wp * surf_lsm_h%z_mo(m)
7000             
7001                WRITE( message_string, * ) 'z0h exceeds surface-layer height'//&
7002                            ' at horizontal sea surface and is ' //            &
7003                            'decreased appropriately at grid point (i,j) = ',  &
7004                            surf_lsm_h%i(m), surf_lsm_h%j(m)
7005                CALL message( 'land_surface_model_mod', 'PA0508',              &
7006                              0, 0, myid, 6, 0 )
7007             ENDIF
7008             
7009             IF ( surf_lsm_h%z0q(m) >= 0.1_wp * surf_lsm_h%z_mo(m) )  THEN
7010 
7011                surf_lsm_h%z0q(m) = 0.1_wp * surf_lsm_h%z_mo(m)
7012             
7013                WRITE( message_string, * ) 'z0q exceeds surface-layer height'//&
7014                            ' at horizontal sea surface and is ' //            &
7015                            'decreased appropriately at grid point (i,j) = ',  &
7016                            surf_lsm_h%i(m), surf_lsm_h%j(m)
7017                CALL message( 'land_surface_model_mod', 'PA0508',              &
7018                              0, 0, myid, 6, 0 )
7019             ENDIF
7020 
7021                                 
7022          ENDIF
7023       ENDDO
7024
7025    END SUBROUTINE calc_z0_water_surface
7026
7027!
7028!-- Integrated stability function for heat and moisture
7029    FUNCTION psi_h( zeta )
7030
7031           USE kinds
7032
7033       IMPLICIT NONE
7034
7035       REAL(wp)            :: psi_h !< Integrated similarity function result
7036       REAL(wp)            :: zeta  !< Stability parameter z/L
7037       REAL(wp)            :: x     !< dummy variable
7038
7039       REAL(wp), PARAMETER :: a = 1.0_wp            !< constant
7040       REAL(wp), PARAMETER :: b = 0.66666666666_wp  !< constant
7041       REAL(wp), PARAMETER :: c = 5.0_wp            !< constant
7042       REAL(wp), PARAMETER :: d = 0.35_wp           !< constant
7043       REAL(wp), PARAMETER :: c_d_d = c / d         !< constant
7044       REAL(wp), PARAMETER :: bc_d_d = b * c / d    !< constant
7045
7046
7047      IF ( zeta < 0.0_wp )  THEN
7048         x = SQRT( 1.0_wp  - 16.0_wp * zeta )
7049         psi_h = 2.0_wp * LOG( (1.0_wp + x ) / 2.0_wp )
7050      ELSE
7051         psi_h = - b * ( zeta - c_d_d ) * EXP( -d * zeta ) - (1.0_wp          &
7052                 + 0.66666666666_wp * a * zeta )**1.5_wp - bc_d_d             &
7053                 + 1.0_wp
7054!
7055!--       Old version for stable conditions (only valid for z/L < 0.5)
7056!--       psi_h = - 5.0_wp * zeta
7057       ENDIF
7058
7059   END FUNCTION psi_h
7060   
7061 END MODULE land_surface_model_mod
Note: See TracBrowser for help on using the repository browser.