SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
vegetation_update.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 vegetation_update (DTCO, DTI, DTGD, DTGR, IG, I, TGRO, &
7  ptstep,ttime,pcover,ocover, &
8  hisba,oecoclimap, hphoto, oagrip, otr_ml, &
9  hsftype, plai,pveg,pz0, &
10  palbnir,palbvis,palbuv,pemis, &
11  prsmin,pgamma,pwrmax_cf, &
12  prgl,pcv, &
13  pgmes,pbslai,plaimin,psefold,pgc,pdmax, &
14  pf2i,ostress, &
15  paosip,paosim,paosjp,paosjm, &
16  pho2ip,pho2im,pho2jp,pho2jm, &
17  pz0effip,pz0effim,pz0effjp,pz0effjm, &
18  halbedo, palbnir_veg, palbvis_veg, palbuv_veg, &
19  palbnir_soil, palbvis_soil, palbuv_soil, &
20  pce_nitro, pcf_nitro, pcna_nitro, &
21  tpseed, tpreap, pwatsup, pirrig, &
22  pgndlitter, prglgv,pgammagv, &
23  prsmingv, pwrmax_cfgv, &
24  ph_veg, plaigv, pz0litter, &
25  odupdated, oabsent )
26 ! ###############################################################
27 !!**** *VEGETATION EVOL*
28 !!
29 !! PURPOSE
30 !! -------
31 !
32 ! performs the time evolution of vegetation parameters
33 ! at UTC midnight for prescribed parameters, with effective change each ten days
34 !
35 !!** METHOD
36 !! ------
37 !!
38 !! EXTERNAL
39 !! --------
40 !! none
41 !!
42 !! IMPLICIT ARGUMENTS
43 !! ------------------
44 !!
45 !! none
46 !!
47 !! REFERENCE
48 !! ---------
49 !!
50 !!
51 !! AUTHOR
52 !! ------
53 !!
54 !! V. Masson * Meteo-France *
55 !!
56 !! MODIFICATIONS
57 !! -------------
58 !! Original 01/03/03
59 !!
60 !! P Le Moigne 09/2005 AGS modifs of L. Jarlan
61 !! P Samuelsson 10/2014 MEB
62 !-------------------------------------------------------------------------------
63 !
64 !* 0. DECLARATIONS
65 ! ------------
66 !
67 !
68 !
69 !
70 !
71 !
73 USE modd_data_isba_n, ONLY : data_isba_t
76 USE modd_isba_grid_n, ONLY : isba_grid_t
77 USE modd_isba_n, ONLY : isba_t
79 !
81 !
82 USE modi_init_isba_mixpar
83 USE modi_convert_patch_isba
84 USE modi_init_from_data_grdn_n
85 USE modi_init_from_data_greenroof_n
87 USE modi_albedo
88 USE modi_update_data_cover
89 !
90 !
91 USE yomhook ,ONLY : lhook, dr_hook
92 USE parkind1 ,ONLY : jprb
93 !
94 IMPLICIT NONE
95 !
96 !* 0.1 declarations of arguments
97 !
98 !
99 !
100 TYPE(data_cover_t), INTENT(INOUT) :: dtco
101 TYPE(data_isba_t), INTENT(INOUT) :: dti
102 TYPE(data_teb_garden_t), INTENT(INOUT) :: dtgd
103 TYPE(data_teb_greenroof_t), INTENT(INOUT) :: dtgr
104 TYPE(isba_grid_t), INTENT(INOUT) :: ig
105 TYPE(isba_t), INTENT(INOUT) :: i
106 TYPE(teb_greenroof_options_t), INTENT(INOUT) :: tgro
107 !
108 REAL, INTENT(IN) :: ptstep ! time step
109 TYPE(date_time), INTENT(IN) :: ttime ! UTC time
110 REAL, DIMENSION(:,:), INTENT(IN) :: pcover ! cover types
111 LOGICAL, DIMENSION(:), INTENT(IN) :: ocover
112  CHARACTER(LEN=*), INTENT(IN) :: hisba ! type of soil (Force-Restore OR Diffusion)
113  CHARACTER(LEN=*), INTENT(IN) :: hphoto ! type of photosynthesis
114 LOGICAL, INTENT(IN) :: oagrip
115 LOGICAL, INTENT(IN) :: otr_ml
116  CHARACTER(LEN=*), INTENT(IN) :: hsftype ! nature / garden
117 LOGICAL, INTENT(IN) :: oecoclimap ! T if ecoclimap is used
118 !
119 REAL, DIMENSION(:,:), INTENT(INOUT) :: plai ! leaf area index (LAI)
120 REAL, DIMENSION(:,:), INTENT(INOUT) :: pveg ! vegetation fraction
121 REAL, DIMENSION(:,:), INTENT(INOUT) :: pz0 ! roughness length: momentum
122 REAL, DIMENSION(:,:), INTENT(INOUT) :: palbnir ! snow-free near-infra-red albedo
123 REAL, DIMENSION(:,:), INTENT(INOUT) :: palbvis ! snow-free visible albedo
124 REAL, DIMENSION(:,:), INTENT(INOUT) :: palbuv ! snow-free UV albedo
125 REAL, DIMENSION(:,:), INTENT(INOUT) :: pemis ! snow-free emissivity
126 !
127 REAL, DIMENSION(:,:), INTENT(INOUT) :: prsmin ! minimal stomatal resistance
128 REAL, DIMENSION(:,:), INTENT(INOUT) :: pgamma !
129 REAL, DIMENSION(:,:), INTENT(INOUT) :: pwrmax_cf !
130 REAL, DIMENSION(:,:), INTENT(INOUT) :: prgl
131 REAL, DIMENSION(:,:), INTENT(INOUT) :: pcv
132 REAL, DIMENSION(:,:), INTENT(INOUT) :: pgmes
133 REAL, DIMENSION(:,:), INTENT(INOUT) :: pce_nitro
134 REAL, DIMENSION(:,:), INTENT(INOUT) :: pcf_nitro
135 REAL, DIMENSION(:,:), INTENT(INOUT) :: pcna_nitro
136 REAL, DIMENSION(:,:), INTENT(INOUT) :: pbslai
137 REAL, DIMENSION(:,:), INTENT(INOUT) :: plaimin
138 REAL, DIMENSION(:,:), INTENT(INOUT) :: psefold
139 REAL, DIMENSION(:,:), INTENT(INOUT) :: pgc
140 REAL, DIMENSION(:,:), INTENT(INOUT) :: pf2i
141 REAL, DIMENSION(:,:), INTENT(INOUT) :: pdmax
142 LOGICAL,DIMENSION(:,:), INTENT(INOUT) :: ostress
143 !
144 ! MEB stuff
145 REAL, DIMENSION(:,:), INTENT(INOUT) :: pgndlitter
146 REAL, DIMENSION(:,:), INTENT(INOUT) :: prglgv
147 REAL, DIMENSION(:,:), INTENT(INOUT) :: pgammagv
148 REAL, DIMENSION(:,:), INTENT(INOUT) :: prsmingv
149 REAL, DIMENSION(:,:), INTENT(INOUT) :: pwrmax_cfgv
150 REAL, DIMENSION(:,:), INTENT(INOUT) :: ph_veg
151 REAL, DIMENSION(:,:), INTENT(INOUT) :: plaigv
152 REAL, DIMENSION(:,:), INTENT(INOUT) :: pz0litter
153 !
154  CHARACTER(LEN=4), INTENT(IN) :: halbedo ! albedo type
155 ! ! 'DRY '
156 ! ! 'EVOL'
157 ! ! 'WET '
158 ! ! 'USER'
159 REAL, DIMENSION(:,:), INTENT(INOUT) :: palbvis_veg ! visible, near infra-red and UV
160 REAL, DIMENSION(:,:), INTENT(INOUT) :: palbnir_veg ! albedo of the vegetation
161 REAL, DIMENSION(:,:), INTENT(INOUT) :: palbuv_veg !
162 REAL, DIMENSION(:,:), INTENT(INOUT) :: palbvis_soil! visible, near infra-red and UV
163 REAL, DIMENSION(:,:), INTENT(INOUT) :: palbnir_soil! soil albedo
164 REAL, DIMENSION(:,:), INTENT(INOUT) :: palbuv_soil !
165 
166 REAL, DIMENSION(:), INTENT(IN) :: paosip ! A/S for increasing x
167 REAL, DIMENSION(:), INTENT(IN) :: paosim ! A/S for decreasing x
168 REAL, DIMENSION(:), INTENT(IN) :: paosjp ! A/S for increasing y
169 REAL, DIMENSION(:), INTENT(IN) :: paosjm ! A/S for decreasing y
170 REAL, DIMENSION(:), INTENT(IN) :: pho2ip ! h/2 for increasing x
171 REAL, DIMENSION(:), INTENT(IN) :: pho2im ! h/2 for decreasing x
172 REAL, DIMENSION(:), INTENT(IN) :: pho2jp ! h/2 for increasing y
173 REAL, DIMENSION(:), INTENT(IN) :: pho2jm ! h/2 for decreasing y
174 !
175 REAL, DIMENSION(:,:), INTENT(INOUT) :: pz0effip! roughness length for increasing x
176 REAL, DIMENSION(:,:), INTENT(INOUT) :: pz0effim! roughness length for decreasing x
177 REAL, DIMENSION(:,:), INTENT(INOUT) :: pz0effjp! roughness length for increasing y
178 REAL, DIMENSION(:,:), INTENT(INOUT) :: pz0effjm! roughness length for decreasing y
179 !
180 TYPE(date_time), DIMENSION(:,:), INTENT(INOUT) :: tpseed ! seeding date
181 TYPE(date_time), DIMENSION(:,:), INTENT(INOUT) :: tpreap ! seeding date
182 !
183 REAL, DIMENSION(:,:), INTENT(INOUT) :: pwatsup ! water supply during irrigation
184 REAL, DIMENSION(:,:), INTENT(INOUT) :: pirrig ! irrigated fraction
185 !
186 LOGICAL, INTENT(OUT) :: odupdated ! T if parameters are being reset
187 LOGICAL,DIMENSION(:), INTENT(IN), OPTIONAL :: oabsent ! T where field is not defined
188 !
189 !* 0.2 declarations of local variables
190 !
191 INTEGER :: idecade, idecade2 ! decade of simulation
192 REAL(KIND=JPRB) :: zhook_handle
193 !-----------------------------------------------------------------
194 !
195 !* 2. Non-interactive vegetation
196 ! --------------------------
197 !
198 !* 2.1 Decade
199 ! ------
200 !
201 IF (lhook) CALL dr_hook('VEGETATION_UPDATE',0,zhook_handle)
202 idecade = 3 * ( ttime%TDATE%MONTH - 1 ) + min(ttime%TDATE%DAY-1,29) / 10 + 1
203 idecade2 = idecade
204 odupdated=.false.
205 !
206 !* 2.2 From ecoclimap
207 ! --------------
208 !
209 !* new decade?
210  IF ( mod(min(ttime%TDATE%DAY,30),10)==1 .AND. ttime%TIME - ptstep < 0.) THEN
211  odupdated=.true.
212 !* time varying parameters
213  IF (oecoclimap .OR. hsftype=='NAT') THEN
214 !* new year ? --> recomputes data LAI and derivated parameters (usefull in case of ecoclimap2)
215  CALL update_data_cover(dtco, dti, ig, i, &
216  ttime%TDATE%YEAR)
217  IF (hsftype=='NAT') CALL init_isba_mixpar(dtco, dti, ig, i, &
218  hisba,idecade,idecade2,pcover,ocover,hphoto,hsftype)
219  CALL convert_patch_isba(dtco, dti, i, &
220  hisba,idecade,idecade2,pcover,ocover,&
221  hphoto,oagrip,.false.,otr_ml,hsftype, &
222  pveg=pveg,plai=plai,prsmin=prsmin, &
223  pgamma=pgamma, pwrmax_cf=pwrmax_cf, &
224  prgl=prgl,pcv=pcv,pz0=pz0, &
225  palbnir_veg=palbnir_veg, &
226  palbvis_veg=palbvis_veg, &
227  palbuv_veg=palbuv_veg, &
228  pemis_eco=pemis,pgmes=pgmes, &
229  pbslai=pbslai, &
230  plaimin=plaimin,psefold=psefold, &
231  pgc=pgc,pf2i=pf2i, &
232  ostress=ostress,pce_nitro=pce_nitro, &
233  pcf_nitro=pcf_nitro, &
234  pcna_nitro=pcna_nitro, &
235  tpseed=tpseed, tpreap=tpreap, &
236  pwatsup=pwatsup,pirrig=pirrig, &
237  pgndlitter=pgndlitter, &
238  prglgv=prglgv,pgammagv=pgammagv, &
239  prsmingv=prsmingv, &
240  pwrmax_cfgv=pwrmax_cfgv, &
241  plaigv=plaigv,pz0litter=pz0litter, &
242  ph_veg=ph_veg )
243  IF ( halbedo=='CM13') THEN
244  CALL convert_patch_isba(dtco, dti, i, &
245  hisba,idecade,idecade2,pcover,ocover,&
246  hphoto,oagrip,.false.,otr_ml,hsftype, &
247  palbnir_soil=palbnir_soil, &
248  palbvis_soil=palbvis_soil, &
249  palbuv_soil=palbuv_soil )
250  ENDIF
251  ELSEIF (hsftype=='GRD') THEN
252  CALL init_from_data_grdn_n(dtgd, &
253  idecade,hphoto, &
254  pveg=pveg(:,1),plai=plai(:,1),pz0=pz0(:,1),pemis=pemis(:,1) )
255 
256  ELSEIF (hsftype=='GNR') THEN
257  CALL init_from_data_greenroof_n(dtgr, tgro, &
258  idecade,hphoto, &
259  pveg=pveg(:,1),plai=plai(:,1),pz0=pz0(:,1),pemis=pemis(:,1) )
260 
261  ENDIF
262 !
263 !* default values to avoid problems in physical routines
264 ! for points where there is no vegetation or soil to be simulated by ISBA.
265  IF (present(oabsent)) THEN
266  WHERE (oabsent(:))
267  pveg(:,1) = 0.
268  plai(:,1) = 0.
269  prsmin(:,1) = 40.
270  pgamma(:,1) = 0.
271  pwrmax_cf(:,1) = 0.2
272  prgl(:,1) = 100.
273  pcv(:,1) = 2.e-5
274  pz0(:,1) = 0.013
275  palbnir_veg(:,1) = 0.30
276  palbvis_veg(:,1) = 0.30
277  palbuv_veg(:,1) = 0.06
278  pemis(:,1) = 0.94
279  END WHERE
280  IF (hphoto/='NON') THEN
281  WHERE (oabsent(:))
282  pgmes(:,1) = 0.020
283  pbslai(:,1) = 0.36
284  plaimin(:,1) = 0.3
285  psefold(:,1) = 90*86400.
286  pgc(:,1) = 0.00025
287  END WHERE
288  IF (hphoto/='AGS' .AND. hphoto/='LAI') THEN
289  WHERE (oabsent(:)) pf2i(:,1) = 0.3
290  IF (hphoto=='NIT' .OR. hphoto=='NCB') THEN
291  WHERE (oabsent(:))
292  pce_nitro(:,1) = 7.68
293  pcf_nitro(:,1) = -4.33
294  pcna_nitro(:,1) = 1.3
295  END WHERE
296  ENDIF
297  ENDIF
298  ENDIF
299  ENDIF
300 
301  IF (hsftype=='NAT') THEN
302 !* albedo
303  CALL albedo(halbedo, &
304  palbvis_veg,palbnir_veg,palbuv_veg,pveg, &
305  palbvis_soil,palbnir_soil,palbuv_soil, &
306  palbvis ,palbnir, palbuv )
307 !
308 !* effective roughness length
309  CALL subscale_z0eff(paosip,paosim,paosjp,paosjm, &
310  pho2ip,pho2im,pho2jp,pho2jm,pz0, &
311  pz0effip,pz0effim,pz0effjp,pz0effjm )
312  ENDIF
313 
314  END IF
315 IF (lhook) CALL dr_hook('VEGETATION_UPDATE',1,zhook_handle)
316 !
317 !* 2.3 Prescribed vegetation
318 ! ---------------------
319 !
320 !-----------------------------------------------------------------
321 !
322 END SUBROUTINE vegetation_update
subroutine init_isba_mixpar(DTCO, DTI, IG, I, HISBA, KDECADE, KDECADE2, PCOVER, OCOVER, HPHOTO, HSFTYPE)
subroutine vegetation_update(DTCO, DTI, DTGD, DTGR, IG, I, TGRO, PTSTEP, TTIME, PCOVER, OCOVER, HISBA, OECOCLIMAP, HPHOTO, OAGRIP, OTR_ML, HSFTYPE, PLAI, PVEG, PZ0, PALBNIR, PALBVIS, PALBUV, PEMIS, PRSMIN, PGAMMA, PWRMAX_CF, PRGL, PCV, PGMES, PBSLAI, PLAIMIN, PSEFOLD, PGC, PDMAX, PF2I, OSTRESS, PAOSIP, PAOSIM, PAOSJP, PAOSJM, PHO2IP, PHO2IM, PHO2JP, PHO2JM, PZ0EFFIP, PZ0EFFIM, PZ0EFFJP, PZ0EFFJM, HALBEDO, PALBNIR_VEG, PALBVIS_VEG, PALBUV_VEG, PALBNIR_SOIL, PALBVIS_SOIL, PALBUV_SOIL, PCE_NITRO, PCF_NITRO, PCNA_NITRO, TPSEED, TPREAP, PWATSUP, PIRRIG, PGNDLITTER, PRGLGV, PGAMMAGV, PRSMINGV, PWRMAX_CFGV, PH_VEG, PLAIGV, PZ0LITTER, ODUPDATED, OABSENT)
subroutine init_from_data_grdn_n(DTGD, KDECADE, HPHOTO, PVEG, PLAI, PRSMIN, PGAMMA, PWRMAX_CF, PRGL, PCV, PDG, PD_ICE, PZ0, PZ0_O_Z0H, PALBNIR_VEG, PALBVIS_VEG, PALBUV_VEG, PEMIS, PVEGTYPE, PROOTFRAC, PGMES, PBSLAI, PLAIMIN, PSEFOLD, PGC, PDMAX, PF2I, OSTRESS, PH_TREE, PRE25, PCE_NITRO, PCF_NITRO, PCNA_NITRO, PALBNIR_SOIL, PALBVIS_SOIL, PALBUV_SOIL)
subroutine init_from_data_greenroof_n(DTGR, TGRO, KDECADE, HPHOTO, POM_GR, PSAND_GR, PCLAY_GR, PVEG, PLAI, PRSMIN, PGAMMA, PWRMAX_CF, PRGL, PCV, PDG, PD_ICE, PZ0, PZ0_O_Z0H, PALBNIR_VEG, PALBVIS_VEG, PALBUV_VEG, PEMIS, PVEGTYPE, PROOTFRAC, PGMES, PBSLAI, PLAIMIN, PSEFOLD, PGC, PDMAX, PF2I, OSTRESS, PH_TREE, PRE25, PCE_NITRO, PCF_NITRO, PCNA_NITRO, PALBNIR_SOIL, PALBVIS_SOIL, PALBUV_SOIL)
subroutine update_data_cover(DTCO, DTI, IG, I, KYEAR)
subroutine convert_patch_isba(DTCO, DTI, I, HISBA, KDECADE, KDECADE2, PCOVER, OCOVER, HPHOTO, OAGRIP, OPERM, OTR_ML, HSFTYPE, PVEG, PLAI, PRSMIN, PGAMMA, PWRMAX_CF, PRGL, PCV, PSOILGRID, PDG, KWG_LAYER, PDROOT, PDG2, PZ0, PZ0_O_Z0H, PALBNIR_VEG, PALBVIS_VEG, PALBUV_VEG, PEMIS_ECO, PVEGTYPE, PROOTFRAC, PGMES, PBSLAI, PLAIMIN, PSEFOLD, PGC, PDMAX, PF2I, OSTRESS, PH_TREE, PRE25, PCE_NITRO, PCF_NITRO, PCNA_NITRO, PD_ICE, PWG1, PALBNIR_SOIL, PALBVIS_SOIL, PALBUV_SOIL, TPSEED, TPREAP, PWATSUP, PIRRIG, PGNDLITTER, PRGLGV, PGAMMAGV, PRSMINGV, PROOTFRACGV, PWRMAX_CFGV, PLAIGV, PZ0LITTER, PH_VEG)