source: palm/trunk/SOURCE/land_surface_model.f90 @ 1555

Last change on this file since 1555 was 1555, checked in by maronga, 9 years ago

LSM output of r_a and r_s added

  • Property svn:keywords set to Id
File size: 69.0 KB
Line 
1 MODULE land_surface_model_mod
2
3!--------------------------------------------------------------------------------!
4! This file is part of PALM.
5!
6! PALM is free software: you can redistribute it and/or modify it under the terms
7! of the GNU General Public License as published by the Free Software Foundation,
8! either version 3 of the License, or (at your option) any later 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-2014 Leibniz Universitaet Hannover
18!--------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22! Added output of r_a and r_s
23!
24! Former revisions:
25! -----------------
26! $Id: land_surface_model.f90 1555 2015-03-04 17:44:27Z maronga $
27! Bugfix: REAL constants provided with KIND-attribute in call of
28! 1553 2015-03-03 17:33:54Z maronga
29! Improved better treatment of roughness lengths. Added default soil temperature
30! profile
31!
32! 1551 2015-03-03 14:18:16Z maronga
33! Flux calculation is now done in prandtl_fluxes. Added support for data output.
34! Vertical indices have been replaced. Restart runs are now possible. Some
35! variables have beem renamed. Bugfix in the prognostic equation for the surface
36! temperature. Introduced z0_eb and z0h_eb, which overwrite the setting of
37! roughness_length and z0_factor. Added Clapp & Hornberger parametrization for
38! the hydraulic conductivity. Bugfix for root fraction and extraction
39! calculation
40!
41! intrinsic function MAX and MIN
42!
43! 1500 2014-12-03 17:42:41Z maronga
44! Corrected calculation of aerodynamic resistance (r_a).
45! Precipitation is now added to liquid water reservoir using LE_liq.
46! Added support for dry runs.
47!
48! 1496 2014-12-02 17:25:50Z maronga
49! Initial revision
50!
51!
52! Description:
53! ------------
54! Land surface model, consisting of a solver for the energy balance at the
55! surface and a four layer soil scheme. The scheme is similar to the TESSEL
56! scheme implemented in the ECMWF IFS model, with modifications according to
57! H-TESSEL. The implementation is based on the formulation implemented in the
58! DALES and UCLA-LES models.
59!
60! To do list:
61! -----------
62! - Check dewfall parametrization for fog simulations
63! - Consider partial absorption of the net shortwave radiation by the surface layer
64! - Allow for water surfaces, check performance for bare soils
65! - Invert indices (running from -3 to 0. Currently: nzb_soil=0, nzt_soil=3))
66! - Implement surface runoff model (required when performing long-term LES with
67!   considerable precipitation
68! Notes:
69! ------
70! - No time step criterion is required as long as the soil layers do not become
71!   too thin
72!------------------------------------------------------------------------------!
73     USE arrays_3d,                                                            &
74         ONLY:  pt, pt_p, q, q_p, qsws, rif, shf, ts, us, z0, z0h
75
76     USE cloud_parameters,                                                     &
77         ONLY:  cp, l_d_r, l_v, precipitation_rate, rho_l, r_d, r_v
78
79     USE control_parameters,                                                   &
80         ONLY:  cloud_physics, dt_3d, humidity, intermediate_timestep_count,   &
81                initializing_actions, intermediate_timestep_count_max,         &
82                max_masks, precipitation, pt_surface, rho_surface,             &
83                roughness_length, surface_pressure, timestep_scheme, tsc,      &
84                z0h_factor
85
86     USE indices,                                                              &
87         ONLY:  nxlg, nxrg, nyng, nysg, nzb_s_inner 
88
89     USE kinds
90
91    USE netcdf_control,                                                        &
92        ONLY:  dots_label, dots_num, dots_unit
93
94     USE radiation_model_mod,                                                  &
95         ONLY:  irad_scheme, rad_net, rad_sw_in, sigma_SB
96
97     USE statistics,                                                           &
98         ONLY:  hom, statistic_regions
99
100    IMPLICIT NONE
101
102!
103!-- LSM model constants
104    INTEGER(iwp), PARAMETER :: nzb_soil = 0, & !: bottom of the soil model (to be switched)
105                               nzt_soil = 3, & !: top of the soil model (to be switched)
106                               nzs = 4         !: number of soil layers (fixed for now)
107
108    INTEGER(iwp) :: dots_soil = 0  !: starting index for timeseries output
109
110    INTEGER(iwp), DIMENSION(0:1) :: id_dim_zs_xy, id_dim_zs_xz, id_dim_zs_yz,  &
111                                    id_dim_zs_3d, id_var_zs_xy,                & 
112                                    id_var_zs_xz, id_var_zs_yz, id_var_zs_3d
113                                   
114    INTEGER(iwp), DIMENSION(1:max_masks,0:1) :: id_dim_zs_mask, id_var_zs_mask
115
116    REAL(wp), PARAMETER ::                     &
117              b_ch               = 6.04_wp,    & ! Clapp & Hornberger exponent
118              lambda_h_dry       = 0.19_wp,    & ! heat conductivity for dry soil   
119              lambda_h_sm        = 3.44_wp,    & ! heat conductivity of the soil matrix
120              lambda_h_water     = 0.57_wp,    & ! heat conductivity of water
121              psi_sat            = -0.388_wp,  & ! soil matrix potential at saturation
122              rho_c_soil         = 2.19E6_wp,  & ! volumetric heat capacity of soil
123              rho_c_water        = 4.20E6_wp,  & ! volumetric heat capacity of water
124              m_max_depth        = 0.0002_wp     ! Maximum capacity of the water reservoir (m)
125
126
127!
128!-- LSM variables
129    INTEGER(iwp) :: veg_type  = 2, & !: vegetation type, 0: user-defined, 1-19: generic (see list)
130                    soil_type = 3    !: soil type, 0: user-defined, 1-6: generic (see list)
131
132    LOGICAL :: conserve_water_content = .TRUE., & !: open or closed bottom surface for the soil model
133               dewfall = .TRUE.,                & !: allow/inhibit dewfall
134               land_surface = .FALSE.             !: flag parameter indicating wheather the lsm is used
135
136!   value 9999999.9_wp -> generic available or user-defined value must be set
137!   otherwise -> no generic variable and user setting is optional
138    REAL(wp) :: alpha_vangenuchten = 9999999.9_wp,      & !: NAMELIST alpha_vg
139                canopy_resistance_coefficient = 9999999.9_wp, & !: NAMELIST g_d
140                c_surface   = 20000.0_wp,               & !: Surface (skin) heat capacity
141                drho_l_lv,                              & !: (rho_l * l_v)**-1
142                exn,                                    & !: value of the Exner function
143                e_s = 0.0_wp,                           & !: saturation water vapour pressure
144                field_capacity = 9999999.9_wp,          & !: NAMELIST m_fc
145                f_shortwave_incoming = 9999999.9_wp,    & !: NAMELIST f_sw_in
146                hydraulic_conductivity = 9999999.9_wp,  & !: NAMELIST gamma_w_sat
147                ke = 0.0_wp,                            & !: Kersten number
148                lambda_surface_stable = 9999999.9_wp,   & !: NAMELIST lambda_surface_s
149                lambda_surface_unstable = 9999999.9_wp, & !: NAMELIST lambda_surface_u
150                leaf_area_index = 9999999.9_wp,         & !: NAMELIST lai
151                l_vangenuchten = 9999999.9_wp,          & !: NAMELIST l_vg
152                min_canopy_resistance = 9999999.9_wp,   & !: NAMELIST r_canopy_min
153                min_soil_resistance = 50.0_wp,          & !: NAMELIST r_soil_min
154                m_total = 0.0_wp,                       & !: weighted total water content of the soil (m3/m3)
155                n_vangenuchten = 9999999.9_wp,          & !: NAMELIST n_vg
156                q_s = 0.0_wp,                           & !: saturation specific humidity
157                residual_moisture = 9999999.9_wp,       & !: NAMELIST m_res
158                rho_cp,                                 & !: rho_surface * cp
159                rho_lv,                                 & !: rho * l_v
160                rd_d_rv,                                & !: r_d / r_v
161                saturation_moisture = 9999999.9_wp,     & !: NAMELIST m_sat
162                vegetation_coverage = 9999999.9_wp,     & !: NAMELIST c_veg
163                wilting_point = 9999999.9_wp,           & !: NAMELIST m_wilt
164                z0_eb  = 9999999.9_wp,                  & !: NAMELIST z0 (lsm_par)
165                z0h_eb = 9999999.9_wp                    !: NAMELIST z0h (lsm_par)
166
167    REAL(wp), DIMENSION(nzb_soil:nzt_soil) :: &
168              ddz_soil,                     & !: 1/dz_soil
169              ddz_soil_stag,                & !: 1/dz_soil_stag
170              dz_soil,                      & !: soil grid spacing (center-center)
171              dz_soil_stag,                 & !: soil grid spacing (edge-edge)
172              root_extr = 0.0_wp,           & !: root extraction
173              root_fraction = (/9999999.9_wp, 9999999.9_wp,    &
174                                9999999.9_wp, 9999999.9_wp /), & !: distribution of root surface area to the individual soil layers
175              zs = (/0.07_wp, 0.28_wp, 1.00_wp,  2.89_wp/),    & !: soil layer depths (m)
176              soil_moisture = 0.0_wp          !: soil moisture content (m3/m3)
177
178    REAL(wp), DIMENSION(nzb_soil:nzt_soil+1) ::   &
179              soil_temperature = (/290.0_wp, 287.0_wp, 285.0_wp,  283.0_wp,    &
180                                   283.0_wp /) !: soil temperature (K)
181
182#if defined( __nopointer )
183    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_surface,   & !: surface temperature (K)
184                                                     t_surface_p, & !: progn. surface temperature (K)
185                                                     m_liq_eb,    & !: liquid water reservoir (m)
186                                                     m_liq_eb_av, & !: liquid water reservoir (m)
187                                                     m_liq_eb_p     !: progn. liquid water reservoir (m)
188#else
189    REAL(wp), DIMENSION(:,:), POINTER :: t_surface,      &
190                                         t_surface_p,    & 
191                                         m_liq_eb,       & 
192                                         m_liq_eb_p
193
194    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: t_surface_1, t_surface_2, &
195                                                     m_liq_eb_av,              &
196                                                     m_liq_eb_1, m_liq_eb_2
197#endif
198
199!
200!-- Temporal tendencies for time stepping           
201    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: tt_surface_m,  & !: surface temperature tendency (K)
202                                             tm_liq_eb_m      !: liquid water reservoir tendency (m)
203
204!
205!-- Energy balance variables               
206    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::                                   &
207              alpha_vg,         & !: coef. of Van Genuchten
208              c_liq,            & !: liquid water coverage (of vegetated area)
209              c_liq_av,         & !: average of c_liq
210              c_soil_av,        & !: average of c_soil
211              c_veg,            & !: vegetation coverage
212              c_veg_av,         & !: average of c_veg
213              f_sw_in,          & !: fraction of absorbed shortwave radiation by the surface layer (not implemented yet)
214              ghf_eb,           & !: ground heat flux
215              ghf_eb_av,        & !: average of ghf_eb
216              gamma_w_sat,      & !: hydraulic conductivity at saturation
217              g_d,              & !: coefficient for dependence of r_canopy on water vapour pressure deficit
218              lai,              & !: leaf area index
219              lai_av,           & !: average of lai
220              lambda_h_sat,     & !: heat conductivity for dry soil
221              lambda_surface_s,    & !: coupling between surface and soil (depends on vegetation type)
222              lambda_surface_u,    & !: coupling between surface and soil (depends on vegetation type)
223              l_vg,             & !: coef. of Van Genuchten
224              m_fc,             & !: soil moisture at field capacity (m3/m3)
225              m_res,            & !: residual soil moisture
226              m_sat,            & !: saturation soil moisture (m3/m3)
227              m_wilt,           & !: soil moisture at permanent wilting point (m3/m3)
228              n_vg,             & !: coef. Van Genuchten 
229              qsws_eb,          & !: surface flux of latent heat (total)
230              qsws_eb_av,       & !: average of qsws_eb
231              qsws_liq_eb,      & !: surface flux of latent heat (liquid water portion)
232              qsws_liq_eb_av,   & !: average of qsws_liq_eb
233              qsws_soil_eb,     & !: surface flux of latent heat (soil portion)
234              qsws_soil_eb_av,  & !: average of qsws_soil_eb
235              qsws_veg_eb,      & !: surface flux of latent heat (vegetation portion)
236              qsws_veg_eb_av,   & !: average of qsws_veg_eb
237              r_a,              & !: aerodynamic resistance
238              r_a_av,           & !: avergae of r_a
239              r_canopy,         & !: canopy resistance
240              r_soil,           & !: soil resitance
241              r_soil_min,       & !: minimum soil resistance
242              r_s,              & !: total surface resistance (combination of r_soil and r_canopy)
243              r_s_av,           & !: avergae of r_s
244              r_canopy_min,     & !: minimum canopy (stomatal) resistance
245              shf_eb,           & !: surface flux of sensible heat
246              shf_eb_av           !: average of shf_eb
247
248    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::                                 &
249              lambda_h, &   !: heat conductivity of soil (?)                           
250              lambda_w, &   !: hydraulic diffusivity of soil (?)
251              gamma_w,  &   !: hydraulic conductivity of soil (?)
252              rho_c_total   !: volumetric heat capacity of the actual soil matrix (?)
253
254#if defined( __nopointer )
255    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET ::                         &
256              t_soil,    & !: Soil temperature (K)
257              t_soil_av, & !: Average of t_soil
258              t_soil_p,  & !: Prog. soil temperature (K)
259              m_soil,    & !: Soil moisture (m3/m3)
260              m_soil_av, & !: Average of m_soil
261              m_soil_p     !: Prog. soil moisture (m3/m3)
262#else
263    REAL(wp), DIMENSION(:,:,:), POINTER ::                                     &
264              t_soil, t_soil_p, &
265              m_soil, m_soil_p   
266
267    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET ::                         &
268              t_soil_av, t_soil_1, t_soil_2,                                   &
269              m_soil_av, m_soil_1, m_soil_2
270
271
272#endif
273
274
275    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::                                 &
276              tt_soil_m, & !: t_soil storage array
277              tm_soil_m, & !: m_soil storage array
278              root_fr      !: root fraction (sum=1)
279
280
281!
282!-- Predefined Land surface classes (veg_type)
283    CHARACTER(26), DIMENSION(0:19) :: veg_type_name = (/          &
284                                   'user defined',                & ! 0
285                                   'crops, mixed farming',        & !  1
286                                   'short grass',                 & !  2
287                                   'evergreen needleleaf trees',  & !  3
288                                   'deciduous needleleaf trees',  & !  4
289                                   'evergreen broadleaf trees' ,  & !  5
290                                   'deciduous broadleaf trees',   & !  6
291                                   'tall grass',                  & !  7
292                                   'desert',                      & !  8
293                                   'tundra',                      & !  9
294                                   'irrigated crops',             & ! 10
295                                   'semidesert',                  & ! 11
296                                   'ice caps and glaciers' ,      & ! 12
297                                   'bogs and marshes',            & ! 13
298                                   'inland water',                & ! 14
299                                   'ocean',                       & ! 15
300                                   'evergreen shrubs',            & ! 16
301                                   'deciduous shrubs',            & ! 17
302                                   'mixed forest/woodland',       & ! 18
303                                   'interrupted forest'           & ! 19
304                                                       /)
305
306!
307!-- Soil model classes (soil_type)
308    CHARACTER(12), DIMENSION(0:7) :: soil_type_name = (/ &
309                                   'user defined',        & ! 0
310                                   'coarse',              & ! 1
311                                   'medium',              & ! 2
312                                   'medium-fine',         & ! 3
313                                   'fine',                & ! 4
314                                   'very fine' ,          & ! 5
315                                   'organic',             & ! 6
316                                   'loamy (CH)'           & ! 7
317                                                        /)
318!
319!-- Land surface parameters according to the respective classes (veg_type)
320
321!
322!-- Land surface parameters I
323!--                          r_canopy_min,     lai,   c_veg,     g_d
324    REAL(wp), DIMENSION(0:3,1:19) :: veg_pars = RESHAPE( (/           &
325                                 180.0_wp, 3.00_wp, 0.90_wp, 0.00_wp, & !  1
326                                 110.0_wp, 2.00_wp, 0.85_wp, 0.00_wp, & !  2
327                                 500.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, & !  3
328                                 500.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, & !  4
329                                 175.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, & !  5
330                                 240.0_wp, 6.00_wp, 0.99_wp, 0.13_wp, & !  6
331                                 100.0_wp, 2.00_wp, 0.70_wp, 0.00_wp, & !  7
332                                 250.0_wp, 0.05_wp, 0.00_wp, 0.00_wp, & !  8
333                                  80.0_wp, 1.00_wp, 0.50_wp, 0.00_wp, & !  9
334                                 180.0_wp, 3.00_wp, 0.90_wp, 0.00_wp, & ! 10
335                                 150.0_wp, 0.50_wp, 0.10_wp, 0.00_wp, & ! 11
336                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 12
337                                 240.0_wp, 4.00_wp, 0.60_wp, 0.00_wp, & ! 13
338                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 14
339                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 15
340                                 225.0_wp, 3.00_wp, 0.50_wp, 0.00_wp, & ! 16
341                                 225.0_wp, 1.50_wp, 0.50_wp, 0.00_wp, & ! 17
342                                 250.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, & ! 18
343                                 175.0_wp, 2.50_wp, 0.90_wp, 0.03_wp  & ! 19
344                                 /), (/ 4, 19 /) )
345
346!
347!-- Land surface parameters II          z0,         z0h
348    REAL(wp), DIMENSION(0:1,1:19) :: roughness_par = RESHAPE( (/ & 
349                                   0.25_wp,  0.25E-2_wp,         & !  1
350                                   0.20_wp,  0.20E-2_wp,         & !  2
351                                   2.00_wp,     2.00_wp,         & !  3
352                                   2.00_wp,     2.00_wp,         & !  4
353                                   2.00_wp,     2.00_wp,         & !  5
354                                   2.00_wp,     2.00_wp,         & !  6
355                                   0.47_wp,  0.47E-2_wp,         & !  7
356                                  0.013_wp, 0.013E-2_wp,         & !  8
357                                  0.034_wp, 0.034E-2_wp,         & !  9
358                                    0.5_wp,  0.50E-2_wp,         & ! 10
359                                   0.17_wp,  0.17E-2_wp,         & ! 11
360                                 1.3E-3_wp,   1.3E-4_wp,         & ! 12
361                                   0.83_wp,  0.83E-2_wp,         & ! 13
362                                   0.00_wp,  0.00E-2_wp,         & ! 14
363                                   0.00_wp,  0.00E-2_wp,         & ! 15
364                                   0.10_wp,  0.10E-2_wp,         & ! 16
365                                   0.25_wp,  0.25E-2_wp,         & ! 17
366                                   2.00_wp,  2.00E-2_wp,         & ! 18
367                                   1.10_wp,  1.10E-2_wp          & ! 19
368                                 /), (/ 2, 19 /) )
369
370!
371!-- Land surface parameters III lambda_surface_s, lambda_surface_u, f_sw_in
372    REAL(wp), DIMENSION(0:2,1:19) :: surface_pars = RESHAPE( (/           &
373                                      10.0_wp,       10.0_wp, 0.05_wp, & !  1
374                                      10.0_wp,       10.0_wp, 0.05_wp, & !  2
375                                      20.0_wp,       15.0_wp, 0.03_wp, & !  3
376                                      20.0_wp,       15.0_wp, 0.03_wp, & !  4
377                                      20.0_wp,       15.0_wp, 0.03_wp, & !  5
378                                      20.0_wp,       15.0_wp, 0.03_wp, & !  6
379                                      10.0_wp,       10.0_wp, 0.05_wp, & !  7
380                                      15.0_wp,       15.0_wp, 0.00_wp, & !  8
381                                      10.0_wp,       10.0_wp, 0.05_wp, & !  9
382                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 10
383                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 11
384                                      58.0_wp,       58.0_wp, 0.00_wp, & ! 12
385                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 13
386                                    1.0E20_wp,     1.0E20_wp, 0.00_wp, & ! 14
387                                    1.0E20_wp,     1.0E20_wp, 0.00_wp, & ! 15
388                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 16
389                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 17
390                                      20.0_wp,       15.0_wp, 0.03_wp, & ! 18
391                                      20.0_wp,       15.0_wp, 0.03_wp  & ! 19
392                                      /), (/ 3, 19 /) )
393
394!
395!-- Root distribution (sum = 1)  level 1, level 2, level 3, level 4,
396    REAL(wp), DIMENSION(0:3,1:19) :: root_distribution = RESHAPE( (/ &
397                                 0.24_wp, 0.41_wp, 0.31_wp, 0.04_wp, & !  1
398                                 0.35_wp, 0.38_wp, 0.23_wp, 0.04_wp, & !  2
399                                 0.26_wp, 0.39_wp, 0.29_wp, 0.06_wp, & !  3
400                                 0.26_wp, 0.38_wp, 0.29_wp, 0.07_wp, & !  4
401                                 0.24_wp, 0.38_wp, 0.31_wp, 0.07_wp, & !  5
402                                 0.25_wp, 0.34_wp, 0.27_wp, 0.14_wp, & !  6
403                                 0.27_wp, 0.27_wp, 0.27_wp, 0.09_wp, & !  7
404                                 1.00_wp, 0.00_wp, 0.00_wp, 0.00_wp, & !  8
405                                 0.47_wp, 0.45_wp, 0.08_wp, 0.00_wp, & !  9
406                                 0.24_wp, 0.41_wp, 0.31_wp, 0.04_wp, & ! 10
407                                 0.17_wp, 0.31_wp, 0.33_wp, 0.19_wp, & ! 11
408                                 0.00_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 12
409                                 0.25_wp, 0.34_wp, 0.27_wp, 0.11_wp, & ! 13
410                                 0.00_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 14
411                                 0.00_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 15
412                                 0.23_wp, 0.36_wp, 0.30_wp, 0.11_wp, & ! 16
413                                 0.23_wp, 0.36_wp, 0.30_wp, 0.11_wp, & ! 17
414                                 0.19_wp, 0.35_wp, 0.36_wp, 0.10_wp, & ! 18
415                                 0.19_wp, 0.35_wp, 0.36_wp, 0.10_wp  & ! 19
416                                 /), (/ 4, 19 /) )
417
418!
419!-- Soil parameters according to the following porosity classes (soil_type)
420
421!
422!-- Soil parameters I           alpha_vg,      l_vg,    n_vg, gamma_w_sat
423    REAL(wp), DIMENSION(0:3,1:7) :: soil_pars = RESHAPE( (/                &
424                                 3.83_wp,  1.250_wp, 1.38_wp,  6.94E-6_wp, & ! 1
425                                 3.14_wp, -2.342_wp, 1.28_wp,  1.16E-6_wp, & ! 2
426                                 0.83_wp, -0.588_wp, 1.25_wp,  0.26E-6_wp, & ! 3
427                                 3.67_wp, -1.977_wp, 1.10_wp,  2.87E-6_wp, & ! 4
428                                 2.65_wp,  2.500_wp, 1.10_wp,  1.74E-6_wp, & ! 5
429                                 1.30_wp,  0.400_wp, 1.20_wp,  0.93E-6_wp, & ! 6
430                                 0.00_wp,  0.00_wp,  0.00_wp,  0.57E-6_wp  & ! 7
431                                 /), (/ 4, 7 /) )
432
433!
434!-- Soil parameters II              m_sat,     m_fc,   m_wilt,    m_res 
435    REAL(wp), DIMENSION(0:3,1:7) :: m_soil_pars = RESHAPE( (/            &
436                                 0.403_wp, 0.244_wp, 0.059_wp, 0.025_wp, & ! 1
437                                 0.439_wp, 0.347_wp, 0.151_wp, 0.010_wp, & ! 2
438                                 0.430_wp, 0.383_wp, 0.133_wp, 0.010_wp, & ! 3
439                                 0.520_wp, 0.448_wp, 0.279_wp, 0.010_wp, & ! 4
440                                 0.614_wp, 0.541_wp, 0.335_wp, 0.010_wp, & ! 5
441                                 0.766_wp, 0.663_wp, 0.267_wp, 0.010_wp, & ! 6
442                                 0.472_wp, 0.323_wp, 0.171_wp, 0.000_wp  & ! 7
443                                 /), (/ 4, 7 /) )
444
445
446    SAVE
447
448
449    PRIVATE
450
451
452!
453!-- Public parameters, constants and initial values
454    PUBLIC alpha_vangenuchten, c_surface, canopy_resistance_coefficient,       &
455           conserve_water_content, dewfall, field_capacity,                    &
456           f_shortwave_incoming, hydraulic_conductivity, init_lsm,             &
457           init_lsm_arrays, lambda_surface_stable, lambda_surface_unstable,    &
458           land_surface, leaf_area_index, lsm_energy_balance, lsm_soil_model,  &
459           lsm_swap_timelevel, l_vangenuchten, min_canopy_resistance,          &
460           min_soil_resistance, n_vangenuchten, residual_moisture, rho_cp,     &
461           rho_lv, root_fraction, saturation_moisture, soil_moisture,          &
462           soil_temperature, soil_type, soil_type_name, vegetation_coverage,   &
463           veg_type, veg_type_name, wilting_point, z0_eb, z0h_eb
464
465!
466!-- Public grid and NetCDF variables
467    PUBLIC dots_soil, id_dim_zs_xy, id_dim_zs_xz, id_dim_zs_yz,                &
468           id_dim_zs_3d, id_dim_zs_mask, id_var_zs_xy, id_var_zs_xz,           &
469           id_var_zs_yz, id_var_zs_3d, id_var_zs_mask, nzb_soil, nzs, nzt_soil,&
470           zs
471
472
473!
474!-- Public 2D output variables
475    PUBLIC c_liq, c_liq_av, c_soil_av, c_veg, c_veg_av, ghf_eb, ghf_eb_av,     &
476           lai, lai_av, qsws_eb, qsws_eb_av, qsws_liq_eb, qsws_liq_eb_av,      &
477           qsws_soil_eb, qsws_soil_eb_av, qsws_veg_eb, qsws_veg_eb_av,         &
478           r_a, r_a_av, r_s, r_s_av, shf_eb, shf_eb_av
479
480
481!
482!-- Public prognostic variables
483    PUBLIC m_liq_eb, m_liq_eb_av, m_soil, m_soil_av, t_soil, t_soil_av
484
485
486    INTERFACE init_lsm
487       MODULE PROCEDURE init_lsm
488    END INTERFACE init_lsm
489
490    INTERFACE lsm_energy_balance
491       MODULE PROCEDURE lsm_energy_balance
492    END INTERFACE lsm_energy_balance
493
494    INTERFACE lsm_soil_model
495       MODULE PROCEDURE lsm_soil_model
496    END INTERFACE lsm_soil_model
497
498    INTERFACE lsm_swap_timelevel
499       MODULE PROCEDURE lsm_swap_timelevel
500    END INTERFACE lsm_swap_timelevel
501
502 CONTAINS
503
504
505!------------------------------------------------------------------------------!
506! Description:
507! ------------
508!-- Allocate land surface model arrays and define pointers
509!------------------------------------------------------------------------------!
510    SUBROUTINE init_lsm_arrays
511   
512
513       IMPLICIT NONE
514
515!
516!--    Allocate surface and soil temperature / humidity
517#if defined( __nopointer )
518       ALLOCATE ( m_liq_eb(nysg:nyng,nxlg:nxrg) )
519       ALLOCATE ( m_liq_eb_p(nysg:nyng,nxlg:nxrg) )
520       ALLOCATE ( m_soil(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
521       ALLOCATE ( m_soil_p(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
522       ALLOCATE ( t_surface(nysg:nyng,nxlg:nxrg) )
523       ALLOCATE ( t_surface_p(nysg:nyng,nxlg:nxrg) )
524       ALLOCATE ( t_soil(nzb_soil:nzt_soil+1,nysg:nyng,nxlg:nxrg) )
525       ALLOCATE ( t_soil_p(nzb_soil:nzt_soil+1,nysg:nyng,nxlg:nxrg) )
526#else
527       ALLOCATE ( m_liq_eb_1(nysg:nyng,nxlg:nxrg) )
528       ALLOCATE ( m_liq_eb_2(nysg:nyng,nxlg:nxrg) )
529       ALLOCATE ( m_soil_1(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
530       ALLOCATE ( m_soil_2(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
531       ALLOCATE ( t_surface_1(nysg:nyng,nxlg:nxrg) )
532       ALLOCATE ( t_surface_2(nysg:nyng,nxlg:nxrg) )
533       ALLOCATE ( t_soil_1(nzb_soil:nzt_soil+1,nysg:nyng,nxlg:nxrg) )
534       ALLOCATE ( t_soil_2(nzb_soil:nzt_soil+1,nysg:nyng,nxlg:nxrg) )
535#endif
536
537!
538!--    Allocate intermediate timestep arrays
539       ALLOCATE ( tm_liq_eb_m(nysg:nyng,nxlg:nxrg) )
540       ALLOCATE ( tm_soil_m(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
541       ALLOCATE ( tt_surface_m(nysg:nyng,nxlg:nxrg) )
542       ALLOCATE ( tt_soil_m(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
543
544!
545!--    Allocate 2D vegetation model arrays
546       ALLOCATE ( alpha_vg(nysg:nyng,nxlg:nxrg) )
547       ALLOCATE ( c_liq(nysg:nyng,nxlg:nxrg) )
548       ALLOCATE ( c_veg(nysg:nyng,nxlg:nxrg) )
549       ALLOCATE ( f_sw_in(nysg:nyng,nxlg:nxrg) )
550       ALLOCATE ( ghf_eb(nysg:nyng,nxlg:nxrg) )
551       ALLOCATE ( gamma_w_sat(nysg:nyng,nxlg:nxrg) )
552       ALLOCATE ( g_d(nysg:nyng,nxlg:nxrg) )
553       ALLOCATE ( lai(nysg:nyng,nxlg:nxrg) )
554       ALLOCATE ( l_vg(nysg:nyng,nxlg:nxrg) )
555       ALLOCATE ( lambda_h_sat(nysg:nyng,nxlg:nxrg) )
556       ALLOCATE ( lambda_surface_u(nysg:nyng,nxlg:nxrg) )
557       ALLOCATE ( lambda_surface_s(nysg:nyng,nxlg:nxrg) )
558       ALLOCATE ( m_fc(nysg:nyng,nxlg:nxrg) )
559       ALLOCATE ( m_res(nysg:nyng,nxlg:nxrg) )
560       ALLOCATE ( m_sat(nysg:nyng,nxlg:nxrg) )
561       ALLOCATE ( m_wilt(nysg:nyng,nxlg:nxrg) )
562       ALLOCATE ( n_vg(nysg:nyng,nxlg:nxrg) )
563       ALLOCATE ( qsws_eb(nysg:nyng,nxlg:nxrg) )
564       ALLOCATE ( qsws_soil_eb(nysg:nyng,nxlg:nxrg) )
565       ALLOCATE ( qsws_liq_eb(nysg:nyng,nxlg:nxrg) )
566       ALLOCATE ( qsws_veg_eb(nysg:nyng,nxlg:nxrg) )
567       ALLOCATE ( r_a(nysg:nyng,nxlg:nxrg) )
568       ALLOCATE ( r_canopy(nysg:nyng,nxlg:nxrg) )
569       ALLOCATE ( r_soil(nysg:nyng,nxlg:nxrg) )
570       ALLOCATE ( r_soil_min(nysg:nyng,nxlg:nxrg) )
571       ALLOCATE ( r_s(nysg:nyng,nxlg:nxrg) )
572       ALLOCATE ( r_canopy_min(nysg:nyng,nxlg:nxrg) )
573       ALLOCATE ( shf_eb(nysg:nyng,nxlg:nxrg) )
574
575#if ! defined( __nopointer )
576!
577!-- Initial assignment of the pointers
578       t_soil    => t_soil_1;    t_soil_p    => t_soil_2
579       t_surface => t_surface_1; t_surface_p => t_surface_2
580       m_soil    => m_soil_1;    m_soil_p    => m_soil_2
581       m_liq_eb  => m_liq_eb_1;  m_liq_eb_p  => m_liq_eb_2
582#endif
583
584
585    END SUBROUTINE init_lsm_arrays
586
587!------------------------------------------------------------------------------!
588! Description:
589! ------------
590!-- Initialization of the land surface model
591!------------------------------------------------------------------------------!
592    SUBROUTINE init_lsm
593   
594
595       IMPLICIT NONE
596
597       INTEGER(iwp) ::  i !: running index
598       INTEGER(iwp) ::  j !: running index
599       INTEGER(iwp) ::  k !: running index
600
601
602!
603!--    Calculate Exner function
604       exn       = ( surface_pressure / 1000.0_wp )**0.286_wp
605
606
607!
608!--    If no cloud physics is used, rho_surface has not been calculated before
609       IF ( .NOT. cloud_physics )  THEN
610          rho_surface = surface_pressure * 100.0_wp / ( r_d * pt_surface * exn )
611       ENDIF
612
613!
614!--    Calculate frequently used parameters
615       rho_cp    = cp * rho_surface
616       rd_d_rv   = r_d / r_v
617       rho_lv    = rho_surface * l_v
618       drho_l_lv = 1.0_wp / (rho_l * l_v)
619
620!
621!--    Set inital values for prognostic quantities
622       tt_surface_m = 0.0_wp
623       tt_soil_m    = 0.0_wp
624       tm_liq_eb_m  = 0.0_wp
625       c_liq        = 0.0_wp
626
627       ghf_eb = 0.0_wp
628       shf_eb = rho_cp * shf
629
630       IF ( humidity )  THEN
631          qsws_eb = rho_l * l_v * qsws
632       ELSE
633          qsws_eb = 0.0_wp
634       ENDIF
635
636       qsws_liq_eb  = 0.0_wp
637       qsws_soil_eb = qsws_eb
638       qsws_veg_eb  = 0.0_wp
639
640       r_a        = 50.0_wp
641       r_s        = 50.0_wp
642       r_canopy   = 0.0_wp
643       r_soil     = 0.0_wp
644
645!
646!--    Allocate 3D soil model arrays
647       ALLOCATE ( root_fr(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
648       ALLOCATE ( lambda_h(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
649       ALLOCATE ( rho_c_total(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
650
651       lambda_h = 0.0_wp
652!
653!--    If required, allocate humidity-related variables for the soil model
654       IF ( humidity )  THEN
655          ALLOCATE ( lambda_w(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )
656          ALLOCATE ( gamma_w(nzb_soil:nzt_soil,nysg:nyng,nxlg:nxrg) )   
657
658          lambda_w = 0.0_wp 
659       ENDIF
660
661!
662!--    Calculate grid spacings. Temperature and moisture are defined at
663!--    the center of the soil layers, whereas gradients/fluxes are defined
664!--    at the edges (_stag)
665       dz_soil_stag(nzb_soil) = zs(nzb_soil)
666
667       DO k = nzb_soil+1, nzt_soil
668          dz_soil_stag(k) = zs(k) - zs(k-1)
669       ENDDO
670
671       DO k = nzb_soil, nzt_soil-1
672          dz_soil(k) = 0.5 * (dz_soil_stag(k+1) + dz_soil_stag(k))
673       ENDDO
674       dz_soil(nzt_soil) = dz_soil_stag(nzt_soil)
675
676       ddz_soil      = 1.0_wp / dz_soil
677       ddz_soil_stag = 1.0_wp / dz_soil_stag
678
679!
680!--    Initialize standard soil types. It is possible to overwrite each
681!--    parameter by setting the respecticy NAMELIST variable to a
682!--    value /= 9999999.9.
683       IF ( soil_type /= 0 )  THEN 
684 
685          IF ( alpha_vangenuchten == 9999999.9_wp )  THEN
686             alpha_vangenuchten = soil_pars(0,soil_type)
687          ENDIF
688
689          IF ( l_vangenuchten == 9999999.9_wp )  THEN
690             l_vangenuchten = soil_pars(1,soil_type)
691          ENDIF
692
693          IF ( n_vangenuchten == 9999999.9_wp )  THEN
694             n_vangenuchten = soil_pars(2,soil_type)           
695          ENDIF
696
697          IF ( hydraulic_conductivity == 9999999.9_wp )  THEN
698             hydraulic_conductivity = soil_pars(3,soil_type)           
699          ENDIF
700
701          IF ( saturation_moisture == 9999999.9_wp )  THEN
702             saturation_moisture = m_soil_pars(0,soil_type)           
703          ENDIF
704
705          IF ( field_capacity == 9999999.9_wp )  THEN
706             field_capacity = m_soil_pars(1,soil_type)           
707          ENDIF
708
709          IF ( wilting_point == 9999999.9_wp )  THEN
710             wilting_point = m_soil_pars(2,soil_type)           
711          ENDIF
712
713          IF ( residual_moisture == 9999999.9_wp )  THEN
714             residual_moisture = m_soil_pars(3,soil_type)       
715          ENDIF
716
717       ENDIF   
718
719       alpha_vg      = alpha_vangenuchten
720       l_vg          = l_vangenuchten
721       n_vg          = n_vangenuchten 
722       gamma_w_sat   = hydraulic_conductivity
723       m_sat         = saturation_moisture
724       m_fc          = field_capacity
725       m_wilt        = wilting_point
726       m_res         = residual_moisture
727       r_soil_min    = min_soil_resistance
728
729!
730!--    Initial run actions
731       IF (  TRIM( initializing_actions ) /= 'read_restart_data' )  THEN
732
733          t_soil    = 0.0_wp
734          m_liq_eb  = 0.0_wp
735          m_soil    = 0.0_wp
736
737!
738!--       Map user settings of T and q for each soil layer
739!--       (make sure that the soil moisture does not drop below the permanent
740!--       wilting point) -> problems with devision by zero)
741          DO k = nzb_soil, nzt_soil
742             t_soil(k,:,:)    = soil_temperature(k)
743             m_soil(k,:,:)    = MAX(soil_moisture(k),m_wilt(:,:))
744             soil_moisture(k) = MAX(soil_moisture(k),wilting_point)
745          ENDDO
746          t_soil(nzt_soil+1,:,:) = soil_temperature(nzt_soil+1)
747
748!
749!--       Calculate surface temperature
750          t_surface = pt_surface * exn
751
752!
753!--       Set artifical values for ts and us so that r_a has its initial value for
754!--       the first time step
755          DO  i = nxlg, nxrg
756             DO  j = nysg, nyng
757                k = nzb_s_inner(j,i)
758
759!
760!--             Assure that r_a cannot be zero at model start
761                IF ( pt(k+1,j,i) == pt(k,j,i) )  pt(k+1,j,i) = pt(k+1,j,i)     &
762                                                 + 1.0E-10_wp
763
764                us(j,i) = 0.1_wp
765                ts(j,i) = (pt(k+1,j,i) - pt(k,j,i)) / r_a(j,i)
766                shf(j,i) = - us(j,i) * ts(j,i)
767             ENDDO
768          ENDDO
769
770!
771!--    Actions for restart runs
772       ELSE
773
774          DO  i = nxlg, nxrg
775             DO  j = nysg, nyng
776                k = nzb_s_inner(j,i)               
777                t_surface(j,i) = pt(k,j,i) * exn
778             ENDDO
779          ENDDO
780
781       ENDIF
782
783!
784!--    Calculate saturation soil heat conductivity
785       lambda_h_sat(:,:) = lambda_h_sm ** (1.0_wp - m_sat(:,:)) *              &
786                           lambda_h_water ** m_sat(:,:)
787
788
789
790
791       DO k = nzb_soil, nzt_soil
792          root_fr(k,:,:) = root_fraction(k)
793       ENDDO
794
795       IF ( veg_type /= 0 )  THEN
796          IF ( min_canopy_resistance == 9999999.9_wp )  THEN
797             min_canopy_resistance = veg_pars(0,veg_type)
798          ENDIF
799          IF ( leaf_area_index == 9999999.9_wp )  THEN
800             leaf_area_index = veg_pars(1,veg_type)         
801          ENDIF
802          IF ( vegetation_coverage == 9999999.9_wp )  THEN
803             vegetation_coverage = veg_pars(2,veg_type)     
804          ENDIF
805          IF ( canopy_resistance_coefficient == 9999999.9_wp )  THEN
806              canopy_resistance_coefficient= veg_pars(3,veg_type)     
807          ENDIF
808          IF ( lambda_surface_stable == 9999999.9_wp )  THEN
809             lambda_surface_stable = surface_pars(0,veg_type)         
810          ENDIF
811          IF ( lambda_surface_unstable == 9999999.9_wp )  THEN
812             lambda_surface_unstable = surface_pars(1,veg_type)       
813          ENDIF
814          IF ( f_shortwave_incoming == 9999999.9_wp )  THEN
815             f_shortwave_incoming = surface_pars(2,veg_type)       
816          ENDIF
817          IF ( z0_eb == 9999999.9_wp )  THEN
818             roughness_length = roughness_par(0,veg_type) 
819             z0_eb            = roughness_par(0,veg_type) 
820          ENDIF
821          IF ( z0h_eb == 9999999.9_wp )  THEN
822             z0h_eb = roughness_par(1,veg_type)
823          ENDIF
824          z0h_factor = z0h_eb / z0_eb
825
826          IF ( ANY( root_fraction == 9999999.9_wp ) )  THEN
827             DO k = nzb_soil, nzt_soil
828                root_fr(k,:,:) = root_distribution(k,veg_type)
829                root_fraction(k) = root_distribution(k,veg_type)
830             ENDDO
831          ENDIF
832
833       ELSE
834
835          IF ( z0_eb == 9999999.9_wp )  THEN
836             z0_eb = roughness_length
837          ENDIF
838          IF ( z0h_eb == 9999999.9_wp )  THEN
839             z0h_eb = z0_eb * z0h_factor
840          ENDIF
841
842       ENDIF
843
844!
845!--    Initialize vegetation
846       r_canopy_min         = min_canopy_resistance
847       lai                  = leaf_area_index
848       c_veg                = vegetation_coverage
849       g_d                  = canopy_resistance_coefficient
850       lambda_surface_s     = lambda_surface_stable
851       lambda_surface_u     = lambda_surface_unstable
852       f_sw_in              = f_shortwave_incoming
853       z0                   = z0_eb
854       z0h                  = z0h_eb
855
856!
857!--    Possibly do user-defined actions (e.g. define heterogeneous land surface)
858       CALL user_init_land_surface
859
860
861       t_soil_p    = t_soil
862       m_soil_p    = m_soil
863       m_liq_eb_p  = m_liq_eb
864
865!--    Store initial profiles of t_soil and m_soil (assuming they are
866!--    horizontally homogeneous on this PE)
867       hom(nzb_soil:nzt_soil,1,90,:)  = SPREAD( t_soil(nzb_soil:nzt_soil,      &
868                                                nysg,nxlg), 2,                 &
869                                                statistic_regions+1 )
870       hom(nzb_soil:nzt_soil,1,92,:)  = SPREAD( m_soil(nzb_soil:nzt_soil,      &
871                                                nysg,nxlg), 2,                 &
872                                                statistic_regions+1 )
873
874!
875!--    Calculate humidity at the surface
876       IF ( humidity )  THEN
877          CALL calc_q_surface
878       ENDIF
879
880
881
882!
883!--    Add timeseries for land surface model
884       dots_label(dots_num+1) = "ghf_eb"
885       dots_label(dots_num+2) = "shf_eb"
886       dots_label(dots_num+3) = "qsws_eb"
887       dots_label(dots_num+4) = "qsws_liq_eb"
888       dots_label(dots_num+5) = "qsws_soil_eb"
889       dots_label(dots_num+6) = "qsws_veg_eb"
890       dots_unit(dots_num+1:dots_num+6) = "W/m2"
891
892       dots_label(dots_num+7) = "r_a"
893       dots_label(dots_num+8) = "r_s"
894       dots_unit(dots_num+7:dots_num+8) = "s/m"
895
896       dots_soil = dots_num + 1
897       dots_num  = dots_num + 8
898
899
900       RETURN
901
902    END SUBROUTINE init_lsm
903
904
905
906!------------------------------------------------------------------------------!
907! Description:
908! ------------
909! Solver for the energy balance at the surface.
910!
911! Note: surface fluxes are calculated in the land surface model, but these are
912! not used in the atmospheric code. The fluxes are calculated afterwards in
913! prandtl_fluxes using the surface values of temperature and humidity as
914! provided by the land surface model. In this way, the fluxes in the land
915! surface model are not equal to the ones calculated in prandtl_fluxes
916!------------------------------------------------------------------------------!
917    SUBROUTINE lsm_energy_balance
918
919
920       IMPLICIT NONE
921
922       INTEGER(iwp) ::  i         !: running index
923       INTEGER(iwp) ::  j         !: running index
924       INTEGER(iwp) ::  k, ks     !: running index
925
926       REAL(wp) :: f1,          & !: resistance correction term 1
927                   f2,          & !: resistance correction term 2
928                   f3,          & !: resistance correction term 3
929                   m_min,       & !: minimum soil moisture
930                   T_1,         & !: actual temperature at first grid point
931                   e,           & !: water vapour pressure
932                   e_s,         & !: water vapour saturation pressure
933                   e_s_dT,      & !: derivate of e_s with respect to T
934                   tend,        & !: tendency
935                   dq_s_dT,     & !: derivate of q_s with respect to T
936                   coef_1,      & !: coef. for prognostic equation
937                   coef_2,      & !: coef. for prognostic equation
938                   f_qsws,      & !: factor for qsws_eb
939                   f_qsws_veg,  & !: factor for qsws_veg_eb
940                   f_qsws_soil, & !: factor for qsws_soil_eb
941                   f_qsws_liq,  & !: factor for qsws_liq_eb
942                   f_shf,       & !: factor for shf_eb
943                   lambda_surface, & !: Current value of lambda_surface
944                   m_liq_eb_max   !: maxmimum value of the liq. water reservoir
945
946
947!
948!--    Calculate the exner function for the current time step
949       exn = ( surface_pressure / 1000.0_wp )**0.286_wp
950
951
952       DO i = nxlg, nxrg
953          DO j = nysg, nyng
954             k = nzb_s_inner(j,i)
955
956!
957!--          Set lambda_surface according to stratification
958             IF ( rif(j,i) >= 0.0_wp )  THEN
959                lambda_surface = lambda_surface_s(j,i)
960             ELSE
961                lambda_surface = lambda_surface_u(j,i)
962             ENDIF
963
964!
965!--          First step: calculate aerodyamic resistance. As pt, us, ts
966!--          are not available for the prognostic time step, data from the last
967!--          time step is used here. Note that this formulation is the
968!--          equivalent to the ECMWF formulation using drag coefficients
969             r_a(j,i) = (pt(k+1,j,i) - pt(k,j,i)) / (ts(j,i) * us(j,i) +       &
970                         1.0E-20_wp)
971
972!
973!--          Second step: calculate canopy resistance r_canopy
974!--          f1-f3 here are defined as 1/f1-f3 as in ECMWF documentation
975 
976!--          f1: correction for incoming shortwave radiation (stomata close at
977!--          night)
978             IF ( irad_scheme /= 0 )  THEN
979                f1 = MIN(1.0_wp, ( 0.004_wp * rad_sw_in(j,i) + 0.05_wp ) /     &
980                              (0.81_wp * (0.004_wp * rad_sw_in(j,i) + 1.0_wp) ))
981             ELSE
982                f1 = 1.0_wp
983             ENDIF
984
985!
986!--          f2: correction for soil moisture availability to plants (the
987!--          integrated soil moisture must thus be considered here)
988!--          f2 = 0 for very dry soils
989             m_total = 0.0_wp
990             DO ks = nzb_soil, nzt_soil
991                 m_total = m_total + root_fr(ks,j,i)                           &
992                           * MAX(m_soil(ks,j,i),m_wilt(j,i))
993             ENDDO 
994
995             IF ( m_total .GT. m_wilt(j,i) .AND. m_total .LT. m_fc(j,i) )  THEN
996                f2 = ( m_total - m_wilt(j,i) ) / (m_fc(j,i) - m_wilt(j,i) )
997             ELSEIF ( m_total .GE. m_fc(j,i) )  THEN
998                f2 = 1.0_wp
999             ELSE
1000                f2 = 1.0E-20_wp
1001             ENDIF
1002
1003!
1004!--          Calculate water vapour pressure at saturation
1005             e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surface(j,i)     &
1006                           - 273.16_wp ) / ( t_surface(j,i) - 35.86_wp ) )
1007
1008!
1009!--          f3: correction for vapour pressure deficit
1010             IF ( g_d(j,i) /= 0.0_wp )  THEN
1011!
1012!--             Calculate vapour pressure
1013                e  = q_p(k+1,j,i) * surface_pressure / 0.622_wp
1014                f3 = EXP ( -g_d(j,i) * (e_s - e) )
1015             ELSE
1016                f3 = 1.0_wp
1017             ENDIF
1018
1019!
1020!--          Calculate canopy resistance. In case that c_veg is 0 (bare soils),
1021!--          this calculation is obsolete, as r_canopy is not used below.
1022!--          To do: check for very dry soil -> r_canopy goes to infinity
1023             r_canopy(j,i) = r_canopy_min(j,i) / (lai(j,i) * f1 * f2 * f3      &
1024                                             + 1.0E-20_wp)
1025
1026!
1027!--          Third step: calculate bare soil resistance r_soil. The Clapp &
1028!--          Hornberger parametrization does not consider c_veg.
1029             IF ( soil_type /= 7 )  THEN
1030                m_min = c_veg(j,i) * m_wilt(j,i) + (1.0_wp - c_veg(j,i)) *     &
1031                        m_res(j,i)
1032             ELSE
1033                m_min = m_wilt(j,i)
1034             ENDIF
1035
1036             f2 = ( m_soil(nzb_soil,j,i) - m_min ) / ( m_fc(j,i) - m_min )
1037             f2 = MAX(f2,1.0E-20_wp)
1038             f2 = MIN(f2,1.0_wp)
1039
1040             r_soil(j,i) = r_soil_min(j,i) / f2
1041
1042!
1043!--          Calculate fraction of liquid water reservoir
1044             m_liq_eb_max = m_max_depth * lai(j,i)
1045             c_liq(j,i) = MIN(1.0_wp, m_liq_eb(j,i) / (m_liq_eb_max+1.0E-20_wp))
1046             
1047
1048!
1049!--          Calculate saturation specific humidity
1050             q_s = 0.622_wp * e_s / surface_pressure
1051
1052!
1053!--          In case of dewfall, set evapotranspiration to zero
1054!--          All super-saturated water is then removed from the air
1055             IF ( humidity .AND. dewfall .AND. q_s .LE. q_p(k+1,j,i) )  THEN
1056                r_canopy(j,i) = 0.0_wp
1057                r_soil(j,i)   = 0.0_wp
1058             ENDIF 
1059
1060!
1061!--          Calculate coefficients for the total evapotranspiration
1062             f_qsws_veg  = rho_lv * c_veg(j,i) * (1.0_wp - c_liq(j,i))/        &
1063                           (r_a(j,i) + r_canopy(j,i))
1064
1065             f_qsws_soil = rho_lv * (1.0_wp - c_veg(j,i)) / (r_a(j,i) +        &
1066                                                          r_soil(j,i))
1067             f_qsws_liq  = rho_lv * c_veg(j,i) * c_liq(j,i) / r_a(j,i)
1068
1069
1070!
1071!--          If soil moisture is below wilting point, plants do no longer
1072!--          transpirate.
1073!              IF ( m_soil(k,j,i) .LT. m_wilt(j,i) )  THEN
1074!                 f_qsws_veg = 0.0_wp
1075!              ENDIF
1076
1077!
1078!--          If dewfall is deactivated, vegetation, soil and liquid water
1079!--          reservoir are not allowed to take up water from the super-saturated
1080!--          air.
1081             IF ( humidity )  THEN
1082                IF ( q_s .LE. q_p(k+1,j,i) )  THEN
1083                   IF ( .NOT. dewfall )  THEN
1084                      f_qsws_veg  = 0.0_wp
1085                      f_qsws_soil = 0.0_wp
1086                      f_qsws_liq  = 0.0_wp
1087                   ENDIF
1088                ENDIF
1089             ENDIF
1090
1091             f_shf  = rho_cp / r_a(j,i)
1092             f_qsws = f_qsws_veg + f_qsws_soil + f_qsws_liq
1093
1094!
1095!--          Calculate derivative of q_s for Taylor series expansion
1096             e_s_dT = e_s * ( 17.269_wp / (t_surface(j,i) - 35.86_wp) -        &
1097                              17.269_wp*(t_surface(j,i) - 273.16_wp)           &
1098                              / (t_surface(j,i) - 35.86_wp)**2 )
1099
1100             dq_s_dT = 0.622_wp * e_s_dT / surface_pressure
1101
1102             T_1 = pt_p(k+1,j,i) * exn
1103
1104!
1105!--          Add LW up so that it can be removed in prognostic equation
1106             rad_net(j,i) = rad_net(j,i) + sigma_SB * t_surface(j,i) ** 4
1107
1108             IF ( humidity )  THEN
1109
1110!
1111!--             Numerator of the prognostic equation
1112                coef_1 = rad_net(j,i) + 3.0_wp * sigma_SB * t_surface(j,i) ** 4&
1113                         + f_shf / exn * T_1 + f_qsws * ( q_p(k+1,j,i) - q_s   &
1114                         + dq_s_dT * t_surface(j,i) ) + lambda_surface         &
1115                         * t_soil(nzb_soil,j,i)
1116
1117!
1118!--             Denominator of the prognostic equation
1119                coef_2 = 4.0_wp * sigma_SB * t_surface(j,i) ** 3 + f_qsws      &
1120                         * dq_s_dT + lambda_surface + f_shf / exn
1121
1122             ELSE
1123
1124!
1125!--             Numerator of the prognostic equation
1126                coef_1 = rad_net(j,i) + 3.0_wp * sigma_SB * t_surface(j,i) ** 4&
1127                         + f_shf / exn * T_1 + lambda_surface                  &
1128                         * t_soil(nzb_soil,j,i)
1129
1130!
1131!--             Denominator of the prognostic equation
1132                coef_2 = 4.0_wp * sigma_SB * t_surface(j,i) ** 3               &
1133                         + lambda_surface + f_shf / exn
1134
1135             ENDIF
1136
1137             tend = 0.0_wp
1138
1139!
1140!--          Implicit solution when the surface layer has no heat capacity,
1141!--          otherwise use RK3 scheme.
1142             t_surface_p(j,i) = ( coef_1 * dt_3d * tsc(2) + c_surface *        &
1143                                t_surface(j,i) ) / ( c_surface + coef_2 * dt_3d&
1144                                * tsc(2) ) 
1145!
1146!--          Add RK3 term
1147             t_surface_p(j,i) = t_surface_p(j,i) + dt_3d * tsc(3)              &
1148                                * tt_surface_m(j,i)
1149
1150!
1151!--          Calculate true tendency
1152             tend = (t_surface_p(j,i) - t_surface(j,i) - dt_3d * tsc(3)        &
1153                    * tt_surface_m(j,i)) / (dt_3d  * tsc(2))
1154!
1155!--          Calculate t_surface tendencies for the next Runge-Kutta step
1156             IF ( timestep_scheme(1:5) == 'runge' )  THEN
1157                IF ( intermediate_timestep_count == 1 )  THEN
1158                   tt_surface_m(j,i) = tend
1159                ELSEIF ( intermediate_timestep_count <                         &
1160                         intermediate_timestep_count_max )  THEN
1161                   tt_surface_m(j,i) = -9.5625_wp * tend + 5.3125_wp           &
1162                                       * tt_surface_m(j,i)
1163                ENDIF
1164             ENDIF
1165
1166             pt_p(k,j,i) = t_surface_p(j,i) / exn
1167!
1168!--          Calculate fluxes
1169             rad_net(j,i)   = rad_net(j,i) + 3.0_wp * sigma_SB                 &
1170                              * t_surface(j,i)**4 - 4.0_wp * sigma_SB          &
1171                              * t_surface(j,i)**3 * t_surface_p(j,i)
1172             ghf_eb(j,i)    = lambda_surface * (t_surface_p(j,i)               &
1173                              - t_soil(nzb_soil,j,i))
1174             shf_eb(j,i)    = - f_shf  * ( pt_p(k+1,j,i) - pt_p(k,j,i) )
1175
1176             IF ( humidity )  THEN
1177                qsws_eb(j,i)  = - f_qsws    * ( q_p(k+1,j,i) - q_s + dq_s_dT   &
1178                                * t_surface(j,i) - dq_s_dT * t_surface_p(j,i) )
1179
1180                qsws_veg_eb(j,i)  = - f_qsws_veg  * ( q_p(k+1,j,i) - q_s       &
1181                                    + dq_s_dT * t_surface(j,i) - dq_s_dT       &
1182                                    * t_surface_p(j,i) )
1183
1184                qsws_soil_eb(j,i) = - f_qsws_soil * ( q_p(k+1,j,i) - q_s       &
1185                                    + dq_s_dT * t_surface(j,i) - dq_s_dT       &
1186                                    * t_surface_p(j,i) )
1187
1188                qsws_liq_eb(j,i)  = - f_qsws_liq  * ( q_p(k+1,j,i) - q_s       &
1189                                    + dq_s_dT * t_surface(j,i) - dq_s_dT       &
1190                                    * t_surface_p(j,i) )
1191             ENDIF
1192
1193!
1194!--          Calculate the true surface resistance
1195             IF ( qsws_eb(j,i) .EQ. 0.0_wp )  THEN
1196                r_s(j,i) = 1.0E10_wp
1197             ELSE
1198                r_s(j,i) = - rho_lv * ( q_p(k+1,j,i) - q_s + dq_s_dT           &
1199                           * t_surface(j,i) - dq_s_dT * t_surface_p(j,i) )     &
1200                           / qsws_eb(j,i) - r_a(j,i)
1201             ENDIF
1202
1203!
1204!--          Calculate change in liquid water reservoir due to dew fall or
1205!--          evaporation of liquid water
1206             IF ( humidity )  THEN
1207!
1208!--             If precipitation is activated, add rain water to qsws_liq_eb.
1209!--             precipitation_rate is given in mm.
1210                IF ( precipitation )  THEN
1211                   qsws_liq_eb(j,i) = qsws_liq_eb(j,i)                         &
1212                                       + precipitation_rate(j,i) * 0.001_wp    &
1213                                       * rho_l * l_v
1214                ENDIF
1215!
1216!--             If the air is saturated, check the reservoir water level
1217                IF ( q_s .LE. q_p(k+1,j,i))  THEN
1218!
1219!--                Check if reservoir is full (avoid values > m_liq_eb_max)
1220!--                In that case, qsws_liq_eb goes to qsws_soil_eb. In this
1221!--                case qsws_veg_eb is zero anyway (because c_liq = 1),       
1222!--                so that tend is zero and no further check is needed
1223                   IF ( m_liq_eb(j,i) .EQ. m_liq_eb_max )  THEN
1224                      qsws_soil_eb(j,i) = qsws_soil_eb(j,i)                    &
1225                                           + qsws_liq_eb(j,i)
1226                      qsws_liq_eb(j,i)  = 0.0_wp
1227                   ENDIF
1228
1229!
1230!--                In case qsws_veg_eb becomes negative (unphysical behavior),
1231!--                let the water enter the liquid water reservoir as dew on the
1232!--                plant
1233                   IF ( qsws_veg_eb(j,i) .LT. 0.0_wp )  THEN
1234                      qsws_liq_eb(j,i) = qsws_liq_eb(j,i) + qsws_veg_eb(j,i)
1235                      qsws_veg_eb(j,i) = 0.0_wp
1236                   ENDIF
1237                ENDIF                   
1238 
1239                tend = - qsws_liq_eb(j,i) * drho_l_lv
1240
1241                m_liq_eb_p(j,i) = m_liq_eb(j,i) + dt_3d * ( tsc(2) * tend      &
1242                                                   + tsc(3) * tm_liq_eb_m(j,i) )
1243
1244!
1245!--             Check if reservoir is overfull -> reduce to maximum
1246!--             (conservation of water is violated here)
1247                m_liq_eb_p(j,i) = MIN(m_liq_eb_p(j,i),m_liq_eb_max)
1248
1249!
1250!--             Check if reservoir is empty (avoid values < 0.0)
1251!--             (conservation of water is violated here)
1252                m_liq_eb_p(j,i) = MAX(m_liq_eb_p(j,i),0.0_wp)
1253
1254
1255!
1256!--             Calculate m_liq_eb tendencies for the next Runge-Kutta step
1257                IF ( timestep_scheme(1:5) == 'runge' )  THEN
1258                   IF ( intermediate_timestep_count == 1 )  THEN
1259                      tm_liq_eb_m(j,i) = tend
1260                   ELSEIF ( intermediate_timestep_count <                      &
1261                            intermediate_timestep_count_max )  THEN
1262                      tm_liq_eb_m(j,i) = -9.5625_wp * tend + 5.3125_wp         &
1263                                      * tm_liq_eb_m(j,i)
1264                   ENDIF
1265                ENDIF
1266
1267             ENDIF
1268
1269          ENDDO
1270       ENDDO
1271
1272    END SUBROUTINE lsm_energy_balance
1273
1274
1275!------------------------------------------------------------------------------!
1276! Description:
1277! ------------
1278!
1279! Soil model as part of the land surface model. The model predicts soil
1280! temperature and water content.
1281!------------------------------------------------------------------------------!
1282    SUBROUTINE lsm_soil_model
1283
1284
1285       IMPLICIT NONE
1286
1287       INTEGER(iwp) ::  i   !: running index
1288       INTEGER(iwp) ::  j   !: running index
1289       INTEGER(iwp) ::  k   !: running index
1290
1291       REAL(wp)     :: h_vg !: Van Genuchten coef. h
1292
1293       REAL(wp), DIMENSION(nzb_soil:nzt_soil) :: gamma_temp,  & !: temp. gamma
1294                                               lambda_temp, & !: temp. lambda
1295                                               tend           !: tendency
1296
1297       DO i = nxlg, nxrg   
1298          DO j = nysg, nyng
1299             DO k = nzb_soil, nzt_soil
1300!
1301!--             Calculate volumetric heat capacity of the soil, taking into
1302!--             account water content
1303                rho_c_total(k,j,i) = (rho_c_soil * (1.0_wp - m_sat(j,i))       &
1304                                     + rho_c_water * m_soil(k,j,i))
1305
1306!
1307!--             Calculate soil heat conductivity at the center of the soil
1308!--             layers
1309                ke = 1.0_wp + LOG10(MAX(0.1_wp,m_soil(k,j,i) / m_sat(j,i)))
1310                lambda_temp(k) = ke * (lambda_h_sat(j,i) + lambda_h_dry) +     &
1311                                 lambda_h_dry
1312
1313             ENDDO
1314
1315!
1316!--          Calculate soil heat conductivity (lambda_h) at the _stag level
1317!--          using linear interpolation
1318             DO k = nzb_soil, nzt_soil-1
1319                 
1320                lambda_h(k,j,i) = lambda_temp(k) +                             &
1321                                  ( lambda_temp(k+1) - lambda_temp(k) )        &
1322                                  * 0.5 * dz_soil_stag(k) * ddz_soil(k+1)
1323
1324             ENDDO
1325             lambda_h(nzt_soil,j,i) = lambda_temp(nzt_soil)
1326
1327!
1328!--          Prognostic equation for soil temperature t_soil
1329             tend(:) = 0.0_wp
1330             tend(0) = (1.0_wp/rho_c_total(nzb_soil,j,i)) *                    &
1331                       ( lambda_h(nzb_soil,j,i) * ( t_soil(nzb_soil+1,j,i)     &
1332                         - t_soil(nzb_soil,j,i) ) * ddz_soil(nzb_soil)         &
1333                         + ghf_eb(j,i) ) * ddz_soil_stag(nzb_soil)
1334
1335             DO  k = 1, nzt_soil
1336                tend(k) = (1.0_wp/rho_c_total(k,j,i))                          &
1337                          * (   lambda_h(k,j,i)                                &
1338                              * ( t_soil(k+1,j,i) - t_soil(k,j,i) )            &
1339                              * ddz_soil(k)                                    &
1340                              - lambda_h(k-1,j,i)                              &
1341                              * ( t_soil(k,j,i) - t_soil(k-1,j,i) )            &
1342                              * ddz_soil(k-1)                                  &
1343                            ) * ddz_soil_stag(k)
1344             ENDDO
1345
1346             t_soil_p(nzb_soil:nzt_soil,j,i) = t_soil(nzb_soil:nzt_soil,j,i)   &
1347                                             + dt_3d * ( tsc(2)                &
1348                                             * tend(:) + tsc(3)                &
1349                                             * tt_soil_m(:,j,i) )   
1350
1351!
1352!--          Calculate t_soil tendencies for the next Runge-Kutta step
1353             IF ( timestep_scheme(1:5) == 'runge' )  THEN
1354                IF ( intermediate_timestep_count == 1 )  THEN
1355                   DO  k = nzb_soil, nzt_soil
1356                      tt_soil_m(k,j,i) = tend(k)
1357                   ENDDO
1358                ELSEIF ( intermediate_timestep_count <                         &
1359                         intermediate_timestep_count_max )  THEN
1360                   DO  k = nzb_soil, nzt_soil
1361                      tt_soil_m(k,j,i) = -9.5625_wp * tend(k) + 5.3125_wp      &
1362                                         * tt_soil_m(k,j,i)
1363                   ENDDO
1364                ENDIF
1365             ENDIF
1366
1367
1368             DO k = nzb_soil, nzt_soil
1369
1370!
1371!--             Calculate soil diffusivity at the center of the soil layers
1372                lambda_temp(k) = (- b_ch * gamma_w_sat(j,i) * psi_sat          &
1373                                  / m_sat(j,i) ) * ( MAX(m_soil(k,j,i),        &
1374                                  m_wilt(j,i)) / m_sat(j,i) )**(b_ch + 2.0_wp)
1375
1376!
1377!--             Parametrization of Van Genuchten
1378                IF ( soil_type /= 7 )  THEN
1379!
1380!--                Calculate the hydraulic conductivity after Van Genuchten
1381!--                (1980)
1382                   h_vg = ( ( (m_res(j,i) - m_sat(j,i)) / ( m_res(j,i) -       &
1383                              MAX(m_soil(k,j,i),m_wilt(j,i)) ) )**(n_vg(j,i)   &
1384                              / (n_vg(j,i)-1.0_wp)) - 1.0_wp                   &
1385                          )**(1.0_wp/n_vg(j,i)) / alpha_vg(j,i)
1386
1387                   gamma_temp(k) = gamma_w_sat(j,i) * ( ( (1.0_wp +            &
1388                                   (alpha_vg(j,i)*h_vg)**n_vg(j,i))**(1.0_wp   &
1389                                   -1.0_wp/n_vg(j,i)) - (alpha_vg(j,i)*h_vg    &
1390                                   )**(n_vg(j,i)-1.0_wp))**2 )                 &
1391                                   / ( (1.0_wp + (alpha_vg(j,i)*h_vg           &
1392                                   )**n_vg(j,i))**((1.0_wp - 1.0_wp/n_vg(j,i)) &
1393                                   *(l_vg(j,i) + 2.0_wp)) )
1394
1395!
1396!--             Parametrization of Clapp & Hornberger
1397                ELSE
1398                   gamma_temp(k) = gamma_w_sat(j,i) * (m_soil(k,j,i)           &
1399                                   / m_sat(j,i) )**(2.0_wp * b_ch + 3.0_wp)
1400                ENDIF
1401
1402             ENDDO
1403
1404
1405             IF ( humidity )  THEN
1406!
1407!--             Calculate soil diffusivity (lambda_w) at the _stag level
1408!--             using linear interpolation. To do: replace this with
1409!--             ECMWF-IFS Eq. 8.81
1410                DO k = nzb_soil, nzt_soil-1
1411                     
1412                   lambda_w(k,j,i) = lambda_temp(k) +                          &
1413                                     ( lambda_temp(k+1) - lambda_temp(k) )     &
1414                                     * 0.5_wp * dz_soil_stag(k) * ddz_soil(k+1)
1415                   gamma_w(k,j,i)  = gamma_temp(k) +                           &
1416                                     ( gamma_temp(k+1) - gamma_temp(k) )       &
1417                                     * 0.5_wp * dz_soil_stag(k) * ddz_soil(k+1)                 
1418
1419                ENDDO
1420
1421!
1422!
1423!--             In case of a closed bottom (= water content is conserved), set
1424!--             hydraulic conductivity to zero to that no water will be lost
1425!--             in the bottom layer.
1426                IF ( conserve_water_content )  THEN
1427                   gamma_w(nzt_soil,j,i) = 0.0_wp
1428                ELSE
1429                   gamma_w(nzt_soil,j,i) = lambda_temp(nzt_soil)
1430                ENDIF     
1431
1432!--             The root extraction (= root_extr * qsws_veg_eb / (rho_l * l_v))
1433!--             ensures the mass conservation for water. The transpiration of
1434!--             plants equals the cumulative withdrawals by the roots in the
1435!--             soil. The scheme takes into account the availability of water
1436!--             in the soil layers as well as the root fraction in the
1437!--             respective layer. Layer with moisture below wilting point will
1438!--             not contribute, which reflects the preference of plants to
1439!--             take water from moister layers.
1440
1441!
1442!--             Calculate the root extraction (ECMWF 7.69, modified so that the
1443!--             sum of root_extr = 1). The energy balance solver guarantees a
1444!--             positive transpiration, so that there is no need for an
1445!--             additional check.
1446
1447                m_total = 0.0_wp
1448                DO k = nzb_soil, nzt_soil
1449                    IF ( m_soil(k,j,i) .GT. m_wilt(j,i) )  THEN
1450                       m_total = m_total + root_fr(k,j,i) * m_soil(k,j,i)
1451                    ENDIF
1452                ENDDO 
1453
1454                DO k = nzb_soil, nzt_soil 
1455                   IF ( m_soil(k,j,i) .GT. m_wilt(j,i) )  THEN
1456                      root_extr(k) = root_fr(k,j,i) * m_soil(k,j,i) / m_total
1457                   ELSE
1458                      root_extr(k) = 0.0_wp
1459                   ENDIF
1460                ENDDO
1461
1462!
1463!--             Prognostic equation for soil water content m_soil
1464                tend(:) = 0.0_wp
1465                tend(nzb_soil) = ( lambda_w(nzb_soil,j,i) * (                  &
1466                            m_soil(nzb_soil+1,j,i) - m_soil(nzb_soil,j,i) )    &
1467                            * ddz_soil(nzb_soil) - gamma_w(nzb_soil,j,i) - (   &
1468                            root_extr(nzb_soil) * qsws_veg_eb(j,i)             &
1469                            + qsws_soil_eb(j,i) ) * drho_l_lv )                &
1470                            * ddz_soil_stag(nzb_soil)
1471
1472                DO  k = nzb_soil+1, nzt_soil-1
1473                   tend(k) = ( lambda_w(k,j,i) * ( m_soil(k+1,j,i)             &
1474                               - m_soil(k,j,i) ) * ddz_soil(k) - gamma_w(k,j,i)&
1475                               - lambda_w(k-1,j,i) * (m_soil(k,j,i) -          &
1476                               m_soil(k-1,j,i)) * ddz_soil(k-1)                &
1477                               + gamma_w(k-1,j,i) - (root_extr(k)              &
1478                               * qsws_veg_eb(j,i) * drho_l_lv)                 &
1479                             ) * ddz_soil_stag(k)
1480
1481                ENDDO
1482                tend(nzt_soil) = ( - gamma_w(nzt_soil,j,i)                     &
1483                                        - lambda_w(nzt_soil-1,j,i)             &
1484                                        * (m_soil(nzt_soil,j,i)                &
1485                                        - m_soil(nzt_soil-1,j,i))              &
1486                                        * ddz_soil(nzt_soil-1)                 &
1487                                        + gamma_w(nzt_soil-1,j,i) - (          &
1488                                          root_extr(nzt_soil)                  &
1489                                        * qsws_veg_eb(j,i) * drho_l_lv  )      &
1490                                      ) * ddz_soil_stag(nzt_soil)             
1491
1492                m_soil_p(nzb_soil:nzt_soil,j,i) = m_soil(nzb_soil:nzt_soil,j,i)&
1493                                                + dt_3d * ( tsc(2) * tend(:)   &
1494                                                + tsc(3) * tm_soil_m(:,j,i) )   
1495
1496!
1497!--             Account for dry soils (find a better solution here!)
1498                m_soil_p(:,j,i) = MAX(m_soil_p(:,j,i),0.0_wp)
1499
1500!
1501!--             Calculate m_soil tendencies for the next Runge-Kutta step
1502                IF ( timestep_scheme(1:5) == 'runge' )  THEN
1503                   IF ( intermediate_timestep_count == 1 )  THEN
1504                      DO  k = nzb_soil, nzt_soil
1505                         tm_soil_m(k,j,i) = tend(k)
1506                      ENDDO
1507                   ELSEIF ( intermediate_timestep_count <                      &
1508                            intermediate_timestep_count_max )  THEN
1509                      DO  k = nzb_soil, nzt_soil
1510                         tm_soil_m(k,j,i) = -9.5625_wp * tend(k) + 5.3125_wp   &
1511                                     * tm_soil_m(k,j,i)
1512                      ENDDO
1513                   ENDIF
1514                ENDIF
1515
1516             ENDIF
1517
1518          ENDDO
1519       ENDDO
1520
1521!
1522!--    Calculate surface specific humidity
1523       IF ( humidity )  THEN
1524          CALL calc_q_surface
1525       ENDIF
1526
1527
1528    END SUBROUTINE lsm_soil_model
1529
1530
1531!------------------------------------------------------------------------------!
1532! Description:
1533! ------------
1534! Calculation of specific humidity of the surface layer (surface)
1535!------------------------------------------------------------------------------!
1536    SUBROUTINE calc_q_surface
1537
1538       IMPLICIT NONE
1539
1540       INTEGER :: i              !: running index
1541       INTEGER :: j              !: running index
1542       INTEGER :: k              !: running index
1543       REAL(wp) :: resistance    !: aerodynamic and soil resistance term
1544
1545       DO i = nxlg, nxrg   
1546          DO j = nysg, nyng
1547             k = nzb_s_inner(j,i)
1548
1549!
1550!--          Calculate water vapour pressure at saturation
1551             e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surface(j,i)     &
1552                                              - 273.16_wp ) / ( t_surface(j,i) &
1553                                              - 35.86_wp ) )
1554
1555!
1556!--          Calculate specific humidity at saturation
1557             q_s = 0.622_wp * e_s / surface_pressure
1558
1559
1560             resistance = r_a(j,i) / (r_a(j,i) + r_s(j,i))
1561
1562!
1563!--          Calculate specific humidity at surface
1564             q_p(k,j,i) = resistance * q_s + (1.0_wp - resistance)             &
1565                          * q_p(k+1,j,i)
1566
1567          ENDDO
1568       ENDDO
1569
1570    END SUBROUTINE calc_q_surface
1571
1572!------------------------------------------------------------------------------!
1573! Description:
1574! ------------
1575! Swapping of timelevels
1576!------------------------------------------------------------------------------!
1577    SUBROUTINE lsm_swap_timelevel ( mod_count )
1578
1579       IMPLICIT NONE
1580
1581       INTEGER, INTENT(IN) :: mod_count
1582
1583#if defined( __nopointer )
1584
1585       t_surface    = t_surface_p
1586       t_soil       = t_soil_p
1587       IF ( humidity )  THEN
1588          m_soil    = m_soil_p
1589          m_liq_eb  = m_liq_eb_p
1590       ENDIF
1591
1592#else
1593   
1594       SELECT CASE ( mod_count )
1595
1596          CASE ( 0 )
1597
1598             t_surface = t_surface_p
1599             t_soil    = t_soil_p
1600             IF ( humidity )  THEN
1601                m_soil    = m_soil_p
1602                m_liq_eb  = m_liq_eb_p
1603             ENDIF
1604
1605
1606          CASE ( 1 )
1607
1608             t_surface  => t_surface_1; t_surface_p  => t_surface_2
1609             t_soil     => t_soil_1;    t_soil_p     => t_soil_2
1610             IF ( humidity )  THEN
1611                m_soil    => m_soil_1;   m_soil_p    => m_soil_2
1612                m_liq_eb  => m_liq_eb_1; m_liq_eb_p  => m_liq_eb_2
1613             ENDIF
1614
1615       END SELECT
1616#endif
1617
1618    END SUBROUTINE lsm_swap_timelevel
1619
1620
1621 END MODULE land_surface_model_mod
Note: See TracBrowser for help on using the repository browser.