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

Last change on this file since 1513 was 1513, checked in by heinze, 9 years ago

bugfix: provide REAL constants with _wp in call of MAX and MIN

  • Property svn:keywords set to Id
File size: 53.7 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! Bugfix: REAL constants provided with KIND-attribute in call of
23! intrinsic function MAX and MIN
24!
25! Former revisions:
26! -----------------
27! $Id: land_surface_model.f90 1513 2014-12-19 09:14:10Z heinze $
28!
29! 1500 2014-12-03 17:42:41Z maronga
30! Corrected calculation of aerodynamic resistance (r_a).
31! Precipitation is now added to liquid water reservoir using LE_liq.
32! Added support for dry runs.
33!
34! 1496 2014-12-02 17:25:50Z maronga
35! Initial revision
36!
37!
38! Description:
39! ------------
40! Land surface model, consisting of a solver for the energy balance at the
41! surface and a four layer soil scheme. The scheme is similar to the TESSEL
42! scheme implemented in the ECMWF IFS model, with modifications according to
43! H-TESSEL. The implementation is based on the formulation implemented in the
44! DALES model.
45!
46! To do list:
47! -----------
48! - Add support for binary I/O support
49! - Add support for lsm data output
50! - Check for time step criterion
51! - Check use with RK-2 and Euler time-stepping
52! - Adaption for use with cloud physics (liquid water potential temperature)
53! - Check reaction of plants at wilting point and at atmospheric saturation
54! - Consider partial absorption of the net shortwave radiation by the skin layer
55! - Allow for water surfaces, check performance for bare soils
56!------------------------------------------------------------------------------!
57     USE arrays_3d,                                                            &
58         ONLY:  pt, pt_p, q, q_p, qsws, rif, shf, ts, us, z0, z0h
59
60     USE cloud_parameters,                                                     &
61         ONLY: cp, l_d_r, l_v, precipitation_rate, rho_l, r_d, r_v
62
63     USE control_parameters,                                                   &
64         ONLY: dt_3d, humidity, intermediate_timestep_count,                   &
65               intermediate_timestep_count_max, precipitation, pt_surface,     &
66               rho_surface, surface_pressure, timestep_scheme, tsc
67
68     USE indices,                                                              &
69         ONLY: nxlg, nxrg, nyng, nysg, nzb_s_inner 
70
71     USE kinds
72
73     USE radiation_model_mod,                                                  &
74         ONLY: Rn, SW_in, sigma_SB
75
76
77    IMPLICIT NONE
78
79!
80!-- LSM model constants
81    INTEGER(iwp), PARAMETER :: soil_layers = 4 !: number of soil layers (fixed for now)
82
83    REAL(wp), PARAMETER ::                     &
84              b_CH               = 6.04_wp,    & ! Clapp & Hornberger exponent
85              lambda_h_dry       = 0.19_wp,    & ! heat conductivity for dry soil
86              lambda_h_sm        = 3.44_wp,    & ! heat conductivity of the soil matrix
87              lambda_h_water     = 0.57_wp,    & ! heat conductivity of water
88              psi_sat            = -0.388_wp,  & ! soil matrix potential at saturation
89              rhoC_soil          = 2.19E6_wp,  & ! volumetric heat capacity of soil
90              rhoC_water         = 4.20E6_wp,  & ! volumetric heat capacity of water
91              m_max_depth        = 0.0002_wp     ! Maximum capacity of the water reservoir (m)
92
93
94!
95!-- LSM variables
96    INTEGER(iwp) :: veg_type  = 2, & !: vegetation type, 0: user-defined, 1-19: generic (see list)
97                    soil_type = 3    !: soil type, 0: user-defined, 1-6: generic (see list)
98
99    LOGICAL :: conserve_water_content = .TRUE., & !: open or closed bottom surface for the soil model
100               land_surface = .FALSE.             !: flag parameter indicating wheather the lsm is used
101
102!   value 9999999.9_wp -> generic available or user-defined value must be set
103!   otherwise -> no generic variable and user setting is optional
104    REAL(wp) :: alpha_VanGenuchten = 0.0_wp,            & !: NAMELIST alpha_VG
105                canopy_resistance_coefficient = 0.0_wp, & !: NAMELIST gD
106                C_skin   = 20000.0_wp,                  & !: Skin heat capacity
107                drho_l_lv,                              & !: (rho_l * l_v)**-1
108                exn,                                    & !: value of the Exner function
109                e_s = 0.0_wp,                           & !: saturation water vapour pressure
110                field_capacity = 0.0_wp,                & !: NAMELIST m_fc
111                f_shortwave_incoming = 9999999.9_wp,    & !: NAMELIST f_SW_in
112                hydraulic_conductivity = 0.0_wp,        & !: NAMELIST gamma_w_sat
113                Ke = 0.0_wp,                            & !: Kersten number
114                lambda_skin_stable = 9999999.9_wp,      & !: NAMELIST lambda_skin_s
115                lambda_skin_unstable = 9999999.9_wp,    & !: NAMELIST lambda_skin_u
116                leaf_area_index = 9999999.9_wp,         & !: NAMELIST LAI
117                l_VanGenuchten = 0.0_WP,                & !: NAMELIST l_VG
118                min_canopy_resistance = 110.0_wp,       & !: NAMELIST r_s_min
119                m_total = 0.0_wp,                       & !: weighed total water content of the soil (m3/m3)
120                n_VanGenuchten = 0.0_WP,                & !: NAMELIST n_VG
121                q_s = 0.0_wp,                           & !: saturation specific humidity
122                residual_moisture = 0.0_wp,             & !: NAMELIST m_res
123                rho_cp,                                 & !: rho_surface * cp
124                rho_lv,                                 & !: rho * l_v
125                rd_d_rv,                                & !: r_d / r_v
126                saturation_moisture = 0.0_wp,           & !: NAMELIST m_sat
127                vegetation_coverage = 9999999.9_wp,     & !: NAMELIST c_veg
128                wilting_point = 0.0_wp                    !: NAMELIST m_wilt
129
130    REAL(wp), DIMENSION(0:soil_layers-1) :: &
131              ddz_soil,                     & !: 1/dz_soil
132              ddz_soil_stag,                & !: 1/dz_soil_stag
133              dz_soil,                      & !: soil grid spacing (center-center)
134              dz_soil_stag,                 & !: soil grid spacing (edge-edge)
135              root_extr = 0.0_wp,           & !: root extraction
136              root_fraction = (/0.35_wp, 0.38_wp, 0.23_wp, 0.04_wp/), & !: distribution of root surface area to the individual soil layers
137              soil_level = (/0.07_wp, 0.28_wp, 1.00_wp,  2.89_wp/),   & !: soil layer depths (m)
138              soil_moisture = 0.0_wp          !: soil moisture content (m3/m3)
139
140    REAL(wp), DIMENSION(0:soil_layers) ::   &
141              soil_temperature = 9999999.9_wp !: soil temperature (K)
142
143#if defined( __nopointer )
144    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: T_0,    & !: skin temperature (K)
145                                                     T_0_p,  & !: progn. skin temperature (K)
146                                                     m_liq,  & !: liquid water reservoir (m)
147                                                     m_liq_p   !: progn. liquid water reservoir (m)
148#else
149    REAL(wp), DIMENSION(:,:), POINTER :: T_0,   &
150                                         T_0_p, & 
151                                         m_liq, & 
152                                         m_liq_p
153
154    REAL(wp), DIMENSION(:,:), ALLOCATABLE, TARGET :: T_0_1, T_0_2,    &
155                                                     m_liq_1, m_liq_2
156#endif
157
158!
159!-- Temporal tendencies for time stepping           
160    REAL(wp), DIMENSION(:,:), ALLOCATABLE :: tT_0_m,  & !: skin temperature tendency (K)
161                                             tm_liq_m   !: liquid water reservoir tendency (m)
162
163!
164!-- Energy balance variables               
165    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::                                   &
166              alpha_VG,      & !: coef. of Van Genuchten
167              c_liq,         & !: liquid water coverage (of vegetated area)
168              c_veg,         & !: vegetation coverage   
169              f_SW_in,       & !: ?
170              G,             & !: surface soil heat flux
171              H,             & !: surface flux of sensible heat
172              gamma_w_sat,   & !: hydraulic conductivity at saturation
173              gD,            & !: coefficient for dependence of r_canopy on water vapour pressure deficit
174              LAI,           & !: leaf area index
175              LE,            & !: surface flux of latent heat (total)
176              LE_veg,        & !: surface flux of latent heat (vegetation portion)
177              LE_soil,       & !: surface flux of latent heat (soil portion)
178              LE_liq,        & !: surface flux of latent heat (liquid water portion)
179              lambda_h_sat,  & !: heat conductivity for dry soil
180              lambda_skin_s, & !: coupling between skin and soil (depends on vegetation type)
181              lambda_skin_u, & !: coupling between skin and soil (depends on vegetation type)
182              l_VG,          & !: coef. of Van Genuchten
183              m_fc,          & !: soil moisture at field capacity (m3/m3)
184              m_res,         & !: residual soil moisture
185              m_sat,         & !: saturation soil moisture (m3/m3)
186              m_wilt,        & !: soil moisture at permanent wilting point (m3/m3)
187              n_VG,          & !: coef. Van Genuchten 
188              r_a,           & !: aerodynamic resistance
189              r_canopy,      & !: canopy resistance
190              r_soil,        & !: soil resitance
191              r_soil_min,    & !: minimum soil resistance
192              r_s,           & !: total surface resistance (combination of r_soil and r_canopy)         
193              r_s_min          !: minimum canopy resistance
194
195    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::                                 &
196              lambda_h, &   !: heat conductivity of soil (?)                           
197              lambda_w, &   !: hydraulic diffusivity of soil (?)
198              gamma_w,  &   !: hydraulic conductivity of soil (?)
199              rhoC_total    !: volumetric heat capacity of the actual soil matrix (?)
200
201#if defined( __nopointer )
202    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET ::                         &
203              T_soil,    & !: Soil temperature (K)
204              T_soil_p,  & !: Prog. soil temperature (K)
205              m_soil,    & !: Soil moisture (m3/m3)
206              m_soil_p     !: Prog. soil moisture (m3/m3)
207#else
208    REAL(wp), DIMENSION(:,:,:), POINTER ::                                     &
209              T_soil, T_soil_p, &
210              m_soil, m_soil_p   
211
212    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, TARGET ::                         &
213              T_soil_1, T_soil_2, &
214              m_soil_1, m_soil_2
215
216
217#endif
218
219
220    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::                                 &
221              tT_soil_m, & !: T_soil storage array
222              tm_soil_m, & !: m_soil storage array
223              root_fr      !: root fraction (sum=1)
224
225!
226!--  Land surface parameters according to the following classes (veg_type)
227!--  (0 user defined)
228!--  1 crops, mixed farming
229!--  2 short grass
230!--  3 evergreen needleleaf trees
231!--  4 deciduous needleleaf trees
232!--  5 evergreen broadleaf trees
233!--  6 deciduous broadleaf trees
234!--  7 tall grass
235!--  8 desert
236!--  9 tundra
237!-- 10 irrigated crops
238!-- 11 semidesert
239!-- 12 ice caps and glaciers
240!-- 13 bogs and marshes
241!-- 14 inland water
242!-- 15 ocean
243!-- 16 evergreen shrubs
244!-- 17 deciduous shrubs
245!-- 18 mixed forest/woodland
246!-- 19 interrupted forest
247
248!
249!-- Land surface parameters I     r_s_min,     LAI,   c_veg,      gD
250    REAL(wp), DIMENSION(0:3,1:19) :: veg_pars = RESHAPE( (/           &
251                                 180.0_wp, 3.00_wp, 0.90_wp, 0.00_wp, & !  1
252                                 110.0_wp, 2.00_wp, 0.85_wp, 0.00_wp, & !  2
253                                 500.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, & !  3
254                                 500.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, & !  4
255                                 175.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, & !  5
256                                 240.0_wp, 6.00_wp, 0.99_wp, 0.13_wp, & !  6
257                                 100.0_wp, 2.00_wp, 0.70_wp, 0.00_wp, & !  7
258                                 250.0_wp, 0.50_wp, 0.00_wp, 0.00_wp, & !  8
259                                  80.0_wp, 1.00_wp, 0.50_wp, 0.00_wp, & !  9
260                                 180.0_wp, 3.00_wp, 0.90_wp, 0.00_wp, & ! 10
261                                 150.0_wp, 0.50_wp, 0.10_wp, 0.00_wp, & ! 11
262                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 12
263                                 240.0_wp, 4.00_wp, 0.60_wp, 0.00_wp, & ! 13
264                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 14
265                                   0.0_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 15
266                                 225.0_wp, 3.00_wp, 0.50_wp, 0.00_wp, & ! 16
267                                 225.0_wp, 1.50_wp, 0.50_wp, 0.00_wp, & ! 17
268                                 250.0_wp, 5.00_wp, 0.90_wp, 0.03_wp, & ! 18
269                                 175.0_wp, 2.50_wp, 0.90_wp, 0.03_wp  & ! 19
270                                 /), (/ 4, 19 /) )
271
272!
273!-- Land surface parameters II          z0,         z0h
274    REAL(wp), DIMENSION(0:1,1:19) :: roughness_par = RESHAPE( (/ & 
275                                   0.25_wp,  0.25E-2_wp,         & !  1
276                                   0.20_wp,  0.20E-2_wp,         & !  2
277                                   2.00_wp,     2.00_wp,         & !  3
278                                   2.00_wp,     2.00_wp,         & !  4
279                                   2.00_wp,     2.00_wp,         & !  5
280                                   2.00_wp,     2.00_wp,         & !  6
281                                   0.47_wp,  0.47E-2_wp,         & !  7
282                                  0.013_wp, 0.013E-2_wp,         & !  8
283                                  0.034_wp, 0.034E-2_wp,         & !  9
284                                    0.5_wp,  0.50E-2_wp,         & ! 10
285                                   0.17_wp,  0.17E-2_wp,         & ! 11
286                                 1.3E-3_wp,   1.3E-4_wp,         & ! 12
287                                   0.83_wp,  0.83E-2_wp,         & ! 13
288                                   0.00_wp,  0.00E-2_wp,         & ! 14
289                                   0.00_wp,  0.00E-2_wp,         & ! 15
290                                   0.10_wp,  0.10E-2_wp,         & ! 16
291                                   0.25_wp,  0.25E-2_wp,         & ! 17
292                                   2.00_wp,  2.00E-2_wp,         & ! 18
293                                   1.10_wp,  1.10E-2_wp          & ! 19
294                                 /), (/ 2, 19 /) )
295
296!
297!-- Land surface parameters III lambda_skin_s, lambda_skin_u, f_SW_in
298    REAL(wp), DIMENSION(0:2,1:19) :: skin_pars = RESHAPE( (/           &
299                                      10.0_wp,       10.0_wp, 0.05_wp, & !  1
300                                      10.0_wp,       10.0_wp, 0.05_wp, & !  2
301                                      20.0_wp,       15.0_wp, 0.03_wp, & !  3
302                                      20.0_wp,       15.0_wp, 0.03_wp, & !  4
303                                      20.0_wp,       15.0_wp, 0.03_wp, & !  5
304                                      20.0_wp,       15.0_wp, 0.03_wp, & !  6
305                                      10.0_wp,       10.0_wp, 0.05_wp, & !  7
306                                      15.0_wp,       15.0_wp, 0.00_wp, & !  8
307                                      10.0_wp,       10.0_wp, 0.05_wp, & !  9
308                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 10
309                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 11
310                                      58.0_wp,       58.0_wp, 0.00_wp, & ! 12
311                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 13
312                                    1.0E20_wp,     1.0E20_wp, 0.00_wp, & ! 14
313                                    1.0E20_wp,     1.0E20_wp, 0.00_wp, & ! 15
314                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 16
315                                      10.0_wp,       10.0_wp, 0.05_wp, & ! 17
316                                      20.0_wp,       15.0_wp, 0.03_wp, & ! 18
317                                      20.0_wp,       15.0_wp, 0.03_wp  & ! 19
318                                      /), (/ 3, 19 /) )
319
320!
321!-- Root distribution (sum = 1)  level 1, level 2, level 3, level 4,
322    REAL(wp), DIMENSION(0:3,1:19) :: root_distribution = RESHAPE( (/ &
323                                 0.24_wp, 0.41_wp, 0.31_wp, 0.04_wp, & !  1
324                                 0.35_wp, 0.38_wp, 0.23_wp, 0.04_wp, & !  2
325                                 0.26_wp, 0.39_wp, 0.29_wp, 0.06_wp, & !  3
326                                 0.26_wp, 0.38_wp, 0.29_wp, 0.07_wp, & !  4
327                                 0.24_wp, 0.38_wp, 0.31_wp, 0.07_wp, & !  5
328                                 0.25_wp, 0.34_wp, 0.27_wp, 0.14_wp, & !  6
329                                 0.27_wp, 0.27_wp, 0.27_wp, 0.09_wp, & !  7
330                                 1.00_wp, 0.00_wp, 0.00_wp, 0.00_wp, & !  8
331                                 0.47_wp, 0.45_wp, 0.08_wp, 0.00_wp, & !  9
332                                 0.24_wp, 0.41_wp, 0.31_wp, 0.04_wp, & ! 10
333                                 0.17_wp, 0.31_wp, 0.33_wp, 0.19_wp, & ! 11
334                                 0.00_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 12
335                                 0.25_wp, 0.34_wp, 0.27_wp, 0.11_wp, & ! 13
336                                 0.00_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 14
337                                 0.00_wp, 0.00_wp, 0.00_wp, 0.00_wp, & ! 15
338                                 0.23_wp, 0.36_wp, 0.30_wp, 0.11_wp, & ! 16
339                                 0.23_wp, 0.36_wp, 0.30_wp, 0.11_wp, & ! 17
340                                 0.19_wp, 0.35_wp, 0.36_wp, 0.10_wp, & ! 18
341                                 0.19_wp, 0.35_wp, 0.36_wp, 0.10_wp  & ! 19
342                                 /), (/ 4, 19 /) )
343
344!
345!-- Soil parameters according to the following porosity classes (soil_type)
346!-- (0 user defined)
347!-- 1 coarse
348!-- 2 medium
349!-- 3 medium-fine
350!-- 4 fine
351!-- 5 very fine
352!-- 6 organic
353!
354!-- Soil parameters I           alpha_VG,      l_VG,    n_VG, gamma_w_sat
355    REAL(wp), DIMENSION(0:3,1:6) :: soil_pars = RESHAPE( (/                &
356                                 3.83_wp,  1.250_wp, 1.38_wp,  6.94E-6_wp, & ! 1
357                                 3.14_wp, -2.342_wp, 1.28_wp,  1.16E-6_wp, & ! 2
358                                 0.83_wp, -0.588_wp, 1.25_wp,  0.26E-6_wp, & ! 3
359                                 3.67_wp, -1.977_wp, 1.10_wp,  2.87E-6_wp, & ! 4
360                                 2.65_wp,  2.500_wp, 1.10_wp,  1.74E-6_wp, & ! 5
361                                 1.30_wp,  0.400_wp, 1.20_wp,  0.93E-6_wp  & ! 6
362                                 /), (/ 4, 6 /) )
363
364!
365!-- Soil parameters II              m_sat,     m_fc,   m_wilt,    m_res 
366    REAL(wp), DIMENSION(0:3,1:6) :: m_soil_pars = RESHAPE( (/            &
367                                 0.403_wp, 0.244_wp, 0.059_wp, 0.025_wp, & ! 1
368                                 0.439_wp, 0.347_wp, 0.151_wp, 0.010_wp, & ! 2
369                                 0.430_wp, 0.383_wp, 0.133_wp, 0.010_wp, & ! 3
370                                 0.520_wp, 0.448_wp, 0.279_wp, 0.010_wp, & ! 4
371                                 0.614_wp, 0.541_wp, 0.335_wp, 0.010_wp, & ! 5
372                                 0.766_wp, 0.663_wp, 0.267_wp, 0.010_wp  & ! 6
373                                 /), (/ 4, 6 /) )
374
375
376    SAVE
377
378
379    PRIVATE
380
381
382    PUBLIC alpha_VanGenuchten, C_skin, canopy_resistance_coefficient,          &
383           conserve_water_content,      field_capacity, f_shortwave_incoming,  &
384           hydraulic_conductivity, init_lsm, lambda_skin_stable,               &
385           lambda_skin_unstable, land_surface, leaf_area_index,                &
386           lsm_energy_balance, lsm_soil_model, l_VanGenuchten,                 &
387           min_canopy_resistance, n_VanGenuchten, residual_moisture,           &
388           root_fraction, saturation_moisture, soil_level, soil_moisture,      &
389           soil_temperature, soil_type, vegetation_coverage, veg_type,         &
390           wilting_point
391
392#if defined( __nopointer )
393    PUBLIC m_liq, m_liq_p, m_soil, m_soil_p, T_0, T_0_p, T_soil, T_soil_p
394#else
395    PUBLIC m_liq, m_liq_1, m_liq_2, m_liq_p, m_soil, m_soil_1, m_soil_2,       &
396           m_soil_p, T_0, T_0_1, T_0_2, T_0_p, T_soil, T_soil_1, T_soil_2,     &
397           T_soil_p
398#endif
399
400
401    INTERFACE init_lsm
402       MODULE PROCEDURE init_lsm
403    END INTERFACE init_lsm
404
405    INTERFACE lsm_energy_balance
406       MODULE PROCEDURE lsm_energy_balance
407    END INTERFACE lsm_energy_balance
408
409    INTERFACE lsm_soil_model
410       MODULE PROCEDURE lsm_soil_model
411    END INTERFACE lsm_soil_model
412
413
414 CONTAINS
415
416
417!------------------------------------------------------------------------------!
418! Description:
419! ------------
420!-- Initialization of the land surface model
421!------------------------------------------------------------------------------!
422    SUBROUTINE init_lsm
423   
424
425       IMPLICIT NONE
426
427       INTEGER(iwp) ::  i !: running index
428       INTEGER(iwp) ::  j !: running index
429       INTEGER(iwp) ::  k !: running index
430
431
432!
433!--    Calculate frequently used parameters
434       rho_cp    = cp * rho_surface
435       rd_d_rv   = r_d / r_v
436       rho_lv    = rho_surface * l_v
437       drho_l_lv = 1.0 / (rho_l * l_v)
438
439!
440!--    Allocate skin and soil temperature / humidity
441#if defined( __nopointer )
442       ALLOCATE ( T_0(nysg:nyng,nxlg:nxrg) )
443       ALLOCATE ( T_0_p(nysg:nyng,nxlg:nxrg) )
444#else
445       ALLOCATE ( T_0_1(nysg:nyng,nxlg:nxrg) )
446       ALLOCATE ( T_0_2(nysg:nyng,nxlg:nxrg) )
447#endif
448
449       ALLOCATE ( tT_0_m(nysg:nyng,nxlg:nxrg) )
450
451#if defined( __nopointer )
452       ALLOCATE ( T_soil(0:soil_layers,nysg:nyng,nxlg:nxrg) )
453       ALLOCATE ( T_soil_p(0:soil_layers,nysg:nyng,nxlg:nxrg) )
454#else
455       ALLOCATE ( T_soil_1(0:soil_layers,nysg:nyng,nxlg:nxrg) )
456       ALLOCATE ( T_soil_2(0:soil_layers,nysg:nyng,nxlg:nxrg) )
457#endif
458
459       ALLOCATE ( tT_soil_m(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
460
461#if defined( __nopointer )
462       ALLOCATE ( m_liq(nysg:nyng,nxlg:nxrg) )
463       ALLOCATE ( m_liq_p(nysg:nyng,nxlg:nxrg) )
464#else
465       ALLOCATE ( m_liq_1(nysg:nyng,nxlg:nxrg) )
466       ALLOCATE ( m_liq_2(nysg:nyng,nxlg:nxrg) )
467#endif
468
469       ALLOCATE ( tm_liq_m(nysg:nyng,nxlg:nxrg) )
470
471#if defined( __nopointer )
472       ALLOCATE ( m_soil(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
473       ALLOCATE ( m_soil_p(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
474#else
475       ALLOCATE ( m_soil_1(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
476       ALLOCATE ( m_soil_2(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
477#endif
478
479       ALLOCATE ( tm_soil_m(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
480
481
482#if ! defined( __nopointer )
483!
484!--    Initial assignment of the pointers
485       T_soil => T_soil_1; T_soil_p => T_soil_2
486       T_0 => T_0_1; T_0_p => T_0_2
487       m_soil => m_soil_1; m_soil_p => m_soil_2
488       m_liq => m_liq_1; m_liq_p => m_liq_2
489#endif
490
491       T_0    = 0.0_wp
492       T_0_p  = 0.0_wp
493       tT_0_m = 0.0_wp
494
495       T_soil    = 0.0_wp
496       T_soil_p  = 0.0_wp
497       tT_soil_m = 0.0_wp
498
499       m_liq    = 0.0_wp
500       m_liq_p  = 0.0_wp
501       tm_liq_m = 0.0_wp
502
503       m_soil    = 0.0_wp
504       m_soil_p  = 0.0_wp
505       tm_soil_m = 0.0_wp
506
507!
508!--    Allocate 2D vegetation model arrays
509       ALLOCATE ( alpha_VG(nysg:nyng,nxlg:nxrg) )
510       ALLOCATE ( c_liq(nysg:nyng,nxlg:nxrg) )
511       ALLOCATE ( c_veg(nysg:nyng,nxlg:nxrg) )
512       ALLOCATE ( f_SW_in(nysg:nyng,nxlg:nxrg) )
513       ALLOCATE ( G(nysg:nyng,nxlg:nxrg) )
514       ALLOCATE ( H(nysg:nyng,nxlg:nxrg) )
515       ALLOCATE ( gamma_w_sat(nysg:nyng,nxlg:nxrg) )
516       ALLOCATE ( gD(nysg:nyng,nxlg:nxrg) )
517       ALLOCATE ( LAI(nysg:nyng,nxlg:nxrg) )
518       ALLOCATE ( LE(nysg:nyng,nxlg:nxrg) )
519       ALLOCATE ( LE_veg(nysg:nyng,nxlg:nxrg) )
520       ALLOCATE ( LE_soil(nysg:nyng,nxlg:nxrg) )
521       ALLOCATE ( LE_liq(nysg:nyng,nxlg:nxrg) )
522       ALLOCATE ( l_VG(nysg:nyng,nxlg:nxrg) )
523       ALLOCATE ( lambda_h_sat(nysg:nyng,nxlg:nxrg) )
524       ALLOCATE ( lambda_skin_u(nysg:nyng,nxlg:nxrg) )
525       ALLOCATE ( lambda_skin_s(nysg:nyng,nxlg:nxrg) )
526       ALLOCATE ( m_fc(nysg:nyng,nxlg:nxrg) )
527       ALLOCATE ( m_res(nysg:nyng,nxlg:nxrg) )
528       ALLOCATE ( m_sat(nysg:nyng,nxlg:nxrg) )
529       ALLOCATE ( m_wilt(nysg:nyng,nxlg:nxrg) )
530       ALLOCATE ( n_VG(nysg:nyng,nxlg:nxrg) )
531       ALLOCATE ( r_a(nysg:nyng,nxlg:nxrg) )
532       ALLOCATE ( r_canopy(nysg:nyng,nxlg:nxrg) )
533       ALLOCATE ( r_soil(nysg:nyng,nxlg:nxrg) )
534       ALLOCATE ( r_soil_min(nysg:nyng,nxlg:nxrg) )
535       ALLOCATE ( r_s(nysg:nyng,nxlg:nxrg) )
536       ALLOCATE ( r_s_min(nysg:nyng,nxlg:nxrg) )
537
538!
539!--    Set initial and default values
540       c_liq   = 0.0_wp
541       c_veg   = 0.0_wp
542       f_SW_in = 0.05_wp
543       gD      = 0.0_wp
544       LAI     = 0.0_wp
545       lambda_skin_u = 10.0_wp
546       lambda_skin_s = 10.0_wp
547
548
549       G       = 0.0_wp
550       H       = rho_cp * shf
551
552       IF ( humidity )  THEN
553          LE = rho_l * l_v * qsws
554       ELSE
555          LE = 0.0_wp
556       ENDIF
557
558       LE_veg  = 0.0_wp
559       LE_soil = LE
560       LE_liq  = 0.0_wp
561
562       r_a        = 50.0_wp
563       r_canopy   = 0.0_wp
564       r_soil     = 0.0_wp
565       r_soil_min = 50.0_wp
566       r_s        = 110.0_wp
567       r_s_min    = min_canopy_resistance
568
569!
570!--    Allocate 3D soil model arrays
571       ALLOCATE ( root_fr(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
572       ALLOCATE ( lambda_h(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
573       ALLOCATE ( rhoC_total(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
574
575       lambda_h = 0.0_wp
576!
577!--    If required, allocate humidity-related variables for the soil model
578       IF ( humidity )  THEN
579          ALLOCATE ( lambda_w(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )
580          ALLOCATE ( gamma_w(0:soil_layers-1,nysg:nyng,nxlg:nxrg) )   
581
582          lambda_w = 0.0_wp 
583       ENDIF
584
585!
586!--    Calculate grid spacings. Temperature and moisture are defined at
587!--    the center of the soil layers, whereas gradients/fluxes are defined
588!--    at the edges (_stag)
589       dz_soil_stag(0) = soil_level(0)
590
591       DO k = 1, soil_layers-1
592          dz_soil_stag(k) = soil_level(k) - soil_level(k-1)
593       ENDDO
594
595       DO k = 0, soil_layers-2
596          dz_soil(k) = 0.5 * (dz_soil_stag(k+1) + dz_soil_stag(k))
597       ENDDO
598       dz_soil(soil_layers-1) = dz_soil_stag(soil_layers-1)
599
600       ddz_soil      = 1.0 / dz_soil
601       ddz_soil_stag = 1.0 / dz_soil_stag
602!
603!--    Initialize soil
604       IF ( soil_type .NE. 0 )  THEN   
605          alpha_VG    = soil_pars(0,soil_type)
606          l_VG        = soil_pars(1,soil_type)
607          n_VG        = soil_pars(2,soil_type)   
608          gamma_w_sat = soil_pars(3,soil_type) 
609          m_sat       = m_soil_pars(0,soil_type)
610          m_fc        = m_soil_pars(1,soil_type)   
611          m_wilt      = m_soil_pars(2,soil_type) 
612          m_res       = m_soil_pars(3,soil_type)
613       ELSE
614          alpha_VG    = alpha_VanGenuchten
615          l_VG        = l_VanGenuchten
616          n_VG        = n_VanGenuchten 
617          gamma_w_sat = hydraulic_conductivity
618          m_sat       = saturation_moisture
619          m_fc        = field_capacity
620          m_wilt      = wilting_point
621          m_res       = residual_moisture
622       ENDIF   
623
624!
625!--    Map user settings of T and q for each soil layer
626!--    (make sure that the soil moisture does not drop below the permanent
627!--    wilting point) -> problems with devision by zero)
628       DO k = 0, soil_layers-1
629          T_soil(k,:,:)  = soil_temperature(k)
630          m_soil(k,:,:)  = MAX(soil_moisture(k),m_wilt(:,:))
631       ENDDO
632       T_soil(soil_layers,:,:) = soil_temperature(soil_layers)
633
634
635       exn = ( surface_pressure / 1000.0_wp )**0.286_wp
636       T_0  = pt_surface * exn
637
638       T_soil_p = T_soil
639       m_soil_p = m_soil
640
641!
642!--    Calculate saturation soil heat conductivity
643       lambda_h_sat(:,:) = lambda_h_sm ** (1.0_wp - m_sat(:,:)) *              &
644                           lambda_h_water ** m_sat(:,:)
645
646!
647!--    Initialize vegetation
648       IF ( veg_type .NE. 0 )  THEN
649
650          r_s_min              = veg_pars(0,veg_type)
651          LAI                  = veg_pars(1,veg_type)
652          c_veg                = veg_pars(2,veg_type)
653          gD                   = veg_pars(3,veg_type)
654          lambda_skin_s        = skin_pars(0,veg_type)
655          lambda_skin_u        = skin_pars(1,veg_type)
656          f_SW_in              = skin_pars(2,veg_type)
657          z0                   = roughness_par(0,veg_type)
658          z0h                  = roughness_par(1,veg_type)
659
660
661          DO k = 0, soil_layers-1
662             root_fr(k,:,:) = root_distribution(k,veg_type)
663          ENDDO
664
665       ELSE
666
667          DO k = 0, soil_layers-1
668             root_fr(k,:,:) = root_fraction(k)
669          ENDDO
670
671       ENDIF
672
673!
674!--    Possibly do user-defined actions (e.g. define heterogeneous land surface)
675       CALL user_init_land_surface
676
677!
678!--    Set artifical values for ts and us so that r_a has its initial value for
679!--    the first time step
680       DO  i = nxlg, nxrg
681          DO  j = nysg, nyng
682             k = nzb_s_inner(j,i)
683!
684!--          Assure that r_a cannot be zero at model start
685             IF ( pt(k+1,j,i) == pt(k,j,i) )  pt(k+1,j,i) = pt(k+1,j,i) + 1.0E-10_wp
686
687             us(j,i) = 0.1_wp
688             ts(j,i) = (pt(k+1,j,i) - pt(k,j,i)) / r_a(j,i)
689             shf(j,i) = - us(j,i) * ts(j,i)
690          ENDDO
691       ENDDO
692
693!
694!--    Calculate humidity at the surface
695       IF ( humidity )  THEN
696          CALL calc_q0
697       ENDIF
698
699       RETURN
700
701    END SUBROUTINE init_lsm
702
703
704
705!------------------------------------------------------------------------------!
706! Description:
707! ------------
708!
709!------------------------------------------------------------------------------!
710    SUBROUTINE lsm_energy_balance
711
712
713       IMPLICIT NONE
714
715       INTEGER(iwp) ::  i         !: running index
716       INTEGER(iwp) ::  j         !: running index
717       INTEGER(iwp) ::  k, ks     !: running index
718
719       REAL(wp) :: f1,          & !: resistance correction term 1
720                   f2,          & !: resistance correction term 2
721                   f3,          & !: resistance correction term 3
722                   m_min,       & !: minimum soil moisture
723                   T_1,         & !: actual temperature at first grid point
724                   e,           & !: water vapour pressure
725                   e_s,         & !: water vapour saturation pressure
726                   e_s_dT,      & !: derivate of e_s with respect to T
727                   tend,        & !: tendency
728                   dq_s_dT,     & !: derivate of q_s with respect to T
729                   coef_1,      & !: coef. for prognostic equation
730                   coef_2,      & !: coef. for prognostic equation
731                   f_LE,        & !: factor for LE
732                   f_LE_veg,    & !: factor for LE_veg
733                   f_LE_soil,   & !: factor for LE_soil
734                   f_LE_liq,    & !: factor for LE_liq
735                   f_H,         & !: factor for H
736                   lambda_skin, & !: Current value of lambda_skin
737                   m_liq_max      !: maxmimum value of the liquid water reservoir
738
739!
740!--    Calculate the exner function for the current time step
741       exn = ( surface_pressure / 1000.0_wp )**0.286_wp
742
743
744       DO i = nxlg, nxrg
745          DO j = nysg, nyng
746             k = nzb_s_inner(j,i)
747
748!
749!--          Set lambda_skin according to stratification
750             IF ( rif(j,i) >= 0.0_wp )  THEN
751                lambda_skin = lambda_skin_s(j,i)
752             ELSE
753                lambda_skin = lambda_skin_u(j,i)
754             ENDIF
755
756!
757!--          First step: calculate aerodyamic resistance. As pt, us, ts
758!--          are not available for the prognostic time step, data from the last
759!--          time step is used here. Note that this formulation is the
760!--          equivalent to the ECMWF formulation using drag coefficients
761             r_a(j,i) = (pt(k+1,j,i) - pt(k,j,i)) / (ts(j,i) * us(j,i) + 1.0E-20)
762
763!
764!--          Second step: calculate canopy resistance r_canopy
765!--          f1-f3 here are defined as 1/f1-f3 as in ECMWF documentation
766 
767!--          f1: correction for incoming shortwave radiation
768             f1 = MIN(1.0_wp, ( 0.004_wp * SW_in(j,i) + 0.05_wp ) /     &
769                              (0.81_wp * (0.004_wp * SW_in(j,i) + 1.0_wp) ) )
770
771!
772!--          f2: correction for soil moisture f2=0 for very dry soil
773             m_total = 0.0_wp
774             DO ks = 0, soil_layers-1
775                 m_total = m_total + root_fr(ks,j,i) * m_soil(ks,j,i)
776             ENDDO 
777
778             IF (  m_total .GT. m_wilt(j,i) .AND. m_total .LE. m_fc(j,i) )  THEN
779                f2 = ( m_total - m_wilt(j,i) ) / (m_fc(j,i) - m_wilt(j,i) )
780             ELSE
781                f2 = 1.0E-20_wp
782             ENDIF
783
784!
785!--          Calculate water vapour pressure at saturation
786!--          (T_0 should be replaced by liquid water temp?!)
787             e_s = 0.01 * 610.78_wp * EXP( 17.269_wp * ( T_0(j,i) - 273.16_wp )&
788                                           / ( T_0(j,i) - 35.86_wp ) )
789
790!
791!--          f3: correction for vapour pressure deficit
792             IF ( gD(j,i) .NE. 0.0_wp )  THEN
793!
794!--             Calculate vapour pressure
795                e  = q_p(k+1,j,i) * surface_pressure / 0.622
796                f3 = EXP ( -gD(j,i) * (e_s - e) )
797             ELSE
798                f3 = 1.0_wp
799             ENDIF
800
801!
802!--          To do: check for very dry soil -> r_canopy goes to infinity
803             r_canopy(j,i)  = r_s_min(j,i) / (LAI(j,i) * f1 * f2 * f3 + 1.0E-20)
804
805!
806!--          Third step: calculate bare soil resistance r_soil
807             m_min = c_veg(j,i) * m_wilt(j,i) + (1.0_wp - c_veg(j,i)) *        &
808                     m_res(j,i)
809
810             f2 = ( m_soil(0,j,i) - m_min ) / ( m_fc(j,i) - m_min )
811             f2 = MAX(f2,1.0E-20_wp)
812
813             r_soil(j,i) = r_soil_min(j,i) / f2
814
815!
816!--          Calculate fraction of liquid water reservoir
817             m_liq_max = m_max_depth * LAI(j,i)
818             c_liq(j,i) = MIN(1.0_wp, m_liq(j,i)/m_liq_max)
819
820             q_s = 0.622_wp * e_s / surface_pressure
821
822!
823!--          In case of dew fall, set resistances to zero.
824!--          To do: what does that physically reasoning behind this?
825             IF ( humidity )  THEN
826                IF ( q_s .LE. q_p(k+1,j,i) )  THEN
827                   r_canopy(j,i) = 0.0_wp
828                   r_soil(j,i) = 0.0_wp
829                ENDIF
830             ENDIF 
831
832
833!
834!--          Calculate coefficients for the total evapotranspiration
835             f_LE_veg  = rho_lv * c_veg(j,i) * (1.0 - c_liq(j,i)) / (r_a(j,i)  &
836                                                + r_canopy(j,i))
837             f_LE_soil = rho_lv * (1.0 - c_veg(j,i)) / (r_a(j,i) + r_soil(j,i))
838             f_LE_liq  = rho_lv * c_veg(j,i) * c_liq(j,i) / r_a(j,i)
839
840
841!
842!--          If soil moisture is below wilting point, plants do no longer
843!--          transpirate.
844             IF ( m_soil(k,j,i) .LT. m_wilt(j,i) )  THEN
845                f_LE_veg = 0.0
846             ENDIF
847
848             f_H  = rho_cp / r_a(j,i)
849             f_LE = f_LE_veg + f_LE_soil + f_LE_liq
850       
851!
852!--          Calculate derivative of q_s for Taylor series expansion
853             e_s_dT = e_s * ( 17.269_wp / (T_0(j,i) - 35.86_wp) -              &
854                              17.269_wp*(T_0(j,i) - 273.16_wp) / (T_0(j,i)     &
855                              - 35.86_wp)**2 )
856
857             dq_s_dT = 0.622_wp * e_s_dT / surface_pressure
858
859             T_1 = pt_p(k+1,j,i) * exn
860
861!
862!--          Add LW up so that it can be removed in prognostic equation
863             Rn(j,i) = Rn(j,i) + sigma_SB * T_0(j,i) ** 4
864
865             IF ( humidity )  THEN
866
867!
868!--             Numerator of the prognostic equation
869                coef_1 = Rn(j,i) + 3.0_wp * sigma_SB * T_0(j,i) ** 4 + f_H     &
870                         / exn * T_1 + f_LE * ( q_p(k+1,j,i) - q_s + dq_s_dT   &
871                         * T_0(j,i) ) + lambda_skin * T_soil(0,j,i)
872
873!
874!--             Denominator of the prognostic equation
875                coef_2 = 4.0_wp * sigma_SB * T_0(j,i) ** 3 + f_LE * dq_s_dT    &
876                         + lambda_skin + f_H / exn
877
878             ELSE
879
880!
881!--             Numerator of the prognostic equation
882                coef_1 = Rn(j,i) + 3.0_wp * sigma_SB * T_0(j,i) ** 4 + f_H /   &
883                         exn * T_1 + lambda_skin * T_soil(0,j,i)
884
885!
886!--             Denominator of the prognostic equation
887                coef_2 = 4.0_wp * sigma_SB * T_0(j,i) ** 3                     &
888                         + lambda_skin + f_H / exn
889
890             ENDIF
891
892             tend = 0.0_wp
893
894!
895!--          Implicit solution when the skin layer has no heat capacity,
896!--          otherwise use RK3 scheme.
897             T_0_p(j,i) = ( coef_1 * dt_3d * tsc(2) + C_skin * T_0(j,i) ) /    &
898                          ( C_skin + coef_2 * dt_3d * tsc(2) ) 
899
900!
901!--          Add RK3 term
902             T_0_p(j,i) = T_0_p(j,i) + dt_3d * tsc(3) * tT_soil_m(0,j,i)
903
904!
905!--          Calculate true tendency
906             tend = (T_0_p(j,i) - T_0(j,i) - tsc(3) * tT_0_m(j,i)) / (dt_3d    &
907                      * tsc(2))
908
909!
910!--          Calculate T_0 tendencies for the next Runge-Kutta step
911             IF ( timestep_scheme(1:5) == 'runge' )  THEN
912                IF ( intermediate_timestep_count == 1 )  THEN
913                   tT_0_m(j,i) = tend
914                ELSEIF ( intermediate_timestep_count <                         &
915                         intermediate_timestep_count_max )  THEN
916                   tT_0_m(j,i) = -9.5625_wp * tend + 5.3125_wp * tT_0_m(j,i)
917                ENDIF
918             ENDIF
919
920             pt_p(k,j,i) = T_0_p(j,i) / exn
921!
922!--          Calculate fluxes
923             Rn(j,i)        = Rn(j,i) + 3.0_wp * sigma_SB * T_0(j,i)**4        &
924                              - 4.0_wp * sigma_SB * T_0(j,i)**3 * T_0_p(j,i)
925             G(j,i)         = lambda_skin * (T_0_p(j,i) - T_soil(0,j,i))
926             H(j,i)         = - f_H  * ( pt_p(k+1,j,i) - pt_p(k,j,i) )
927
928             IF ( humidity )  THEN
929                LE(j,i)        = - f_LE      * ( q_p(k+1,j,i) - q_s + dq_s_dT  &
930                                   * T_0(j,i) - dq_s_dT * T_0_p(j,i) )
931
932                LE_veg(j,i)    = - f_LE_veg  * ( q_p(k+1,j,i) - q_s + dq_s_dT  &
933                                   * T_0(j,i) - dq_s_dT * T_0_p(j,i) )
934                LE_soil(j,i)   = - f_LE_soil * ( q_p(k+1,j,i) - q_s + dq_s_dT  &
935                                   * T_0(j,i) - dq_s_dT * T_0_p(j,i) )
936                LE_liq(j,i)    = - f_LE_liq  * ( q_p(k+1,j,i) - q_s + dq_s_dT  &
937                                   * T_0(j,i) - dq_s_dT * T_0_p(j,i) )
938             ENDIF
939
940!              IF ( i == 1 .AND. j == 1 )  THEN
941!                 PRINT*, "Rn", Rn(j,i)
942!                  PRINT*, "H", H(j,i)
943!                 PRINT*, "LE", LE(j,i)
944!                 PRINT*, "LE_liq", LE_liq(j,i)
945!                 PRINT*, "LE_veg", LE_veg(j,i)
946!                 PRINT*, "LE_soil", LE_soil(j,i)
947!                 PRINT*, "G", G(j,i)
948!              ENDIF
949
950!
951!--          Calculate the true surface resistance
952             IF ( LE(j,i) .EQ. 0.0 )  THEN
953                r_s(j,i) = 1.0E10
954             ELSE
955                r_s(j,i) = - rho_lv * ( q_p(k+1,j,i) - q_s + dq_s_dT * T_0(j,i)&
956                           - dq_s_dT * T_0_p(j,i) ) / LE(j,i) - r_a(j,i)
957             ENDIF
958
959!
960!--          Calculate fluxes in the atmosphere
961             shf(j,i) = H(j,i) / rho_cp
962
963!
964!--          Calculate change in liquid water reservoir due to dew fall or
965!--          evaporation of liquid water
966             IF ( humidity )  THEN
967!
968!--             If precipitation is activated, add rain water to LE_liq.
969!--             precipitation_rate is given in mm.
970                IF ( precipitation )  THEN
971                   LE_liq(j,i) = LE_liq(j,i) + precipitation_rate(j,i)         &
972                                               * 0.001_wp * rho_l * l_v
973                ENDIF
974!
975!--             If the air is saturated, check the reservoir water level
976                IF ( q_s .LE. q_p(k+1,j,i))  THEN
977!
978!--                Check if reservoir is full (avoid values > m_liq_max)
979!--                In that case, LE_liq goes to LE_soil. In this case
980!--                LE_veg is zero anyway (because c_liq = 1), so that tend is
981!--                zero and no further check is needed
982                   IF ( m_liq(j,i) .EQ. m_liq_max )  THEN
983                      LE_soil(j,i) = LE_soil(j,i) + LE_liq(j,i)
984                      LE_liq(j,i) = 0.0_wp
985                   ENDIF
986
987!
988!--                In case LE_veg becomes negative (unphysical behavior), let
989!--                the water enter the liquid water reservoir as dew on the
990!--                plant
991                   IF ( LE_veg(j,i) .LT. 0.0_wp )  THEN
992                      LE_liq(j,i) = LE_liq(j,i) + LE_veg(j,i)
993                      LE_veg(j,i) = 0.0_wp
994                   ENDIF
995                ENDIF                   
996 
997                tend = - LE_liq(j,i) * drho_l_lv
998
999                m_liq_p(j,i) = m_liq(j,i) + dt_3d * ( tsc(2) * tend            &
1000                                                   + tsc(3) * tm_liq_m(j,i) )
1001
1002!
1003!--             Check if reservoir is overfull -> reduce to maximum
1004!--             (conservation of water is violated here)
1005                m_liq_p(j,i) = MIN(m_liq_p(j,i),m_liq_max)
1006
1007!
1008!--             Check if reservoir is empty (avoid values < 0.0)
1009!--             (conservation of water is violated here)
1010                m_liq_p(j,i) = MAX(m_liq_p(j,i),0.0_wp)
1011
1012
1013!
1014!--             Calculate m_liq tendencies for the next Runge-Kutta step
1015                IF ( timestep_scheme(1:5) == 'runge' )  THEN
1016                   IF ( intermediate_timestep_count == 1 )  THEN
1017                      tm_liq_m(j,i) = tend
1018                   ELSEIF ( intermediate_timestep_count <                      &
1019                            intermediate_timestep_count_max )  THEN
1020                      tm_liq_m(j,i) = -9.5625_wp * tend + 5.3125_wp            &
1021                                      * tm_liq_m(j,i)
1022                   ENDIF
1023                ENDIF
1024
1025!
1026!--             Calculate moisture flux in the atmosphere
1027                qsws(j,i) = LE(j,i) / rho_lv
1028
1029             ENDIF
1030
1031          ENDDO
1032       ENDDO
1033
1034
1035
1036    END SUBROUTINE lsm_energy_balance
1037
1038
1039!------------------------------------------------------------------------------!
1040! Description:
1041! ------------
1042!
1043!------------------------------------------------------------------------------!
1044    SUBROUTINE lsm_soil_model
1045
1046
1047       IMPLICIT NONE
1048
1049       INTEGER(iwp) ::  i   !: running index
1050       INTEGER(iwp) ::  j   !: running index
1051       INTEGER(iwp) ::  k   !: running index
1052
1053       REAL(wp)     :: h_VG !: Van Genuchten coef. h
1054
1055       REAL(wp), DIMENSION(0:soil_layers-1) :: gamma_temp,  & !: temp. gamma
1056                                               lambda_temp, & !: temp. lambda
1057                                               tend           !: tendency
1058
1059       DO i = nxlg, nxrg   
1060          DO j = nysg, nyng
1061             DO k = 0, soil_layers-1
1062!
1063!--             Calculate volumetric heat capacity of the soil, taking into
1064!--             account water content
1065                rhoC_total(k,j,i) = (rhoC_soil * (1.0 - m_sat(j,i))            &
1066                                     + rhoC_water * m_soil(k,j,i))
1067
1068!
1069!--             Calculate soil heat conductivity at the center of the soil
1070!--             layers
1071                Ke = 1.0 + LOG10(MAX(0.1_wp,m_soil(k,j,i) / m_sat(j,i)))
1072                lambda_temp(k) = Ke * (lambda_h_sat(j,i) + lambda_h_dry) +     &
1073                                 lambda_h_dry
1074
1075             ENDDO
1076
1077!
1078!--          Calculate soil heat conductivity (lambda_h) at the _stag level
1079!--          using linear interpolation
1080             DO k = 0, soil_layers-2
1081                 
1082                lambda_h(k,j,i) = lambda_temp(k) +                             &
1083                                  ( lambda_temp(k+1) - lambda_temp(k) )        &
1084                                  * 0.5 * dz_soil_stag(k) * ddz_soil(k+1)
1085
1086             ENDDO
1087             lambda_h(soil_layers-1,j,i) = lambda_temp(soil_layers-1)
1088
1089!
1090!--          Prognostic equation for soil temperature T_soil
1091             tend(:) = 0.0_wp
1092             tend(0) = (1.0/rhoC_total(0,j,i)) *                               &
1093                       ( lambda_h(0,j,i) * ( T_soil(1,j,i) - T_soil(0,j,i) )   &
1094                         * ddz_soil(0) + G(j,i) ) * ddz_soil_stag(0)
1095
1096             DO  k = 1, soil_layers-1
1097                tend(k) = (1.0/rhoC_total(k,j,i))                              &
1098                          * (   lambda_h(k,j,i)                                &
1099                              * ( T_soil(k+1,j,i) - T_soil(k,j,i) )            &
1100                              * ddz_soil(k)                                    &
1101                              - lambda_h(k-1,j,i)                              &
1102                              * ( T_soil(k,j,i) - T_soil(k-1,j,i) )            &
1103                              * ddz_soil(k-1)                                  &
1104                            ) * ddz_soil_stag(k)
1105             ENDDO
1106
1107             T_soil_p(0:soil_layers-1,j,i) = T_soil(0:soil_layers-1,j,i)       &
1108                                             + dt_3d * ( tsc(2)                &
1109                                             * tend(:) + tsc(3)                &
1110                                             * tT_soil_m(:,j,i) )   
1111
1112!
1113!--          Calculate T_soil tendencies for the next Runge-Kutta step
1114             IF ( timestep_scheme(1:5) == 'runge' )  THEN
1115                IF ( intermediate_timestep_count == 1 )  THEN
1116                   DO  k = 0, soil_layers-1
1117                      tT_soil_m(k,j,i) = tend(k)
1118                   ENDDO
1119                ELSEIF ( intermediate_timestep_count <                         &
1120                         intermediate_timestep_count_max )  THEN
1121                   DO  k = 0, soil_layers-1
1122                      tT_soil_m(k,j,i) = -9.5625_wp * tend(k) + 5.3125_wp      &
1123                                         * tT_soil_m(k,j,i)
1124                   ENDDO
1125                ENDIF
1126             ENDIF
1127
1128
1129             DO k = 0, soil_layers-1
1130!
1131!--             Calculate soil diffusivity at the center of the soil layers
1132                lambda_temp(k) = (- b_CH * gamma_w_sat(j,i) * psi_sat          &
1133                                  / m_sat(j,i) ) * ( MAX(m_soil(k,j,i),        &
1134                                  m_wilt(j,i)) / m_sat(j,i) )**(b_CH + 2.0_wp)
1135
1136!
1137!--             Calculate the hydraulic conductivity after Van Genuchten (1980)
1138                h_VG = ( ( (m_res(j,i) - m_sat(j,i)) / ( m_res(j,i) -          &
1139                           MAX(m_soil(k,j,i),m_wilt(j,i)) ) )**(n_VG(j,i)      &
1140                           / (n_VG(j,i)-1.0_wp)) - 1.0_wp                      &
1141                       )**(1.0_wp/n_VG(j,i)) / alpha_VG(j,i)
1142
1143                gamma_temp(k) = gamma_w_sat(j,i) * ( ( (1.0_wp +               &
1144                                (alpha_VG(j,i)*h_VG)**n_VG(j,i))**(1.0_wp      &
1145                                -1.0_wp/n_VG(j,i)) - (alpha_VG(j,i)*h_VG       &
1146                                )**(n_VG(j,i)-1.0_wp))**2 )                    &
1147                                / ( (1.0_wp + (alpha_VG(j,i)*h_VG)**n_VG(j,i)  &
1148                                )**((1.0_wp - 1.0_wp/n_VG(j,i))*(l_VG(j,i)     &
1149                                + 2.0)) )
1150
1151             ENDDO
1152
1153
1154             IF ( humidity )  THEN
1155!
1156!--             Calculate soil diffusivity (lambda_w) at the _stag level
1157!--             using linear interpolation
1158                DO k = 0, soil_layers-2
1159                     
1160                   lambda_w(k,j,i) = lambda_temp(k) +                          &
1161                                     ( lambda_temp(k+1) - lambda_temp(k) )     &
1162                                     * 0.5 * dz_soil_stag(k) * ddz_soil(k+1)
1163                   gamma_w(k,j,i)  = gamma_temp(k) +                           &
1164                                     ( gamma_temp(k+1) - gamma_temp(k) )       &
1165                                     * 0.5 * dz_soil_stag(k) * ddz_soil(k+1)                 
1166
1167                ENDDO
1168
1169!
1170!
1171!--             In case of a closed bottom (= water content is conserved), set
1172!--             hydraulic conductivity to zero to that no water will be lost
1173!--             in the bottom layer.
1174                IF ( conserve_water_content )  THEN
1175                   gamma_w(soil_layers-1,j,i) = 0.0_wp
1176                ELSE
1177                   gamma_w(soil_layers-1,j,i) = lambda_temp(soil_layers-1)
1178                ENDIF     
1179
1180!--             The root extraction (= root_extr * LE_veg / (rho_l * l_v))
1181!--             ensures the mass conservation for water. The transpiration of
1182!--             plants equals the cumulative withdrawals by the roots in the
1183!--             soil. The scheme takes into account the availability of water
1184!--             in the soil layers as well as the root fraction in the
1185!--             respective layer
1186
1187!
1188!--             Calculate the root extraction (ECMWF 7.69, with some
1189!--             modifications)
1190                m_total = 0.0_wp
1191                DO k = 0, soil_layers-1
1192                    m_total = m_total + root_fr(k,j,i) * m_soil(k,j,i) *       &
1193                              dz_soil_stag(k) 
1194
1195                ENDDO 
1196
1197!
1198!--             For conservation of mass, the sum of root_extr must be 1
1199                DO k = 0, soil_layers-1 
1200                   root_extr(k) = root_fr(k,j,i) * m_soil(k,j,i)               &
1201                                  * dz_soil_stag(k) / m_total
1202                ENDDO
1203
1204
1205!
1206!--             Prognostic equation for soil water content m_soil
1207                tend(:) = 0.0_wp
1208                tend(0) = ( lambda_w(0,j,i) * ( m_soil(1,j,i) - m_soil(0,j,i) )&
1209                            * ddz_soil(0) - gamma_w(0,j,i) - ( root_extr(0)    &
1210                            * LE_veg(j,i) + LE_soil(j,i) ) * drho_l_lv         &
1211                          ) * ddz_soil_stag(0)
1212
1213                DO  k = 1, soil_layers-2
1214                   tend(k) = ( lambda_w(k,j,i) * ( m_soil(k+1,j,i)             &
1215                               - m_soil(k,j,i) ) * ddz_soil(k) - gamma_w(k,j,i)&
1216                               - lambda_w(k-1,j,i) * (m_soil(k,j,i) -          &
1217                               m_soil(k-1,j,i)) * ddz_soil(k-1)                &
1218                               + gamma_w(k-1,j,i) - (root_extr(k) * LE_veg(j,i)&
1219                               * drho_l_lv)                                    &
1220                             ) * ddz_soil_stag(k)
1221
1222                ENDDO
1223                tend(soil_layers-1) = ( - gamma_w(soil_layers-1,j,i)           &
1224                                        - lambda_w(soil_layers-2,j,i)          &
1225                                        * (m_soil(soil_layers-1,j,i)           &
1226                                        - m_soil(soil_layers-2,j,i))           &
1227                                        * ddz_soil(soil_layers-2)              &
1228                                        + gamma_w(soil_layers-2,j,i) - (       &
1229                                          root_extr(soil_layers-1)             &
1230                                        * LE_veg(j,i) * drho_l_lv      )       &
1231                                      ) * ddz_soil_stag(soil_layers-1)             
1232
1233                m_soil_p(0:soil_layers-1,j,i) = m_soil(0:soil_layers-1,j,i)    &
1234                                                + dt_3d * ( tsc(2) * tend(:)   &
1235                                                + tsc(3) * tm_soil_m(:,j,i) )   
1236
1237!
1238!--             Account for dry soils (find a better solution here!)
1239                m_soil_p(:,j,i) = MAX(m_soil_p(:,j,i),0.0_wp)
1240
1241!
1242!--             Calculate m_soil tendencies for the next Runge-Kutta step
1243                IF ( timestep_scheme(1:5) == 'runge' )  THEN
1244                   IF ( intermediate_timestep_count == 1 )  THEN
1245                      DO  k = 0, soil_layers-1
1246                         tm_soil_m(k,j,i) = tend(k)
1247                      ENDDO
1248                   ELSEIF ( intermediate_timestep_count <                      &
1249                            intermediate_timestep_count_max )  THEN
1250                      DO  k = 0, soil_layers-1
1251                         tm_soil_m(k,j,i) = -9.5625_wp * tend(k) + 5.3125_wp   &
1252                                     * tm_soil_m(k,j,i)
1253                      ENDDO
1254                   ENDIF
1255                ENDIF
1256
1257             ENDIF
1258
1259          ENDDO
1260       ENDDO
1261
1262!
1263!--    Calculate surface specific humidity
1264       IF ( humidity )  THEN
1265          CALL calc_q0
1266       ENDIF
1267
1268
1269    END SUBROUTINE lsm_soil_model
1270
1271
1272!------------------------------------------------------------------------------!
1273! Description:
1274! ------------
1275!
1276!------------------------------------------------------------------------------!
1277    SUBROUTINE calc_q0
1278
1279       IMPLICIT NONE
1280
1281       INTEGER :: i              !: running index
1282       INTEGER :: j              !: running index
1283       INTEGER :: k              !: running index
1284       REAL(wp) :: resistance    !: aerodynamic and soil resistance term
1285
1286       DO i = nxlg, nxrg   
1287          DO j = nysg, nyng
1288             k = nzb_s_inner(j,i)
1289!
1290!--          Temporary solution as long as T_0 is prescribed
1291
1292             pt_p(k,j,i) = T_0(j,i) / exn
1293!
1294!--          Calculate water vapour pressure at saturation
1295             e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( T_0(j,i) -         &
1296                                              273.16_wp ) /  ( T_0(j,i) -      &
1297                                              35.86_wp ) )
1298
1299!
1300!--          Calculate specific humidity at saturation
1301             q_s = 0.622_wp * e_s / surface_pressure
1302
1303
1304             resistance = r_a(j,i) / (r_a(j,i) + r_s(j,i))
1305
1306!
1307!--          Calculate specific humidity at surface
1308             q_p(k,j,i) = resistance * q_s + (1.0_wp - resistance)             &
1309                          * q_p(k+1,j,i)
1310
1311          ENDDO
1312       ENDDO
1313
1314    END SUBROUTINE calc_q0
1315
1316
1317 END MODULE land_surface_model_mod
Note: See TracBrowser for help on using the repository browser.