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

Last change on this file since 3349 was 3349, checked in by suehring, 7 years ago

Bugfix in initialization of soil properties from dynamic input file

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