SURFEX v8.1
General documentation of Surfex
pgd_isba.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_isba (DTCO, DTV, IG, IO, S, K, ISS, UG, U, USS, HPROGRAM)
7 ! ##############################################################
8 !
9 !!**** *PGD_ISBA* monitor for averaging and interpolations of ISBA physiographic fields
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !! METHOD
15 !! ------
16 !!
17 !
18 !! EXTERNAL
19 !! --------
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !! AUTHOR
28 !! ------
29 !!
30 !! V. Masson Meteo-France
31 !!
32 !! MODIFICATION
33 !! ------------
34 !!
35 !! Original 10/12/97
36 !! P. Le Moigne 12/2004 : add type of photosynthesis and correct computation
37 !! of ground layers number in diffusion case
38 !! P. Le Moigne 09/2005 : AGS modifs of L. Jarlan
39 !! B. Decharme 2008 : XWDRAIN
40 !! E. Martin 12/2008 : files of data for runoffb and wdrain
41 !! B. Decharme 06/2009 : files of data for topographic index
42 !! A.L. Gibelin 04/2009 : dimension NBIOMASS for ISBA-A-gs
43 !! R. Alkama 05/2012 : npatch must be 12 or 19 if CPHOTO/='NON'
44 !! B. Decharme 11/2013 : groundwater distribution for water table/surface coupling
45 !! P. Samuelsson 02/2012 : MEB
46 !! B. Decharme 10/2016 bug surface/groundwater coupling
47 !!
48 !----------------------------------------------------------------------------
49 !
50 !* 0. DECLARATION
51 ! -----------
52 !
53 #ifdef SFX_OL
54 USE modn_io_offline, ONLY : lwr_vegtype
55 #endif
56 !
58 USE modd_data_isba_n, ONLY : data_isba_t
59 USE modd_sfx_grid_n, ONLY : grid_t
61 USE modd_isba_n, ONLY : isba_s_t, isba_k_t
62 USE modd_sso_n, ONLY : sso_t
64 USE modd_surf_atm_n, ONLY : surf_atm_t
65 !
66 USE modd_surf_par, ONLY : xundef, nundef
67 USE modd_pgd_grid, ONLY : nl
68 USE modd_pgdwork, ONLY : catype
69 USE modd_data_cover_par, ONLY : nvegtype, jpcover, nvt_tebd, nvt_bone, nvt_trbe, &
70  nvt_trbd, nvt_tebe, nvt_tene, nvt_bobd, nvt_bond
72 !
73 USE modd_isba_par, ONLY : noptimlayer, xoptimgrid
74 !
75 USE modi_av_pgd
76 !
77 USE modi_get_luout
78 USE modi_read_nam_pgd_isba
79 USE modi_read_nam_pgd_isba_meb
82 !
83 USE modi_get_aos_n
84 USE modi_get_sso_n
85 USE modi_get_surf_size_n
86 USE modi_pack_pgd_isba
87 USE modi_pack_pgd
88 USE modi_write_cover_tex_isba
89 USE modi_write_cover_tex_isba_par
90 USE modi_pgd_topo_index
91 USE modi_open_namelist
92 USE modi_close_namelist
93 USE modi_pgd_isba_par
94 USE modi_pgd_topd
95 USE mode_pos_surf
96 !
98 USE modi_init_io_surf_n
99 USE modi_end_io_surf_n
100 !
101 USE modi_read_namelists_isba
102 !
103 #ifdef SFX_ASC
104 USE modd_io_surf_asc, ONLY : cfilein
105 #endif
106 #ifdef SFX_FA
107 USE modd_io_surf_fa, ONLY : cfilein_fa
108 #endif
109 #ifdef SFX_LFI
110 USE modd_io_surf_lfi, ONLY : cfilein_lfi
111 #endif
112 !
113 USE yomhook ,ONLY : lhook, dr_hook
114 USE parkind1 ,ONLY : jprb
115 !
116 USE modi_abor1_sfx
117 !
118 IMPLICIT NONE
119 !
120 !* 0.1 Declaration of arguments
121 ! ------------------------
122 !
123 !
124 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
125 TYPE(data_isba_t), INTENT(INOUT) :: DTV
126 TYPE(grid_t), INTENT(INOUT) :: IG
127 TYPE(isba_options_t), INTENT(INOUT) :: IO
128 TYPE(isba_s_t), INTENT(INOUT) :: S
129 TYPE(isba_k_t), INTENT(INOUT) :: K
130 TYPE(sso_t), INTENT(INOUT) :: ISS
131 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
132 TYPE(surf_atm_t), INTENT(INOUT) :: U
133 TYPE(sso_t), INTENT(INOUT) :: USS
134 !
135  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
136 !
137 !
138 !* 0.2 Declaration of local variables
139 ! ------------------------------
140 !
141 INTEGER :: ILUOUT ! output listing logical unit
142 INTEGER :: JLAYER ! loop counter
143 INTEGER :: ILU ! number of points
144 INTEGER :: ILUNAM ! namelist file logical unit
145 REAL, DIMENSION(NL) :: ZAOSIP ! A/S i+ on all surface points
146 REAL, DIMENSION(NL) :: ZAOSIM ! A/S i- on all surface points
147 REAL, DIMENSION(NL) :: ZAOSJP ! A/S j+ on all surface points
148 REAL, DIMENSION(NL) :: ZAOSJM ! A/S j- on all surface points
149 REAL, DIMENSION(NL) :: ZHO2IP ! h/2 i+ on all surface points
150 REAL, DIMENSION(NL) :: ZHO2IM ! h/2 i- on all surface points
151 REAL, DIMENSION(NL) :: ZHO2JP ! h/2 j+ on all surface points
152 REAL, DIMENSION(NL) :: ZHO2JM ! h/2 j- on all surface points
153 REAL, DIMENSION(NL) :: ZSSO_SLOPE! subgrid slope on all surface points
154 INTEGER :: IRESP ! error code
155 LOGICAL :: GMEB ! Multi-energy balance (MEB)
156 LOGICAL :: GFOUND ! flag when namelist is present
157 !
158 !* 0.3 Declaration of namelists
159 ! ------------------------
160 !
161 !
162 INTEGER :: IPATCH ! number of patches
163 INTEGER :: IGROUND_LAYER ! number of soil layers
164 INTEGER :: JVEGTYPE
165  CHARACTER(LEN=3) :: YISBA ! ISBA option
166  CHARACTER(LEN=4) :: YPEDOTF ! Pedo transfert function for DIF
167  CHARACTER(LEN=3) :: YPHOTO ! photosynthesis option
168 LOGICAL :: GTR_ML ! new radiative transfert
169  CHARACTER(LEN=4) :: YALBEDO
170 REAL :: ZRM_PATCH ! threshold to remove little fractions of patches
171  CHARACTER(LEN=28) :: YSAND ! file name for sand fraction
172  CHARACTER(LEN=28) :: YCLAY ! file name for clay fraction
173  CHARACTER(LEN=28) :: YSOC_TOP ! file name for organic carbon top soil
174  CHARACTER(LEN=28) :: YSOC_SUB ! file name for organic carbon sub soil
175  CHARACTER(LEN=28) :: YCTI ! file name for topographic index
176  CHARACTER(LEN=28) :: YRUNOFFB ! file name for runoffb parameter
177  CHARACTER(LEN=28) :: YWDRAIN ! file name for wdrain parameter
178  CHARACTER(LEN=28) :: YPERM ! file name for permafrost distribution
179  CHARACTER(LEN=6) :: YSANDFILETYPE ! sand data file type
180  CHARACTER(LEN=6) :: YCLAYFILETYPE ! clay data file type
181  CHARACTER(LEN=6) :: YSOCFILETYPE ! organic carbon data file type
182  CHARACTER(LEN=6) :: YCTIFILETYPE ! topographic index data file type
183  CHARACTER(LEN=6) :: YRUNOFFBFILETYPE ! subgrid runoff data file type
184  CHARACTER(LEN=6) :: YWDRAINFILETYPE ! subgrid drainage data file type
185  CHARACTER(LEN=6) :: YPERMFILETYPE ! permafrost distribution data file type
186 REAL :: XUNIF_SAND ! uniform value of sand fraction (-)
187 REAL :: XUNIF_CLAY ! uniform value of clay fraction (-)
188 REAL :: XUNIF_SOC_TOP ! uniform value of organic carbon top soil (kg/m2)
189 REAL :: XUNIF_SOC_SUB ! uniform value of organic carbon sub soil (kg/m2)
190 REAL :: XUNIF_RUNOFFB ! uniform value of subgrid runoff coefficient
191 REAL :: XUNIF_WDRAIN ! uniform subgrid drainage parameter
192 REAL :: XUNIF_PERM ! uniform permafrost distribution
193 LOGICAL :: LIMP_SAND ! Imposed maps of Sand
194 LOGICAL :: LIMP_CLAY ! Imposed maps of Clay
195 LOGICAL :: LIMP_SOC ! Imposed maps of organic carbon
196 LOGICAL :: LIMP_CTI ! Imposed maps of topographic index statistics
197 LOGICAL :: LIMP_PERM ! Imposed maps of permafrost distribution
198 REAL, DIMENSION(150) :: ZSOILGRID ! Soil grid reference for DIF
199  CHARACTER(LEN=28) :: YPH ! file name for pH
200  CHARACTER(LEN=28) :: YFERT ! file name for fertilisation rate
201  CHARACTER(LEN=6) :: YPHFILETYPE ! pH data file type
202  CHARACTER(LEN=6) :: YFERTFILETYPE ! fertilisation data file type
203 REAL :: XUNIF_PH ! uniform value of pH
204 REAL :: XUNIF_FERT ! uniform value of fertilisation rate
205 LOGICAL, DIMENSION(NVEGTYPE) :: GMEB_PATCH
206 LOGICAL, DIMENSION(NVEGTYPE) :: GMEB_PATCH_REC ! Recommended MEB patch settings
207 !
208 REAL(KIND=JPRB) :: ZHOOK_HANDLE
209 !
210 !-------------------------------------------------------------------------------
211 !
212 IF (lhook) CALL dr_hook('PGD_ISBA',0,zhook_handle)
213 !
214  CALL get_luout(hprogram,iluout)
215 !
216 !-------------------------------------------------------------------------------
217 !
218 !* 2.1 Reading of ISBA namelist
219 ! -------------------------
220 !
221  CALL read_nam_pgd_isba(hprogram, ipatch, iground_layer, &
222  yisba, ypedotf, yphoto, gtr_ml, yalbedo, zrm_patch, &
223  yclay, yclayfiletype, xunif_clay, limp_clay, &
224  ysand, ysandfiletype, xunif_sand, limp_sand, &
225  ysoc_top, ysoc_sub, ysocfiletype, xunif_soc_top, &
226  xunif_soc_sub, limp_soc, ycti, yctifiletype, limp_cti, &
227  yperm, ypermfiletype, xunif_perm, limp_perm, gmeb, &
228  yrunoffb, yrunoffbfiletype, xunif_runoffb, &
229  ywdrain, ywdrainfiletype , xunif_wdrain, zsoilgrid, &
230  yph, yphfiletype, xunif_ph, yfert, yfertfiletype, &
231  xunif_fert )
232 !
233 io%NPATCH = ipatch
234 io%NGROUND_LAYER = iground_layer
235 io%CISBA = yisba
236 io%CPEDOTF = ypedotf
237 io%CPHOTO = yphoto
238 io%LTR_ML = gtr_ml
239 io%CALBEDO = yalbedo
240 io%XRM_PATCH = max(min(zrm_patch,1.),0.)
241 !
242 !
243  CALL read_namelists_isba(hprogram)
244 !
245 !-------------------------------------------------------------------------------
246 !
247 !* 2.2 Reading of ISBA MEB namelist
248 ! -----------------------------
249 !
250 IF (io%NPATCH<1 .OR. io%NPATCH>nvegtype) THEN
251  WRITE(iluout,*) '*****************************************'
252  WRITE(iluout,*) '* Number of patch must be between 1 and ', nvegtype
253  WRITE(iluout,*) '* You have chosen NPATCH = ', io%NPATCH
254  WRITE(iluout,*) '*****************************************'
255  CALL abor1_sfx('PGD_ISBA: NPATCH MUST BE BETWEEN 1 AND NVEGTYPE')
256 END IF
257 !
258 ALLOCATE(io%LMEB_PATCH(io%NPATCH))
259 !
260 io%LMEB_PATCH(:) = .false.
261 io%LFORC_MEASURE = .false.
262 io%LMEB_LITTER = .false.
263 io%LMEB_GNDRES = .false.
264 
265 IF(gmeb)THEN
266 
267  io%LTR_ML = .true. ! Always use this SW radiative transfer option with MEB
268 
269  CALL read_nam_pgd_isba_meb(hprogram,iluout,gmeb_patch,io%LFORC_MEASURE,io%LMEB_LITTER,io%LMEB_GNDRES)
270 
271  ! Current recommendation is to use MEB for tree patches only.
272  ! Here follows a test in which non-tree patches in LMEB_PATCH are set to FALSE.
273  ! Thus, if you wish to test MEB for non-tree patches you can set
274  ! GMEB_PATCH_REC(:)=.TRUE.
275  ! in the following line:
276 
277  gmeb_patch_rec(:)=.false.
278 
279  gmeb_patch_rec(:)=.true.
280  gmeb_patch_rec(1:3)=.false.
281 
282 
283  IF(io%NPATCH==1 .AND. gmeb_patch(1))THEN
284  WRITE(iluout,*) '*****************************************'
285  WRITE(iluout,*) '* WARNING!'
286  WRITE(iluout,*) '* Using MEB for one patch only is not recommended.'
287  WRITE(iluout,*) '* LMEB_PATCH(1) has been set to .FALSE.'
288  WRITE(iluout,*) '*****************************************'
289  ELSEIF(io%NPATCH>=2 .AND. io%NPATCH<=6)THEN
290  gmeb_patch_rec(2)=.true. ! Only the tree patch (number 2) is allowed to be TRUE
291  ELSEIF(io%NPATCH>=7 .AND. io%NPATCH<=8)THEN
292  gmeb_patch_rec(3)=.true. ! Only the tree patch (number 3) is allowed to be TRUE
293  ELSEIF(io%NPATCH==9)THEN
294  gmeb_patch_rec(3:4)=(/.true.,.true./) ! Only the tree patches (numbers 3-4) are allowed to be TRUE
295  ELSEIF(io%NPATCH==10)THEN
296  gmeb_patch_rec(3:5)=(/.true.,.true.,.true./) ! Only the tree patches (numbers 3-5) are allowed to be TRUE
297  ELSEIF(io%NPATCH>=11 .AND. io%NPATCH<=12)THEN
298  gmeb_patch_rec(4:6)=(/.true.,.true.,.true./) ! Only the tree patches (numbers 4-6) are allowed to be TRUE
299  ELSEIF(io%NPATCH==nvegtype)THEN
300  ! The "old" tree patches (numbers 4-6) are allowed to be TRUE
301  gmeb_patch_rec(nvt_tebd) = .true.
302  gmeb_patch_rec(nvt_bone) = .true.
303  gmeb_patch_rec(nvt_trbe) = .true.
304  ! The "new" tree patches (numbers 13-17) are allowed to be TRUE
305  gmeb_patch_rec(nvt_trbd) = .true.
306  gmeb_patch_rec(nvt_tebe) = .true.
307  gmeb_patch_rec(nvt_tene) = .true.
308  gmeb_patch_rec(nvt_bobd) = .true.
309  gmeb_patch_rec(nvt_bond) = .true.
310  ENDIF
311 
312  IF(count(.NOT.gmeb_patch_rec(:) .AND. gmeb_patch(:))>0)THEN
313  WRITE(iluout,*) '*****************************************'
314  WRITE(iluout,*) '* WARNING!'
315  WRITE(iluout,*) '* Using MEB for non-tree patches is not yet recommended.'
316  WRITE(iluout,*) '* Therefor, LMEB_PATCH for non-tree patches has been set to .FALSE.'
317  WRITE(iluout,*) '* The final LMEB_PATCH vector becomes:'
318  WRITE(iluout,*) gmeb_patch(1:io%NPATCH).AND.gmeb_patch_rec(1:io%NPATCH)
319  WRITE(iluout,*) '*****************************************'
320  ENDIF
321  gmeb_patch(:)=gmeb_patch(:).AND.gmeb_patch_rec(:)
322 
323  io%LMEB_PATCH(1:io%NPATCH) = gmeb_patch(1:io%NPATCH)
324 
325  IF (io%LMEB_LITTER) io%LMEB_GNDRES = .false.
326 
327 ENDIF
328 !
329 !-------------------------------------------------------------------------------
330 !
331 !* 3. Coherence of options
332 ! --------------------
333 !
334  CALL test_nam_var_surf(iluout,'CISBA',io%CISBA,'2-L','3-L','DIF')
335  CALL test_nam_var_surf(iluout,'CPEDOTF',io%CPEDOTF,'CH78','CO84')
336  CALL test_nam_var_surf(iluout,'CPHOTO',io%CPHOTO,'NON','AST','NIT','NCB')
337  CALL test_nam_var_surf(iluout,'CALBEDO',io%CALBEDO,'EVOL','DRY ','WET ','MEAN','USER','CM13')
338 !
339 SELECT CASE (io%CISBA)
340 !
341  CASE ('2-L')
342 !
343  io%NGROUND_LAYER = 2
344  io%CPEDOTF ='CH78'
345  ALLOCATE(io%XSOILGRID(0))
346  WRITE(iluout,*) '*****************************************'
347  WRITE(iluout,*) '* With option CISBA = ',io%CISBA,' *'
348  WRITE(iluout,*) '* the number of soil layers is set to 2 *'
349  WRITE(iluout,*) '* Pedo transfert function = CH78 *'
350  WRITE(iluout,*) '*****************************************'
351 !
352  CASE ('3-L')
353 !
354  io%NGROUND_LAYER = 3
355  io%CPEDOTF ='CH78'
356  ALLOCATE(io%XSOILGRID(0))
357  WRITE(iluout,*) '*****************************************'
358  WRITE(iluout,*) '* With option CISBA = ',io%CISBA,' *'
359  WRITE(iluout,*) '* the number of soil layers is set to 3 *'
360  WRITE(iluout,*) '* Pedo transfert function = CH78 *'
361  WRITE(iluout,*) '*****************************************'
362 !
363  CASE ('DIF')
364 !
365  IF(io%NGROUND_LAYER==nundef)THEN
366  IF(u%LECOCLIMAP)THEN
367  io%NGROUND_LAYER=noptimlayer
368  ELSE
369  WRITE(iluout,*) '****************************************'
370  WRITE(iluout,*) '* Number of ground layer not specified *'
371  WRITE(iluout,*) '****************************************'
372  CALL abor1_sfx('PGD_ISBA: NGROUND_LAYER MUST BE DONE IN NAM_ISBA')
373  ENDIF
374  ENDIF
375 !
376  ALLOCATE(io%XSOILGRID(io%NGROUND_LAYER))
377  io%XSOILGRID(:)=0.
378  io%XSOILGRID(:)=zsoilgrid(1:io%NGROUND_LAYER)
379  IF (all(zsoilgrid(:)==xundef)) THEN
380  IF(u%LECOCLIMAP) io%XSOILGRID(1:io%NGROUND_LAYER)=xoptimgrid(1:io%NGROUND_LAYER)
381  ELSEIF (count(io%XSOILGRID/=xundef)/=io%NGROUND_LAYER) THEN
382  WRITE(iluout,*) '********************************************************'
383  WRITE(iluout,*) '* Soil grid reference values /= number of ground layer *'
384  WRITE(iluout,*) '********************************************************'
385  CALL abor1_sfx('PGD_ISBA: XSOILGRID must be coherent with NGROUND_LAYER in NAM_ISBA')
386  ELSEIF (io%XSOILGRID(1).GT.0.01) THEN
387  CALL abor1_sfx('PGD_ISBA: First layer of XSOILGRID must be lower than 1cm')
388  ENDIF
389 !
390  WRITE(iluout,*) '*****************************************'
391  WRITE(iluout,*) '* Option CISBA = ',io%CISBA
392  WRITE(iluout,*) '* Pedo transfert function = ',io%CPEDOTF
393  WRITE(iluout,*) '* Number of soil layers = ',io%NGROUND_LAYER
394  IF(u%LECOCLIMAP)THEN
395  WRITE(iluout,*) '* Soil layers grid (m) = ',io%XSOILGRID(1:io%NGROUND_LAYER)
396  ENDIF
397  WRITE(iluout,*) '*****************************************'
398 !
399 END SELECT
400 !
401 SELECT CASE (io%CPHOTO)
402  CASE ('AST')
403  io%NNBIOMASS = 1
404  CASE ('NIT')
405  io%NNBIOMASS = 3
406  CASE ('NCB')
407  io%NNBIOMASS = 6
408 END SELECT
409 WRITE(iluout,*) '*****************************************'
410 WRITE(iluout,*) '* With option CPHOTO = ',io%CPHOTO,' *'
411 WRITE(iluout,*) '* the number of biomass pools is set to ', io%NNBIOMASS
412 WRITE(iluout,*) '*****************************************'
413 !
414 IF ( io%CPHOTO/='NON' .AND. io%NPATCH/=12 .AND. io%NPATCH/=nvegtype ) THEN
415  WRITE(iluout,*) '*****************************************'
416  WRITE(iluout,*) '* With option CPHOTO = ', io%CPHOTO
417  WRITE(iluout,*) '* Number of patch must be equal to 12 or NVEGTYPE'
418  WRITE(iluout,*) '* But you have chosen NPATCH = ', io%NPATCH
419  WRITE(iluout,*) '*****************************************'
420  CALL abor1_sfx('PGD_ISBA: CPHOTO='//io%CPHOTO//' REQUIRES NPATCH=12 or NVEGTYPE')
421 END IF
422 !
423 IF ( io%CPHOTO=='NON' .AND. io%LTR_ML .AND. .NOT. gmeb) THEN
424  WRITE(iluout,*) '*****************************************'
425  WRITE(iluout,*) '* With option CPHOTO == NON '
426  WRITE(iluout,*) '* And With MEB = F '
427  WRITE(iluout,*) '* New radiative transfert TR_ML '
428  WRITE(iluout,*) '* cant be used '
429  WRITE(iluout,*) '*****************************************'
430  CALL abor1_sfx('PGD_ISBA: WITH CPHOTO= NON LTR_ML MUST BE FALSE')
431 END IF
432 !
433 !-------------------------------------------------------------------------------
434 !
435 !* 4. Number of points and packing of general fields
436 ! ----------------------------------------------
437 !
438  CALL get_surf_size_n(dtco, u, 'NATURE',ilu)
439 !
440 ALLOCATE(s%LCOVER (jpcover))
441 ALLOCATE(s%XZS (ilu))
442 ALLOCATE(ig%XLAT (ilu))
443 ALLOCATE(ig%XLON (ilu))
444 ALLOCATE(ig%XMESH_SIZE (ilu))
445 ALLOCATE(iss%XZ0EFFJPDIR(ilu))
446 !
447  CALL pack_pgd(dtco, u, hprogram, 'NATURE', ig, s%LCOVER, s%XCOVER, s%XZS )
448 !
449 !-------------------------------------------------------------------------------
450 !
451 !* 5. Packing of ISBA specific fields
452 ! -------------------------------
453 !
454  CALL get_aos_n(uss, hprogram,nl,zaosip,zaosim,zaosjp,zaosjm,zho2ip,zho2im,zho2jp,zho2jm)
455  CALL get_sso_n(uss, hprogram,nl,zsso_slope)
456 !
457  CALL pack_pgd_isba(dtco, ig%NDIM, iss, u, hprogram, &
458  zaosip, zaosim, zaosjp, zaosjm, &
459  zho2ip, zho2im, zho2jp, zho2jm, &
460  zsso_slope )
461 !
462 !-------------------------------------------------------------------------------
463 !
464 !* 15. ISBA specific fields
465 ! --------------------
466 !
467 io%LECOCLIMAP = u%LECOCLIMAP
468 !
469  CALL pgd_isba_par(dtco, ug, u, uss, dtv, io, s, ig%NDIM, hprogram)
470 !
471 !-------------------------------------------------------------------------------
472 !
473 #ifdef SFX_OL
474 IF (lwr_vegtype) THEN
475  ALLOCATE(k%XVEGTYPE(ilu,nvegtype))
476  IF (dtv%LDATA_VEGTYPE) THEN
477  k%XVEGTYPE(:,:) = dtv%XPAR_VEGTYPE(:,:)
478  ELSE
479  DO jvegtype=1,nvegtype
480  CALL av_pgd(dtco,k%XVEGTYPE(:,jvegtype),s%XCOVER,xdata_vegtype(:,jvegtype),'NAT','ARI',s%LCOVER)
481  ENDDO
482  ENDIF
483 ENDIF
484 #endif
485 !
486 DEALLOCATE(s%XCOVER)
487 !
488 !-------------------------------------------------------------------------------
489 !
490 !* 6. Topographic index for TOPMODEL
491 ! ------------------------------
492 !
493  CALL pgd_topo_index(dtco, ug, u, uss, s, io%LCTI, &
494  hprogram,ilu,ycti,yctifiletype,limp_cti)
495 !
496 !-------------------------------------------------------------------------------
497 !
498 !* 7. Sand fraction
499 ! -------------
500 !
501 CATYPE='ARI'
502 !
503 ALLOCATE(k%XSAND(ilu,io%NGROUND_LAYER))
504 !
505  CALL get_field(ysandfiletype,ysand,"SAND",limp_sand,xunif_sand,k%XSAND(:,1))
506 !
507 DO jlayer=1,io%NGROUND_LAYER
508  k%XSAND(:,jlayer) = k%XSAND(:,1)
509 END DO
510 !-------------------------------------------------------------------------------
511 !
512 !* 8. Clay fraction
513 ! -------------
514 !
515 ALLOCATE(k%XCLAY(ilu,io%NGROUND_LAYER))
516 !
517  CALL get_field(yclayfiletype,yclay,"CLAY",limp_clay,xunif_clay,k%XCLAY(:,1))
518 !
519 DO jlayer=1,io%NGROUND_LAYER
520  k%XCLAY(:,jlayer) = k%XCLAY(:,1)
521 END DO
522 !
523 !-------------------------------------------------------------------------------
524 !
525 !* 9. organic carbon profile
526 ! ----------------------
527 !
528 IF(len_trim(ysocfiletype)/=0.OR.(xunif_soc_top/=xundef.AND.xunif_soc_sub/=xundef))THEN
529 !
530  ALLOCATE(s%XSOC(ilu,io%NGROUND_LAYER))
531 !
532  io%LSOCP=.true.
533 !
534  IF((len_trim(ysoc_top)==0.AND.len_trim(ysoc_sub)/=0).OR.(len_trim(ysoc_top)/=0.AND.len_trim(ysoc_sub)==0))THEN
535  WRITE(iluout,*) ' '
536  WRITE(iluout,*) '***********************************************************'
537  WRITE(iluout,*) '* Error in soil organic carbon preparation *'
538  WRITE(iluout,*) '* If used, sub and top soil input file must be given *'
539  WRITE(iluout,*) '***********************************************************'
540  WRITE(iluout,*) ' '
541  CALL abor1_sfx('PGD_ISBA: TOP AND SUB SOC INPUT FILE REQUIRED')
542  ENDIF
543 !
544  CALL get_field(ysocfiletype,ysoc_top,"SOC_TOP",limp_soc,xunif_soc_top,s%XSOC(:,1))
545 !
546  CALL get_field(ysocfiletype,ysoc_sub,"SOC_SUB",limp_soc,xunif_soc_sub,s%XSOC(:,2))
547 !
548  DO jlayer=2,io%NGROUND_LAYER
549  s%XSOC(:,jlayer) = s%XSOC(:,2)
550  END DO
551 !
552 ELSE
553 !
554  io%LSOCP=.false.
555  ALLOCATE(s%XSOC(0,0))
556 !
557 ENDIF
558 !
559 !* 10. Permafrost distribution
560 ! -----------------------
561 !
562 IF(len_trim(yperm)/=0.OR.xunif_perm/=xundef)THEN
563 !
564  ALLOCATE(k%XPERM(ilu))
565 !
566  io%LPERM=.true.
567 !
568  CALL get_field(ypermfiletype,yperm,"PERM",limp_perm,xunif_perm,k%XPERM(:))
569 !
570 ELSE
571 !
572  io%LPERM=.false.
573  ALLOCATE(k%XPERM(0))
574 !
575 ENDIF
576 !
577 !-------------------------------------------------------------------------------
578 !
579 !* 12. pH and fertlisation data
580 ! --------------------------
581 !
582 IF((len_trim(yphfiletype)/=0.OR.xunif_ph/=xundef) .AND. &
583  (len_trim(yfertfiletype)/=0.OR.xunif_fert/=xundef)) THEN
584  !
585  ALLOCATE(s%XPH(ilu))
586  ALLOCATE(s%XFERT(ilu))
587  !
588  io%LNOF = .true.
589  !
590  CALL pgd_field(dtco, ug, u, uss, &
591  hprogram,'pH value','NAT',yph,yphfiletype,xunif_ph,s%XPH(:))
592  CALL pgd_field(dtco, ug, u, uss, &
593  hprogram,'fertilisation','NAT',yfert,yfertfiletype,xunif_fert,s%XFERT(:))
594  !
595 ENDIF
596 !
597 !-------------------------------------------------------------------------------
598 !
599 !* 13. Subgrid runoff
600 ! --------------
601 !
602 ALLOCATE(k%XRUNOFFB(ilu))
603  CALL pgd_field(dtco, ug, u, uss, hprogram,'subgrid runoff','NAT',yrunoffb,yrunoffbfiletype,&
604  xunif_runoffb,k%XRUNOFFB(:))
605 !
606 !-------------------------------------------------------------------------------
607 !
608 !* 14. Drainage coefficient
609 ! --------------------
610 !
611 ALLOCATE(k%XWDRAIN(ilu))
612  CALL pgd_field(dtco, ug, u, uss, hprogram,'subgrid drainage','NAT',ywdrain,ywdrainfiletype,&
613  xunif_wdrain,k%XWDRAIN(:))
614 !
615 !-------------------------------------------------------------------------------
616 !
617  CALL pgd_topd(io%CISBA, ug%G%CGRID, ug%G%XGRID_PAR, u%NDIM_FULL, uss%XSSO_SLOPE, hprogram)
618 !
619 !-------------------------------------------------------------------------------
620 !
621 !* 16. Prints of cover parameters in a tex file
622 ! ----------------------------------------
623 !
624 IF (u%LECOCLIMAP) THEN
625  CALL write_cover_tex_isba (io%NPATCH,io%NGROUND_LAYER,io%CISBA)
626  CALL write_cover_tex_isba_par(dtco, io%CALBEDO, io%LTR_ML, &
627  io%NPATCH,io%NGROUND_LAYER,io%CISBA,io%CPHOTO,io%XSOILGRID)
628 END IF
629 IF (lhook) CALL dr_hook('PGD_ISBA',1,zhook_handle)
630 !
631 CONTAINS
632 !
633 SUBROUTINE get_field(HFILETYPE,HFILE,HFIELD,OIMP,PUNIF,PFIELD)
634 !
635 IMPLICIT NONE
636 !
637  CHARACTER(LEN=*), INTENT(INOUT) :: HFILETYPE
638  CHARACTER(LEN=*), INTENT(IN) :: HFILE
639  CHARACTER(LEN=*), INTENT(IN) :: HFIELD
640 LOGICAL, INTENT(IN) :: OIMP
641 REAL, INTENT(IN) :: PUNIF
642 REAL, DIMENSION(:), INTENT(OUT) :: PFIELD
643 !
644 REAL(KIND=JPRB) :: ZHOOK_HANDLE
645 !
646 IF (lhook) CALL dr_hook('PGD_ISBA:GET_FIELD',0,zhook_handle)
647 !
648 IF(oimp)THEN
649 !
650  IF(hfiletype=='NETCDF')THEN
651  CALL abor1_sfx('Use another format than netcdf for '//trim(hfield)//' input file with LIMP ')
652  ELSE
653 #ifdef SFX_ASC
654  cfilein = adjustl(adjustr(hfile)//'.txt')
655 #endif
656 #ifdef SFX_FA
657  cfilein_fa = adjustl(adjustr(hfile)//'.fa')
658 #endif
659 #ifdef SFX_LFI
660  cfilein_lfi = adjustl(hfile)
661 #endif
662  CALL init_io_surf_n(dtco, u, hfiletype,'NATURE','ISBA ','READ ')
663  ENDIF
664 !
665  CALL read_surf(hfiletype,trim(hfield),pfield,iresp)
666 !
667  CALL end_io_surf_n(hfiletype)
668 !
669 ELSE
670  CALL pgd_field(dtco, ug, u, uss, &
671  hprogram,hfield,'NAT',hfile,hfiletype,punif,pfield)
672 ENDIF
673 !
674 IF (lhook) CALL dr_hook('PGD_ISBA:GET_FIELD',1,zhook_handle)
675 !
676 END SUBROUTINE get_field
677 !
678 !-------------------------------------------------------------------------------
679 !
680 END SUBROUTINE pgd_isba
subroutine get_surf_size_n(DTCO, U, HTYPE, KL)
subroutine get_field(HFILETYPE, HFILE, HFIELD, OIMP, PUNIF, PFIELD)
Definition: pgd_isba.F90:634
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine get_aos_n(USS, HPROGRAM, KI, PAOSIP, PAOSIM, PAOSJP, PAOSJM, PHO2IP, PHO2IM, PHO2JP, PHO2JM)
Definition: get_aosn.F90:9
character(len=3) catype
subroutine pgd_topo_index(DTCO, UG, U, USS, S, OCTI, HPROGRAM, KLU, HCTI, HCTIFILETYPE, OIMP_CTI
real, dimension(:,:), allocatable xdata_vegtype
subroutine read_nam_pgd_isba(HPROGRAM, KPATCH, KGROUND_LAYER,
subroutine pack_pgd(DTCO, U, HPROGRAM, HSURF, G, OCOVER, PCOVER,
Definition: pack_pgd.F90:7
subroutine pgd_isba_par(DTCO, UG, U, USS, DTV, IO, S, KDIM, HPROG
Definition: pgd_isba_par.F90:7
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
subroutine read_nam_pgd_isba_meb(HPROGRAM, KLUOUT, OMEB_PATCH, OFO
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter nundef
subroutine get_sso_n(USS, HPROGRAM, KI, PSSO_SLOPE)
Definition: get_sson.F90:8
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:7
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine write_cover_tex_isba(KPATCH, KLAYER, HISBA)
subroutine write_cover_tex_isba_par(DTCO, HALBEDO, OTR_ML, KPATCH, KLAYER, HISBA, HPHOTO, PS
subroutine pack_pgd_isba(DTCO, KDIM, ISS, U, HPROGRAM,
character(len=28), save cfilein
character(len=28), save cfilein_fa
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION
subroutine read_namelists_isba(HPROGRAM)
subroutine pgd_topd(HISBA, HGRID, PGRID_PAR, KDIM_FULL, PSSO_SLOP
Definition: pgd_topd.F90:8
character(len=28), save cfilein_lfi
subroutine pgd_isba(DTCO, DTV, IG, IO, S, K, ISS, UG, U, USS, HPR
Definition: pgd_isba.F90:7
static int count
Definition: memory_hook.c:21