SURFEX v8.1
General documentation of Surfex
veg_height_from_lai.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 !#######################
7 !#######################
8 !
10 !
11  FUNCTION veg_height_from_lai_0d(PLAI,PH_TREE,PVEGTYPE,OAGRI_TO_GRASS) RESULT(PH_VEG)
12 !
13 REAL, INTENT(IN) :: PLAI ! Leaf area Index
14 REAL, INTENT(IN) :: PH_TREE ! height of trees
15 REAL, DIMENSION(:), INTENT(IN) :: PVEGTYPE ! type of vegetation
16 LOGICAL, INTENT(IN) :: OAGRI_TO_GRASS
17 !
18 REAL, DIMENSION(SIZE(PVEGTYPE)) :: PH_VEG ! vegetation height
19 !
20 END FUNCTION veg_height_from_lai_0d
21 !
22 !
23  FUNCTION veg_height_from_lai_1d(PLAI,PH_TREE,PVEGTYPE,OAGRI_TO_GRASS) RESULT(PH_VEG)
24 !
25 REAL, DIMENSION(:), INTENT(IN) :: PLAI ! Leaf area Index
26 REAL, DIMENSION(:), INTENT(IN) :: PH_TREE ! height of trees
27 REAL, DIMENSION(:,:), INTENT(IN) :: PVEGTYPE ! type of vegetation
28 LOGICAL, INTENT(IN) :: OAGRI_TO_GRASS
29 !
30 REAL, DIMENSION(SIZE(PVEGTYPE,1),SIZE(PVEGTYPE,2)) :: PH_VEG ! vegetation height
31 !
32 END FUNCTION veg_height_from_lai_1d
33 !
34 !
35  FUNCTION veg_height_from_lai_2d(PLAI,PH_TREE,PVEGTYPE,OAGRI_TO_GRASS) RESULT(PH_VEG)
36 !
37 REAL, DIMENSION(:,:), INTENT(IN) :: PLAI ! Leaf area Index
38 REAL, DIMENSION(:,:), INTENT(IN) :: PH_TREE ! height of trees
39 REAL, DIMENSION(:,:,:), INTENT(IN) :: PVEGTYPE ! type of vegetation
40 LOGICAL, INTENT(IN) :: OAGRI_TO_GRASS
41 !
42 REAL, DIMENSION(SIZE(PVEGTYPE,1),SIZE(PVEGTYPE,2),SIZE(PVEGTYPE,3)) :: PH_VEG ! vegetation height
43 !
44 END FUNCTION veg_height_from_lai_2d
45 !
46  FUNCTION veg_height_from_lai_vegtype(PLAI,PH_TREE,OAGRI_TO_GRASS) RESULT(PH_VEG)
47 !
48 REAL, DIMENSION(:), INTENT(IN) :: PLAI ! Leaf area Index
49 REAL, DIMENSION(:), INTENT(IN) :: PH_TREE ! height of trees
50 LOGICAL, INTENT(IN) :: OAGRI_TO_GRASS
51 !
52 REAL, DIMENSION(SIZE(PLAI)) :: PH_VEG ! vegetation height
53 !
54 END FUNCTION veg_height_from_lai_vegtype
55 !
56 END INTERFACE
57 !
58 END MODULE modi_veg_height_from_lai
59 !
60 
61 ! ###########################################################
62  FUNCTION veg_height_from_lai_0d(PLAI,PH_TREE,PVEGTYPE,OAGRI_TO_GRASS) RESULT(PH_VEG)
63 ! ###########################################################
64 !!
65 !! PURPOSE
66 !! -------
67 !
68 ! Calculates vegetation height from leaf
69 ! area index and type of vegetation
70 ! (most of types; forest and vineyards; grassland)
71 !
72 !!** METHOD
73 !! ------
74 !!
75 !! EXTERNAL
76 !! --------
77 !! none
78 !!
79 !! IMPLICIT ARGUMENTS
80 !! ------------------
81 !!
82 !! none
83 !!
84 !! REFERENCE
85 !! ---------
86 !!
87 !!
88 !! AUTHOR
89 !! ------
90 !!
91 !! V. Masson and A. Boone * Meteo-France *
92 !!
93 !! MODIFICATIONS
94 !! -------------
95 !! Original 25/03/99
96 !! P. Samuelsson 02/2012 MEB
97 !!
98 !-------------------------------------------------------------------------------
99 !
100 !* 0. DECLARATIONS
101 ! ------------
102 !
103 USE modd_surf_par, ONLY : xundef
104 USE modd_data_cover_par, ONLY : nvt_no, nvt_rock, nvt_snow, nvt_park, &
105  nvt_tebd, nvt_bone, nvt_trbe, nvt_trbd, &
106  nvt_tebe, nvt_tene, nvt_bobd, nvt_bond, &
107  nvt_shrb, nvt_c3, nvt_c4, nvt_irr, &
108  nvt_gras, nvt_bogr, nvt_trog, nvt_c3w, &
109  nvt_c3s, nvt_fltr, nvt_flgr
110 USE modd_treedrag, ONLY : ltreedrag
111 !
112 USE yomhook ,ONLY : lhook, dr_hook
113 USE parkind1 ,ONLY : jprb
114 !
115 IMPLICIT NONE
116 !
117 !* 0.1 declarations of arguments
118 !
119 REAL, INTENT(IN) :: PLAI ! Leaf area Index
120 REAL, INTENT(IN) :: PH_TREE ! height of trees
121 REAL, DIMENSION(:), INTENT(IN) :: PVEGTYPE ! type of vegetation
122 LOGICAL, INTENT(IN) :: OAGRI_TO_GRASS
123 !
124 REAL, DIMENSION(SIZE(PVEGTYPE)) :: PH_VEG ! vegetation height
125 !
126 !* 0.2 declarations of local variables
127 !
128 REAL :: ZALLEN_H ! Allen formula for height
129 REAL :: ZLAI ! LAI for vegetated areas
130 !
131 REAL :: ZAVG_H ! averaged height
132 REAL :: ZZREF ! reference height
133 !
134 INTEGER :: JTYPE ! loop counter
135 REAL(KIND=JPRB) :: ZHOOK_HANDLE
136 !-----------------------------------------------------------------
137 !
138 IF (lhook) CALL dr_hook('MODI_VEG_HEIGHT_FROM_LAI:VEG_HEIGHT_FROM_LAI_0D',0,zhook_handle)
139 !
140 !-----------------------------------------------------------------
141 !
142 zlai = plai
143 IF ( pvegtype(nvt_no ) + pvegtype(nvt_rock) + pvegtype(nvt_snow) < 1.) THEN
144  zlai = plai / (1.-pvegtype(nvt_no)-pvegtype(nvt_rock)-pvegtype(nvt_snow))
145 END IF
146 !
147 zallen_h = 0.
148 IF ( plai /= xundef) THEN
149  zallen_h = exp((zlai-3.5)/(1.3))
150 END IF
151 !
152 IF (nvt_park>0) THEN
153  ph_veg(nvt_park) = zlai / 6. ! irr. grassland
154 ELSEIF (nvt_flgr>0) THEN
155  ph_veg(nvt_flgr) = zlai / 6.
156 ENDIF
157 IF (ltreedrag) THEN
158  ph_veg(nvt_tebd) = zlai / 6. ! forest
159  ph_veg(nvt_bone) = zlai / 6. ! forest
160  ph_veg(nvt_trbe) = zlai / 6. ! forest
161  ph_veg(nvt_trbd) = zlai / 6. ! forest
162  ph_veg(nvt_tebe) = zlai / 6. ! forest
163  ph_veg(nvt_tene) = zlai / 6. ! forest
164  ph_veg(nvt_bobd) = zlai / 6. ! forest
165  ph_veg(nvt_bond) = zlai / 6. ! forest
166  ph_veg(nvt_shrb) = zlai / 6. ! forest
167  IF (nvt_fltr>0) ph_veg(nvt_fltr) = zlai / 6.
168 ELSE
169  ph_veg(nvt_tebd) = ph_tree ! forest
170  ph_veg(nvt_bone) = ph_tree ! forest
171  ph_veg(nvt_trbe) = ph_tree ! forest
172  ph_veg(nvt_trbd) = ph_tree ! forest
173  ph_veg(nvt_tebe) = ph_tree ! forest
174  ph_veg(nvt_tene) = ph_tree ! forest
175  ph_veg(nvt_bobd) = ph_tree ! forest
176  ph_veg(nvt_bond) = ph_tree ! forest
177  ph_veg(nvt_shrb) = ph_tree ! forest
178  IF (nvt_fltr>0) ph_veg(nvt_fltr) = ph_tree
179 END IF
180 ph_veg(nvt_gras) = zlai / 6. ! grassland
181 ph_veg(nvt_bogr) = zlai / 6. ! boreal grassland
182 ph_veg(nvt_trog) = zlai / 6. ! tropical grassland
183 IF(oagri_to_grass)THEN
184  IF (nvt_c3>0) THEN
185  ph_veg(nvt_c3 ) = zlai / 6.
186  ELSEIF (nvt_c3w>0 .AND. nvt_c3s>0) THEN
187  ph_veg(nvt_c3w ) = zlai / 6.
188  ph_veg(nvt_c3s ) = zlai / 6.
189  ENDIF
190  ph_veg(nvt_c4 ) = zlai / 6.
191  IF (nvt_irr>0) ph_veg(nvt_irr ) = zlai / 6.
192 ELSE
193  IF (nvt_c3>0) THEN
194  ph_veg(nvt_c3 ) = min(1. , zallen_h ) ! cultures
195  ELSEIF (nvt_c3w>0 .AND. nvt_c3s>0) THEN
196  ph_veg(nvt_c3w ) = min(1. , zallen_h )
197  ph_veg(nvt_c3s ) = min(1. , zallen_h )
198  ENDIF
199  ph_veg(nvt_c4 ) = min(2.5, zallen_h ) ! C4 types
200  IF (nvt_irr>0) ph_veg(nvt_irr ) = min(2.5, zallen_h ) ! irrigated crops (as C4)
201 ENDIF
202 ph_veg(nvt_no ) = 0.1 ! no vegetation (smooth)
203 ph_veg(nvt_rock) = 1. ! no vegetation (rocks)
204 ph_veg(nvt_snow) = 0.01 ! no vegetation (snow)
205 !
206 ph_veg(:) = max(ph_veg(:),0.001)
207 !
208 IF (lhook) CALL dr_hook('MODI_VEG_HEIGHT_FROM_LAI:VEG_HEIGHT_FROM_LAI_0D',1,zhook_handle)
209 !-----------------------------------------------------------------
210 !
211 END FUNCTION veg_height_from_lai_0d
212 !
213 ! ###########################################################
214  FUNCTION veg_height_from_lai_1d(PLAI,PH_TREE,PVEGTYPE,OAGRI_TO_GRASS) RESULT(PH_VEG)
215 ! ###########################################################
216 !!
217 !! PURPOSE
218 !! -------
219 !
220 ! Calculates vegetation height from leaf
221 ! area index and type of vegetation
222 ! (most of types; forest and vineyards; grassland)
223 !
224 !!** METHOD
225 !! ------
226 !!
227 !! EXTERNAL
228 !! --------
229 !! none
230 !!
231 !! IMPLICIT ARGUMENTS
232 !! ------------------
233 !!
234 !! none
235 !!
236 !! REFERENCE
237 !! ---------
238 !!
239 !!
240 !! AUTHOR
241 !! ------
242 !!
243 !! V. Masson and A. Boone * Meteo-France *
244 !!
245 !! MODIFICATIONS
246 !! -------------
247 !! Original 25/03/99
248 !!
249 !-------------------------------------------------------------------------------
250 !
251 !* 0. DECLARATIONS
252 ! ------------
253 !
254 USE modd_surf_par, ONLY : xundef
255 USE modd_data_cover_par, ONLY : nvt_no, nvt_rock, nvt_snow, nvt_park, &
256  nvt_tebd, nvt_bone, nvt_trbe, nvt_trbd, &
257  nvt_tebe, nvt_tene, nvt_bobd, nvt_bond, &
258  nvt_shrb, nvt_c3, nvt_c4, nvt_irr, &
259  nvt_gras, nvt_bogr, nvt_trog, nvt_c3w, &
260  nvt_c3s, nvt_fltr, nvt_flgr
261 USE modd_treedrag, ONLY : ltreedrag
262 !
263 USE yomhook ,ONLY : lhook, dr_hook
264 USE parkind1 ,ONLY : jprb
265 !
266 IMPLICIT NONE
267 !
268 !* 0.1 declarations of arguments
269 !
270 REAL, DIMENSION(:), INTENT(IN) :: PLAI ! Leaf area Index
271 REAL, DIMENSION(:), INTENT(IN) :: PH_TREE ! height of trees
272 REAL, DIMENSION(:,:), INTENT(IN) :: PVEGTYPE ! type of vegetation
273 LOGICAL, INTENT(IN) :: OAGRI_TO_GRASS
274 !
275 REAL, DIMENSION(SIZE(PVEGTYPE,1),SIZE(PVEGTYPE,2)) :: PH_VEG ! vegetation height
276 !
277 !* 0.2 declarations of local variables
278 !
279 REAL, DIMENSION(SIZE(PLAI)) :: ZALLEN_H ! Allen formula for height
280 REAL, DIMENSION(SIZE(PLAI)) :: ZLAI ! LAI for vegetated areas
281 !
282 REAL, DIMENSION(SIZE(PLAI)) :: ZAVG_H ! averaged height
283 REAL :: ZZREF ! reference height
284 !
285 INTEGER :: JTYPE ! loop counter
286 REAL(KIND=JPRB) :: ZHOOK_HANDLE
287 !-----------------------------------------------------------------
288 !
289 IF (lhook) CALL dr_hook('MODI_VEG_HEIGHT_FROM_LAI:VEG_HEIGHT_FROM_LAI_1D',0,zhook_handle)
290 !
291 !-----------------------------------------------------------------
292 !
293 ph_veg(:,:) = xundef
294 !
295 zlai(:) = plai(:)
296 WHERE ( pvegtype(:,nvt_no ) + pvegtype(:,nvt_rock) + pvegtype(:,nvt_snow) < 1.)
297  zlai(:) = plai(:) / (1.-pvegtype(:,nvt_no)-pvegtype(:,nvt_rock)-pvegtype(:,nvt_snow))
298 END WHERE
299 !
300 zallen_h(:) = 0.
301 WHERE (plai(:) /= xundef)
302  zallen_h(:) = exp((zlai(:)-3.5)/(1.3))
303 END WHERE
304 !
305 !
306 IF (nvt_park>0) THEN
307  ph_veg(:,nvt_park) = zlai(:) / 6. ! irr. grassland
308 ELSEIF (nvt_flgr>0) THEN
309  ph_veg(:,nvt_flgr) = zlai(:) / 6.
310 ENDIF
311 !
312 IF (ltreedrag) THEN
313  ph_veg(:,nvt_tebd) = zlai(:) / 6. ! forest
314  ph_veg(:,nvt_bone) = zlai(:) / 6. ! forest
315  ph_veg(:,nvt_trbe) = zlai(:) / 6. ! forest
316  ph_veg(:,nvt_trbd) = zlai(:) / 6. ! forest
317  ph_veg(:,nvt_tebe) = zlai(:) / 6. ! forest
318  ph_veg(:,nvt_tene) = zlai(:) / 6. ! forest
319  ph_veg(:,nvt_bobd) = zlai(:) / 6. ! forest
320  ph_veg(:,nvt_bond) = zlai(:) / 6. ! forest
321  ph_veg(:,nvt_shrb) = zlai(:) / 6. ! forest
322  IF (nvt_fltr>0) ph_veg(:,nvt_fltr) = zlai(:) / 6.
323 ELSE
324  ph_veg(:,nvt_tebd) = ph_tree(:) ! forest
325  ph_veg(:,nvt_bone) = ph_tree(:) ! forest
326  ph_veg(:,nvt_trbe) = ph_tree(:) ! forest
327  ph_veg(:,nvt_trbd) = ph_tree(:) ! forest
328  ph_veg(:,nvt_tebe) = ph_tree(:) ! forest
329  ph_veg(:,nvt_tene) = ph_tree(:) ! forest
330  ph_veg(:,nvt_bobd) = ph_tree(:) ! forest
331  ph_veg(:,nvt_bond) = ph_tree(:) ! forest
332  ph_veg(:,nvt_shrb) = ph_tree(:) ! forest
333  IF (nvt_fltr>0) ph_veg(:,nvt_fltr) = ph_tree(:)
334 END IF
335 ph_veg(:,nvt_gras) = zlai(:) / 6. ! grassland
336 ph_veg(:,nvt_bogr) = zlai(:) / 6. ! boreal grassland
337 ph_veg(:,nvt_trog) = zlai(:) / 6. ! tropical grassland
338 IF(oagri_to_grass)THEN
339  IF (nvt_c3>0) THEN
340  ph_veg(:,nvt_c3 ) = zlai(:) / 6.
341  ELSEIF (nvt_c3w>0 .AND. nvt_c3s>0) THEN
342  ph_veg(:,nvt_c3w ) = zlai(:) / 6.
343  ph_veg(:,nvt_c3s ) = zlai(:) / 6.
344  ENDIF
345  ph_veg(:,nvt_c4 ) = zlai(:) / 6.
346  IF (nvt_irr>0) ph_veg(:,nvt_irr ) = zlai(:) / 6.
347 ELSE
348  IF (nvt_c3>0) THEN
349  ph_veg(:,nvt_c3 ) = min(1. , zallen_h(:) ) ! cultures
350  ELSEIF (nvt_c3w>0 .AND. nvt_c3s>0) THEN
351  ph_veg(:,nvt_c3w ) = min(1. , zallen_h(:) )
352  ph_veg(:,nvt_c3s ) = min(1. , zallen_h(:) )
353  ENDIF
354  ph_veg(:,nvt_c4 ) = min(2.5, zallen_h(:) ) ! C4 types
355  IF (nvt_irr>0) ph_veg(:,nvt_irr ) = min(2.5, zallen_h(:) ) ! irrigated crops (as C4)
356 ENDIF
357 ph_veg(:,nvt_no ) = 0.1 ! no vegetation (smooth)
358 ph_veg(:,nvt_rock) = 1. ! no vegetation (rocks)
359 ph_veg(:,nvt_snow) = 0.01 ! no vegetation (snow)
360 !
361 ph_veg(:,:) = max(ph_veg(:,:),0.001)
362 !
363 IF (lhook) CALL dr_hook('MODI_VEG_HEIGHT_FROM_LAI:VEG_HEIGHT_FROM_LAI_1D',1,zhook_handle)
364 !-----------------------------------------------------------------
365 !
366 END FUNCTION veg_height_from_lai_1d
367 !
368 ! ###########################################################
369  FUNCTION veg_height_from_lai_2d(PLAI,PH_TREE,PVEGTYPE,OAGRI_TO_GRASS) RESULT(PH_VEG)
370 ! ###########################################################
371 !!
372 !! PURPOSE
373 !! -------
374 !
375 ! Calculates vegetation height from leaf
376 ! area index and type of vegetation
377 ! (most of types; forest and vineyards; grassland)
378 !
379 !!** METHOD
380 !! ------
381 !!
382 !! EXTERNAL
383 !! --------
384 !! none
385 !!
386 !! IMPLICIT ARGUMENTS
387 !! ------------------
388 !!
389 !! none
390 !!
391 !! REFERENCE
392 !! ---------
393 !!
394 !!
395 !! AUTHOR
396 !! ------
397 !!
398 !! V. Masson and A. Boone * Meteo-France *
399 !!
400 !! MODIFICATIONS
401 !! -------------
402 !! Original 25/03/99
403 !!
404 !-------------------------------------------------------------------------------
405 !
406 !* 0. DECLARATIONS
407 ! ------------
408 !
409 USE modd_data_cover_par, ONLY : nvt_no, nvt_rock, nvt_snow, nvt_park, &
410  nvt_tebd, nvt_bone, nvt_trbe, nvt_trbd, &
411  nvt_tebe, nvt_tene, nvt_bobd, nvt_bond, &
412  nvt_shrb, nvt_c3, nvt_c4, nvt_irr, &
413  nvt_gras, nvt_bogr, nvt_trog, nvt_c3w, &
414  nvt_c3s, nvt_fltr, nvt_flgr
415 USE modd_surf_par, ONLY : xundef
416 USE modd_treedrag, ONLY : ltreedrag
417 !
418 USE yomhook ,ONLY : lhook, dr_hook
419 USE parkind1 ,ONLY : jprb
420 !
421 IMPLICIT NONE
422 !
423 !* 0.1 declarations of arguments
424 !
425 REAL, DIMENSION(:,:), INTENT(IN) :: PLAI ! Leaf area Index
426 REAL, DIMENSION(:,:), INTENT(IN) :: PH_TREE ! height of trees
427 REAL, DIMENSION(:,:,:), INTENT(IN) :: PVEGTYPE ! type of vegetation
428 LOGICAL, INTENT(IN) :: OAGRI_TO_GRASS
429 !
430 REAL, DIMENSION(SIZE(PVEGTYPE,1),SIZE(PVEGTYPE,2),SIZE(PVEGTYPE,3)) :: PH_VEG ! vegetation height
431 !
432 !* 0.2 declarations of local variables
433 !
434 
435 REAL, DIMENSION(SIZE(PLAI,1),SIZE(PLAI,2)) :: ZALLEN_H ! Allen formula for height
436 REAL, DIMENSION(SIZE(PLAI,1),SIZE(PLAI,2)) :: ZLAI ! LAI for vegetated areas
437 !
438 REAL, DIMENSION(SIZE(PLAI,1),SIZE(PLAI,2)) :: ZAVG_H ! averaged height
439 REAL :: ZZREF ! reference height
440 !
441 INTEGER :: JTYPE ! loop counter
442 REAL(KIND=JPRB) :: ZHOOK_HANDLE
443 !-----------------------------------------------------------------
444 !
445 IF (lhook) CALL dr_hook('MODI_VEG_HEIGHT_FROM_LAI:VEG_HEIGHT_FROM_LAI_2D',0,zhook_handle)
446 !
447 !-----------------------------------------------------------------
448 !
449 ph_veg(:,:,:)=xundef
450 !
451 zlai(:,:) = plai(:,:)
452 WHERE ( pvegtype(:,:,nvt_no ) + pvegtype(:,:,nvt_rock) + pvegtype(:,:,nvt_snow) < 1.)
453  zlai(:,:) = plai(:,:) / (1.-pvegtype(:,:,nvt_no)-pvegtype(:,:,nvt_rock)-pvegtype(:,:,nvt_snow))
454 END WHERE
455 !
456 zallen_h(:,:) = 0.
457 WHERE(plai(:,:)/=xundef)
458  zallen_h(:,:) = exp((zlai(:,:)-3.5)/(1.3))
459 END WHERE
460 !
461 !
462 IF (nvt_park>0) THEN
463  ph_veg(:,:,nvt_park) = zlai(:,:) / 6. ! irr. grassland
464 ELSEIF (nvt_flgr>0) THEN
465  ph_veg(:,:,nvt_flgr) = zlai(:,:) / 6.
466 ENDIF
467 !
468 IF (ltreedrag) THEN
469  ph_veg(:,:,nvt_tebd) = zlai(:,:) / 6. ! forest
470  ph_veg(:,:,nvt_bone) = zlai(:,:) / 6. ! forest
471  ph_veg(:,:,nvt_trbe) = zlai(:,:) / 6. ! forest
472  ph_veg(:,:,nvt_trbd) = zlai(:,:) / 6. ! forest
473  ph_veg(:,:,nvt_tebe) = zlai(:,:) / 6. ! forest
474  ph_veg(:,:,nvt_tene) = zlai(:,:) / 6. ! forest
475  ph_veg(:,:,nvt_bobd) = zlai(:,:) / 6. ! forest
476  ph_veg(:,:,nvt_bond) = zlai(:,:) / 6. ! forest
477  ph_veg(:,:,nvt_shrb) = zlai(:,:) / 6. ! forest
478  IF (nvt_fltr>0) ph_veg(:,:,nvt_fltr) = zlai(:,:) / 6.
479 ELSE
480  ph_veg(:,:,nvt_tebd) = ph_tree(:,:) ! forest
481  ph_veg(:,:,nvt_bone) = ph_tree(:,:) ! forest
482  ph_veg(:,:,nvt_trbe) = ph_tree(:,:) ! forest
483  ph_veg(:,:,nvt_trbd) = ph_tree(:,:) ! forest
484  ph_veg(:,:,nvt_tebe) = ph_tree(:,:) ! forest
485  ph_veg(:,:,nvt_tene) = ph_tree(:,:) ! forest
486  ph_veg(:,:,nvt_bobd) = ph_tree(:,:) ! forest
487  ph_veg(:,:,nvt_bond) = ph_tree(:,:) ! forest
488  ph_veg(:,:,nvt_shrb) = ph_tree(:,:) ! forest
489  IF (nvt_fltr>0) ph_veg(:,:,nvt_fltr) = ph_tree(:,:)
490 END IF
491 ph_veg(:,:,nvt_gras) = zlai(:,:) / 6. ! grassland
492 ph_veg(:,:,nvt_bogr) = zlai(:,:) / 6. ! boreal grassland
493 ph_veg(:,:,nvt_trog) = zlai(:,:) / 6. ! tropical grassland
494 IF(oagri_to_grass)THEN
495  IF (nvt_c3>0) THEN
496  ph_veg(:,:,nvt_c3 ) = zlai(:,:) / 6.
497  ELSEIF (nvt_c3w>0 .AND. nvt_c3s>0) THEN
498  ph_veg(:,:,nvt_c3w ) = zlai(:,:) / 6.
499  ph_veg(:,:,nvt_c3s ) = zlai(:,:) / 6.
500  ENDIF
501  ph_veg(:,:,nvt_c4 ) = zlai(:,:) / 6.
502  IF (nvt_irr>0) ph_veg(:,:,nvt_irr ) = zlai(:,:) / 6.
503 ELSE
504  IF (nvt_c3>0) THEN
505  ph_veg(:,:,nvt_c3 ) = min(1. , zallen_h(:,:) ) ! cultures
506  ELSEIF (nvt_c3w>0 .AND. nvt_c3s>0) THEN
507  ph_veg(:,:,nvt_c3w ) = min(2.5, zallen_h(:,:) )
508  ph_veg(:,:,nvt_c3s ) = min(2.5, zallen_h(:,:) )
509  ENDIF
510  ph_veg(:,:,nvt_c4 ) = min(2.5, zallen_h(:,:) ) ! C4 types
511  IF (nvt_irr>0) ph_veg(:,:,nvt_irr ) = min(2.5, zallen_h(:,:) ) ! irrigated crops (as C4)
512 ENDIF
513 ph_veg(:,:,nvt_no ) = 0.1 ! no vegetation (smooth)
514 ph_veg(:,:,nvt_rock) = 1. ! no vegetation (rocks)
515 ph_veg(:,:,nvt_snow) = 0.01 ! no vegetation (snow)
516 !
517 ph_veg(:,:,:) = max(ph_veg(:,:,:),0.001)
518 !
519 IF (lhook) CALL dr_hook('MODI_VEG_HEIGHT_FROM_LAI:VEG_HEIGHT_FROM_LAI_2D',1,zhook_handle)
520 !-----------------------------------------------------------------
521 !
522 END FUNCTION veg_height_from_lai_2d
523 !
524 !
525 !
526 ! ###########################################################
527  FUNCTION veg_height_from_lai_vegtype(PLAI,PH_TREE,OAGRI_TO_GRASS) RESULT(PH_VEG)
528 ! ###########################################################
529 !!
530 !! PURPOSE
531 !! -------
532 !
533 ! Calculates vegetation height from leaf
534 ! area index and type of vegetation for each patch
535 ! (most of types; forest and vineyards; grassland)
536 !
537 !!** METHOD
538 !! ------
539 !!
540 !! EXTERNAL
541 !! --------
542 !! none
543 !!
544 !! IMPLICIT ARGUMENTS
545 !! ------------------
546 !!
547 !! none
548 !!
549 !! REFERENCE
550 !! ---------
551 !!
552 !!
553 !! AUTHOR
554 !! ------
555 !! F.Solmon
556 !! V. Masson and A. Boone * Meteo-France *
557 !!
558 !! MODIFICATIONS
559 !! -------------
560 !! Original 25/03/99
561 !!
562 !-------------------------------------------------------------------------------
563 !
564 !* 0. DECLARATIONS
565 ! ------------
566 !
567 USE modd_data_cover_par, ONLY : nvt_no, nvt_rock, nvt_snow, nvt_park, &
568  nvt_tebd, nvt_bone, nvt_trbe, nvt_trbd, &
569  nvt_tebe, nvt_tene, nvt_bobd, nvt_bond, &
570  nvt_shrb, nvt_c3, nvt_c4, nvt_irr, &
571  nvt_gras, nvt_bogr, nvt_trog, nvt_c3w, &
572  nvt_c3s, nvt_fltr, nvt_flgr
573 USE modd_surf_par, ONLY : xundef
574 USE modd_treedrag, ONLY : ltreedrag
575 !
576 USE yomhook ,ONLY : lhook, dr_hook
577 USE parkind1 ,ONLY : jprb
578 !
579 IMPLICIT NONE
580 !
581 !* 0.1 declarations of arguments
582 !
583 REAL, DIMENSION(:), INTENT(IN) :: PLAI ! Leaf area Index
584 REAL, DIMENSION(:), INTENT(IN) :: PH_TREE ! height of trees
585 LOGICAL, INTENT(IN) :: OAGRI_TO_GRASS
586 !
587 REAL, DIMENSION(SIZE(PLAI)) :: PH_VEG ! vegetation height
588 !
589 !* 0.2 declarations of local variables
590 !
591 REAL, DIMENSION(SIZE(PLAI)) :: ZALLEN_H ! Allen formula for height
592 REAL(KIND=JPRB) :: ZHOOK_HANDLE
593 !-----------------------------------------------------------------
594 !
595 IF (lhook) CALL dr_hook('MODI_VEG_HEIGHT_FROM_LAI:VEG_HEIGHT_FROM_LAI_VEGTYPE',0,zhook_handle)
596 !
597 !
598 !-----------------------------------------------------------------
599 !
600 ph_veg(:) = xundef
601 !
602 zallen_h(:) = xundef
603 WHERE (plai(:)/= xundef)
604  zallen_h(:) = exp((plai(:)-3.5)/(1.3))
605 END WHERE
606 !
607 !
608 IF (nvt_park>0) THEN
609  IF (plai(nvt_park)/=xundef) ph_veg(nvt_park) = plai(nvt_park) / 6. ! irr. grasslands
610 ELSEIF (nvt_flgr>0) THEN
611  IF (plai(nvt_flgr)/=xundef) ph_veg(nvt_flgr) = plai(nvt_flgr) / 6.
612 ENDIF
613 IF (ltreedrag) THEN
614  IF (plai(nvt_tebd)/=xundef) ph_veg(nvt_tebd) = plai(nvt_tebd) / 6. ! broadleaf forest
615  IF (plai(nvt_bone)/=xundef) ph_veg(nvt_bone) = plai(nvt_bone) / 6. ! coniferous forest
616  IF (plai(nvt_trbe)/=xundef) ph_veg(nvt_trbe) = plai(nvt_trbe) / 6. ! euqatorial forest
617  IF (plai(nvt_trbd)/=xundef) ph_veg(nvt_trbd) = plai(nvt_trbd) / 6. ! broadleaf forest
618  IF (plai(nvt_tebe)/=xundef) ph_veg(nvt_tebe) = plai(nvt_tebe) / 6. ! coniferous forest
619  IF (plai(nvt_tene)/=xundef) ph_veg(nvt_tene) = plai(nvt_tene) / 6. ! euqatorial forest
620  IF (plai(nvt_bobd)/=xundef) ph_veg(nvt_bobd) = plai(nvt_bobd) / 6. ! broadleaf forest
621  IF (plai(nvt_bond)/=xundef) ph_veg(nvt_bond) = plai(nvt_bond) / 6. ! coniferous forest
622  IF (plai(nvt_shrb)/=xundef) ph_veg(nvt_shrb) = plai(nvt_shrb) / 6. ! euqatorial forest
623  IF (nvt_fltr>0) THEN
624  IF (plai(nvt_fltr)/=xundef) ph_veg(nvt_fltr) = plai(nvt_fltr) / 6.
625  ENDIF
626 ELSE
627  IF (ph_tree(nvt_tebd)/=xundef) ph_veg(nvt_tebd) = ph_tree(nvt_tebd) ! broadleaf forest
628  IF (ph_tree(nvt_bone)/=xundef) ph_veg(nvt_bone) = ph_tree(nvt_bone) ! coniferous forest
629  IF (ph_tree(nvt_trbe)/=xundef) ph_veg(nvt_trbe) = ph_tree(nvt_trbe) ! euqatorial forest
630  IF (ph_tree(nvt_trbd)/=xundef) ph_veg(nvt_trbd) = ph_tree(nvt_trbd) ! broadleaf forest
631  IF (ph_tree(nvt_tebe)/=xundef) ph_veg(nvt_tebe) = ph_tree(nvt_tebe) ! coniferous forest
632  IF (ph_tree(nvt_tene)/=xundef) ph_veg(nvt_tene) = ph_tree(nvt_tene) ! euqatorial forest
633  IF (ph_tree(nvt_bobd)/=xundef) ph_veg(nvt_bobd) = ph_tree(nvt_bobd) ! broadleaf forest
634  IF (ph_tree(nvt_bond)/=xundef) ph_veg(nvt_bond) = ph_tree(nvt_bond) ! coniferous forest
635  IF (ph_tree(nvt_shrb)/=xundef) ph_veg(nvt_shrb) = ph_tree(nvt_shrb) ! euqatorial forest
636  IF (nvt_fltr>0) THEN
637  IF (ph_tree(nvt_fltr)/=xundef) ph_veg(nvt_fltr) = ph_tree(nvt_fltr)
638  ENDIF
639 END IF
640 IF (plai(nvt_gras)/=xundef) ph_veg(nvt_gras) = plai(nvt_gras) / 6. ! grassland
641 IF (plai(nvt_bogr)/=xundef) ph_veg(nvt_bogr) = plai(nvt_bogr) / 6. ! boreal grassland
642 IF (plai(nvt_trog)/=xundef) ph_veg(nvt_trog) = plai(nvt_trog) / 6. ! tropical grassland
643 IF(oagri_to_grass)THEN
644  IF (nvt_c3>0) THEN
645  IF (plai(nvt_c3 )/=xundef) ph_veg(nvt_c3 ) = plai(nvt_c3) / 6. ! cultures
646  ELSEIF (nvt_c3w>0 .AND. nvt_c3s>0) THEN
647  IF (plai(nvt_c3w )/=xundef) ph_veg(nvt_c3w ) = plai(nvt_c3w) / 6.
648  IF (plai(nvt_c3s )/=xundef) ph_veg(nvt_c3s ) = plai(nvt_c3s) / 6.
649  ENDIF
650  IF (plai(nvt_c4 )/=xundef) ph_veg(nvt_c4 ) = plai(nvt_c4) / 6. ! C4 types
651  IF (nvt_irr>0) THEN
652  IF (plai(nvt_irr )/=xundef) ph_veg(nvt_irr ) = plai(nvt_irr) / 6. ! irrigated crops (as C4)
653  ENDIF
654 ELSE
655  IF (nvt_c3>0) THEN
656  IF (zallen_h(nvt_c3 )/=xundef) ph_veg(nvt_c3 ) = min(1. , zallen_h(nvt_c3) ) ! cultures
657  ELSEIF (nvt_c3w>0 .AND. nvt_c3s>0) THEN
658  IF (zallen_h(nvt_c3w )/=xundef) ph_veg(nvt_c3w ) = min(1. , zallen_h(nvt_c3w) )
659  IF (zallen_h(nvt_c3s )/=xundef) ph_veg(nvt_c3s ) = min(1. , zallen_h(nvt_c3s) )
660  ENDIF
661  IF (zallen_h(nvt_c4 )/=xundef) ph_veg(nvt_c4 ) = min(2.5, zallen_h(nvt_c4) ) ! C4 types
662  IF (nvt_irr>0) THEN
663  IF (zallen_h(nvt_irr )/=xundef) ph_veg(nvt_irr ) = min(2.5, zallen_h(nvt_irr) ) ! irrigated crops (as C4)
664  ENDIF
665 ENDIF
666 ph_veg(nvt_no ) = 0.1 ! no vegetation (smooth)
667 ph_veg(nvt_rock) = 1. ! no vegetation (rocks)
668 ph_veg(nvt_snow) = 0.01 ! no vegetation (snow)
669 !
670 ph_veg(:) = max(ph_veg(:),0.001)
671 
672 !
673 IF (lhook) CALL dr_hook('MODI_VEG_HEIGHT_FROM_LAI:VEG_HEIGHT_FROM_LAI_VEGTYPE',1,zhook_handle)
674 !
675 END FUNCTION veg_height_from_lai_vegtype
676 !
real function, dimension(size(plai)) veg_height_from_lai_vegtype(PLAI, PH_TREE, OAGRI_TO_GRASS)
real function, dimension(size(pvegtype, 1), size(pvegtype, 2)) veg_height_from_lai_1d(PLAI, PH_TREE, PVEGTYPE, OAGRI_TO_GRASS)
real function, dimension(size(pvegtype, 1), size(pvegtype, 2), size(pvegtype, 3)) veg_height_from_lai_2d(PLAI, PH_TREE, PVEGTYPE, OAGRI_TO_GRASS)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
real function, dimension(size(pvegtype)) veg_height_from_lai_0d(PLAI, PH_TREE, PVEGTYPE, OAGRI_TO_GRASS)