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

Last change on this file since 4747 was 4723, checked in by raasch, 5 years ago

file re-formatted to follow the PALM coding standard

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