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.
5 ! ###########################################################
6 SUBROUTINE ZOOM_PGD_TEB(HPROGRAM,HINIFILE,HINIFILETYPE,OECOCLIMAP,OGARDEN)
7 ! ###########################################################
12 !! This program prepares the physiographic data fields.
31 !! V. Masson Meteo-France
37 !----------------------------------------------------------------------------
42 USE MODD_SURF_PAR, ONLY : XUNDEF
44 USE MODD_DATA_COVER_PAR, ONLY : JPCOVER
45 USE MODD_TEB_GRID_n, ONLY : XLAT, XLON, CGRID, XGRID_PAR, &
47 USE MODD_TEB_n, ONLY : XCOVER, LCOVER, XZS, &
48 NROOF_LAYER, NROAD_LAYER, NWALL_LAYER, &
49 LECOCLIMAP, LGARDEN, NTEB_PATCH, &
51 USE MODD_BEM_n, ONLY : NFLOOR_LAYER
53 USE MODD_PREP, ONLY : CINGRID_TYPE, CINTERP_TYPE, LINTERP
57 USE MODI_OPEN_AUX_IO_SURF
58 USE MODI_GET_SURF_SIZE_n
60 USE MODI_PREP_GRID_EXTERN
61 USE MODI_PREP_OUTPUT_GRID
63 USE MODI_READ_PGD_TEB_PAR_n
64 USE MODI_CLOSE_AUX_IO_SURF
65 USE MODI_CLEAN_PREP_OUTPUT_GRID
68 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK
69 USE PARKIND1 ,ONLY : JPRB
74 !* 0.1 Declaration of dummy arguments
75 ! ------------------------------
77 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling
78 CHARACTER(LEN=28), INTENT(IN) :: HINIFILE ! file to read
79 CHARACTER(LEN=6), INTENT(IN) :: HINIFILETYPE! file type
80 LOGICAL, INTENT(IN) :: OECOCLIMAP ! flag to use ecoclimap
81 LOGICAL, INTENT(IN) :: OGARDEN ! flag to use garden
84 !* 0.2 Declaration of local variables
85 ! ------------------------------
87 INTEGER :: IRESP ! error return code
88 INTEGER :: ILUOUT ! output listing logical unit
89 INTEGER :: INI ! total 1D dimension (input grid)
90 INTEGER :: JLAYER ! loop counter
91 INTEGER :: ILU ! total 1D dimension (output grid, TOWN points only)
92 INTEGER :: JPATCH ! TEB patch
93 REAL(KIND=JPRB) :: ZHOOK_HANDLE
96 !------------------------------------------------------------------------------
97 IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_TEB',0,ZHOOK_HANDLE)
98 CALL GET_LUOUT(HPROGRAM,ILUOUT)
100 LECOCLIMAP = OECOCLIMAP
103 IF (.NOT. OECOCLIMAP) THEN
104 WRITE(ILUOUT,*) 'ERROR'
105 WRITE(ILUOUT,*) 'Ecoclimap is not used'
106 WRITE(ILUOUT,*) 'Routine zoom_pgd_teb.f90 must be updated'
107 WRITE(ILUOUT,*) 'to interpolate all TEB physiographic fields'
108 CALL ABOR1_SFX('ZOOM_PGD_TEB: ECOCLIMAP NOT USED, ROUTINE MUST BE UPDATED')
112 !* 1. Preparation of IO for reading in the file
113 ! -----------------------------------------
115 !* Note that all points are read, even those without physical meaning.
116 ! These points will not be used during the horizontal interpolation step.
117 ! Their value must be defined as XUNDEF.
119 CALL OPEN_AUX_IO_SURF(HINIFILE,HINIFILETYPE,'FULL ')
122 !-------------------------------------------------------------------------------
124 !* 2. Number of points and packing of general fields
125 ! ----------------------------------------------
128 CALL GET_SURF_SIZE_n('TOWN ',ILU)
130 ALLOCATE(LCOVER (JPCOVER))
131 ALLOCATE(XCOVER (ILU,JPCOVER))
135 ALLOCATE(XMESH_SIZE (ILU))
137 CALL PACK_PGD(HPROGRAM, 'TOWN ', &
139 LCOVER, XCOVER, XZS, &
140 XLAT, XLON, XMESH_SIZE )
145 CALL READ_SURF(HPROGRAM,'VERSION',IVERSION,IRESP)
146 CALL READ_SURF(HPROGRAM,'BUG',IBUGFIX,IRESP)
147 !------------------------------------------------------------------------------
149 !* 3. Reading of grid
152 CALL PREP_GRID_EXTERN(HINIFILETYPE,ILUOUT,CINGRID_TYPE,CINTERP_TYPE,INI)
154 CALL PREP_OUTPUT_GRID(ILUOUT,CGRID,XGRID_PAR,XLAT,XLON)
157 !------------------------------------------------------------------------------
159 !* 4. Reading & interpolation of fields
160 ! ---------------------------------
163 IF (IVERSION<7 .OR. IVERSION==7 .AND. IBUGFIX<=2) THEN
166 CALL READ_SURF(HPROGRAM,'TEB_PATCH',NTEB_PATCH,IRESP)
170 CALL READ_SURF(HPROGRAM,'ROOF_LAYER',NROOF_LAYER,IRESP)
171 CALL READ_SURF(HPROGRAM,'ROAD_LAYER',NROAD_LAYER,IRESP)
172 CALL READ_SURF(HPROGRAM,'WALL_LAYER',NWALL_LAYER,IRESP)
174 IF (IVERSION<7 .OR.( IVERSION==7 .AND. IBUGFIX<=2)) THEN
178 CALL READ_SURF(HPROGRAM,'BLD_ATYPE' ,CBLD_ATYPE,IRESP)
179 CALL READ_SURF(HPROGRAM,'BEM' ,CBEM ,IRESP)
182 IF (CBEM/='DEF') THEN
183 CALL READ_SURF(HPROGRAM,'FLOOR_LAYER',NFLOOR_LAYER,IRESP)
186 DO JPATCH=1,NTEB_PATCH
187 CALL GOTO_TEB(JPATCH)
188 CALL READ_PGD_TEB_PAR_n(HPROGRAM,INI,'A')
190 !------------------------------------------------------------------------------
195 IF (LGARDEN) CALL ZOOM_PGD_TEB_GARDEN
198 CALL CLOSE_AUX_IO_SURF(HINIFILE,HINIFILETYPE)
200 CALL CLEAN_PREP_OUTPUT_GRID
202 !------------------------------------------------------------------------------
203 IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_TEB',1,ZHOOK_HANDLE)
204 !------------------------------------------------------------------------------
208 SUBROUTINE ZOOM_PGD_TEB_GARDEN
210 USE MODI_HOR_INTERPOL
212 USE MODD_ISBA_PAR, ONLY : XOPTIMGRID
213 USE MODD_TEB_VEG_n, ONLY : CPHOTO, CISBA, &
215 USE MODD_TEB_GARDEN_n, ONLY : NGROUND_LAYER, &
217 XWDRAIN, XRUNOFFB, LPAR_GARDEN,&
222 REAL, DIMENSION(:,:), POINTER :: ZIN ! field on all surface points
224 REAL, DIMENSION(INI) :: ZFIELD ! field read
225 REAL, DIMENSION(ILU,1) :: ZOUT ! final field
226 REAL(KIND=JPRB) :: ZHOOK_HANDLE
227 CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
229 IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_TEB:ZOOM_PGD_TEB_GARDEN',0,ZHOOK_HANDLE)
233 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) THEN
234 CALL READ_SURF(HPROGRAM,'GD_LAYER',NGROUND_LAYER,IRESP)
235 CALL READ_SURF(HPROGRAM,'GD_ISBA',CISBA,IRESP)
236 CALL READ_SURF(HPROGRAM,'GD_PHOTO',CPHOTO,IRESP)
237 CALL READ_SURF(HPROGRAM,'GD_PEDOTF',CPEDOTF,IRESP)
239 IF (CPHOTO=='NIT') NNBIOMASS=3
241 CALL READ_SURF(HPROGRAM,'TWN_LAYER',NGROUND_LAYER,IRESP)
242 CALL READ_SURF(HPROGRAM,'TWN_ISBA',CISBA,IRESP)
243 CALL READ_SURF(HPROGRAM,'TWN_PHOTO',CPHOTO,IRESP)
244 CALL READ_SURF(HPROGRAM,'TWN_PEDOTF',CPEDOTF,IRESP)
245 CALL READ_SURF(HPROGRAM,'TWN_NBIOMASS',NNBIOMASS,IRESP)
250 ALLOCATE(ZIN(INI,NGROUND_LAYER))
252 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) YRECFM='GD_SAND'
253 CALL READ_SURF(HPROGRAM,YRECFM,ZFIELD,IRESP,HDIR='A')
254 DO JLAYER=1,NGROUND_LAYER
255 ZIN(:,JLAYER) = ZFIELD(:)
257 ALLOCATE(XSAND(ILU,NGROUND_LAYER))
258 CALL HOR_INTERPOL(ILUOUT,ZIN,XSAND)
263 ALLOCATE(ZIN(INI,NGROUND_LAYER))
265 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) YRECFM='GD_CLAY'
266 CALL READ_SURF(HPROGRAM,YRECFM,ZFIELD,IRESP,HDIR='A')
267 DO JLAYER=1,NGROUND_LAYER
268 ZIN(:,JLAYER) = ZFIELD(:)
270 ALLOCATE(XCLAY(ILU,NGROUND_LAYER))
271 CALL HOR_INTERPOL(ILUOUT,ZIN,XCLAY)
278 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) YRECFM='GD_RUNOFFB'
279 CALL READ_SURF(HPROGRAM,YRECFM,ZFIELD,IRESP,HDIR='A')
281 ALLOCATE(XRUNOFFB(ILU))
282 CALL HOR_INTERPOL(ILUOUT,ZIN,ZOUT)
283 XRUNOFFB(:) = ZOUT(:,1)
285 IF (IVERSION<=3) THEN
289 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) YRECFM='GD_WDRAIN'
290 CALL READ_SURF(HPROGRAM,YRECFM,ZFIELD,IRESP,HDIR='A')
292 ALLOCATE(XWDRAIN(ILU))
293 CALL HOR_INTERPOL(ILUOUT,ZIN,ZOUT)
294 XWDRAIN(:) = ZOUT(:,1)
299 IF(CISBA=='DIF') THEN
300 ALLOCATE(XSOILGRID(NGROUND_LAYER))
302 IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=2) THEN
303 CALL READ_SURF(HPROGRAM,'GD_SOILGRID',XSOILGRID,IRESP,HDIR='-')
305 XSOILGRID(1:NGROUND_LAYER)=XOPTIMGRID(1:NGROUND_LAYER)
308 ALLOCATE(XSOILGRID(0))
312 !* other garden parameters
314 CALL READ_SURF(HPROGRAM,'PAR_GARDEN',LPAR_GARDEN,IRESP)
317 IF (LPAR_GARDEN) THEN
318 WRITE(ILUOUT,*) 'ERROR'
319 WRITE(ILUOUT,*) 'Specific garden fields are prescribed'
320 WRITE(ILUOUT,*) 'Routine zoom_pgd_teb.f90 must be updated'
321 WRITE(ILUOUT,*) 'to interpolate all TEB physiographic garden fields'
322 CALL ABOR1_SFX('ZOOM_PGD_TEB: GARDEN fields used, ROUTINE MUST BE UPDATED')
325 IF (LHOOK) CALL DR_HOOK('ZOOM_PGD_TEB:ZOOM_PGD_TEB_GARDEN',1,ZHOOK_HANDLE)
327 END SUBROUTINE ZOOM_PGD_TEB_GARDEN
328 !_______________________________________________________________________________
330 END SUBROUTINE ZOOM_PGD_TEB