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