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

Last change on this file since 3885 was 3885, checked in by kanani, 6 years ago

restructure/add location/debug messages

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