Newer
Older
!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!SFX_LIC for details. version 1.
! #########
SUBROUTINE PREP_TEB_EXTERN (DTCO, GCP, TOP, BOP, &
HPROGRAM,HSURF,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,KLUOUT,KPATCH,PFIELD)
! #################################################################################
!
!
!
USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t
USE MODD_GRID_CONF_PROJ_n, ONLY : GRID_CONF_PROJ_t
USE MODD_TEB_OPTION_n, ONLY : TEB_OPTIONS_t
USE MODD_BEM_OPTION_n, ONLY : BEM_OPTIONS_t
USE MODD_TYPE_DATE_SURF

WAUTELET Philippe
committed
USE MODD_SURF_PAR, ONLY: NFILENAMELGTMAX
!
USE MODI_PREP_GRID_EXTERN
USE MODI_READ_SURF
USE MODI_GET_TEB_DEPTHS
USE MODI_INTERP_GRID
USE MODI_OPEN_AUX_IO_SURF
USE MODI_CLOSE_AUX_IO_SURF
USE MODI_TOWN_PRESENCE
USE MODI_READ_TEB_PATCH
!
USE MODD_PREP, ONLY : CINGRID_TYPE, CINTERP_TYPE
USE MODD_PREP_TEB, ONLY : XGRID_ROAD, XGRID_WALL, XGRID_ROOF, &
XGRID_FLOOR, XGRID_MASS, &
XTI_BLD_DEF, XWS_ROOF_DEF, XWS_ROAD_DEF
USE MODD_SURF_PAR, ONLY: XUNDEF, LEN_HREC
!
USE YOMHOOK ,ONLY : LHOOK, DR_HOOK
USE PARKIND1 ,ONLY : JPRB
!
IMPLICIT NONE
!
!* 0.1 declarations of arguments
!
!
TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO
TYPE(GRID_CONF_PROJ_t),INTENT(INOUT) :: GCP
TYPE(TEB_OPTIONS_t), INTENT(INOUT) :: TOP
TYPE(BEM_OPTIONS_t), INTENT(INOUT) :: BOP
!
CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field

