SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
extrapol_fields.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 SUBROUTINE extrapol_fields (DTCO, DTI, IG, I, UG, U, &
6  hprogram,kluout)
7 !!
8 !! PURPOSE
9 !! -------
10 !! parameters defined by cover need to be extrapolated if LDATA_VEGTYPE and NOT LDATA_"PARAM"
11 !! all ten-day periods are calculated one time for all, then written in PGD.txt
12 !!
13 !! METHOD
14 !! ------
15 !! these parameters are: LAI, HT, DG, ROOTFRAC, IRRIG, WATSUP
16 !! Parameters are calculated as in ecoclimap, by vegtype, and then extrapolated
17 !
18 !! EXTERNAL
19 !! --------
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !! AUTHOR
28 !! ------
29 !!
30 !! S. Faroux Meteo-France
31 !!
32 !! MODIFICATION
33 !! ------------
34 !!
35 !! Original 16/11/10
36 !! R. Alkama 04/12 : add 6 new tree vegtype (9 instead 3)
37 !!
38 !! DECLARATIONS
39 !!
40 !
41 !
43 USE modd_data_isba_n, ONLY : data_isba_t
44 USE modd_isba_grid_n, ONLY : isba_grid_t
45 USE modd_isba_n, ONLY : isba_t
47 USE modd_surf_atm_n, ONLY : surf_atm_t
48 !
49 USE modd_surf_par, ONLY : xundef
50 !
51 USE modd_reprod_oper, ONLY : cdgdif, cdgavg
52 !
53 USE modd_data_cover_par, ONLY : nvegtype, nvt_no, nvt_rock, nvt_snow, jpcover
54 !
55 USE modd_data_cover, ONLY : xdata_lai, xdata_h_tree, &
56  xdata_irrig, xdata_watsup, &
57  xdata_garden, xdata_nature, &
58  xdata_root_depth, xdata_root_depthgv, xdata_ground_depth, &
59  xdata_root_extinction, xdata_root_lin
60 !
61 !
62 !
63 USE modi_av_pgd
64 USE modi_ini_var_from_vegtype_data
65 !
66 USE yomhook ,ONLY : lhook, dr_hook
67 USE parkind1 ,ONLY : jprb
68 !
69 IMPLICIT NONE
70 !
71 !* 0.1 Declaration of arguments
72 ! ------------------------
73 !
74 !
75 TYPE(data_cover_t), INTENT(INOUT) :: dtco
76 TYPE(data_isba_t), INTENT(INOUT) :: dti
77 TYPE(isba_grid_t), INTENT(INOUT) :: ig
78 TYPE(isba_t), INTENT(INOUT) :: i
79 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
80 TYPE(surf_atm_t), INTENT(INOUT) :: u
81 !
82  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! host program
83 INTEGER, INTENT(IN) :: kluout
84 !
85 !
86 !* 0.2 Declaration of local variables
87 ! ------------------------------
88 !
89 REAL, DIMENSION (SIZE(XDATA_GROUND_DEPTH,1),NVEGTYPE) :: zdata_ground_depth
90 !
91  CHARACTER(LEN=3) :: ytree, ynat, yveg, ydif, yroot
92 REAL, DIMENSION(IG%NDIM,36,NVEGTYPE) :: zwork
93 REAL, DIMENSION(NVEGTYPE) :: zdef
94 REAL :: zfrac
95 INTEGER :: jtime, jvegtype, jcover
96 !
97 REAL(KIND=JPRB) :: zhook_handle
98 !
99 !----------------------------------------------------------------------------
100 IF (lhook) CALL dr_hook('EXTRAPOL_FIELDS',0,zhook_handle)
101 !
102 ynat ='NAT'
103 ytree='TRE'
104 yveg ='VEG'
105 ydif ='DVG'
106 !
107 ! 2. Extrapolations for land use or user
108 ! --------------------------------------
109 !
110 ! LAI
111 ! ---
112 IF (.NOT.dti%LDATA_LAI) THEN
113 !
114  DO jtime=1,36
115 !
116 ! ECOCLIMAP spatial distribution field
117  IF (ASSOCIATED(dtco%XDATA_WEIGHT)) DEALLOCATE(dtco%XDATA_WEIGHT)
118  CALL av_pgd(dtco, &
119  zwork(:,jtime,:),i%XCOVER,xdata_lai(:,jtime,:),yveg,'ARI',i%LCOVER,kdecade=jtime)
120  DO jvegtype=1,3
121  WHERE (dti%XPAR_VEGTYPE(:,jvegtype)/=0.) zwork(:,jtime,jvegtype) = 0.
122  ENDDO
123  !
124  zdef(:) = xundef
125  DO jvegtype=1,nvegtype
126  IF (any(dti%XPAR_VEGTYPE(:,jvegtype)/=0.) .AND. all(zwork(:,jtime,jvegtype)==xundef)) THEN
127  zfrac = 0.
128  DO jcover = 1,jpcover
129  IF (dtco%XDATA_VEGTYPE(jcover,jvegtype)>zfrac) THEN
130  zdef(jvegtype) = xdata_lai(jcover,jtime,jvegtype)
131  zfrac = dtco%XDATA_VEGTYPE(jcover,jvegtype)
132  IF (zfrac==1.) EXIT
133  ENDIF
134  ENDDO
135  ENDIF
136  ENDDO
137  !
138 ! Extrapolation toward new vegtype distribution field from updated land-use map or user
139  CALL ini_var_from_vegtype_data(dtco, dti, ug, u, &
140  hprogram,kluout,'LAI: leaf area index',zwork(:,jtime,:),pdef=zdef)
141 !
142  ENDDO
143 !
144  CALL goto_ntime(dti%NTIME,zwork,dti%XPAR_LAI)
145 !
146  dti%LDATA_LAI=.true.
147 !
148 ENDIF
149 !
150 ! H_TREE
151 ! ------
152 IF (.NOT.dti%LDATA_H_TREE .AND. (i%CPHOTO/='NON' .OR. .NOT.dti%LDATA_Z0)) THEN
153 !
154  zdef(:)=1.
155  zdef(4:6)=10.
156  zdef(13:17)=10.
157  zdef(19)=1.
158 !
159 ! ECOCLIMAP spatial distribution field
160  IF (ASSOCIATED(dtco%XDATA_WEIGHT)) DEALLOCATE(dtco%XDATA_WEIGHT)
161  CALL av_pgd(dtco, &
162  dti%XPAR_H_TREE,i%XCOVER,xdata_h_tree,ytree,'ARI',i%LCOVER,kdecade=1)
163 !
164 ! Extrapolation toward new vegtype distribution field from updated land-use map or user
165  CALL ini_var_from_vegtype_data(dtco, dti, ug, u, &
166  hprogram,kluout,'H_TREE: height of trees',dti%XPAR_H_TREE,pdef=zdef)
167 !
168  dti%LDATA_H_TREE=.true.
169 !
170 ENDIF
171 !
172 ! DG
173 ! --
174 !
175 !ROOT_DEPTH is needed for DIF, 2-L, 3-L
176 IF (.NOT.dti%LDATA_DG .AND. .NOT.dti%LDATA_ROOT_DEPTH) THEN
177  yroot=ynat
178  IF(i%CISBA=='DIF')yroot=ydif
179  IF (ASSOCIATED(dtco%XDATA_WEIGHT)) DEALLOCATE(dtco%XDATA_WEIGHT)
180  CALL av_pgd(dtco, &
181  dti%XPAR_ROOT_DEPTH(:,:),i%XCOVER,xdata_root_depth(:,:),ynat,cdgavg,i%LCOVER,kdecade=1)
182 
183  zdef(:) = xundef
184  DO jvegtype=1,nvegtype
185  IF (any(dti%XPAR_VEGTYPE(:,jvegtype)/=0.) .AND. all(dti%XPAR_ROOT_DEPTH(:,jvegtype)==xundef)) THEN
186  zfrac = 0.
187  DO jcover = 1,jpcover
188  IF (dtco%XDATA_VEGTYPE(jcover,jvegtype)>zfrac) THEN
189  zdef(jvegtype) = xdata_root_depth(jcover,jvegtype)
190  zfrac = dtco%XDATA_VEGTYPE(jcover,jvegtype)
191  IF (zfrac==1.) EXIT
192  ENDIF
193  ENDDO
194  ENDIF
195  ENDDO
196 
197  CALL ini_var_from_vegtype_data(dtco, dti, ug, u, &
198  hprogram,kluout,'ROOTDEPTH', dti%XPAR_ROOT_DEPTH(:,:),pdef=zdef)
199  dti%LDATA_ROOT_DEPTH = .true.
200 ENDIF
201 !
202 !ROOT_DEPTH is needed for DIF, 2-L, 3-L
203 IF (.NOT.dti%LDATA_DG .AND. .NOT.dti%LDATA_ROOT_DEPTHGV) THEN
204  yroot=ynat
205  IF(i%CISBA=='DIF')yroot=ydif
206  IF (ASSOCIATED(dtco%XDATA_WEIGHT)) DEALLOCATE(dtco%XDATA_WEIGHT)
207  CALL av_pgd(dtco, &
208  dti%XPAR_ROOT_DEPTHGV(:,:),i%XCOVER,xdata_root_depthgv(:,:),ynat,cdgavg,i%LCOVER,kdecade=1)
209 
210  zdef(:) = xundef
211  DO jvegtype=1,nvegtype
212  IF (any(dti%XPAR_VEGTYPE(:,jvegtype)/=0.) .AND. all(dti%XPAR_ROOT_DEPTHGV(:,jvegtype)==xundef)) THEN
213  zfrac = 0.
214  DO jcover = 1,jpcover
215  IF (dtco%XDATA_VEGTYPE(jcover,jvegtype)>zfrac) THEN
216  zdef(jvegtype) = xdata_root_depthgv(jcover,jvegtype)
217  zfrac = dtco%XDATA_VEGTYPE(jcover,jvegtype)
218  IF (zfrac==1.) EXIT
219  ENDIF
220  ENDDO
221  ENDIF
222  ENDDO
223 
224  CALL ini_var_from_vegtype_data(dtco, dti, ug, u, &
225  hprogram,kluout,'ROOTDEPTH', dti%XPAR_ROOT_DEPTHGV(:,:),pdef=zdef)
226  dti%LDATA_ROOT_DEPTHGV = .true.
227 ENDIF
228 !
229 !GROUND_DEPTH is needed for DIF and 3-L
230 IF (.NOT.dti%LDATA_DG .AND. i%CISBA/='2-L' .AND. .NOT.dti%LDATA_GROUND_DEPTH) THEN
231  zdata_ground_depth(:,:)=xdata_ground_depth(:,:)
232  IF(i%CISBA=='DIF'.AND.cdgdif=='ROOT')THEN
233  DO jvegtype=1,nvegtype
234  IF(jvegtype==nvt_no)THEN
235  WHERE(xdata_ground_depth(:,jvegtype)/=xundef)
236  zdata_ground_depth(:,jvegtype) = min(1.0,xdata_ground_depth(:,jvegtype))
237  ENDWHERE
238  ELSEIF(jvegtype/=nvt_rock.AND.jvegtype/=nvt_snow)THEN
239  zdata_ground_depth(:,jvegtype) = max(1.0,xdata_root_depth(:,jvegtype))
240  ELSE
241  zdata_ground_depth(:,jvegtype) = xdata_root_depth(:,jvegtype)
242  ENDIF
243  ENDDO
244  ENDIF
245  IF (ASSOCIATED(dtco%XDATA_WEIGHT)) DEALLOCATE(dtco%XDATA_WEIGHT)
246  CALL av_pgd(dtco, &
247  dti%XPAR_GROUND_DEPTH(:,:),i%XCOVER,zdata_ground_depth(:,:),ynat,cdgavg,i%LCOVER,kdecade=1)
248 
249  zdef(:) = xundef
250  DO jvegtype=1,nvegtype
251  IF (any(dti%XPAR_VEGTYPE(:,jvegtype)/=0.) .AND. all(dti%XPAR_GROUND_DEPTH(:,jvegtype)==xundef)) THEN
252  zfrac = 0.
253  DO jcover = 1,jpcover
254  IF (dtco%XDATA_VEGTYPE(jcover,jvegtype)>zfrac) THEN
255  zdef(jvegtype) = xdata_ground_depth(jcover,jvegtype)
256  zfrac = dtco%XDATA_VEGTYPE(jcover,jvegtype)
257  IF (zfrac==1.) EXIT
258  ENDIF
259  ENDDO
260  ENDIF
261  ENDDO
262 
263  CALL ini_var_from_vegtype_data(dtco, dti, ug, u, &
264  hprogram,kluout,'GROUNDDEPTH', dti%XPAR_GROUND_DEPTH(:,:),pdef=zdef)
265  dti%LDATA_GROUND_DEPTH = .true.
266 ENDIF
267 !
268 ! IRRIG
269 ! -----
270 IF (.NOT.dti%LDATA_IRRIG) THEN
271  zdef(:)=0.
272  DO jtime=1,36
273 ! ECOCLIMAP spatial distribution field
274  IF (ASSOCIATED(dtco%XDATA_WEIGHT)) DEALLOCATE(dtco%XDATA_WEIGHT)
275  CALL av_pgd(dtco, &
276  zwork(:,jtime,:),i%XCOVER,xdata_irrig,yveg,'ARI',i%LCOVER,kdecade=jtime)
277 ! Extrapolation toward new vegtype distribution field from updated land-use map or user
278  CALL ini_var_from_vegtype_data(dtco, dti, ug, u, &
279  hprogram,kluout,'IRRIG ', zwork(:,jtime,:), pdef=zdef)
280  ENDDO
281 !
282  CALL goto_ntime(dti%NTIME,zwork,dti%XPAR_IRRIG)
283 !
284  dti%LDATA_IRRIG=.true.
285 !
286 ENDIF
287 !
288 ! WATSUP
289 ! ------
290 IF (.NOT.dti%LDATA_WATSUP) THEN
291  zdef(:)=0.
292  DO jtime=1,36
293 ! ECOCLIMAP spatial distribution field
294  IF (ASSOCIATED(dtco%XDATA_WEIGHT)) DEALLOCATE(dtco%XDATA_WEIGHT)
295  CALL av_pgd(dtco, &
296  zwork(:,jtime,:),i%XCOVER,xdata_watsup,yveg,'ARI',i%LCOVER,kdecade=jtime)
297 ! Extrapolation toward new vegtype distribution field from updated land-use map or user
298  CALL ini_var_from_vegtype_data(dtco, dti, ug, u, &
299  hprogram,kluout,'WATSUP ', zwork(:,jtime,:), pdef=zdef)
300  ENDDO
301  !
302  CALL goto_ntime(dti%NTIME,zwork,dti%XPAR_WATSUP)
303  !
304  dti%LDATA_WATSUP=.true.
305 ENDIF
306 !
307 IF (lhook) CALL dr_hook('EXTRAPOL_FIELDS',1,zhook_handle)
308 !
309  CONTAINS
310 !
311 SUBROUTINE goto_ntime(KTIME,PWORK,PPAR_DATA)
312 !
313 INTEGER, INTENT(IN) :: ktime
314 REAL, DIMENSION(:,:,:), INTENT(IN) :: pwork
315 REAL, DIMENSION(:,:,:), INTENT(OUT) :: ppar_data
316 !
317 IF (ktime==1) THEN
318  ppar_data(:,1,:) = sum(pwork(:,:,:),2)/36.
319 ELSEIF (ktime==2) THEN
320  ppar_data(:,1,:) = (sum(pwork(:,1:8,:),2) + sum(pwork(:,27:36,:),2))/18.
321  ppar_data(:,2,:) = sum(pwork(:,9:26,:),2)/18.
322 ELSEIF (ktime==12) THEN
323  DO jtime=1,12
324  ppar_data(:,jtime,:) = sum(pwork(:,(jtime-1)*3+1:jtime*3,:),2)/3.
325  ENDDO
326 ELSEIF (ktime==36) THEN
327  ppar_data(:,:,:) = pwork(:,:,:)
328 ENDIF
329 !
330 END SUBROUTINE goto_ntime
331 !
332 !-------------------------------------------------------------------------------
333 END SUBROUTINE extrapol_fields
subroutine ini_var_from_vegtype_data(DTCO, DTI, UG, U, HPROGRAM, ILUOUT, HNAME, PFIELD, PDEF)
subroutine goto_ntime(KTIME, PWORK, PPAR_DATA)
subroutine extrapol_fields(DTCO, DTI, IG, I, UG, U, HPROGRAM, KLUOUT)