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

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

revised number of soil layers. added support for RRTMG runs with dry atmosphere/soil

  • Property svn:keywords set to Id
File size: 171.8 KB
Line 
1!> @file land_surface_model_mod.f90
2!------------------------------------------------------------------------------!
3! This file is part of PALM.
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-2017 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: land_surface_model_mod.f90 2242 2017-06-01 14:12:31Z schwenkel $
27! Changed soil configuration to 8 layers. The number of soil layers is now
28! freely adjustable via the NAMELIST.
29!
30! 2237 2017-05-31 10:34:53Z suehring
31! Bugfix in write restart data
32!
33! 2233 2017-05-30 18:08:54Z suehring
34!
35! 2232 2017-05-30 17:47:52Z suehring
36! Adjustments to new topography and surface concept
37!   - now, also vertical walls are possible
38!   - for vertical walls, parametrization of r_a (aerodynamic resisistance) is
39!     implemented.
40!
41! Add check for soil moisture, it must not exceed its saturation value.
42!
43! 2149 2017-02-09 16:57:03Z scharf
44! Land surface parameters II corrected for veg_type 18 and 19
45!
46! 2031 2016-10-21 15:11:58Z knoop
47! renamed variable rho to rho_ocean
48!
49! 2000 2016-08-20 18:09:15Z knoop
50! Forced header and separation lines into 80 columns
51!
52! 1978 2016-07-29 12:08:31Z maronga
53! Bugfix: initial values of pave_surface and water_surface were not set.
54!
55! 1976 2016-07-27 13:28:04Z maronga
56! Parts of the code have been reformatted. Use of radiation model output is
57! generalized and simplified. Added more output quantities due to modularization
58!
59! 1972 2016-07-26 07:52:02Z maronga
60! Further modularization: output of cross sections and 3D data is now done in this
61! module. Moreover, restart data is written and read directly within this module.
62!
63!
64! 1966 2016-07-18 11:54:18Z maronga
65! Bugfix: calculation of m_total in soil model was not set to zero at model start
66!
67! 1949 2016-06-17 07:19:16Z maronga
68! Bugfix: calculation of qsws_soil_eb with precipitation = .TRUE. gave
69! qsws_soil_eb = 0 due to a typo
70!
71! 1856 2016-04-13 12:56:17Z maronga
72! Bugfix: for water surfaces, the initial water surface temperature is set equal
73! to the intital skin temperature. Moreover, the minimum value of r_a is now
74! 1.0 to avoid too large fluxes at the first model time step
75!
76! 1849 2016-04-08 11:33:18Z hoffmann
77! prr moved to arrays_3d
78!
79! 1826 2016-04-07 12:01:39Z maronga
80! Cleanup after modularization
81!
82! 1817 2016-04-06 15:44:20Z maronga
83! Added interface for lsm_init_arrays. Added subroutines for check_parameters,
84! header, and parin. Renamed some subroutines.
85!
86! 1788 2016-03-10 11:01:04Z maronga
87! Bugfix: calculate lambda_surface based on temperature gradient between skin
88! layer and soil layer instead of Obukhov length
89! Changed: moved calculation of surface specific humidity to energy balance solver
90! New: water surfaces are available by using a fixed sea surface temperature.
91! The roughness lengths are calculated dynamically using the Charnock
92! parameterization. This involves the new roughness length for moisture z0q.
93! New: modified solution of the energy balance solver and soil model for
94! paved surfaces (i.e. asphalt concrete).
95! Syntax layout improved.
96! Changed: parameter dewfall removed.
97!
98! 1783 2016-03-06 18:36:17Z raasch
99! netcdf variables moved to netcdf module
100!
101! 1757 2016-02-22 15:49:32Z maronga
102! Bugfix: set tm_soil_m to zero after allocation. Added parameter
103! unscheduled_radiation_calls to control calls of the radiation model based on
104! the skin temperature change during one time step (preliminary version). Set
105! qsws_soil_eb to zero at model start (previously set to qsws_eb). Removed MAX
106! function as it cannot be vectorized.
107!
108! 1709 2015-11-04 14:47:01Z maronga
109! Renamed pt_1 and qv_1 to pt1 and qv1.
110! Bugfix: set initial values for t_surface_p in case of restart runs
111! Bugfix: zero resistance caused crash when using radiation_scheme = 'clear-sky'
112! Bugfix: calculation of rad_net when using radiation_scheme = 'clear-sky'
113! Added todo action
114!
115! 1697 2015-10-28 17:14:10Z raasch
116! bugfix: misplaced cpp-directive
117!
118! 1695 2015-10-27 10:03:11Z maronga
119! Bugfix: REAL constants provided with KIND-attribute in call of
120! Replaced rif with ol
121!
122! 1691 2015-10-26 16:17:44Z maronga
123! Added skip_time_do_lsm to allow for spin-ups without LSM. Various bugfixes:
124! Soil temperatures are now defined at the edges of the layers, calculation of
125! shb_eb corrected, prognostic equation for skin temperature corrected. Surface
126! fluxes are now directly transfered to atmosphere
127!
128! 1682 2015-10-07 23:56:08Z knoop
129! Code annotations made doxygen readable
130!
131! 1590 2015-05-08 13:56:27Z maronga
132! Bugfix: definition of character strings requires same length for all elements
133!
134! 1585 2015-04-30 07:05:52Z maronga
135! Modifications for RRTMG. Changed tables to PARAMETER type.
136!
137! 1571 2015-03-12 16:12:49Z maronga
138! Removed upper-case variable names. Corrected distribution of precipitation to
139! the liquid water reservoir and the bare soil fractions.
140!
141! 1555 2015-03-04 17:44:27Z maronga
142! Added output of r_a and r_s
143!
144! 1553 2015-03-03 17:33:54Z maronga
145! Improved better treatment of roughness lengths. Added default soil temperature
146! profile
147!
148! 1551 2015-03-03 14:18:16Z maronga
149! Flux calculation is now done in prandtl_fluxes. Added support for data output.
150! Vertical indices have been replaced. Restart runs are now possible. Some
151! variables have beem renamed. Bugfix in the prognostic equation for the surface
152! temperature. Introduced z0_eb and z0h_eb, which overwrite the setting of
153! roughness_length and z0_factor. Added Clapp & Hornberger parametrization for
154! the hydraulic conductivity. Bugfix for root fraction and extraction
155! calculation
156!
157! intrinsic function MAX and MIN
158!
159! 1500 2014-12-03 17:42:41Z maronga
160! Corrected calculation of aerodynamic resistance (r_a).
161! Precipitation is now added to liquid water reservoir using LE_liq.
162! Added support for dry runs.
163!
164! 1496 2014-12-02 17:25:50Z maronga
165! Initial revision
166!
167!
168! Description:
169! ------------
170!> Land surface model, consisting of a solver for the energy balance at the
171!> surface and a four layer soil scheme. The scheme is similar to the TESSEL
172!> scheme implemented in the ECMWF IFS model, with modifications according to
173!> H-TESSEL. The implementation is based on the formulation implemented in the
174!> DALES and UCLA-LES models.
175!>
176!> @todo Restart data for vertical natural land-surfaces
177!> @todo Extensive verification energy-balance solver for vertical surfaces,
178!>       e.g. parametrization of r_a
179!> @todo Revise single land-surface processes for vertical surfaces, e.g.
180!>       treatment of humidity, etc.
181!> @todo Consider partial absorption of the net shortwave radiation by the
182!>       skin layer.
183!> @todo Improve surface water parameterization
184!> @todo Invert indices (running from -3 to 0. Currently: nzb_soil=0,
185!>       nzt_soil=3)).
186!> @todo Implement surface runoff model (required when performing long-term LES
187!>       with considerable precipitation.
188!> @todo Fix crashes with radiation_scheme == 'constant'
189!>
190!> @note No time step criterion is required as long as the soil layers do not
191!>       become too thin.
192!------------------------------------------------------------------------------!
193 MODULE land_surface_model_mod
194 
195    USE arrays_3d,                                                             &
196        ONLY:  hyp, pt, pt_p, prr, q, q_p, ql, vpt, u, v, w
197
198    USE cloud_parameters,                                                      &
199        ONLY:  cp, hyrho, l_d_cp, l_d_r, l_v, pt_d_t, rho_l, r_d, r_v
200
201    USE control_parameters,                                                    &
202        ONLY:  cloud_physics, dt_3d, humidity, intermediate_timestep_count,    &
203               initializing_actions, intermediate_timestep_count_max,          &
204               land_surface, max_masks, precipitation, pt_surface,             &
205               rho_surface, roughness_length, surface_pressure,                &
206               timestep_scheme, tsc, z0h_factor, time_since_reference_point
207
208    USE indices,                                                               &
209        ONLY:  nbgp, nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb 
210
211    USE kinds
212
213    USE pegrid
214
215    USE radiation_model_mod,                                                   &
216        ONLY:  force_radiation_call, rad_net, rad_sw_in, rad_lw_out,           &
217               rad_lw_out_change_0, radiation_scheme, unscheduled_radiation_calls
218       
219    USE statistics,                                                            &
220        ONLY:  hom, statistic_regions
221
222    USE surface_mod,                                                        &
223        ONLY :  surf_lsm_h, surf_lsm_v, surf_type
224
225    IMPLICIT NONE
226
227    TYPE surf_type_lsm
228       REAL(wp), DIMENSION(:),   ALLOCATABLE ::  var_1D !< 1D prognostic variable
229       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  var_2D !< 2D prognostic variable
230    END TYPE surf_type_lsm
231
232!
233!-- LSM model constants
234
235    REAL(wp), PARAMETER  ::                    &
236              b_ch               = 6.04_wp,    & ! Clapp & Hornberger exponent
237              lambda_h_dry       = 0.19_wp,    & ! heat conductivity for dry soil   
238              lambda_h_sm        = 3.44_wp,    & ! heat conductivity of the soil matrix
239              lambda_h_water     = 0.57_wp,    & ! heat conductivity of water
240              psi_sat            = -0.388_wp,  & ! soil matrix potential at saturation
241              rho_c_soil         = 2.19E6_wp,  & ! volumetric heat capacity of soil
242              rho_c_water        = 4.20E6_wp,  & ! volumetric heat capacity of water
243              m_max_depth        = 0.0002_wp     ! Maximum capacity of the water reservoir (m)
244
245
246    REAL(wp), DIMENSION(0:7), PARAMETER  :: zs_default =                       & ! default soil layer configuration
247                                            (/ 0.005_wp, 0.02_wp, 0.04_wp,     &
248                                               0.07_wp, 0.15_wp, 0.28_wp,      &
249                                               1.00_wp, 2.89_wp /)
250
251
252!
253!-- LSM variables
254    INTEGER(iwp) :: nzb_soil = 0,  & !< bottom of the soil model (Earth's surface)
255                    nzt_soil = 0,  & !< top of the soil model
256                    nzs = 0,       & !< number of soil layers
257                    veg_type  = 2, & !< default NAMELIST veg_type_2d
258                    soil_type = 3    !< default NAMELIST soil_type_2d
259   
260       
261    LOGICAL :: conserve_water_content = .TRUE.,  & !< open or closed bottom surface for the soil model
262               force_radiation_call_l = .FALSE., & !< flag to force calling of radiation routine
263               aero_resist_kray = .TRUE.           !< flag to control parametrization of aerodynamic resistance at vertical surface elements
264
265!   value 9999999.9_wp -> generic available or user-defined value must be set
266!   otherwise -> no generic variable and user setting is optional
267    REAL(wp) :: alpha_vangenuchten = 9999999.9_wp,      & !< NAMELIST alpha_vg
268                canopy_resistance_coefficient = 9999999.9_wp, & !< NAMELIST g_d
269                c_surface   = 20000.0_wp,               & !< Surface (skin) heat capacity
270                drho_l_lv,                              & !< (rho_l * l_v)**-1
271                exn,                                    & !< value of the Exner function
272                e_s = 0.0_wp,                           & !< saturation water vapour pressure
273                field_capacity = 9999999.9_wp,          & !< NAMELIST m_fc
274                f_shortwave_incoming = 9999999.9_wp,    & !< NAMELIST f_sw_in
275                hydraulic_conductivity = 9999999.9_wp,  & !< NAMELIST gamma_w_sat
276                ke = 0.0_wp,                            & !< Kersten number
277                lambda_h_sat = 0.0_wp,                  & !< heat conductivity for saturated soil
278                lambda_surface_stable = 9999999.9_wp,   & !< NAMELIST lambda_surface_s
279                lambda_surface_unstable = 9999999.9_wp, & !< NAMELIST lambda_surface_u
280                leaf_area_index = 9999999.9_wp,         & !< NAMELIST lai
281                l_vangenuchten = 9999999.9_wp,          & !< NAMELIST l_vg
282                min_canopy_resistance = 9999999.9_wp,   & !< NAMELIST r_canopy_min
283                min_soil_resistance = 50.0_wp,          & !< NAMELIST r_soil_min
284                m_total = 0.0_wp,                       & !< weighted total water content of the soil (m3/m3)
285                n_vangenuchten = 9999999.9_wp,          & !< NAMELIST n_vg
286                pave_depth = 9999999.9_wp,              & !< depth of the pavement
287                pave_heat_capacity = 1.94E6_wp,         & !< volumetric heat capacity of pavement (e.g. roads)
288                pave_heat_conductivity = 1.00_wp,       & !< heat conductivity for pavements (e.g. roads)
289                q_s = 0.0_wp,                           & !< saturation specific humidity
290                residual_moisture = 9999999.9_wp,       & !< NAMELIST m_res
291                rho_cp,                                 & !< rho_surface * cp
292                rho_lv,                                 & !< rho_ocean * l_v
293                rd_d_rv,                                & !< r_d / r_v
294                saturation_moisture = 9999999.9_wp,     & !< NAMELIST m_sat
295                skip_time_do_lsm = 0.0_wp,              & !< LSM is not called before this time
296                vegetation_coverage = 9999999.9_wp,     & !< NAMELIST c_veg
297                wilting_point = 9999999.9_wp,           & !< NAMELIST m_wilt
298                z0_eb  = 9999999.9_wp,                  & !< NAMELIST z0 (lsm_par)
299                z0h_eb = 9999999.9_wp,                  & !< NAMELIST z0h (lsm_par)
300                z0q_eb = 9999999.9_wp                     !< NAMELIST z0q (lsm_par)
301
302    REAL(wp), DIMENSION(:), ALLOCATABLE  :: ddz_soil,         & !< 1/dz_soil
303                                            ddz_soil_stag,    & !< 1/dz_soil_stag
304                                            dz_soil,          & !< soil grid spacing (edge-edge)
305                                            dz_soil_stag,     & !< soil grid spacing (center-center)
306                                            root_extr           !< root extraction
307
308
309                                           
310    REAL(wp), DIMENSION(0:20)  ::  root_fraction = 9999999.9_wp,               & !< distribution of root surface area to the individual soil layers
311                                   soil_moisture = 0.0_wp,                     & !< NAMELIST soil moisture content (m3/m3)
312                                   soil_temperature = 300.0_wp,                & !< NAMELIST soil temperature (K) +1
313                                   zs = 9999999.9_wp                             !< soil layer depths
314                                   
315#if defined( __nopointer )
316    TYPE(surf_type_lsm), TARGET  ::  t_soil_h,    & !< Soil temperature (K), horizontal surface elements
317                                     t_soil_h_p,  & !< Prog. soil temperature (K), horizontal surface elements
318                                     m_soil_h,    & !< Soil moisture (m3/m3), horizontal surface elements
319                                     m_soil_h_p     !< Prog. soil moisture (m3/m3), horizontal surface elements
320
321    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET  ::  &
322                                     t_soil_v,    & !< Soil temperature (K), vertical surface elements
323                                     t_soil_v_p,  & !< Prog. soil temperature (K), vertical surface elements
324                                     m_soil_v,    & !< Soil moisture (m3/m3), vertical surface elements
325                                     m_soil_v_p     !< Prog. soil moisture (m3/m3), vertical surface elements
326#else
327    TYPE(surf_type_lsm), POINTER ::  t_soil_h,    & !< Soil temperature (K), horizontal surface elements
328                                     t_soil_h_p,  & !< Prog. soil temperature (K), horizontal surface elements
329                                     m_soil_h,    & !< Soil moisture (m3/m3), horizontal surface elements
330                                     m_soil_h_p     !< Prog. soil moisture (m3/m3), horizontal surface elements
331
332    TYPE(surf_type_lsm), TARGET  ::  t_soil_h_1,  & !<
333                                     t_soil_h_2,  & !<
334                                     m_soil_h_1,  & !<
335                                     m_soil_h_2     !<
336
337    TYPE(surf_type_lsm), DIMENSION(:), POINTER :: &
338                                     t_soil_v,    & !< Soil temperature (K), vertical surface elements
339                                     t_soil_v_p,  & !< Prog. soil temperature (K), vertical surface elements
340                                     m_soil_v,    & !< Soil moisture (m3/m3), vertical surface elements
341                                     m_soil_v_p     !< Prog. soil moisture (m3/m3), vertical surface elements   
342
343    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::&
344                                     t_soil_v_1,  & !<
345                                     t_soil_v_2,  & !<
346                                     m_soil_v_1,  & !<
347                                     m_soil_v_2     !<
348#endif   
349
350#if defined( __nopointer )
351    TYPE(surf_type_lsm), TARGET   ::  t_surface_h,    & !< surface temperature (K), horizontal surface elements
352                                      t_surface_h_p,  & !< progn. surface temperature (K), horizontal surface elements
353                                      m_liq_eb_h,     & !< liquid water reservoir (m), horizontal surface elements
354                                      m_liq_eb_h_p      !< progn. liquid water reservoir (m), horizontal surface elements
355
356    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET   ::  &
357                                      t_surface_v,    & !< surface temperature (K), vertical surface elements
358                                      t_surface_v_p,  & !< progn. surface temperature (K), vertical surface elements
359                                      m_liq_eb_v,     & !< liquid water reservoir (m), vertical surface elements
360                                      m_liq_eb_v_p      !< progn. liquid water reservoir (m), vertical surface elements
361#else
362    TYPE(surf_type_lsm), POINTER  ::  t_surface_h,    & !< surface temperature (K), horizontal surface elements
363                                      t_surface_h_p,  & !< progn. surface temperature (K), horizontal surface elements
364                                      m_liq_eb_h,     & !< liquid water reservoir (m), horizontal surface elements
365                                      m_liq_eb_h_p      !< progn. liquid water reservoir (m), horizontal surface elements
366
367    TYPE(surf_type_lsm), TARGET   ::  t_surface_h_1,  & !<
368                                      t_surface_h_2,  & !<
369                                      m_liq_eb_h_1,   & !<
370                                      m_liq_eb_h_2      !<
371
372    TYPE(surf_type_lsm), DIMENSION(:), POINTER  ::    &
373                                      t_surface_v,    & !< surface temperature (K), vertical surface elements
374                                      t_surface_v_p,  & !< progn. surface temperature (K), vertical surface elements
375                                      m_liq_eb_v,     & !< liquid water reservoir (m), vertical surface elements
376                                      m_liq_eb_v_p      !< progn. liquid water reservoir (m), vertical surface elements
377
378    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET   ::  &
379                                      t_surface_v_1,  & !<
380                                      t_surface_v_2,  & !<
381                                      m_liq_eb_v_1,   & !<
382                                      m_liq_eb_v_2      !<
383#endif
384
385#if defined( __nopointer )
386    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: m_liq_eb_av
387#else
388    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: m_liq_eb_av
389#endif
390
391#if defined( __nopointer )
392    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET ::  t_soil_av, & !< Average of t_soil
393                                                        m_soil_av    !< Average of m_soil
394#else
395    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET ::  t_soil_av, & !< Average of t_soil
396                                                        m_soil_av    !< Average of m_soil
397#endif
398
399    TYPE(surf_type_lsm), TARGET ::  tm_liq_eb_h_m   !< liquid water reservoir tendency (m), horizontal surface elements
400    TYPE(surf_type_lsm), TARGET ::  tt_surface_h_m  !< surface temperature tendency (K), horizontal surface elements
401    TYPE(surf_type_lsm), TARGET ::  tt_soil_h_m     !< t_soil storage array, horizontal surface elements
402    TYPE(surf_type_lsm), TARGET ::  tm_soil_h_m     !< m_soil storage array, horizontal surface elements
403
404    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::  tm_liq_eb_v_m   !< liquid water reservoir tendency (m), vertical surface elements
405    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::  tt_surface_v_m  !< surface temperature tendency (K), vertical surface elements
406    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::  tt_soil_v_m     !< t_soil storage array, vertical surface elements
407    TYPE(surf_type_lsm), DIMENSION(0:3), TARGET ::  tm_soil_v_m     !< m_soil storage array, vertical surface elements
408
409!
410!-- Energy balance variables               
411    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
412              c_liq_av,         & !< average of c_liq
413              c_soil_av,        & !< average of c_soil
414              c_veg_av,         & !< average of c_veg
415              ghf_eb_av,        & !< average of ghf_eb
416              lai_av,           & !< average of lai
417              qsws_eb_av,       & !< average of qsws_eb
418              qsws_liq_eb_av,   & !< average of qsws_liq_eb
419              qsws_soil_eb_av,  & !< average of qsws_soil_eb
420              qsws_veg_eb_av,   & !< average of qsws_veg_eb
421              r_a_av,           & !< average of r_a
422              r_s_av,           & !< average of r_s
423              shf_eb_av           !< average of shf_eb
424
425
426!
427!-- Predefined Land surface classes (veg_type)
428    CHARACTER(26), DIMENSION(0:20), PARAMETER :: veg_type_name = (/ &
429                                   'user defined              ',    & ! 0
430                                   'crops, mixed farming      ',    & !  1
431                                   'short grass               ',    & !  2
432                                   'evergreen needleleaf trees',    & !  3
433                                   'deciduous needleleaf trees',    & !  4
434                                   'evergreen broadleaf trees ',    & !  5
435                                   'deciduous broadleaf trees ',    & !  6
436                                   'tall grass                ',    & !  7
437                                   'desert                    ',    & !  8
438                                   'tundra                    ',    & !  9
439                                   'irrigated crops           ',    & ! 10
440                                   'semidesert                ',    & ! 11
441                                   'ice caps and glaciers     ',    & ! 12
442                                   'bogs and marshes          ',    & ! 13
443                                   'inland water              ',    & ! 14
444                                   'ocean                     ',    & ! 15
445                                   'evergreen shrubs          ',    & ! 16
446                                   'deciduous shrubs          ',    & ! 17
447                                   'mixed forest/woodland     ',    & ! 18
448                                   'interrupted forest        ',    & ! 19
449                                   'pavements/roads           '     & ! 20
450                                                                 /)
451
452!
453!-- Soil model classes (soil_type)
454    CHARACTER(12), DIMENSION(0:7), PARAMETER :: soil_type_name = (/ &
455                                   'user defined',                  & ! 0
456                                   'coarse      ',                  & ! 1
457                                   'medium      ',                  & ! 2
458                                   'medium-fine ',                  & ! 3
459                                   'fine        ',                  & ! 4
460                                   'very fine   ',                  & ! 5
461                                   'organic     ',                  & ! 6
462                                   'loamy (CH)  '                   & ! 7
463                                                                 /)
464!
465!-- Land surface parameters according to the respective classes (veg_type)
466
467!
468!-- Land surface parameters I
469!--                          r_canopy_min,     lai,   c_veg,     g_d
470    REAL(wp), DIMENSION(0:3,1:20), PARAMETER :: veg_pars = RESHAPE( (/ &
471                                 180.0_wp, 3.00_wp, 0.90_wp, 0.00_wp,  & !  1
472                                 110.0_wp, 2.00_wp, 0.85_wp, 0.00_wp,  & !  2
473                                 500.0_wp, 5.00_wp, 0.90_wp, 0.03_wp,  & !  3
474                                 500.0_wp, 5.00_wp, 0.90_wp, 0.03_wp,  & !  4
475                                 175.0_wp, 5.00_wp, 0.90_wp, 0.03_wp,  & !  5
476                                 240.0_wp, 6.00_wp, 0.99_wp, 0.13_wp,  & !  6
477                                 100.0_wp, 2.00_wp, 0.70_wp, 0.00_wp,  & !  7
478                                 250.0_wp, 0.05_wp, 0.00_wp, 0.00_wp,  & !  8
479                                  80.0_wp, 1.00_wp, 0.50_wp, 0.00_wp,  & !  9
480                                 180.0_wp, 3.00_wp, 0.90_wp, 0.00_wp,  & ! 10
481                                 150.0_wp, 0.50_wp, 0.10_wp, 0.00_wp,  & ! 11
482                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp,  & ! 12
483                                 240.0_wp, 4.00_wp, 0.60_wp, 0.00_wp,  & ! 13
484                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp,  & ! 14
485                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp,  & ! 15
486                                 225.0_wp, 3.00_wp, 0.50_wp, 0.00_wp,  & ! 16
487                                 225.0_wp, 1.50_wp, 0.50_wp, 0.00_wp,  & ! 17
488                                 250.0_wp, 5.00_wp, 0.90_wp, 0.03_wp,  & ! 18
489                                 175.0_wp, 2.50_wp, 0.90_wp, 0.03_wp,  & ! 19
490                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp   & ! 20
491                                 /), (/ 4, 20 /) )
492
493!
494!-- Land surface parameters II          z0,         z0h,         z0q
495    REAL(wp), DIMENSION(0:2,1:20), PARAMETER :: roughness_par = RESHAPE( (/ & 
496                                   0.25_wp,  0.25E-2_wp,  0.25E-2_wp,       & !  1
497                                   0.20_wp,  0.20E-2_wp,  0.20E-2_wp,       & !  2
498                                   2.00_wp,     2.00_wp,     2.00_wp,       & !  3
499                                   2.00_wp,     2.00_wp,     2.00_wp,       & !  4
500                                   2.00_wp,     2.00_wp,     2.00_wp,       & !  5
501                                   2.00_wp,     2.00_wp,     2.00_wp,       & !  6
502                                   0.47_wp,  0.47E-2_wp,  0.47E-2_wp,       & !  7
503                                  0.013_wp, 0.013E-2_wp, 0.013E-2_wp,       & !  8
504                                  0.034_wp, 0.034E-2_wp, 0.034E-2_wp,       & !  9
505                                    0.5_wp,  0.50E-2_wp,  0.50E-2_wp,       & ! 10
506                                   0.17_wp,  0.17E-2_wp,  0.17E-2_wp,       & ! 11
507                                 1.3E-3_wp,   1.3E-4_wp,   1.3E-4_wp,       & ! 12
508                                   0.83_wp,  0.83E-2_wp,  0.83E-2_wp,       & ! 13
509                                   0.00_wp,     0.00_wp,     0.00_wp,       & ! 14
510                                   0.00_wp,     0.00_wp,     0.00_wp,       & ! 15
511                                   0.10_wp,  0.10E-2_wp,  0.10E-2_wp,       & ! 16
512                                   0.25_wp,  0.25E-2_wp,  0.25E-2_wp,       & ! 17
513                                   2.00_wp,     2.00_wp,     2.00_wp,       & ! 18
514                                   1.10_wp,     1.10_wp,     1.10_wp,       & ! 19
515                                 1.0E-4_wp,   1.0E-5_wp,   1.0E-5_wp        & ! 20
516                                 /), (/ 3, 20 /) )
517
518!
519!-- Land surface parameters III lambda_surface_s, lambda_surface_u, f_sw_in
520    REAL(wp), DIMENSION(0:2,1:20), PARAMETER :: surface_pars = RESHAPE( (/ &
521                                      10.0_wp,       10.0_wp, 0.05_wp,     & !  1
522                                      10.0_wp,       10.0_wp, 0.05_wp,     & !  2
523                                      20.0_wp,       15.0_wp, 0.03_wp,     & !  3
524                                      20.0_wp,       15.0_wp, 0.03_wp,     & !  4
525                                      20.0_wp,       15.0_wp, 0.03_wp,     & !  5
526                                      20.0_wp,       15.0_wp, 0.03_wp,     & !  6
527                                      10.0_wp,       10.0_wp, 0.05_wp,     & !  7
528                                      15.0_wp,       15.0_wp, 0.00_wp,     & !  8
529                                      10.0_wp,       10.0_wp, 0.05_wp,     & !  9
530                                      10.0_wp,       10.0_wp, 0.05_wp,     & ! 10
531                                      10.0_wp,       10.0_wp, 0.05_wp,     & ! 11
532                                      58.0_wp,       58.0_wp, 0.00_wp,     & ! 12
533                                      10.0_wp,       10.0_wp, 0.05_wp,     & ! 13
534                                    1.0E10_wp,     1.0E10_wp, 0.00_wp,     & ! 14
535                                    1.0E10_wp,     1.0E10_wp, 0.00_wp,     & ! 15
536                                      10.0_wp,       10.0_wp, 0.05_wp,     & ! 16
537                                      10.0_wp,       10.0_wp, 0.05_wp,     & ! 17
538                                      20.0_wp,       15.0_wp, 0.03_wp,     & ! 18
539                                      20.0_wp,       15.0_wp, 0.03_wp,     & ! 19
540                                       0.0_wp,        0.0_wp, 0.00_wp      & ! 20
541                                      /), (/ 3, 20 /) )
542
543!
544!-- Root distribution (sum = 1)  level 1-8
545!--                               
546    REAL(wp), DIMENSION(0:7,1:20), PARAMETER :: root_distribution = RESHAPE( (/&
547                                   0.035_wp, 0.069_wp, 0.069_wp, 0.108_wp,     &
548                                   0.195_wp, 0.214_wp, 0.284_wp, 0.026_wp,     & ! 1
549                                   0.050_wp, 0.100_wp, 0.100_wp, 0.136_wp,     &
550                                   0.181_wp, 0.192_wp, 0.215_wp, 0.026_wp,     & ! 2
551                                   0.038_wp, 0.075_wp, 0.075_wp, 0.111_wp,     &
552                                   0.185_wp, 0.203_wp, 0.273_wp, 0.040_wp,     & ! 3
553                                   0.038_wp, 0.075_wp, 0.075_wp, 0.110_wp,     &
554                                   0.180_wp, 0.199_wp, 0.277_wp, 0.046_wp,     & ! 4
555                                   0.035_wp, 0.069_wp, 0.069_wp, 0.105_wp,     &
556                                   0.180_wp, 0.201_wp, 0.295_wp, 0.046_wp,     & ! 5
557                                   0.035_wp, 0.072_wp, 0.072_wp, 0.105_wp,     &
558                                   0.161_wp, 0.180_wp, 0.282_wp, 0.093_wp,     & ! 6
559                                   0.040_wp, 0.077_wp, 0.077_wp, 0.112_wp,     &
560                                   0.176_wp, 0.192_wp, 0.266_wp, 0.060_wp,     & ! 7
561                                   0.142_wp, 0.286_wp, 0.286_wp, 0.286_wp,     &
562                                   0.000_wp, 0.000_wp, 0.000_wp, 0.000_wp,     & ! 8
563                                   0.068_wp, 0.134_wp, 0.134_wp, 0.177_wp,     &
564                                   0.214_wp, 0.203_wp, 0.070_wp, 0.000_wp,     & ! 9
565                                   0.035_wp, 0.068_wp, 0.068_wp, 0.108_wp,     &
566                                   0.195_wp, 0.215_wp, 0.285_wp, 0.026_wp,     & ! 10
567                                   0.025_wp, 0.048_wp, 0.048_wp, 0.078_wp,     &
568                                   0.147_wp, 0.175_wp, 0.353_wp, 0.126_wp,     & ! 11
569                                   0.000_wp, 0.000_wp, 0.000_wp, 0.000_wp,     &
570                                   0.000_wp, 0.000_wp, 0.000_wp, 0.000_wp,     & ! 12
571                                   0.036_wp, 0.072_wp, 0.072_wp, 0.103_wp,     &
572                                   0.163_wp, 0.180_wp, 0.273_wp, 0.074_wp,     & ! 13
573                                   0.000_wp, 0.000_wp, 0.000_wp, 0.000_wp,     &
574                                   0.000_wp, 0.000_wp, 0.000_wp, 0.000_wp,     & ! 14
575                                   0.000_wp, 0.000_wp, 0.000_wp, 0.000_wp,     &
576                                   0.000_wp, 0.000_wp, 0.000_wp, 0.000_wp,     & ! 15
577                                   0.032_wp, 0.066_wp, 0.066_wp, 0.100_wp,     &
578                                   0.172_wp, 0.192_wp, 0.299_wp, 0.073_wp,     & ! 16
579                                   0.032_wp, 0.066_wp, 0.066_wp, 0.100_wp,     &
580                                   0.172_wp, 0.192_wp, 0.299_wp, 0.073_wp,     & ! 17
581                                   0.028_wp, 0.055_wp, 0.055_wp, 0.087_wp,     &
582                                   0.166_wp, 0.195_wp, 0.348_wp, 0.066_wp,     & ! 18
583                                   0.028_wp, 0.055_wp, 0.055_wp, 0.087_wp,     &
584                                   0.166_wp, 0.195_wp, 0.348_wp, 0.066_wp,     & ! 19
585                                   0.000_wp, 0.000_wp, 0.000_wp, 0.000_wp,     &
586                                   0.000_wp, 0.000_wp, 0.000_wp, 0.000_wp      & ! 20
587                                 /), (/ 8, 20 /) )
588
589
590!
591!-- Soil parameters according to the following porosity classes (soil_type)
592
593!
594!-- Soil parameters I           alpha_vg,      l_vg,    n_vg, gamma_w_sat
595    REAL(wp), DIMENSION(0:3,1:7), PARAMETER :: soil_pars = RESHAPE( (/     &
596                                 3.83_wp,  1.250_wp, 1.38_wp,  6.94E-6_wp, & ! 1
597                                 3.14_wp, -2.342_wp, 1.28_wp,  1.16E-6_wp, & ! 2
598                                 0.83_wp, -0.588_wp, 1.25_wp,  0.26E-6_wp, & ! 3
599                                 3.67_wp, -1.977_wp, 1.10_wp,  2.87E-6_wp, & ! 4
600                                 2.65_wp,  2.500_wp, 1.10_wp,  1.74E-6_wp, & ! 5
601                                 1.30_wp,  0.400_wp, 1.20_wp,  0.93E-6_wp, & ! 6
602                                 0.00_wp,  0.00_wp,  0.00_wp,  0.57E-6_wp  & ! 7
603                                 /), (/ 4, 7 /) )
604
605!
606!-- Soil parameters II              m_sat,     m_fc,   m_wilt,    m_res 
607    REAL(wp), DIMENSION(0:3,1:7), PARAMETER :: m_soil_pars = RESHAPE( (/ &
608                                 0.403_wp, 0.244_wp, 0.059_wp, 0.025_wp, & ! 1
609                                 0.439_wp, 0.347_wp, 0.151_wp, 0.010_wp, & ! 2
610                                 0.430_wp, 0.383_wp, 0.133_wp, 0.010_wp, & ! 3
611                                 0.520_wp, 0.448_wp, 0.279_wp, 0.010_wp, & ! 4
612                                 0.614_wp, 0.541_wp, 0.335_wp, 0.010_wp, & ! 5
613                                 0.766_wp, 0.663_wp, 0.267_wp, 0.010_wp, & ! 6
614                                 0.472_wp, 0.323_wp, 0.171_wp, 0.000_wp  & ! 7
615                                 /), (/ 4, 7 /) )
616
617
618    SAVE
619
620
621    PRIVATE
622
623   
624!
625!-- Public functions
626    PUBLIC lsm_check_data_output, lsm_check_data_output_pr,                    &
627           lsm_check_parameters, lsm_define_netcdf_grid, lsm_3d_data_averaging,& 
628           lsm_data_output_2d, lsm_data_output_3d, lsm_energy_balance,         &
629           lsm_header, lsm_init, lsm_init_arrays, lsm_parin, lsm_soil_model,   &
630           lsm_swap_timelevel, lsm_read_restart_data, lsm_last_actions
631!
632!-- Public parameters, constants and initial values
633    PUBLIC aero_resist_kray, skip_time_do_lsm
634
635!
636!-- Public grid variables
637    PUBLIC nzb_soil, nzs, nzt_soil, zs
638
639!
640!-- Public prognostic variables
641    PUBLIC m_soil_h, t_soil_h
642
643
644    INTERFACE lsm_check_data_output
645       MODULE PROCEDURE lsm_check_data_output
646    END INTERFACE lsm_check_data_output
647   
648    INTERFACE lsm_check_data_output_pr
649       MODULE PROCEDURE lsm_check_data_output_pr
650    END INTERFACE lsm_check_data_output_pr
651   
652    INTERFACE lsm_check_parameters
653       MODULE PROCEDURE lsm_check_parameters
654    END INTERFACE lsm_check_parameters
655   
656    INTERFACE lsm_3d_data_averaging
657       MODULE PROCEDURE lsm_3d_data_averaging
658    END INTERFACE lsm_3d_data_averaging
659
660    INTERFACE lsm_data_output_2d
661       MODULE PROCEDURE lsm_data_output_2d
662    END INTERFACE lsm_data_output_2d
663
664    INTERFACE lsm_data_output_3d
665       MODULE PROCEDURE lsm_data_output_3d
666    END INTERFACE lsm_data_output_3d
667
668    INTERFACE lsm_define_netcdf_grid
669       MODULE PROCEDURE lsm_define_netcdf_grid
670    END INTERFACE lsm_define_netcdf_grid
671
672    INTERFACE lsm_energy_balance
673       MODULE PROCEDURE lsm_energy_balance
674    END INTERFACE lsm_energy_balance
675
676    INTERFACE lsm_header
677       MODULE PROCEDURE lsm_header
678    END INTERFACE lsm_header
679   
680    INTERFACE lsm_init
681       MODULE PROCEDURE lsm_init
682    END INTERFACE lsm_init
683
684    INTERFACE lsm_init_arrays
685       MODULE PROCEDURE lsm_init_arrays
686    END INTERFACE lsm_init_arrays
687   
688    INTERFACE lsm_parin
689       MODULE PROCEDURE lsm_parin
690    END INTERFACE lsm_parin
691   
692    INTERFACE lsm_soil_model
693       MODULE PROCEDURE lsm_soil_model
694    END INTERFACE lsm_soil_model
695
696    INTERFACE lsm_swap_timelevel
697       MODULE PROCEDURE lsm_swap_timelevel
698    END INTERFACE lsm_swap_timelevel
699
700    INTERFACE lsm_read_restart_data
701       MODULE PROCEDURE lsm_read_restart_data
702    END INTERFACE lsm_read_restart_data
703
704    INTERFACE lsm_last_actions
705       MODULE PROCEDURE lsm_last_actions
706    END INTERFACE lsm_last_actions
707
708 CONTAINS
709
710!------------------------------------------------------------------------------!
711! Description:
712! ------------
713!> Check data output for land surface model
714!------------------------------------------------------------------------------!
715 SUBROUTINE lsm_check_data_output( var, unit, i, ilen, k )
716 
717 
718    USE control_parameters,                                                 &
719        ONLY:  data_output, message_string
720
721    IMPLICIT NONE
722
723    CHARACTER (LEN=*) ::  unit     !<
724    CHARACTER (LEN=*) ::  var !<
725
726    INTEGER(iwp) :: i
727    INTEGER(iwp) :: ilen   
728    INTEGER(iwp) :: k
729
730    SELECT CASE ( TRIM( var ) )
731
732       CASE ( 'm_soil' )
733          IF (  .NOT.  land_surface )  THEN
734             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
735                      'res land_surface = .TRUE.'
736             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
737          ENDIF
738          unit = 'm3/m3'
739           
740       CASE ( 't_soil' )
741          IF (  .NOT.  land_surface )  THEN
742             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
743                      'res land_surface = .TRUE.'
744             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
745          ENDIF
746          unit = 'K'   
747             
748       CASE ( 'lai*', 'c_liq*', 'c_soil*', 'c_veg*', 'ghf_eb*', 'm_liq_eb*',&
749              'qsws_eb*', 'qsws_liq_eb*', 'qsws_soil_eb*', 'qsws_veg_eb*',  &
750              'r_a*', 'r_s*', 'shf_eb*' )
751          IF ( k == 0  .OR.  data_output(i)(ilen-2:ilen) /= '_xy' )  THEN
752             message_string = 'illegal value for data_output: "' //         &
753                              TRIM( var ) // '" & only 2d-horizontal ' //   &
754                              'cross sections are allowed for this value'
755             CALL message( 'check_parameters', 'PA0111', 1, 2, 0, 6, 0 )
756          ENDIF
757          IF ( TRIM( var ) == 'lai*'  .AND.  .NOT.  land_surface )  THEN
758             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
759                              'res land_surface = .TRUE.'
760             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
761          ENDIF
762          IF ( TRIM( var ) == 'c_liq*'  .AND.  .NOT.  land_surface )  THEN
763             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
764                              'res land_surface = .TRUE.'
765             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
766          ENDIF
767          IF ( TRIM( var ) == 'c_soil*'  .AND.  .NOT.  land_surface )  THEN
768             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
769                              'res land_surface = .TRUE.'
770             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
771          ENDIF
772          IF ( TRIM( var ) == 'c_veg*'  .AND.  .NOT. land_surface )  THEN
773             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
774                              'res land_surface = .TRUE.'
775             CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
776          ENDIF
777          IF ( TRIM( var ) == 'ghf_eb*'  .AND.  .NOT.  land_surface )  THEN
778             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
779                              'res land_surface = .TRUE.'
780             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
781          ENDIF
782          IF ( TRIM( var ) == 'm_liq_eb*'  .AND.  .NOT.  land_surface )  THEN
783             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
784                              'res land_surface = .TRUE.'
785             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
786          ENDIF
787          IF ( TRIM( var ) == 'qsws_eb*'  .AND.  .NOT.  land_surface )  THEN
788             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
789                              'res land_surface = .TRUE.'
790             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
791          ENDIF
792          IF ( TRIM( var ) == 'qsws_liq_eb*'  .AND.  .NOT. land_surface )   &
793          THEN
794             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
795                              'res land_surface = .TRUE.'
796             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
797          ENDIF
798          IF ( TRIM( var ) == 'qsws_soil_eb*'  .AND.  .NOT.  land_surface ) &
799          THEN
800             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
801                              'res land_surface = .TRUE.'
802             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
803          ENDIF
804          IF ( TRIM( var ) == 'qsws_veg_eb*'  .AND.  .NOT. land_surface )   &
805          THEN
806             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
807                              'res land_surface = .TRUE.'
808             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
809          ENDIF
810          IF ( TRIM( var ) == 'r_a*'  .AND.  .NOT.  land_surface ) &
811          THEN
812             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
813                              'res land_surface = .TRUE.'
814             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
815          ENDIF
816          IF ( TRIM( var ) == 'r_s*'  .AND.  .NOT.  land_surface ) &
817          THEN
818             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
819                              'res land_surface = .TRUE.'
820             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
821          ENDIF
822
823          IF ( TRIM( var ) == 'lai*'   )  unit = 'none' 
824          IF ( TRIM( var ) == 'c_liq*' )  unit = 'none'
825          IF ( TRIM( var ) == 'c_soil*')  unit = 'none'
826          IF ( TRIM( var ) == 'c_veg*' )  unit = 'none'
827          IF ( TRIM( var ) == 'ghf_eb*')  unit = 'W/m2'
828          IF ( TRIM( var ) == 'm_liq_eb*'     )  unit = 'm'
829          IF ( TRIM( var ) == 'qsws_eb*'      ) unit = 'W/m2'
830          IF ( TRIM( var ) == 'qsws_liq_eb*'  ) unit = 'W/m2'
831          IF ( TRIM( var ) == 'qsws_soil_eb*' ) unit = 'W/m2'
832          IF ( TRIM( var ) == 'qsws_veg_eb*'  ) unit = 'W/m2'
833          IF ( TRIM( var ) == 'r_a*')     unit = 's/m'     
834          IF ( TRIM( var ) == 'r_s*')     unit = 's/m' 
835          IF ( TRIM( var ) == 'shf_eb*')  unit = 'W/m2'
836             
837       CASE DEFAULT
838          unit = 'illegal'
839
840    END SELECT
841
842
843 END SUBROUTINE lsm_check_data_output
844
845
846!------------------------------------------------------------------------------!
847! Description:
848! ------------
849!> Check data output of profiles for land surface model
850!------------------------------------------------------------------------------!
851 SUBROUTINE lsm_check_data_output_pr( variable, var_count, unit, dopr_unit )
852 
853    USE control_parameters,                                                 &
854        ONLY:  data_output_pr, message_string
855
856    USE indices
857
858    USE profil_parameter
859
860    USE statistics
861
862    IMPLICIT NONE
863   
864    CHARACTER (LEN=*) ::  unit      !<
865    CHARACTER (LEN=*) ::  variable  !<
866    CHARACTER (LEN=*) ::  dopr_unit !< local value of dopr_unit
867 
868    INTEGER(iwp) ::  user_pr_index !<
869    INTEGER(iwp) ::  var_count     !<
870
871    SELECT CASE ( TRIM( variable ) )
872       
873       CASE ( 't_soil', '#t_soil' )
874          IF (  .NOT.  land_surface )  THEN
875             message_string = 'data_output_pr = ' //                        &
876                              TRIM( data_output_pr(var_count) ) // ' is' // &
877                              'not implemented for land_surface = .FALSE.'
878             CALL message( 'check_parameters', 'PA0402', 1, 2, 0, 6, 0 )
879          ELSE
880             dopr_index(var_count) = 89
881             dopr_unit     = 'K'
882             hom(0:nzs-1,2,89,:)  = SPREAD( - zs, 2, statistic_regions+1 )
883             IF ( data_output_pr(var_count)(1:1) == '#' )  THEN
884                dopr_initial_index(var_count) = 90
885                hom(0:nzs-1,2,90,:)   = SPREAD( - zs, 2, statistic_regions+1 )
886                data_output_pr(var_count)     = data_output_pr(var_count)(2:)
887             ENDIF
888             unit = dopr_unit
889          ENDIF
890
891       CASE ( 'm_soil', '#m_soil' )
892          IF (  .NOT.  land_surface )  THEN
893             message_string = 'data_output_pr = ' //                        &
894                              TRIM( data_output_pr(var_count) ) // ' is' // &
895                              ' not implemented for land_surface = .FALSE.'
896             CALL message( 'check_parameters', 'PA0402', 1, 2, 0, 6, 0 )
897          ELSE
898             dopr_index(var_count) = 91
899             dopr_unit     = 'm3/m3'
900             hom(0:nzs-1,2,91,:)  = SPREAD( - zs, 2, statistic_regions+1 )
901             IF ( data_output_pr(var_count)(1:1) == '#' )  THEN
902                dopr_initial_index(var_count) = 92
903                hom(0:nzs-1,2,92,:)   = SPREAD( - zs, 2, statistic_regions+1 )
904                data_output_pr(var_count)     = data_output_pr(var_count)(2:)
905             ENDIF
906             unit = dopr_unit
907          ENDIF
908
909
910       CASE DEFAULT
911          unit = 'illegal'
912
913    END SELECT
914
915
916 END SUBROUTINE lsm_check_data_output_pr
917 
918 
919!------------------------------------------------------------------------------!
920! Description:
921! ------------
922!> Check parameters routine for land surface model
923!------------------------------------------------------------------------------!
924 SUBROUTINE lsm_check_parameters
925
926    USE control_parameters,                                                    &
927        ONLY:  bc_pt_b, bc_q_b, constant_flux_layer, message_string,           &
928               most_method
929                 
930    USE radiation_model_mod,                                                   &
931        ONLY:  radiation
932   
933   
934    IMPLICIT NONE
935
936    INTEGER(iwp) ::  k        !< running index, z-dimension
937!
938!-- Dirichlet boundary conditions are required as the surface fluxes are
939!-- calculated from the temperature/humidity gradients in the land surface
940!-- model
941    IF ( bc_pt_b == 'neumann'  .OR.  bc_q_b == 'neumann' )  THEN
942       message_string = 'lsm requires setting of'//                         &
943                        'bc_pt_b = "dirichlet" and '//                      &
944                        'bc_q_b  = "dirichlet"'
945       CALL message( 'check_parameters', 'PA0399', 1, 2, 0, 6, 0 )
946    ENDIF
947
948    IF (  .NOT.  constant_flux_layer )  THEN
949       message_string = 'lsm requires '//                                   &
950                        'constant_flux_layer = .T.'
951       CALL message( 'check_parameters', 'PA0400', 1, 2, 0, 6, 0 )
952    ENDIF
953
954    IF ( ( veg_type == 14  .OR.  veg_type == 15 ) .AND.                     &
955           most_method == 'lookup' )  THEN
956        WRITE( message_string, * ) 'veg_type = ', veg_type, ' is not ',     &
957                                   'allowed in combination with ',          &
958                                   'most_method = ', most_method
959       CALL message( 'check_parameters', 'PA0417', 1, 2, 0, 6, 0 )
960    ENDIF
961
962    IF ( veg_type == 0 )  THEN
963       IF ( min_canopy_resistance == 9999999.9_wp )  THEN
964          message_string = 'veg_type = 0 (user defined)'//                  &
965                           'requires setting of min_canopy_resistance'//    &
966                           '/= 9999999.9'
967          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
968       ENDIF
969
970       IF ( leaf_area_index == 9999999.9_wp )  THEN
971          message_string = 'veg_type = 0 (user_defined)'//                  &
972                           'requires setting of leaf_area_index'//          &
973                           '/= 9999999.9'
974          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
975       ENDIF
976
977       IF ( vegetation_coverage == 9999999.9_wp )  THEN
978          message_string = 'veg_type = 0 (user_defined)'//                  &
979                           'requires setting of vegetation_coverage'//      &
980                           '/= 9999999.9'
981             CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
982       ENDIF
983
984       IF ( canopy_resistance_coefficient == 9999999.9_wp)  THEN
985          message_string = 'veg_type = 0 (user_defined)'//                  &
986                           'requires setting of'//                          &
987                           'canopy_resistance_coefficient /= 9999999.9'
988          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
989       ENDIF
990
991       IF ( lambda_surface_stable == 9999999.9_wp )  THEN
992          message_string = 'veg_type = 0 (user_defined)'//                  &
993                           'requires setting of lambda_surface_stable'//    &
994                           '/= 9999999.9'
995          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
996       ENDIF
997
998       IF ( lambda_surface_unstable == 9999999.9_wp )  THEN
999          message_string = 'veg_type = 0 (user_defined)'//                  &
1000                           'requires setting of lambda_surface_unstable'//  &
1001                           '/= 9999999.9'
1002          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1003       ENDIF
1004
1005       IF ( f_shortwave_incoming == 9999999.9_wp )  THEN
1006          message_string = 'veg_type = 0 (user_defined)'//                  &
1007                           'requires setting of f_shortwave_incoming'//     &
1008                           '/= 9999999.9'
1009          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1010       ENDIF
1011
1012       IF ( z0_eb == 9999999.9_wp )  THEN
1013          message_string = 'veg_type = 0 (user_defined)'//                  &
1014                           'requires setting of z0_eb'//                    &
1015                           '/= 9999999.9'
1016          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1017       ENDIF
1018
1019       IF ( z0h_eb == 9999999.9_wp )  THEN
1020          message_string = 'veg_type = 0 (user_defined)'//                  &
1021                           'requires setting of z0h_eb'//                   &
1022                           '/= 9999999.9'
1023          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1024       ENDIF
1025
1026
1027    ENDIF
1028
1029    IF ( soil_type == 0 )  THEN
1030
1031       IF ( alpha_vangenuchten == 9999999.9_wp )  THEN
1032          message_string = 'soil_type = 0 (user_defined)'//                 &
1033                           'requires setting of alpha_vangenuchten'//       &
1034                           '/= 9999999.9'
1035          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1036       ENDIF
1037
1038       IF ( l_vangenuchten == 9999999.9_wp )  THEN
1039          message_string = 'soil_type = 0 (user_defined)'//                 &
1040                           'requires setting of l_vangenuchten'//           &
1041                           '/= 9999999.9'
1042          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1043       ENDIF
1044
1045       IF ( n_vangenuchten == 9999999.9_wp )  THEN
1046          message_string = 'soil_type = 0 (user_defined)'//                 &
1047                           'requires setting of n_vangenuchten'//           &
1048                           '/= 9999999.9'
1049          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1050       ENDIF
1051
1052       IF ( hydraulic_conductivity == 9999999.9_wp )  THEN
1053          message_string = 'soil_type = 0 (user_defined)'//                 &
1054                           'requires setting of hydraulic_conductivity'//   &
1055                           '/= 9999999.9'
1056          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1057       ENDIF
1058
1059       IF ( saturation_moisture == 9999999.9_wp )  THEN
1060          message_string = 'soil_type = 0 (user_defined)'//                 &
1061                           'requires setting of saturation_moisture'//      &
1062                           '/= 9999999.9'
1063          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1064       ENDIF
1065
1066       IF ( field_capacity == 9999999.9_wp )  THEN
1067          message_string = 'soil_type = 0 (user_defined)'//                 &
1068                           'requires setting of field_capacity'//           &
1069                           '/= 9999999.9'
1070          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1071       ENDIF
1072
1073       IF ( wilting_point == 9999999.9_wp )  THEN
1074          message_string = 'soil_type = 0 (user_defined)'//                 &
1075                           'requires setting of wilting_point'//            &
1076                           '/= 9999999.9'
1077          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1078       ENDIF
1079
1080       IF ( residual_moisture == 9999999.9_wp )  THEN
1081          message_string = 'soil_type = 0 (user_defined)'//                 &
1082                           'requires setting of residual_moisture'//        &
1083                           '/= 9999999.9'
1084          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1085       ENDIF
1086
1087    ENDIF
1088!
1089!-- Check for proper setting of soil moisture, must not be larger than its
1090!-- saturation value.
1091    DO  k = nzb_soil, nzt_soil
1092       IF ( soil_moisture(k) > m_soil_pars(0,soil_type) )  THEN
1093          message_string = 'soil_moisture must not exceed its saturation' // &
1094                           ' value'
1095          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
1096       ENDIF
1097    ENDDO
1098
1099    IF (  .NOT.  radiation )  THEN
1100       message_string = 'lsm requires '//                                   &
1101                        'radiation = .T.'
1102       CALL message( 'check_parameters', 'PA0400', 1, 2, 0, 6, 0 )
1103    ENDIF
1104       
1105
1106
1107!
1108!-- Determine number of soil layers to be used and check whether an appropriate
1109!-- root fraction is prescribed
1110    nzb_soil = 0
1111    nzt_soil = 0
1112    IF ( ALL( zs == 9999999.9_wp ) )  THEN
1113       nzt_soil = 7
1114       zs(nzb_soil:nzt_soil) = zs_default
1115    ELSE
1116       DO k = 0, 19
1117          IF ( zs(k) /= 9999999.9_wp )  THEN
1118             nzt_soil = nzt_soil + 1
1119             IF ( root_fraction(k) == 9999999.9_wp )  THEN
1120                message_string = 'manual setting of zs '//                     &
1121                                 'requires adequate setting of root_fraction'//&
1122                                 '/= 9999999.9 ' //                            &
1123                                 'and SUM(root_fraction) = 1'
1124                CALL message( 'check_parameters', 'PA0452', 1, 2, 0, 6, 0 )
1125             ENDIF
1126          ENDIF
1127       ENDDO   
1128    ENDIF
1129
1130    IF ( veg_type == 0 )  THEN
1131       IF ( SUM( root_fraction(nzb_soil:nzt_soil) ) /= 1.0_wp )  THEN
1132          message_string = 'veg_type = 0 (user_defined)'//                  &
1133                           'requires setting of root_fraction'//            &
1134                           '/= 9999999.9 and SUM(root_fraction) = 1'
1135          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
1136       ENDIF
1137    ENDIF
1138   
1139 
1140 END SUBROUTINE lsm_check_parameters
1141 
1142!------------------------------------------------------------------------------!
1143! Description:
1144! ------------
1145!> Solver for the energy balance at the surface.
1146!------------------------------------------------------------------------------!
1147 SUBROUTINE lsm_energy_balance( horizontal, l )
1148
1149
1150    IMPLICIT NONE
1151
1152    INTEGER(iwp) ::  i         !< running index
1153    INTEGER(iwp) ::  i_off     !< offset to determine index of surface element, seen from atmospheric grid point, for x
1154    INTEGER(iwp) ::  j         !< running index
1155    INTEGER(iwp) ::  j_off     !< offset to determine index of surface element, seen from atmospheric grid point, for y
1156    INTEGER(iwp) ::  k         !< running index
1157    INTEGER(iwp) ::  k_off     !< offset to determine index of surface element, seen from atmospheric grid point, for z
1158    INTEGER(iwp) ::  k_rad     !< index to access radiation array
1159    INTEGER(iwp) ::  ks        !< running index
1160    INTEGER(iwp) ::  l         !< surface-facing index
1161    INTEGER(iwp) ::  m         !< running index concerning wall elements
1162
1163    LOGICAL      ::  horizontal !< Flag indicating horizontal or vertical surfaces
1164
1165    REAL(wp) :: c_surface_tmp,& !< temporary variable for storing the volumetric heat capacity of the surface
1166                f1,          & !< resistance correction term 1
1167                f2,          & !< resistance correction term 2
1168                f3,          & !< resistance correction term 3
1169                m_min,       & !< minimum soil moisture
1170                e,           & !< water vapour pressure
1171                e_s,         & !< water vapour saturation pressure
1172                e_s_dt,      & !< derivate of e_s with respect to T
1173                tend,        & !< tendency
1174                dq_s_dt,     & !< derivate of q_s with respect to T
1175                coef_1,      & !< coef. for prognostic equation
1176                coef_2,      & !< coef. for prognostic equation
1177                f_qsws,      & !< factor for qsws_eb
1178                f_qsws_veg,  & !< factor for qsws_veg_eb
1179                f_qsws_soil, & !< factor for qsws_soil_eb
1180                f_qsws_liq,  & !< factor for qsws_liq_eb
1181                f_shf,       & !< factor for shf_eb
1182                lambda_surface, & !< Current value of lambda_surface
1183                m_liq_eb_max,   & !< maxmimum value of the liq. water reservoir
1184                pt1,         & !< potential temperature at first grid level
1185                qv1            !< specific humidity at first grid level
1186
1187    TYPE(surf_type_lsm), POINTER ::  surf_t_surface
1188    TYPE(surf_type_lsm), POINTER ::  surf_t_surface_p
1189    TYPE(surf_type_lsm), POINTER ::  surf_tt_surface_m
1190    TYPE(surf_type_lsm), POINTER ::  surf_m_liq_eb
1191    TYPE(surf_type_lsm), POINTER ::  surf_m_liq_eb_p
1192    TYPE(surf_type_lsm), POINTER ::  surf_tm_liq_eb_m
1193
1194    TYPE(surf_type_lsm), POINTER ::  surf_m_soil
1195    TYPE(surf_type_lsm), POINTER ::  surf_t_soil
1196
1197    TYPE(surf_type), POINTER  ::  surf  !< surface-date type variable
1198
1199    IF ( horizontal )  THEN
1200       surf              => surf_lsm_h
1201
1202       surf_t_surface    => t_surface_h
1203       surf_t_surface_p  => t_surface_h_p
1204       surf_tt_surface_m => tt_surface_h_m
1205       surf_m_liq_eb     => m_liq_eb_h
1206       surf_m_liq_eb_p   => m_liq_eb_h_p
1207       surf_tm_liq_eb_m  => tm_liq_eb_h_m
1208       surf_m_soil       => m_soil_h
1209       surf_t_soil       => t_soil_h
1210
1211       k_off     = -1
1212       j_off     = 0
1213       i_off     = 0
1214    ELSE
1215       surf              => surf_lsm_v(l)
1216
1217       surf_t_surface    => t_surface_v(l)
1218       surf_t_surface_p  => t_surface_v_p(l)
1219       surf_tt_surface_m => tt_surface_v_m(l)
1220       surf_m_liq_eb     => m_liq_eb_v(l)
1221       surf_m_liq_eb_p   => m_liq_eb_v_p(l)
1222       surf_tm_liq_eb_m  => tm_liq_eb_v_m(l)
1223       surf_m_soil       => m_soil_v(l)
1224       surf_t_soil       => t_soil_v(l)
1225
1226       k_off = 0
1227       IF ( l == 0 )  THEN
1228          j_off = -1 
1229          i_off = 0
1230       ELSEIF ( l == 1 )  THEN
1231          j_off = 1 
1232          i_off = 0
1233       ELSEIF ( l == 2 )  THEN
1234          j_off = 0 
1235          i_off = -1
1236       ELSEIF ( l == 3 )  THEN
1237          j_off = 0 
1238          i_off = 1
1239       ENDIF
1240    ENDIF
1241
1242!
1243!-- Calculate the exner function for the current time step
1244    exn = ( surface_pressure / 1000.0_wp )**0.286_wp
1245
1246    DO  m = 1, surf%ns
1247
1248       i   = surf%i(m)           
1249       j   = surf%j(m)
1250       k   = surf%k(m)
1251!
1252!--    Determine height index for radiation. Note, in clear-sky case radiation
1253!--    arrays have rank 0 in first dimensions, so index must be zero. In case
1254!--    of RRTMG radiation arrays have non-zero rank in first dimension, so that
1255!--    radiation can be obtained at respective height level
1256       k_rad = MERGE( 0, k + k_off, radiation_scheme /= 'rrtmg' )
1257!
1258!--    Set lambda_surface according to stratification between skin layer and soil
1259       IF (  .NOT.  surf%pave_surface(m) )  THEN
1260
1261          c_surface_tmp = c_surface
1262
1263          IF ( surf_t_surface%var_1d(m) >= surf_t_soil%var_2d(nzb_soil,m))  THEN
1264             lambda_surface = surf%lambda_surface_s(m)
1265          ELSE
1266             lambda_surface = surf%lambda_surface_u(m)
1267          ENDIF
1268       ELSE
1269
1270          c_surface_tmp = pave_heat_capacity * dz_soil(nzb_soil) * 0.5_wp
1271          lambda_surface = pave_heat_conductivity * ddz_soil(nzb_soil)
1272
1273       ENDIF
1274
1275!
1276!--    First step: calculate aerodyamic resistance. As pt, us, ts
1277!--    are not available for the prognostic time step, data from the last
1278!--    time step is used here. Note that this formulation is the
1279!--    equivalent to the ECMWF formulation using drag coefficients
1280       IF ( cloud_physics )  THEN
1281          pt1 = pt(k,j,i) + l_d_cp * pt_d_t(k) * ql(k,j,i)
1282          qv1 = q(k,j,i) - ql(k,j,i)
1283       ELSE
1284          pt1 = pt(k,j,i)
1285          IF ( humidity )  THEN
1286             qv1 = q(k,j,i)
1287          ELSE
1288             qv1 = 0.0_wp
1289          ENDIF
1290       ENDIF
1291!
1292!--    Calculate aerodynamical resistance. For horizontal and vertical
1293!--    surfaces MOST is applied. Moreover, for vertical surfaces, resistance
1294!--    can be obtain via parameterization of Mason (2000) /
1295!--    Krayenhoff and Voogt (2006).
1296!--    To do: detailed investigation which approach is better!
1297       IF ( horizontal  .OR.  .NOT. aero_resist_kray )  THEN
1298          surf%r_a(m) = ( pt1 - surf_lsm_h%pt_surface(m) ) /                   &
1299                        ( surf%ts(m) * surf%us(m) + 1.0E-20_wp )
1300       ELSE
1301          surf%r_a(m) = 1.0_wp / ( 11.8_wp + 4.2_wp *                          &
1302                        SQRT( ( ( u(k,j,i) + u(k,j,i+1) ) * 0.5_wp )**2 +      &
1303                              ( ( v(k,j,i) + v(k,j+1,i) ) * 0.5_wp )**2 +      &
1304                              ( ( w(k,j,i) + w(k-1,j,i) ) * 0.5_wp )**2 )      &
1305                                 )
1306       ENDIF
1307!
1308!--    Make sure that the resistance does not drop to zero for neutral
1309!--    stratification
1310       IF ( ABS( surf%r_a(m) ) < 1.0_wp )  surf%r_a(m) = 1.0_wp
1311!
1312!--    Second step: calculate canopy resistance r_canopy
1313!--    f1-f3 here are defined as 1/f1-f3 as in ECMWF documentation
1314 
1315!--    f1: correction for incoming shortwave radiation (stomata close at
1316!--    night)
1317       f1 = MIN( 1.0_wp, ( 0.004_wp * rad_sw_in(k_rad,j+j_off,i+i_off) + 0.05_wp ) /&
1318                        (0.81_wp * (0.004_wp * rad_sw_in(k_rad,j+j_off,i+i_off)&
1319                         + 1.0_wp)) )
1320!
1321!--    f2: correction for soil moisture availability to plants (the
1322!--    integrated soil moisture must thus be considered here)
1323!--    f2 = 0 for very dry soils
1324       m_total = 0.0_wp
1325       DO  ks = nzb_soil, nzt_soil
1326           m_total = m_total + surf%root_fr(ks,m)                              &
1327                     * MAX( surf_m_soil%var_2d(ks,m), surf%m_wilt(m) )
1328       ENDDO 
1329
1330       IF ( m_total > surf%m_wilt(m)  .AND.                                    &
1331            m_total < surf%m_fc(m) )  THEN
1332          f2 = ( m_total - surf%m_wilt(m) ) /                                  &
1333               ( surf%m_fc(m) - surf%m_wilt(m) )
1334       ELSEIF ( m_total >= surf%m_fc(m) )  THEN
1335          f2 = 1.0_wp
1336       ELSE
1337          f2 = 1.0E-20_wp
1338       ENDIF
1339!
1340!--    Calculate water vapour pressure at saturation
1341       e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( surf_t_surface%var_1d(m) &
1342                     - 273.16_wp ) / ( surf_t_surface%var_1d(m) - 35.86_wp ) )
1343!
1344!--    f3: correction for vapour pressure deficit
1345       IF ( surf%g_d(m) /= 0.0_wp )  THEN
1346!
1347!--       Calculate vapour pressure
1348          e  = qv1 * surface_pressure / 0.622_wp
1349          f3 = EXP ( - surf%g_d(m) * (e_s - e) )
1350       ELSE
1351          f3 = 1.0_wp
1352       ENDIF
1353!
1354!--    Calculate canopy resistance. In case that c_veg is 0 (bare soils),
1355!--    this calculation is obsolete, as r_canopy is not used below.
1356!--    To do: check for very dry soil -> r_canopy goes to infinity
1357       surf%r_canopy(m) = surf%r_canopy_min(m) /                               &
1358                              ( surf%lai(m) * f1 * f2 * f3 + 1.0E-20_wp )
1359!
1360!--    Third step: calculate bare soil resistance r_soil. The Clapp &
1361!--    Hornberger parametrization does not consider c_veg.
1362       IF ( surf%soil_type_2d(m) /= 7 )  THEN
1363          m_min = surf%c_veg(m) * surf%m_wilt(m) +                             &
1364                         ( 1.0_wp - surf%c_veg(m) ) * surf%m_res(m)
1365       ELSE
1366          m_min = surf%m_wilt(m)
1367       ENDIF
1368
1369       f2 = ( surf_m_soil%var_2d(nzb_soil,m) - m_min ) / ( surf%m_fc(m) - m_min )
1370       f2 = MAX( f2, 1.0E-20_wp )
1371       f2 = MIN( f2, 1.0_wp     )
1372
1373       surf%r_soil(m) = surf%r_soil_min(m) / f2
1374
1375!
1376!--    Calculate the maximum possible liquid water amount on plants and
1377!--    bare surface. For vegetated surfaces, a maximum depth of 0.2 mm is
1378!--    assumed, while paved surfaces might hold up 1 mm of water. The
1379!--    liquid water fraction for paved surfaces is calculated after
1380!--    Noilhan & Planton (1989), while the ECMWF formulation is used for
1381!--    vegetated surfaces and bare soils.
1382       IF ( surf%pave_surface(m) )  THEN
1383          m_liq_eb_max = m_max_depth * 5.0_wp
1384          surf%c_liq(m) = MIN( 1.0_wp, ( surf_m_liq_eb%var_1d(m) / m_liq_eb_max)**0.67 )
1385       ELSE
1386          m_liq_eb_max = m_max_depth * ( surf%c_veg(m) * surf%lai(m)&
1387                            + ( 1.0_wp - surf%c_veg(m) ) )
1388          surf%c_liq(m) = MIN( 1.0_wp, surf_m_liq_eb%var_1d(m) / m_liq_eb_max )
1389       ENDIF
1390!
1391!--    Calculate saturation specific humidity
1392       q_s = 0.622_wp * e_s / surface_pressure
1393!
1394!--    In case of dewfall, set evapotranspiration to zero
1395!--    All super-saturated water is then removed from the air
1396       IF ( humidity  .AND.  q_s <= qv1 )  THEN
1397          surf%r_canopy(m) = 0.0_wp
1398          surf%r_soil(m)   = 0.0_wp
1399       ENDIF
1400
1401!
1402!--    Calculate coefficients for the total evapotranspiration
1403!--    In case of water surface, set vegetation and soil fluxes to zero.
1404!--    For pavements, only evaporation of liquid water is possible.
1405       IF ( surf%water_surface(m) )  THEN
1406          f_qsws_veg  = 0.0_wp
1407          f_qsws_soil = 0.0_wp
1408          f_qsws_liq  = rho_lv / surf%r_a(m)
1409       ELSEIF ( surf%pave_surface (m) )  THEN
1410          f_qsws_veg  = 0.0_wp
1411          f_qsws_soil = 0.0_wp
1412          f_qsws_liq  = rho_lv * surf%c_liq(m) / surf%r_a(m)
1413       ELSE
1414          f_qsws_veg  = rho_lv * surf%c_veg(m) *                               &
1415                            ( 1.0_wp        - surf%c_liq(m)    ) /             &
1416                            ( surf%r_a(m) + surf%r_canopy(m) )
1417          f_qsws_soil = rho_lv * (1.0_wp    - surf%c_veg(m)    ) /             &
1418                            ( surf%r_a(m) + surf%r_soil(m)   )
1419          f_qsws_liq  = rho_lv * surf%c_veg(m) * surf%c_liq(m)   /             &
1420                              surf%r_a(m)
1421       ENDIF
1422!
1423!--       If soil moisture is below wilting point, plants do no longer
1424!--       transpirate.
1425!           IF ( m_soil(k,j,i) < m_wilt(j,i) )  THEN
1426!              f_qsws_veg = 0.0_wp
1427!           ENDIF
1428
1429       f_shf  = rho_cp / surf%r_a(m)
1430       f_qsws = f_qsws_veg + f_qsws_soil + f_qsws_liq
1431!
1432!--    Calculate derivative of q_s for Taylor series expansion
1433       e_s_dt = e_s * ( 17.269_wp / ( surf_t_surface%var_1d(m) - 35.86_wp) -   &
1434                        17.269_wp*( surf_t_surface%var_1d(m) - 273.16_wp)      &
1435                       / ( surf_t_surface%var_1d(m) - 35.86_wp)**2 )
1436
1437       dq_s_dt = 0.622_wp * e_s_dt / surface_pressure
1438!
1439!--    Add LW up so that it can be removed in prognostic equation
1440       surf%rad_net_l(m) = rad_net(j,i) + rad_lw_out(nzb,j,i)
1441!
1442!--    Calculate new skin temperature
1443       IF ( humidity )  THEN
1444!
1445!--       Numerator of the prognostic equation
1446          coef_1 = surf%rad_net_l(m) + rad_lw_out_change_0(j,i)                &
1447                   * surf_t_surface%var_1d(m) - rad_lw_out(nzb,j,i)            &
1448                   + f_shf * pt1 + f_qsws * ( qv1 - q_s                        &
1449                   + dq_s_dt * surf_t_surface%var_1d(m) ) + lambda_surface     &
1450                   * surf_t_soil%var_2d(nzb_soil,m)
1451!
1452!--       Denominator of the prognostic equation
1453          coef_2 = rad_lw_out_change_0(j,i) + f_qsws * dq_s_dt                 &
1454                   + lambda_surface + f_shf / exn
1455       ELSE
1456!
1457!--       Numerator of the prognostic equation
1458          coef_1 = surf%rad_net_l(m) + rad_lw_out_change_0(j,i)                &
1459                   * surf_t_surface%var_1d(m) - rad_lw_out(nzb,j,i)            &
1460                   + f_shf * pt1  + lambda_surface                             &
1461                   * surf_t_soil%var_2d(nzb_soil,m)
1462!
1463!--       Denominator of the prognostic equation
1464          coef_2 = rad_lw_out_change_0(j,i) + lambda_surface + f_shf / exn
1465
1466       ENDIF
1467
1468       tend = 0.0_wp
1469
1470!
1471!--    Implicit solution when the surface layer has no heat capacity,
1472!--    otherwise use RK3 scheme.
1473       surf_t_surface_p%var_1d(m) = ( coef_1 * dt_3d * tsc(2) + c_surface_tmp *&
1474                          surf_t_surface%var_1d(m) ) / ( c_surface_tmp + coef_2&
1475                                             * dt_3d * tsc(2) ) 
1476
1477!
1478!--    Add RK3 term
1479       IF ( c_surface_tmp /= 0.0_wp )  THEN
1480
1481          surf_t_surface_p%var_1d(m) = surf_t_surface_p%var_1d(m) + dt_3d *    &
1482                                       tsc(3) * surf_tt_surface_m%var_1d(m)
1483
1484!
1485!--       Calculate true tendency
1486          tend = ( surf_t_surface_p%var_1d(m) - surf_t_surface%var_1d(m) -     &
1487                   dt_3d * tsc(3) * surf_tt_surface_m%var_1d(m)) / (dt_3d  * tsc(2))
1488!
1489!--       Calculate t_surface tendencies for the next Runge-Kutta step
1490          IF ( timestep_scheme(1:5) == 'runge' )  THEN
1491             IF ( intermediate_timestep_count == 1 )  THEN
1492                surf_tt_surface_m%var_1d(m) = tend
1493             ELSEIF ( intermediate_timestep_count <                            &
1494                      intermediate_timestep_count_max )  THEN
1495                surf_tt_surface_m%var_1d(m) = -9.5625_wp * tend +              &
1496                                               5.3125_wp * surf_tt_surface_m%var_1d(m)
1497             ENDIF
1498          ENDIF
1499       ENDIF
1500
1501!
1502!--    In case of fast changes in the skin temperature, it is possible to
1503!--    update the radiative fluxes independently from the prescribed
1504!--    radiation call frequency. This effectively prevents oscillations,
1505!--    especially when setting skip_time_do_radiation /= 0. The threshold
1506!--    value of 0.2 used here is just a first guess. This method should be
1507!--    revised in the future as tests have shown that the threshold is
1508!--    often reached, when no oscillations would occur (causes immense
1509!--    computing time for the radiation code).
1510       IF ( ABS( surf_t_surface_p%var_1d(m) - surf_t_surface%var_1d(m) ) > 0.2_wp  .AND. &
1511            unscheduled_radiation_calls )  THEN
1512          force_radiation_call_l = .TRUE.
1513       ENDIF
1514
1515       pt(k+k_off,j+j_off,i+i_off) = surf_t_surface_p%var_1d(m) / exn  !is actually no air temperature
1516       surf%pt_surface(m)          = surf_t_surface_p%var_1d(m) / exn
1517
1518!
1519!--    Calculate fluxes
1520       surf%rad_net_l(m) = surf%rad_net_l(m) +                                 &
1521                            rad_lw_out_change_0(j,i)                           &
1522                          * surf_t_surface%var_1d(m) - rad_lw_out(nzb,j,i)     &
1523                          - rad_lw_out_change_0(j,i) * surf_t_surface_p%var_1d(m)
1524
1525       rad_net(j,i) = surf%rad_net_l(m)
1526       rad_lw_out(nzb,j,i) = rad_lw_out(nzb,j,i) + rad_lw_out_change_0(j,i) *  &
1527                     ( surf_t_surface_p%var_1d(m) - surf_t_surface%var_1d(m) )
1528
1529       surf%ghf_eb(m) = lambda_surface * ( surf_t_surface_p%var_1d(m)          &
1530                                             - surf_t_soil%var_2d(nzb_soil,m) )
1531
1532       surf%shf_eb(m) = - f_shf * ( pt1 - surf%pt_surface(m) )
1533
1534       surf%shf(m) = surf%shf_eb(m) / rho_cp
1535
1536       IF ( humidity )  THEN
1537          surf%qsws_eb(m)  = - f_qsws * ( qv1 - q_s + dq_s_dt                  &
1538                          * surf_t_surface%var_1d(m) - dq_s_dt *               &
1539                            surf_t_surface_p%var_1d(m) )
1540
1541          surf%qsws(m) = surf%qsws_eb(m) / rho_lv
1542
1543          surf%qsws_veg_eb(m)  = - f_qsws_veg  * ( qv1 - q_s                   &
1544                              + dq_s_dt * surf_t_surface%var_1d(m) - dq_s_dt   &
1545                              * surf_t_surface_p%var_1d(m) )
1546
1547          surf%qsws_soil_eb(m) = - f_qsws_soil * ( qv1 - q_s                   &
1548                              + dq_s_dt * surf_t_surface%var_1d(m) - dq_s_dt   &
1549                              * surf_t_surface_p%var_1d(m) )
1550
1551          surf%qsws_liq_eb(m)  = - f_qsws_liq  * ( qv1 - q_s                   &
1552                              + dq_s_dt * surf_t_surface%var_1d(m) - dq_s_dt   &
1553                              * surf_t_surface_p%var_1d(m) )
1554       ENDIF
1555
1556!
1557!--    Calculate the true surface resistance
1558       IF ( surf%qsws_eb(m) == 0.0_wp )  THEN
1559          surf%r_s(m) = 1.0E10_wp
1560       ELSE
1561          surf%r_s(m) = - rho_lv * ( qv1 - q_s + dq_s_dt                       &
1562                          * surf_t_surface%var_1d(m) - dq_s_dt *               &
1563                            surf_t_surface_p%var_1d(m) ) /                     &
1564                            surf%qsws_eb(m) - surf%r_a(m)
1565       ENDIF
1566
1567!
1568!--    Calculate change in liquid water reservoir due to dew fall or
1569!--    evaporation of liquid water
1570       IF ( humidity )  THEN
1571!
1572!--       If precipitation is activated, add rain water to qsws_liq_eb
1573!--       and qsws_soil_eb according the the vegetation coverage.
1574!--       precipitation_rate is given in mm.
1575          IF ( precipitation )  THEN
1576
1577!
1578!--          Add precipitation to liquid water reservoir, if possible.
1579!--          Otherwise, add the water to soil. In case of
1580!--          pavements, the exceeding water amount is implicitely removed
1581!--          as runoff as qsws_soil_eb is then not used in the soil model
1582             IF ( surf_m_liq_eb%var_1d(m) /= m_liq_eb_max )  THEN
1583                surf%qsws_liq_eb(m) = surf%qsws_liq_eb(m)                      &
1584                                 + surf%c_veg(m) * prr(k+k_off,j+j_off,i+i_off)&
1585                                 * hyrho(k+k_off)                              &
1586                                 * 0.001_wp * rho_l * l_v
1587             ELSE
1588                surf%qsws_soil_eb(m) = surf%qsws_soil_eb(m)                    &
1589                                 + surf%c_veg(m) * prr(k+k_off,j+j_off,i+i_off)&
1590                                 * hyrho(k+k_off)                              &
1591                                 * 0.001_wp * rho_l * l_v
1592             ENDIF
1593
1594!--          Add precipitation to bare soil according to the bare soil
1595!--          coverage.
1596             surf%qsws_soil_eb(m) = surf%qsws_soil_eb(m) + ( 1.0_wp            &
1597                               - surf%c_veg(m) ) * prr(k+k_off,j+j_off,i+i_off)&
1598                               * hyrho(k+k_off)                                &
1599                               * 0.001_wp * rho_l * l_v
1600          ENDIF
1601
1602!
1603!--       If the air is saturated, check the reservoir water level
1604          IF ( surf%qsws_eb(m) < 0.0_wp )  THEN
1605!
1606!--          Check if reservoir is full (avoid values > m_liq_eb_max)
1607!--          In that case, qsws_liq_eb goes to qsws_soil_eb. In this
1608!--          case qsws_veg_eb is zero anyway (because c_liq = 1),       
1609!--          so that tend is zero and no further check is needed
1610             IF ( surf_m_liq_eb%var_1d(m) == m_liq_eb_max )  THEN
1611                surf%qsws_soil_eb(m) = surf%qsws_soil_eb(m) + surf%qsws_liq_eb(m)
1612
1613                surf%qsws_liq_eb(m)  = 0.0_wp
1614             ENDIF
1615
1616!
1617!--          In case qsws_veg_eb becomes negative (unphysical behavior),
1618!--          let the water enter the liquid water reservoir as dew on the
1619!--          plant
1620             IF ( surf%qsws_veg_eb(m) < 0.0_wp )  THEN
1621                surf%qsws_liq_eb(m) = surf%qsws_liq_eb(m) + surf%qsws_veg_eb(m)
1622                surf%qsws_veg_eb(m) = 0.0_wp
1623             ENDIF
1624          ENDIF                   
1625 
1626          tend = - surf%qsws_liq_eb(m) * drho_l_lv
1627          surf_m_liq_eb_p%var_1d(m) = surf_m_liq_eb%var_1d(m) + dt_3d *        &
1628                                        ( tsc(2) * tend +                      &
1629                                          tsc(3) * surf_tm_liq_eb_m%var_1d(m) )
1630!
1631!--       Check if reservoir is overfull -> reduce to maximum
1632!--       (conservation of water is violated here)
1633          surf_m_liq_eb_p%var_1d(m) = MIN( surf_m_liq_eb_p%var_1d(m),m_liq_eb_max )
1634
1635!
1636!--       Check if reservoir is empty (avoid values < 0.0)
1637!--       (conservation of water is violated here)
1638          surf_m_liq_eb_p%var_1d(m) = MAX( surf_m_liq_eb_p%var_1d(m), 0.0_wp )
1639!
1640!--       Calculate m_liq_eb tendencies for the next Runge-Kutta step
1641          IF ( timestep_scheme(1:5) == 'runge' )  THEN
1642             IF ( intermediate_timestep_count == 1 )  THEN
1643                surf_tm_liq_eb_m%var_1d(m) = tend
1644             ELSEIF ( intermediate_timestep_count <                            &
1645                      intermediate_timestep_count_max )  THEN
1646                surf_tm_liq_eb_m%var_1d(m) = -9.5625_wp * tend +               &
1647                                              5.3125_wp * surf_tm_liq_eb_m%var_1d(m)
1648             ENDIF
1649          ENDIF
1650
1651       ENDIF
1652
1653    ENDDO
1654
1655!
1656!-- Make a logical OR for all processes. Force radiation call if at
1657!-- least one processor reached the threshold change in skin temperature
1658    IF ( unscheduled_radiation_calls  .AND.  intermediate_timestep_count       &
1659         == intermediate_timestep_count_max-1 )  THEN
1660#if defined( __parallel )
1661       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
1662       CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call,       &
1663                           1, MPI_LOGICAL, MPI_LOR, comm2d, ierr )
1664#else
1665       force_radiation_call = force_radiation_call_l
1666#endif
1667       force_radiation_call_l = .FALSE.
1668    ENDIF
1669
1670!
1671!-- Calculate surface specific humidity
1672    IF ( humidity )  THEN
1673       CALL calc_q_surface
1674    ENDIF
1675
1676!
1677!-- Calculate new roughness lengths (for water surfaces only)
1678    IF ( horizontal )  CALL calc_z0_water_surface
1679
1680    CONTAINS
1681!------------------------------------------------------------------------------!
1682! Description:
1683! ------------
1684!> Calculation of specific humidity of the skin layer (surface). It is assumend
1685!> that the skin is always saturated.
1686!------------------------------------------------------------------------------!
1687    SUBROUTINE calc_q_surface
1688
1689       IMPLICIT NONE
1690
1691       REAL(wp) :: resistance    !< aerodynamic and soil resistance term
1692
1693       DO  m = 1, surf%ns
1694
1695          i   = surf%i(m)           
1696          j   = surf%j(m)
1697          k   = surf%k(m)
1698
1699!
1700!--       Calculate water vapour pressure at saturation
1701          e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp *                         &
1702                                 ( surf_t_surface_p%var_1d(m) - 273.16_wp ) /  &
1703                                 ( surf_t_surface_p%var_1d(m) - 35.86_wp  )    &
1704                                         )
1705
1706!
1707!--       Calculate specific humidity at saturation
1708          q_s = 0.622_wp * e_s / surface_pressure
1709
1710          resistance = surf%r_a(m) / ( surf%r_a(m) + surf%r_s(m) )
1711
1712!
1713!--       Calculate specific humidity at surface
1714          IF ( cloud_physics )  THEN
1715             q(k+k_off,j+j_off,i+i_off) = resistance * q_s +                   &
1716                                        ( 1.0_wp - resistance ) *              &
1717                                        ( q(k,j,i) - ql(k,j,i) )
1718          ELSE
1719             q(k+k_off,j+j_off,i+i_off) = resistance * q_s +                   &
1720                                        ( 1.0_wp - resistance ) *              &
1721                                          q(k,j,i)
1722          ENDIF
1723
1724!
1725!--       Update virtual potential temperature
1726          vpt(k+k_off,j+j_off,i+i_off) = pt(k+k_off,j+j_off,i+i_off) *         &
1727                     ( 1.0_wp + 0.61_wp * q(k+k_off,j+j_off,i+i_off) )
1728
1729       ENDDO
1730
1731    END SUBROUTINE calc_q_surface
1732
1733
1734
1735 END SUBROUTINE lsm_energy_balance
1736
1737
1738!------------------------------------------------------------------------------!
1739! Description:
1740! ------------
1741!> Header output for land surface model
1742!------------------------------------------------------------------------------!
1743    SUBROUTINE lsm_header ( io )
1744
1745
1746       IMPLICIT NONE
1747
1748       CHARACTER (LEN=86) ::  t_soil_chr          !< String for soil temperature profile
1749       CHARACTER (LEN=86) ::  roots_chr           !< String for root profile
1750       CHARACTER (LEN=86) ::  vertical_index_chr  !< String for the vertical index
1751       CHARACTER (LEN=86) ::  m_soil_chr          !< String for soil moisture
1752       CHARACTER (LEN=86) ::  soil_depth_chr      !< String for soil depth
1753       CHARACTER (LEN=10) ::  coor_chr            !< Temporary string
1754   
1755       INTEGER(iwp) ::  i                         !< Loop index over soil layers
1756 
1757       INTEGER(iwp), INTENT(IN) ::  io            !< Unit of the output file
1758 
1759       t_soil_chr = ''
1760       m_soil_chr    = ''
1761       soil_depth_chr  = '' 
1762       roots_chr        = '' 
1763       vertical_index_chr   = ''
1764
1765       i = 1
1766       DO i = nzb_soil, nzt_soil
1767          WRITE (coor_chr,'(F10.2,7X)') soil_temperature(i)
1768          t_soil_chr = TRIM( t_soil_chr ) // ' ' // TRIM( coor_chr )
1769
1770          WRITE (coor_chr,'(F10.2,7X)') soil_moisture(i)
1771          m_soil_chr = TRIM( m_soil_chr ) // ' ' // TRIM( coor_chr )
1772
1773          WRITE (coor_chr,'(F10.2,7X)')  - zs(i)
1774          soil_depth_chr = TRIM( soil_depth_chr ) // ' '  // TRIM( coor_chr )
1775
1776          WRITE (coor_chr,'(F10.2,7X)')  root_fraction(i)
1777          roots_chr = TRIM( roots_chr ) // ' '  // TRIM( coor_chr )
1778
1779          WRITE (coor_chr,'(I10,7X)')  i
1780          vertical_index_chr = TRIM( vertical_index_chr ) // ' '  //           &
1781                               TRIM( coor_chr )
1782       ENDDO
1783
1784!
1785!--    Write land surface model header
1786       WRITE( io,  1 )
1787       IF ( conserve_water_content )  THEN
1788          WRITE( io, 2 )
1789       ELSE
1790          WRITE( io, 3 )
1791       ENDIF
1792
1793       WRITE( io, 4 ) TRIM( veg_type_name(veg_type) ),                         &
1794                        TRIM (soil_type_name(soil_type) )
1795       WRITE( io, 5 ) TRIM( soil_depth_chr ), TRIM( t_soil_chr ),              &
1796                        TRIM( m_soil_chr ), TRIM( roots_chr ),                 &
1797                        TRIM( vertical_index_chr )
1798
17991   FORMAT (//' Land surface model information:'/                              &
1800              ' ------------------------------'/)
18012   FORMAT ('    --> Soil bottom is closed (water content is conserved',       &
1802            ', default)')
18033   FORMAT ('    --> Soil bottom is open (water content is not conserved)')         
18044   FORMAT ('    --> Land surface type  : ',A,/                                &
1805            '    --> Soil porosity type : ',A)
18065   FORMAT (/'    Initial soil temperature and moisture profile:'//            &
1807            '       Height:        ',A,'  m'/                                  &
1808            '       Temperature:   ',A,'  K'/                                  &
1809            '       Moisture:      ',A,'  m**3/m**3'/                          &
1810            '       Root fraction: ',A,'  '/                                   &
1811            '       Grid point:    ',A)
1812
1813    END SUBROUTINE lsm_header
1814
1815
1816!------------------------------------------------------------------------------!
1817! Description:
1818! ------------
1819!> Initialization of the land surface model
1820!------------------------------------------------------------------------------!
1821    SUBROUTINE lsm_init
1822   
1823
1824       IMPLICIT NONE
1825
1826       INTEGER(iwp) ::  i     !< running index
1827       INTEGER(iwp) ::  i_off !< index offset of surface element, seen from atmospheric grid point
1828       INTEGER(iwp) ::  j     !< running index
1829       INTEGER(iwp) ::  j_off !< index offset of surface element, seen from atmospheric grid point
1830       INTEGER(iwp) ::  k     !< running index
1831       INTEGER(iwp) ::  l     !< running index surface facing
1832       INTEGER(iwp) ::  m     !< running index
1833
1834       REAL(wp) :: pt1   !< potential temperature at first grid level
1835
1836!
1837!--    Calculate Exner function
1838       exn = ( surface_pressure / 1000.0_wp )**0.286_wp
1839!
1840!--    If no cloud physics is used, rho_surface has not been calculated before
1841       IF (  .NOT.  cloud_physics )  THEN
1842          rho_surface = surface_pressure * 100.0_wp / ( r_d * pt_surface * exn )
1843       ENDIF
1844
1845!
1846!--    Calculate frequently used parameters
1847       rho_cp    = cp * rho_surface
1848       rd_d_rv   = r_d / r_v
1849       rho_lv    = rho_surface * l_v
1850       drho_l_lv = 1.0_wp / (rho_l * l_v)
1851
1852!
1853!--    Set initial values for prognostic quantities
1854!--    Horizontal surfaces
1855       tt_surface_h_m%var_1d = 0.0_wp
1856       tt_soil_h_m%var_2d    = 0.0_wp
1857       tm_soil_h_m%var_2d    = 0.0_wp
1858       tm_liq_eb_h_m%var_1d  = 0.0_wp
1859       surf_lsm_h%c_liq = 0.0_wp
1860
1861       surf_lsm_h%ghf_eb = 0.0_wp
1862       surf_lsm_h%shf_eb = rho_cp * surf_lsm_h%shf
1863
1864       IF ( humidity )  THEN
1865          surf_lsm_h%qsws_eb = rho_lv * surf_lsm_h%qsws
1866       ELSE
1867          surf_lsm_h%qsws_eb = 0.0_wp
1868       ENDIF
1869
1870       surf_lsm_h%qsws_liq_eb  = 0.0_wp
1871       surf_lsm_h%qsws_soil_eb = 0.0_wp
1872       surf_lsm_h%qsws_veg_eb  = 0.0_wp
1873
1874       surf_lsm_h%r_a        = 50.0_wp
1875       surf_lsm_h%r_s        = 50.0_wp
1876       surf_lsm_h%r_canopy   = 0.0_wp
1877       surf_lsm_h%r_soil     = 0.0_wp
1878!
1879!--    Do the same for vertical surfaces
1880       DO  l = 0, 3
1881          tt_surface_v_m(l)%var_1d = 0.0_wp
1882          tt_soil_v_m(l)%var_2d    = 0.0_wp
1883          tm_soil_v_m(l)%var_2d    = 0.0_wp
1884          tm_liq_eb_v_m(l)%var_1d  = 0.0_wp
1885          surf_lsm_v(l)%c_liq = 0.0_wp
1886
1887          surf_lsm_v(l)%ghf_eb = 0.0_wp
1888          surf_lsm_v(l)%shf_eb = rho_cp * surf_lsm_v(l)%shf
1889
1890          IF ( humidity )  THEN
1891             surf_lsm_v(l)%qsws_eb = rho_lv * surf_lsm_v(l)%qsws
1892          ELSE
1893             surf_lsm_v(l)%qsws_eb = 0.0_wp
1894          ENDIF
1895
1896          surf_lsm_v(l)%qsws_liq_eb  = 0.0_wp
1897          surf_lsm_v(l)%qsws_soil_eb = 0.0_wp
1898          surf_lsm_v(l)%qsws_veg_eb  = 0.0_wp
1899
1900          surf_lsm_v(l)%r_a        = 50.0_wp
1901          surf_lsm_v(l)%r_s        = 50.0_wp
1902          surf_lsm_v(l)%r_canopy   = 0.0_wp
1903          surf_lsm_v(l)%r_soil     = 0.0_wp
1904       ENDDO
1905
1906       
1907!
1908!--    Allocate 3D soil model arrays
1909!--    First, for horizontal surfaces
1910       ALLOCATE ( surf_lsm_h%root_fr(nzb_soil:nzt_soil,1:surf_lsm_h%ns)     )
1911       ALLOCATE ( surf_lsm_h%lambda_h(nzb_soil:nzt_soil,1:surf_lsm_h%ns)    )
1912       ALLOCATE ( surf_lsm_h%rho_c_total(nzb_soil:nzt_soil,1:surf_lsm_h%ns) )
1913
1914       surf_lsm_h%lambda_h = 0.0_wp
1915!
1916!--    If required, allocate humidity-related variables for the soil model
1917       IF ( humidity )  THEN
1918          ALLOCATE ( surf_lsm_h%lambda_w(nzb_soil:nzt_soil,1:surf_lsm_h%ns) )
1919          ALLOCATE ( surf_lsm_h%gamma_w(nzb_soil:nzt_soil,1:surf_lsm_h%ns)  ) 
1920
1921          surf_lsm_h%lambda_w = 0.0_wp 
1922       ENDIF
1923!
1924!--    For vertical surfaces
1925       DO  l = 0, 3
1926          ALLOCATE ( surf_lsm_v(l)%root_fr(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)     )
1927          ALLOCATE ( surf_lsm_v(l)%lambda_h(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)    )
1928          ALLOCATE ( surf_lsm_v(l)%rho_c_total(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) )
1929
1930          surf_lsm_v(l)%lambda_h = 0.0_wp
1931!
1932!--       If required, allocate humidity-related variables for the soil model
1933          IF ( humidity )  THEN
1934             ALLOCATE ( surf_lsm_v(l)%lambda_w(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns) )
1935             ALLOCATE ( surf_lsm_v(l)%gamma_w(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)  ) 
1936
1937             surf_lsm_v(l)%lambda_w = 0.0_wp 
1938          ENDIF     
1939       ENDDO
1940
1941!
1942!--    Calculate grid spacings. Temperature and moisture are defined at
1943!--    the edges of the soil layers (_stag), whereas gradients/fluxes are defined
1944!--    at the centers
1945       dz_soil(nzb_soil) = zs(nzb_soil)
1946
1947       DO  k = nzb_soil+1, nzt_soil
1948          dz_soil(k) = zs(k) - zs(k-1)
1949       ENDDO
1950       dz_soil(nzt_soil+1) = dz_soil(nzt_soil)
1951
1952       DO  k = nzb_soil, nzt_soil-1
1953          dz_soil_stag(k) = 0.5_wp * (dz_soil(k+1) + dz_soil(k))
1954       ENDDO
1955       dz_soil_stag(nzt_soil) = dz_soil(nzt_soil)
1956
1957       ddz_soil      = 1.0_wp / dz_soil
1958       ddz_soil_stag = 1.0_wp / dz_soil_stag
1959
1960!
1961!--    Initialize standard soil types. It is possible to overwrite each
1962!--    parameter by setting the respecticy NAMELIST variable to a
1963!--    value /= 9999999.9.
1964       IF ( soil_type /= 0 )  THEN 
1965 
1966          IF ( alpha_vangenuchten == 9999999.9_wp )  THEN
1967             alpha_vangenuchten = soil_pars(0,soil_type)
1968          ENDIF
1969
1970          IF ( l_vangenuchten == 9999999.9_wp )  THEN
1971             l_vangenuchten = soil_pars(1,soil_type)
1972          ENDIF
1973
1974          IF ( n_vangenuchten == 9999999.9_wp )  THEN
1975             n_vangenuchten = soil_pars(2,soil_type)           
1976          ENDIF
1977
1978          IF ( hydraulic_conductivity == 9999999.9_wp )  THEN
1979             hydraulic_conductivity = soil_pars(3,soil_type)           
1980          ENDIF
1981
1982          IF ( saturation_moisture == 9999999.9_wp )  THEN
1983             saturation_moisture = m_soil_pars(0,soil_type)           
1984          ENDIF
1985
1986          IF ( field_capacity == 9999999.9_wp )  THEN
1987             field_capacity = m_soil_pars(1,soil_type)           
1988          ENDIF
1989
1990          IF ( wilting_point == 9999999.9_wp )  THEN
1991             wilting_point = m_soil_pars(2,soil_type)           
1992          ENDIF
1993
1994          IF ( residual_moisture == 9999999.9_wp )  THEN
1995             residual_moisture = m_soil_pars(3,soil_type)       
1996          ENDIF
1997
1998       ENDIF   
1999
2000!
2001!--    Map values to the respective 2D arrays
2002!--    Horizontal surfaces
2003       surf_lsm_h%alpha_vg      = alpha_vangenuchten
2004       surf_lsm_h%l_vg          = l_vangenuchten
2005       surf_lsm_h%n_vg          = n_vangenuchten 
2006       surf_lsm_h%gamma_w_sat   = hydraulic_conductivity
2007       surf_lsm_h%m_sat         = saturation_moisture
2008       surf_lsm_h%m_fc          = field_capacity
2009       surf_lsm_h%m_wilt        = wilting_point
2010       surf_lsm_h%m_res         = residual_moisture
2011       surf_lsm_h%r_soil_min    = min_soil_resistance
2012!
2013!--    Vertical surfaces
2014       DO  l = 0, 3
2015          surf_lsm_v(l)%alpha_vg      = alpha_vangenuchten
2016          surf_lsm_v(l)%l_vg          = l_vangenuchten
2017          surf_lsm_v(l)%n_vg          = n_vangenuchten 
2018          surf_lsm_v(l)%gamma_w_sat   = hydraulic_conductivity
2019          surf_lsm_v(l)%m_sat         = saturation_moisture
2020          surf_lsm_v(l)%m_fc          = field_capacity
2021          surf_lsm_v(l)%m_wilt        = wilting_point
2022          surf_lsm_v(l)%m_res         = residual_moisture
2023          surf_lsm_v(l)%r_soil_min    = min_soil_resistance
2024       ENDDO
2025
2026
2027
2028!
2029!--    Initial run actions
2030       IF (  TRIM( initializing_actions ) /= 'read_restart_data' )  THEN
2031!
2032!--       First, for horizontal surfaces
2033          t_soil_h%var_2d    = 0.0_wp
2034          m_soil_h%var_2d    = 0.0_wp
2035          m_liq_eb_h%var_1d  = 0.0_wp
2036
2037!
2038!--       Map user settings of T and q for each soil layer
2039!--       (make sure that the soil moisture does not drop below the permanent
2040!--       wilting point) -> problems with devision by zero)
2041          DO  k = nzb_soil, nzt_soil
2042             t_soil_h%var_2d(k,:)      = soil_temperature(k)
2043             m_soil_h%var_2d(k,:)      = MAX(soil_moisture(k),surf_lsm_h%m_wilt(:))
2044             soil_moisture(k) = MAX(soil_moisture(k),wilting_point)
2045          ENDDO
2046          t_soil_h%var_2d(nzt_soil+1,:) = soil_temperature(nzt_soil+1)
2047
2048!
2049!--       Calculate surface temperature
2050          t_surface_h%var_1d(:)    = pt_surface * exn
2051          surf_lsm_h%pt_surface(:) = pt_surface
2052
2053!
2054!--       Set artifical values for ts and us so that r_a has its initial value
2055!--       for the first time step. Only for interior core domain, not for ghost points
2056          DO  m = 1, surf_lsm_h%ns
2057             i   = surf_lsm_h%i(m)           
2058             j   = surf_lsm_h%j(m)
2059             k   = surf_lsm_h%k(m)
2060
2061             IF ( cloud_physics )  THEN
2062                pt1 = pt(k,j,i) + l_d_cp * pt_d_t(k) * ql(k,j,i)
2063             ELSE
2064                pt1 = pt(k,j,i)
2065             ENDIF
2066
2067!
2068!--          Assure that r_a cannot be zero at model start
2069             IF ( pt1 == surf_lsm_h%pt_surface(m) )  pt1 = pt1 + 1.0E-10_wp
2070
2071             surf_lsm_h%us(m)   = 0.1_wp
2072             surf_lsm_h%ts(m)   = ( pt1 - surf_lsm_h%pt_surface(m) ) / surf_lsm_h%r_a(m)
2073             surf_lsm_h%shf(m)  = - surf_lsm_h%us(m) * surf_lsm_h%ts(m)
2074          ENDDO
2075!
2076!--       Vertical surfaces
2077          DO  l = 0, 3
2078
2079             t_soil_v(l)%var_2d    = 0.0_wp
2080             m_soil_v(l)%var_2d    = 0.0_wp
2081             m_liq_eb_v(l)%var_1d  = 0.0_wp
2082
2083!
2084!--          Map user settings of T and q for each soil layer
2085!--          (make sure that the soil moisture does not drop below the permanent
2086!--          wilting point) -> problems with devision by zero)
2087             DO  k = nzb_soil, nzt_soil
2088                t_soil_v(l)%var_2d(k,:)      = soil_temperature(k)
2089                m_soil_v(l)%var_2d(k,:)      = MAX(soil_moisture(k),surf_lsm_v(l)%m_wilt(:))
2090                soil_moisture(k) = MAX(soil_moisture(k),wilting_point)
2091             ENDDO
2092             t_soil_v(l)%var_2d(nzt_soil+1,:) = soil_temperature(nzt_soil+1)
2093
2094!
2095!--          Calculate surface temperature
2096             t_surface_v(l)%var_1d(:)   = pt_surface * exn
2097             surf_lsm_h%pt_surface(:)   = pt_surface
2098
2099!
2100!--          Set artifical values for ts and us so that r_a has its initial value
2101!--          for the first time step. Only for interior core domain, not for ghost points
2102             DO  m = 1, surf_lsm_v(l)%ns
2103                i   = surf_lsm_v(l)%i(m)           
2104                j   = surf_lsm_v(l)%j(m)
2105                k   = surf_lsm_v(l)%k(m)
2106
2107                IF ( cloud_physics )  THEN
2108                   pt1 = pt(k,j,i) + l_d_cp * pt_d_t(k) * ql(k,j,i)
2109                ELSE
2110                   pt1 = pt(k,j,i)
2111                ENDIF
2112
2113!
2114!--             Assure that r_a cannot be zero at model start
2115                IF ( pt1 == surf_lsm_h%pt_surface(m) )  pt1 = pt1 + 1.0E-10_wp
2116
2117                surf_lsm_v(l)%us(m)   = 0.1_wp
2118                surf_lsm_v(l)%ts(m)   = ( pt1 - surf_lsm_h%pt_surface(m) ) / surf_lsm_v(l)%r_a(m)
2119                surf_lsm_v(l)%shf(m)  = - surf_lsm_v(l)%us(m) * surf_lsm_v(l)%ts(m)
2120             ENDDO
2121          ENDDO
2122
2123!
2124!--    Actions for restart runs
2125       ELSE
2126!
2127!--       Horizontal surfaces
2128          DO  m = 1, surf_lsm_h%ns
2129             i   = surf_lsm_h%i(m)           
2130             j   = surf_lsm_h%j(m)
2131             k   = surf_lsm_h%k(m)         
2132             t_surface_h%var_1d(m) = pt(k-1,j,i) * exn
2133          ENDDO
2134!
2135!--       Vertical surfaces
2136          DO  l = 0, 3
2137!
2138!--          Set index offset of surface element, seen from atmospheric grid point
2139             IF ( l == 0 )  THEN
2140                j_off = -1 
2141                i_off = 0
2142             ELSEIF ( l == 1 )  THEN
2143                j_off = 1 
2144                i_off = 0
2145             ELSEIF ( l == 2 )  THEN
2146                j_off = 0 
2147                i_off = -1
2148             ELSEIF ( l == 3 )  THEN
2149                j_off = 0 
2150                i_off = 1
2151             ENDIF
2152             DO  m = 1, surf_lsm_v(l)%ns
2153                i   = surf_lsm_v(l)%i(m)           
2154                j   = surf_lsm_v(l)%j(m)
2155                k   = surf_lsm_v(l)%k(m)         
2156                t_surface_v(l)%var_1d(m) = pt(k,j+j_off,i+i_off) * exn
2157             ENDDO
2158          ENDDO
2159
2160       ENDIF
2161!
2162!--    Initialize root fraction
2163!--    Horizontal surfaces
2164       DO  m = 1, surf_lsm_h%ns
2165          i   = surf_lsm_h%i(m)           
2166          j   = surf_lsm_h%j(m)
2167
2168          DO  k = nzb_soil, nzt_soil
2169             surf_lsm_h%root_fr(k,m) = root_fraction(k)
2170          ENDDO
2171       ENDDO
2172!
2173!--    Vertical surfaces
2174       DO  l = 0, 3
2175          DO  m = 1, surf_lsm_v(l)%ns
2176             i   = surf_lsm_v(l)%i(m)           
2177             j   = surf_lsm_v(l)%j(m)
2178
2179             DO  k = nzb_soil, nzt_soil
2180                surf_lsm_v(l)%root_fr(k,m) = root_fraction(k)
2181             ENDDO
2182          ENDDO
2183       ENDDO
2184
2185       IF ( veg_type /= 0 )  THEN
2186          IF ( min_canopy_resistance == 9999999.9_wp )  THEN
2187             min_canopy_resistance = veg_pars(0,veg_type)
2188          ENDIF
2189          IF ( leaf_area_index == 9999999.9_wp )  THEN
2190             leaf_area_index = veg_pars(1,veg_type)         
2191          ENDIF
2192          IF ( vegetation_coverage == 9999999.9_wp )  THEN
2193             vegetation_coverage = veg_pars(2,veg_type)     
2194          ENDIF
2195          IF ( canopy_resistance_coefficient == 9999999.9_wp )  THEN
2196              canopy_resistance_coefficient= veg_pars(3,veg_type)     
2197          ENDIF
2198          IF ( lambda_surface_stable == 9999999.9_wp )  THEN
2199             lambda_surface_stable = surface_pars(0,veg_type)         
2200          ENDIF
2201          IF ( lambda_surface_unstable == 9999999.9_wp )  THEN
2202             lambda_surface_unstable = surface_pars(1,veg_type)       
2203          ENDIF
2204          IF ( f_shortwave_incoming == 9999999.9_wp )  THEN
2205             f_shortwave_incoming = surface_pars(2,veg_type)       
2206          ENDIF
2207          IF ( z0_eb == 9999999.9_wp )  THEN
2208             roughness_length = roughness_par(0,veg_type) 
2209             z0_eb            = roughness_par(0,veg_type) 
2210          ENDIF
2211          IF ( z0h_eb == 9999999.9_wp )  THEN
2212             z0h_eb = roughness_par(1,veg_type)
2213          ENDIF
2214          IF ( z0q_eb == 9999999.9_wp )  THEN
2215             z0q_eb = roughness_par(2,veg_type)
2216          ENDIF
2217          z0h_factor = z0h_eb / ( z0_eb + 1.0E-20_wp )
2218
2219          IF ( ALL( root_fraction == 9999999.9_wp ) )  THEN
2220             DO  m = 1, surf_lsm_h%ns
2221                i   = surf_lsm_h%i(m)           
2222                j   = surf_lsm_h%j(m)
2223
2224
2225                DO  k = nzb_soil, nzt_soil 
2226                   surf_lsm_h%root_fr(k,m) = root_distribution(k,veg_type)
2227                   root_fraction(k)        = root_distribution(k,veg_type)
2228                ENDDO
2229             ENDDO
2230             DO  l = 0, 3
2231                DO  m = 1, surf_lsm_v(l)%ns
2232                   i   = surf_lsm_v(l)%i(m)           
2233                   j   = surf_lsm_v(l)%j(m)
2234
2235                   DO  k = nzb_soil, nzt_soil
2236                      surf_lsm_v(l)%root_fr(k,m) = root_distribution(k,veg_type)
2237                      root_fraction(k)    = root_distribution(k,veg_type)
2238                   ENDDO
2239                ENDDO
2240             ENDDO
2241          ENDIF
2242
2243       ELSE
2244
2245          IF ( z0_eb == 9999999.9_wp )  THEN
2246             z0_eb = roughness_length
2247          ENDIF
2248          IF ( z0h_eb == 9999999.9_wp )  THEN
2249             z0h_eb = z0_eb * z0h_factor
2250          ENDIF
2251          IF ( z0q_eb == 9999999.9_wp )  THEN
2252             z0q_eb = z0_eb * z0h_factor
2253          ENDIF
2254
2255       ENDIF
2256
2257!
2258!--    For surfaces covered with pavement, set depth of the pavement (with dry
2259!--    soil below). The depth must be greater than the first soil layer depth
2260       IF ( veg_type == 20 )  THEN
2261          IF ( pave_depth == 9999999.9_wp )  THEN
2262             pave_depth = zs(nzb_soil) 
2263          ELSE
2264             pave_depth = MAX( zs(nzb_soil), pave_depth )
2265          ENDIF
2266       ENDIF
2267
2268!
2269!--    Map vegetation and soil types to 2D array to allow for heterogeneous
2270!--    surfaces via user interface see below
2271!--    First for horizontal surfaces
2272       surf_lsm_h%veg_type_2d  = veg_type
2273       surf_lsm_h%soil_type_2d = soil_type
2274
2275!
2276!--    Map vegetation parameters to the respective 2D arrays
2277       surf_lsm_h%r_canopy_min      = min_canopy_resistance
2278       surf_lsm_h%lai               = leaf_area_index
2279       surf_lsm_h%c_veg             = vegetation_coverage
2280       surf_lsm_h%g_d               = canopy_resistance_coefficient
2281       surf_lsm_h%lambda_surface_s  = lambda_surface_stable
2282       surf_lsm_h%lambda_surface_u  = lambda_surface_unstable
2283       surf_lsm_h%f_sw_in           = f_shortwave_incoming
2284       surf_lsm_h%z0                = z0_eb
2285       surf_lsm_h%z0h               = z0h_eb
2286       surf_lsm_h%z0q               = z0q_eb
2287
2288!--    Vertical surfaces
2289       DO  l = 0, 3
2290          surf_lsm_v(l)%veg_type_2d  = veg_type
2291          surf_lsm_v(l)%soil_type_2d = soil_type
2292
2293!
2294!--       Map vegetation parameters to the respective 2D arrays
2295          surf_lsm_v(l)%r_canopy_min      = min_canopy_resistance
2296          surf_lsm_v(l)%lai               = leaf_area_index
2297          surf_lsm_v(l)%c_veg             = vegetation_coverage
2298          surf_lsm_v(l)%g_d               = canopy_resistance_coefficient
2299          surf_lsm_v(l)%lambda_surface_s  = lambda_surface_stable
2300          surf_lsm_v(l)%lambda_surface_u  = lambda_surface_unstable
2301          surf_lsm_v(l)%f_sw_in           = f_shortwave_incoming
2302          surf_lsm_v(l)%z0                = z0_eb
2303          surf_lsm_v(l)%z0h               = z0h_eb
2304          surf_lsm_v(l)%z0q               = z0q_eb
2305       ENDDO
2306
2307!
2308!--    Possibly do user-defined actions (e.g. define heterogeneous land surface)
2309       CALL user_init_land_surface
2310
2311!
2312!--    Set flag parameter if vegetation type was set to a water surface. Also
2313!--    set temperature to a constant value in all "soil" layers.
2314!--    For now, do not set water surface for vertical surfaces
2315       DO  m = 1, surf_lsm_h%ns
2316          i   = surf_lsm_h%i(m)           
2317          j   = surf_lsm_h%j(m)
2318
2319          IF ( surf_lsm_h%veg_type_2d(m) == 14  .OR.                           &
2320               surf_lsm_h%veg_type_2d(m) == 15 )  THEN
2321             surf_lsm_h%water_surface(m) = .TRUE.
2322             t_soil_h%var_2d(:,m) = t_surface_h%var_1d(m)
2323          ELSEIF ( surf_lsm_h%veg_type_2d(m) == 20 )  THEN
2324             surf_lsm_h%pave_surface(m) = .TRUE.
2325             m_soil_h%var_2d(:,m)            = 0.0_wp
2326          ENDIF
2327
2328       ENDDO
2329
2330!
2331!--    Calculate new roughness lengths (for water surfaces only, i.e. only
2332!-     horizontal surfaces)
2333       CALL calc_z0_water_surface
2334
2335       t_soil_h_p    = t_soil_h
2336       m_soil_h_p    = m_soil_h
2337       m_liq_eb_h_p  = m_liq_eb_h
2338       t_surface_h_p = t_surface_h
2339
2340       t_soil_v_p    = t_soil_v
2341       m_soil_v_p    = m_soil_v
2342       m_liq_eb_v_p  = m_liq_eb_v
2343       t_surface_v_p = t_surface_v
2344
2345
2346
2347!--    Store initial profiles of t_soil and m_soil (assuming they are
2348!--    horizontally homogeneous on this PE)
2349       hom(nzb_soil:nzt_soil,1,90,:)  = SPREAD( t_soil_h%var_2d(nzb_soil:nzt_soil,1),  &
2350                                                2, statistic_regions+1 )
2351       hom(nzb_soil:nzt_soil,1,92,:)  = SPREAD( m_soil_h%var_2d(nzb_soil:nzt_soil,1),  & 
2352                                                2, statistic_regions+1 )
2353
2354    END SUBROUTINE lsm_init
2355
2356
2357!------------------------------------------------------------------------------!
2358! Description:
2359! ------------
2360!> Allocate land surface model arrays and define pointers
2361!------------------------------------------------------------------------------!
2362    SUBROUTINE lsm_init_arrays
2363   
2364
2365       IMPLICIT NONE
2366
2367       INTEGER(iwp) ::  l !< index indicating facing of surface array
2368   
2369!
2370!--    Allocate global 1D arrays
2371       ALLOCATE ( ddz_soil(nzb_soil:nzt_soil+1) )
2372       ALLOCATE ( ddz_soil_stag(nzb_soil:nzt_soil) )
2373       ALLOCATE ( dz_soil(nzb_soil:nzt_soil+1) )
2374       ALLOCATE ( dz_soil_stag(nzb_soil:nzt_soil) )
2375       ALLOCATE ( root_extr(nzb_soil:nzt_soil) )
2376 
2377       root_extr = 0.0_wp 
2378       
2379!
2380!--    Allocate surface and soil temperature / humidity. Please note,
2381!--    these arrays are allocated according to surface-data structure,
2382!--    even if they do not belong to the data type due to the
2383!--    pointer arithmetric (TARGET attribute is not allowed in a data-type).
2384#if defined( __nopointer )
2385!
2386!--    Horizontal surfaces
2387       ALLOCATE ( m_liq_eb_h%var_1d(1:surf_lsm_h%ns)                     )
2388       ALLOCATE ( m_liq_eb_h_p%var_1d(1:surf_lsm_h%ns)                   )
2389       ALLOCATE ( t_surface_h%var_1d(1:surf_lsm_h%ns)                    )
2390       ALLOCATE ( t_surface_h_p%var_1d(1:surf_lsm_h%ns)                  )
2391       ALLOCATE ( m_soil_h%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)     )
2392       ALLOCATE ( m_soil_h_p%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)   )
2393       ALLOCATE ( t_soil_h%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns)   )
2394       ALLOCATE ( t_soil_h_p%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) )
2395!
2396!--    Vertical surfaces
2397       DO  l = 0, 3
2398          ALLOCATE ( m_liq_eb_v(l)%var_1d(1:surf_lsm_v(l)%ns)                     )
2399          ALLOCATE ( m_liq_eb_v(l)_p%var_1d(1:surf_lsm_v(l)%ns)                   )
2400          ALLOCATE ( t_surface_v(l)%var_1d(1:surf_lsm_v(l)%ns)                    )
2401          ALLOCATE ( t_surface_v(l)_p%var_1d(1:surf_lsm_v(l)%ns)                  )
2402          ALLOCATE ( m_soil_v(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)     )
2403          ALLOCATE ( m_soil_v(l)_p%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)   )
2404          ALLOCATE ( t_soil_v(l)%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns)   )
2405          ALLOCATE ( t_soil_v(l)_p%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns) )
2406       ENDDO
2407#else
2408!
2409!--    Horizontal surfaces
2410       ALLOCATE ( m_liq_eb_h_1%var_1d(1:surf_lsm_h%ns)                   )
2411       ALLOCATE ( m_liq_eb_h_2%var_1d(1:surf_lsm_h%ns)                   )
2412       ALLOCATE ( t_surface_h_1%var_1d(1:surf_lsm_h%ns)                  )
2413       ALLOCATE ( t_surface_h_2%var_1d(1:surf_lsm_h%ns)                  )
2414       ALLOCATE ( m_soil_h_1%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)   )
2415       ALLOCATE ( m_soil_h_2%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)   )
2416       ALLOCATE ( t_soil_h_1%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) )
2417       ALLOCATE ( t_soil_h_2%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) )
2418!
2419!--    Vertical surfaces
2420       DO  l = 0, 3
2421          ALLOCATE ( m_liq_eb_v_1(l)%var_1d(1:surf_lsm_v(l)%ns)                   )
2422          ALLOCATE ( m_liq_eb_v_2(l)%var_1d(1:surf_lsm_v(l)%ns)                   )
2423          ALLOCATE ( t_surface_v_1(l)%var_1d(1:surf_lsm_v(l)%ns)                  )
2424          ALLOCATE ( t_surface_v_2(l)%var_1d(1:surf_lsm_v(l)%ns)                  )
2425          ALLOCATE ( m_soil_v_1(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)   )
2426          ALLOCATE ( m_soil_v_2(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)   )
2427          ALLOCATE ( t_soil_v_1(l)%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns) )
2428          ALLOCATE ( t_soil_v_2(l)%var_2d(nzb_soil:nzt_soil+1,1:surf_lsm_v(l)%ns) )
2429       ENDDO
2430#endif
2431
2432!
2433!--    Allocate intermediate timestep arrays
2434!--    Horizontal surfaces
2435       ALLOCATE ( tm_liq_eb_h_m%var_1d(1:surf_lsm_h%ns)                  )
2436       ALLOCATE ( tt_surface_h_m%var_1d(1:surf_lsm_h%ns)                 )
2437       ALLOCATE ( tm_soil_h_m%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)  )
2438       ALLOCATE ( tt_soil_h_m%var_2d(nzb_soil:nzt_soil,1:surf_lsm_h%ns)  ) 
2439!
2440!--    Horizontal surfaces
2441       DO  l = 0, 3
2442          ALLOCATE ( tm_liq_eb_v_m(l)%var_1d(1:surf_lsm_v(l)%ns)                  )
2443          ALLOCATE ( tt_surface_v_m(l)%var_1d(1:surf_lsm_v(l)%ns)                 )
2444          ALLOCATE ( tm_soil_v_m(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)  )
2445          ALLOCATE ( tt_soil_v_m(l)%var_2d(nzb_soil:nzt_soil,1:surf_lsm_v(l)%ns)  )
2446       ENDDO 
2447!
2448!--    Allocate skin-surface temperature
2449       ALLOCATE ( surf_lsm_h%pt_surface(1:surf_lsm_h%ns) )
2450       DO  l = 0, 3
2451          ALLOCATE ( surf_lsm_v(l)%pt_surface(1:surf_lsm_v(l)%ns) )
2452       ENDDO 
2453
2454!
2455!--    Allocate 2D vegetation model arrays
2456!--    Horizontal surfaces
2457       ALLOCATE ( surf_lsm_h%alpha_vg(1:surf_lsm_h%ns)         )
2458       ALLOCATE ( surf_lsm_h%building_surface(1:surf_lsm_h%ns) )
2459       ALLOCATE ( surf_lsm_h%c_liq(1:surf_lsm_h%ns)            )
2460       ALLOCATE ( surf_lsm_h%c_veg(1:surf_lsm_h%ns)            )
2461       ALLOCATE ( surf_lsm_h%f_sw_in(1:surf_lsm_h%ns)          )
2462       ALLOCATE ( surf_lsm_h%ghf_eb(1:surf_lsm_h%ns)           )
2463       ALLOCATE ( surf_lsm_h%gamma_w_sat(1:surf_lsm_h%ns)      )
2464       ALLOCATE ( surf_lsm_h%g_d(1:surf_lsm_h%ns)              )
2465       ALLOCATE ( surf_lsm_h%lai(1:surf_lsm_h%ns)              )
2466       ALLOCATE ( surf_lsm_h%l_vg(1:surf_lsm_h%ns)             )
2467       ALLOCATE ( surf_lsm_h%lambda_surface_u(1:surf_lsm_h%ns) )
2468       ALLOCATE ( surf_lsm_h%lambda_surface_s(1:surf_lsm_h%ns) )
2469       ALLOCATE ( surf_lsm_h%m_fc(1:surf_lsm_h%ns)             )
2470       ALLOCATE ( surf_lsm_h%m_res(1:surf_lsm_h%ns)            )
2471       ALLOCATE ( surf_lsm_h%m_sat(1:surf_lsm_h%ns)            )
2472       ALLOCATE ( surf_lsm_h%m_wilt(1:surf_lsm_h%ns)           )
2473       ALLOCATE ( surf_lsm_h%n_vg(1:surf_lsm_h%ns)             )
2474       ALLOCATE ( surf_lsm_h%pave_surface(1:surf_lsm_h%ns)     )
2475       ALLOCATE ( surf_lsm_h%qsws_eb(1:surf_lsm_h%ns)          )
2476       ALLOCATE ( surf_lsm_h%qsws_soil_eb(1:surf_lsm_h%ns)     )
2477       ALLOCATE ( surf_lsm_h%qsws_liq_eb(1:surf_lsm_h%ns)      )
2478       ALLOCATE ( surf_lsm_h%qsws_veg_eb(1:surf_lsm_h%ns)      )
2479       ALLOCATE ( surf_lsm_h%rad_net_l(1:surf_lsm_h%ns)        )
2480       ALLOCATE ( surf_lsm_h%r_a(1:surf_lsm_h%ns)              )
2481       ALLOCATE ( surf_lsm_h%r_canopy(1:surf_lsm_h%ns)         )
2482       ALLOCATE ( surf_lsm_h%r_soil(1:surf_lsm_h%ns)           )
2483       ALLOCATE ( surf_lsm_h%r_soil_min(1:surf_lsm_h%ns)       )
2484       ALLOCATE ( surf_lsm_h%r_s(1:surf_lsm_h%ns)              )
2485       ALLOCATE ( surf_lsm_h%r_canopy_min(1:surf_lsm_h%ns)     )
2486       ALLOCATE ( surf_lsm_h%shf_eb(1:surf_lsm_h%ns)           )
2487       ALLOCATE ( surf_lsm_h%soil_type_2d(1:surf_lsm_h%ns)     )
2488       ALLOCATE ( surf_lsm_h%veg_type_2d(1:surf_lsm_h%ns)      )
2489       ALLOCATE ( surf_lsm_h%water_surface(1:surf_lsm_h%ns)    )
2490
2491       surf_lsm_h%water_surface = .FALSE.
2492       surf_lsm_h%pave_surface  = .FALSE.
2493!
2494!--    Vertical surfaces
2495       DO  l = 0, 3
2496          ALLOCATE ( surf_lsm_v(l)%alpha_vg(1:surf_lsm_v(l)%ns)         )
2497          ALLOCATE ( surf_lsm_v(l)%building_surface(1:surf_lsm_v(l)%ns) )
2498          ALLOCATE ( surf_lsm_v(l)%c_liq(1:surf_lsm_v(l)%ns)            )
2499          ALLOCATE ( surf_lsm_v(l)%c_veg(1:surf_lsm_v(l)%ns)            )
2500          ALLOCATE ( surf_lsm_v(l)%f_sw_in(1:surf_lsm_v(l)%ns)          )
2501          ALLOCATE ( surf_lsm_v(l)%ghf_eb(1:surf_lsm_v(l)%ns)           )
2502          ALLOCATE ( surf_lsm_v(l)%gamma_w_sat(1:surf_lsm_v(l)%ns)      )
2503          ALLOCATE ( surf_lsm_v(l)%g_d(1:surf_lsm_v(l)%ns)              )
2504          ALLOCATE ( surf_lsm_v(l)%lai(1:surf_lsm_v(l)%ns)              )
2505          ALLOCATE ( surf_lsm_v(l)%l_vg(1:surf_lsm_v(l)%ns)             )
2506          ALLOCATE ( surf_lsm_v(l)%lambda_surface_u(1:surf_lsm_v(l)%ns) )
2507          ALLOCATE ( surf_lsm_v(l)%lambda_surface_s(1:surf_lsm_v(l)%ns) )
2508          ALLOCATE ( surf_lsm_v(l)%m_fc(1:surf_lsm_v(l)%ns)             )
2509          ALLOCATE ( surf_lsm_v(l)%m_res(1:surf_lsm_v(l)%ns)            )
2510          ALLOCATE ( surf_lsm_v(l)%m_sat(1:surf_lsm_v(l)%ns)            )
2511          ALLOCATE ( surf_lsm_v(l)%m_wilt(1:surf_lsm_v(l)%ns)           )
2512          ALLOCATE ( surf_lsm_v(l)%n_vg(1:surf_lsm_v(l)%ns)             )
2513          ALLOCATE ( surf_lsm_v(l)%pave_surface(1:surf_lsm_v(l)%ns)     )
2514          ALLOCATE ( surf_lsm_v(l)%qsws_eb(1:surf_lsm_v(l)%ns)          )
2515          ALLOCATE ( surf_lsm_v(l)%qsws_soil_eb(1:surf_lsm_v(l)%ns)     )
2516          ALLOCATE ( surf_lsm_v(l)%qsws_liq_eb(1:surf_lsm_v(l)%ns)      )
2517          ALLOCATE ( surf_lsm_v(l)%qsws_veg_eb(1:surf_lsm_v(l)%ns)      )
2518          ALLOCATE ( surf_lsm_v(l)%rad_net_l(1:surf_lsm_v(l)%ns)        )
2519          ALLOCATE ( surf_lsm_v(l)%r_a(1:surf_lsm_v(l)%ns)              )
2520          ALLOCATE ( surf_lsm_v(l)%r_canopy(1:surf_lsm_v(l)%ns)         )
2521          ALLOCATE ( surf_lsm_v(l)%r_soil(1:surf_lsm_v(l)%ns)           )
2522          ALLOCATE ( surf_lsm_v(l)%r_soil_min(1:surf_lsm_v(l)%ns)       )
2523          ALLOCATE ( surf_lsm_v(l)%r_s(1:surf_lsm_v(l)%ns)              )
2524          ALLOCATE ( surf_lsm_v(l)%r_canopy_min(1:surf_lsm_v(l)%ns)     )
2525          ALLOCATE ( surf_lsm_v(l)%shf_eb(1:surf_lsm_v(l)%ns)           )
2526          ALLOCATE ( surf_lsm_v(l)%soil_type_2d(1:surf_lsm_v(l)%ns)     )
2527          ALLOCATE ( surf_lsm_v(l)%veg_type_2d(1:surf_lsm_v(l)%ns)      )
2528          ALLOCATE ( surf_lsm_v(l)%water_surface(1:surf_lsm_v(l)%ns)    )
2529
2530          surf_lsm_v(l)%water_surface = .FALSE.
2531          surf_lsm_v(l)%pave_surface  = .FALSE.
2532       ENDDO
2533   
2534#if ! defined( __nopointer )
2535!
2536!--    Initial assignment of the pointers
2537!--    Horizontal surfaces
2538       t_soil_h    => t_soil_h_1;    t_soil_h_p    => t_soil_h_2
2539       t_surface_h => t_surface_h_1; t_surface_h_p => t_surface_h_2
2540       m_soil_h    => m_soil_h_1;    m_soil_h_p    => m_soil_h_2
2541       m_liq_eb_h  => m_liq_eb_h_1;  m_liq_eb_h_p  => m_liq_eb_h_2
2542!
2543!--    Vertical surfaces
2544       t_soil_v    => t_soil_v_1;    t_soil_v_p    => t_soil_v_2
2545       t_surface_v => t_surface_v_1; t_surface_v_p => t_surface_v_2
2546       m_soil_v    => m_soil_v_1;    m_soil_v_p    => m_soil_v_2
2547       m_liq_eb_v  => m_liq_eb_v_1;  m_liq_eb_v_p  => m_liq_eb_v_2
2548#endif
2549
2550
2551    END SUBROUTINE lsm_init_arrays
2552
2553
2554!------------------------------------------------------------------------------!
2555! Description:
2556! ------------
2557!> Parin for &lsmpar for land surface model
2558!------------------------------------------------------------------------------!
2559    SUBROUTINE lsm_parin
2560
2561
2562       IMPLICIT NONE
2563
2564       CHARACTER (LEN=80) ::  line  !< dummy string that contains the current line of the parameter file
2565       
2566       NAMELIST /lsm_par/         alpha_vangenuchten, c_surface,               &
2567                                  canopy_resistance_coefficient,               &
2568                                  conserve_water_content,                      &
2569                                  f_shortwave_incoming, field_capacity,        & 
2570                                  aero_resist_kray, hydraulic_conductivity,    &
2571                                  lambda_surface_stable,                       &
2572                                  lambda_surface_unstable, leaf_area_index,    &
2573                                  l_vangenuchten, min_canopy_resistance,       &
2574                                  min_soil_resistance, n_vangenuchten,         &
2575                                  pave_depth, pave_heat_capacity,              &
2576                                  pave_heat_conductivity,                      &
2577                                  residual_moisture, root_fraction,            &
2578                                  saturation_moisture, skip_time_do_lsm,       &
2579                                  soil_moisture, soil_temperature, soil_type,  &
2580                                  vegetation_coverage, veg_type, wilting_point,& 
2581                                  zs, z0_eb, z0h_eb, z0q_eb
2582       
2583       line = ' '
2584       
2585!
2586!--    Try to find land surface model package
2587       REWIND ( 11 )
2588       line = ' '
2589       DO   WHILE ( INDEX( line, '&lsm_par' ) == 0 )
2590          READ ( 11, '(A)', END=10 )  line
2591       ENDDO
2592       BACKSPACE ( 11 )
2593
2594!
2595!--    Read user-defined namelist
2596       READ ( 11, lsm_par )
2597
2598!
2599!--    Set flag that indicates that the land surface model is switched on
2600       land_surface = .TRUE.
2601
2602 10    CONTINUE
2603       
2604
2605    END SUBROUTINE lsm_parin
2606
2607
2608!------------------------------------------------------------------------------!
2609! Description:
2610! ------------
2611!> Soil model as part of the land surface model. The model predicts soil
2612!> temperature and water content.
2613!------------------------------------------------------------------------------!
2614    SUBROUTINE lsm_soil_model( horizontal, l )
2615
2616
2617       IMPLICIT NONE
2618
2619       INTEGER(iwp) ::  k       !< running index
2620       INTEGER(iwp) ::  l       !< surface-data type index indication facing
2621       INTEGER(iwp) ::  m       !< running index
2622
2623       LOGICAL      ::  horizontal !< flag indication horizontal wall, required to set pointer accordingly
2624
2625       REAL(wp)     ::  h_vg !< Van Genuchten coef. h
2626
2627       REAL(wp), DIMENSION(nzb_soil:nzt_soil) :: gamma_temp,  & !< temp. gamma
2628                                                 lambda_temp, & !< temp. lambda
2629                                                 tend           !< tendency
2630
2631       TYPE(surf_type_lsm), POINTER ::  surf_m_soil
2632       TYPE(surf_type_lsm), POINTER ::  surf_m_soil_p
2633       TYPE(surf_type_lsm), POINTER ::  surf_t_soil
2634       TYPE(surf_type_lsm), POINTER ::  surf_t_soil_p
2635       TYPE(surf_type_lsm), POINTER ::  surf_tm_soil_m
2636       TYPE(surf_type_lsm), POINTER ::  surf_tt_soil_m
2637
2638       TYPE(surf_type), POINTER  ::  surf  !< surface-date type variable
2639
2640       IF ( horizontal )  THEN
2641          surf           => surf_lsm_h
2642
2643          surf_m_soil    => m_soil_h
2644          surf_m_soil_p  => m_soil_h_p
2645          surf_t_soil    => t_soil_h
2646          surf_t_soil_p  => t_soil_h_p
2647          surf_tm_soil_m => tm_soil_h_m
2648          surf_tt_soil_m => tt_soil_h_m
2649       ELSE
2650          surf           => surf_lsm_v(l)
2651
2652          surf_m_soil    => m_soil_v(l)
2653          surf_m_soil_p  => m_soil_v_p(l)
2654          surf_t_soil    => t_soil_v(l)
2655          surf_t_soil_p  => t_soil_v_p(l)
2656          surf_tm_soil_m => tm_soil_v_m(l)
2657          surf_tt_soil_m => tt_soil_v_m(l)
2658       ENDIF
2659
2660       DO  m = 1, surf%ns
2661
2662          IF ( surf%pave_surface(m) )  THEN
2663             surf%rho_c_total(nzb_soil,m) = pave_heat_capacity
2664             lambda_temp(nzb_soil)          = pave_heat_conductivity
2665          ENDIF
2666
2667          IF (  .NOT.  surf%water_surface(m) )  THEN
2668             DO  k = nzb_soil, nzt_soil
2669
2670                IF ( surf%pave_surface(m)  .AND.  zs(k) <= pave_depth )  THEN
2671                   
2672                   surf%rho_c_total(k,m) = pave_heat_capacity
2673                   lambda_temp(k)        = pave_heat_conductivity   
2674
2675                ELSE           
2676!
2677!--                Calculate volumetric heat capacity of the soil, taking
2678!--                into account water content
2679                   surf%rho_c_total(k,m) = (rho_c_soil *                 &
2680                                               ( 1.0_wp - surf%m_sat(m) )&
2681                                               + rho_c_water * surf_m_soil%var_2d(k,m) )
2682
2683!
2684!--                Calculate soil heat conductivity at the center of the soil
2685!--                layers
2686                   lambda_h_sat = lambda_h_sm**(1.0_wp - surf%m_sat(m)) *&
2687                                  lambda_h_water ** surf_m_soil%var_2d(k,m)
2688
2689                   ke = 1.0_wp + LOG10( MAX( 0.1_wp, surf_m_soil%var_2d(k,m) /             &
2690                                                     surf%m_sat(m) ) )
2691
2692                   lambda_temp(k) = ke * (lambda_h_sat - lambda_h_dry) +       &
2693                                    lambda_h_dry
2694                ENDIF
2695             ENDDO
2696
2697!
2698!--          Calculate soil heat conductivity (lambda_h) at the _stag level
2699!--          using linear interpolation. For pavement surface, the
2700!--          true pavement depth is considered
2701             DO  k = nzb_soil, nzt_soil-1
2702                IF ( surf%pave_surface(m)  .AND.  zs(k)   < pave_depth   &
2703                                                 .AND.  zs(k+1) > pave_depth )  THEN
2704                   surf%lambda_h(k,m) = ( pave_depth - zs(k) ) / dz_soil(k+1)&
2705                                     * lambda_temp(k)                          &
2706                                     + ( 1.0_wp - ( pave_depth - zs(k) )       &
2707                                     / dz_soil(k+1) ) * lambda_temp(k+1)
2708                ELSE
2709                   surf%lambda_h(k,m) = ( lambda_temp(k+1) + lambda_temp(k) )&
2710                                     * 0.5_wp
2711                ENDIF
2712             ENDDO
2713             surf%lambda_h(nzt_soil,m) = lambda_temp(nzt_soil)
2714
2715!
2716!--          Prognostic equation for soil temperature t_soil
2717             tend(:) = 0.0_wp
2718
2719             tend(nzb_soil) = ( 1.0_wp / surf%rho_c_total(nzb_soil,m) ) *&
2720                    ( surf%lambda_h(nzb_soil,m) * ( surf_t_soil%var_2d(nzb_soil+1,m) &
2721                      - surf_t_soil%var_2d(nzb_soil,m) ) * ddz_soil(nzb_soil+1)            &
2722                      + surf%ghf_eb(m) ) * ddz_soil_stag(nzb_soil)
2723
2724             DO  k = nzb_soil+1, nzt_soil
2725                tend(k) = ( 1.0_wp / surf%rho_c_total(k,m) )             &
2726                          * (   surf%lambda_h(k,m)                       &
2727                              * ( surf_t_soil%var_2d(k+1,m) - surf_t_soil%var_2d(k,m) )                &
2728                              * ddz_soil(k+1)                                  &
2729                              - surf%lambda_h(k-1,m)                     &
2730                              * ( surf_t_soil%var_2d(k,m) - surf_t_soil%var_2d(k-1,m) )                &
2731                              * ddz_soil(k)                                    &
2732                            ) * ddz_soil_stag(k)
2733
2734             ENDDO
2735
2736             surf_t_soil_p%var_2d(nzb_soil:nzt_soil,m) = surf_t_soil%var_2d(nzb_soil:nzt_soil,m)       &
2737                                               + dt_3d * ( tsc(2)              &
2738                                               * tend(nzb_soil:nzt_soil)       & 
2739                                               + tsc(3)                        &
2740                                               * surf_tt_soil_m%var_2d(nzb_soil:nzt_soil,m) )
2741
2742!
2743!--          Calculate t_soil tendencies for the next Runge-Kutta step
2744             IF ( timestep_scheme(1:5) == 'runge' )  THEN
2745                IF ( intermediate_timestep_count == 1 )  THEN
2746                   DO  k = nzb_soil, nzt_soil
2747                      surf_tt_soil_m%var_2d(k,m) = tend(k)
2748                   ENDDO
2749                ELSEIF ( intermediate_timestep_count <                         &
2750                         intermediate_timestep_count_max )  THEN
2751                   DO  k = nzb_soil, nzt_soil
2752                      surf_tt_soil_m%var_2d(k,m) = -9.5625_wp * tend(k) + 5.3125_wp        &
2753                                         * surf_tt_soil_m%var_2d(k,m)
2754                   ENDDO
2755                ENDIF
2756             ENDIF
2757
2758
2759             DO  k = nzb_soil, nzt_soil
2760
2761!
2762!--             Calculate soil diffusivity at the center of the soil layers
2763                lambda_temp(k) = (- b_ch * surf%gamma_w_sat(m) * psi_sat     &
2764                                  / surf%m_sat(m) ) * ( MAX( surf_m_soil%var_2d(k,m),    &
2765                                  surf%m_wilt(m) ) / surf%m_sat(m) )**(&
2766                                                            b_ch + 2.0_wp )
2767
2768!
2769!--             Parametrization of Van Genuchten
2770                IF ( soil_type /= 7 )  THEN
2771!
2772!--                Calculate the hydraulic conductivity after Van Genuchten
2773!--                (1980)
2774                   h_vg = ( ( ( surf%m_res(m) - surf%m_sat(m) ) /  &
2775                              ( surf%m_res(m) -                          &
2776                                MAX( surf_m_soil%var_2d(k,m), surf%m_wilt(m) )       &
2777                              )                                                &
2778                            )**(                                               &
2779                          surf%n_vg(m) / ( surf%n_vg(m) - 1.0_wp ) &
2780                               ) - 1.0_wp                                      &
2781                          )**( 1.0_wp / surf%n_vg(m) ) / surf%alpha_vg(m)
2782
2783                   gamma_temp(k) = surf%gamma_w_sat(m) * ( ( ( 1.0_wp +  &
2784                          ( surf%alpha_vg(m) * h_vg )**surf%n_vg(m)&
2785                                                               )**(            &
2786                              1.0_wp - 1.0_wp / surf%n_vg(m)) - (        &
2787                          surf%alpha_vg(m) * h_vg )**( surf%n_vg(m)&
2788                              - 1.0_wp) )**2 )                                 &
2789                              / ( ( 1.0_wp + ( surf%alpha_vg(m) * h_vg   &
2790                              )**surf%n_vg(m) )**( ( 1.0_wp  - 1.0_wp    &
2791                              / surf%n_vg(m) ) *                         &
2792                              ( surf%l_vg(m) + 2.0_wp) ) )
2793!
2794!--             Parametrization of Clapp & Hornberger
2795                ELSE
2796                   gamma_temp(k) = surf%gamma_w_sat(m) * ( surf_m_soil%var_2d(k,m)   &
2797                                   / surf%m_sat(m) )**(2.0_wp * b_ch + 3.0_wp)
2798                ENDIF
2799
2800             ENDDO
2801
2802!
2803!--          Prognostic equation for soil moisture content. Only performed,
2804!--          when humidity is enabled in the atmosphere and the surface type
2805!--          is not pavement (implies dry soil below).
2806             IF ( humidity  .AND.  .NOT.  surf%pave_surface(m) )  THEN
2807!
2808!--             Calculate soil diffusivity (lambda_w) at the _stag level
2809!--             using linear interpolation. To do: replace this with
2810!--             ECMWF-IFS Eq. 8.81
2811                DO  k = nzb_soil, nzt_soil-1
2812                   
2813                   surf%lambda_w(k,m) = ( lambda_temp(k+1) +             &
2814                                                lambda_temp(k) ) * 0.5_wp
2815                   surf%gamma_w(k,m)  = ( gamma_temp(k+1)  +             &
2816                                                gamma_temp(k) )  * 0.5_wp
2817
2818                ENDDO
2819
2820!
2821!
2822!--             In case of a closed bottom (= water content is conserved),
2823!--             set hydraulic conductivity to zero to that no water will be
2824!--             lost in the bottom layer.
2825                IF ( conserve_water_content )  THEN
2826                   surf%gamma_w(nzt_soil,m) = 0.0_wp
2827                ELSE
2828                   surf%gamma_w(nzt_soil,m) = gamma_temp(nzt_soil)
2829                ENDIF     
2830
2831!--             The root extraction (= root_extr * qsws_veg_eb / (rho_l     
2832!--             * l_v)) ensures the mass conservation for water. The         
2833!--             transpiration of plants equals the cumulative withdrawals by
2834!--             the roots in the soil. The scheme takes into account the
2835!--             availability of water in the soil layers as well as the root
2836!--             fraction in the respective layer. Layer with moisture below
2837!--             wilting point will not contribute, which reflects the
2838!--             preference of plants to take water from moister layers.
2839!
2840!--             Calculate the root extraction (ECMWF 7.69, the sum of
2841!--             root_extr = 1). The energy balance solver guarantees a
2842!--             positive transpiration, so that there is no need for an
2843!--             additional check.
2844                m_total = 0.0_wp
2845                DO  k = nzb_soil, nzt_soil
2846                    IF ( surf_m_soil%var_2d(k,m) > surf%m_wilt(m) )  THEN
2847                       m_total = m_total + surf%root_fr(k,m) * surf_m_soil%var_2d(k,m)
2848                    ENDIF
2849                ENDDO 
2850                 IF ( m_total > 0.0_wp )  THEN
2851                   DO  k = nzb_soil, nzt_soil
2852                      IF ( surf_m_soil%var_2d(k,m) > surf%m_wilt(m) )  THEN
2853                         root_extr(k) = surf%root_fr(k,m) * surf_m_soil%var_2d(k,m)  &
2854                                                            / m_total
2855                      ELSE
2856                         root_extr(k) = 0.0_wp
2857                      ENDIF
2858                   ENDDO
2859                ENDIF
2860!
2861!--             Prognostic equation for soil water content m_soil_h.
2862                tend(:) = 0.0_wp
2863
2864                tend(nzb_soil) = ( surf%lambda_w(nzb_soil,m) *   (       &
2865                         surf_m_soil%var_2d(nzb_soil+1,m) - surf_m_soil%var_2d(nzb_soil,m) )           &
2866                         * ddz_soil(nzb_soil+1) - surf%gamma_w(nzb_soil,m) - &
2867                                                     (                         &
2868                            root_extr(nzb_soil) * surf%qsws_veg_eb(m)    &
2869                            + surf%qsws_soil_eb(m) ) * drho_l_lv )       &
2870                            * ddz_soil_stag(nzb_soil)
2871
2872                DO  k = nzb_soil+1, nzt_soil-1
2873                   tend(k) = ( surf%lambda_w(k,m) * ( surf_m_soil%var_2d(k+1,m)      &
2874                             - surf_m_soil%var_2d(k,m) ) * ddz_soil(k+1)                   &
2875                             - surf%gamma_w(k,m)                         &
2876                             - surf%lambda_w(k-1,m) * ( surf_m_soil%var_2d(k,m) -    &
2877                             surf_m_soil%var_2d(k-1,m)) * ddz_soil(k)                      &
2878                             + surf%gamma_w(k-1,m) - (root_extr(k)       &
2879                             * surf%qsws_veg_eb(m) * drho_l_lv)          &
2880                             ) * ddz_soil_stag(k)
2881                ENDDO
2882                tend(nzt_soil) = ( - surf%gamma_w(nzt_soil,m)            &
2883                                     - surf%lambda_w(nzt_soil-1,m)       &
2884                                     * ( surf_m_soil%var_2d(nzt_soil,m)                    &
2885                                     - surf_m_soil%var_2d(nzt_soil-1,m))                   &
2886                                     * ddz_soil(nzt_soil)                      &
2887                                     + surf%gamma_w(nzt_soil-1,m) - (    &
2888                                       root_extr(nzt_soil)                     &
2889                                     * surf%qsws_veg_eb(m) * drho_l_lv ) &
2890                                  ) * ddz_soil_stag(nzt_soil)             
2891
2892                surf_m_soil_p%var_2d(nzb_soil:nzt_soil,m) = surf_m_soil%var_2d(nzb_soil:nzt_soil,m)    &
2893                                                + dt_3d * ( tsc(2) * tend(:)   &
2894                                                + tsc(3) * surf_tm_soil_m%var_2d(:,m) )   
2895   
2896!
2897!--             Account for dry soils (find a better solution here!)
2898                DO  k = nzb_soil, nzt_soil
2899                   IF ( surf_m_soil_p%var_2d(k,m) < 0.0_wp )  surf_m_soil_p%var_2d(k,m) = 0.0_wp
2900                ENDDO
2901
2902!
2903!--             Calculate m_soil tendencies for the next Runge-Kutta step
2904                IF ( timestep_scheme(1:5) == 'runge' )  THEN
2905                   IF ( intermediate_timestep_count == 1 )  THEN
2906                      DO  k = nzb_soil, nzt_soil
2907                         surf_tm_soil_m%var_2d(k,m) = tend(k)
2908                      ENDDO
2909                   ELSEIF ( intermediate_timestep_count <                      &
2910                            intermediate_timestep_count_max )  THEN
2911                      DO  k = nzb_soil, nzt_soil
2912                         surf_tm_soil_m%var_2d(k,m) = -9.5625_wp * tend(k) + 5.3125_wp     &
2913                                  * surf_tm_soil_m%var_2d(k,m)
2914                      ENDDO
2915                   ENDIF
2916                ENDIF
2917             ENDIF
2918
2919          ENDIF
2920
2921       ENDDO
2922
2923    END SUBROUTINE lsm_soil_model
2924
2925 
2926!------------------------------------------------------------------------------!
2927! Description:
2928! ------------
2929!> Swapping of timelevels
2930!------------------------------------------------------------------------------!
2931    SUBROUTINE lsm_swap_timelevel ( mod_count )
2932
2933       IMPLICIT NONE
2934
2935       INTEGER, INTENT(IN) :: mod_count
2936
2937#if defined( __nopointer )
2938!
2939!--    Horizontal surfaces
2940       t_surface_h  = t_surface_h_p
2941       t_soil_h     = t_soil_h_p
2942       IF ( humidity )  THEN
2943          m_soil_h    = m_soil_h_p
2944          m_liq_eb_h  = m_liq_eb_h_p
2945       ENDIF
2946!
2947!--    Vertical surfaces
2948       t_surface_v  = t_surface_v_p
2949       t_soil_v     = t_soil_v_p
2950       IF ( humidity )  THEN
2951          m_soil_v    = m_soil_v_p
2952          m_liq_eb_v  = m_liq_eb_v_p
2953       ENDIF
2954
2955#else
2956   
2957       SELECT CASE ( mod_count )
2958
2959          CASE ( 0 )
2960!
2961!--          Horizontal surfaces
2962             t_surface_h  => t_surface_h_1; t_surface_h_p  => t_surface_h_2
2963             t_soil_h     => t_soil_h_1;    t_soil_h_p     => t_soil_h_2
2964             IF ( humidity )  THEN
2965                m_soil_h    => m_soil_h_1;   m_soil_h_p    => m_soil_h_2
2966                m_liq_eb_h  => m_liq_eb_h_1; m_liq_eb_h_p  => m_liq_eb_h_2
2967             ENDIF
2968!
2969!--          Vertical surfaces
2970             t_surface_v  => t_surface_v_1; t_surface_v_p  => t_surface_v_2
2971             t_soil_v     => t_soil_v_1;    t_soil_v_p     => t_soil_v_2
2972             IF ( humidity )  THEN
2973                m_soil_v    => m_soil_v_1;   m_soil_v_p    => m_soil_v_2
2974                m_liq_eb_v  => m_liq_eb_v_1; m_liq_eb_v_p  => m_liq_eb_v_2
2975             ENDIF
2976
2977
2978
2979          CASE ( 1 )
2980!
2981!--          Horizontal surfaces
2982             t_surface_h  => t_surface_h_2; t_surface_h_p  => t_surface_h_1
2983             t_soil_h     => t_soil_h_2;    t_soil_h_p     => t_soil_h_1
2984             IF ( humidity )  THEN
2985                m_soil_h    => m_soil_h_2;   m_soil_h_p    => m_soil_h_1
2986                m_liq_eb_h  => m_liq_eb_h_2; m_liq_eb_h_p  => m_liq_eb_h_1
2987             ENDIF
2988!
2989!--          Vertical surfaces
2990             t_surface_v  => t_surface_v_2; t_surface_v_p  => t_surface_v_1
2991             t_soil_v     => t_soil_v_2;    t_soil_v_p     => t_soil_v_1
2992             IF ( humidity )  THEN
2993                m_soil_v    => m_soil_v_2;   m_soil_v_p    => m_soil_v_1
2994                m_liq_eb_v  => m_liq_eb_v_2; m_liq_eb_v_p  => m_liq_eb_v_1
2995             ENDIF
2996
2997       END SELECT
2998#endif
2999
3000    END SUBROUTINE lsm_swap_timelevel
3001
3002
3003
3004
3005!------------------------------------------------------------------------------!
3006!
3007! Description:
3008! ------------
3009!> Subroutine for averaging 3D data
3010!------------------------------------------------------------------------------!
3011SUBROUTINE lsm_3d_data_averaging( mode, variable )
3012 
3013
3014    USE control_parameters
3015
3016    USE indices
3017
3018    USE kinds
3019
3020    IMPLICIT NONE
3021
3022    CHARACTER (LEN=*) ::  mode    !<
3023    CHARACTER (LEN=*) :: variable !<
3024
3025    INTEGER(iwp) ::  i       !<
3026    INTEGER(iwp) ::  j       !<
3027    INTEGER(iwp) ::  k       !<
3028    INTEGER(iwp) ::  m       !< running index
3029
3030    IF ( mode == 'allocate' )  THEN
3031
3032       SELECT CASE ( TRIM( variable ) )
3033
3034             CASE ( 'c_liq*' )
3035                IF ( .NOT. ALLOCATED( c_liq_av ) )  THEN
3036                   ALLOCATE( c_liq_av(nysg:nyng,nxlg:nxrg) )
3037                ENDIF
3038                c_liq_av = 0.0_wp
3039
3040             CASE ( 'c_soil*' )
3041                IF ( .NOT. ALLOCATED( c_soil_av ) )  THEN
3042                   ALLOCATE( c_soil_av(nysg:nyng,nxlg:nxrg) )
3043                ENDIF
3044                c_soil_av = 0.0_wp
3045
3046             CASE ( 'c_veg*' )
3047                IF ( .NOT. ALLOCATED( c_veg_av ) )  THEN
3048                   ALLOCATE( c_veg_av(nysg:nyng,nxlg:nxrg) )
3049                ENDIF
3050                c_veg_av = 0.0_wp
3051
3052             CASE ( 'ghf_eb*' )
3053                IF ( .NOT. ALLOCATED( ghf_eb_av ) )  THEN
3054                   ALLOCATE( ghf_eb_av(nysg:nyng,nxlg:nxrg) )
3055                ENDIF
3056                ghf_eb_av = 0.0_wp
3057
3058             CASE ( 'lai*' )
3059                IF ( .NOT. ALLOCATED( lai_av ) )  THEN
3060                   ALLOCATE( lai_av(nysg:nyng,nxlg:nxrg) )
3061                ENDIF
3062                lai_av = 0.0_wp
3063
3064             CASE ( 'm_liq_eb*' )
3065                IF ( .NOT. ALLOCATED( m_liq_eb_av ) )  THEN
3066                   ALLOCATE( m_liq_eb_av(nysg:nyng,nxlg:nxrg) )
3067                ENDIF
3068                m_liq_eb_av = 0.0_wp
3069
3070             CASE ( 'm_soil' )
3071                IF ( .NOT. ALLOCATED( m_soil_av ) )  THEN
3072                   ALLOCATE( m_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
3073                ENDIF
3074                m_soil_av = 0.0_wp
3075
3076             CASE ( 'qsws_eb*' )
3077                IF ( .NOT. ALLOCATED( qsws_eb_av ) )  THEN
3078                   ALLOCATE( qsws_eb_av(nysg:nyng,nxlg:nxrg) )
3079                ENDIF
3080                qsws_eb_av = 0.0_wp
3081
3082             CASE ( 'qsws_liq_eb*' )
3083                IF ( .NOT. ALLOCATED( qsws_liq_eb_av ) )  THEN
3084                   ALLOCATE( qsws_liq_eb_av(nysg:nyng,nxlg:nxrg) )
3085                ENDIF
3086                qsws_liq_eb_av = 0.0_wp
3087
3088             CASE ( 'qsws_soil_eb*' )
3089                IF ( .NOT. ALLOCATED( qsws_soil_eb_av ) )  THEN
3090                   ALLOCATE( qsws_soil_eb_av(nysg:nyng,nxlg:nxrg) )
3091                ENDIF
3092                qsws_soil_eb_av = 0.0_wp
3093
3094             CASE ( 'qsws_veg_eb*' )
3095                IF ( .NOT. ALLOCATED( qsws_veg_eb_av ) )  THEN
3096                   ALLOCATE( qsws_veg_eb_av(nysg:nyng,nxlg:nxrg) )
3097                ENDIF
3098                qsws_veg_eb_av = 0.0_wp
3099
3100             CASE ( 'r_a*' )
3101                IF ( .NOT. ALLOCATED( r_a_av ) )  THEN
3102                   ALLOCATE( r_a_av(nysg:nyng,nxlg:nxrg) )
3103                ENDIF
3104                r_a_av = 0.0_wp
3105
3106             CASE ( 'r_s*' )
3107                IF ( .NOT. ALLOCATED( r_s_av ) )  THEN
3108                   ALLOCATE( r_s_av(nysg:nyng,nxlg:nxrg) )
3109                ENDIF
3110                r_s_av = 0.0_wp
3111
3112             CASE ( 'shf_eb*' )
3113                IF ( .NOT. ALLOCATED( shf_eb_av ) )  THEN
3114                   ALLOCATE( shf_eb_av(nysg:nyng,nxlg:nxrg) )
3115                ENDIF
3116                shf_eb_av = 0.0_wp
3117
3118             CASE ( 't_soil' )
3119                IF ( .NOT. ALLOCATED( t_soil_av ) )  THEN
3120                   ALLOCATE( t_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
3121                ENDIF
3122                t_soil_av = 0.0_wp
3123
3124          CASE DEFAULT
3125             CONTINUE
3126
3127       END SELECT
3128
3129    ELSEIF ( mode == 'sum' )  THEN
3130
3131       SELECT CASE ( TRIM( variable ) )
3132
3133          CASE ( 'c_liq*' )
3134             DO  m = 1, surf_lsm_h%ns
3135                i   = surf_lsm_h%i(m)           
3136                j   = surf_lsm_h%j(m)
3137                c_liq_av(j,i) = c_liq_av(j,i) + surf_lsm_h%c_liq(m)
3138             ENDDO
3139
3140          CASE ( 'c_soil*' )
3141             DO  m = 1, surf_lsm_h%ns
3142                i   = surf_lsm_h%i(m)           
3143                j   = surf_lsm_h%j(m)
3144                c_soil_av(j,i) = c_soil_av(j,i) + (1.0 - surf_lsm_h%c_veg(m))
3145             ENDDO
3146
3147          CASE ( 'c_veg*' )
3148             DO  m = 1, surf_lsm_h%ns
3149                i   = surf_lsm_h%i(m)           
3150                j   = surf_lsm_h%j(m)
3151                c_veg_av(j,i) = c_veg_av(j,i) + surf_lsm_h%c_veg(m)
3152             ENDDO
3153
3154          CASE ( 'ghf_eb*' )
3155             DO  m = 1, surf_lsm_h%ns
3156                i   = surf_lsm_h%i(m)           
3157                j   = surf_lsm_h%j(m)
3158                ghf_eb_av(j,i) = ghf_eb_av(j,i) + surf_lsm_h%ghf_eb(m)
3159             ENDDO
3160
3161          CASE ( 'lai*' )
3162             DO  m = 1, surf_lsm_h%ns
3163                i   = surf_lsm_h%i(m)           
3164                j   = surf_lsm_h%j(m)
3165                lai_av(j,i) = lai_av(j,i) + surf_lsm_h%lai(m)
3166             ENDDO
3167
3168          CASE ( 'm_liq_eb*' )
3169             DO  m = 1, surf_lsm_h%ns
3170                i   = surf_lsm_h%i(m)           
3171                j   = surf_lsm_h%j(m)
3172                m_liq_eb_av(j,i) = m_liq_eb_av(j,i) + m_liq_eb_h%var_1d(m)
3173             ENDDO
3174
3175          CASE ( 'm_soil' )
3176             DO  m = 1, surf_lsm_h%ns
3177                i   = surf_lsm_h%i(m)           
3178                j   = surf_lsm_h%j(m)
3179                DO  k = nzb_soil, nzt_soil
3180                   m_soil_av(k,j,i) = m_soil_av(k,j,i) + m_soil_h%var_2d(k,m)
3181                ENDDO
3182             ENDDO
3183
3184          CASE ( 'qsws_eb*' )
3185             DO  m = 1, surf_lsm_h%ns
3186                i   = surf_lsm_h%i(m)           
3187                j   = surf_lsm_h%j(m)
3188                qsws_eb_av(j,i) = qsws_eb_av(j,i) + surf_lsm_h%qsws_eb(m)
3189             ENDDO
3190
3191          CASE ( 'qsws_liq_eb*' )
3192             DO  m = 1, surf_lsm_h%ns
3193                i   = surf_lsm_h%i(m)           
3194                j   = surf_lsm_h%j(m)
3195                qsws_liq_eb_av(j,i) = qsws_liq_eb_av(j,i) +                    &
3196                                      surf_lsm_h%qsws_liq_eb(m)
3197             ENDDO
3198
3199          CASE ( 'qsws_soil_eb*' )
3200             DO  m = 1, surf_lsm_h%ns
3201                i   = surf_lsm_h%i(m)           
3202                j   = surf_lsm_h%j(m)
3203                qsws_soil_eb_av(j,i) = qsws_soil_eb_av(j,i) +                  &
3204                                       surf_lsm_h%qsws_soil_eb(m)
3205             ENDDO
3206
3207          CASE ( 'qsws_veg_eb*' )
3208             DO  m = 1, surf_lsm_h%ns
3209                i   = surf_lsm_h%i(m)           
3210                j   = surf_lsm_h%j(m)
3211                qsws_veg_eb_av(j,i) = qsws_veg_eb_av(j,i) +                    &
3212                                      surf_lsm_h%qsws_veg_eb(m)
3213             ENDDO
3214
3215          CASE ( 'r_a*' )
3216             DO  m = 1, surf_lsm_h%ns
3217                i   = surf_lsm_h%i(m)           
3218                j   = surf_lsm_h%j(m)
3219                r_a_av(j,i) = r_a_av(j,i) + surf_lsm_h%r_a(m)
3220             ENDDO
3221
3222          CASE ( 'r_s*' )
3223             DO  m = 1, surf_lsm_h%ns
3224                i   = surf_lsm_h%i(m)           
3225                j   = surf_lsm_h%j(m)
3226                r_s_av(j,i) = r_s_av(j,i) + surf_lsm_h%r_s(m)
3227             ENDDO
3228
3229          CASE ( 'shf_eb*' )
3230             DO  m = 1, surf_lsm_h%ns
3231                i   = surf_lsm_h%i(m)           
3232                j   = surf_lsm_h%j(m)
3233                shf_eb_av(j,i) = shf_eb_av(j,i) + surf_lsm_h%shf_eb(m)
3234             ENDDO
3235
3236          CASE ( 't_soil' )
3237             DO  m = 1, surf_lsm_h%ns
3238                i   = surf_lsm_h%i(m)           
3239                j   = surf_lsm_h%j(m)
3240                DO  k = nzb_soil, nzt_soil
3241                   t_soil_av(k,j,i) = t_soil_av(k,j,i) + t_soil_h%var_2d(k,m)
3242                ENDDO
3243             ENDDO
3244
3245          CASE DEFAULT
3246             CONTINUE
3247
3248       END SELECT
3249
3250    ELSEIF ( mode == 'average' )  THEN
3251
3252       SELECT CASE ( TRIM( variable ) )
3253
3254          CASE ( 'c_liq*' )
3255             DO  i = nxl, nxr
3256                DO  j = nys, nyn
3257                   c_liq_av(j,i) = c_liq_av(j,i) / REAL( average_count_3d, KIND=wp )
3258                ENDDO
3259             ENDDO
3260
3261          CASE ( 'c_soil*' )
3262             DO  i = nxl, nxr
3263                DO  j = nys, nyn
3264                   c_soil_av(j,i) = c_soil_av(j,i) / REAL( average_count_3d, KIND=wp )
3265                ENDDO
3266             ENDDO
3267
3268          CASE ( 'c_veg*' )
3269             DO  i = nxl, nxr
3270                DO  j = nys, nyn
3271                   c_veg_av(j,i) = c_veg_av(j,i) / REAL( average_count_3d, KIND=wp )
3272                ENDDO
3273             ENDDO
3274
3275          CASE ( 'ghf_eb*' )
3276             DO  i = nxl, nxr
3277                DO  j = nys, nyn
3278                   ghf_eb_av(j,i) = ghf_eb_av(j,i) / REAL( average_count_3d, KIND=wp )
3279                ENDDO
3280             ENDDO
3281
3282         CASE ( 'lai*' )
3283             DO  i = nxl, nxr
3284                DO  j = nys, nyn
3285                   lai_av(j,i) = lai_av(j,i) / REAL( average_count_3d, KIND=wp )
3286                ENDDO
3287             ENDDO
3288
3289          CASE ( 'm_liq_eb*' )
3290             DO  i = nxl, nxr
3291                DO  j = nys, nyn
3292                   m_liq_eb_av(j,i) = m_liq_eb_av(j,i) / REAL( average_count_3d, KIND=wp )
3293                ENDDO
3294             ENDDO
3295
3296          CASE ( 'm_soil' )
3297             DO  i = nxl, nxr
3298                DO  j = nys, nyn
3299                   DO  k = nzb_soil, nzt_soil
3300                      m_soil_av(k,j,i) = m_soil_av(k,j,i) / REAL( average_count_3d, KIND=wp )
3301                   ENDDO
3302                ENDDO
3303             ENDDO
3304
3305          CASE ( 'qsws_eb*' )
3306             DO  i = nxl, nxr
3307                DO  j = nys, nyn
3308                   qsws_eb_av(j,i) = qsws_eb_av(j,i) / REAL( average_count_3d, KIND=wp )
3309                ENDDO
3310             ENDDO
3311
3312          CASE ( 'qsws_liq_eb*' )
3313             DO  i = nxl, nxr
3314                DO  j = nys, nyn
3315                   qsws_liq_eb_av(j,i) = qsws_liq_eb_av(j,i) / REAL( average_count_3d, KIND=wp )
3316                ENDDO
3317             ENDDO
3318
3319          CASE ( 'qsws_soil_eb*' )
3320             DO  i = nxl, nxr
3321                DO  j = nys, nyn
3322                   qsws_soil_eb_av(j,i) = qsws_soil_eb_av(j,i) / REAL( average_count_3d, KIND=wp )
3323                ENDDO
3324             ENDDO
3325
3326          CASE ( 'qsws_veg_eb*' )
3327             DO  i = nxl, nxr
3328                DO  j = nys, nyn
3329                   qsws_veg_eb_av(j,i) = qsws_veg_eb_av(j,i) / REAL( average_count_3d, KIND=wp )
3330                ENDDO
3331             ENDDO
3332
3333          CASE ( 'r_a*' )
3334             DO  i = nxl, nxr
3335                DO  j = nys, nyn
3336                   r_a_av(j,i) = r_a_av(j,i) / REAL( average_count_3d, KIND=wp )
3337                ENDDO
3338             ENDDO
3339
3340          CASE ( 'r_s*' )
3341             DO  i = nxl, nxr
3342                DO  j = nys, nyn
3343                   r_s_av(j,i) = r_s_av(j,i) / REAL( average_count_3d, KIND=wp )
3344                ENDDO
3345             ENDDO
3346
3347          CASE ( 't_soil' )
3348             DO  i = nxl, nxr
3349                DO  j = nys, nyn
3350                   DO  k = nzb_soil, nzt_soil
3351                      t_soil_av(k,j,i) = t_soil_av(k,j,i) / REAL( average_count_3d, KIND=wp )
3352                   ENDDO
3353                ENDDO
3354             ENDDO
3355!
3356!--
3357
3358       END SELECT
3359
3360    ENDIF
3361
3362END SUBROUTINE lsm_3d_data_averaging
3363
3364
3365!------------------------------------------------------------------------------!
3366!
3367! Description:
3368! ------------
3369!> Subroutine defining appropriate grid for netcdf variables.
3370!> It is called out from subroutine netcdf.
3371!------------------------------------------------------------------------------!
3372 SUBROUTINE lsm_define_netcdf_grid( var, found, grid_x, grid_y, grid_z )
3373   
3374     IMPLICIT NONE
3375
3376     CHARACTER (LEN=*), INTENT(IN)  ::  var         !<
3377     LOGICAL, INTENT(OUT)           ::  found       !<
3378     CHARACTER (LEN=*), INTENT(OUT) ::  grid_x      !<
3379     CHARACTER (LEN=*), INTENT(OUT) ::  grid_y      !<
3380     CHARACTER (LEN=*), INTENT(OUT) ::  grid_z      !<
3381
3382     found  = .TRUE.
3383
3384!
3385!--  Check for the grid
3386     SELECT CASE ( TRIM( var ) )
3387
3388        CASE ( 'm_soil', 't_soil', 'm_soil_xy', 't_soil_xy', 'm_soil_xz',      &
3389               't_soil_xz', 'm_soil_yz', 't_soil_yz' )
3390           grid_x = 'x'
3391           grid_y = 'y'
3392           grid_z = 'zs'
3393
3394        CASE DEFAULT
3395           found  = .FALSE.
3396           grid_x = 'none'
3397           grid_y = 'none'
3398           grid_z = 'none'
3399     END SELECT
3400
3401 END SUBROUTINE lsm_define_netcdf_grid
3402
3403!------------------------------------------------------------------------------!
3404!
3405! Description:
3406! ------------
3407!> Subroutine defining 3D output variables
3408!------------------------------------------------------------------------------!
3409 SUBROUTINE lsm_data_output_2d( av, variable, found, grid, mode, local_pf,     &
3410                                two_d, nzb_do, nzt_do )
3411 
3412    USE indices
3413
3414    USE kinds
3415
3416
3417    IMPLICIT NONE
3418
3419    CHARACTER (LEN=*) ::  grid     !<
3420    CHARACTER (LEN=*) ::  mode     !<
3421    CHARACTER (LEN=*) ::  variable !<
3422
3423    INTEGER(iwp) ::  av      !<
3424    INTEGER(iwp) ::  i       !< running index
3425    INTEGER(iwp) ::  j       !< running index
3426    INTEGER(iwp) ::  k       !< running index
3427    INTEGER(iwp) ::  m       !< running index
3428    INTEGER(iwp) ::  nzb_do  !<
3429    INTEGER(iwp) ::  nzt_do  !<
3430
3431    LOGICAL      ::  found !<
3432    LOGICAL      ::  two_d !< flag parameter that indicates 2D variables (horizontal cross sections)
3433
3434    REAL(wp), DIMENSION(nxlg:nxrg,nysg:nyng,nzb:nzt+1) ::  local_pf !<
3435
3436
3437    found = .TRUE.
3438
3439    SELECT CASE ( TRIM( variable ) )
3440!
3441!--    Before data is transfered to local_pf, transfer is it 2D dummy variable and exchange ghost points therein.
3442!--    However, at this point this is only required for instantaneous arrays, time-averaged quantities are already exchanged.
3443       CASE ( 'c_liq*_xy' )        ! 2d-array
3444          IF ( av == 0 )  THEN
3445             DO  m = 1, surf_lsm_h%ns
3446                i                   = surf_lsm_h%i(m)           
3447                j                   = surf_lsm_h%j(m)
3448                local_pf(i,j,nzb+1) = surf_lsm_h%c_liq(m) * surf_lsm_h%c_veg(m)
3449             ENDDO
3450          ELSE
3451             DO  i = nxlg, nxrg
3452                DO  j = nysg, nyng
3453                   local_pf(i,j,nzb+1) = c_liq_av(j,i)
3454                ENDDO
3455             ENDDO
3456          ENDIF
3457
3458          two_d = .TRUE.
3459          grid = 'zu1'
3460
3461       CASE ( 'c_soil*_xy' )        ! 2d-array
3462          IF ( av == 0 )  THEN
3463             DO  m = 1, surf_lsm_h%ns
3464                i                   = surf_lsm_h%i(m)           
3465                j                   = surf_lsm_h%j(m)
3466                local_pf(i,j,nzb+1) = 1.0_wp - surf_lsm_h%c_veg(m)
3467             ENDDO
3468          ELSE
3469             DO  i = nxlg, nxrg
3470                DO  j = nysg, nyng
3471                   local_pf(i,j,nzb+1) = c_soil_av(j,i)
3472                ENDDO
3473             ENDDO
3474          ENDIF
3475
3476          two_d = .TRUE.
3477          grid = 'zu1'
3478
3479       CASE ( 'c_veg*_xy' )        ! 2d-array
3480          IF ( av == 0 )  THEN
3481             DO  m = 1, surf_lsm_h%ns
3482                i                   = surf_lsm_h%i(m)           
3483                j                   = surf_lsm_h%j(m)
3484                local_pf(i,j,nzb+1) = surf_lsm_h%c_veg(m)
3485             ENDDO
3486          ELSE
3487             DO  i = nxlg, nxrg
3488                DO  j = nysg, nyng
3489                   local_pf(i,j,nzb+1) = c_veg_av(j,i)
3490                ENDDO
3491             ENDDO
3492          ENDIF
3493
3494          two_d = .TRUE.
3495          grid = 'zu1'
3496
3497       CASE ( 'ghf_eb*_xy' )        ! 2d-array
3498          IF ( av == 0 )  THEN
3499             DO  m = 1, surf_lsm_h%ns
3500                i                   = surf_lsm_h%i(m)           
3501                j                   = surf_lsm_h%j(m)
3502                local_pf(i,j,nzb+1) = surf_lsm_h%ghf_eb(m)
3503             ENDDO
3504          ELSE
3505             DO  i = nxlg, nxrg
3506                DO  j = nysg, nyng
3507                   local_pf(i,j,nzb+1) = ghf_eb_av(j,i)
3508                ENDDO
3509             ENDDO
3510          ENDIF
3511
3512          two_d = .TRUE.
3513          grid = 'zu1'
3514
3515       CASE ( 'lai*_xy' )        ! 2d-array
3516          IF ( av == 0 )  THEN
3517             DO  m = 1, surf_lsm_h%ns
3518                i                   = surf_lsm_h%i(m)           
3519                j                   = surf_lsm_h%j(m)
3520                local_pf(i,j,nzb+1) = surf_lsm_h%lai(m)
3521             ENDDO
3522          ELSE
3523             DO  i = nxlg, nxrg
3524                DO  j = nysg, nyng
3525                   local_pf(i,j,nzb+1) = lai_av(j,i)
3526                ENDDO
3527             ENDDO
3528          ENDIF
3529
3530          two_d = .TRUE.
3531          grid = 'zu1'
3532
3533       CASE ( 'm_liq_eb*_xy' )        ! 2d-array
3534          IF ( av == 0 )  THEN
3535             DO  m = 1, surf_lsm_h%ns
3536                i                   = surf_lsm_h%i(m)           
3537                j                   = surf_lsm_h%j(m)
3538                local_pf(i,j,nzb+1) = m_liq_eb_h%var_1d(m)
3539             ENDDO
3540          ELSE
3541             DO  i = nxlg, nxrg
3542                DO  j = nysg, nyng
3543                   local_pf(i,j,nzb+1) = m_liq_eb_av(j,i)
3544                ENDDO
3545             ENDDO
3546          ENDIF
3547
3548          two_d = .TRUE.
3549          grid = 'zu1'
3550
3551       CASE ( 'm_soil_xy', 'm_soil_xz', 'm_soil_yz' )
3552          IF ( av == 0 )  THEN
3553             DO  m = 1, surf_lsm_h%ns
3554                i   = surf_lsm_h%i(m)           
3555                j   = surf_lsm_h%j(m)
3556                DO k = nzb_soil, nzt_soil
3557                   local_pf(i,j,k) = m_soil_h%var_2d(k,m)
3558                ENDDO
3559             ENDDO
3560          ELSE
3561             DO  i = nxlg, nxrg
3562                DO  j = nysg, nyng
3563                   DO k = nzb_soil, nzt_soil
3564                      local_pf(i,j,k) = m_soil_av(k,j,i)
3565                   ENDDO
3566                ENDDO
3567             ENDDO
3568          ENDIF
3569
3570          nzb_do = nzb_soil
3571          nzt_do = nzt_soil
3572
3573          IF ( mode == 'xy' ) grid = 'zs'
3574
3575       CASE ( 'qsws_eb*_xy' )        ! 2d-array
3576          IF ( av == 0 ) THEN
3577             DO  m = 1, surf_lsm_h%ns
3578                i                   = surf_lsm_h%i(m)           
3579                j                   = surf_lsm_h%j(m)
3580                local_pf(i,j,nzb+1) =  surf_lsm_h%qsws_eb(m)
3581             ENDDO
3582          ELSE
3583             DO  i = nxlg, nxrg
3584                DO  j = nysg, nyng 
3585                   local_pf(i,j,nzb+1) =  qsws_eb_av(j,i)
3586                ENDDO
3587             ENDDO
3588          ENDIF
3589
3590          two_d = .TRUE.
3591          grid = 'zu1'
3592
3593       CASE ( 'qsws_liq_eb*_xy' )        ! 2d-array
3594          IF ( av == 0 ) THEN
3595             DO  m = 1, surf_lsm_h%ns
3596                i                   = surf_lsm_h%i(m)           
3597                j                   = surf_lsm_h%j(m)
3598                local_pf(i,j,nzb+1) = surf_lsm_h%qsws_liq_eb(m)
3599             ENDDO
3600          ELSE
3601             DO  i = nxlg, nxrg
3602                DO  j = nysg, nyng 
3603                   local_pf(i,j,nzb+1) =  qsws_liq_eb_av(j,i)
3604                ENDDO
3605             ENDDO
3606          ENDIF
3607
3608          two_d = .TRUE.
3609          grid = 'zu1'
3610
3611       CASE ( 'qsws_soil_eb*_xy' )        ! 2d-array
3612          IF ( av == 0 ) THEN
3613             DO  m = 1, surf_lsm_h%ns
3614                i                   = surf_lsm_h%i(m)           
3615                j                   = surf_lsm_h%j(m)
3616                local_pf(i,j,nzb+1) =  surf_lsm_h%qsws_soil_eb(m)
3617             ENDDO
3618          ELSE
3619             DO  i = nxlg, nxrg
3620                DO  j = nysg, nyng 
3621                   local_pf(i,j,nzb+1) =  qsws_soil_eb_av(j,i)
3622                ENDDO
3623             ENDDO
3624          ENDIF
3625
3626          two_d = .TRUE.
3627          grid = 'zu1'
3628
3629       CASE ( 'qsws_veg_eb*_xy' )        ! 2d-array
3630          IF ( av == 0 ) THEN
3631             DO  m = 1, surf_lsm_h%ns
3632                i                   = surf_lsm_h%i(m)           
3633                j                   = surf_lsm_h%j(m)
3634                local_pf(i,j,nzb+1) =  surf_lsm_h%qsws_veg_eb(m)
3635             ENDDO
3636          ELSE
3637             DO  i = nxlg, nxrg
3638                DO  j = nysg, nyng 
3639                   local_pf(i,j,nzb+1) =  qsws_veg_eb_av(j,i)
3640                ENDDO
3641             ENDDO
3642          ENDIF
3643
3644          two_d = .TRUE.
3645          grid = 'zu1'
3646
3647
3648       CASE ( 'r_a*_xy' )        ! 2d-array
3649          IF ( av == 0 )  THEN
3650             DO  m = 1, surf_lsm_h%ns
3651                i                   = surf_lsm_h%i(m)           
3652                j                   = surf_lsm_h%j(m)
3653                local_pf(i,j,nzb+1) = surf_lsm_h%r_a(m)
3654             ENDDO
3655          ELSE
3656             DO  i = nxlg, nxrg
3657                DO  j = nysg, nyng
3658                   local_pf(i,j,nzb+1) = r_a_av(j,i)
3659                ENDDO
3660             ENDDO
3661          ENDIF
3662
3663          two_d = .TRUE.
3664          grid = 'zu1'
3665
3666       CASE ( 'r_s*_xy' )        ! 2d-array
3667          IF ( av == 0 )  THEN
3668             DO  m = 1, surf_lsm_h%ns
3669                i                   = surf_lsm_h%i(m)           
3670                j                   = surf_lsm_h%j(m)
3671                local_pf(i,j,nzb+1) = surf_lsm_h%r_s(m)
3672             ENDDO
3673          ELSE
3674             DO  i = nxlg, nxrg
3675                DO  j = nysg, nyng
3676                   local_pf(i,j,nzb+1) = r_s_av(j,i)
3677                ENDDO
3678             ENDDO
3679          ENDIF
3680
3681          two_d = .TRUE.
3682          grid = 'zu1'
3683
3684       CASE ( 'shf_eb*_xy' )        ! 2d-array
3685          IF ( av == 0 ) THEN
3686             DO  m = 1, surf_lsm_h%ns
3687                i                   = surf_lsm_h%i(m)           
3688                j                   = surf_lsm_h%j(m)
3689                local_pf(i,j,nzb+1) =  surf_lsm_h%shf_eb(m)
3690             ENDDO
3691          ELSE
3692             DO  i = nxlg, nxrg
3693                DO  j = nysg, nyng
3694                   local_pf(i,j,nzb+1) =  shf_eb_av(j,i)
3695                ENDDO
3696             ENDDO
3697          ENDIF
3698
3699          two_d = .TRUE.
3700          grid = 'zu1'
3701
3702       CASE ( 't_soil_xy', 't_soil_xz', 't_soil_yz' )
3703          IF ( av == 0 )  THEN
3704             DO  m = 1, surf_lsm_h%ns
3705                i   = surf_lsm_h%i(m)           
3706                j   = surf_lsm_h%j(m)
3707                DO k = nzb_soil, nzt_soil
3708                   local_pf(i,j,k) = t_soil_h%var_2d(k,m)
3709                ENDDO
3710             ENDDO
3711          ELSE
3712             DO  i = nxlg, nxrg
3713                DO  j = nysg, nyng
3714                   DO k = nzb_soil, nzt_soil
3715                      local_pf(i,j,k) = t_soil_av(k,j,i)
3716                   ENDDO
3717                ENDDO
3718             ENDDO
3719          ENDIF
3720
3721          nzb_do = nzb_soil
3722          nzt_do = nzt_soil
3723
3724          IF ( mode == 'xy' )  grid = 'zs'
3725
3726       CASE DEFAULT
3727          found = .FALSE.
3728          grid  = 'none'
3729
3730    END SELECT
3731 
3732 END SUBROUTINE lsm_data_output_2d
3733
3734
3735!------------------------------------------------------------------------------!
3736!
3737! Description:
3738! ------------
3739!> Subroutine defining 3D output variables
3740!------------------------------------------------------------------------------!
3741 SUBROUTINE lsm_data_output_3d( av, variable, found, local_pf )
3742 
3743
3744    USE indices
3745
3746    USE kinds
3747
3748
3749    IMPLICIT NONE
3750
3751    CHARACTER (LEN=*) ::  variable !<
3752
3753    INTEGER(iwp) ::  av    !<
3754    INTEGER(iwp) ::  i     !<
3755    INTEGER(iwp) ::  j     !<
3756    INTEGER(iwp) ::  k     !<
3757    INTEGER(iwp) ::  m     !< running index
3758
3759    LOGICAL      ::  found !<
3760
3761    REAL(sp), DIMENSION(nxlg:nxrg,nysg:nyng,nzb_soil:nzt_soil) ::  local_pf !<
3762
3763
3764    found = .TRUE.
3765
3766
3767    SELECT CASE ( TRIM( variable ) )
3768!
3769!--   Requires 3D exchange
3770
3771      CASE ( 'm_soil' )
3772
3773         IF ( av == 0 )  THEN
3774            DO  m = 1, surf_lsm_h%ns
3775                i   = surf_lsm_h%i(m)           
3776                j   = surf_lsm_h%j(m)
3777                DO  k = nzb_soil, nzt_soil
3778                   local_pf(i,j,k) = m_soil_h%var_2d(k,m)
3779                ENDDO
3780            ENDDO
3781         ELSE
3782            DO  i = nxlg, nxrg
3783               DO  j = nysg, nyng
3784                  DO  k = nzb_soil, nzt_soil
3785                     local_pf(i,j,k) = m_soil_av(k,j,i)
3786                  ENDDO
3787               ENDDO
3788            ENDDO
3789         ENDIF
3790
3791      CASE ( 't_soil' )
3792
3793         IF ( av == 0 )  THEN
3794            DO  m = 1, surf_lsm_h%ns
3795               i   = surf_lsm_h%i(m)           
3796               j   = surf_lsm_h%j(m)
3797               DO  k = nzb_soil, nzt_soil
3798                  local_pf(i,j,k) = t_soil_h%var_2d(k,m)
3799               ENDDO
3800            ENDDO
3801         ELSE
3802            DO  i = nxlg, nxrg
3803               DO  j = nysg, nyng
3804                  DO  k = nzb_soil, nzt_soil
3805                     local_pf(i,j,k) = t_soil_av(k,j,i)
3806                  ENDDO
3807               ENDDO
3808            ENDDO
3809         ENDIF
3810
3811
3812       CASE DEFAULT
3813          found = .FALSE.
3814
3815    END SELECT
3816
3817
3818 END SUBROUTINE lsm_data_output_3d
3819
3820
3821!------------------------------------------------------------------------------!
3822!
3823! Description:
3824! ------------
3825!> Write restart data for land surface model
3826!------------------------------------------------------------------------------!
3827 SUBROUTINE lsm_last_actions
3828 
3829
3830    USE control_parameters
3831       
3832    USE kinds
3833
3834    IMPLICIT NONE
3835
3836    IF ( write_binary(1:4) == 'true' )  THEN
3837       IF ( ALLOCATED( c_liq_av ) )  THEN
3838          WRITE ( 14 )  'c_liq_av            ';  WRITE ( 14 ) c_liq_av
3839       ENDIF
3840       IF ( ALLOCATED( c_soil_av ) )  THEN
3841          WRITE ( 14 )  'c_soil_av           ';  WRITE ( 14 ) c_soil_av
3842       ENDIF
3843       IF ( ALLOCATED( c_veg_av ) )  THEN
3844          WRITE ( 14 )  'c_veg_av            ';  WRITE ( 14 ) c_veg_av
3845       ENDIF
3846       IF ( ALLOCATED( ghf_eb_av ) )  THEN
3847          WRITE ( 14 )  'ghf_eb_av           ';  WRITE ( 14 )  ghf_eb_av
3848       ENDIF
3849       IF ( ALLOCATED( lai_av ) )  THEN
3850          WRITE ( 14 )  'lai_av              ';  WRITE ( 14 )  lai_av
3851       ENDIF
3852       WRITE ( 14 )     'm_liq_eb            ';  WRITE ( 14 )  m_liq_eb_h%var_1d
3853       IF ( ALLOCATED( m_liq_eb_av ) )  THEN
3854          WRITE ( 14 )  'm_liq_eb_av         ';  WRITE ( 14 )  m_liq_eb_av
3855       ENDIF
3856       WRITE ( 14 )     'm_soil              ';  WRITE ( 14 )  m_soil_h%var_2d
3857       IF ( ALLOCATED( m_soil_av ) )  THEN
3858          WRITE ( 14 )  'm_soil_av           ';  WRITE ( 14 )  m_soil_av
3859       ENDIF
3860       IF ( ALLOCATED( qsws_eb_av ) )  THEN
3861          WRITE ( 14 )  'qsws_eb_av          ';  WRITE ( 14 )  qsws_eb_av
3862       ENDIF   
3863       IF ( ALLOCATED( qsws_liq_eb_av ) )  THEN
3864          WRITE ( 14 )  'qsws_liq_eb_av      ';  WRITE ( 14 )  qsws_liq_eb_av
3865       ENDIF 
3866       IF ( ALLOCATED( qsws_soil_eb_av ) )  THEN
3867          WRITE ( 14 )  'qsws_soil_eb_av     ';  WRITE ( 14 )  qsws_soil_eb_av
3868       ENDIF
3869       IF ( ALLOCATED( qsws_veg_eb_av ) )  THEN
3870          WRITE ( 14 )  'qsws_veg_eb_av      ';  WRITE ( 14 )  qsws_veg_eb_av
3871       ENDIF
3872       IF ( ALLOCATED( shf_eb_av ) )  THEN
3873          WRITE ( 14 )  'shf_eb_av           ';  WRITE ( 14 )  shf_eb_av
3874       ENDIF
3875       WRITE ( 14 )     't_soil              ';  WRITE ( 14 )  t_soil_h%var_2d
3876       IF ( ALLOCATED( t_soil_av ) )  THEN
3877          WRITE ( 14 )  't_soil_av           ';  WRITE ( 14 )  t_soil_av
3878       ENDIF
3879
3880       WRITE ( 14 )  '*** end lsm ***     '
3881
3882    ENDIF
3883
3884 END SUBROUTINE lsm_last_actions
3885
3886
3887SUBROUTINE lsm_read_restart_data( i, nxlfa, nxl_on_file, nxrfa, nxr_on_file,   &
3888                                     nynfa, nyn_on_file, nysfa, nys_on_file,   &
3889                                     offset_xa, offset_ya, overlap_count,      &
3890                                     tmp_2d )
3891 
3892
3893    USE control_parameters
3894       
3895    USE indices
3896   
3897    USE kinds
3898   
3899    USE pegrid
3900
3901    IMPLICIT NONE
3902
3903    CHARACTER (LEN=20) :: field_char   !<
3904
3905    INTEGER(iwp) ::  i               !<
3906    INTEGER(iwp) ::  k               !<
3907    INTEGER(iwp) ::  nxlc            !<
3908    INTEGER(iwp) ::  nxlf            !<
3909    INTEGER(iwp) ::  nxl_on_file     !<
3910    INTEGER(iwp) ::  nxrc            !<
3911    INTEGER(iwp) ::  nxrf            !<
3912    INTEGER(iwp) ::  nxr_on_file     !<
3913    INTEGER(iwp) ::  nync            !<
3914    INTEGER(iwp) ::  nynf            !<
3915    INTEGER(iwp) ::  nyn_on_file     !<
3916    INTEGER(iwp) ::  nysc            !<
3917    INTEGER(iwp) ::  nysf            !<
3918    INTEGER(iwp) ::  nys_on_file     !<
3919    INTEGER(iwp) ::  overlap_count   !<
3920
3921    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  nxlfa       !<
3922    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  nxrfa       !<
3923    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  nynfa       !<
3924    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  nysfa       !<
3925    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  offset_xa   !<
3926    INTEGER(iwp), DIMENSION(numprocs_previous_run,1000) ::  offset_ya   !<
3927
3928    REAL(wp),                                                                  &
3929       DIMENSION(nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) ::&
3930          tmp_2d   !<
3931
3932    REAL(wp),                                                                  &
3933       DIMENSION(nzb_soil:nzt_soil+1,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) ::&
3934          tmp_3d   !<
3935
3936    REAL(wp),                                                                  &
3937       DIMENSION(nzb_soil:nzt_soil,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) ::&
3938          tmp_3d2   !<
3939
3940    REAL(wp),                                                                  &
3941       DIMENSION(1:surf_lsm_h%ns) ::                                  &
3942          tmp_walltype_1d   !<
3943
3944    REAL(wp),                                                                  &
3945       DIMENSION(nzb_soil:nzt_soil+1,1:surf_lsm_h%ns) ::              &
3946          tmp_walltype_2d   !<
3947
3948    REAL(wp),                                                                  &
3949       DIMENSION(nzb_soil:nzt_soil,1:surf_lsm_h%ns) ::                &
3950          tmp_walltype_2d2  !<
3951
3952
3953   IF ( initializing_actions == 'read_restart_data' )  THEN
3954      READ ( 13 )  field_char
3955
3956      DO  WHILE ( TRIM( field_char ) /= '*** end lsm ***' )
3957
3958         DO  k = 1, overlap_count
3959
3960            nxlf = nxlfa(i,k)
3961            nxlc = nxlfa(i,k) + offset_xa(i,k)
3962            nxrf = nxrfa(i,k)
3963            nxrc = nxrfa(i,k) + offset_xa(i,k)
3964            nysf = nysfa(i,k)
3965            nysc = nysfa(i,k) + offset_ya(i,k)
3966            nynf = nynfa(i,k)
3967            nync = nynfa(i,k) + offset_ya(i,k)
3968
3969            SELECT CASE ( TRIM( field_char ) )
3970
3971
3972                CASE ( 'c_liq_av' )
3973                   IF ( .NOT. ALLOCATED( c_liq_av ) )  THEN
3974                      ALLOCATE( c_liq_av(nysg:nyng,nxlg:nxrg) )
3975                   ENDIF
3976                   IF ( k == 1 )  READ ( 13 )  tmp_2d
3977                   c_liq_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =         &
3978                                  tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3979
3980                CASE ( 'c_soil_av' )
3981                   IF ( .NOT. ALLOCATED( c_soil_av ) )  THEN
3982                      ALLOCATE( c_soil_av(nysg:nyng,nxlg:nxrg) )
3983                   ENDIF
3984                   IF ( k == 1 )  READ ( 13 )  tmp_2d
3985                   c_soil_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =        &
3986                                  tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3987
3988                CASE ( 'c_veg_av' )
3989                   IF ( .NOT. ALLOCATED( c_veg_av ) )  THEN
3990                      ALLOCATE( c_veg_av(nysg:nyng,nxlg:nxrg) )
3991                   ENDIF
3992                   IF ( k == 1 )  READ ( 13 )  tmp_2d
3993                   c_veg_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =         &
3994                                  tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
3995
3996                CASE ( 'ghf_eb_av' )
3997                   IF ( .NOT. ALLOCATED( ghf_eb_av ) )  THEN
3998                      ALLOCATE( ghf_eb_av(nysg:nyng,nxlg:nxrg) )
3999                   ENDIF
4000                   IF ( k == 1 )  READ ( 13 )  tmp_2d
4001                   ghf_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =        &
4002                                  tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
4003
4004                CASE ( 'm_liq_eb' )
4005                   IF ( k == 1 )  READ ( 13 )  tmp_walltype_1d !tmp_2d
4006                   m_liq_eb_h%var_1d(1:surf_lsm_h%ns)  =                       &
4007                                 tmp_walltype_1d(1:surf_lsm_h%ns)
4008
4009                CASE ( 'lai_av' )
4010                   IF ( .NOT. ALLOCATED( lai_av ) )  THEN
4011                      ALLOCATE( lai_av(nysg:nyng,nxlg:nxrg) )
4012                   ENDIF
4013                   IF ( k == 1 )  READ ( 13 )  tmp_2d
4014                   lai_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =           &
4015                                  tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
4016
4017                CASE ( 'm_liq_eb_av' )
4018                   IF ( .NOT. ALLOCATED( m_liq_eb_av ) )  THEN
4019                      ALLOCATE( m_liq_eb_av(nysg:nyng,nxlg:nxrg) )
4020                   ENDIF
4021                   IF ( k == 1 )  READ ( 13 )  tmp_2d
4022                   m_liq_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =      &
4023                                  tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
4024
4025                CASE ( 'm_soil' )
4026                   IF ( k == 1 )  READ ( 13 )  tmp_walltype_2d2(:,:)
4027                   m_soil_h%var_2d(:,1:surf_lsm_h%ns) =                        &
4028                          tmp_walltype_2d2(:,1:surf_lsm_h%ns)   
4029
4030                CASE ( 'm_soil_av' )
4031                   IF ( .NOT. ALLOCATED( m_soil_av ) )  THEN
4032                      ALLOCATE( m_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
4033                   ENDIF
4034                   IF ( k == 1 )  READ ( 13 )  tmp_3d2(:,:,:)
4035                   m_soil_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =      &
4036                                    tmp_3d2(nzb_soil:nzt_soil,nysf             &
4037                                    -nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
4038
4039                CASE ( 'qsws_eb_av' )
4040                   IF ( .NOT. ALLOCATED( qsws_eb_av ) )  THEN
4041                      ALLOCATE( qsws_eb_av(nysg:nyng,nxlg:nxrg) )
4042                   ENDIF 
4043                   IF ( k == 1 )  READ ( 13 )  tmp_2d
4044                   qsws_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  =      &
4045                                          tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
4046
4047                CASE ( 'qsws_liq_eb_av' )
4048                   IF ( .NOT. ALLOCATED( qsws_liq_eb_av ) )  THEN
4049                      ALLOCATE( qsws_liq_eb_av(nysg:nyng,nxlg:nxrg) )
4050                   ENDIF 
4051                   IF ( k == 1 )  READ ( 13 )  tmp_2d
4052                   qsws_liq_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  =  &
4053                                          tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
4054                CASE ( 'qsws_soil_eb_av' )
4055                   IF ( .NOT. ALLOCATED( qsws_soil_eb_av ) )  THEN
4056                      ALLOCATE( qsws_soil_eb_av(nysg:nyng,nxlg:nxrg) )
4057                   ENDIF 
4058                   IF ( k == 1 )  READ ( 13 )  tmp_2d
4059                   qsws_soil_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  = &
4060                                          tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
4061
4062                CASE ( 'qsws_veg_eb_av' )
4063                   IF ( .NOT. ALLOCATED( qsws_veg_eb_av ) )  THEN
4064                      ALLOCATE( qsws_veg_eb_av(nysg:nyng,nxlg:nxrg) )
4065                   ENDIF 
4066                   IF ( k == 1 )  READ ( 13 )  tmp_2d
4067                   qsws_veg_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  =  &
4068                                          tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
4069
4070                CASE ( 'shf_eb_av' )
4071                   IF ( .NOT. ALLOCATED( shf_eb_av ) )  THEN
4072                      ALLOCATE( shf_eb_av(nysg:nyng,nxlg:nxrg) )
4073                   ENDIF
4074                   IF ( k == 1 )  READ ( 13 )  tmp_2d
4075                   shf_eb_av(nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp)  =       &
4076                         tmp_2d(nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
4077
4078                CASE ( 't_soil' )
4079                   IF ( k == 1 )  READ ( 13 )  tmp_walltype_2d(:,:)
4080                   t_soil_h%var_2d(:,1:surf_lsm_h%ns) =                        &
4081                         tmp_walltype_2d(:,1:surf_lsm_h%ns)     
4082
4083                CASE ( 't_soil_av' )
4084                   IF ( .NOT. ALLOCATED( t_soil_av ) )  THEN
4085                      ALLOCATE( t_soil_av(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
4086                   ENDIF
4087                   IF ( k == 1 )  READ ( 13 )  tmp_3d2(:,:,:)
4088                   t_soil_av(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =      &
4089                                    tmp_3d2(:,nysf-nbgp:nynf+nbgp,             &
4090                                    nxlf-nbgp:nxrf+nbgp)
4091
4092
4093               CASE DEFAULT
4094                  WRITE( message_string, * ) 'unknown variable named "',       &
4095                                        TRIM( field_char ), '" found in',      &
4096                                        '&data from prior run on PE ', myid
4097                  CALL message( 'lsm_read_restart_data', 'PA0441', 1, 2, 0, 6, &
4098                                 0 )
4099
4100            END SELECT
4101
4102         ENDDO
4103
4104         READ ( 13 )  field_char
4105
4106      ENDDO
4107   ENDIF
4108
4109 END SUBROUTINE lsm_read_restart_data
4110
4111!------------------------------------------------------------------------------!
4112! Description:
4113! ------------
4114!> Calculation of roughness length for open water (lakes, ocean). The
4115!> parameterization follows Charnock (1955). Two different implementations
4116!> are available: as in ECMWF-IFS (Beljaars 1994) or as in FLake (Subin et al.
4117!> 2012)
4118!------------------------------------------------------------------------------!
4119    SUBROUTINE calc_z0_water_surface
4120
4121       USE control_parameters,                                                 &
4122           ONLY: g, kappa, molecular_viscosity
4123
4124       IMPLICIT NONE
4125
4126       INTEGER(iwp) ::  i       !< running index
4127       INTEGER(iwp) ::  j       !< running index
4128       INTEGER(iwp) ::  m       !< running index
4129
4130       REAL(wp), PARAMETER :: alpha_ch  = 0.018_wp !< Charnock constant (0.01-0.11). Use 0.01 for FLake and 0.018 for ECMWF
4131!       REAL(wp), PARAMETER :: pr_number = 0.71_wp !< molecular Prandtl number in the Charnock parameterization (differs from prandtl_number)
4132!       REAL(wp), PARAMETER :: sc_number = 0.66_wp !< molecular Schmidt number in the Charnock parameterization
4133!       REAL(wp) :: re_0 !< near-surface roughness Reynolds number
4134
4135       DO  m = 1, surf_lsm_h%ns
4136
4137          i   = surf_lsm_h%i(m)           
4138          j   = surf_lsm_h%j(m)
4139         
4140          IF ( surf_lsm_h%water_surface(m) )  THEN
4141
4142!
4143!--          Disabled: FLake parameterization. Ideally, the Charnock
4144!--          coefficient should depend on the water depth and the fetch
4145!--          length
4146!             re_0 = z0(j,i) * us(j,i) / molecular_viscosity
4147!       
4148!             z0(j,i) = MAX( 0.1_wp * molecular_viscosity / us(j,i),            &
4149!                           alpha_ch * us(j,i) / g )
4150!
4151!             z0h(j,i) = z0(j,i) * EXP( - kappa / pr_number * ( 4.0_wp * SQRT( re_0 ) - 3.2_wp ) )
4152!             z0q(j,i) = z0(j,i) * EXP( - kappa / pr_number * ( 4.0_wp * SQRT( re_0 ) - 4.2_wp ) )
4153
4154!
4155!--           Set minimum roughness length for u* > 0.2
4156!             IF ( us(j,i) > 0.2_wp )  THEN
4157!                z0h(j,i) = MAX( 1.0E-5_wp, z0h(j,i) )
4158!                z0q(j,i) = MAX( 1.0E-5_wp, z0q(j,i) )
4159!             ENDIF
4160
4161!
4162!--          ECMWF IFS model parameterization after Beljaars (1994). At low
4163!--          wind speed, the sea surface becomes aerodynamically smooth and
4164!--          the roughness scales with the viscosity. At high wind speed, the
4165!--          Charnock relation is used.
4166             surf_lsm_h%z0(m)  = ( 0.11_wp * molecular_viscosity /             &
4167                                 surf_lsm_h%us(m) )  &
4168                               + ( alpha_ch * surf_lsm_h%us(m)**2 / g )
4169
4170             surf_lsm_h%z0h(m) = 0.40_wp * molecular_viscosity /               &
4171                                 surf_lsm_h%us(m)
4172             surf_lsm_h%z0q(m) = 0.62_wp * molecular_viscosity /               &
4173                                 surf_lsm_h%us(m)
4174
4175          ENDIF
4176       ENDDO
4177
4178    END SUBROUTINE calc_z0_water_surface
4179
4180
4181
4182 END MODULE land_surface_model_mod
Note: See TracBrowser for help on using the repository browser.