WAUTELET Philippe
committed
CHARACTER(LEN=NFILENAMELGTMAX), INTENT(IN) :: HFILE ! name of file
CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! type of input file
CHARACTER(LEN=NFILENAMELGTMAX), INTENT(IN) :: HFILEPGD ! name of file
CHARACTER(LEN=6), INTENT(IN) :: HFILEPGDTYPE ! type of input file
INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing
REAL,DIMENSION(:,:), POINTER :: PFIELD ! field to interpolate horizontally
!
!* 0.2 declarations of local variables
!
REAL, DIMENSION(:,:), ALLOCATABLE :: ZFIELD ! field read
REAL, DIMENSION(:,:), ALLOCATABLE :: ZDEPTH ! depth of each layer
REAL :: ZDEPTH_TOT ! total depth of surface
!
REAL, DIMENSION(:,:), ALLOCATABLE :: ZD ! intermediate array
!
REAL, DIMENSION(:), ALLOCATABLE :: ZMASK
CHARACTER(LEN=LEN_HREC) :: YRECFM ! Name of the article to be read
INTEGER :: IRESP ! reading return code
INTEGER :: ILAYER ! number of layers
INTEGER :: JLAYER, JI ! loop counter
INTEGER :: IVERSION_PGD, IVERSION_PREP ! SURFEX version
INTEGER :: IBUGFIX_PGD, IBUGFIX_PREP ! SURFEX bug version
LOGICAL :: GOLD_NAME ! old name flag for temperatures
LOGICAL :: GOLD_NAME2 ! old name flag for temperatures
CHARACTER(LEN=4) :: YWALL_OPT ! option of walls
CHARACTER(LEN=6) :: YSURF ! Surface type
CHARACTER(LEN=3) :: YBEM ! key of the building energy model DEF for DEFault (Masson et al. 2002) ,
! BEM for Building Energy Model (Bueno et al. 2012)
!
INTEGER :: INI ! total 1D dimension
!
LOGICAL :: GTEB ! flag if TEB fields are present
LOGICAL :: GINTERP ! flag if TEB fields are interpolated from a profile from TEB input
INTEGER :: IPATCH ! number of soil temperature patches
INTEGER :: ITEB_PATCH! number of TEB patches in file
CHARACTER(LEN=3) :: YPATCH ! indentificator for TEB patch
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!-------------------------------------------------------------------------------------
!
!* 1. Preparation of IO for reading in the file
! -----------------------------------------
!
!* Note that all points are read, even those without physical meaning.
! These points will not be used during the horizontal interpolation step.
! Their value must be defined as XUNDEF.
!
IF (LHOOK) CALL DR_HOOK('PREP_TEB_EXTERN',0,ZHOOK_HANDLE)
!
!
CALL OPEN_AUX_IO_SURF(HFILE,HFILETYPE,'FULL ')
CALL READ_SURF(HFILETYPE,'VERSION',IVERSION_PREP,IRESP,HDIR='-')
CALL READ_SURF(HFILETYPE,'BUG',IBUGFIX_PREP,IRESP,HDIR='-')
GDIM = (IVERSION_PREP>8 .OR. IVERSION_PREP==8 .AND. IBUGFIX_PREP>0)
IF (GDIM) CALL READ_SURF(HFILETYPE,'SPLIT_PATCH',GDIM,IRESP)
CALL CLOSE_AUX_IO_SURF(HFILE,HFILETYPE)
!
!* reading of version of the file being read
CALL OPEN_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE,'FULL ')
CALL READ_SURF(HFILEPGDTYPE,'VERSION',IVERSION_PGD,IRESP,HDIR='-')
CALL READ_SURF(HFILEPGDTYPE,'BUG',IBUGFIX_PGD,IRESP,HDIR='-')
!
!-------------------------------------------------------------------------------------
!
!* 2. Reading of grid
! ---------------
!
!* reads the grid
CALL PREP_GRID_EXTERN(GCP,HFILEPGDTYPE,KLUOUT,CINGRID_TYPE,CINTERP_TYPE,INI)
!
IF (NRANK/=NPIO) INI = 0
!* reads if TEB fields exist in the input file
CALL TOWN_PRESENCE(HFILEPGDTYPE,GTEB,HDIR='-')
IF (IVERSION_PGD>=7) THEN
IF (GTEB) THEN
YRECFM='FRAC_TOWN'
ELSE
YRECFM='FRAC_NATURE'
END IF
CALL READ_SURF(HFILEPGDTYPE,YRECFM,ZMASK,IRESP,HDIR='A')
ELSE
ZMASK(:) = 1.
CALL CLOSE_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE)
!
!---------------------------------------------------------------------------------------
!
!* 3. Orography
! ---------
!
IF (HSURF=='ZS ') THEN
!
ALLOCATE(PFIELD(INI,1))
YRECFM='ZS'
CALL OPEN_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE,'FULL ')
CALL READ_SURF(HFILEPGDTYPE,YRECFM,PFIELD(:,1),IRESP,HDIR='E')
CALL CLOSE_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE)
!
!---------------------------------------------------------------------------------------
ELSE
!---------------------------------------------------------------------------------------
!
!* 4. TEB fields are read
! -------------------
!
IF (GTEB) THEN
!
CALL OPEN_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE,'TOWN ')
GOLD_NAME=(IVERSION_PGD<7 .OR. (IVERSION_PGD==7 .AND. IBUGFIX_PGD<3))
GOLD_NAME2=(IVERSION_PGD<8 .OR. (IVERSION_PGD==8 .AND. IBUGFIX_PGD<2))
IF (.NOT.GOLD_NAME.AND.GTEB) THEN
YRECFM='BEM'
CALL READ_SURF(HFILEPGDTYPE,YRECFM,YBEM,IRESP,HDIR='-')
ELSE
YBEM='DEF'
ENDIF
CALL READ_TEB_PATCH(HFILEPGD,HFILEPGDTYPE,IVERSION_PGD,IBUGFIX_PGD,ITEB_PATCH,HDIR='-')
YPATCH=' '
IF (ITEB_PATCH>1) THEN
WRITE(YPATCH,FMT='(A,I1,A)') 'T',MIN(KPATCH,ITEB_PATCH),'_'
CALL CLOSE_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE)
!---------------------------------------------------------------------------------------
SELECT CASE(HSURF)
!---------------------------------------------------------------------------------------
!
!* 4.1 Profile of temperatures in roads, roofs or walls
! ------------------------------------------------
!
CASE('T_ROAD','T_BLD ','T_ROOF','T_WALLA','T_WALLB','T_FLOOR','T_MASS')
GINTERP = .TRUE.
!
!* interpolation on the fine vertical grid
IF (YSURF=='T_ROAD') THEN
ALLOCATE(PFIELD(INI,SIZE(XGRID_ROAD)))
ELSEIF (YSURF=='T_BLD ') THEN
ALLOCATE(PFIELD(INI,SIZE(XGRID_ROAD)))
ELSEIF (YSURF=='T_ROOF') THEN
ALLOCATE(PFIELD(INI,SIZE(XGRID_ROOF)))
ELSEIF (YSURF=='T_WALL') THEN
ALLOCATE(PFIELD(INI,SIZE(XGRID_WALL)))
ELSEIF (YSURF=='T_FLOO') THEN
ALLOCATE(PFIELD(INI,SIZE(XGRID_FLOOR)))
ELSEIF (YSURF=='T_MASS') THEN
ALLOCATE(PFIELD(INI,SIZE(XGRID_FLOOR)))
END IF
CALL OPEN_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE,'TOWN ')
!* reading of number of layers
IF (YSURF=='T_ROAD' .OR. YSURF=='T_BLD') THEN
IF (GOLD_NAME2) THEN
YRECFM='ROAD_LAYER'
ELSE
YRECFM='TEB_SOIL_LAY'
END IF
END IF
IF (YSURF=='T_ROOF') YRECFM='ROOF_LAYER'
IF (YSURF=='T_WALL') YRECFM='WALL_LAYER'
IF (YSURF=='T_FLOO') THEN
GINTERP=.FALSE.
ELSE
YRECFM='FLOOR_LAYER'
END IF
END IF
IF (YSURF=='T_MASS') THEN
IF (YBEM=='DEF') THEN
GINTERP=.FALSE.
ELSE
IF (GOLD_NAME2) THEN
YRECFM='FLOOR_LAYER'
ELSE
YRECFM='MASS_LAYER'
ENDIF
END IF
END IF
IF (GINTERP) THEN
CALL READ_SURF(HFILEPGDTYPE,YRECFM,ILAYER,IRESP,HDIR='-')
ELSE
ILAYER=1
END IF
CALL CLOSE_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE)
!* reading of version of the file being read
GOLD_NAME=(IVERSION_PREP<7 .OR. (IVERSION_PREP==7 .AND. IBUGFIX_PREP<3))
!
CALL OPEN_AUX_IO_SURF(HFILE,HFILETYPE,'TOWN ')
!
!* reading option for road orientation
YWALL_OPT = 'UNIF'
IF (YSURF =='T_WALL' .AND. .NOT. GOLD_NAME) THEN
CALL READ_SURF(HFILETYPE,'WALL_OPT',YWALL_OPT,IRESP,HDIR='-')
END IF
!
!* reading of the profile
ALLOCATE(ZFIELD(INI,ILAYER))
DO JLAYER=1,ILAYER
!---------------------------------------------
! Wall temperature profiles, for two different facing walls case
!---------------------------------------------
IF (YSURF =='T_WALL' .AND. YWALL_OPT/='UNIF') THEN
IF (GOLD_NAME) THEN
WRITE(YRECFM,'(A6,I1.1)') HSURF(1:6),JLAYER !Keeping "_" in variable name
ELSE
WRITE(YRECFM,'(A1,A5,I1.1)') HSURF(1:1),HSURF(3:7),JLAYER
END IF
!
!---------------------------------------------
! Floor or Mass temperature profiles, if no BEM present in input data
!---------------------------------------------
ELSEIF ((YSURF=='T_FLOO' .OR. YSURF=='T_MASS') .AND. YBEM=='DEF') THEN
IF (GOLD_NAME2) THEN
WRITE(YRECFM,'(A6)') 'TI_BLD'
ELSE
WRITE(YRECFM,'(A6)') 'TIBLD1'
END IF
!---------------------------------------------
! Floor or Mass temperature profiles, if BEM is present in input data
!---------------------------------------------
ELSE IF ((YSURF=='T_FLOO' .OR. YSURF=='T_MASS') .AND. YBEM=='BEM') THEN
!
! Only the value for one compartment is read and then
! applied to all compartiments
!
IF (GOLD_NAME) THEN
IF (YSURF=='T_FLOO') THEN
WRITE(YRECFM,'(A7,I1.1,A1,I1.1)') 'T_FLOO',JLAYER !A verifier eventuellement
ELSE IF (YSURF=='T_MASS') THEN
WRITE(YRECFM,'(A6,I1.1,A1,I1.1)') 'T_MASS',JLAYER
ENDIF
ELSE IF (GOLD_NAME2) THEN
IF (YSURF=='T_FLOO') THEN
WRITE(YRECFM,'(A6,I1.1,A1,I1.1)') 'TFLOO',JLAYER
ELSE IF (YSURF=='T_MASS') THEN
WRITE(YRECFM,'(A5,I1.1,A1,I1.1)') 'TMASS',JLAYER
ENDIF
IF (YSURF=='T_FLOO') THEN
WRITE(YRECFM,'(A5,I1.1,A1,I1.1)') 'TFLOO',JLAYER,'_',1
ELSE IF (YSURF=='T_MASS') THEN
WRITE(YRECFM,'(A5,I1.1,A1,I1.1)') 'TMASS',JLAYER,'_',1
ENDIF
!
!---------------------------------------------
! Below building soil temperature profiles
!---------------------------------------------
ELSEIF (YSURF=='T_BLD') THEN
IF (GOLD_NAME2) THEN ! old TEB version without soil below buildings: set a mixing between road and building temp.
IF (JLAYER.LT.2) THEN ! layers near the building set to building internal temperature, to avoid too cold or warm top road layers
IF (GOLD_NAME2) THEN
WRITE(YRECFM,'(A6)') 'TI_BLD'
ELSE
WRITE(YRECFM,'(A6)') 'TIBLD1'
END IF
ELSE IF (JLAYER.LT.10) THEN
IF (GOLD_NAME) THEN
WRITE(YRECFM,'(A6,I1.1)') 'T_ROAD',JLAYER
ELSE
WRITE(YRECFM,'(A5,I1.1)') 'TROAD',JLAYER
END IF
ELSE
IF (GOLD_NAME) THEN
WRITE(YRECFM,'(A6,I2.1)') 'T_ROAD',JLAYER
ELSE
WRITE(YRECFM,'(A5,I2.1)') 'TROAD',JLAYER
END IF
END IF
ELSE ! TEB version with soil temperature profile below buildings
IF (JLAYER.LT.10) THEN
WRITE(YRECFM,'(A5,I1.1)') 'TBLD',JLAYER
ELSE
WRITE(YRECFM,'(A5,I2.1)') 'TBLD',JLAYER
END IF
!---------------------------------------------
! Road temperature profiles
!---------------------------------------------
ELSE IF (YSURF =='T_ROAD') THEN
IF (JLAYER.LT.10) THEN
IF (GOLD_NAME) THEN
WRITE(YRECFM,'(A6,I1.1)') 'T_ROAD',JLAYER
ELSE
WRITE(YRECFM,'(A5,I1.1)') 'TROAD',JLAYER
END IF
ELSE
IF (GOLD_NAME) THEN
WRITE(YRECFM,'(A6,I2.1)') 'T_ROAD',JLAYER
ELSE
WRITE(YRECFM,'(A5,I2.1)') 'TROAD',JLAYER
END IF
END IF
!---------------------------------------------
! Others: Roof or uniform Wall temperature profiles
!---------------------------------------------
IF (GOLD_NAME) THEN
WRITE(YRECFM,'(A6,I1.1)') YSURF(1:6),JLAYER
ELSE
WRITE(YRECFM,'(A1,A4,I1.1)') YSURF(1:1),YSURF(3:6),JLAYER
END IF
END IF
!
YRECFM=YPATCH//YRECFM
YRECFM=ADJUSTL(YRECFM)
CALL READ_SURF(HFILETYPE,YRECFM,ZFIELD(:,JLAYER),IRESP,HDIR='E')
!
END DO
CALL CLOSE_AUX_IO_SURF(HFILE,HFILETYPE)
DO JLAYER=1,SIZE(ZFIELD,2)
WHERE (ZMASK(:)==0.) ZFIELD(:,JLAYER) = XUNDEF
ENDDO
!-----------------------------------------------------------------------------------------------------
IF (GINTERP) THEN ! input data of the corresponding variable is intrepolated from the input profile
!-----------------------------------------------------------------------------------------------------
ALLOCATE(ZD(INI,ILAYER))
IF (YSURF=='T_ROAD') CALL GET_TEB_DEPTHS(DTCO,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,PD_ROAD=ZD,HDIR='E')
IF (YSURF=='T_BLD ') CALL GET_TEB_DEPTHS(DTCO,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,PD_ROAD=ZD,HDIR='E')
IF (YSURF=='T_ROOF') CALL GET_TEB_DEPTHS(DTCO,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,PD_ROOF=ZD,HDIR='E')
IF (YSURF=='T_WALL') CALL GET_TEB_DEPTHS(DTCO,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,PD_WALL=ZD,HDIR='E')
IF (YSURF=='T_MASS') CALL GET_TEB_DEPTHS(DTCO,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,PD_MASS=ZD,HDIR='E')
IF (YSURF=='T_FLOO') CALL GET_TEB_DEPTHS(DTCO,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,PD_FLOOR=ZD,HDIR='E')
IF (NRANK==NPIO) THEN
!
!* recovers middle layer depth (from the surface)
ALLOCATE(ZDEPTH (INI,ILAYER))
DO JI=1,INI
!
ZDEPTH (JI,1)= ZD(JI,1)/2.
ZDEPTH_TOT = ZD(JI,1)
DO JLAYER=2,ILAYER
ZDEPTH (JI,JLAYER) = ZDEPTH_TOT + ZD(JI,JLAYER)/2.
ZDEPTH_TOT = ZDEPTH_TOT + ZD(JI,JLAYER)
ENDDO
!
!* in case of wall or roof, normalizes by total wall or roof thickness
IF (YSURF=='T_ROOF' .OR. YSURF=='T_WALL' .OR. YSURF == 'T_FLOO' .OR. YSURF == 'T_MASS') THEN
DO JLAYER=1,ILAYER
ZDEPTH(JI,JLAYER) = ZDEPTH(JI,JLAYER) / ZDEPTH_TOT
END DO
END IF
!
ENDDO
!
!* interpolation on the fine vertical grid
IF (YSURF=='T_ROAD') THEN
CALL INTERP_GRID(ZDEPTH,ZFIELD,XGRID_ROAD,PFIELD)
ELSEIF (YSURF=='T_BLD ') THEN
CALL INTERP_GRID(ZDEPTH,ZFIELD,XGRID_ROAD,PFIELD)
ELSEIF (YSURF=='T_ROOF') THEN
CALL INTERP_GRID(ZDEPTH,ZFIELD,XGRID_ROOF,PFIELD)
ELSEIF (YSURF=='T_WALL') THEN
CALL INTERP_GRID(ZDEPTH,ZFIELD,XGRID_WALL,PFIELD)
ELSEIF (YSURF=='T_FLOO') THEN
CALL INTERP_GRID(ZDEPTH,ZFIELD,XGRID_FLOOR,PFIELD)
ELSEIF (YSURF=='T_MASS') THEN
CALL INTERP_GRID(ZDEPTH,ZFIELD,XGRID_MASS,PFIELD)
END IF
DEALLOCATE(ZDEPTH)
!
ENDIF
!-----------------------------------------------------------------------------------------------------
ELSE ! no interpolation because input data does not exist. A constant field is applied instead.
!-----------------------------------------------------------------------------------------------------
DO JLAYER=1,SIZE(PFIELD,2)
PFIELD(:,JLAYER)=ZFIELD(:,1)
END DO
!-----------------------------------------------------------------------------------------------------
END IF
!-----------------------------------------------------------------------------------------------------
!
DEALLOCATE(ZFIELD)
!---------------------------------------------------------------------------------------
!
!* 4.2 Internal moisture and temperature
! ---------------------------------
CASE('QI_BLD ','TI_BLD ')
ALLOCATE(PFIELD(INI,1))
IF (HSURF=='TI_BLD' .OR. YBEM=='BEM') THEN
IF (GOLD_NAME2) THEN
YRECFM=HSURF
ELSE
IF (HSURF=='QI_BLD ') YRECFM='QIBLD1'
IF (HSURF=='TI_BLD ') YRECFM='TIBLD1'
END IF
YRECFM=YPATCH//YRECFM
YRECFM=ADJUSTL(YRECFM)
CALL OPEN_AUX_IO_SURF(HFILE,HFILETYPE,'TOWN ')
CALL READ_SURF(HFILETYPE,YRECFM,PFIELD(:,1),IRESP,HDIR='E')
CALL CLOSE_AUX_IO_SURF(HFILE,HFILETYPE)
ENDIF
!
!---------------------------------------------------------------------------------------
!
!* 4.2 Other variables
! ---------------
!
CASE DEFAULT
ALLOCATE(PFIELD(INI,1))
CALL OPEN_AUX_IO_SURF(HFILE,HFILETYPE,'TOWN ')
GOLD_NAME=(IVERSION_PREP<7 .OR. (IVERSION_PREP==7 .AND. IBUGFIX_PREP<3))
IF (HSURF=='T_CAN ') THEN
YRECFM='TCANYON'
IF (GOLD_NAME) YRECFM='T_CANYON'
ELSEIF (HSURF=='Q_CAN ') THEN
YRECFM='QCANYON'
IF (GOLD_NAME) YRECFM='Q_CANYON'
ELSEIF (HSURF=='T_WIN2 ' .OR. HSURF=='T_WIN1') THEN
IF (YBEM=='BEM') THEN
YRECFM=HSURF
ELSE
IF (GOLD_NAME2) THEN
YRECFM='TI_BLD'
ELSE
YRECFM='TIBLD1'
END IF
ELSEIF (HSURF=='VENTNIG') THEN
!
! Only one compartiment is read
!
YRECFM='VENTNIG1'
!
ELSEIF (HSURF=='SHADVAC') THEN
!
! Only one compartiment is read
!
YRECFM='SHADVAC1'
!
ELSEIF (HSURF=='TDEEP_T') THEN
YRECFM='TDEEP_TEB'
IF (GOLD_NAME2) YRECFM='TI_ROAD'
ENDIF
YRECFM=YPATCH//YRECFM
YRECFM=ADJUSTL(YRECFM)
IF (HSURF=='PSOLD ') THEN
IF (GOLD_NAME2 .OR. YBEM == 'DEF') THEN
PFIELD(:,1) = XUNDEF
ELSE
CALL READ_SURF(HFILETYPE,YRECFM,PFIELD(:,1),IRESP,HDIR='E')
ENDIF
ELSEIF (HSURF=='VENTNIG') THEN
IF (GOLD_NAME2 .OR. YBEM == 'DEF') THEN
PFIELD(:,1) = 0.0
ELSE
CALL READ_SURF(HFILETYPE,YRECFM,PFIELD(:,1),IRESP,HDIR='E')
ENDIF
ELSEIF (HSURF=='SHADVAC') THEN
IF (GOLD_NAME2 .OR. YBEM == 'DEF') THEN
PFIELD(:,1) = 0.0
ELSE
CALL READ_SURF(HFILETYPE,YRECFM,PFIELD(:,1),IRESP,HDIR='E')
ENDIF
ELSE
CALL READ_SURF(HFILETYPE,YRECFM,PFIELD(:,1),IRESP,HDIR='E')
ENDIF
CALL CLOSE_AUX_IO_SURF(HFILE,HFILETYPE)
!
!---------------------------------------------------------------------------------------
END SELECT
!---------------------------------------------------------------------------------------
!
!* 5. Subtitutes if TEB fields do not exist
! -------------------------------------
!
ELSE
SELECT CASE(HSURF)
!* temperature profiles
CASE('T_ROAD','T_BLD ','T_ROOF','T_WALL','T_WIN1','T_CAN','TDEEP_T','T_WALLA','T_WALLB')
!* reading of the soil surface temperature
CALL OPEN_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE,'NATURE')
IPATCH = 0
CALL READ_SURF(HFILEPGDTYPE,'PATCH_NUMBER',IPATCH,IRESP,HDIR='-')
CALL CLOSE_AUX_IO_SURF(HFILEPGD,HFILEPGDTYPE)
ALLOCATE(ZFIELD(INI,IPATCH))
!
CALL OPEN_AUX_IO_SURF(HFILE,HFILETYPE,'NATURE')
IF (YSURF=='T_FLOO' .OR. YSURF=='T_CAN ' .OR. YSURF=='TI_ROA') THEN
CALL MAKE_CHOICE_ARRAY(HFILETYPE, IPATCH, GDIM, 'TG2', ZFIELD(:,:),HDIR='E')
ELSE
CALL MAKE_CHOICE_ARRAY(HFILETYPE, IPATCH, GDIM, 'TG1', ZFIELD(:,:),HDIR='E')
ENDIF
CALL CLOSE_AUX_IO_SURF(HFILE,HFILETYPE)
DO JLAYER=1,SIZE(ZFIELD,2)
WHERE (ZMASK(:)==0.) ZFIELD(:,JLAYER) = XUNDEF
ENDDO
!* fills the whole temperature profile by this soil temperature
IF (YSURF=='T_ROAD') ILAYER=SIZE(XGRID_ROAD)
IF (YSURF=='T_BLD ') ILAYER=SIZE(XGRID_ROAD)
IF (YSURF=='T_ROOF') ILAYER=SIZE(XGRID_ROOF)
IF (YSURF=='T_WALL') ILAYER=SIZE(XGRID_WALL)
IF (YSURF=='T_FLOO') ILAYER=SIZE(XGRID_FLOOR)
IF (YSURF=='T_WIN1' .OR. YSURF=='T_CAN ' .OR. YSURF=='TI_ROA' .OR. YSURF=='TDEEP_') ILAYER=1
ALLOCATE(PFIELD(INI,ILAYER))
PFIELD(:,1) = ZFIELD(:,1)
DO JLAYER=2,ILAYER
PFIELD(:,JLAYER) = ZFIELD(:,1)
END DO
DEALLOCATE(ZFIELD)
CASE('T_MASS','TI_BLD','T_WIN2','T_FLOOR')
IF (YSURF=='T_FLOO') ILAYER = SIZE(XGRID_FLOOR)
IF (YSURF=='T_MASS') ILAYER = SIZE(XGRID_MASS)
IF (YSURF=='TI_BLD'.OR.YSURF=='T_WIN2') ILAYER=1
ALLOCATE(PFIELD(INI, ILAYER))
PFIELD(:,:) = XTI_BLD_DEF
!* building moisture
CASE('QI_BLD ')
ALLOCATE(PFIELD(INI,1))
PFIELD(:,1) = XUNDEF
!* water reservoirs
CASE('WS_ROOF','WS_ROAD')
ALLOCATE(PFIELD(INI,1))
IF (HSURF=='WS_ROOF') PFIELD = XWS_ROOF_DEF
IF (HSURF=='WS_ROAD') PFIELD = XWS_ROAD_DEF
!
! Robert: These values are hardcoded at the moment
!
CASE('PSOLD ')
ALLOCATE(PFIELD(INI,1))
PFIELD = XUNDEF
!
CASE('VENTNIG')
ALLOCATE(PFIELD(INI,1))
PFIELD = 0.0
!
CASE('SHADVAC')
ALLOCATE(PFIELD(INI,1))
PFIELD = 0.0
!
!* other fields
CASE DEFAULT
ALLOCATE(PFIELD(INI,1))
PFIELD = 0.
END SELECT
END IF
!-------------------------------------------------------------------------------------
END IF
!-------------------------------------------------------------------------------------
!
!* 6. End of IO
! ---------
!
IF (LHOOK) CALL DR_HOOK('PREP_TEB_EXTERN',1,ZHOOK_HANDLE)
!
!---------------------------------------------------------------------------------------
!
END SUBROUTINE PREP_TEB_EXTERN