!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
! version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
! #################################################################################
SUBROUTINE PREP_HOR_TEB_FIELD(HPROGRAM,HSURF,HATMFILE,HATMFILETYPE),14
! #################################################################################
!
!
!!**** *PREP_HOR_TEB_FIELD* - reads, interpolates and prepares a TEB field
!!
!! PURPOSE
!! -------
!
!!** METHOD
!! ------
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!! V. Masson
!!
!! MODIFICATIONS
!! -------------
!! Original 01/2004
!!------------------------------------------------------------------
!
!
USE MODD_PREP
, ONLY : CINGRID_TYPE, COUTGRID_TYPE, CINTERP_TYPE, XZS_LS, XLAT_OUT, XLON_OUT
USE MODD_PREP_TEB
, ONLY : XGRID_ROOF, XGRID_ROAD, XGRID_WALL
USE MODD_TEB
, ONLY : XWS_ROAD, XWS_ROOF, XT_ROAD, XT_ROOF, XT_WALL, XTI_BLD, &
XT_CANYON,XQ_CANYON,XD_ROAD,XD_WALL,XD_ROOF, &
NROAD_LAYER, NWALL_LAYER, NROOF_LAYER, &
TSNOW_ROOF, TSNOW_ROAD, XTI_ROAD
USE MODD_TEB_GRID
, ONLY: XLAT, XLON
!
!USE MODI_READ_PREP_TEB_CONF
!USE MODI_PREP_TEB_GRIB
!USE MODI_PREP_TEB_UNIF
USE MODI_PREP_TEB_GEM
USE MODI_HOR_INTERPOL
USE MODI_PREP_HOR_SNOW_FIELDS
USE MODI_GET_LUOUT
!
IMPLICIT NONE
!
!* 0.1 declarations of arguments
!
CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field
CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! name of the Atmospheric file
CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! type of the Atmospheric file
!
!
!* 0.2 declarations of local variables
!
CHARACTER(LEN=6) :: YFILETYPE ! type of input file
CHARACTER(LEN=28) :: YFILE ! name of file
REAL, POINTER, DIMENSION(:,:) :: ZFIELDIN ! field to interpolate horizontally
REAL, ALLOCATABLE, DIMENSION(:,:):: ZFIELDOUT ! field interpolated horizontally
INTEGER :: ILUOUT ! output listing logical unit
!
LOGICAL :: GUNIF ! flag for prescribed uniform field
!
!-------------------------------------------------------------------------------------
!
!
!* 1. Reading of input file name and type
!
CALL GET_LUOUT(HPROGRAM,ILUOUT)
!
IF (HPROGRAM /= 'MC2GEM') THEN
!CALL READ_PREP_TEB_CONF(HPROGRAM,HSURF,YFILE,YFILETYPE,HATMFILE,HATMFILETYPE,ILUOUT,GUNIF)
ELSE
GUNIF = .FALSE. ! champs non uniformes
YFILE = ' '
YFILETYPE = ' '
ENDIF
!
!* 2. Snow variables case?
!
IF (HSURF=='SN_ROOF') THEN
CALL PREP_HOR_SNOW_FIELDS
(HPROGRAM,HSURF, &
YFILE,YFILETYPE,ILUOUT,GUNIF,&
1, &
XLAT,XLON,TSNOW_ROOF )
RETURN
ELSE IF (HSURF=='SN_ROAD') THEN
CALL PREP_HOR_SNOW_FIELDS
(HPROGRAM,HSURF, &
YFILE,YFILETYPE,ILUOUT,GUNIF,&
1, &
XLAT,XLON,TSNOW_ROAD )
RETURN
END IF
!
!* 3. Output Grid
!
!ALLOCATE(XLAT_OUT(SIZE(XLAT)))
!ALLOCATE(XLON_OUT(SIZE(XLON)))
XLAT_OUT = XLAT
XLON_OUT = XLON
!
!
!* 4. Reading of input configuration (Grid and interpolation type)
!
IF (GUNIF) THEN
! CALL PREP_TEB_UNIF(ILUOUT,HSURF,ZFIELDIN)
ELSE IF (YFILETYPE=='GRIB ') THEN
! CALL PREP_TEB_GRIB(HPROGRAM,HSURF,YFILE,ILUOUT,ZFIELDIN)
ELSE IF (HPROGRAM=='MC2GEM') THEN
CALL PREP_TEB_GEM
(HSURF,ZFIELDIN)
END IF
!
!* 5. Horizontal interpolation
!
ALLOCATE(ZFIELDOUT(SIZE(XLAT),SIZE(ZFIELDIN,2)))
!
CALL HOR_INTERPOL(ILUOUT,ZFIELDIN,ZFIELDOUT)
!
!* 6. Return to historical variable
!
SELECT CASE (HSURF)
CASE('ZS ')
! ALLOCATE(XZS_LS(SIZE(ZFIELDOUT,1)))
XZS_LS(:) = ZFIELDOUT(:,1)
CASE('WS_ROOF')
! ALLOCATE(XWS_ROOF(SIZE(ZFIELDOUT,1)))
XWS_ROOF(:) = ZFIELDOUT(:,1)
CASE('WS_ROAD')
! ALLOCATE(XWS_ROAD(SIZE(ZFIELDOUT,1)))
XWS_ROAD(:) = ZFIELDOUT(:,1)
CASE('TI_ROAD')
! ALLOCATE(XTI_ROAD(SIZE(ZFIELDOUT,1)))
XTI_ROAD(:) = ZFIELDOUT(:,1)
CASE('TI_BLD ')
! ALLOCATE(XTI_BLD (SIZE(ZFIELDOUT,1)))
XTI_BLD (:) = ZFIELDOUT(:,1)
CASE('T_ROAD ')
! ALLOCATE(XT_ROAD(SIZE(ZFIELDOUT,1),NROAD_LAYER))
CALL INIT_FROM_REF_GRID
(XGRID_ROAD,ZFIELDOUT,XD_ROAD,XT_ROAD)
CASE('T_WALL ')
! ALLOCATE(XT_WALL(SIZE(ZFIELDOUT,1),NWALL_LAYER))
CALL INIT_FROM_REF_GRID
(XGRID_WALL,ZFIELDOUT,XD_WALL,XT_WALL)
CASE('T_ROOF ')
! ALLOCATE(XT_ROOF(SIZE(ZFIELDOUT,1),NROOF_LAYER))
CALL INIT_FROM_REF_GRID
(XGRID_ROOF,ZFIELDOUT,XD_ROOF,XT_ROOF)
CASE('T_CAN ')
! ALLOCATE(XT_CANYON(SIZE(ZFIELDOUT,1)))
XT_CANYON (:) = ZFIELDOUT(:,1)
CASE('Q_CAN ')
! ALLOCATE(XQ_CANYON(SIZE(ZFIELDOUT,1)))
XQ_CANYON (:) = ZFIELDOUT(:,1)
END SELECT
!
!-------------------------------------------------------------------------------------
!
!* 7. Deallocations
!
DEALLOCATE(ZFIELDIN )
DEALLOCATE(ZFIELDOUT)
!!DEALLOCATE(XLAT_OUT )
!DEALLOCATE(XLON_OUT )
!!IF (ALLOCATED(XZS_LS)) DEALLOCATE(XZS_LS)
!IF (ASSOCIATED(XZS_LS)) DEALLOCATE(XZS_LS)
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
!
CONTAINS
!
!-------------------------------------------------------------------------------------
!-------------------------------------------------------------------------------------
SUBROUTINE INIT_FROM_REF_GRID(PGRID1,PT1,PD2,PT2) 6,3
!
USE MODI_INTERP_GRID2D
!
REAL, DIMENSION(:,:), INTENT(IN) :: PT1 ! temperature profile
REAL, DIMENSION(:), INTENT(IN) :: PGRID1 ! normalized grid
REAL, DIMENSION(:,:), INTENT(IN) :: PD2 ! output layer thickness
REAL, DIMENSION(:,:), INTENT(OUT) :: PT2 ! temperature profile
!
INTEGER :: JL ! loop counter
REAL, DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: ZD1 ! input grid
REAL, DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: ZD2 ! output grid
REAL, DIMENSION(SIZE(PD2,1)) :: ZD ! output total thickness
!
ZD2(:,:) = 0.
ZD (:) = 0.
!
DO JL=1,SIZE(ZD2,2)
ZD2(:,JL) = ZD(:) + PD2(:,JL)/2.
ZD (:) = ZD(:) + PD2(:,JL)
END DO
!
DO JL=1,SIZE(PT1,2)
ZD1(:,JL) = PGRID1(JL) * ZD(:)
END DO
!
CALL INTERP_GRID2D(ZD1,PT1,ZD2,PT2)
!
END SUBROUTINE INIT_FROM_REF_GRID
!-------------------------------------------------------------------------------------
!
END SUBROUTINE PREP_HOR_TEB_FIELD