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

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

Check if building-, water-, pavement-, vegetation- and soil types are within a valid range

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