SURFEX v8.1
General documentation of Surfex
pgd_teb_veg.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 pgd_teb_veg (DTCO, UG, U, USS, GDO, GDK, DTGD, GDIR, &
7  GRO, GRS, GRK, DTGR, TOP, KDIM, HPROGRAM)
8 ! ##############################################################
9 !
10 !!**** *PGD_TEB_VEG* monitor for averaging and interpolations of physiographic fields
11 !! for natural covers of TEB
12 !!
13 !! PURPOSE
14 !! -------
15 !!
16 !! METHOD
17 !! ------
18 !!
19 !
20 !! EXTERNAL
21 !! --------
22 !!
23 !! IMPLICIT ARGUMENTS
24 !! ------------------
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !! AUTHOR
30 !! ------
31 !!
32 !! V. Masson Meteo-France
33 !!
34 !! MODIFICATION
35 !! ------------
36 !!
37 !! Original 03/2010
38 !!
39 !! J.Escobar 11/2013 Add USE MODI_PGD_TEB_GREENROOF
40 !! V. Masson 04/2014 Adds Irrigation
41 !! P. Samuelsson 02/2014 Introduced dummy variable in call to READ_NAM_PGD_ISBA for MEB
42 !! B. Decharme 08/16 : soil grdi optimization key
43 !!
44 !----------------------------------------------------------------------------
45 !
46 !* 0. DECLARATION
47 ! -----------
48 !
49 !
52 USE modd_surf_atm_n, ONLY : surf_atm_t
53 USE modd_sso_n, ONLY : sso_t
54 !
56 !
58 USE modd_isba_n, ONLY : isba_s_t, isba_k_t
59 USE modd_data_isba_n, ONLY : data_isba_t
60 USE modd_teb_irrig_n, ONLY : teb_irrig_t
61 !
62 !
63 USE modd_pgd_grid, ONLY : nl
64 USE modd_data_cover_par, ONLY : nvegtype
65 !
66 USE modd_surf_par, ONLY : xundef, nundef
67 USE modd_isba_par, ONLY : noptimlayer, xoptimgrid
68 !
69 USE modi_get_luout
70 USE modi_read_nam_pgd_isba
73 !
74 USE modi_pgd_teb_greenroof
75 USE modi_pgd_teb_garden_par
76 USE modi_pgd_teb_irrig
77 !
78 USE yomhook ,ONLY : lhook, dr_hook
79 USE parkind1 ,ONLY : jprb
80 !
81 USE modi_abor1_sfx
82 !
83 IMPLICIT NONE
84 !
85 !* 0.1 Declaration of arguments
86 ! ------------------------
87 !
88 !
89 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
90 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
91 TYPE(surf_atm_t), INTENT(INOUT) :: U
92 TYPE(sso_t), INTENT(INOUT) :: USS
93 TYPE(isba_options_t), INTENT(INOUT) :: GDO
94 TYPE(isba_k_t), INTENT(INOUT) :: GDK
95 TYPE(data_isba_t), INTENT(INOUT) :: DTGD
96 TYPE(teb_irrig_t), INTENT(INOUT) :: GDIR
97 TYPE(isba_options_t), INTENT(INOUT) :: GRO
98 TYPE(isba_s_t), INTENT(INOUT) :: GRS
99 TYPE(isba_k_t), INTENT(INOUT) :: GRK
100 TYPE(data_isba_t), INTENT(INOUT) :: DTGR
101 TYPE(teb_options_t), INTENT(INOUT) :: TOP
102 !
103 INTEGER, INTENT(IN) :: KDIM
104 !
105  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program
106 ! ! F if all parameters must be specified
107 !
108 !
109 !* 0.2 Declaration of local variables
110 ! ------------------------------
111 !
112 INTEGER :: ILUOUT ! output listing logical unit
113 INTEGER :: JLAYER ! loop counter
114 !
115 !* 0.3 Declaration of namelists
116 ! ------------------------
117 !
118 INTEGER :: IPATCH ! number of patches
119 INTEGER :: IGROUND_LAYER ! number of soil layers
120  CHARACTER(LEN=3) :: YISBA ! ISBA option
121  CHARACTER(LEN=4) :: YPEDOTF ! Pedo-transfert function for DIF
122  CHARACTER(LEN=3) :: YPHOTO ! photosynthesis option
123 LOGICAL :: GTR_ML ! new radiative transfert
124  CHARACTER(LEN=4) :: YALBEDO
125 REAL :: ZRM_PATCH ! threshold to remove little fractions of patches
126  CHARACTER(LEN=28) :: YSAND ! file name for sand fraction
127  CHARACTER(LEN=28) :: YCLAY ! file name for clay fraction
128  CHARACTER(LEN=28) :: YCTI ! file name for topographic index
129  CHARACTER(LEN=28) :: YRUNOFFB ! file name for runoffb parameter
130  CHARACTER(LEN=28) :: YWDRAIN ! file name for wdrain parameter
131  CHARACTER(LEN=6) :: YSANDFILETYPE ! sand data file type
132  CHARACTER(LEN=6) :: YCLAYFILETYPE ! clay data file type
133  CHARACTER(LEN=6) :: YCTIFILETYPE ! topographic index data file type
134  CHARACTER(LEN=6) :: YRUNOFFBFILETYPE ! subgrid runoff data file type
135  CHARACTER(LEN=6) :: YWDRAINFILETYPE ! subgrid drainage data file type
136 REAL :: XUNIF_SAND ! uniform value of sand fraction
137 REAL :: XUNIF_CLAY ! uniform value of clay fraction
138 REAL :: XUNIF_RUNOFFB ! uniform value of subgrid runoff coefficient
139 REAL :: XUNIF_WDRAIN ! uniform subgrid drainage parameter
140 LOGICAL :: LIMP_SAND ! Imposed maps of Sand
141 LOGICAL :: LIMP_CLAY ! Imposed maps of Clay
142 LOGICAL :: LIMP_CTI ! Imposed maps of topographic index statistics
143 REAL, DIMENSION(150) :: ZSOILGRID ! Soil layer thickness for DIF
144 !
145 ! Not used in TEB garden
146 !
147  CHARACTER(LEN=28) :: YSOC_TOP ! file name for organic carbon
148  CHARACTER(LEN=28) :: YSOC_SUB ! file name for organic carbon
149  CHARACTER(LEN=28) :: YPERM ! file name for permafrost distribution
150  CHARACTER(LEN=6) :: YSOCFILETYPE ! organic carbon data file type
151  CHARACTER(LEN=6) :: YPERMFILETYPE ! permafrost distribution data file type
152 REAL :: XUNIF_SOC_TOP ! uniform value of organic carbon top soil (kg/m2)
153 REAL :: XUNIF_SOC_SUB ! uniform value of organic carbon sub soil (kg/m2)
154 REAL :: XUNIF_PERM ! uniform permafrost distribution
155 LOGICAL :: LIMP_SOC ! Imposed maps of organic carbon
156 LOGICAL :: LIMP_PERM ! Imposed maps of permafrost distribution
157 LOGICAL :: GMEB ! Multi-energy balance (MEB)
158  CHARACTER(LEN=28) :: YPH ! file name for pH
159  CHARACTER(LEN=28) :: YFERT ! file name for fertilisation rate
160  CHARACTER(LEN=6) :: YPHFILETYPE ! pH data file type
161  CHARACTER(LEN=6) :: YFERTFILETYPE ! fertilisation data file type
162 REAL :: XUNIF_PH ! uniform value of pH
163 REAL :: XUNIF_FERT ! uniform value of fertilisation rate
164 !
165 REAL(KIND=JPRB) :: ZHOOK_HANDLE
166 !-------------------------------------------------------------------------------
167 !
168 IF (lhook) CALL dr_hook('PGD_TEB_VEG',0,zhook_handle)
169 !
170  CALL get_luout(hprogram,iluout)
171 !
172 !-------------------------------------R-----------------------------------------
173 !
174 !* 1. Reading of namelist NAM_ISBA for general options of vegetation
175 ! --------------------------------------------------------------
176 !
177  CALL read_nam_pgd_isba(hprogram, ipatch, iground_layer, &
178  yisba, ypedotf, yphoto, gtr_ml, yalbedo, zrm_patch, &
179  yclay, yclayfiletype, xunif_clay, limp_clay, &
180  ysand, ysandfiletype, xunif_sand, limp_sand, &
181  ysoc_top, ysoc_sub, ysocfiletype, xunif_soc_top, &
182  xunif_soc_sub, limp_soc, ycti, yctifiletype, limp_cti, &
183  yperm, ypermfiletype, xunif_perm, limp_perm, gmeb, &
184  yrunoffb, yrunoffbfiletype, xunif_runoffb, &
185  ywdrain, ywdrainfiletype , xunif_wdrain, zsoilgrid, &
186  yph, yphfiletype, xunif_ph, yfert, yfertfiletype, &
187  xunif_fert )
188 !
189 gdo%NPATCH = 1
190 gdo%NGROUND_LAYER = iground_layer
191 gdo%CISBA = yisba
192 gdo%CPEDOTF = ypedotf
193 gdo%CPHOTO = yphoto
194 gdo%LTR_ML = gtr_ml
195 gdo%CALBEDO = yalbedo
196 !
197 !-------------------------------------------------------------------------------
198 !
199 !* 2. Coherence of options
200 ! --------------------
201 !
202  CALL test_nam_var_surf(iluout,'CISBA',gdo%CISBA,'2-L','3-L','DIF')
203  CALL test_nam_var_surf(iluout,'CPEDOTF',gdo%CPEDOTF,'CH78','CO84')
204  CALL test_nam_var_surf(iluout,'CPHOTO',gdo%CPHOTO,'NON','AST','NIT','NCB')
205  !
206  IF (gdo%CPHOTO=='NCB') THEN
207  gdo%CPHOTO = 'NIT'
208  WRITE(iluout,*) '****************************************************************'
209  WRITE(iluout,*) '* FOR GARDENS, AGS OPTION HAS BEEN CHANGED FROM "NCB" TO "NIT" *'
210  WRITE(iluout,*) '****************************************************************'
211  END IF
212 !
213  SELECT CASE (gdo%CISBA)
214  CASE ('2-L')
215  gdo%NGROUND_LAYER = 2
216  gdo%CPEDOTF ='CH78'
217  WRITE(iluout,*) '*****************************************'
218  WRITE(iluout,*) '* With option CISBA = ',gdo%CISBA,' *'
219  WRITE(iluout,*) '* the number of soil layers is set to 2 *'
220  WRITE(iluout,*) '* theta(psi) function = Brook and Corey *'
221  WRITE(iluout,*) '* Pedo transfert function = CH78 *'
222  WRITE(iluout,*) '*****************************************'
223  CASE ('3-L')
224  gdo%NGROUND_LAYER = 3
225  gdo%CPEDOTF ='CH78'
226  WRITE(iluout,*) '*****************************************'
227  WRITE(iluout,*) '* With option CISBA = ',gdo%CISBA,' *'
228  WRITE(iluout,*) '* the number of soil layers is set to 3 *'
229  WRITE(iluout,*) '* theta(psi) function = Brook and Corey *'
230  WRITE(iluout,*) '* Pedo transfert function = CH78 *'
231  WRITE(iluout,*) '*****************************************'
232  CASE ('DIF')
233  IF(gdo%NGROUND_LAYER==nundef)THEN
234  IF(top%LECOCLIMAP)THEN
235  gdo%NGROUND_LAYER=noptimlayer
236  ELSE
237  WRITE(iluout,*) '****************************************'
238  WRITE(iluout,*) '* Number of ground layer not specified *'
239  WRITE(iluout,*) '****************************************'
240  CALL abor1_sfx('PGD_TEB_GARDEN: NGROUND_LAYER MUST BE DONE IN NAM_ISBA')
241  ENDIF
242  ENDIF
243 !
244  ALLOCATE(gdo%XSOILGRID(gdo%NGROUND_LAYER))
245  gdo%XSOILGRID(:)=xundef
246  gdo%XSOILGRID(:)=zsoilgrid(1:gdo%NGROUND_LAYER)
247  IF(all(zsoilgrid(:)==xundef))THEN
248  IF(top%LECOCLIMAP) &
249  gdo%XSOILGRID(1:gdo%NGROUND_LAYER)=xoptimgrid(1:gdo%NGROUND_LAYER)
250  ELSEIF(count(gdo%XSOILGRID/=xundef)/=gdo%NGROUND_LAYER)THEN
251  WRITE(iluout,*) '********************************************************'
252  WRITE(iluout,*) '* Soil grid reference values /= number of ground layer *'
253  WRITE(iluout,*) '********************************************************'
254  CALL abor1_sfx('PGD_TEB_GARDEN: XSOILGRID must be coherent with NGROUND_LAYER in NAM_ISBA')
255  ENDIF
256 !
257  WRITE(iluout,*) '*****************************************'
258  WRITE(iluout,*) '* Option CISBA = ',gdo%CISBA
259  WRITE(iluout,*) '* Pedo transfert function = ',gdo%CPEDOTF
260  WRITE(iluout,*) '* Number of soil layers = ',gdo%NGROUND_LAYER
261  IF(top%LECOCLIMAP)THEN
262  WRITE(iluout,*) '* Soil layers grid (m) = ',gdo%XSOILGRID(1:gdo%NGROUND_LAYER)
263  ENDIF
264  WRITE(iluout,*) '*****************************************'
265 
266  END SELECT
267 !
268  SELECT CASE (gdo%CPHOTO)
269  CASE ('AST')
270  gdo%NNBIOMASS = 1
271  CASE ('NIT')
272  gdo%NNBIOMASS = 3
273  END SELECT
274  WRITE(iluout,*) '*****************************************'
275  WRITE(iluout,*) '* With option CPHOTO = ',gdo%CPHOTO,' *'
276  WRITE(iluout,*) '* the number of biomass pools is set to ', gdo%NNBIOMASS
277  WRITE(iluout,*) '*****************************************'
278 !
279 !-------------------------------------------------------------------------------
280 !
281 !* 3. Sand fraction
282 ! -------------
283 !
284 ALLOCATE(gdk%XSAND(kdim,gdo%NGROUND_LAYER))
285 !
286 IF(limp_sand)THEN
287 !
288  CALL abor1_sfx('PGD_TEB_VEG: LIMP_SAND IS NOT CONSISTENT WITH TEB_GARDEN')
289 !
290 ELSE
291 !
292  CALL pgd_field(dtco, ug, u, uss, &
293  hprogram,'sand fraction','TWN',ysand,ysandfiletype,xunif_sand,gdk%XSAND(:,1))
294 ENDIF
295 !
296 DO jlayer=1,gdo%NGROUND_LAYER
297  gdk%XSAND(:,jlayer) = gdk%XSAND(:,1)
298 END DO
299 !-------------------------------------------------------------------------------
300 !
301 !* 4. Clay fraction
302 ! -------------
303 !
304 ALLOCATE(gdk%XCLAY(kdim,gdo%NGROUND_LAYER))
305 !
306 IF(limp_clay)THEN
307 !
308  CALL abor1_sfx('PGD_TEB_VEG: LIMP_SAND IS NOT CONSISTENT WITH TEB_GARDEN')
309 !
310 ELSE
311  CALL pgd_field(dtco, ug, u, uss, &
312  hprogram,'clay fraction','TWN',yclay,yclayfiletype,xunif_clay,gdk%XCLAY(:,1))
313 ENDIF
314 !
315 DO jlayer=1,gdo%NGROUND_LAYER
316  gdk%XCLAY(:,jlayer) = gdk%XCLAY(:,1)
317 END DO
318 !-------------------------------------------------------------------------------
319 !
320 !* 5. Subgrid runoff
321 ! --------------
322 !
323 ALLOCATE(gdk%XRUNOFFB(kdim))
324  CALL pgd_field(dtco, ug, u, uss, &
325  hprogram,'subgrid runoff','TWN',yrunoffb,yrunoffbfiletype,xunif_runoffb,gdk%XRUNOFFB(:))
326 !
327 !-------------------------------------------------------------------------------
328 !
329 !* 6. Drainage coefficient
330 ! --------------------
331 !
332 ALLOCATE(gdk%XWDRAIN(kdim))
333  CALL pgd_field(dtco, ug, u, uss, &
334  hprogram,'subgrid drainage','TWN',ywdrain,ywdrainfiletype,xunif_wdrain,gdk%XWDRAIN(:))
335 !
336 !-------------------------------------------------------------------------------
337 !
338 !* 7. Interpolation of GARDEN physiographic fields
339 ! --------------------------------------------
340 !
341 dtgd%NTIME = 12
342  CALL pgd_teb_garden_par(dtco, ug, u, uss, kdim, gdo, dtgd, hprogram)
343 !
344 !-------------------------------------------------------------------------------
345 !
346 !* 8. Case of greenroofs
347 ! ------------------
348 !
349 IF (top%LGREENROOF) CALL pgd_teb_greenroof(dtco, ug, u, uss, gro, grs, grk, dtgr, kdim, hprogram)
350 !
351 !-------------------------------------------------------------------------------
352 !
353 !* 9. Irrigation of gardens and greenroofs
354 ! ------------------------------------
355 !
356  CALL pgd_teb_irrig(dtco, ug, u, uss, kdim, gdir, hprogram)
357 !
358 !-------------------------------------------------------------------------------
359 !
360 !* 9. Case of urban hydrology
361 ! -----------------------
362 !
363 IF (top%LHYDRO) print*," CALL PGD_TEB_URBHYDRO(HPROGRAM,LECOCLIMAP)"
364 !
365 !-------------------------------------------------------------------------------
366 !
367 IF (lhook) CALL dr_hook('PGD_TEB_GARDEN',1,zhook_handle)
368 !
369 !
370 !-------------------------------------------------------------------------------
371 !
372 !
373 END SUBROUTINE pgd_teb_veg
subroutine pgd_teb_greenroof(DTCO, UG, U, USS, IO, S, K, DTV, KDI
subroutine read_nam_pgd_isba(HPROGRAM, KPATCH, KGROUND_LAYER,
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine pgd_teb_veg(DTCO, UG, U, USS, GDO, GDK, DTGD, GDIR, GRO, GRS, GRK, DTGR, TOP, KDIM, HPROGRAM)
Definition: pgd_teb_veg.F90:8
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter nundef
subroutine pgd_teb_garden_par(DTCO, UG, U, USS, KDIM, IO, DTV, HP
subroutine pgd_teb_irrig(DTCO, UG, U, USS, KDIM, TIR, HPROGRAM)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
logical lhook
Definition: yomhook.F90:15
static int count
Definition: memory_hook.c:21