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

Last change on this file since 4676 was 4671, checked in by pavelkrc, 5 years ago

Radiative transfer model RTM version 4.1

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