SURFEX v8.1
General documentation of Surfex
get_vegn.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 ! #######################################################################
6  SUBROUTINE get_veg_n(HPROGRAM, KI, U, IO, S, NP, NPE, PLAI, PVH)
7 ! #######################################################################
8 !
9 !!**** *GET_VEG_n* - gets some veg fields on atmospheric grid
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !! This program returns some veg variables needed by the atmosphere
15 !!
16 !! EXTERNAL
17 !! --------
18 !!
19 !! IMPLICIT ARGUMENTS
20 !! ------------------
21 !!
22 !! REFERENCE
23 !! ---------
24 !!
25 !! AUTHOR
26 !! ------
27 !! P. Aumond
28 !!
29 !! MODIFICATIONS
30 !! -------------
31 !! Original 07/2009
32 !-------------------------------------------------------------------------------
33 !
34 !* 0. DECLARATIONS
35 ! ------------
36 !
37 USE modd_surf_atm_n, ONLY : surf_atm_t
40 !
41 USE modd_surf_par, ONLY : xundef
42 USE modd_data_cover_par
43 
44 USE modi_get_luout
45 USE modi_vegtype_to_patch
46 !
47 USE modi_abor1_sfx
48 !
49 IMPLICIT NONE
50 !
51 !* 0.1 Declarations of arguments
52 ! -------------------------
53 !
54  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM
55 INTEGER, INTENT(IN) :: KI ! number of points
56 !
57 TYPE(surf_atm_t), INTENT(INOUT) :: U
58 TYPE(isba_options_t), INTENT(INOUT) :: IO
59 TYPE(isba_s_t), INTENT(INOUT) :: S
60 TYPE(isba_np_t), INTENT(INOUT) :: NP
61 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
62 !
63 REAL, DIMENSION(KI), INTENT(OUT) :: PVH ! Tree height
64 REAL, DIMENSION(KI), INTENT(OUT) :: PLAI
65 !-------------------------------------------------------------------------------
66 !
67 !
68 !* 0.2 Declarations of local variables
69 ! -------------------------------
70 !
71 ! Arrays defined for each tile
72 !
73 !
74 TYPE(isba_p_t), POINTER :: PK
75 TYPE(isba_pe_t), POINTER :: PEK
76 INTEGER :: JI,JJ ! loop index over tiles
77 INTEGER :: ILUOUT ! unit numberi
78 REAL, DIMENSION(U%NSIZE_NATURE) :: ZH_TREE, ZLAI,ZWORK
79 INTEGER:: IPATCH_TRBE, IPATCH_TRBD, IPATCH_TEBE, IPATCH_TEBD, IPATCH_TENE, &
80  IPATCH_BOBD, IPATCH_BONE, IPATCH_BOND, IMASK, JP
81 !
82 !-------------------------------------------------------------------------------
83 !
84 !* 0. Logical unit for writing out
85 !
86  CALL get_luout(hprogram,iluout)
87 !
88 !-------------------------------------------------------------------------------
89 !
90 !* 1. Passage dur le masque global
91 ! -------------------------------
92 
93 ipatch_trbe = vegtype_to_patch(nvt_trbe, io%NPATCH)
94 ipatch_trbd = vegtype_to_patch(nvt_trbd, io%NPATCH)
95 ipatch_tebe = vegtype_to_patch(nvt_tebe, io%NPATCH)
96 ipatch_tebd = vegtype_to_patch(nvt_tebd, io%NPATCH)
97 ipatch_tene = vegtype_to_patch(nvt_tene, io%NPATCH)
98 ipatch_bobd = vegtype_to_patch(nvt_bobd, io%NPATCH)
99 ipatch_bone = vegtype_to_patch(nvt_bone, io%NPATCH)
100 ipatch_bond = vegtype_to_patch(nvt_bond, io%NPATCH)
101 
102 
103 zwork(:) = s%XVEGTYPE(:,nvt_trbe) + s%XVEGTYPE(:,nvt_trbd) + s%XVEGTYPE(:,nvt_tebe) + &
104  s%XVEGTYPE(:,nvt_tebd) + s%XVEGTYPE(:,nvt_tene) + s%XVEGTYPE(:,nvt_bobd) + &
105  s%XVEGTYPE(:,nvt_bone) + s%XVEGTYPE(:,nvt_bond)
106 
107 zh_tree(:) = 0.
108 zlai(:) = 0.
109 !
110 DO jp = 1,io%NPATCH
111  !
112  IF (jp==ipatch_trbe .OR. jp==ipatch_trbd .OR. jp==ipatch_tebe .OR. jp==ipatch_tebd .OR. &
113  jp==ipatch_tene .OR. jp==ipatch_bobd .OR. jp==ipatch_bone .OR. jp==ipatch_bond) THEN
114  !
115  pk => np%AL(jp)
116  pek => npe%AL(jp)
117  !
118  DO jj=1,pk%NSIZE_P
119  !
120  imask = pk%NR_P(jj)
121  !
122  IF (s%XVEGTYPE(imask,jp)/=0) THEN
123  !
124  zh_tree(imask) = zh_tree(imask) + pk%XH_TREE(jj) * pk%XPATCH(jj)
125  !
126  zlai(imask) = zlai(imask) + pek%XLAI(jj) * pk%XPATCH(jj)
127  !
128  ENDIF
129  !
130  ENDDO
131  !
132  ENDIF
133  !
134 ENDDO
135 !
136 WHERE(zwork(:)/=0.)
137  zh_tree(:) = zh_tree(:)/zwork(:)
138  zlai(:) = zlai(:)/zwork(:)
139 END WHERE
140 !
141 zlai(:) = u%XNATURE(:) * zlai(:)
142 !
143 !* 2. Envoi les variables vers mesonH
144 ! ------------------------------
145 
146 IF ( SIZE(pvh) /= SIZE(zh_tree) ) THEN
147  WRITE(iluout,*) 'try to get VH field from atmospheric model, but size is not correct'
148  WRITE(iluout,*) 'size of field expected by the atmospheric model (PVH) :', SIZE(pvh)
149  WRITE(iluout,*) 'size of field inthe surface (XVH) :', SIZE(zh_tree)
150  CALL abor1_sfx('GET_VHN: VH SIZE NOT CORRECT')
151 ELSE
152  pvh = zh_tree
153 END IF
154 !
155 !==============================================================================
156 !
157 !-------------------------------------------------------------------------------
158 !
159 IF ( SIZE(plai) /= SIZE(zlai) ) THEN
160  WRITE(iluout,*) 'try to get LAI field from atmospheric model, but size is not correct'
161  WRITE(iluout,*) 'size of field expected by the atmospheric model (PLAI) :', SIZE(plai)
162  WRITE(iluout,*) 'size of field inthe surface (XLAI) :', SIZE(zlai)
163  CALL abor1_sfx('GET_LAIN: LAI SIZE NOT CORRECT')
164 ELSE
165  plai = zlai
166 END IF
167 !
168 !==============================================================================
169 !
170 !-------------------------------------------------------------------------------
171 !
172 !==============================================================================
173 !
174 END SUBROUTINE get_veg_n
integer function vegtype_to_patch(IVEGTYPE, INPATCH)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
subroutine get_veg_n(HPROGRAM, KI, U, IO, S, NP, NPE, PLAI, PVH)
Definition: get_vegn.F90:7