SURFEX v8.1
General documentation of Surfex
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, DTV, KDIM, IO, KK, PK, PEK, KPATCH, &
7  PTSTEP, TTIME ,PCOVER, OCOVER, &
8  OAGRIP, HSFTYPE, OALB, ISSK, ODUPDATED, OABSENT )
9 ! ###############################################################
10 !!**** *VEGETATION EVOL*
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 ! performs the time evolution of vegetation parameters
16 ! at UTC midnight for prescribed parameters, with effective change each ten days
17 !
18 !!** METHOD
19 !! ------
20 !!
21 !! EXTERNAL
22 !! --------
23 !! none
24 !!
25 !! IMPLICIT ARGUMENTS
26 !! ------------------
27 !!
28 !! none
29 !!
30 !! REFERENCE
31 !! ---------
32 !!
33 !!
34 !! AUTHOR
35 !! ------
36 !!
37 !! V. Masson * Meteo-France *
38 !!
39 !! MODIFICATIONS
40 !! -------------
41 !! Original 01/03/03
42 !!
43 !! P Le Moigne 09/2005 AGS modifs of L. Jarlan
44 !! P Samuelsson 10/2014 MEB
45 !-------------------------------------------------------------------------------
46 !
47 !* 0. DECLARATIONS
48 ! ------------
49 !
51 USE modd_sso_n, ONLY : sso_t
53 USE modd_data_isba_n, ONLY : data_isba_t
55 !
56 USE modd_data_cover_par, ONLY : nvt_snow
58 !
59 USE modi_init_isba_mixpar
60 USE modi_convert_patch_isba
61 USE modi_init_from_data_teb_veg_n
62 USE modi_subscale_z0eff
63 USE modi_albedo
64 USE modi_update_data_cover
65 !
66 !
67 USE yomhook ,ONLY : lhook, dr_hook
68 USE parkind1 ,ONLY : jprb
69 !
70 IMPLICIT NONE
71 !
72 !* 0.1 declarations of arguments
73 !
74 !
75 !
76 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
77 TYPE(data_isba_t), INTENT(INOUT) :: DTV
78 INTEGER, INTENT(IN) :: KDIM
79 TYPE(isba_options_t), INTENT(INOUT) :: IO
80 TYPE(isba_k_t), INTENT(INOUT) :: KK
81 TYPE(isba_p_t), INTENT(INOUT) :: PK
82 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
83 !
84 INTEGER, INTENT(IN) :: KPATCH
85 !
86 REAL, INTENT(IN) :: PTSTEP ! time step
87 TYPE(date_time), INTENT(IN) :: TTIME ! UTC time
88 REAL, DIMENSION(:,:), INTENT(IN) :: PCOVER ! cover types
89 LOGICAL, DIMENSION(:), INTENT(IN) :: OCOVER
90 LOGICAL, INTENT(IN) :: OAGRIP
91  CHARACTER(LEN=*), INTENT(IN) :: HSFTYPE ! nature / garden
92 !
93 LOGICAL, INTENT(IN) :: OALB
94 !
95 TYPE(sso_t), INTENT(INOUT) :: ISSK
96 !
97 LOGICAL, INTENT(OUT) :: ODUPDATED ! T if parameters are being reset
98 LOGICAL,DIMENSION(:), INTENT(IN), OPTIONAL :: OABSENT ! T where field is not defined
99 !
100 !* 0.2 declarations of local variables
101 !
102 INTEGER :: IDECADE, IDECADE2, JI, ISNOWPATCH ! decade of simulation
103 REAL(KIND=JPRB) :: ZHOOK_HANDLE
104 !-----------------------------------------------------------------
105 !
106 IF (lhook) CALL dr_hook('VEGETATION_UPDATE',0,zhook_handle)
107 !
108 !* 2. Non-interactive vegetation
109 ! --------------------------
110 !
111 !* 2.1 Decade
112 ! ------
113 !
114 idecade = 3 * ( ttime%TDATE%MONTH - 1 ) + min(ttime%TDATE%DAY-1,29) / 10 + 1
115 idecade2 = idecade
116 odupdated=.false.
117 !
118 !* 2.2 From ecoclimap
119 ! --------------
120 !
121 !* new decade?
122 IF ( mod(min(ttime%TDATE%DAY,30),10)==1 .AND. ttime%TIME - ptstep < 0.) THEN
123  !
124  odupdated=.true.
125  !
126  !* time varying parameters
127  IF (io%LECOCLIMAP .OR. hsftype=='NAT') THEN
128  !
129  !* new year ? --> recomputes data LAI and derivated parameters (usefull in case of ecoclimap2)
130  IF (kpatch==1) CALL update_data_cover(dtco, dtv, kdim, io%NPATCH, io%LMEB_PATCH, ttime%TDATE%YEAR)
131  !
132  IF (hsftype=='NAT') THEN
133  !
134  IF (kpatch==1) THEN
135  CALL init_isba_mixpar(dtco, dtv, kdim, io, idecade,idecade2,pcover,ocover,hsftype)
136  ELSE
137  idecade2 = idecade
138  IF (dtv%NTIME==2) idecade2 = idecade2 + 10
139  idecade2 = (idecade2-1) * dtv%NTIME / 36 + 1
140  IF (dtv%NTIME==2 .AND. idecade2==3) idecade2 = 1
141  ENDIF
142  !
143  CALL convert_patch_isba(dtco, dtv, io, idecade, idecade2, pcover, ocover,&
144  oagrip, hsftype, kpatch, kk, pk, pek, &
145  .false., .true., .true., .true., .false., oalb)
146  !
147  ELSE
148  CALL convert_patch_isba(dtco, dtv, io, idecade, idecade2, pcover, ocover,&
149  oagrip, hsftype, kpatch, kk, pk, pek, &
150  .false., .true., .false., .false., .false., oalb)
151  ENDIF
152  !
153  IF ( io%CALBEDO=='CM13') THEN
154  CALL convert_patch_isba(dtco, dtv, io, idecade, idecade2, pcover, ocover,&
155  oagrip, hsftype, kpatch, kk, pk, pek, &
156  .false., .false., .false., .false., .true., .false.)
157  ENDIF
158  !
159  ELSEIF (.NOT.oalb .AND. (hsftype=='GRD'.OR.hsftype=='GNR') ) THEN
160  !
161  CALL init_from_data_teb_veg_n(dtv, kk, pk, pek, idecade, .false., .false., .true., .false. )
162  !
163  ENDIF
164  !
165  !* default values to avoid problems in physical routines
166  ! for points where there is no vegetation or soil to be simulated by ISBA.
167  IF (PRESENT(oabsent) .AND. .NOT.oalb) THEN
168  !
169  WHERE (oabsent(:))
170  pek%XVEG (:) = 0.
171  pek%XLAI (:) = 0.
172  pek%XRSMIN (:) = 40.
173  pek%XGAMMA (:) = 0.
174  pek%XWRMAX_CF (:) = 0.2
175  pek%XRGL (:) = 100.
176  pek%XCV (:) = 2.e-5
177  pek%XZ0 (:) = 0.013
178  pek%XALBNIR_VEG(:) = 0.30
179  pek%XALBVIS_VEG(:) = 0.30
180  pek%XALBUV_VEG (:) = 0.06
181  pek%XEMIS (:) = 0.94
182  END WHERE
183  IF (io%CPHOTO/='NON') THEN
184  WHERE (oabsent(:))
185  pek%XGMES (:) = 0.020
186  pek%XBSLAI (:) = 0.36
187  pek%XLAIMIN (:) = 0.3
188  pek%XSEFOLD (:) = 90*86400.
189  pek%XGC (:) = 0.00025
190  END WHERE
191  WHERE (oabsent(:)) pek%XF2I(:) = 0.3
192  IF (io%CPHOTO=='NIT' .OR. io%CPHOTO=='NCB') THEN
193  WHERE (oabsent(:))
194  pek%XCE_NITRO (:) = 7.68
195  pek%XCF_NITRO (:) = -4.33
196  pek%XCNA_NITRO (:) = 1.3
197  END WHERE
198  ENDIF
199  ENDIF
200  !
201  ENDIF
202  !
203  IF (hsftype=='NAT') THEN
204  !* albedo
205  CALL albedo(io%CALBEDO, pek )
206  !
207  !* effective roughness length
208  IF (.NOT.oalb) CALL subscale_z0eff(issk,pek%XZ0,.false. )
209  !
210  ENDIF
211  !
212 END IF
213 !
214 IF (lhook) CALL dr_hook('VEGETATION_UPDATE',1,zhook_handle)
215 !
216 !-----------------------------------------------------------------
217 !
218 END SUBROUTINE vegetation_update
subroutine init_isba_mixpar(DTCO, DTV, KDIM, IO, KDECADE, KDECADE2, PCOVER, OCOVER, HSFTYP
subroutine update_data_cover(DTCO, DTV, KDIM, KPATCH, OMEB_PATCH,
subroutine convert_patch_isba(DTCO, DTV, IO, KDEC, KDEC2, PCOVER,
subroutine subscale_z0eff(ISSK, PZ0VEG, OZ0REL, OMASK)
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine vegetation_update(DTCO, DTV, KDIM, IO, KK, PK, PEK, KPATCH, PTSTEP, TTIME, PCOVER, OCOVER, OAGRIP, HSFTYPE, OALB, ISSK, ODUPDATED, OABSENT)
subroutine albedo(HALBEDO, PEK, PSNOW, OMASK)
Definition: albedo.F90:7
subroutine init_from_data_teb_veg_n(DTV, K, P, PEK, KDECADE, OUPD