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

Last change on this file since 3832 was 3832, checked in by raasch, 6 years ago

some routines instrumented with openmp directives, loop reordering for performance optimization

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