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

Last change on this file since 3161 was 3161, checked in by maronga, 7 years ago

increased roughness lengths for asphalt

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