1 !SURFEX_LIC Copyright 1994-2014 Meteo-France
2 !SURFEX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SURFEX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SURFEX_LIC for details. version 1.
6 SUBROUTINE READ_PGD_ISBA_n(HPROGRAM,OLAND_USE)
7 ! #########################################
9 !!**** *READ_PGD_ISBA_n* - routine to initialise ISBA physiographic variables
30 !! V. Masson *Meteo France*
35 !! P. Le Moigne 12/2004 : add type of photosynthesis
36 !! B. Decharme 2008 : add XWDRAIN
37 !! B. Decharme 06/2009 : add topographic index statistics
38 !! A.L. Gibelin 04/2009 : dimension NBIOMASS for ISBA-A-gs
39 !! B. Decharme 07/2012 : files of data for permafrost area and for SOC top and sub soil
40 !! M. Moge 02/2015 READ_SURF
41 !-------------------------------------------------------------------------------
46 USE MODD_TYPE_DATE_SURF
48 USE MODD_DATA_COVER_PAR, ONLY : JPCOVER
50 USE MODD_SURF_PAR, ONLY : XUNDEF
51 USE MODD_SURF_ATM_n, ONLY : CNATURE, NSIZE_FULL
52 USE MODD_ISBA_n, ONLY : NPATCH, TTIME, XCOVER, XZS, CISBA, CPEDOTF, &
53 CPHOTO, LTR_ML, CRUNOFF, XCLAY, XSAND, &
54 XSOC, LSOCP, LNOF, XRM_PATCH, &
55 NGROUND_LAYER, NNBIOMASS, &
56 XAOSIP, XAOSIM, XAOSJP, XAOSJM, &
57 XHO2IP, XHO2IM, XHO2JP, XHO2JM, &
58 XSSO_SLOPE, XSSO_STDEV, XRUNOFFB, &
59 XZ0EFFJPDIR, LCOVER, LECOCLIMAP, LCTI, &
60 XWDRAIN, XTI_MIN, XTI_MAX, XTI_MEAN, &
61 XTI_STD, XTI_SKEW, XSOILGRID, XPH, XFERT, &
63 USE MODD_ISBA_GRID_n, ONLY : XLAT, XLON, XMESH_SIZE, CGRID, XGRID_PAR, NDIM
64 USE MODD_ISBA_PAR, ONLY : XOPTIMGRID
65 USE MODD_GR_BIOG_n, ONLY : XISOPOT, XMONOPOT
66 USE MODD_CH_ISBA_n, ONLY : LCH_BIO_FLUX, LCH_NO_FLUX
68 USE MODI_INIT_IO_SURF_n
69 USE MODI_END_IO_SURF_n
74 USE MODI_READ_PGD_ISBA_PAR_n
75 USE MODI_READ_PGD_TSZ0_PAR_n
77 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK
78 USE PARKIND1 ,ONLY : JPRB
80 USE MODI_GET_TYPE_DIM_n
81 USE MODI_READ_LECOCLIMAP
86 USE MODI_PACK_SAME_RANK
87 USE MODI_GET_SURF_MASK_n
91 !* 0.1 Declarations of arguments
92 ! -------------------------
94 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
95 LOGICAL, INTENT(IN) :: OLAND_USE !
97 !* 0.2 Declarations of local variables
98 ! -------------------------------
100 INTEGER, DIMENSION(:), POINTER :: IMASK ! mask for packing from complete field to nature field
102 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK
104 INTEGER :: IRESP ! Error code after redding
106 CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
108 INTEGER :: ILU ! expected physical size of full surface array
109 INTEGER :: ILUOUT ! output listing logical unit
110 INTEGER :: JLAYER ! loop counter on layers
111 INTEGER :: IVERSION, IBUGFIX ! surface version
112 REAL(KIND=JPRB) :: ZHOOK_HANDLE
114 !-------------------------------------------------------------------------------
116 !* 1D physical dimension
118 IF (LHOOK) CALL DR_HOOK('READ_PGD_ISBA_N',0,ZHOOK_HANDLE)
120 CALL GET_TYPE_DIM_n('NATURE',NDIM)
123 CALL READ_SURF(HPROGRAM,YRECFM,IVERSION,IRESP)
126 CALL READ_SURF(HPROGRAM,YRECFM,IBUGFIX,IRESP)
128 !* 2. Dimension initializations:
129 ! -------------------------
134 CALL READ_SURF(HPROGRAM,YRECFM,CISBA,IRESP)
136 IF (IVERSION>=7) THEN
138 !* Pedo-transfert function
141 CALL READ_SURF(HPROGRAM,YRECFM,CPEDOTF,IRESP)
147 !* type of photosynthesis
150 CALL READ_SURF(HPROGRAM,YRECFM,CPHOTO,IRESP)
152 !* new radiative transfert
154 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=2) THEN
157 CALL READ_SURF(HPROGRAM,YRECFM,LTR_ML,IRESP)
163 !* threshold to remove little fractions of patches
165 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) THEN
168 CALL READ_SURF(HPROGRAM,YRECFM,XRM_PATCH,IRESP)
174 !* number of soil layers
176 YRECFM='GROUND_LAYER'
177 CALL READ_SURF(HPROGRAM,YRECFM,NGROUND_LAYER,IRESP)
179 !* Reference grid for DIF
181 IF(CISBA=='DIF') THEN
182 ALLOCATE(XSOILGRID(NGROUND_LAYER))
184 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=2) THEN
186 CALL READ_SURF(HPROGRAM,YRECFM,XSOILGRID,IRESP,HDIR='-')
188 XSOILGRID(1:NGROUND_LAYER)=XOPTIMGRID(1:NGROUND_LAYER)
191 ALLOCATE(XSOILGRID(0))
194 !* number of biomass pools
196 IF (IVERSION>=6) THEN
198 CALL READ_SURF(HPROGRAM,YRECFM,NNBIOMASS,IRESP)
201 CASE ('AGS','LAI','AST','LST')
212 YRECFM='PATCH_NUMBER'
213 CALL READ_SURF(HPROGRAM,YRECFM,NPATCH,IRESP)
216 !* 3. Physiographic data fields:
217 ! -------------------------
220 !* 3.1 Cover classes :
223 ALLOCATE(LCOVER(JPCOVER))
224 CALL READ_LCOVER(HPROGRAM,LCOVER)
226 ALLOCATE(XCOVER(NDIM,JPCOVER))
227 CALL READ_SURF(HPROGRAM,'COVER',XCOVER(:,:),LCOVER,IRESP,HDIR='H')
235 CALL READ_SURF(HPROGRAM,YRECFM,XZS(:),IRESP)
238 !* latitude, longitude, mesh size, and heading of JP axis (deg from N clockwise)
240 ALLOCATE(XLAT (NDIM))
241 ALLOCATE(XLON (NDIM))
242 ALLOCATE(XMESH_SIZE (NDIM))
243 ALLOCATE(XZ0EFFJPDIR(NDIM))
244 CALL READ_GRID(HPROGRAM,CGRID,XGRID_PAR,XLAT,XLON,XMESH_SIZE,IRESP,XZ0EFFJPDIR)
246 !* clay fraction : attention, seul un niveau est present dans le fichier
247 !* on rempli tout les niveaux de XCLAY avec les valeurs du fichiers
249 ALLOCATE(XCLAY(NDIM,NGROUND_LAYER))
251 CALL READ_SURF(HPROGRAM,YRECFM,XCLAY(:,1),IRESP)
252 DO JLAYER=2,NGROUND_LAYER
253 XCLAY(:,JLAYER)=XCLAY(:,1)
258 ALLOCATE(XSAND(NDIM,NGROUND_LAYER))
260 CALL READ_SURF(HPROGRAM,YRECFM,XSAND(:,1),IRESP)
261 DO JLAYER=2,NGROUND_LAYER
262 XSAND(:,JLAYER)=XSAND(:,1)
265 !* Soil organic carbon profile
267 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) THEN
269 CALL READ_SURF(HPROGRAM,YRECFM,LSOCP,IRESP)
276 ALLOCATE(XSOC (NDIM,NGROUND_LAYER))
279 CALL READ_SURF(HPROGRAM,YRECFM,XSOC(:,1),IRESP)
281 CALL READ_SURF(HPROGRAM,YRECFM,XSOC(:,2),IRESP)
283 DO JLAYER=2,NGROUND_LAYER
284 XSOC (:,JLAYER)=XSOC (:,2)
293 !* permafrost distribution
295 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) THEN
297 CALL READ_SURF(HPROGRAM,YRECFM,LPERM,IRESP)
304 ALLOCATE(XPERM (NDIM))
307 CALL READ_SURF(HPROGRAM,YRECFM,XPERM(:),IRESP)
315 IF (IVERSION>7 .OR. (IVERSION==7 .AND. IBUGFIX>=3)) THEN
317 CALL READ_SURF(HPROGRAM,YRECFM,LNOF,IRESP)
324 IF (LCH_NO_FLUX) THEN
330 CALL READ_SURF(HPROGRAM,YRECFM,XPH(:),IRESP)
332 ALLOCATE(XFERT(NDIM))
334 CALL READ_SURF(HPROGRAM,YRECFM,XFERT(:),IRESP)
337 CALL ABOR1_SFX("READ_PGD_ISBAn: WITH LCH_NO_FLUX=T, PH AND FERT FIELDS ARE GIVEN AT PGD STEP")
345 !* subgrid-scale orography parameters to compute dynamical roughness length
347 ALLOCATE(XAOSIP(NDIM))
349 CALL READ_SURF(HPROGRAM,YRECFM,XAOSIP,IRESP)
351 ALLOCATE(XAOSIM(NDIM))
353 CALL READ_SURF(HPROGRAM,YRECFM,XAOSIM,IRESP)
355 ALLOCATE(XAOSJP(NDIM))
357 CALL READ_SURF(HPROGRAM,YRECFM,XAOSJP,IRESP)
359 ALLOCATE(XAOSJM(NDIM))
361 CALL READ_SURF(HPROGRAM,YRECFM,XAOSJM,IRESP)
363 ALLOCATE(XHO2IP(NDIM))
365 CALL READ_SURF(HPROGRAM,YRECFM,XHO2IP,IRESP)
367 ALLOCATE(XHO2IM(NDIM))
369 CALL READ_SURF(HPROGRAM,YRECFM,XHO2IM,IRESP)
371 ALLOCATE(XHO2JP(NDIM))
373 CALL READ_SURF(HPROGRAM,YRECFM,XHO2JP,IRESP)
375 ALLOCATE(XHO2JM(NDIM))
377 CALL READ_SURF(HPROGRAM,YRECFM,XHO2JM,IRESP)
379 !* orographic parameter to compute effective surface of energy exchanges
381 ALLOCATE(XSSO_SLOPE(NDIM))
383 CALL READ_SURF(HPROGRAM,YRECFM,XSSO_SLOPE,IRESP)
385 !* orographic standard deviation for subgrid-scale orographic drag
387 ALLOCATE(XSSO_STDEV(NDIM))
389 CALL READ_SURF(HPROGRAM,YRECFM,XSSO_STDEV(:),IRESP)
391 !* orographic runoff coefficient
393 ALLOCATE(XRUNOFFB(NDIM))
395 CALL READ_SURF(HPROGRAM,YRECFM,XRUNOFFB,IRESP)
397 !* subgrid drainage coefficient
399 ALLOCATE(XWDRAIN(NDIM))
400 IF (IVERSION<=3) THEN
404 CALL READ_SURF(HPROGRAM,YRECFM,XWDRAIN,IRESP)
407 !* topographic index statistics
409 IF(CRUNOFF=='SGH ' .AND. IVERSION>=5) THEN
412 CALL READ_SURF(HPROGRAM,YRECFM,LCTI,IRESP)
414 IF (.NOT.LCTI) CALL ABOR1_SFX("READ_PGD_ISBA_n:WITH CRUNOFF=SGH, CTI MAPS MUST BE GIVEN TO PGD")
416 ALLOCATE(XTI_MIN(NDIM))
417 ALLOCATE(XTI_MAX(NDIM))
418 ALLOCATE(XTI_MEAN(NDIM))
419 ALLOCATE(XTI_STD(NDIM))
420 ALLOCATE(XTI_SKEW(NDIM))
423 CALL READ_SURF(HPROGRAM,YRECFM,XTI_MIN,IRESP)
426 CALL READ_SURF(HPROGRAM,YRECFM,XTI_MAX,IRESP)
429 CALL READ_SURF(HPROGRAM,YRECFM,XTI_MEAN,IRESP)
432 CALL READ_SURF(HPROGRAM,YRECFM,XTI_STD,IRESP)
435 CALL READ_SURF(HPROGRAM,YRECFM,XTI_SKEW,IRESP)
441 ALLOCATE(XTI_MEAN(0))
443 ALLOCATE(XTI_SKEW(0))
447 !-------------------------------------------------------------------------------
449 !* biogenic chemical emissions
451 IF (LCH_BIO_FLUX) THEN
452 ALLOCATE(ZWORK(NSIZE_FULL,1))
454 CALL END_IO_SURF_n(HPROGRAM)
455 CALL INIT_IO_SURF_n(HPROGRAM,'FULL ','SURF ','READ ')
457 CALL GET_LUOUT(HPROGRAM,ILUOUT)
458 ALLOCATE(IMASK(NDIM))
460 CALL GET_SURF_MASK_n('NATURE',NDIM,IMASK,ILU,ILUOUT)
461 ALLOCATE(XISOPOT(NDIM))
462 ALLOCATE(XMONOPOT(NDIM))
466 CALL READ_SURF(HPROGRAM,YRECFM,ZWORK,IRESP)
467 CALL PACK_SAME_RANK(IMASK,ZWORK(:,1),XISOPOT(:))
471 CALL READ_SURF(HPROGRAM,YRECFM,ZWORK,IRESP)
472 CALL PACK_SAME_RANK(IMASK,ZWORK(:,1),XMONOPOT(:))
474 CALL END_IO_SURF_n(HPROGRAM)
475 CALL INIT_IO_SURF_n(HPROGRAM,'NATURE','ISBA ','READ ')
479 ALLOCATE(XISOPOT (0))
480 ALLOCATE(XMONOPOT(0))
483 !-------------------------------------------------------------------------------
485 !* 4. Physiographic data fields not to be computed by ecoclimap
486 ! ---------------------------------------------------------
488 CALL READ_LECOCLIMAP(HPROGRAM,LECOCLIMAP)
490 CALL READ_PGD_ISBA_PAR_n(HPROGRAM,NDIM,OLAND_USE)
491 IF (CNATURE == 'TSZ0') CALL READ_PGD_TSZ0_PAR_n(HPROGRAM)
493 IF (LHOOK) CALL DR_HOOK('READ_PGD_ISBA_N',1,ZHOOK_HANDLE)
494 !-------------------------------------------------------------------------------
496 END SUBROUTINE READ_PGD_ISBA_n