SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/prep_hor_teb_greenroof_field.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE PREP_HOR_TEB_GREENROOF_FIELD(HPROGRAM,HSURF,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE)
00003 !     #################################################################################################
00004 !
00005 !!****  *PREP_HOR_TEB_GREENROOF_FIELD* - reads, interpolates and prepares an ISBA field for green roofs
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !
00010 !!**  METHOD
00011 !!    ------
00012 !!     
00013 !!    Based on "prep_hor_teb_garden_field"
00014 !!
00015 !!    REFERENCE
00016 !!    ---------
00017 !!      
00018 !!
00019 !!    AUTHOR
00020 !!    ------
00021 !!     V. Masson, A. Lemonsu & C. de Munck 
00022 !!
00023 !!    MODIFICATIONS
00024 !!    -------------
00025 !!      Original    07/2011
00026 !!------------------------------------------------------------------
00027 !
00028 !
00029 !
00030 USE MODD_PREP,               ONLY : CINGRID_TYPE, CINTERP_TYPE, XZS_LS,          &
00031                                     XLAT_OUT, XLON_OUT, XX_OUT, XY_OUT,          &
00032                                     LINTERP, CMASK
00033 USE MODD_PREP_TEB_GREENROOF, ONLY : XGRID_SOIL, NGRID_LEVEL,                     &
00034                                     XWSNOW, XRSNOW, XTSNOW, XASNOW, LSNOW_IDEAL
00035 USE MODD_TEB_n,              ONLY : TTIME
00036 USE MODD_TEB_GREENROOF_n,    ONLY : XWG, XWGI, XTG, XWR, XLAI,                   &
00037                                     NLAYER_GR,                                   &
00038                                     XVEGTYPE, XDG, XWWILT, XWFC,                 &
00039                                     CISBA_GR, XROOTFRAC, XWSAT, TSNOW
00040 USE MODD_TEB_GRID_n,         ONLY : XLAT, XLON
00041 USE MODD_ISBA_PAR,           ONLY : XWGMIN
00042 USE MODD_DATA_COVER_PAR,     ONLY : NVEGTYPE
00043 USE MODD_SURF_PAR,           ONLY : XUNDEF
00044 !
00045 USE MODI_READ_PREP_TEB_GREENROOF_CONF
00046 USE MODI_READ_PREP_GREENROOF_SNOW
00047 USE MODI_PREP_TEB_GREENROOF_ASCLLV
00048 USE MODI_PREP_TEB_GREENROOF_GRIB
00049 USE MODI_PREP_TEB_GREENROOF_UNIF
00050 USE MODI_PREP_TEB_GREENROOF_BUFFER
00051 USE MODI_HOR_INTERPOL
00052 USE MODI_VEGTYPE_GRID_TO_PATCH_GRID
00053 USE MODI_PREP_HOR_SNOW_FIELDS
00054 USE MODI_GET_LUOUT
00055 USE MODI_PREP_TEB_GREENROOF_EXTERN
00056 !
00057 USE MODI_ABOR1_SFX
00058 !
00059 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00060 USE PARKIND1  ,ONLY : JPRB
00061 !
00062 IMPLICIT NONE
00063 !
00064 !*      0.1    declarations of arguments
00065 !
00066  CHARACTER(LEN=6),   INTENT(IN)  :: HPROGRAM  ! program calling surf. schemes
00067  CHARACTER(LEN=7),   INTENT(IN)  :: HSURF     ! type of field
00068  CHARACTER(LEN=28),  INTENT(IN)  :: HATMFILE    ! name of the Atmospheric file
00069  CHARACTER(LEN=6),   INTENT(IN)  :: HATMFILETYPE! type of the Atmospheric file
00070  CHARACTER(LEN=28),  INTENT(IN)  :: HPGDFILE    ! name of the Atmospheric file
00071  CHARACTER(LEN=6),   INTENT(IN)  :: HPGDFILETYPE! type of the Atmospheric file
00072 !
00073 !*      0.2    declarations of local variables
00074 !
00075  CHARACTER(LEN=6)              :: YFILETYPE      ! type of input file
00076  CHARACTER(LEN=28)             :: YFILE          ! name of file
00077  CHARACTER(LEN=6)              :: YFILEPGDTYPE ! type of input file
00078  CHARACTER(LEN=28)             :: YFILEPGD     ! name of file
00079 REAL, POINTER,     DIMENSION(:,:,:) :: ZFIELDIN       ! field to interpolate horizontally
00080 REAL, POINTER,     DIMENSION(:,:)   :: ZFIELD         ! field to interpolate horizontally
00081 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZFIELDOUT      ! field interpolated   horizontally
00082 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZVEGTYPE_PATCH ! vegtype for each patch
00083 REAL, ALLOCATABLE, DIMENSION(:,:)   :: ZW             ! work array (x, fine   soil grid, npatch)
00084 REAL, ALLOCATABLE, DIMENSION(:,:)   :: ZF             ! work array (x, output soil grid, npatch)
00085 REAL, ALLOCATABLE, DIMENSION(:,:)   :: ZDG            ! out T grid (x, output soil grid, npatch)
00086 REAL, ALLOCATABLE, DIMENSION(:,:)   :: ZPATCH         ! work array for patches
00087 REAL, ALLOCATABLE, DIMENSION(:)     :: ZSG1SNOW, ZSG2SNOW, ZHISTSNOW, ZAGESNOW
00088 INTEGER                             :: ILUOUT         ! output listing logical unit
00089 !
00090 LOGICAL                             :: GUNIF          ! flag for prescribed uniform field
00091 INTEGER                             :: JVEGTYPE       ! loop on vegtypes
00092 INTEGER                             :: JLAYER         ! loop on layers
00093 INTEGER                             :: IWORK          ! Work integer
00094 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00095 !-------------------------------------------------------------------------------------
00096 !
00097 !
00098 !*      1.     Reading of input file name and type
00099 !
00100 IF (LHOOK) CALL DR_HOOK('PREP_HOR_TEB_GREENROOF_FIELD',0,ZHOOK_HANDLE)
00101 !
00102 !
00103  CALL GET_LUOUT(HPROGRAM,ILUOUT)
00104 !
00105  CALL READ_PREP_TEB_GREENROOF_CONF(HPROGRAM,HSURF,YFILE,YFILETYPE,YFILEPGD,YFILEPGDTYPE,&
00106                                   HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,ILUOUT,GUNIF)
00107 !
00108 CMASK = 'TOWN  '
00109 !
00110 !-------------------------------------------------------------------------------------
00111 !*      2.     Snow variables case
00112 !
00113 IF (HSURF=='SN_VEG ') THEN
00114   CALL READ_PREP_GREENROOF_SNOW(HPROGRAM,TSNOW%SCHEME,TSNOW%NLAYER,YFILE,YFILETYPE)
00115   IF (LEN_TRIM(YFILE)>0 .AND. LEN_TRIM(YFILETYPE)>0) GUNIF = .FALSE.  
00116   ALLOCATE(ZSG1SNOW(SIZE(XWSNOW)))
00117   ALLOCATE(ZSG2SNOW(SIZE(XWSNOW)))
00118   ALLOCATE(ZHISTSNOW(SIZE(XWSNOW)))
00119   ALLOCATE(ZAGESNOW(SIZE(XWSNOW)))
00120   ALLOCATE(ZPATCH(SIZE(XVEGTYPE,1),1))
00121   ALLOCATE(ZVEGTYPE_PATCH (SIZE(XVEGTYPE,1),SIZE(XVEGTYPE,2),1))
00122   !
00123   ZPATCH=1.
00124   ZVEGTYPE_PATCH(:,:,1) = XVEGTYPE(:,:)
00125   CALL PREP_HOR_SNOW_FIELDS(HPROGRAM,HSURF,                 &
00126                             YFILE,YFILETYPE,                &
00127                             YFILEPGD, YFILEPGDTYPE,         &
00128                             ILUOUT,GUNIF, 1,                &
00129                             SIZE(XLAT),TSNOW, TTIME,        &
00130                             XWSNOW, XRSNOW, XTSNOW, XASNOW, &
00131                             LSNOW_IDEAL, ZSG1SNOW,          &
00132                             ZSG2SNOW, ZHISTSNOW, ZAGESNOW,  &
00133                             ZVEGTYPE_PATCH, ZPATCH          )
00134   DEALLOCATE(ZSG1SNOW)
00135   DEALLOCATE(ZSG2SNOW)
00136   DEALLOCATE(ZHISTSNOW)
00137   DEALLOCATE(ZAGESNOW)                            
00138   DEALLOCATE(ZPATCH)
00139   DEALLOCATE(ZVEGTYPE_PATCH)
00140   IF (LHOOK) CALL DR_HOOK('PREP_HOR_TEB_GREENROOF_FIELD',1,ZHOOK_HANDLE)
00141   RETURN
00142 END IF
00143 !
00144 !-------------------------------------------------------------------------------------
00145 !
00146 !*      3.     Reading of input  configuration (Grid and interpolation type)
00147 !
00148 IF (GUNIF) THEN
00149   CALL PREP_TEB_GREENROOF_UNIF(ILUOUT,HSURF,ZFIELDIN)
00150 ELSE IF (YFILETYPE=='ASCLLV') THEN
00151   CALL PREP_TEB_GREENROOF_ASCLLV(HPROGRAM,HSURF,ILUOUT,ZFIELDIN)
00152 ELSE IF (YFILETYPE=='GRIB  ') THEN
00153   CALL PREP_TEB_GREENROOF_GRIB(HPROGRAM,HSURF,YFILE,ILUOUT,ZFIELDIN)
00154 ELSE IF (YFILETYPE=='MESONH' .OR. YFILETYPE=='ASCII ' .OR. YFILETYPE=='LFI   ') THEN
00155    CALL PREP_TEB_GREENROOF_EXTERN(HPROGRAM,HSURF,YFILE,YFILETYPE,YFILEPGD,YFILEPGDTYPE,ILUOUT,ZFIELDIN)
00156 ELSE IF (YFILETYPE=='BUFFER') THEN
00157    CALL PREP_TEB_GREENROOF_BUFFER(HPROGRAM,HSURF,ILUOUT,ZFIELDIN)
00158 ELSE
00159    CALL ABOR1_SFX('PREP_HOR_TEB_GREENROOF_FIELD: data file type not supported : '//YFILETYPE)
00160 END IF
00161 !
00162 !-------------------------------------------------------------------------------------
00163 !
00164 !*      5.     Horizontal interpolation for vegtype grid
00165 !
00166 ALLOCATE(ZFIELDOUT(SIZE(XLAT),SIZE(ZFIELDIN,2),SIZE(ZFIELDIN,3)))
00167 ALLOCATE(ZFIELD(SIZE(ZFIELDIN,1),SIZE(ZFIELDIN,2)))
00168 !
00169 DO JVEGTYPE = 1, SIZE(ZFIELDIN,3)
00170   ZFIELD=ZFIELDIN(:,:,JVEGTYPE)
00171   IF (SIZE(ZFIELDIN,3)==NVEGTYPE) LINTERP = (XVEGTYPE(:,JVEGTYPE) > 0.)
00172   CALL HOR_INTERPOL(ILUOUT,ZFIELD,ZFIELDOUT(:,:,JVEGTYPE))
00173   LINTERP = .TRUE.
00174 END DO
00175 !
00176 DEALLOCATE(ZFIELD)
00177 !
00178 !-------------------------------------------------------------------------------------
00179 !
00180 !*      6.     Transformation from vegtype grid to patch grid
00181 !
00182 ALLOCATE(ZW (SIZE(ZFIELDOUT,1),SIZE(ZFIELDOUT,2)))
00183 ZW = 0.
00184 DO JVEGTYPE=1,NVEGTYPE
00185   DO JLAYER=1,SIZE(ZW,2)
00186     ZW(:,JLAYER) = ZW(:,JLAYER) + XVEGTYPE(:,JVEGTYPE) * ZFIELDOUT(:,JLAYER,JVEGTYPE)
00187   END DO
00188 END DO
00189 !
00190 !-------------------------------------------------------------------------------------
00191 !
00192 !*      7.     Return to historical variable
00193 !
00194 !
00195 SELECT CASE (HSURF)
00196   !
00197   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00198   !
00199  CASE('WG     ') 
00200   ALLOCATE(ZF (SIZE(ZFIELDOUT,1),NLAYER_GR))
00201   !
00202   !* interpolates on output levels
00203   CALL INIT_FROM_REF_GRID(XGRID_SOIL,ZW,XDG,ZF)
00204   !
00205   !* retrieves soil water content from soil relative humidity
00206   ALLOCATE(XWG(SIZE(ZFIELDOUT,1),NLAYER_GR))
00207   XWG(:,:) = XWWILT + ZF(:,:) * (XWFC-XWWILT)
00208   XWG(:,:) = MAX(MIN(XWG(:,:),XWSAT),XWGMIN)
00209   !
00210   WHERE(ZF(:,:)==XUNDEF)XWG(:,:)=XUNDEF
00211   !
00212   DEALLOCATE(ZF)
00213   !
00214   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00215   !
00216  CASE('WGI    ')
00217   ALLOCATE(ZF (SIZE(ZFIELDOUT,1),NLAYER_GR))
00218   !
00219   !* interpolates on output levels
00220   CALL INIT_FROM_REF_GRID(XGRID_SOIL,ZW,XDG,ZF)
00221   !
00222   !* retrieves soil ice content from soil relative humidity
00223   ALLOCATE(XWGI(SIZE(ZFIELDOUT,1),NLAYER_GR))
00224   XWGI(:,:) = ZF(:,:) * XWSAT
00225   XWGI(:,:) = MAX(MIN(XWGI(:,:),XWSAT),0.)
00226   !
00227   WHERE(ZF(:,:)==XUNDEF)XWGI(:,:)=XUNDEF
00228   !
00229   DEALLOCATE(ZF)
00230   !
00231   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00232   !
00233  CASE('TG     ') 
00234   IWORK=NLAYER_GR
00235   ALLOCATE(XTG(SIZE(ZFIELDOUT,1),IWORK))
00236   ALLOCATE(ZDG(SIZE(XDG,1),IWORK))
00237   !* diffusion method, the soil grid is the same as for humidity
00238   ZDG(:,:) = XDG(:,:)
00239   CALL INIT_FROM_REF_GRID(XGRID_SOIL,ZW,ZDG,XTG)
00240   DEALLOCATE(ZDG)
00241   !
00242 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00243   !
00244  CASE('WR     ') 
00245   ALLOCATE(XWR(SIZE(ZFIELDOUT,1)))
00246   XWR(:) = ZW(:,1)
00247   !
00248   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00249   !
00250  CASE('LAI    ') 
00251   !* LAI is updated only if present and pertinent (evolutive LAI) in input file
00252   WHERE (ZW(:,1)/=XUNDEF) XLAI(:) = ZW(:,1)
00253   !
00254 END SELECT
00255 !
00256 DEALLOCATE(ZW)
00257 !-------------------------------------------------------------------------------------
00258 !
00259 !*      8.     Deallocations
00260 !
00261 DEALLOCATE(ZFIELDIN )
00262 DEALLOCATE(ZFIELDOUT) 
00263 !
00264 IF (LHOOK) CALL DR_HOOK('PREP_HOR_TEB_GREENROOF_FIELD',1,ZHOOK_HANDLE)
00265 !
00266 !-------------------------------------------------------------------------------------
00267 !-------------------------------------------------------------------------------------
00268 !
00269 CONTAINS
00270 !
00271 !-------------------------------------------------------------------------------------
00272 !-------------------------------------------------------------------------------------
00273 !
00274 SUBROUTINE INIT_FROM_REF_GRID(PGRID1,PT1,PD2,PT2)
00275 !
00276 USE MODI_INTERP_GRID
00277 !
00278 REAL, DIMENSION(:,:), INTENT(IN)  :: PT1    ! variable profile
00279 REAL, DIMENSION(:),   INTENT(IN)  :: PGRID1 ! normalized grid
00280 REAL, DIMENSION(:,:), INTENT(IN)  :: PD2    ! output layer thickness
00281 REAL, DIMENSION(:,:), INTENT(OUT) :: PT2    ! variable profile
00282 !
00283 INTEGER                                  :: JI, JL  ! loop counter
00284 REAL, DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: ZD1 ! input grid
00285 REAL, DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: ZD2 ! output grid
00286 !
00287 INTEGER :: ILAYER1, ILAYER2
00288 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00289 !
00290 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00291 !
00292 IF (LHOOK) CALL DR_HOOK('INIT_FROM_REF_GRID',0,ZHOOK_HANDLE)
00293 IF (SIZE(PT1,2)==3) THEN
00294 !
00295 !* 1. case with only 3 input levels (typically coming from 'UNIF')
00296 !     -----------------------------
00297 !
00298        !surface layer (generally 0.01m imposed)
00299        PT2(:,1) = PT1(:,1) 
00300        !deep layers
00301        DO JL=2,NLAYER_GR
00302           PT2(:,JL) = PT1(:,3)
00303        END DO
00304        !if root layers
00305        DO JI=1,SIZE(PT1,1)
00306           DO JL=2,NLAYER_GR
00307              IF(XROOTFRAC(JI,JL)<=1.0)THEN 
00308                 PT2(JI,JL) = PT1(JI,2)
00309                 EXIT
00310              ENDIF
00311           END DO
00312        END DO 
00313        IF (LHOOK) CALL DR_HOOK('INIT_FROM_REF_GRID',1,ZHOOK_HANDLE)
00314     RETURN
00315 !
00316 END IF
00317 !
00318 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00319 !
00320 !* 2. case with fine grid as input (general case)
00321 !     ----------------------------
00322 !
00323   ZD2(:,:) = 0.
00324   !
00325   ZD2(:,1) = PD2(:,1)/2.
00326   DO JL=2,SIZE(ZD2,2)
00327     ZD2(:,JL) = (PD2(:,JL-1)+PD2(:,JL)) /2.
00328   END DO
00329   !
00330   DO JL=1,SIZE(PT1,2)
00331     ZD1(:,JL) = PGRID1(JL)
00332   END DO
00333   !
00334   CALL INTERP_GRID(ZD1,PT1(:,:),ZD2,PT2(:,:))
00335 IF (LHOOK) CALL DR_HOOK('INIT_FROM_REF_GRID',1,ZHOOK_HANDLE)
00336 !
00337 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00338 END SUBROUTINE INIT_FROM_REF_GRID
00339 !-------------------------------------------------------------------------------------
00340 !
00341 END SUBROUTINE PREP_HOR_TEB_GREENROOF_FIELD